このページは,Proxy DHCPを使ったPXEブートに関する情報をまとめています.
PXEブートに関する一般的な知識については,参考文献を参照してください.
Raspberry Pi
公式サイトのヘルプに書かれていますが,PXE_BOOT_MENU
オプションのdescription
がRaspberry Pi Boot
(case-sensitive)を含んでいる場合のみ,TFTPリクエストが送信されます.
上記のPXE_BOOT_MENU
オプションを含む応答を返したサーバーのIPアドレスに対して,bootcode.bin
に対するTFTP Readリクエストを送信します.サーバーのIPアドレスはrecv_from()
で取得していると思われます.このことは,公式フォーラムでも話題になったようです.
また,以下の情報などを指定しても無視されます.
siaddr
sname
file
-
server identifier
オプション -
PXE_BOOT_SERVERS
オプション
open-iscsi
を使えば,iSCSIストレージ上のルートファイルシステムをPXEブート時にマウントできます.
手順が煩雑なのでスクリプトを作成しました.
curl -sSL https://git.io/make-iscsi-rootfs-v6 | sh -s -- \
-b -p 192.168.0.9 -t iqn.2019-04.example.host:iscsi.target \
-i iqn.2019-04.example.host:iscsi.initiator
オプションの意味はヘルプに記載してあります.ターゲットに接続出来ない場合,再起動後に再度実行してください.
/etc/fstab
は更新しないので,スクリプト実行後に適切に書き換えてください.
Raspbian BusterでPXEブートが機能しない
以下をcmdline.txt
に追加すればPXEブートできるように.
modprobe.blacklist=bcm2835_v4l2
ただし,カメラは機能しなくなります.カメラが必要な方は,暫くはRaspbian Stretchを使い続けましょう.
- https://www.raspberrypi.org/forums/viewtopic.php?t=245301
- https://github.com/raspberrypi/linux/issues/3067
Raspbian StretchでもKernelを更新するとPXEブートできなくので,kernel関係のアップデートは暫くやめておきましょう.
ROCK64
Proxy DHCPは使えません.
以下のどちらかになりますが,素直にDHCPサーバーを使うことをお薦めします.
- MACアドレスかベンダークラス識別子でフィルターして
siaddr
を付与できるDHCPサーバーを使う - SPIフラッシュに書き込むU-Bootを改造し,
serverip
を固定する
何らかの理由で,DHCPサーバーの設定を変更できない,ブロードキャストドメインの分割ができない場合は,後者以外の選択肢はありません.
U-Boot (ayufan-rock64/linux-u-boot)
ROCK64でPXEブートを行う場合,SPIフラッシュに書き込んだU-Bootを使います.SPIフラッシュへの書き込み手順は以下を参照してください.
U-Bootの処理内容はスクリプトで記述されています.私が実際に抽出したわけではありませんが,こちらに記述されているようになっているみたいです.少なくともdhcp
およびpxe (get|boot)
の処理順は,実際のDHCP/TFTPパケットの順序とも合致します.
U-Bootの厄介な点は
- Proxy DHCPが機能しません
-
yiaddr
がないとDHCPリプライを破棄 - 1つのDHCPリクエストに対して,有効なリプライは1つのみ
- 最初に届いた
yiaddr
を含むリプライのsiaddr
がpxe get
のサーバーIPとなります - つまり,Proxy DHCPサーバーから
yiaddr
を返せたとしても,DHCPサーバーとの反応速度の競争となります
- 最初に届いた
-
-
pxe get
前のdhcp
は,ベンダークラス識別子がU-Boot.armv8
となっており,dnsmasq
のpxe-service
は機能しません -
pxe get
前のdhcp
でsiaddr
を取得できないと,pxe get
でpxelinux.cfg/*
へのTFTPリクエストが出ません - ベンダー拡張をサポートしていないのでoption(43)は機能しません
U-Bootのserveripの初期値を設定
TFTPサーバーのIPアドレスを含むU-Bootを作成するスクリプトを作成しました.
curl -sSL https://git.io/rock64-make-pxeloader | \
sh -s -- -r 2017.09-rockchip-ayufan-1045-g9922d32c04 -s 10.1.2.3
serverip
の初期値を10.1.2.3
に設定したU-BootをDockerコンテナ上でビルドします.ビルド結果はカレントディレクトリのout
ディレクトリにコピーされます.
改造後のU-Bootは,dhcp
でserverip
が設定されなかった場合,pxe get
で10.1.2.3
に対してTFTPリクエストを送信します.
pxe get
の動作については以下を参照してください.
PXELINUXについては以下を参照してください.
以下のようなフォルダ構成にすることで,機器ごとに読み込むファイルを変更できます.
- tftp-root/
- pxelinux.cfg/
- 01-AA-BB-CC-DD-EE-FF(AA-BB-CC-DD-EE-FFはMACアドレス)
- rock64/
- aabbccddeeff/(aabbccddeeffはMACアドレス)
- initrd.img-xxxファイルなど
/boot
以下のファイル・フォルダをコピー
- initrd.img-xxxファイルなど
- aabbccddeeff/(aabbccddeeffはMACアドレス)
- pxelinux.cfg/
default linux
label linux
kernel /rock64/aabbccddeeff/vmlinuz-xxx
initrd /rock64/aabbccddeeff/initrd.img-xxx
devicetreedir /rock64/aabbccddeeff/dtbs/xxx
append ...