Raspberry Pi を全自動で PXE Boot できるようにする SD カードを作成する
PXE ブートすると,SD カードの寿命を気にしなくて済むようになるので,
可用性が飛躍的に向上します.
しかし, PXE ブートするためには,先に SD カードでブートしていろいろしないといけません.
やらなきゃいけないことは以下です.
- eeprom をアップデートする
- config を書き換える
- eeprom に config を入れ込む
- eeprom を焼く
- 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台でもプロビジョニングできそうですね.