見出し画像

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

この記事が気に入ったらサポートをしてみませんか?