Raspberry Pi 3 B+のシステム用に、今時の Raspberry Pi OS ( bookworm ベース) をセットアップ。Raspbianと呼称されていた頃とはだいぶ異なる要領につまづきながら、 ヘッドレス 仕様のシステムを仕上げます。
Raspberry Pi OS 64bit Liteの入手
ヘッドレス運用のRaspberry Pi 3 B+で使用しているシステムを、アップグレードではなくまっさらなSDカードにbookwormベースの現行版Raspberry Pi OSを書き込み、いちから再構築。
さまざまな仕様のRaspberry Pi OSの中から、今回ヘッドレス用にダウンロードしたのは、Raspberry Pi OS (64-bit) Lite版です。
|
1 |
2024-03-15-raspios-bookworm-arm64-lite.img.xz 434,372,360 byte |
ディスクイメージの書き込み直後、小さかったルートパーティションは、従来は起動後に raspi-config を立ち上げて自分で拡張する必要がありましたが、今どきは初回ブート時に自動伸長してくれるようです。
これまでの初回ブート前仕込み
初回ブートから一貫してディスプレイに繋がず、SSHでターミナル越しで全て操作するには、システムSDにいくつかお膳立てが必要なのはいつもの通り。
まず、 bootfs ブートパーティションに、 ssh と言う名前の空ファイルを作って、SSHを利用可能に。
|
1 |
~$ touch /media/$USER/bootfs/ssh |
従来はこれでデフォルトユーザー pi 、パスワード raspberry で中に入れたのですが、bullseyeベースのある頃より、このデフォルトユーザーがセキュリティ上の理由から廃止されていました。
GUIベースなら対話式インストーラでアカウントを設定すれば良いだけの話ですが、ヘッドレスの場合は bootfs ブートパーティションに、 userconfig.txt と言うファイル名でユーザー名と暗号化したパスワードペアを記述すれば、初回ブートでアカウントを作成してもらえます(さもないと、SSHでユーザーアカウントが存在しないためにログインできない事態に)。
|
1 2 |
~$ echo 'raspberry' | openssl passwd -6 -stdin $6$Hd9ARTyp5CwqCj7L$8kH8P2ssEHF7z/Y9A0db0OvEkjVCcqSDn1DWSEychsdV/SR/ZHHNLklyw1MqdouZudXTzWebE.JzRetE/qt0j/ |
|
1 |
pi:$6$Hd9ARTyp5CwqCj7L$8kH8P2ssEHF7z/Y9A0db0OvEkjVCcqSDn1DWSEychsdV/SR/ZHHNLklyw1MqdouZudXTzWebE.JzRetE/qt0j/ |
さらに、Raspberry Pi 3以降には内蔵WiFiがあるので、接続先アクセスポイント情報を wpa_passphrase コマンドで成形、それを wpa_supplicant.conf というファイル名で、 bootfs ブートパーティションへ保存しておけば、初回ブート時にシステムが取り込み、自動接続してくれたものでした。
|
1 2 3 4 5 6 |
~$ wpa_passphrase SSID PASSWORD network={ ssid="SSID" #psk="PASSWORD" psk=c2161655c6ba444d8df94cbbf4e9c5c4c61fc37702b9c66ed37aee1545a5a333 } |
|
1 2 3 4 |
network={ ssid="SSID" psk=c2161655c6ba444d8df94cbbf4e9c5c4c61fc37702b9c66ed37aee1545a5a333 } |
が、今回のbookwormベースRaspberry Pi OSでは、このWiFi設定を初回ブートで取り込んでもらえません。
bookwormベースではcustom.tomlに集約
調べてみると、bookwormベースになって、 wpa_supplicant.conf がサポートされなくなったとのこと。おそらくネットワーク廻りがNetworkManagerが司ることになったためなのでしょう。
システムSD作成にRaspberry Pi Imagerを使うことが推奨とされているようですが、それ以外では bootfs ブートパーティションに custom.toml と言うファイルで記述すれば良さそう。
このファイルには、WiFi接続情報のみならず、ホスト名やユーザー名、ロケールとタイムゾーン、SSHの有効化もまとめて記述しておけるので便利。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
config_version = 1 [system] hostname = "homepi2" [user] name = "pi" password = "$6$Hd9ARTyp5CwqCj7L$8kH8P2ssEHF7z/Y9A0db0OvEkjVCcqSDn1DWSEychsdV/SR/ZHHNLklyw1MqdouZudXTzWebE.JzRetE/qt0j/" password_encrypted = true [ssh] enabled = true password_authentication = true [wlan] ssid = "SSID" password = "c2161655c6ba444d8df94cbbf4e9c5c4c61fc37702b9c66ed37aee1545a5a333" password_encrypted = true #hidden = false country = "JP" [locale] keymap = "us" timezone = "Asia/Tokyo" |
なお、初回ブートで初期設定が終わると、この custom.toml ファイルは自動削除されます。
初期設定後、ターミナルからWiFi設定を確認。やはり wpa_supplicant.conf は手付かずで、接続情報はNetworkManagerが握っていました。
|
1 2 |
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[connection] id=preconfigured uuid=34fa46dc-5899-4f1e-bf1a-2d85eb8b5919 type=wifi [wifi] mode=infrastructure ssid=SSID [ipv4] method=auto [ipv6] addr-gen-mode=default method=auto [proxy] [wifi-security] key-mgmt=wpa-psk psk=c2161655c6ba444d8df94cbbf4e9c5c4c61fc37702b9c66ed37aee1545a5a333 |
config.txtの編集点
その他、bootfsブートパーティションのconfig.txtで編集したパラメータは、以下の通り。
|
1 2 3 4 5 |
dtparam=i2c_arm=on dtoverlay=pi3-disable-bt gpu_mem=16 avoid_warnings=1 max_usb_current=1 |
I2Cセンサを繋げる予定なのでバスの有効化の他、Bluetoothの無効化などに続き、昔から頭を悩ませる Undervoltage detected 回避を願って、 avoid_warnings=1 を入れてみるも、起動時にちらっと数秒ログに記録されます(値を 2 にしても同じ)。
|
1 2 3 4 |
[Mon Jul 8 17:05:27 2024] hwmon hwmon1: Undervoltage detected! [Mon Jul 8 17:05:30 2024] lan78xx 1-1.1.1:1.0 eth0: Link is Up - 1Gbps/Full - flow control rx/tx [Mon Jul 8 17:05:30 2024] brcmfmac: brcmf_cfg80211_set_power_mgmt: power save enabled [Mon Jul 8 17:05:33 2024] hwmon hwmon1: Voltage normalised |
これは、GUI画面上に出る雷アイコンを消すだけかもしれません。
nmcliでeth0を静的IPへ
続いて、有線LANポートを静的IPへ変更を初めてNetworkManagerのCLIツール、 nmcli で設定します。
まずは、現在のインターフェイスを確認。
|
1 2 3 4 |
pi@homepi2:~ $ nmcli con show NAME UUID TYPE DEVICE Wired connection 1 2bf216a3-5206-3948-b859-2961973bd7da ethernet eth0 preconfigured 34fa46dc-5899-4f1e-bf1a-2d85eb8b5919 wifi wlan0 |
NAME項でインターフェイス名を把握したら、 nmcli con mod で静的IP情報を指定します。
|
1 2 3 4 |
pi@homepi2:~ $ sudo nmcli con mod "Wired connection 1" ipv4.addresses 192.168.1.203/24 pi@homepi2:~ $ sudo nmcli con mod "Wired connection 1" ipv4.gateway 192.168.1.1 pi@homepi2:~ $ sudo nmcli con mod "Wired connection 1" ipv4.dns 192.168.1.1 pi@homepi2:~ $ sudo nmcli con mod "Wired connection 1" ipv4.method manual |
インターフェイスのIPv4情報を確認。設定した通りですが、この時点ではまだインターフェイスに反映されていません。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
pi@homepi2:~ $ nmcli -f ipv4 con show "Wired connection 1" ipv4.method: manual ipv4.dns: 192.168.1.1 ipv4.dns-search: -- ipv4.dns-options: -- ipv4.dns-priority: 0 ipv4.addresses: 192.168.1.203/24 ipv4.gateway: 192.168.1.1 ipv4.routes: -- ipv4.route-metric: -1 ipv4.route-table: 0 (unspec) ipv4.routing-rules: -- ipv4.replace-local-rule: -1 (default) ipv4.ignore-auto-routes: no ipv4.ignore-auto-dns: no ipv4.dhcp-client-id: -- ipv4.dhcp-iaid: -- ipv4.dhcp-timeout: 0 (default) ipv4.dhcp-send-hostname: yes ipv4.dhcp-hostname: -- ipv4.dhcp-fqdn: -- ipv4.dhcp-hostname-flags: 0x0 (none) ipv4.never-default: no ipv4.may-fail: yes ipv4.required-timeout: -1 (default) ipv4.dad-timeout: -1 (default) ipv4.dhcp-vendor-class-identifier: -- ipv4.link-local: 0 (default) ipv4.dhcp-reject-servers: -- ipv4.auto-route-ext-gw: -1 (default) |
nmcli con up コマンドを実行して、設定値を反映させます。
|
1 2 3 4 5 6 7 8 9 10 |
pi@homepi2:~ $ sudo nmcli con up "Wired connection 1" Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/10) pi@homepi2:~ $ ip a show eth0 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether b8:27:eb:fa:b2:c2 brd ff:ff:ff:ff:ff:ff inet 192.168.1.203/24 brd 192.168.1.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever inet6 fe80::2974:48a4:f55c:94ff/64 scope link noprefixroute valid_lft forever preferred_lft forever |
IPv6無効化手法
仕上げはいつもIPv6の無効化。多くのLinuxでは /etc/sysctl.conf にIPv6を無効にする設定を追記して対処していました。
|
1 2 3 |
net.ipv6.conf.default.disable_ipv6=1 net.ipv6.conf.all.disable_ipv6=1 net.ipv6.conf.lo.disable_ipv6 = 1 |
|
1 2 3 |
pi@homepi2:~ $ sudo sysctl -p net.ipv6.conf.all.disable_ipv6 = 1 net.ipv6.conf.all.disable_ipv6 = 1 |
これで恒久的にIPv6が無効化されるはずも、今回はシステム再起動後また元通り。 sysctl.conf を読まない悪寒。
そこでこれも nmcli でインターフェイス毎にIPv6を無効化してみます。
|
1 2 3 4 5 |
pi@homepi2:~ $ sudo nmcli con mod preconfigured ipv6.method "disabled" pi@homepi2:~ $ sudo nmcli connection up preconfigured pi@homepi2:~ $ sudo nmcli con mod "Wired connection 1" ipv6.method "disabled" pi@homepi2:~ $ sudo nmcli connection up "Wired connection 1" |
念のため再起動してからIPv6アドレスの有無を確認すると、小さなことですが lookback インターフェイスに残存。 lo は nmcli で触れないと怒られます。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
pi@homepi2:~ $ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether b8:27:eb:fa:b2:c2 brd ff:ff:ff:ff:ff:ff inet 192.168.1.203/24 brd 192.168.1.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever 3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether b8:27:eb:af:e7:97 brd ff:ff:ff:ff:ff:ff inet 10.200.200.4/24 brd 10.200.200.255 scope global dynamic noprefixroute wlan0 valid_lft 85527sec preferred_lft 85527sec pi@homepi2:~ $ sudo nmcli con mod lo ipv6.method "disabled" Error: Failed to modify connection 'lo': ipv6.method: ipv6 method "disabled" is not supported for loopback |
最終的には、 bootfs ブートパーティションの cmdline.txt に、次のおまじないを追記することで、IPv6はいなくなりました。
|
1 |
ipv6.disable=1 |
|
1 2 3 4 5 6 7 8 9 10 11 12 13 |
pi@homepi2:~ $ ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lo valid_lft forever preferred_lft forever 2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether b8:27:eb:fa:b2:c2 brd ff:ff:ff:ff:ff:ff inet 192.168.1.203/24 brd 192.168.1.255 scope global noprefixroute eth0 valid_lft forever preferred_lft forever 3: wlan0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000 link/ether b8:27:eb:af:e7:97 brd ff:ff:ff:ff:ff:ff inet 10.200.200.4/24 brd 10.200.200.255 scope global dynamic noprefixroute wlan0 valid_lft 84135sec preferred_lft 84135sec |





