Edited at

Raspberry Pi 2でブートと同時にPLANEXのGW-450Dを自動的に起動させる

More than 3 years have passed since last update.


はじめに

Raspberry Pi 2+NOOBSでPlanexのGW-450D(802.11ac対応無線LANGW-450D)を使うを参考にGW-450Dのカーネルモジュールをビルドし、無事に無線LANが使用できるようになりました。

これで快適5GHzライフをenjoyする予定だったのですが...、


何故か私の環境では5GHzの802.11nなWiFiに自動接続するのに、起動後に一度ra0をdown/upしてあげなければいけなかったので、/etc/rc.localに次の内容を仕込んでいます。


私も同じ現象に遭遇...。ということで、/etc/interfacesを修正して問題を解消したのでメモします。

なお、元記事ではNOOBSを使用していますが、この記事ではRASPBIAN (2015-05-05リリース)を使用しましています。


現象の確認

修正する前に現象を確認します。


  • ブートする際ににra0へIPアドレスが割当てられない

  • しかし、wpa_cli reassociateするとIPアドレスが割り当てられる

実際にコマンドを実行して確認します。ブート直後のra0の状態は次のとおりです。

$ ip addr show ra0

3: ra0: <NO-CARRIER,BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state DORMANT qlen 1000
link/ether 00:22:cf:e8:bd:63 brd ff:ff:ff:ff:ff:ff

ra0にIPアドレスが割当てられていません。また、wpa_clira0の状態を確認するとDISCONNECTEDとなっています。

$ sudo wpa_cli status

Selected interface 'ra0'
wpa_state=DISCONNECTED
address=00:22:cf:e8:bd:63
uuid=910fdc4a-d4d6-5fe3-a5f4-c47bdd18260a

続いてwpa_cli reassociateを実行してIPアドレスが割り当てられるか確認します。

$ sudo wpa_cli reassociate

Selected interface 'ra0'
OK

すると

$ sudo wpa_cli status | grep ip_address

ip_address=192.168.1.112

IPアドレスが割当てられました。念のためipコマンドの実行結果も確認しておきます。

$ ip addr show ra0

3: ra0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:22:cf:e8:bd:63 brd ff:ff:ff:ff:ff:ff
inet 192.168.1.112/24 brd 192.168.1.255 scope global ra0
valid_lft forever preferred_lft forever

IPアドレスが割当てられているのが確認できました。


/etc/network/interfacesの修正

前置きが長くなりましたが、interfacesを修正しましょう。修正後のinterfacesの内容は次のとおりです。

auto lo

iface lo inet loopback

auto eth0
allow-hotplug eth0
iface eth0 inet dhcp

auto ra0
allow-hotplug ra0
iface ra0 inet manual
pre-up sh -c "sleep 10"
wpa-roam/etc/wpa_supplicant/ra0.conf
iface default inet dhcp

ra0の設定にpre-up sh -c "sleep 10"を追加しただけです。この設定をするに至った経緯は補足を御覧ください。

また、wpa_supplicant用の設定を/etc/wpa_supplicant/ra0.confに分離しました。元記事では、/etc/wpa_supplicant/wpa_supplicant.confを使用していますが、他のインターフェースの設定と混ざると紛らわしいので別のファイルに分離しました。

/etc/wpa_supplicant/ra0.confの作成方法は次のとおりです。SSIDPASSPHRASEは各々の環境に合わせて値を設定してください。

$ wpa_passphrase SSID PATHPHRASE | grep -v '#.*$' | sudo tee -a /etc/wpa_supplicant/ra0.conf

$ sudo chmod 0600 /etc/wpa_supplicant/ra0.conf

作成できたか確認します。

$ sudo cat /etc/wpa_supplicant/ra0.conf

network={
ssid=SSID
psk=6cfd9adbce6ad052a27d7cde26b307e068f90d09c52e894f827487ff033e62b8
}

上記のように表示されればOKです。


修正の適用

リブートして修正を適用させます。

$ sudo reboot

その後、Raspberry Piへログインできれば成功です。(IPアドレスは各自の環境に合わせて読み替えてください)

$ ssh pi@192.168.1.123

それでは、よい5GHzライフを!


補足

以降は補足です。


iface eth0 inet dhcpについて

私はeth0 (LANポート)とra0 (GW-450D)両方のインターフェースを使用したかったので、、iface eth0 inet dhcpと設定しました。

なお、iface eth0 inet manualと設定した場合、排他的にインターフェースの設定が行われます。(ra0が認識されない場合はeth0のみにIPアドレスが割当てられ、ra0が認識された場合はra0のみにIPアドレスが割り当てられます。)


IEEE 802.11nのローミング機能について

私はこの記事を書くまで知らなかったのですが、IEEE 802.11nではローミング機能がサポートされているのをご存知でしょうか?

ここで言うローミングとは、端末が移動していてもアクセスポイントをまたいで通信が継続される、というものです。Wikipediaによると、この機能はIEEE 802.11k/rで議論され、IEEE 802.11nでマージされたそうです。

参考


  1. IEEE 802.11k-2008 - Wikipedia, the free encyclopedia

  2. IEEE 802.11r-2008 - Wikipedia, the free encyclopedia

  3. IEEE 802.11n-2009 - Wikipedia, the free encyclopedia

なお、このローミング機能ですが正式名称が存在しない(?)ので、この記事内に限りWiFiローミングと呼ぶことにします。

ちなみに、GW-450DはIEEE802.11ac/n/a/g/bをサポートしているので、ルータ側がIEEE 802.11nに対応していればWiFiローミングが使用できます。


  1. カッ飛び!11ac|GW-450D 製品仕様|PLANEX


wpa-roamwpa-confの違いについて

/etc/network/interfacesでWireless Networkを設定する際にwpa-roamwpa-confを選択する必要があります。両者の違いは、WiFiローミングを使用するか否かの違いです。

ということで、先程設定したinterfacesは、WiFiローミングを使用する場合の設定となります。

auto ra0

allow-hotplug ra0
iface ra0 inet manual
pre-up sh -c "sleep 10"
wpa-roam/etc/wpa_supplicant/ra0.conf
iface default inet dhcp

一方、WiFiローミングを使用する必要がない、あるいはIEEE 802.11nにルータが対応していないためWiFiローミングが使用できない場合、次のように設定します。

auto ra0

allow-hotplug ra0
iface ra0 inet dhcp
wpa-conf /etc/wpa_supplicant/ra0.conf

さらに詳細が知りたい場合は、次のコマンドでドキュメントを参照してください。なお、WiFiローミングについては、3章のMode #2: Roaming Modeにて解説されています。

$ zcat /usr/share/doc/wpa_supplicant/README.Debian.gz


修正方法を発見するまでの顛末

以降は冒頭で述べた、ブートと同時にra0へIPアドレスが割当てられない問題について調査した際のメモです。


Expire BSS 0 due to age

/var/log/syslogに、気になるメッセージを発見。

ra0: BSS: Expire BSS 0 due to age

ra0: BSS: Remove id 0 BSSID dc:fb:02:44:3e:e5 SSID '***********'

どうやら、ra0にIPアドレスが割り当てられる前にタイムアウトしているようです。

ご近所に5GHz帯を使用しているアクセスポイントがないので、なぜIPアドレスの割当てに時間がかかるのかはふめいですが、expireされるまでの時間を調整すればIPアドレスが割当てられそうです。


WPA_BSS_EXPIRATION_PERIOD

早速、www.linuxfromscratch.org/blfs/view/svn/basicnet/wpa_supplicant.htmlからwpa_supplicantのソースコードをダウンロードして調査したところ、bss.cに次のような値が設定されていました。

/**

* WPA_BSS_EXPIRATION_PERIOD - Period of expiration run in seconds
*/
#define WPA_BSS_EXPIRATION_PERIOD 10

ということで、この値を20、30、...と書き換えてはビルドする、というのを試したのですが、ra0: BSS: Expire BSS 0 due to ageというのは解消されません。


sleep

途方に暮れていたところ、偶然次の書き込みを見つけました。


  1. How To_ set up wpa_supplicant roaming mode and automatically start at boot


if someone has the issue that the interface is not brought up on boot with this setup in combination with a wireless usb interface just add this line in /etc/network/interfaces:

pre-up sh -c "sleep 10"


ということで、 これを試したところ見事ブートと同時にra0へIPアドレスが割り当てられました。そして、/var/log/syslogからExpire due to ageのメッセージも消えました。

wpa_supplicant[1607]: ra0: WPA: Key negotiation completed with dc:fb:02:44:3e:e5 [PTK=CCMP GTK=CCMP]

wpa_supplicant[1607]: ra0: CTRL-EVENT-CONNECTED - Connection to dc:fb:02:44:3e:e5 completed [id=0 id_str=]
wpa_action: WPA_IFACE=ra0 WPA_ACTION=CONNECTED
wpa_action: WPA_ID=0 WPA_ID_STR= WPA_CTRL_DIR=/var/run/wpa_supplicant
wpa_action: ifup ra0=default
...
dhclient: DHCPREQUEST on ra0 to 255.255.255.255 port 67
dhclient: DHCPACK from 192.168.1.1
dhclient: bound to 192.168.1.112

以上、顛末でした。


おまけ

RASPBIANげんていですが、元記事で紹介されているドライバのビルド手順をinterfacesの修正も含めansibleでじどうかしてみました。