ミルク色の記録

やったこと、やってみたこと

Raspbianのネットワーク管理をNetwork-Managerにした

Raspbianのネットワーク設定周り、大昔は/etc/network/interfacesだったのが、 いつの頃からか/etc/dhcpcd.confで設定するようになって、固定IPにするときとか /etc/dhcpcd.confを編集している。

加えて、Wifiを設定するのであれば/etc/wpa_supplicant/wpa_supplicant.confを編集し、 USBドングルを使ってモデムで繋ぐならばwvdialやpppconfigを...と言った感じで、 とにかく設定が散らばっていてめんどくさい。

以前から普通のデスクトップLinuxみたいにNetwork-Managerでやってしまったほうが楽なのでは... と思っていたけど、バージョン的にnmcli(Network-ManagerのCUIクライアント)でできることが少なくて見送っていた。

去年からRaspbianのBusterを使うようになり、 「そう言えばnmcliのバージョンってどうなったんだろ?」と思って試しに入れてみたら、 結構バージョン上がっていて色々とできるようになっていた。 この際なのでネットワークまわりをNetwork-Manager使うようにしてみた。

環境設定

使ったraspbian OSのバージョンはRaspbian Buster Liteの2020-02-13バージョン。

aptでnetwork-managerをインストールして、dhcpcdは止めて再起動する。

$ sudo apt-get update
$ sudo apt-get install -y network-manager
$ sudo systemctl disable dhcpcd.service
$ sudo reboot

これで準備は完了。

Wifiや有線の設定

まずはnmcli connectionで接続設定を一覧取得する。

$ sudo nmcli connection
NAME                UUID                                  TYPE      DEVICE
Wired connection 1  00000000-0000-0000-0000-000000000000  ethernet  eth0

それからnmcli deviceでネットワークインターフェイスの状態を取得する。

$ sudo nmcli device
DEVICE  TYPE      STATE         CONNECTION
eth0    ethernet  connected     Wired connection 1
wlan0   wifi      disconnected  --
lo      loopback  unmanaged     --

とりあえずWifi繋ぐためにnmcli device wifiWifiネットワークを探す(実際の値は????????????ではない)。

$ sudo nmcli device wifi
IN-USE  SSID             MODE   CHAN  RATE        SIGNAL  BARS  SECURITY
        ????????????  Infra  1     130 Mbit/s  89      ▂▄▆█  WPA1 WPA2
        ????????????  Infra  11    195 Mbit/s  70      ▂▄▆_  WPA1 WPA2
        ????????????  Infra  36    270 Mbit/s  57      ▂▄▆_  WPA1 WPA2
        ????????????  Infra  5     260 Mbit/s  54      ▂▄__  WPA2
        ????????????  Infra  11    195 Mbit/s  49      ▂▄__  WPA2
        ????????????  Infra  11    195 Mbit/s  49      ▂▄__  WPA2
        ????????????  Infra  108   405 Mbit/s  44      ▂▄__  WPA1 WPA2
        ????????????  Infra  100   540 Mbit/s  40      ▂▄__  WPA2
        ????????????  Infra  6     54 Mbit/s   39      ▂▄__  WEP
        ????????????  Infra  6     270 Mbit/s  37      ▂▄__  WPA2
        ????????????  Infra  6     135 Mbit/s  25      ▂___  WPA2
        ????????????  Infra  116   405 Mbit/s  25      ▂___  WPA2
        ????????????  Infra  3     130 Mbit/s  22      ▂___  WPA1 WPA2
        ????????????  Infra  52    405 Mbit/s  22      ▂___  WPA2

nmcli device wifi connectWifiを設定する。

$ nmcli device wifi connect <SSID> password <password>
Device 'wlan0' successfully activated with '00000000-0000-0000-0000-000000000000'.

これでWifiは繋がる。

次にnmcli connection addで有線接続を固定IPにする。

$ sudo nmcli connection add con-name Home \
type ethernet \
ifname eth0 \
ipv4.addresses 192.168.1.99/24 \
ipv4.gateway 192.168.1.1 \
ipv4.dns 8.8.8.8 ipv4.method manual
Connection 'Home' (00000000-0000-0000-0000-000000000000) successfully added.

作った接続を使うためにnmcli connection downでデフォルトの有線接続を止める(sshでログイン中の場合、切断されるので注意)。

$ sudo nmcli connection down Wired\ connection\ 1

改めて接続設定を確認する。

$ sudo nmcli connection 
NAME                UUID                                  TYPE      DEVICE 
??????????????      00000000-0000-0000-0000-000000000000  wifi      wlan0  
Home                00000000-0000-0000-0000-000000000000  ethernet  eth0   
Wired connection 1  00000000-0000-0000-0000-000000000000  ethernet  --

作った接続を使うので、nmcli connection deleteでデフォルトの有線接続は削除する。

$ sudo nmcli connection delete Wired\ connection\ 1 
Connection 'Wired connection 1' (00000000-0000-0000-0000-000000000000) successfully deleted.

コマンドで操作した設定ファイルは/etc/NetworkManager/system-connections配下に保存される。 設定ファイルを手で触ってもいいけど、接続の追加、編集、削除が全部コマンドでできて、かなり楽。

USBドングルでアクセスポイントに繋ぐ

wvdialをやめるために、USBドングルの設定も試す。手持ちのL-02Cを使った。 そういえばいつの間にかRaspbianにusb_modeswitchって標準搭載されてる気がする。 L-02Cはudevのルール書かなくても自動でスイッチされてモデムとして認識される。

USBポートに挿してネットワークインターフェイスの状態を見る。

$ sudo nmcli device 
DEVICE   TYPE      STATE         CONNECTION     
eth0     ethernet  connected     Home           
wlan0    wifi      connected     ???????????? 
ttyUSB2  gsm       disconnected  --             
lo       loopback  unmanaged     --

iijmioのアクセスポイントで設定してみる。

$ sudo nmcli connection add autoconnect true \
con-name iijmio \
type gsm \
apn iijmio.jp \
user mio@iij \
password iij \
gsm.number *99***1# \
ppp.refuse-eap true \
ppp.refuse-mschap true \
ppp.refuse-mschapv2 true \
ifname "*"
Connection 'iijmio' (00000000-0000-0000-0000-000000000000) successfully added.

設定完了してPPPが繋がると接続状態は次のようになる。

$ sudo nmcli connection 
NAME            UUID                                  TYPE      DEVICE  
Buffalo-G-5209  00000000-0000-0000-0000-000000000000  wifi      wlan0   
Home            00000000-0000-0000-0000-000000000000  ethernet  eth0    
iijmio          00000000-0000-0000-0000-000000000000  gsm       ttyUSB2

PPP接続は時々ちゃんと繋がらないことがあり、syslogみると次みたいなエラーになっている。

Feb 29 17:13:20 raspberrypi NetworkManager[343]: <warn>  [1582964000.7050] modem-broadband[ttyUSB2]: failed to connect modem: 34

こういう場合はModemManagerを再起動して、それからコネクションを開始する。

$ sudo systemctl restart ModemManager.service
$ sudo nmcli connection up iijmio 
Connection successfully activated (D-Bus active path: /org/freedesktop/NetworkManager/ActiveConnection/10)

この辺りのワークアラウンドはwvdial使っていても遭遇したことがあって、プロセス監視してだめだなと検知したら落としてもう一度みたいにやってたのに近いかも。

とりあえず設定を一本化できるのでやはり楽。

Wifiアクセスポイント化

Raspberry PI自身をWifiアクセスポイント化して接続させるやつ。 前回はhostapdでやったけど、これもNetwork-Managerだけでできる。

wifiタイプの接続を作るときにモードをapにすればいい。

$ sudo nmcli connection add con-name RPi-AP \
type wifi \
ifname wlan0 \
wifi.ssid RPi-AP \
wifi.mode ap \
wifi-sec.psk raspberry \
ipv4.method manual \
ipv4.addresses 192.168.100.1/24 \
ipv4.gateway 192.168.100.1 \
wifi-sec.key-mgmt wpa-psk
Connection 'RPi-AP' (00000000-0000-0000-0000-000000000000) successfully added.

ログの調整

デフォルトだとsyslogにinfoレベルでログが出過ぎるので、/etc/NetworkManager/NetworkManager.confにログレベルを設定して調整する。

[main]
plugins=ifupdown,keyfile

[ifupdown]
managed=false

[logging]
level=WARN

感想

設定を一本化できて楽。しばらく動かしてみたが、dhcpcdをやめて駄目になった部分もみられない。 もう標準でNetwork-Managerでいいんじゃないかな...という印象。

ついでにプログラムから設定変更できるようにしたいのでpython用のライブラリ作った。

github.com

とりあえず必要最低限程度に実装。この前やったWifi設定のをもっといい感じにしてみたい。