NetworkBoot using ISC DHCPD - h-sendai/RaspberryPi GitHub Wiki

ISC DHCPD、その他を使ってネットワークブート

NetworkBoot ではdnsmasqのdhcp, tftpの機能を使ったが、

  • ISC DHCPD、
  • tftp-serverパッケージのtftpd

を使ってネットワークブートすることも可能である。 すでにdhcpdとしてISC dhcpdを使っているところでは設定を共通化できるので便利かもしれない。

参考ページ

HOWTO: configuring network booting using isc-dhcp-server options

利用機材

  • Raspberry Pi 3 Model B+
  • ネットワークスイッチ
    • CentreCOM GS908TPL V2
    • Buffalo LSW5-GT-8NS/BK
    • NETGEAR GS105
  • サーバーPC Dell Precision T3400
    • NICはtg3
    • CentOS 7

Raspberry Pi 3 Model B+のファームウェアのバージョンは以下のとおり。 ファームウェアのバージョンはvcgencmd versionでわかる。

# vcgencmd version
Mar 27 2019 15:45:53
Copyright (c) 2012 Broadcom
version 2e98b31d18547962e564bdf88e57b3df7085c29b (clean) (release) (start)

ファームウェアのアップデートはSDカードからブートしてapt-get update; apt-get upgrade をするとあがる。電源リサイクルが必要かもしれない(未確認)。

# vcgencmd version
# apt-get update
# apt-get upgrade
# vcgencmd version

シリアル番号を調べる

今回はRaspberry Pi 3 type B +を使った。SDカードをぬいておけば 自動でネットワークブートを試みるようになっていた。

以下ではこのRaspiのシリアル番号が12345678とする。 シリアル番号は

grep Serial /proc/cpuinfo

でわかる。

/etc/dhcp/dhcpd.confの設定

diskless00はPCのdiskless client、hsrp05-exp0がRaspberry Pi 3+。 MACアドレスを利用して固定IPアドレスを割り当てる設定にした。

default-lease-time 180;
max-lease-time 180;
subnet 192.168.10.0 netmask 255.255.255.0 {
        range 192.168.10.120 192.168.10.130;
}

allow booting;
allow bootp;
class "pxeclients" {
   match if substring(option vendor-class-identifier, 0, 9) = "PXEClient";
   next-server 192.168.10.204;
#  filename "pxelinux.0";
}

host diskless00 {
    hardware ethernet 00:01:03:04:05:06;
    fixed-address 192.168.10.110;
    option host-name "diskless00";
    filename "pxelinux.0";
}

# Raspberry Pi
host hsrp05-exp0 {
    hardware ethernet b8:27:eb:01:02:03;
    fixed-address 192.168.10.209;
    option host-name "hsrp05-exp0";
    option tftp-server-name "192.168.10.204";
    next-server 192.168.10.204;
    filename "bootcode.bin";
}

PCでCentOSをネットワークブートするときに比べると、 option tftp-server-name "192.168.10.204"; が必要なようだ。

/var/lib/tftpboot へファイルを配置

tftp-serverのtftpdを使ったので/var/lib/tftpboot/ 以下がtftpdのrootディレクトリ になる。 ここにSDカードから/bootのファイル群をとりだしていれる。 bootcode.binだけはtftpboot直下におく。 その他はシリアル番号と同じ名前のディレクトリを作り、その下に配置する。

/var/lib/tftpboot/bootcode.bin
                 /12345678/COPYING.linux
                          /LICENCE.broadcom
                          /LICENSE.oracle
                          /bcm2708-rpi-0-w.dtb
                           :
                          /kernel.img
                          /kernel7.img
                          /start.elf
                          /start_cd.elf			    
                           :

NFS root

NFSは、dnsmasqを使う場合と同じ。

# /etc/exports
/home/raspi-root 192.168.10.0/24(rw,no_root_squash)

/home/raspi-root/12345678/ ディレクトリを作り、そこにSDカードから ルートパーティションのファイル群をコピーする。 以下のディレクトリがならぶことになる。

server# ls -l
total 36
drwxr-xr-x  2 root root 4096 May 14 11:07 bin
drwxr-xr-x  2 root root   24 May  9 14:28 boot
drwxr-xr-x  4 root root 4096 Apr  8 18:39 dev
drwxr-xr-x 95 root root 8192 May 14 16:38 etc
drwxr-xr-x  5 root root   41 Apr 22 15:33 home
drwxr-xr-x 16 root root 4096 Apr  8 18:58 lib
drwx------  2 root root    6 Apr  8 19:24 lost+found
drwxr-xr-x  2 root root    6 Apr  8 18:37 media
drwxr-xr-x  2 root root    6 Apr  8 18:37 mnt
drwxr-xr-x  3 root root   16 Apr  8 18:48 opt
drwxr-xr-x  2 root root    6 Feb 18 00:05 proc
drwx------  3 root root  134 May 14 11:15 root
drwxr-xr-x  5 root root   56 Apr  8 18:49 run
drwxr-xr-x  2 root root 4096 May 14 11:07 sbin
drwxr-xr-x  2 root root    6 Apr  8 18:37 srv
drwxr-xr-x  2 root root    6 Feb 18 00:05 sys
drwxrwxrwt  8 root root  182 May 15 12:45 tmp
drwxr-xr-x 12 root root  131 Apr 22 15:33 usr
drwxr-xr-x 11 root root  151 Apr  8 19:25 var

/etc/fstabの修正

SDカードからファイル群をとってきたときには/etc/fstabからSDカードの 行を消す(あるいはコメントアウト)しておく。SDカードのパーティションを 示す設定が残っているとルートファイルシステムをマウントできず起動しない。

ネットワークの設定

/home/raspi-root/12345678/etc/dhcpcd.confで起動後のネットワークの 設定を行う。static IPアドレスを割り当てるには

# Example static IP configuration:
interface eth0
static ip_address=192.168.0.20/24
#static ip6_address=fd51:42f8:caae:d92e::ff/64
#static routers=192.168.0.1
#static domain_name_servers=192.168.0.1 8.8.8.8 fd51:42f8:caae:d92e::1

のようにしておく。

ブート結果

以上の設定でRaspberry Pi 3 Model B+は、上記3種類のネットワークスイッチを 介して正常にブートした。

ブート時のDHCP DISCOVERとOFFERそれに続くtftpサーバー検出のためのARP、 およびtftpでのファイルダウンロードの先頭付近のパケットキャプチャ:

0.000000 IP 0.0.0.0.68 > 255.255.255.255.67: BOOTP/DHCP, Request from b8:27:eb:XX:XX:XX, length 322
0.000177 IP 192.168.10.204.67 > 192.168.10.207.68: BOOTP/DHCP, Reply, length 300
0.010507 ARP, Request who-has 192.168.10.204 tell 192.168.10.207, length 46
0.010521 ARP, Reply 192.168.10.204 is-at 00:10:18:48:29:e6, length 28
0.014953 IP 192.168.10.207.49153 > 192.168.10.204.69:  35 RRQ "XXXXXX/start.elf" octet tsize 0
0.019376 IP 192.168.10.204.58441 > 192.168.10.207.49153: UDP, length 16
0.019501 IP 192.168.10.207.49153 > 192.168.10.204.58441: UDP, length 4

(補遺) Raspberry Pi 3 Model Bがブートできない

手元にRPi 3 Model B(プラスが付かない100Mbps Ethernetのもの)があったので これも上記設定でよいか試してみたが、ネットワークブートできるとは かぎらないという結果だった。

使ったファームウェアはModel B+と同じ:

# vcgencmd version
Mar 27 2019 15:45:53
Copyright (c) 2012 Broadcom
version 2e98b31d18547962e564bdf88e57b3df7085c29b (clean) (release) (start)

調べてみると、途中のネットワークスイッチが変わると動作も変わり、

  • ネットワークスイッチを介せず、LANケーブルをPCとRPiで直結するとネットワークブートできた。
  • CentreCOM GS908TPLV2およびNETGEAR GS105を介した場合は、PCサーバー側でtcpdumpで観察すると、 DHCP DISCOVERのパケットは到着している、 DHCP OFFERのパケットはPC側から送られているまでは進行しているが、tftpでファイルを取りには こない状態で動作が停止していた。ネットワークスイッチのLEDは正常に点灯していた。
  • Buffalo LSW5-GT-8NS/BKを介した場合はサーバーPC側でみて、RPi側からDHCP DISCOVERの パケットが観測されなかった。当然ネットワークブートはできていない。 ネットワークスイッチのLEDは正常に点灯していた。

なおCentreCOM GS908TPLV2およびNETGEAR GS105の場合、DHCP OFFERのあと、pingで(指定するIPアドレスは ネットワークブートに使うIPアドレスのどれでもよい)パケットを1回流すと tftpでのファイル取得が開始され、正常にネットワークブートできた。

上記dhcpd.confではfixed addressを指定した。 fixed addressを指定しないとrangeで指定したIPアドレスが動的に割り当てられるように なる。ISC dhcpdは動的に割り当てる場合は、DHCP DISCOVERパケットがやってくると、 割り当てようとしているIPアドレスが使われていないか、pingを使い検査する (1秒以内に返答がないと使われていないと判断する)。検査後DHCP OFFERパケットを 投げる。このpingが有効に働いているのかCentreCOMのスイッチでも dhcpd.confの設定が動的にIPアドレスを割り当てるときにはネットワークブートできた。

  • fixed addressを指定しない場合のdhcp部分パケットキャプチャ
  • fixed addressを指定した場合のdhcp部分パケットキャプチャ

BuffaloのスイッチはそもそもDHCP DISCOVERがPCサーバーに到着していないので range指定してもネットワークブートはできなかった。

その他+なしモデルのブート

上の参考ページに

option vendor-encapsulated-options "Raspberry Pi Boot";

というのがあるのでやってみたが、

option vendor-encapsulated-options "Raspberry Pi Boot   "
(3個余計にスペースがある)
option vendor-encapsulated-options 6:1:3:a:4:0:50:58:45:9:14:0:0:11:52:61:73:70:62:65:72:72:79:20:50:69:20:42:6f:6f:74:ff;

も試してみたが動かない。そもそもケーブル直結でネットワークブートできているので dhcpd.confの設定問題ではなさそうだ。

NetworkBoot ではプラスなしのRPi 3 Model Bを使い、 ISC-dhcpd、tftp-serverではなくdnsmasqを使った。 dnsmasqを使って、dhcp-hostを使い固定IPアドレスをふる方法でも ネットワークブートすることを確認した(でも100%ブートするわけではない)。 ISC-dhcpdのときとでoptionが違っているようだがそれが効いているのか? 不明。 使用機材はCentreCOM GS908TPLV2。buffaloのものはそもそもDHCP DISCOVERが PCサーバーに到着していないのでdnsmasqでもブートしない。

Raspberry Pi 3 Model Bはイーサネットは100Mbps、Model B+は1Gbpsに なっているのでハードウェア的に違いがある。Model B+ではネットワークブート できるが、Model Bではできないことがあるというのはそのあたりが 関連しているのか?

(註) Model B+で1Gbpsになったといっても、その上流はUSB 2なので 実際には200Mbpsくらいしか出ない。

RPi 3 Model 3 (プラスなし)ログ

bootmodes解説 にあるようにSDカードVFATパーティションにbootcode.binだけをいれて

sed -i -e "s/BOOT_UART=0/BOOT_UART=1/" bootcode.bin

とするとearly stage UARTが有効になる。出力は115200-8-N-1で出るので USBシリアルケーブルをGND、GPIO14, GPIO15に接続しておくと起動の様子 がわかる。

bootcode.binのみをSDカードにいれておいてネットワークブートできる 環境で電源をいれるとネットワークブートする。プラスなしRPi Model Bは SDカードにbootcode.binのみをいれるセットでは無事ネットワークブートした。 下のようなログがでた(後半省略)

Raspberry Pi Bootcode

Found SD card, config.txt = 0, start.elf = 0, recovery.elf = 0, timeout = 0
Trying USB
Hub device found at addr 4, enumerating HUB
Initialise hub
Found 5 ports, multi_tt = 1
Setting interface 0
Enabling PORT POWER on port 1
Enabling PORT POWER on port 2
Enabling PORT POWER on port 3
Enabling PORT POWER on port 4
Enabling PORT POWER on port 5
Waiting for devices to respond to reset
Found device on port 1
Found highspeed device
Device found: type = Ethernet adapter, addr = 5
Found device on port 4
Ignoring low speed device
Trying booting from Ethernet device addr 5
Initialise ethernet with MAC b8:27:eb:XX:XX:XX
Wait for Link up
Link up
Sending DHCP request
Waiting for dhcp_reply
ARP request: my IP addr 192.168.10.207 my eth_addr b8:27:eb:XX:XX:XX ARP for addr 192.168.10.204
Done ARP for 192.168.10.204 got 00:10:18:YY:YY:YY
Read File: config.txt, 1607 (bytes)

ネットワークブートの機能が追加されたときの Rasbperrypi Blog になにやらスイッチを選ぶという話が書いてある。