いろいろいじった結果、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の当該処理よりも先に実行されてしまうので問題を解決することが出来ません。なので、

  1. crontab上の@rebootでフラグを立てる
  2. フラグが立っていたら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以下だとタイミングが早すぎてうまくいかないことがあったからです。

関連記事

自作PCにubuntuでdeep learning用の環境とかを整える

1755 MHz OCのRTX 2080 TiタワーPC(32GBメモリ)を28万円で作った話

Razer Bladeのバッテリーをaliexpressで買って交換した

blenderでオブジェクトのキーフレームを途中からごっそり入れ替える

MiSTEL BAROCCO MD650Lの持ち運びにはあのケースがぴったり

高層を拒否し、「ニュー オールドタウン」を選択したフランクフルトの市民参加型都市計画

コメント

コメントを返信する

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です