モニターとキーボードを使わずにラズパイ(bullseye)にNetworkManagerを導入する

## この記事について  

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  
```sh: 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  
```sh: 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を取りたい場合は以下です。

```sh: wlan0_up.sh
#!/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接続、以下の操作をします。  

```sh
sudo apt update
sudo apt -y upgrade
sudo apt install -y postfix
```

<br>

[preset_nm.sh](https://qiita.com/Saito5656/items/319ad9825c2217e02c60#preset_nmsh)と[wlan0_up.sh](https://qiita.com/Saito5656/items/319ad9825c2217e02c60#wlan0_upsh)をラズパイのuser directoryに配置します。  

<br/>  

<img width= 550 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/85a3584d-6172-8a17-205e-6a4a0114cda8.png>

実行権限をつけます。  

```sh
sudo chmod +x *.sh
```

再起動後にwlan0_up.shを実行するためにcronの設定をします。  

```sh:
crontab -e
```
> @reboot sh ~/wlan0_up.sh  

preset_nm.shを実行してNetworkManagerを有効化、再起動します。

```sh
./preset_nm.sh
```

## 確認  

再起動時にwlan0_up.shが実行されてdhcpcdからNetworkManagerによる制御に切り替わっていることを確認します。  

```sh
nmcli c
```

<img width= 550 src = https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/565396/47974a49-f0ee-36f9-e280-385ad2dfe544.png>


wlan0_up.shで設定した接続設定(w0-1)の有効化が確認できました。  
NetworkManagerへの切り替えが確認できたのでwlan0_up.shの起動時実行を解除します。  

```sh
crontab -r
```

これで検証環境を作る時などに使えるテンプレが出来ました。

## 参考文献  

* [ラズパイ4とNetworkManagerのWi-Fiアクセスポイント化はコマンド1行](https://raspida.com/networkmanager-wifi-ap)  
* [https://qiita.com/hayat00/items/34d550de4ad38e455529](https://qiita.com/hayat00/items/34d550de4ad38e455529)