2017年1月24日火曜日

BUFFALO「WI-U2-433DHP」をUbuntu14.04で使えるようにする!


概要
最近、デスクトップPCで無線LANを使いたくなって、BUFFALO WI-U2-433DHPを買って接続してみたが動かない。
BUFFALOの公式サイトのドライバーはWindowsかMacしかない。
ま、これは買う前からわかってはいたが←
しかし、Ubuntuで動かすのにあんなに苦労するとはこの時は考えてもみなかった...

BUFFALOにはlinuxのドライバはないので、導入に苦労します。
PLANNEXの無線子機はlinuxに対応してるものが多いのでおすすめかも。
ちなみに、BUFFALOでもWLI-UC-GNMシリーズであればドライバー不要ですぐにlinuxで使えました。


実行環境
  • Ubuntu 14.04 (3.13.0-107-generic)
  • BUFFALO WI-U2-433DHP(2016年3月発売)
  • Realtek RTL8821AU

方法
調べた中でlinuxのドライバを入れる方法は2つ
  1. Windowsドライバをndiswrapeprでlinuxで使えるようにする
  2. 無線子機に内蔵されているチップを調べて、そのドライバをインストールする
私は、先に1.の方法で試しましたがndiswrapperが対応してないのか上手く動かすことができませんでした。
ということで、成功した2.の方法を紹介したいと思います。
この方法でやれば、とりあえずBUFFALOシリーズはほとんどイケるのではないかと思います。


1.チップを調べる



調べによると、無線子機にはチップが内蔵されており、そのチップに対応したドライバをインストールすればlinuxでも動くのだそう。
では、WI-U2-433DHPにはどんなチップが内蔵されているか調べましょう。
その調べ方なんですが、公式サイトにはチップ情報がないし、linuxの端末で調べるにもドライバがないのでわかりません。
ですので、Windows側でチップを確認します。ちなみに、linuxでは$lsusb -t などで調べることができます。
Windowsでデバイスマネージャからデバイスの詳細を見てみます。

すると、Realtek社のバージョンが1030.6.1201.2015であることがわかりました。
これをネットで調べてみると、RTL8821AUというチップを使っていることが判明!
似たチップに、RTL8812AU があり、間違えないようにしてください。(私はここで間違えて時間を食いました)

2.ドライバのインストール

ここからは、Ubuntuでやります。 RTL8812AUの方が多く使われているのか、githubではRTL8821AUのドライバのありかがよくわかりません。
たとえ、RTL8821AUに対応していると書いてあってもうまく動作しませんでした。
試行錯誤の末、見つけたのがこちらです。Realtek Wireless Driver for Linux
ほとんどはここのREADMEに書いてあるようにすればよいですが、WI-U2-433DHP用にすこし変更点もあります。
まずは、任意の場所にクローンします。

$ git clone https://github.com/paralin/rtl8821au.git
次に、rtl8821auフォルダの中のMakefileを以下のように2ヶ所変更します。
CONFIG_RTL8821A = n
↓
CONFIG_RTL8821A = y

CONFIG_PLATFORM_I386_PC = n
↓
CONFIG_PLATFORM_I386_PC = y


READMEでは次にmakeしてますが、もう一箇所変更するところがあります。 rtl8821au/os_dep/linux/usb_intf.cの305行目#ifdef CONFIG_RTL8821A〜326行目#end ifで囲まれた中にWI-U2-433DHPのlinuxでのデバイス情報を書き加えます。
...
   {USB_DEVICE(0x0E66, 0x0023),.driver_info = RTL8821}, /* HAWKING - Edimax */
   {USB_DEVICE(0x2019, 0xAB32),.driver_info = RTL8821}, /* Planex - GW-450S */
   {USB_DEVICE(0x0411, 0x029b),.driver_info = RTL8821}, /* Buffalo - WI-U2-433DHP */
#endif
...
WI-U2-433DHPで言えば上記のような記述になります。

このときの、USB_DEVICE(??????, ??????)のところは、無線子機をさした状態で、以下のコマンドより確認します。
$ lsusb
Bus 002 Device 002: ID 8087:8001 Intel Corp. 
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 8087:8009 Intel Corp. 
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 003 Device 003: ID 046d:c531 Logitech, Inc. C-U0007 [Unifying Receiver]
Bus 003 Device 008: ID 0411:029b BUFFALO INC. (formerly MelCo., Inc.) 
無線子機の情報は最下段であり、このIDがUSB_DEVICEになります。ここで念の為、無線子機はPCから外しましょう。


あとは、READMEと同じで、Makefileのあるフォルダで
$ make
make ARCH=x86_64 CROSS_COMPILE= -C
....
make[1]: ディレクトリ `/usr/src/linux-headers-3.13.0-107-generic' から出ます
$ sudo make install
install -p -m 644 8821au.ko .................
$ sudo modprobe 8821au
$ lsmod
...
8821au
...
とし、最後のコマンドで8821auが表示されていればオッケーです。 うまくインストールできなかった場合の対処法をいくつか後述します。 実際に無線子機を挿して確認してみましょう。
$ iwconfig
eth0      no wireless extensions.

lo        no wireless extensions.

wlan0     unassociated  Nickname:""
          Mode:Managed  Frequency=2.412 GHz  Access Point: Not-Associated   
          Sensitivity:0/0  
          Retry:off   RTS thr:off   Fragment thr:off
          Power Management:off
          Link Quality:0  Signal level:0  Noise level:0
          Rx invalid nwid:0  Rx invalid crypt:0  Rx invalid frag:0
          Tx excessive retries:0  Invalid misc:0   Missed beacon:0
右上のUbuntuのLAN接続設定を開いても、無線を拾っていることを確認できました! 5GHz対応ですが、よくわからないのでとりあえず2.4GHzで我慢しましょう(笑)

3.モジュールを自動でロード

さて、このままでは再起動するたびにmodoprobeしないといけないので コンピュータを起動した時に自動で8821auをロードするように設定します。
$ sudo emacs /etc/modules-load.d/8821au.conf
#8821auをロード
8821au

トラブルシューティング
  • makeでエラー
  • これにはいくつもの要因があります。たとえば、コンパイラのバージョンであったり、Ubuntuのカーネルとの相性の問題、 つまりMakefile上の記述が実行環境と異なるのです。この時は、頑張ってMakefileをいじるか、githubから他のインストーラをcloneしてmakeしてみる方法があります。
  • modprobeでエラー
  • $ sudo modprobe 8821au 
    modprobe: ERROR: could not insert '8821au': Device or resource busy
    
    このとき、8812auなど他のドライバが動いているためにmodprobeできてない可能性があります。主はドライバを入れるための試行錯誤の過程で8812auを入れていたためにこのエラーが出ました。
    $ sudo modprobe -r 8812au
    
    でアンロードすれば解決するかもしれません。モジュールの確認は$ lsmod です。
  • インストールできたが無線子機が反応しない
  • これは、ドライバを間違えた可能性があります。もう一度、チップの種類やMakefile、usb_intf.cの記述を確認しましょう。






6 件のコメント :

  1. この1ケ月、試行錯誤の連続で、Buffall WI-U2-433DHP は、Windows 10 専用にとまで諦めておりました。この記事を見つけて、この通りに操作し、make,install したところ、インターネットが繋がりました。有難うございます。感謝します。H29.11.9 ja1pxp

    返信削除
    返信
    1. ja1pxpさん
      コメントありがとうございます!
      こんな記事でもお役に立てて幸いです。
      今後ともよろしくお願い致します。

      削除
  2. Ubuntu18でコンパイルできない問題が有ったため、別のリポジトリからダウンロードし、
    後は本稿の通りにしたところ上手く行きました。
    参考:
    http://gaobin.hatenablog.com/entry/2018/02/18/144356
    https://github.com/zebulon2/rtl8812au/tree/v5.1.5
    尚、こちらのソースではBuffalo用設定はpull requestを投げてMergeして貰いましたのでパッチも不要です。

    返信削除
    返信
    1. コメントありがとうございます!
      もう技術系の環境から抜けてしまったこともあり、改善できていませんが
      このように皆さんによってより良くして頂いて大変うれしく思います。
      今後ともよろしくお願い致します。

      削除
  3. かわうそ様、貴重な情報ありがとうございます。

    当方、かわうそ様の情報などを参考に、CentOS 7.6でBUFFALO WI-U2-433DHPをセットアップしました。それなりに時間が掛かりましたので、他の人の参考までに、このコメント欄をお借りして、情報共有させてください。

    GitHubには、RTL8821AU用のドライバが複数あります。しかしCentOS 7.6標準のkernel 3.10ではビルドできなかったり、ビルドできても何故か(Wifiではなく)Ethernetとして認識されたり、上手くいきませんでした。

    結局、ELrepoを使って、長期サポート版(lt版)のうち最新バージョンのkernel 4.4.167にkernelをあげて解決しました。

    ここでの注意点は、kernel本体より先に、開発環境一式(kernel-lt-headers, kernel-lt-tools, kernel-lt-toolsなど)を先にyum swapで入れておくとよい、という点です。

    私はNVIDIAのデバイスドライバを使っており、これによってカーネル本体の更新の際、DKMSの仕組みを通じて、NVIDIAのドライバが自動的に再ビルドされました。先にカーネルだけ上げようとすると、ここでコケます。

    この点について言及せず、ネット上には、headers等を、kernel本体よりも後に入れる手順となっている解説があります。

    RTL8821用ドライバは、以下からcloneしました。

    https://github.com/zebulon2/rtl8812au.git

    ファイルに含まれるMakefileをみると、RTL8812AU, RTL8821AUのどちらも有効になっています。

    ビルドは、CentOS7の標準のGCC 4.8.5だと通りませんでした。そこで、以前インストールしておいた、GCC 7.3.0を使いました。ドライバのMakefileの冒頭で、次のような感じでGCC 7.3.0の場所を指定しました。

    CC=/path/to/gcc-7.3.0/bin/gcc

    あとはドライバ付属のdkms-install.shを起動すれば、上手くいきました。

    このときコマンドプロンプトから、dkmsを直接起動すると、dkms.confの記述がそのまま渡ってしまって、バージョン番号が#MODULE_VERSION#となってしまうので、注意が必要でした(というか、一度失敗しました)。

    最後に、私は水族館で、コツメカワウソと握手したことがあります。

    以上、ありがとうございました。

    返信削除
    返信
    1. とても詳しい解説ありがとうございます!
      日にちが経っても内容が濃くなる記事でうれしいです。

      握手いいですね。シーパラのかわうそはとてもかわいかったです。

      削除