前回の記事で,bootcode.bin
というファイル一つあれば全モデルのRaspberry Piでネットワークブートできることを紹介しました.
しかし,実はRaspberry Pi 3 ではSDカードがなくてもネットワークブートできます.bootcode.bin
の同機能がRaspberry Pi 3 のboot ROMに搭載されているためです1.今回はこの手順を紹介します.
本記事は以下のページから情報を抜粋してるだけのただのメモです.
- https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/net.md
- https://www.raspberrypi.org/documentation/hardware/raspberrypi/bootmodes/net_tutorial.md
手順
ネットワークブート機能を有効にする
boot ROMのネットワークブート機能はデフォルトで無効にされているため,有効にします.Raspberry PiにはOTP (One Time Programmable) メモリがあり,これを書き換えます.
機能を有効にするためにはSDカードが必要です.SDカードをマウントし,そのディレクトリで以下のコマンドを実行してください:
$ wget https://github.com/raspberrypi/firmware/raw/master/boot/bootcode.bin
$ wget https://github.com/raspberrypi/firmware/raw/master/boot/start.elf
$ wget https://github.com/raspberrypi/firmware/raw/master/boot/fixup.dat
$ echo 'program_usb_boot_mode=1' >config.txt # 上書きしてるので注意!
ここでSDカードをアンマウントし,Raspberry Pi 3に差し込みます.このRaspberry Pi 3に電源を入れて数秒待つと,OTPメモリが書き換えられ,boot ROMのネットワークブート機能が有効になります.これが終わったらSDカードは抜いておきます.
サーバ側の設定
Raspberry PiのネットワークブートはPXEブートと同じなので,DHCPサーバとTFTPサーバが必要です.今回は元記事に合わせてDnsmasqを使います.
また,NFS rootをします.
詳しくは元記事を見てください.
NFS
NFSサーバ系のパッケージ (曖昧) をインストールして,/etc/exports
を以下のようにして exportfs -rav
を実行.
/srv/nfs 10.11.12.0/24(rw,async,no_root_squash,no_subtree_check)
/srv/nfs
とかに既存のRaspbianイメージ (第2パーティション) を展開します.イメージは http://downloads.raspberrypi.org/raspbian_lite/images/ に転がってます.マウント方法とかは https://linuxconfig.org/how-to-mount-rasberry-pi-filesystem-image などを参考にしてください.
Dnsmasq
設定は下のような感じ.
port=0
log-dhcp
enable-tftp
tftp-root=/srv/tftp
dhcp-range=10.11.12.100,proxy
pxe-service=0,"Raspberry Pi Boot"
/srv/tftp
にはRaspbianでいうところの/boot
にあるファイルを全て置きます.上記で説明したRaspbianイメージ (の第1パーティション) から持ってきてください.cmdline.txt
に関しては以下のようなことを追記してください.${}
で囲まれたところは適宜変更してください.
root=/dev/nfs nfsroot=${NFSサーバのIPアドレス}:/srv/nfs rw ip=auto nfsrootdebug rootwait
起動
Raspberry Pi 3に電源を接続してしばらく待てば起動すると思う……
うまく起動しないときはブロードキャストアドレスにpingし続けたり,/var/log/daemon.log
でサーバのログを見たり,ディスプレイを接続して起動ログを見たりしてみてください.
それでも無理ならコメントください.
まとめ
Raspberry Pi 3はSDカードさえなくてもネットワークブートができます.便利ですね.
私のユースケースだと,config.txt
は条件分岐ができるんですが,これとネットワークブートと組み合わせることでOSの切り替えが非常に楽になりました.
ちなみに今回のOTPメモリの書き換えで,USBメモリからの起動もできるようになりました.興味のある方は試してみてください.
-
ただし,ARPパケットが飛び交うネットワークでないと正しく起動しないなど,いくつかのバグがあります. ↩