Raspberry Pi 4 で運用実験中
No.26
Tweet ⌚ 2022年4月29日(金) 11:48:20 情報 <9939文字>
« No.25 / No.27 »
初期表示に戻る
DASHBOARD
■全文検索:
複合検索窓に切り替える
■複合検索:
■ハッシュタグ:
■カテゴリ:
■最近の投稿:
■日付一覧:
■日付検索:
■機器状態:
編集
RSSフィード
続・モニタ無しでラズパイを VNC 接続できるとこまでセットアップする
以前に 完全モニタ無しで Raspberry Pi 4 を VNC 接続できるとこまでセットアップするメモ なんてのを紹介していたんだけど…それから月日が流れ Raspberry Pi OS のバージョンが上がったっていうか色々とセットアップ方法が変更になったんでその辺をざっくり検証してみましたってメモです
そんな今回は某案件的な話で貸与して頂けた Raspberry Pi 400 を使用して 64-bit 版の Raspberry Pi OS with desktop をモニタ無しっていうか SSH でログインしつつの VNC 接続できる所まで試してみました
今回の Raspberry Pi OS のバージョンアップの大きな変更っていうか…今までデフォルトで「pi」ってユーザが用意されていたのが今回からそれが廃止になったようです それに伴いパスワードを設定したユーザが不在(?)って事になり dd コマンドなりでイメージを書き込んだ後に boot パーティションのルートフォルダにファイル名が「ssh」もしくは「ssh.txt」のファイルを新規作成しただけでは SSH でログインできなくなってました
それじゃどうしよう?って話なんですが…まぁ結果から云うとそれをどうにかする機能が追加された新しい Raspberry Pi Imager を使うって事らしいです
これの右下にある「歯車」のマークをクリックすると…
「詳細な設定」として 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 キーを使う場面もあります ※ 画像は古いバージョンのものなので少々表示が異なる場合があります
3 Interface Options を選ぶ
I3 VNC を選ぶ
VNC サーバを有効にするけどいいの?と聞かれるんで <Yes> を選ぶ
設定完了
お次は vncserver-x11 ファイルを編集する
$ sudo nano /root/.vnc/config.d/vncserver-x11
末尾に以下の 3 行を追加します
Authentication=VncAuth
Encryption=AlwaysOff
Password=
VNC サーバを再起動する
$ sudo systemctl restart vncserver-x11-serviced
VNC のパスワードを設定する
$ sudo vncpasswd -service
VNC サーバを再起動する
$ sudo systemctl restart vncserver-x11-serviced
以前はこの後に /boot/config.txt を編集する必要があったけど…今回はこの作業をする事なく VNC 接続できました
せっかくなんで日本語化の設定も行っておきましょう
Raspberry Pi Configuration の Location タブの Set Locate ボタンを押して Language と Character Set を設定して OK ボタンを押下する
その後に再起動することにより設定が反映され表示が日本語になります
あーあとお好みにより $ sudo apt install ibus-mozc でローマ字かな漢字変換っていうかインプット・メソッドをインストールしておくのもいいかも知れません これも再起動後に有効になります
既に設定した後なんで心もち表示が違うかもだけど…右上のインジケータにあるキーボードマークをクリックして 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 を参照するといいらしい?(無保証 ちょっと調べてみたら判明した気がしたんで今後のもしものために記載しておくメモ