2015年9月2日水曜日

Raspberry Pi + kernel 4.1 / 4.4 / 4.9 / 4.14 系列で5GHz対応WifiドングルGW-450Dを動かした

本ページで目指すもの

(2018.6.16改訂)
Raspberry PiなどのLinuxボードをAndroid Bazaar and ConferenceやMaker Faireなどで展示する際、Wifiの混線を避けるために5GHz対応のWifiドングルPlanex製GW-450Dを使うことがよくありました。

そこで、本ページではRaspberry Piを5GHz帯のネットワークに接続することを目標にします。必要なものは下記のどれかの無線LAN USBアダプタです。
これらは、USBにさしただけでは認識されず、ドライバを別途インストールする必要があります。

ただし、2018年6月に日本で発売になったRaspberry Pi 3 Model B+では、基板上に実装されているネットワークデバイスを用いてデフォルトで5GHz帯のネットワークにつなぐことができるのですよね。

ですので、上記の無線LAN USBアダプタを使う理由はなくなりつつあるのですが、当面本ページメンテナンスは続けます。

解説は、下記の順で行います。
  1. Planex製GW-450Dのドライバのインストール
  2. I-O DATA製WN-AC433UKについての注意
  3. Buffalo製WI-U2-433DMのドライバのインストール
以前はカーネルの再構築が必要な方法で書いていましたが、カーネル再構築が不要な方法に改訂しました。


カーネルヘッダをインストール

まず、ドライバのインストールに必要なカーネルヘッダをインストールします。ターミナルで下記のコマンドを実行します。
$ sudo apt-get update
$ sudo apt-get install raspberrypi-kernel-headers
これが終わったら、インストールしたカーネルヘッダディレクトリを/usr/src/linuxとしてリンクを張ります。
$ cd /usr/src
$ sudo ln -s linux-headers-4.14.34-v7+ linux
ここで、「linux-headers-4.14.34-v7+」の部分は皆さんの手元の環境のディレクトリ名に読み替えて実行します。用いているのがPi 2およびPi 3らば末尾が「数字-v7+」のディレクトリを、 Pi 1やPi Zeroでは「数字+」のディレクトリを選ぶようにしてください。これらは自分の用いているカーネルのバージョン番号になっています。

自分が用いているカーネルのバージョンの調べ方も知っておきましょう。下記のコマンドを実行します。
$ uname -r
結果として、例えば「4.14.34-v7+」と表示されれば、「4.14系列」を用いていることになります。他には「4.9」、「4.4」、「4.1」などがあり得ると思います。 また、末尾に「-v7+」とつくのがPi 2およびPi 3です。Pi 1やPi Zeroでは末尾が「-v7+」ではなく「+」となっているはずです。
ここから、各Wifiデバイスのドライバーのインストールに入ります。

Planex製GW-450Dのドライバのインストール

http://www.planex.co.jp/support/download/gw-450d/driver_linux.shtml
より、gw-450d_driver_linux_v3002.zipをダウンロードし、/home/piに置いておきます。

そして、ドライバを下記のように展開します。
$ cd /usr/src
$ sudo su
# unzip /home/pi/gw-450d_driver_linux_v3002.zip
# cd gw-450d_driver_linux_v3002
# tar xf mt7610u_wifi_sta_v3002_dpo_20130916.tar.bz2
# cd mt7610u_wifi_sta_v3002_dpo_20130916
展開が終わったら、パッチをダウンロードして適用します。このとき、用いているカーネルが4.14系か、4.9~4.1系かで実行するコマンドが異なります。

まず、4.14系を用いている方は、次の2コマンドを実行してください。
# wget https://raw.githubusercontent.com/neuralassembly/raspi/master/gw-450d/gw-450d-rpi-kernel414.patch
# patch -p0 < gw-450d-rpi-kernel414.patch
まず、4.9~4.1系を用いている方は、次の2コマンドです。
# wget https://raw.githubusercontent.com/neuralassembly/raspi/master/gw-450d/gw-450d-rpi-kernel41.patch
# patch -p0 < gw-450d-rpi-kernel41.patch
このパッチ当てがkernel 4.1、4.4、4.9、4.14でGW-450Dを動かす上で重要です。

以上が終わったら、コンパイルを行います。
# make
コンパイルが終わったら、モジュールをインストールします。kernelのバージョン(「4.14.34-v7+」の部分)は自分の環境に応じて読み替えてください。
# cp -p os/linux/mt7650u_sta.ko /lib/modules/4.14.34-v7+/kernel/drivers/net/wireless
# depmod -a
次に、設定ファイルのコピーを行います。
# mkdir -p /etc/Wireless/RT2870STA
# cp RT2870STA.dat /etc/Wireless/RT2870STA/RT2870STA.dat
最後に、ネットワークの設定を記述します。1つ目の命令はテキストエディタleafpadで/etc/network/interfacesを開いていますが、もちろんここはお好みのテキストエディタを用いて構いません。
# leafpad /etc/network/interfaces
(末尾に以下を記述)
allow-hotplug ra0
auto ra0
iface ra0 inet manual
wpa-ssid "your-ssid"
wpa-psk "your-passwd"
以上が終わったら、Planex製GW-450Dをさし、Raspberry Pi を再起動します。

Planex製GW-450Dでネットワークにつながっていると思います。

なお、割り当てられるIPアドレスを固定したい場合、「Raspberry PiのIPアドレスを固定する | 「Raspberry Piで学ぶ電子工作」補足情報」で紹介した方法が使えますので必要な方はご参照ください。

I-O DATA製WN-AC433UKについての注意

次に、I-O DATA製WN-AC433UKについての注意を記します。上記のPlanex製GW-450D用のドライバをインストールすることで、この無線LAN USBアダプタも動作するようになります。筆者の場合、Raspberry Pi 3で動作を確認することができました。ただし、過去にRaspberry Pi 2で試したところ、下記のように非常に安定性が悪いことがありました。
  • 流せる電流の大きな電源と、高品質な電源ケーブルを用いないと動作しないことが多い
  • Raspberry Piの起動前にI-O DATA製WN-AC433UKを差しておいても、認識に失敗することがある
  • Raspberry Pi起動後にI-O DATA製WN-AC433UKを抜き差しすると、認識に成功するときとしないときとがある。
Pi 3で安定動作したので今となってはあまり気にしていませんが、似たような状況の方はご参考ください。

Buffalo製WI-U2-433DMのドライバのインストール

Buffalo製WI-U2-433DMについても動作を確認してみました。こちらについては、本ページのカーネルヘッダのインストールまでは共通で、ドライバのインストールからが異なります。

以下の作業は「Raspberry Pi 2でWiFiドングル BUFFALO WI-U2-433DMを使う」を参考にしました。

下記の手順で作業を進めます。
$ cd /usr/src
$ sudo su
# git clone https://github.com/gnab/rtl8812au.git
# cd rtl8812au
ここで、このディレクトリにあるMakefileを下記のように2箇所変更します。
...
CONFIG_PLATFORM_I386_PC = n
...
CONFIG_PLATFORM_ARM_RPI = y
すなわち、CONFIG_PLATFORM_I386_PCの値を「n」に、CONFIG_PLATFORM_ARM_RPIの値を「y」にするだけです。あとは下記のように作業を進めます。kernelのバージョン(「4.14.34-v7+」の部分)は各自読み替えてください。
# make
# cp 8812au.ko /lib/modules/4.14.34-v7+/kernel/drivers/net/wireless
# depmod -a
以上で、Buffalo製WI-U2-433DMを差すと認識されネットワークにつながります。まだあまり使っていませんが、結構安定しているように思えます。

Planex製GW-450Dと比較した場合、Raspberry Pi 2の場合は無線LANのインターフェイスとしてwlan0が使われるため、通常のWifi設定法がそのまま使えるのが良いですね。

なお、Raspbedrry Pi 3の場合、下記の点が厄介です。
  • オンボードのWifiデバイスとWI-U2-433DMに対してwlan0とwlan1のように同じデバイス名が使われ、さらにこの番号が変わることがある
  • wlan0とwlan1に対して、同じ設定ファイル (/etc/wpa_supplicant/wpa_supplicant.conf) が使われるので、2.4GHzのルーターに接続しようとすると、両方のデバイスがつながってしまう
この問題に対する最も簡単な対処法は、GUIのWifi設定アイコンから「Turn Off Wi-Fi」を選ぶことでしょうか。そうすると、Raspberry Pi 3の基板上のWifiデバイスのみ無効になり、WI-U2-433DMのみが有効となってネットワークに接続されます。

なお、Jessieでは、「wlan0とwlan1の名前を固定し、さらにwlan0とwlan1とに対し、別々の設定を割り当てる」というやや複雑な解決方法もありますので、以下でそれを解説します(Stretchでそれを行う方法は調査中です)。

設定ファイル /lib/udev/rules.d/75-persistent-net-generator.rules を管理者権限のテキストエディタで開き、下記の太字部を追加して保存します。さらにRaspberry Piを再起動します。
# device name whitelist
 KERNEL!="ath*|msh*|ra*|sta*|ctc*|lcs*|hsi*|wlan*", \
                                         GOTO="persistent_net_generator_end"
再起動が終わると、/etc/udev/rules.d/70-persistent-net.rules というファイルが生成されています。 これを管理者権限のテキストエディタで開くと、下記のようになっています。
# This file was automatically generated by the /lib/udev/write_net_rules
# program, run by the persistent-net-generator.rules rules file.
#
# You can modify it, as long as you keep each rule on a single
# line, and change only the value of the NAME= key.

# Unknown net device (/devices/platform/soc/3f300000.mmc/mmc_host/mmc1/mmc1:0001/mmc1:0001:1/net/wlan0) (brcmfmac)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan0"

# USB device 0x:0x (rtl8812au)
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:xx:xx:xx", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="wlan*", NAME="wlan1"
ATTR{address}の部分は人により異なるので伏字にしました。 「# Unknown net device」に対応するNAMEがwlan0、「# USB device 0x:0x (rtl8812au)」に対応するNAMEがwlan1となっていることがポイントで、前者がRaspberry Piのボード上のWifiデバイス、後者がWI-U2-433DMを指し、それぞれwlan0とwlan1に指定されています。この/etc/udev/rules.d/70-persistent-net.rules が存在することで、以後デバイスの名前が固定されます。wlan0とwlan1の名前を入れ替えたい場合は適切に編集して保存してください。

以上で、デバイス名の固定が完了しました。後は、二つのデバイスでネットワークの設定ファイルを分けるとよいでしょう。管理者権限のテキストエディタで /etc/network/interfaces を開きます。wlan0とwlan1とで同一の設定ファイル「/etc/wpa_supplicant/wpa_supplicant.conf」が指定されていることがわかります。この設定ファイルを二つのデバイスで別のものにするとか、あるいはボード上の無線LANデバイスwlan0についての設定3行をコメントアウトするなどが良いでしょう。
allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

allow-hotplug wlan1
iface wlan1 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf




「カラー図解 最新 Raspberry Piで学ぶ電子工作」、「実例で学ぶRaspberry Pi電子工作」、「Raspberry Piではじめる機械学習」を執筆しました。

5 件のコメント:

  1. 大変参考になりました。
    WN-AC433UKも元気に動きました(RPi3)
    3なので供給される電力も5V/2.5Aとなったので安定しているのかもしれません。

    もしご存知であれば、channelの固定化をご存知であればご教示いただけないでしょうか。ネットワーク解析勉強用のSnifferアプライアンス化したいと考えている次第です。

    返信削除
    返信
    1. 試したわけではありませんが、「恐らくこうではないか」
      という方法を記します。

      gw-450d_driver_linux_v3002.zipの中に含まれる
      README_STA_usbというテキストファイルの中に、
      設定ファイル
      /etc/Wireless/RT2870STA/RT2870STA.dat
      を用いた様々なパラメータの設定方法が書かれています。

      その中に
      「# 2.) set Channel to "0" for auto-select on Infrastructure mode」
      という行があります。これに基づき、
      /etc/Wireless/RT2870STA/RT2870STA.dat
      の中の
      Channel=0
      という行の数字を0以外に変更すれば良いのではないでしょうか。

      README_STA_usbというファイルには他にも様々なパラメータの説明があるようです。

      削除
    2. ご丁寧にありがとうございます。
      readme確認してみます。
      iwconfigだとリブート後にChannel「1」に戻ってしまい困っていた次第です。

      削除
  2. readme確認し、例えばchannel=36とすれば、reboot後にも36チャンネル固定できました。
    複数枚同じドングルを挿した場合に、それぞれがチャンネル固定できるのかは、もう一つのドングルを買ってから試してみたいと思います。m(_ _)m感謝

    ikeda

    返信削除
  3. 永らく試行錯誤してましたが、Rspbian Strech('18/6/14版)で無事インストールされました。jessieのときはプラネックス公式と他ページの方法を参考にインストールしましたが、カーネルヘッダを持ってくる方法は眼から鱗です。たいへん参考になりました。御礼申し上げます。

    返信削除