Raspberry Pi Imagerの詳細な設定で何を行っているのか

# 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の有効化](#3.1SSHの有効化)で書いた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
```


いまのところ以上。余裕ができたらそのうち更新予定。