2015年9月2日水曜日

Raspberry Pi + kernel 4.1 / 4.4 / 4.9 / 4.14 / 4.19系列で5GHz対応WifiドングルGW-450D/GW-450D2/Archer T1U/WI-U2-433DMを動かした

本ページで目指すもの

(注:本ページの内容はkernel 5.X 系では動作しません)

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 / GW-450D2 /tp-link製Archer T1U 用ドライバのインストール
  2. 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.19.50-v7+ linux
ここで、「linux-headers-4.19.50-v7+」の部分は皆さんの手元の環境のディレクトリ名に読み替えて実行します。用いているのがPi 2およびPi 3らば末尾が「数字-v7+」のディレクトリを、 Pi 1やPi Zeroでは「数字+」のディレクトリを選ぶようにしてください。これらは自分の用いているカーネルのバージョン番号になっています。

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

Planex製GW-450D / GW-450D2 /tp-link製Archer T1U 用ドライバのインストール

ここから解説するのは、GW-450D / GW-450D2 / Archer T1U 用ドライバのインストールの方法です。
まず、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.19系か、4.1~4.9系かで実行するコマンドが異なります。

まず、4.14~4.19系を用いている方は、次の2コマンドを実行してください。
# wget https://raw.githubusercontent.com/neuralassembly/raspi/master/gw-450d/gw-450d-rpi-kernel414.patch
# patch -p0 < gw-450d-rpi-kernel414.patch
4.1~4.9系を用いている方は、次の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、4.19でGW-450Dを動かす上で重要です。

以上が終わったら、コンパイルを行います。
# make
コンパイルが終わったら、モジュールをインストールします。kernelのバージョン(「4.19.50-v7+」の部分)は自分の環境に応じて読み替えてください。
# cp -p os/linux/mt7650u_sta.ko /lib/modules/4.19.50-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を開いていますが、もちろんここはお好みのテキストエディタを用いて構いません。
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。その場合のコマンドは「mousepad /etc/network/interfaces」です。
また、your-ssidの部分はお使いのWifiルーターのネットワーク名、your-passwdの部分はそのネットワークパスワードを記してください。
# leafpad /etc/network/interfaces
(末尾に以下を記述)
allow-hotplug ra0
auto ra0
iface ra0 inet manual
wpa-ssid "your-ssid"
wpa-psk "your-passwd"
以上が終わったら、GW-450D / GW-450D2 / Archer T1U のどれかをさし、Raspberry Pi を再起動します。

さしたネットワークデバイスでネットワークにつながっていると思います。Raspberry Pi 3のボード上のWifiデバイスを無効にしたい場合、デスクトップ右上のメニューから「Turn Off Wifi」を選択して下さい。

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

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

ここで、I-O DATA製WN-AC433UKについての注意を記します。上記の方法でドライバをインストールすることにより、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
kernel 4.19以降を用いている方はさらに以下の2命令を実行してください。
# wget https://raw.githubusercontent.com/neuralassembly/raspi/master/rtl8812-rpi-kernel419.patch
# patch -p0 < rtl8812-rpi-kernel419.patch
ここで、このディレクトリにあるMakefileを下記のように2箇所変更します。
...
CONFIG_PLATFORM_I386_PC = n
...
CONFIG_PLATFORM_ARM_RPI = y
すなわち、CONFIG_PLATFORM_I386_PCの値を「n」に、CONFIG_PLATFORM_ARM_RPIの値を「y」にするだけです。あとは下記のように作業を進めます。kernelのバージョン(「4.19.50-v7+」の部分)は各自読み替えてください。
# make
# cp 8812au.ko /lib/modules/4.19.50-v7+/kernel/drivers/net/wireless
# depmod -a
以上で、Buffalo製WI-U2-433DMを差すとネットワークインターフェースがwlan0かwlan1の状態で認識されます。このままでは、Raspberry Pi 3で用いる場合下記の問題があります。
  • オンボードのWifiデバイスとWI-U2-433DMに対してwlan0とwlan1のように同じデバイス名が使われ、さらにこの番号が変わることがある
これを解消し、オンボードのWifiデバイスをwlan0、WI-U2-433DMがwlan1と固定されるよう設定が必要となります。
以下では、Raspbianが「StretchまたはBuster」の場合とJessieの場合とにわけて解説しましょう。

Stretch / BusterでのWI-U2-433DMの設定

下記のコマンドにより、/etc/udev/rules.d/70-persistent-net.rules というファイルを新規に開きます。
$ sudo leafpad /etc/udev/rules.d/70-persistent-net.rules
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
$ sudo mousepad /etc/udev/rules.d/70-persistent-net.rules
leafpadはテキストエディタですので、お好みのものを用いて構いません。 この空のファイルに下記の内容を書き込みます。
# 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"
ここで、2箇所ある「xx:xx:xx:xx:xx:xx」の部分には、二つのネットワークデバイスのMACアドレスを記さねばなりません。

まず、オンボードのWifiデバイスのMACアドレスを調べるには、Raspberry PiからWI-U2-433DMを抜いた状態で下記のコマンドを実行します。
$ ifconfig 
wlan0またはwlan1のところに「ether xx:xx:xx:xx:xx:xx」という項目が見つかるでしょう。これがオンボードのWifiデバイスのMACアドレスです。 これを/etc/udev/rules.d/70-persistent-net.rules の一つ目の設定項目に記します。

同様に、WI-U2-433DMを差してからifconfigコマンドを実行します。wlan0またはwlan1のうち新たに追加された方のMACアドレスを/etc/udev/rules.d/70-persistent-net.rules の二つ目の設定項目に記します。

以上で、「オンボードのWifiデバイスがwlan0、WI-U2-433DMがwlan1」と固定されます。
次に、/etc/network/interfaces を管理者権限のテキストエディタで開きます。
$ sudo leafpad /etc/network/interfaces
なお、NOOBS 3.2.1以降ではテキストエディタとしてleafpadではなくmousepadを用います。
$ sudo mousepad /etc/network/interfaces
このファイルの末尾に、下記の内容を追加して保存します。
allow-hotplug wlan1
iface wlan1 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
これは、「オンボードのWifiデバイス(wlan0)と同じ設定ファイルをWI-U2-433DM(wlan1)でも用いる」という設定です。

以上の設定を行った後、デスクトップの右上のアイコンから「Turn Off Wifi」を選択し、オンボードのWifiデバイス(wlan0)だけを無効にします。 その状態でRaspberry Piを再起動すると、WI-U2-433DM(wlan1)で/etc/wpa_supplicant/wpa_supplicant.confの情報に基づいてWifi接続が行われます。 必要に応じてwpa_supplicant.confをテキストエディタで編集すると良いでしょう。

JessieでのWI-U2-433DMの設定

同様の内容をJessieで行う方法を記します。
設定ファイル /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 3のボード上のWifiデバイスを無効にしたい場合、デスクトップ右上のメニューから「Turn Off Wifi」を選択して下さい。USBデバイスのみが有効になるはずです。



「ラズパイ4対応 カラー図解 最新 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のときはプラネックス公式と他ページの方法を参考にインストールしましたが、カーネルヘッダを持ってくる方法は眼から鱗です。たいへん参考になりました。御礼申し上げます。

    返信削除