いろいろいじった結果、Orange Pi PC 2はArmbianを使えばかなりいろんなことが出来ることがわかりました。
ただ、1つ問題がありました。USB WiFiが不安定だったのです。今回はその対策を書きます。
これができれば、Raspberry Pi3 Bと同等スペックながら3分の1くらいの値段で、安定してWiFiが使えるボードになるのでかなり良いです!
問題
Orange Pi PC 2上のArmbianでUSB WiFiをいくつか試してみた結果、以下の問題がありました:
- ネットワークに接続できないWiFiアダプタがある
- IPアドレスが振られインターネットにもアクセスできるが、ネットワーク上の他のPCからのPingが通らない
- IPアドレスを固定にするとネットワークに参加できない
1つ目はもうネットワークチップとの相性が悪いのだろうということで無視します。問題は残り2つです。
必要な機能は、
- インターネットにアクセスできる
- ネットワーク上の他のPCからアクセスできる
だったので、2番目の対策を模索しました。結構たいへんでした。
着眼点
かなりの試行錯誤を経て、
- IPアドレスが振られても他のPCから見えないが、一度Orange Piからpingをすると、そのPCからはpingが通るようになる。
- しかし依然としてarpリクエストには応えない。
- USB WiFiのネットワークインターフェースにautoを指定し、networkingをrestartすると他のPCからも見えるようになる。
が分かりました。このことから、
- アダプタのドライバー上の一部のコマンドがNetworkManagerまたはnetworkingからうまく扱えず、boot時の処理に失敗する。
のでは?と思いました。(syslogを見るとNetworkManagerぽいです)
いずれにせよ起動後にnetworkをrestartすればおkなので、それをやります。
対策
interfaces
アダプタのコンフィグは以下の感じ (/etc/network/interfaces):
auto wlxXXX
iface wlxXXX inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
/etc/wpa_supplicant/wpa_supplicant.confには通常通りwpa_passphraseで生成したパスフレーズを書きます:
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="XXXX"
psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
起動後に数回だけ処理をする
まず、起動後に一度だけコマンドを実行する方法として、/etc/rc.localやcrontab上の@rebootがあります。しかしこれらは、NetworkManagerの当該処理よりも先に実行されてしまうので問題を解決することが出来ません。なので、
- crontab上の@rebootでフラグを立てる
- フラグが立っていたらnetworkingをrestartした後フラグを下げるスクリプトをcronで毎分実行
させることで、「Linuxの起動後に数回だけ実行されるコマンド」を実装しました。
crontab
rootのcrontabを以下のように設定します:
@reboot echo 3 > /home/username/network_flag.txt
*/1 * * * * /home/username/restart_networking.sh < /home/username/network_flag.txt
@rebootでnetwork_flag.txtに実行したい回数を書き込みます。
restart_networking.shはnetwork_flag.txtを標準入力として受け取り、1以上ならnetworkingをrestartして数字をデクリメントします。
restart_networking.sh:
#!/bin/sh
while read i ; do
if [ $i -gt 1 ]; then
/usr/sbin/service networking restart
echo $(( i-1 )) > /home/username/network_flag.txt
elif [ $i -eq 1 ]; then
/usr/sbin/service networking restart
echo 0 > /home/username/network_flag.txt
fi
done
繰り返し回数を3としたのは、2以下だとタイミングが早すぎてうまくいかないことがあったからです。
コメント