LoginSignup
1
3

More than 3 years have passed since last update.

Proxy DHCPを使ったPXEブート

Last updated at Posted at 2019-03-28

このページは,Proxy DHCPを使ったPXEブートに関する情報をまとめています.

PXEブートに関する一般的な知識については,参考文献を参照してください.

Raspberry Pi

公式サイトのヘルプに書かれていますが,PXE_BOOT_MENUオプションのdescriptionRaspberry 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ブートできるように.

cmdline.txt
modprobe.blacklist=bcm2835_v4l2

ただし,カメラは機能しなくなります.カメラが必要な方は,暫くはRaspbian Stretchを使い続けましょう.

Raspbian StretchでもKernelを更新するとPXEブートできなくので,kernel関係のアップデートは暫くやめておきましょう.

ROCK64

Proxy DHCPは使えません.

以下のどちらかになりますが,素直にDHCPサーバーを使うことをお薦めします.

  1. MACアドレスかベンダークラス識別子でフィルターしてsiaddrを付与できるDHCPサーバーを使う
  2. 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を含むリプライのsiaddrpxe getのサーバーIPとなります
      • つまり,Proxy DHCPサーバーからyiaddrを返せたとしても,DHCPサーバーとの反応速度の競争となります
  • pxe get前のdhcpは,ベンダークラス識別子がU-Boot.armv8となっており,dnsmasqpxe-serviceは機能しません
  • pxe get前のdhcpsiaddrを取得できないと,pxe getpxelinux.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は,dhcpserveripが設定されなかった場合,pxe get10.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以下のファイル・フォルダをコピー
01-AA-BB-CC-DD-EE-FF
default linux

label linux
    kernel /rock64/aabbccddeeff/vmlinuz-xxx
    initrd /rock64/aabbccddeeff/initrd.img-xxx
    devicetreedir /rock64/aabbccddeeff/dtbs/xxx
    append ...

参考文献

1
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
3