1. ysugi

    Posted

    ysugi
Changes in title
+Raspberry Pi 3 でSDカードなしのネットワークブートをする
Changes in tags
Changes in body
Source | HTML | Preview
@@ -0,0 +1,79 @@
+[前回の記事](https://qiita.com/ysugi/items/ee88eed56e0234028228)で,`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` を実行.
+
+```conf:/etc/exports
+/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
+
+設定は下のような感じ.
+
+```conf:/etc/dnsmasq.conf
+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`に関しては以下のようなことを**追記**してください.`${}`で囲まれたところは適宜変更してください.
+
+```conf: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`は条件分岐ができる](https://www.raspberrypi.org/documentation/configuration/config-txt/conditional.md)んですが,これとネットワークブートと組み合わせることでOSの切り替えが非常に楽になりました.
+
+ちなみに今回のOTPメモリの書き換えで,USBメモリからの起動もできるようになりました.興味のある方は試してみてください.
+
+
+---
+[^1]: ただし,ARPパケットが飛び交うネットワークでないと正しく起動しないなど,いくつかのバグがあります.