はじめに
Raspbian の最近のバージョンにはいくつか起動スクリプトで細工がしてあって、特にWindowsしかない環境でも色々融通が利くようになっています。この記事ではそのうちの私が知ってる範囲を、どうやって実現してるかまで含めて記事にします。
「最近の」というのは大体2016年あたりの変更に入っているのですが、いつのバージョンで入ったかまでは調べていられないので、今回の記事では2017-08-16(stretch の最初のバージョン)を元に確認しています。
仕掛け① SDカード容量にあわせてパーティション拡大
配布されているイメージファイルはできるだけ小さく済ませるようにパーティションを小さめに取ってあります。初回に起動したとき、そのSD/Micro SDカードの容量いっぱいになるように拡大するようになっています。
実現方法
配布イメージの/boot/cmdline.txtを開くと、init=/usr/lib/raspi-config/init_resize.sh
というオプションが付いています。これにより、カーネル起動後に実行する init プロセスとしてリサイズ用のシェルスクリプトを実行するようになっているわけです。
パスに raspi-config
とついてることから分かるかもしれませんが、sudo raspi-config
の中にあった Expand FileSystem
(だっけ?)を自動で呼ぶようにしたみたいですね。
仕掛け② sshdの自動起動
セキュリティ上の理由で、sshd の自動起動がオフにされました。これを元のように起動時に sshd が自動起動するようにするには boot パーティションの中に ssh
という名前のファイルを作ればよい、ということは結構知られていると思います。ここではその実現方法も見てみましょう。
実現方法
端的に言うと、systemd 設定の中に書いてあって実現されています。/lib/systemd/system/sshswitch.service
というファイルに以下のように書かれています。
[Unit]
Description=Turn on SSH if /boot/ssh is present
ConditionPathExistsGlob=/boot/ssh{,.txt}
After=regenerate_ssh_host_keys.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c "update-rc.d ssh enable && invoke-rc.d ssh start && rm -f /boot/ssh ; rm -f /boot/ssh.txt"
[Install]
WantedBy=multi-user.target
ConditionPathExistsGlob
で条件設定しているのですね。ファイルを見て知ったのですが、ssh
というファイルだけでなく、ssh.txt
というファイルでも大丈夫のようです。条件を満たすと実行されて、sshd の自動起動設定をした後、対象のファイルを削除しておくようです。時々、フォルダで作っても良いという説明を見たりもしますが、それだとrm -f /boot/ssh
で消えなくて微妙かもしれませんね。まあ、起動時に毎回呼び出されたところで別に困らないかもしれませんが。
仕掛け③ 無線LAN設定
どこで見つけたのかも忘れたくらいにあまり分かりやすいところに書いてないのですが、無線LANの設定ファイルである、wpa_supplicant.conf
も boot パーティションにおいておくと、起動時に本来の場所に移してくれるので、いきなり無線LANを使うことが可能です。
実現方法
これも同じく Systemd で設定されています。/lib/systemd/system/raspberrypi-net-mods.service` ですね。
[Unit]
Description=Copy user wpa_supplicant.conf
ConditionPathExists=/boot/wpa_supplicant.conf
Before=dhcpcd.service
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/bin/mv /boot/wpa_supplicant.conf /etc/wpa_supplicant/wpa_supplicant.conf
ExecStartPost=/bin/chmod 600 /etc/wpa_supplicant/wpa_supplicant.conf
[Install]
WantedBy=multi-user.target
単純に mv して chmod してくれるようになっています。
おわりに
②も③も systemd ということで、 同じような仕掛けがほかに入ってないかと思ったのですが、/bootを見るようなファイルはほかにありませんでした。①については仕掛けを知っていれば、あえてinit=/sbin/init
に戻して拡大しないようにして、小さいままで初期設定をしてバックアップを取る、などの工夫ができますね。バックアップを取るときにリサイズスクリプトに戻しておけば、容量の違うSDカードになっても大丈夫だし、そもそもイメージファイルが小さくて済む、などのメリットがあります。