はじめに
ラズパイの初回起動時に自動でスクリプトを実行できる方法がないかと思い,調査を行いました.systemdのサービスファイルを作って,自動起動するという記事は多くあるのですが,その方法では一度手動でラズパイ上での設定が必要になってしまいます.
Pi Imagerでsshやwifiの設定を行えるのですが,ここで設定をするとsdカードをラズパイにインストールし電源を入れるだけで全て設定が行われます.ここに秘密があるのでしょうということで,Pi Imagerで設定をしない場合とした場合で何が違うのか比べてみます.
自動実行方法の調査
Pi Imagerで設定した場合のファイル構成
firstrun.sh
が増えていることがわかります.また,cmdline.txtの内容も変更されています.
何も設定していない場合のcmdline.txtはこちらですが
console=serial0,115200 console=tty1 root=PARTUUID=194375f9-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspberrypi-sys-mods/firstboot
設定をした場合は後ろに以下の文が追記されています.
systemd.run=/boot/firstrun.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target
全体ではこのようになります.
console=serial0,115200 console=tty1 root=PARTUUID=194375f9-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspberrypi-sys-mods/firstboot systemd.run=/boot/firstrun.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target
実行
行った調査をもとに,OSインストール後cmdline.txtに追記しfirstrun.shを配置してラズパイを起動してみます.
うまく実行されたかわかるように/boot直下にsuccessというファイルを作成するようにします.
#!/bin/sh
touch success
起動後SDカードの中身を見てみると,success
というファイルが黄枠で囲っている部分に作成されていることがわかります.うまくいきました.
ちなみに,cmdline.txtのsystemd.run=/boot/firstrun.sh
の部分に違う名前のスクリプトを指定しても動作しました.
Pi Imagerで生成されるfirstrun.shの内容は以下の記事に詳細がありました.
おまけ
cmdline.txtのパラメータの意味
- console=serial0,115200 →serial0(UART)に115200のボーレートでログを出力
- console=tty1 →メインコンソール(tty1)にログを出力
- root=PARTUUID=194375f9-02 →ルートファイルシステムが格納されてるパーティションのUUID
- rootfstype=ext4 →ルートファイルシステムのフォーマット形式
- fsck.repair=yes →起動時にファイルシステムの自動修復を行う
- rootwait →ルートデバイスが認識されるまで待機する
- quiet →起動ログを詳細に表示しない,デバッグする時は消しておく
- init=/usr/lib/raspberrypi-sys-mods/firstboot →最初に実行するプログラム
- systemd.run=/boot/firstrun.sh →systemdでfirstrun.shを実行する
- systemd.run_success_action=reboot →firstrun.sh実行後に再起動する
- systemd.unit=kernel-command-line.target →起動時にカーネルコマンドラインユニットを使用する
その他参考ページ