Giả sử file cài đặt piOS là 2022-04-04-raspios-bullseye-arm64-lite.img
Chúng ta sẽ sửa đổi file này bằng img.edit, thêm vào các cài đặt sau:
- Wifi
- Ip tĩnh
- SSH certificate
- Timezone
- Cập nhật hệ thống
- Một số phần mềm cần dùng
Sau khi ghi ra đĩa và khởi động lần đầu tiên, chúng ta sẽ có được các cài đặt như trên.
### 1. Mở file img
/path/to/img.edit /path/to/2022-04-04-raspios-bullseye-arm64-lite.img
### 2. Chỉnh sửa các cài đặt cho phù hợp
boot=/tmp/img.edit/loop0p1
rootfs=/tmp/img.edit/loop0p2
ssh_cert=/root/.ssh
# Wifi
ssid="your_ssid"
wifi_pass="your_password"
# Static IP
interface=wlan0
static_ip=your_ip
routers=your_router_ip
# run once: ='' nếu không cần
commands='
apt update && apt -y upgrade > /root/log
apt install -y mc tmux zstd >> /root/log
'
### 3. Chạy các lệnh cài đặt
touch $boot/ssh
if [ ! -z "$ssid" ]; then
pass=$(wpa_passphrase "$ssid" "$wifi_pass" | sed '/\s*psk=\([0-9a-f]\+\)/!d;s//\1/')
cat <<EOF >$boot/wpa_supplicant.conf
country=VN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
ap_scan=1
update_config=1
network={
ssid="$ssid"
psk=$pass
}
EOF
fi
if [ -d $ssh_cert ]; then
rsync -a $ssh_cert $rootfs/root
rsync -a $ssh_cert $rootfs/home/pi
chown -R root:root $rootfs/root
chown -R pi:pi $rootfs/home/pi
chmod 700 $rootfs/root/.ssh $rootfs/home/pi/.ssh
chmod -R 600 $rootfs/root/.ssh/* $rootfs/home/pi/.ssh/*
fi
if [ ! -z "$commands" ]; then
cat <<EOF > $rootfs/root/runonce.sh
sleep 5
$commands
EOF
cat <<EOF > $rootfs/etc/cron.d/runonce
@reboot root /bin/bash /root/runonce.sh; /bin/rm -f /etc/cron.d/runonce
EOF
fi
sed -i '/static IP configuration/,/^$/{s/.*\(interface \).*/\1'"$interface"'/
s/.*\(static ip_address\).*/\1='"$static_ip"'\/24/
s/.*\(static routers\).*/\1='"$routers"'\/24/
s/.*\(static domain_name_servers\).*/\1='"$routers"' 8.8.8.8/
}' $rootfs/etc/dhcpcd.conf
rm -f $rootfs/etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Ho_Chi_Minh $rootfs/etc/localtime
### 4. Đóng file img
/path/to/img.edit
Chú thich
- Mạng chậm có thể khiến việc cập nhật hệ thống và cài đặt phần mềm kéo dài
- Có thể tạo file bash từ các dòng trên hay chạy từng dòng lệnh
#!/bin/bash
# custom piOS, version 20220712
# LNT <lnt@ly-le.info>
[ $# -ne 1 ] && { echo "$(basename $0) path/to/img/file";exit; }
img=$(realpath "$1")
[ ! -f "$img" ] && { echo "img file not found!";exit; }
[ ! -f ./img.edit ] && { echo "img.edit not found!";exit; }
# options
ssh_cert=/root/.ssh
# wifi
ssid="your_ssid"
wifi_pass="your_password"
# static IP
interface=wlan0
static_ip=your_ip
routers=your_router_ip
# run once, commands='' nếu không cần
commands='
apt update && apt -y upgrade > /root/log
apt install -y mc tmux zstd >> /root/log
'
echo '+ Mở file img'
{ read boot; read rootfs; } <<< $(./img.edit $1 | sed -r '/vfat to/,/ext4 to/!d;s/.+(vfat to|ext4 to) (.+)$/\2/')
echo '+ Cho phép ssh'
touch $boot/ssh
if [ ! -z "$ssid" ]; then
echo '+ Cài đặt wifi'
pass=$(wpa_passphrase "$ssid" "$wifi_pass" | sed '/\s*psk=\([0-9a-f]\+\)/!d;s//\1/')
cat <<EOF >$boot/wpa_supplicant.conf
country=VN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
ap_scan=1
update_config=1
network={
ssid="$ssid"
psk=$pass
}
EOF
fi
if [ -d $ssh_cert ]; then
echo '+ Sao chép ssh cert'
rsync -a $ssh_cert $rootfs/root
rsync -a $ssh_cert $rootfs/home/pi
chown -R root:root $rootfs/root
chown -R pi:pi $rootfs/home/pi
chmod 700 $rootfs/root/.ssh $rootfs/home/pi/.ssh
chmod -R 600 $rootfs/root/.ssh/* $rootfs/home/pi/.ssh/*
fi
echo '+ Cài đặt static ip'
sed -i '/static IP configuration/,/^$/{s/.*\(interface \).*/\1'"$interface"'/
s/.*\(static ip_address\).*/\1='"$static_ip"'\/24/
s/.*\(static routers\).*/\1='"$routers"'\/24/
s/.*\(static domain_name_servers\).*/\1='"$routers"' 8.8.8.8/
}' $rootfs/etc/dhcpcd.conf
echo '+ Cài đặt local time'
rm -f $rootfs/etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Ho_Chi_Minh $rootfs/etc/localtime
if [ ! -z "$commands" ]; then
echo '+ Cài đặt softwares'
cat <<EOF > $rootfs/root/runonce.sh
sleep 5
$commands
EOF
cat <<EOF > $rootfs/etc/cron.d/runonce
@reboot root /bin/bash /root/runonce.sh; /bin/rm -f /etc/cron.d/runonce
EOF
fi
echo '+ Đóng file img'
./img.edit