Raspberry Pi Zero W/Raspberry Pi Zero 2 Wのroot領域をNFS化するメモ
あまり日本語の記事がなかったので。
元ネタ・・というかほぼこのサイトの内容通りです。
■大きな流れ
(1)NFSサーバを構築する
(2)Raspberry PiのイメージをNFS領域に展開する。
(3)Raspberry Pi上で、NFS起動するinitramfsイメージを作成する
(4)Raspberry Pi上のconfig.txt・cmdline.txtを更新する
■説明
(0)前提
・事前にSDカード経由でRaspbery Piを動かしておく
・事前に無線LANに接続できることを確認しておく
・ヘッドレスではないことに留意
(1)NFSサーバを構築する
NFSサーバーを立てて、Raspberry piのイメージを配置しexportsする。
/pi 192.168.0.1/24(rw,sync,no_root_squash,no_subtree_check)
(2)Raspberry PiのイメージをNFS領域に展開する。
なんでもよいけど時間かかっていいならRaspbery Piに入ってNFS領域をマウント後に、tarで直接送り込む。めっちゃ時間かかる。zで圧縮した方が良いかも。
# mount xxxx:/pi /a
# cd /
# tar cvf - . | (cd /a;tar xvf -)
(3)Raspberry Pi上で、initramfsイメージを作成する
/etc/initramfs-tools/initramfs.conf に下記追記する
MODULES=netboot
BOOT=nfs
DEVICE=wlan0
modules に下記追加
brcmfmac
brcmutil
cfg80211
rfkill
hooks/nfsroot に下記追加
#!/bin/sh
PREREQ=""
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
copy_exec /bin/grep /bin
copy_exec /sbin/lsmod /sbin
copy_exec /sbin/ifconfig /sbin
copy_exec /sbin/wpa_supplicant /sbin
tail -n+4 /etc/wpa_supplicant/wpa_supplicant.conf >${DESTDIR}/etc/wpa_supplicant.conf
cp /lib/firmware/brcm/brcmfmac43430-sdio.txt ${DESTDIR}/lib/firmware/brcm
mkdir -p ${DESTDIR}/var/run/wpa_supplicant
scripts/nfs-top/wifiに下記記載
#!/bin/sh
PREREQ="udev"
prereqs()
{
echo "$PREREQ"
}
case $1 in
prereqs)
prereqs
exit 0
;;
esac
if grep -q splash /proc/cmdline; then
/bin/chvt 1
fi
sleep 3
if grep -q splash /proc/cmdline; then
/sbin/usplash -c &
sleep 1
fi
/sbin/wpa_supplicant -Dwext -iwlan0 -c /etc/wpa_supplicant.conf &
sleep 5
ipconfig wlan0 &
wpa_supplicant.confを準備。
一旦、SDカード経由でRaspbery Piを起動して無線LAN接続しておくと楽。
update-initramfsにて、initramfsイメージを作成する。
(update-initramfs -c -k `uname -r` を実行)
root@pizero2:/# update-initramfs -c -k `uname -r`
update-initramfs: Generating /boot/initrd.img-6.1.21-v7+
W: Possible missing firmware /lib/firmware/brcm/brcmfmac*-sdio.*.bin for module brcmfmac
W: Possible missing firmware /lib/firmware/brcm/brcmfmac*-sdio.*.txt for module brcmfmac
W: Possible missing firmware /lib/firmware/brcm/brcmfmac43752-sdio.clm_blob for module brcmfmac
W: Possible missing firmware /lib/firmware/brcm/brcmfmac43752-sdio.bin for module brcmfmac
W: Possible missing firmware /lib/firmware/brcm/brcmfmac4359-sdio.bin for module brcmfmac
W: Possible missing firmware /lib/firmware/brcm/brcmfmac43439-sdio.clm_blob for module brcmfmac
W: Possible missing firmware /lib/firmware/brcm/brcmfmac43439-sdio.bin for module brcmfmac
W: Possible missing firmware /lib/firmware/brcm/brcmfmac43430b0-sdio.bin for module brcmfmac
W: Possible missing firmware /lib/firmware/brcm/brcmfmac43341-sdio.bin for module brcmfmac
これで、/boot/initrd.img-6.1.21-v7+ が作成されるのでこれを使って起動する設定を行う。
(4)Raspberry Pi上のconfig.txt・cmdline.txtを更新する
/boot/config.txt に下記追加する。
#Load an initrd
initramfs initrd.img-6.1.21-v7+ followkernel
/boot/cmdline.txtを編集する。
dwc_otg.lpm_enable=0 smsc95xx.turbo_mode=N console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.0.100:/pi,tcp,vers=3 rw ip=dhcp rootfstype=nfs elevator=deadline fsck.repair=yes rootwait
→192.168.0.100がNFSサーバーのIPアドレス。/piがexportした領域。
ここまで設定して、再起動したらNFS経由での起動になる・・・はず。
SDカードレス(ヘッドレス)ではないので、初回はSDカードのから起動するのでその点は注意。あとWifi途切れるとハングします。
■再起動失敗を改善させる
wpa_supplicantの停止でハングするので、再起動に失敗する場合は、下記設定を入れて回避する。
wpa_supplicantのサービスをDisableした後、「initramfsで起動するwpa_supplicant」をkillするサービスを登録する。
pi@pizero2:~ $ sudo systemctl enable wpa_supplicant.service
pi@pizero2:~ $ cat /etc/systemd/system/autorun.service
[Unit]
Description=Execute at OS startup and terminates
After=network.target
[Service]
Type=oneshot
ExecStop=/home/pi/os_term.sh
RemainAfterExit=true
[Install]
WantedBy=multi-user.target
pi@pizero2:~ $ cat /home/pi/os_term.sh
#!/bin/bash
pkill -9 wpa_supplicant
pi@pizero2:~ $ sudo systemctl daemon-reload
pi@pizero2:~ $ sudo systemctl enable autorun.service