ROCK Pi Sを設定してみる (NetworkManagerでWi-Fi設定が主)

ROCK Pi S

ROCK Pi Sを購入したので、「armbianで遊ぶぞー」と思っていたのだが、armbianのサイトからダウンロードできるOSイメージは「minimal legacy kernel 4.4.y」と書かれていて、実際にダウンロードできたファイルも Armbian_21.02.1_Rockpi-s_buster_legacy_4.4.247_minimal.img (Debianの場合)だった。レガシーな4.4系しか提供されていないらしい。
しかし、どうせならメインラインである5.10系を使いたい。
そこで、何も考えずにarmbianのビルドを行ったが、ビルドそのものは成功するものの、完成したイメージをmicroSDカードに焼いたところ起動しなかった。これはフルイメージでもミニマルイメージでも同じ。確認のためにレガシーをビルドしたところ、これはフルイメージでもミニマルイメージでも正常に起動した。
どうもメインラインだと起動しないらしい。うちの環境でビルドした場合だけそうなのかと思って調べてみたら見つけた。
Rockpi S doesn't boot mainline kernel
書いてある内容から21.05で対応したって意味かな?と思ったけど、その21.05でビルドして起動しないので未完了っぽい。残念。

2021年9月13日追記:
その後、対応時期とバージョンは不明ながらメインラインも利用できるようになっています。ただし、有線LANはデフォルト無効になっててGPIOでUART接続しないと何もできないやつ。一応、 /boot/armbian_first_run.txt.template があって、編集して/boot/armbian_first_run.txtにするかリネームするかすると本来は機能する筈がそれが効かない。ダメじゃん。なお、 /boot/armbian_first_run.txt は機能はしないけど初回のシステム起動が成功すると /boot/armbian_first_run.txt は削除される。
ここは、昔ながらのやり方で /etc/network/interfaces に allow-hotplug eth0iface eth0 inet dhcp の2行を書いてやる。
ちなみに /boot/armbian_first_run.txt や /etc/network/interfaces の編集というのはarmbianのイメージを書き込んだmicroSDカードをPCのメモリカードスロット(PCになければUSBメモリカードアダプタ)でPCに接続してマウントして編集。WindowsでArmbianをマウントやファイル編集できるかは不明。Linuxでやる場合はマウントは良いとしてファイル編集は管理者権限が要る。LinuxのCLIでファイル操作する場合はUbuntu系だと /media/ログイン中のユーザー名/hogehoge/etc/network/interfaces のようなPathになると思われる。間違って操作中のPCの /etc/network/interfaces を編集しないようご注意ください。
で、編集したらアンマウントしてからROCK Pi Sに挿してROCK Pi Sを起動する。
DHCPサーバの要るネットワークでROCK Pi Sを起動すると有線LANが生きるので arp -a などで生えたIPアドレスを調べてRock Pi Sにssh接続する。
ssh root@生えたIPアドレス で接続し、パスワードが 1234 (armbainの初回ログインはこれ)
で、ログインして管理者パスワードの変更と最初のユーザー作成が終わったら、そこで改めてネットワークの設定を行ってください。普通のDHCPクライアントで良いということならそのままでも可。

RockPi SでArmbianのメインライン系のBuster(debian系)イメージをArmbianのサイトからダウンロードして使用する場合、無線LANインターフェイスのwlan0が無くて使えないというのを体験しました。2021年9月上旬にArmbian.comで提供されていたArmbian Buster edge 5.13.12ミニマルイメージを使うとそうなりました。
cfg80211カーネルモジュールが正常でない?。これはapt (apt updateとapt upgrade) でシステムを最新状態に更新すると直りました。5.13.12から5.14.2に更新されたら正常になりました。つまり有線LAN環境でシステム更新が必要です。まぁ日本ではRockPi Sで無線LANを使わない(使えない)のでどうでも良い話ですが。

ネットワーク

Armbianのレガシーイメージの場合、有線LANは特に何もせずにLANケーブルで繋げばIPv6はSLAACで、IPv4はDHCPで自動的につながる。NetworkManagerがデフォルトなのでそれ用の設定を必要に応じて追加で。(有線LANについてはこれだけ)

以下、無線LANについて。ただし、この記事は「ROCK Pi Sを設定」と題しておきながらROCK Pi Sでは確認していないのでスミマセン

$ dmesg
中略
[   10.645051] [WLAN_RFKILL]: get_wifi_addr_vendor: rk_vendor_read wifi mac address failed (-1)
後略

MACアドレスが読み取れないという警告。元々固定されたユニークなMACアドレスが無いタイプかしら?(次へ)

任意のMACアドレスをarmbianEnv.txtで指定する。

/boot/armbianEnv.txt (1行追加 既存のextraargs行があればその次の行にでも)
extraargs=rtl8723ds.rtw_initmac="00:00:00:00:00:00"

rtl8723dsの部分はモジュール名で変わることがある。lsmodでモジュール名を確認。8723dsって表示されてたら extraargs=8723ds.rtw_initmac="00:00:00:00:00:00" みたいな。
もちろん、MACアドレスは00:00:00:00:00:00ではなく何か適切なのを。
適切がわからなければ、例えばそのときのMACアドレスを ip addr などで調べてwlan0のether値を拝借するとか。

これで、次回以降は起動時にMACアドレスが固定で付くので先のエラーは出なくなる。

/etc/NetworkManager/conf.d/10-disable-wifi-random-mac-address.conf (新規)
[connection]
wifi.mac-address-randomization=0

[device]
wifi.scan-rand-mac-address=no

既に同内容のファイルがあるなら不要

一部のボードではWi-Fiの設定(接続プロファイルの作成)をarmbian-configで行うと、そのときはWi-Fiに接続できるがシステムを再起動すると接続されない状態になってしまう筈。設定が足りないなどのバグだと思うのでそのうちに修正されるかもだけど。(armbian-configで接続プロファイルを作る場合も何か特別なことをするわけではなく以下で行うのと同じ設定ファイルを出力する)
とりあえず、armbian-configは信用しないので使わずにWi-Fiの接続プロファイルを作成する。

$ sudo nmcli device wifi connect AP-SSID password AP-PSK

AP-SSIDの部分を自宅のWi-FiルーターなどのSSIDと置換する。
AP-PSKの部分を自宅のWi-Fiルーターなどの所謂パスワードと置換する。

この nmcli device wifi connect・・ を使った「接続設定」は /etc/NetworkManager/system-connections 下の 接続先APのSSID +.nmconnection という名前のファイルに書き込まれる。

Wi-Fiの設定を/etc/network/interfacesに書くというのはやらない。これで設定を作るとnmcliコマンドで「接続」に対する設定ができないから。

登録した接続プロファイルでAPに手動で接続する場合
$ sudo nmcli connection up 接続先APのSSID
切断する場合は up の代わりに down。
登録したAPの接続プロファイルを削除する場合。
$ sudo nmcli connection delete id 削除するAPのSSID

Wi-Fiは、省電力モードが有効になっていると結構ウザい。Wi-Fiの省電力モードは無効化する。

$ nmcli -p connection show 接続先APのSSID
中略
802-11-wireless.powersave:              0 (default)
後略

上の例のように0であるなどとにかく2以外の値であったら省電力モードが有効である可能性が高い。
0は、デフォルト値ということだが、実際は何かわからない。
1は、無視ということだが意味不明。
2は、省電力モードがオフ。
3は、省電力モードがオン。

次のように変更する。
$ sudo nmcli connection modify 接続先APのSSID 802-11-wireless.powersave 2
$ nmcli -p connection show 接続先APのSSID
中略
802-11-wireless.powersave:              2 (disable)
後略
こうなればOK。
この nmcli connection modify を使った設定変更は /etc/NetworkManager/system-connections 下の 接続先APのSSID +.nmconnection という名前のファイルに書き込まれる。

例えば、armbianの一部のボードでは?先のAPの登録方法だと通信に使用するネットワークインターフェースがwlan0ではなくp2p0にWi-Fi接続ができることがある。どちらが良いのかは知らないがwlan0にしたいなど使用するインターフェースを変更する場合。

$ sudo nmcli connection modify 接続先APのSSID connection.interface-name wlan0
上の例ではwlan0というのが変更後に使用されるインターフェース名。

AP側の2.4GHzと5GHzでSSIDが違うなら利用したい方のSSIDに接続すれば良いが、2.4GHzと5GHzで同じSSIDになっている場合、上記のやり方だけだと使って欲しくない方が使われてたりトラブルの元かも。そこで使って欲しい周波数帯を指定。または利用するチャンネルを指定。両方指定する場合は矛盾がないように。

$ sudo nmcli connection modify 接続先APのSSID 802-11-wireless.band a #5GHz帯を使いたい場合
$ sudo nmcli connection modify 接続先APのSSID 802-11-wireless.band bg #2.4GHz帯を使いたい場合
または
$ sudo nmcli connection modify 接続先APのSSID 802-11-wireless.channel チャンネル番号

ここまではDHCPの場合。
IPアドレスを固定というかマニュアルで設定したいこともある。IPアドレスの指定メソッドをマニュアルにし、IPアドレスとサブネットマスクを指定する。

$ sudo nmcli connection modify 接続先APのSSID ipv4.method manual ipv4.addresses 192.168.0.10/24

ここでは設定するインターフェイス(Wi-FiならSSID)のIPアドレスを192.168.0.10、サブネットマスクを/24 (255.255.255.0)とする。

DHCPならゲートウエイとネームサーバも自動設定だが、マニュアルではこれらも指定しなければならない。

$ sudo nmcli connection modify 接続先APのSSID ipv4.gateway 192.168.0.1  #デフォルトゲートウェイ
$ sudo nmcli connection modify 接続先APのSSID ipv4.dns  192.168.0.1   #ネームサーバ1つめ
$ sudo nmcli connection modify 接続先APのSSID +ipv4.dns 8.8.8.8    #ネームサーバ2つめ (追加)
$ sudo nmcli connection modify 接続先APのSSID +ipv4.dns 8.8.4.4    #ネームサーバ3つめ (追加)

#上の3つのネームサーバをまとめて指定するなら⬇のようにする
$ nmcli connection modify 接続先APのSSID ipv4.dns 192.168.0.1 +ipv4.dns 8.8.8.8 +ipv4.dns 8.8.4.4

この例ではゲートウェイのIPアドレスを192.168.0.1とする。ネームサーバは192.168.0.1と追加でGoogleのDNS 8.8.8.8と8.8.4.4を指定する。

nmcliコマンドで設定すると即時反映で設定もファイルに書き出されるので次回以降も指定した内容が使われる。ラクだけど何か気に入らない。

一部のSBCではWi-FiインターフェイスのMACアドレスが固定でないらしい。MACアドレスが変わると上の設定だけではWi-Fi接続に失敗する。MACアドレスが変わるため、設定に書き込まれているMACアドレスのインターフェイスが無くで失敗するみたい。

$ sudo nmcli connection modify 接続先APのSSID 802-11-wireless.cloned-mac-address AA:BB:CC:DD:EE:FF     AA:BB:CC:DD:EE:FFの部分を(以後使い続ける)好みのMACアドレスにする

$ sudo nmcli connection modify 接続先APのSSID -802-11-wireless.mac-address ""     元のMACアドレスを無効化

ついでに、指定のWi-Fi APとの通信の接続開始と接続終了

$ sudo nmcli connection up 接続先APのSSID      設定済みのAPへの接続を開始

$ sudo nmcli connection down 接続先APのSSID     設定済み且つ接続中のAPとの通信を終了

システム起動時など自動的にWi-Fi APとの接続を開始することをしっかり指定する。この指定をしなくても自動接続してくれるかもだけど、アヤフヤじゃなくて自動接続して欲しいということを指示。

$ sudo nmcli connection modify 接続先APのSSID connection.autoconnect yes     自動接続オンを指示

逆に自動接続させたくない場合は最後の yes を no に変える。