この記事について
2023.10.13からラズパイOSのbullseyeはLEGACY扱いになりましたが未だにbullseyeを使いたい場面があります。
bullseyeを使うがネットワークはNetworkManagerで制御したい場合、raspi-configでの切り替え後にモニターとキーボードが必要になるようです(2023.11.24著者確認の限り)。
そこでモニターとキーボード接続の手間を省くためのシェルスクリプトを作成しました。
環境・設定
Raspberry Pi: Raspberry Pi 4 Model B Rev 1.2
OS: Raspberry Pi OS Lite 64-bit (Debian GNU/Linux 11 (bullseye))
static ip public subnet: 192.168.1.100
static route / dns public subnet: 192.168.1.1
シェルスクリプト
NetworkManager有効化後に再起動して設定する必要があったのでスクリプトを2つに分けました。
dhcpcd/wpa_supplicant無効化とNetworkManager有効化
raspi-configでNetworkManagerを有効化した後にdhcpcdとwpa_supplicant.confの設定を無効化します。
preset_nm.sh
#!/bin/bash
#NM有効化
sudo raspi-config nonint do_netconf 2
#wpa_supplicant無効化
sudo systemctl stop wpa_supplicant
sudo systemctl disable wpa_supplicant
sudo rm /etc/wpa_supplicant/wpa_supplicant.conf
#dhcpcd無効化
sudo systemctl stop dhcpcd
sudo systemctl disable dhcpcd
sudo reboot
NetworkManagerの無線接続設定
作る環境に応じてCON_MANEからSTATIC_DNSまでを書き換えます。
自分の用途ではipv6は無効にします。
明示的に有線設定が必要な場合は書き足しますがここでは省略します。
wlan0_up.sh
#!/bin/bash
sleep 10
CON_NAME="w0-1"
SSID="MySSID"
PSK="MyPSK"
STATIC_IP="192.168.1.100/24"
STATIC_ROUTE="192.168.1.1"
STATIC_DNS="192.168.1.1"
sudo nmcli connection add con-name $CON_NAME \
type wifi \
ifname wlan0 \
connection.autoconnect yes \
wifi.mode infrastructure \
wifi.ssid $SSID \
802-11-wireless-security.auth-alg open \
802-11-wireless-security.key-mgmt wpa-psk \
802-11-wireless-security.psk $PSK \
ipv4.addresses $STATIC_IP \
ipv4.gateway $STATIC_ROUTE \
ipv4.method manual \
ipv4.dns $STATIC_DNS \
ipv4.never-default no \
ipv6.method disabled
sudo nmcli c up $CON_NAME
動的にipを取りたい場合は以下です。
#!/bin/bash
sleep 10
CON_NAME="w0-1"
SSID="MySSID"
PSK="MyPSK"
sudo nmcli connection add con-name $CON_NAME \
type wifi \
ifname wlan0 \
connection.autoconnect yes \
wifi.mode infrastructure \
wifi.ssid $SSID \
802-11-wireless-security.auth-alg open \
802-11-wireless-security.key-mgmt wpa-psk \
802-11-wireless-security.psk $PSK \
ipv4.method auto \
ipv4.never-default no \
ipv6.method disabled
sudo nmcli c up $CON_NAME
導入
ラズパイOSを書き込んだmicroSDカードでラズパイを立ち上げてssh接続、以下の操作をします。
sudo apt update
sudo apt -y upgrade
sudo apt install -y postfix
preset_nm.shとwlan0_up.shをラズパイのuser directoryに配置します。

実行権限をつけます。
sudo chmod +x *.sh
再起動後にwlan0_up.shを実行するためにcronの設定をします。
crontab -e
@reboot sh ~/wlan0_up.sh
preset_nm.shを実行してNetworkManagerを有効化、再起動します。
./preset_nm.sh
確認
再起動時にwlan0_up.shが実行されてdhcpcdからNetworkManagerによる制御に切り替わっていることを確認します。
nmcli c

wlan0_up.shで設定した接続設定(w0-1)の有効化が確認できました。
NetworkManagerへの切り替えが確認できたのでwlan0_up.shの起動時実行を解除します。
crontab -r
これで検証環境を作る時などに使えるテンプレが出来ました。