takutakahashi.dev

Raspberry Pi を全自動で PXE Boot できるようにする SD カードを作成する

PXE ブートすると,SD カードの寿命を気にしなくて済むようになるので,
可用性が飛躍的に向上します.

しかし, PXE ブートするためには,先に SD カードでブートしていろいろしないといけません.
やらなきゃいけないことは以下です.

  1. eeprom をアップデートする
  2. config を書き換える
  3. eeprom に config を入れ込む
  4. eeprom を焼く
  5. reboot する

さらに,PXE Boot するために /proc/cpuinfo で確かめられる Serial を取得する必要があります.

これらを SD カードブートして ssh ログインして実行するのは骨が折れますね.
自動化しましょう.

手順

やることは.SD Boot した rasbian 上でスクリプトを作成して systemd に自動起動するように登録するだけです.

rasbian にログイン

ssh でログインします.以下,rasbian 上で作業します.

スクリプト

前回の記事を参考に,eeprom を焼くスクリプトを作成します.
latest を参照して自動化できるように工夫します.

apt update
apt full-upgrade -y
apt install rpi-eeprom -y # eeprom update
cd /tmp
EEPROM=`ls -d /lib/firmware/raspberrypi/bootloader/critical/* -1 |grep pieeprom |sort |tail -1` # 最新を参照
cp $EEPROM /tmp/pieeprom.bin
rpi-eeprom-config /tmp/pieeprom.bin > /tmp/bootconf.txt # bootconf を取得
sed -i s/0x1/0x21/g bootconf.txt # boot order を書き換え
rpi-eeprom-config --out pieeprom-new.bin --config bootconf.txt pieeprom.bin # 新しい bin を生成

そして,eeprom を焼く際に,成功したらファイルを作成するようにします.

rpi-eeprom-update -d -f pieeprom-new.bin && echo "applied" > /opt/status

スクリプトの最初に,reboot 直後の起動だったらそのまま halt する 処理を追加しましょう.
安全に処理を終了できます.

if [[ "`cat /opt/status`" = "applied" ]]; then
        rm /opt/status # 消しておくと,次回ブート時に再度 eeprom を焼けます
        halt
fi

Serial もログインせずに知りたいので, Slack に POST してもらいます.
Incoming Webhook URL を生成して,以下のようにすれば大丈夫です.

JSON_FMT='{"text":"%s"}'
SERIAL=`cat /proc/cpuinfo  |grep Serial |cut -c 19-`
curl -X POST https://hooks.slack.com/services/xxxxxxx/xxxxxxxx/xxxxxxxxxxxxxxxxxxxxx -d "`printf "$JSON_FMT" "$SERIAL"`"

これでスクリプトは完成です.
スクリプト全景は以下です.

#!/bin/bash -ex

if [[ "`cat /opt/status`" = "rebooted" ]]; then
        rm /opt/status
        halt
fi

apt update
apt full-upgrade -y
apt install rpi-eeprom -y
cd /tmp
EEPROM=`ls -d /lib/firmware/raspberrypi/bootloader/critical/* -1 |grep pieeprom |sort |tail -1`
cp $EEPROM /tmp/pieeprom.bin
rpi-eeprom-config /tmp/pieeprom.bin > /tmp/bootconf.txt
sed -i s/0x1/0x21/g bootconf.txt
rpi-eeprom-config --out pieeprom-new.bin --config bootconf.txt pieeprom.bin
rpi-eeprom-update -d -f pieeprom-new.bin && echo "rebooted" > /opt/status
JSON_FMT='{"text":"%s"}'
SERIAL=`cat /proc/cpuinfo  |grep Serial |cut -c 19-`
curl -X POST https://hooks.slack.com/services/xxxxxxx/xxxxxxxx/xxxxxxxxxxxxxxxxxxxxx -d "`printf "$JSON_FMT" "$SERIAL"`"
reboot

これを,/bin/apply_eeprom という名前で保存しておきましょう.

systemd service ファイルを準備

以下の内容のファイルを /etc/systemd/system/apply-eeprom.service に保存します.

[Unit]
Description=Apply EEPROM
After=network.target

[Service]
Type=simple
ExecStart=/bin/apply_eeprom

[Install]
WantedBy=multi-user.target

enable します.

sudo systemctl enable apply-eeprom

これで,rasbian 上での作業は完了です.

使い方

PXE Boot を有効にしたい Raspberry Pi に SD カードと Ethernet ケーブルを挿します.
そして電源を入れ,しばし待ちます.

すると,おもむろに Slack に文字列が飛んできます.

更に放置すると,自動的に halt するので電源を切ります.
そして tftpboot の設定をして,SD カードを抜いて起動すると,PXE Boot ができます!

まとめ

これで10台でも100台でもプロビジョニングできそうですね.