1. はじめに
Raspberry Pi Imager v1.7.4やv1.7.5を使っているとき、どういうわけか書き込みエラーで終了することがあった。正確にはベリファイエラーのようである。
そんなことがあり、Raspberry Pi Imagerについて調べているとバグが多いとか、信用ならないというような否定的な記述もまぁまぁあった。鵜呑みにはできないが、体験からすると懸念材料である。ということで、別の方法でマイクロSDカードに書き込めばよいのではないかと結論に至った。但し、他の書き込みツールには、Raspberry Pi Imagerが持っているユーザー設定やWi-Fi設定などがない。そこで、Raspberry Pi Imagerの歯車マークの「詳細な設定」で、何が行われているのか調べてみた。
2. 方法
何も設定しない場合と設定を追加した場合で比較する。とはいってもブート領域の以下のファイルくらいしか変化しそうなファイルはない。
- cmdline.txt
- config.txt
- firstrun.sh
3. 変化点
firstrun.shにあった。
3.1 SSHを有効化する
「FIRSTUSERHOME=`getent passwd 1000 | cut -d: -f6`」の直後に入る
尚、このif文ブロックのすぐ下はユーザー追加用if文ブロックになる。
if [ -f /usr/lib/raspberrypi-sys-mods/imager_custom ]; then
/usr/lib/raspberrypi-sys-mods/imager_custom enable_ssh
else
systemctl enable ssh
fi
3.2. ユーザー名とパスワードを追加する
設定に使用したユーザー名は当然アルファベットだが、元のユーザー名を隠すためと分かりやすいよう「ユーザー名」としてある。パスワードは12345678を使った。
SSHを有効化していない場合、「FIRSTUSERHOME=`getent passwd 1000 | cut -d: -f6`」の直後にユーザー設定用のブロックが追加される。
SSHを有効化している場合、前項のSSHの有効化で書いたif文ブロックが追加される。
#!/bin/bash
set +e
FIRSTUSER=`getent passwd 1000 | cut -d: -f1`
FIRSTUSERHOME=`getent passwd 1000 | cut -d: -f6`
#
# SSHを有効化している場合、ここにはSSHの有効化のためのif文が入る
#
if [ -f /usr/lib/userconf-pi/userconf ]; then
/usr/lib/userconf-pi/userconf 'ユーザー名' '$5$RcFPlY3GLZ$U9Xg1c/Z5O1daj3DxZBEkDZ5jf2D2ukqSfOS/KFExX9'
else
echo "$FIRSTUSER:"'$5$RcFPlY3GLZ$U9Xg1c/Z5O1daj3DxZBEkDZ5jf2D2ukqSfOS/KFExX9' | chpasswd -e
if [ "$FIRSTUSER" != "ユーザー名" ]; then
usermod -l "ユーザー名" "$FIRSTUSER"
usermod -m -d "/home/ユーザー名" "ユーザー名"
groupmod -n "ユーザー名" "$FIRSTUSER"
if grep -q "^autologin-user=" /etc/lightdm/lightdm.conf ; then
sed /etc/lightdm/lightdm.conf -i -e "s/^autologin-user=.*/autologin-user=ユーザー名/"
fi
if [ -f /etc/systemd/system/getty@tty1.service.d/autologin.conf ]; then
sed /etc/systemd/system/getty@tty1.service.d/autologin.conf -i -e "s/$FIRSTUSER/ユーザー名/"
fi
if [ -f /etc/sudoers.d/010_pi-nopasswd ]; then
sed -i "s/^$FIRSTUSER /ユーザー名 /" /etc/sudoers.d/010_pi-nopasswd
fi
fi
fi
「\$5\$RcFPlY3GLZ\$U9Xg1c/Z5O1daj3DxZBEkDZ5jf2D2ukqSfOS/KFExX9」が暗号化されたパスワード。2か所ある。
\$5の後の\$から次の\$までがsaltになっている。演算方法は以下のようになる。
openssl passwd -5 -salt=RcFPlY3GLZ 12345678
「-5」オプションはSHA256アルゴリズムを示している。
saltは同じ出力が続かないように使う、自分の閉じた環境なら同じでもいいかもしれない。
3.3. Wi-Fiを設定する
ユーザー設定の直後にWi-Fi設定が追加されていた。
尚、SSIDを「SSID1234」とし、パスワードを「abcdef12345678」とした。
if [ -f /usr/lib/raspberrypi-sys-mods/imager_custom ]; then
/usr/lib/raspberrypi-sys-mods/imager_custom set_wlan 'SSID1234' '293d937a5dec37d77f5504fe84d4f9072b09151b526d32cb5c4391da59aa1fe6' 'JP'
else
cat >/etc/wpa_supplicant/wpa_supplicant.conf <<'WPAEOF'
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
ap_scan=1
update_config=1
network={
ssid="SSID1234"
psk=293d937a5dec37d77f5504fe84d4f9072b09151b526d32cb5c4391da59aa1fe6
}
WPAEOF
chmod 600 /etc/wpa_supplicant/wpa_supplicant.conf
rfkill unblock wifi
for filename in /var/lib/systemd/rfkill/*:wlan ; do
echo 0 > $filename
done
fi
パスワードは暗号化されたものを使う。pskの算出方法は以下
$ wpa_passphrase "SSID1234" "abcdef12345678"
4. 残り
変更することなさそうなので、とりあえず記載だけしておく。
if [ -f /usr/lib/raspberrypi-sys-mods/imager_custom ]; then#
/usr/lib/raspberrypi-sys-mods/imager_custom set_keymap 'jp'
/usr/lib/raspberrypi-sys-mods/imager_custom set_timezone 'Asia/Tokyo'
else
rm -f /etc/localtime
echo "Asia/Tokyo" >/etc/timezone
dpkg-reconfigure -f noninteractive tzdata
cat >/etc/default/keyboard <<'KBEOF'
XKBMODEL="pc105"
XKBLAYOUT="jp"
XKBVARIANT=""
XKBOPTIONS=""
KBEOF
dpkg-reconfigure -f noninteractive keyboard-configuration
fi
rm -f /boot/firstrun.sh
sed -i 's| systemd.run.*||g' /boot/cmdline.txt
exit 0
いまのところ以上。余裕ができたらそのうち更新予定。