でんげき☆ Network Service

Raspberry Pi 4 で運用実験中 Connect checker

No.26

続・モニタ無しでラズパイを VNC 接続できるとこまでセットアップする

20220429192311-admin.png
 
以前に 完全モニタ無しで Raspberry Pi 4 を VNC 接続できるとこまでセットアップするメモ なんてのを紹介していたんだけど…それから月日が流れ Raspberry Pi OS のバージョンが上がったっていうか色々とセットアップ方法が変更になったんでその辺をざっくり検証してみましたってメモです

20220429185131-admin.jpg 202204291851316-admin.png
そんな今回は某案件的な話で貸与して頂けた Raspberry Pi 400 を使用して 64-bit 版Raspberry Pi OS with desktop をモニタ無しっていうか SSH でログインしつつの VNC 接続できる所まで試してみました

今回の Raspberry Pi OS のバージョンアップの大きな変更っていうか…今までデフォルトで「pi」ってユーザが用意されていたのが今回からそれが廃止になったようです それに伴いパスワードを設定したユーザが不在(?)って事になり dd コマンドなりでイメージを書き込んだ後に boot パーティションのルートフォルダにファイル名が「ssh」もしくは「ssh.txt」のファイルを新規作成しただけでは SSH でログインできなくなってました

202204291851315-admin.png
それじゃどうしよう?って話なんですが…まぁ結果から云うとそれをどうにかする機能が追加された新しい Raspberry Pi Imager を使うって事らしいです
これの右下にある「歯車」のマークをクリックすると…

202204291851314-admin.png
「詳細な設定」として Pi OS の諸々の設定ができるようになります ユーザの設定だけでなく SSH の有効化や Wi-Fi の設定も一気に行えるんでこれは便利ですね!(>_<)w

  :

・・とまぁこれで話が終わっちゃうのも少々物足りない気がしたっていうか Pi Imager を使うことなくそれらの設定をどうにかする手法を模索してみました
まずはイメージファイルを dd なりで書き込んだものと Pi Imager を使って書き込んだものを比較してみました その結果 /boot/cmdline.txt に変更が加えられてたのと /boot/firstrun.sh が生成されていた事が判りました

それでは /boot/cmdline.txt から見ていきましょう

----- オリジナルの /boot/cmdline.txt -----
console=serial0,115200 console=tty1 root=PARTUUID=50a67c3e-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh splash plymouth.ignore-serial-consoles
----------

----- Pi Imager が作った /boot/cmdline.txt -----
console=serial0,115200 console=tty1 root=PARTUUID=50a67c3e-02 rootfstype=ext4 fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh splash plymouth.ignore-serial-consoles systemd.run=/boot/firstrun.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target
----------

これを見る限り Pi Imager を使わずにどうにかする時にはオリジナルの /boot/cmdline.txt の末尾に systemd.run=/boot/firstrun.sh systemd.run_success_action=reboot systemd.unit=kernel-command-line.target を付ければよさそうです

ただし「root=PARTUUID=50a67c3e-02」の部分ですかね…これは配布されるディスクイメージのバージョン毎に異なる値を設定する必要があるようです
その辺の PARTUUID を調べるには lsblk コマンドを使うといいらしい? 試しに実際に USB メモリに書き込んだものと…ディスクイメージを直接マウントしたものとで確認してみました

$ lsblk -o TYPE,KNAME,PARTUUID,LABEL,SIZE,VENDOR
TYPE KNAME    PARTUUID    LABEL    SIZE VENDOR
disk sdg                          29.9G silicon
part sdg1     50a67c3e-01 boot     256M
part sdg2     50a67c3e-02 rootfs   3.7G
rom  sr0                          1024M HL-DT-ST
part loop39p1 50a67c3e-01 boot     256M
part loop39p2 50a67c3e-02 rootfs   3.7G

これを見る限り /rootfs に設定された PARTUUID をコピペすればいいようですね この辺は dd なりでイメージを書き込んだ場合には気にする必要はなさそうだけど /boot/cmdline.txt を全て自作で用意したいような場合には気をつけたほうがいいのかな?って思いました

  :

お次は /boot/firstrun.sh です 長くてややこしいですが頑張って見ていきましょう

----- Pi Imager が作った /boot/firstrun.sh -----
#!/bin/bash

set +e

CURRENT_HOSTNAME=`cat /etc/hostname | tr -d " \t\n\r"`
echo HostName >/etc/hostname
sed -i "s/127.0.1.1.*$CURRENT_HOSTNAME/127.0.1.1\tHostName/g" /etc/hosts
FIRSTUSER=`getent passwd 1000 | cut -d: -f1`
FIRSTUSERHOME=`getent passwd 1000 | cut -d: -f6`
if [ -f /usr/lib/userconf-pi/userconf ]; then
   /usr/lib/userconf-pi/userconf 'UserName' '$5$Salt$xxxxxxxxxx..'
else
   echo "$FIRSTUSER:"'$5$Salt$xxxxxxxxxx..' | chpasswd -e
   if [ "$FIRSTUSER" != "UserName" ]; then
      usermod -l "UserName" "$FIRSTUSER"
      usermod -m -d "/home/UserName" "UserName"
      groupmod -n "UserName" "$FIRSTUSER"
      if grep -q "^autologin-user=" /etc/lightdm/lightdm.conf ; then
         sed /etc/lightdm/lightdm.conf -i -e "s/^autologin-user=.*/autologin-user=UserName/"
      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/UserName/"
      fi
      if [ -f /etc/sudoers.d/010_pi-nopasswd ]; then
         sed -i "s/^$FIRSTUSER /UserName /" /etc/sudoers.d/010_pi-nopasswd
      fi
   fi
fi
systemctl enable ssh
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="Wi-Fi_SSID"
   psk=0123456789abcdefxxxx..
}

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
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
rm -f /boot/firstrun.sh
sed -i 's| systemd.run.*||g' /boot/cmdline.txt
exit 0
----------

この中で書き換えるべき点はホストネームとなる HostName と作成するユーザ名 UserName & パスワード $5$Salt$xxxxxxxxxx.. と Wi-Fi に接続するための Wi-Fi_SSID &パスワード 0123456789abcdefxxxx.. の箇所でしょうか
その辺を踏まえた上で…もちっと再設定しやすいように改変してみました

----- 改変版 /boot/firstrun.sh -----
#!/bin/bash

USER='UserName'
PASS='$5$Salt$xxxxxxxxxx..'
WIFISSID='Wi-Fi_SSID'
WIFIPASS='0123456789abcdefxxxx..'
HOST='HostName'

set +e

CURRENT_HOSTNAME=`cat /etc/hostname | tr -d " \t\n\r"`
echo $HOST >/etc/hostname
sed -i "s/127.0.1.1.*$CURRENT_HOSTNAME/127.0.1.1\t$HOST/g" /etc/hosts
FIRSTUSER=`getent passwd 1000 | cut -d: -f1`
FIRSTUSERHOME=`getent passwd 1000 | cut -d: -f6`
if [ -f /usr/lib/userconf-pi/userconf ]; then
   /usr/lib/userconf-pi/userconf "$USER" "$PASS"
else
   echo "$FIRSTUSER:$PASS" | chpasswd -e
   if [ "$FIRSTUSER" != "$USER" ]; then
      usermod -l "$USER" "$FIRSTUSER"
      usermod -m -d "/home/$USER" "$USER"
      groupmod -n "$USER" "$FIRSTUSER"
      if grep -q "^autologin-user=" /etc/lightdm/lightdm.conf ; then
         sed /etc/lightdm/lightdm.conf -i -e "s/^autologin-user=.*/autologin-user=$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/$USER/"
      fi
      if [ -f /etc/sudoers.d/010_pi-nopasswd ]; then
         sed -i "s/^$FIRSTUSER /$USER /" /etc/sudoers.d/010_pi-nopasswd
      fi
   fi
fi
systemctl enable ssh
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="$WIFISSID"
   psk=$WIFIPASS
}

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
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
rm -f /boot/firstrun.sh
sed -i 's| systemd.run.*||g' /boot/cmdline.txt
exit 0
----------

こんな感じでしょうか 設定すべき項目を最初の方に集めてありそこを書き換えればいいようにしてみました
その中で注意すべき点と云いますか…パスワードですね
USER='UserName'
PASS='$5$Salt$xxxxxxxxxx..'

ログインするユーザのパスワードは暗号化されたものを指定する必要があるようです これは openssl passwd コマンドで生成できます

$ openssl passwd -5 -salt=Salt password
-5 オプションは SHA256 アルゴリズムでの暗号化を行います この他にも SHA512 で暗号化する -6 オプションや MD5 で暗号化する -1 オプションとかがあるようです
-salt を指定すると更に複雑な暗号化を行うことができるらしい? 本来なら -salt=$RANDOM のようにランダムに生成した文字列を指定するのが推奨されているようだけどお好みの文字列でも暗号化できます まぁなんか面倒くさそうだな…って感じなら -salt オプションを省略しても問題はないんですが汗

この /boot/firstrun.sh でユーザのパスワードを指定する際には必ず暗号化されたパスワードを使用する必要があり…平文のパスワードは使えません どうしても平文のパスワードを使いたい場合は /boot/firstrun.sh/rootfs/usr/lib/userconf-pi/userconf 内の「chpasswd -e」の「-e」を削除すればできなくもないけど… /rootfs/usr/lib/userconf-pi/userconf は ext4 ファイルシステムなので OS によっては読み書きできないかもだしアクセス権が root なのでその辺もどうにかしないといけないので色々と面倒です

そんな訳なんで…初ログイン後にすぐ別のパスワードに書き換えることを前提に仮的なパスワードを作っておきました
$ openssl passwd -5 -salt=pass pass として作成した $5$pass$Rl0JZvvs0bt2Lu8dfAumW11vh2yrd.LfOysdTyQ7Yt5 って感じのセキュリティのかけらもない意識低すぎて気絶しそうなパスワードですが実際にこれを設定した後に「pass」なるパスワード文字列でログインできます

※ これでログインしたら直ちに passwd コマンドなりで別のパスワードを再設定してください!

ユーザ名の設定の他に Wi-Fi についての設定というかパスワードについても説明しておきます
WIFISSID='Wi-Fi_SSID'
WIFIPASS='0123456789abcdefxxxx..'

ここでも暗号化されたパスワードを使用します これは wpa_passphrase コマンドで生成できます

$ wpa_passphrase "Wi-Fi_SSID" "password"
network={
   ssid="Wi-Fi_SSID"
   #psk="password"
   psk=bd3f1ad8bd45873a14351f4209ab719147a960587508a8c89ef776cd9b43cefb
}
こんな感じで 256bit PSK アルゴリズムを用いた暗号化パスワードが生成されます このパスワードを WIFIPASS='0123456789abcdefxxxx..' の部分に貼り付けてやれば ok です
ちなみに #psk="password" って平文のパスワードがコメントして出てるっていうかパスワードをダブルクォート「""」で囲んでやれば平文のパスワードを指定できるんで… WIFIPASS='"password"' って指定も ok です ただしこの設定はシステムが可動した後も /etc/wpa_supplicant/wpa_supplicant.conf 内に残り続けることになるんでリスクがあります 平文のパスワードは危険を承知した上でご使用ください

  :

まぁそんなこんなで上記の /boot/cmdline.txt と /boot/firstrun.sh を用意したらラズパイの電源を入れて起動します 数分ほど待った後に SSH でログインできます ログインした後は概ね 完全モニタ無しで Raspberry Pi 4 を VNC 接続できるとこまでセットアップするメモ の手順で VNC 接続できますが…その辺を切り取って手短に解説しておきます

まずは SSH でログインして $ sudo raspi-config 設定ツールを起動する キーボードの矢印キーで移動してエンターキーで決定ってスタイルです Tab キーを使う場面もあります ※ 画像は古いバージョンのものなので少々表示が異なる場合があります

202110151828034-admin.png
3 Interface Options を選ぶ

202110151828035-admin.png
I3 VNC を選ぶ

202110151828036-admin.png
VNC サーバを有効にするけどいいの?と聞かれるんで <Yes> を選ぶ

202110151828037-admin.png
設定完了

お次は vncserver-x11 ファイルを編集する
$ sudo nano /root/.vnc/config.d/vncserver-x11
末尾に以下の 3 行を追加します
2021101518280310-admin.png
Authentication=VncAuth
Encryption=AlwaysOff
Password=


VNC サーバを再起動する
$ sudo systemctl restart vncserver-x11-serviced

VNC のパスワードを設定する
$ sudo vncpasswd -service

VNC サーバを再起動する
$ sudo systemctl restart vncserver-x11-serviced

202204291851313-admin.png
以前はこの後に /boot/config.txt を編集する必要があったけど…今回はこの作業をする事なく VNC 接続できました

202204291851312-admin.png
せっかくなんで日本語化の設定も行っておきましょう

202204291851311-admin.png
Raspberry Pi Configuration の Location タブの Set Locate ボタンを押して Language と Character Set を設定して OK ボタンを押下する
その後に再起動することにより設定が反映され表示が日本語になります

あーあとお好みにより $ sudo apt install ibus-mozc でローマ字かな漢字変換っていうかインプット・メソッドをインストールしておくのもいいかも知れません これも再起動後に有効になります

20220429185131-admin.png
既に設定した後なんで心もち表示が違うかもだけど…右上のインジケータにあるキーボードマークをクリックして Mozc を選べば ok です

  :

まぁだいたいこんな感じですかね 今後のバージョンアップなりで使えなくなるかもな資料ですが…とりあえず /boot/firstrun.sh が何をしていたのかをざっくり知ることができてよかったです
つーか世間的に Ubuntu Desktop 22.04 LTS on a Raspberry Pi が話題のようですね…これはいっぺん試してみなきゃ!(>_<)wって感じで今回はこの辺で #[Raspberry Pi]

※ 追記 ※
上記の話とは概ね関係ないんだけど…ラズパイの Bootloader イメージを Raspberry Pi Imager を使わずにダウンロードしたい場合は https://downloads.raspberrypi.org/eeprom... に記された "SD Card Boot", "USB Boot", "Network Boot" のそれぞれの url を参照するといいらしい?(無保証 ちょっと調べてみたら判明した気がしたんで今後のもしものために記載しておくメモ

情報 <9939文字>

DASHBOARD

■複合検索:

  • 投稿者名:
  • 投稿年月:
  • #タグ:
  • カテゴリ:
  • 出力順序:

■ハッシュタグ:

■カテゴリ:

■日付検索:

■機器状態:

Raspberry Pi 4 Status

編集

RSSフィード