Raspberry Pi 4 のPXE対応の続き。
akkiesoft.hatenablog.jp
家ではPi4が1台常時稼働しており、MySQLが動くなどSDカードをしばくかんじの環境なので、PXEブート&ReadyNASでNFSストレージ化してみました。
やり方はここを参照。
www.raspberrypi.org
ReadyNAS(スクショはReadyNAS 102)に、NFSの共有を作ります。クオーターはつけなくて良いですが、なんとなくSDカードっぽく16GBに設定。
次に共有設定。192.168.29.39はDHCPサーバーのアドレスで、/bootをここに置くのでアクセス権限が必要です。ただ、リードオンリーでもいいかも。Pi4アドレス(192.168.29.82)はリードライトとROOTにチェックを入れます。
SDカードで稼働中のPi4での作業
まずPXEに対応するために、冒頭に貼った先日の記事の通りブートローダーをアップデートして、PXEブートの有効化を済ませておきます。
SDカード内のデータをNFSにrsyncします。ここはドキュメントと同じやり方で良いでしょう。
$ sudo mkdir /nfs
$ sudo mount 192.168.29.12:/data/rpi-rastv /nfs
$ sudo rsync -xa --progress --exclude /nfs / /nfs/
$ sudo rsync -xa --progress /boot/ /nfs/boot/
NFSにコピーした側の起動設定を変えていきます。192.168.29.12がReadyNASのアドレスです。
$ sudo vi /nfs/boot/cmdline.txt
console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=192.168.29.12:/data/rpi-pi4,vers=4.1,proto=tcp rw ip=dhcp elevator=deadline fsck.repair=yes rootwait
$ sudo vi /nfs/etc/fstab
# PARTUUIDで始まる行はコメントアウトする
#PARTUUID=56cd6262-01 /boot vfat defaults 0 2
#PARTUUID=56cd6262-02 / ext4 defaults,noatime 0 1
192.168.29.12:/data/rpi-pi4/boot /boot nfs defaults,vers=4.1,proto=tcp 0 0
最後に、Pi4のシリアル番号をメモしておきます。以下の出力からabcd1234の8ケタの部分をdnsmasqの設定でつかいます。
$ cat /proc/cpuinfo
Serial : 10000000abcd1234
dnsmasqサーバーの設定
家ではすでにdnsmasqが動いていて、PXEっぽい設定も済ですがこんな感じで設定してます。ドキュメントではMACアドレス限定してなかったですが、家ではなんでこうしていたか忘れたな。多分いらない。
enable-tftp
tftp-root=/tftpboot
# PXE for Raspberry Pi
dhcp-mac=set:rpi,b8:27:eb:*:*:*
dhcp-mac=set:rpi4,dc:a6:32:*:*:*
pxe-service=tag:rpi,0,"Raspberry Pi Boot"
pxe-service=tag:rpi4,0,"Raspberry Pi Boot"
# Pi4のアドレスはDHCP側で固定にしてやるとラク。この例では192.168.29.82に固定
dhcp-host=<Pi4のMACアドレス>,192.168.29.82,infinite
fstabにNFSのマウント設定を書きます。マウント先は/tftpboot/です。先程確認したabcd1234を入れます。
$ sudo mkdir -p /tftpboot/abcd1234
$ sudo vi /etc/fstab
192.168.29.12:/data/rpi-pi4/boot /tftpboot/abcd1234 nfs ro 0 0
$ sudo mount /tftpboot/abcd1234
$ ls /tftpboot/abcd1234
(こんな感じで/bootの中身が見えていればOK)
bcm2708-rpi-b.dtb bcm2711-rpi-4-b.dtb fixup.dat start4cd.elf
bcm2708-rpi-b-plus.dtb bootcode.bin fixup_db.dat start4db.elf
bcm2708-rpi-cm.dtb cmdline.txt fixup_x.dat start4.elf
bcm2708-rpi-zero.dtb config.txt issue.txt start4x.elf
bcm2708-rpi-zero-w.dtb COPYING.linux kernel7.img start_cd.elf
bcm2709-rpi-2-b.dtb fixup4cd.dat kernel7l.img start_db.elf
bcm2710-rpi-2-b.dtb fixup4.dat kernel8.img start.elf
bcm2710-rpi-3-b.dtb fixup4db.dat kernel.img start_x.elf
bcm2710-rpi-3-b-plus.dtb fixup4x.dat LICENCE.broadcom
bcm2710-rpi-cm3.dtb fixup_cd.dat overlays
起動する
あとはPi4の電源を落として、SDカードを抜いて電源を入れ直せばPXEブートして、NFSをファイルシステムにして起動してくるでしょう。今回は移行なのでSSHホスト鍵の再生成はしませんでしたが、必要に応じてドキュメントの手順に従って実施すると良いでしょう。
起動しない場合、ReadyNASなどNASのNFSがV4に対応しているかの確認をします。していない場合はNFSマウントオプションから「,vers=4.1」を削ると起動します。
ちなみにReadyNASの場合はシステム設定のサービスのところで有効化できました。
速度は……
SDカードが無くなったことによって、ストレージの信頼性はぐいっと上がるものと考えられます。ギガビットなのでNFSストレージのIOで帯域をつかいきることもそれほどないでしょう。
ddコマンドでファイル作成スピードを計測したところ、10MB/s前後でした。100Mbpsかな……?これはもしかするとSDカードのほうが早いかもしれない🤔?自宅のReadyNAS 102はHDD2本構成なので、たとえば4本構成とか、今ならSSDなNASなんてのもあるので、そういうのを使えばもっと快適なNFSを提供できるかもしれません。使用中の環境はIO速度は求めないはずなので、これでしばらく様子見でしょうかね。
まとめ
初めてRaspberry PiのPXEブートを本番にぶっこんでみました。様子見してダメそうならSDに戻しますが、まあ多分大丈夫なんじゃないかなあ、と思います。