それマグで!

知識はカップより、マグでゆっくり頂きます。 takuya_1stのブログ

習慣に早くから配慮した者は、 おそらく人生の実りも大きい。

市販品のUSB-Wifi ドングルを使って5GHzのAPをつくる

USB-Wifi ドングルを使って5GHzのAPをつくる

USBのWifiドングルを使ってアクセス・ポイントを構成できないのかとずっと疑問に思っていた。色々と調べているとMediatekのチップでLinuxからAPになれることがわかった。

また、5Ghzでアクセス・ポイントを構成するには、一部のカーネル機能を使わないといけないので、OpenWRTやKaliのようなWifi制御を扱えるOSを選ぶ必要がある。とくに5Ghzは、航空無線とのバッティングがあるの細かい部分でややこしい。

今回選んだのは次のUSB Wifi である。NetGear, Inc. A6210が、5GHZのAPになれるし、11acでつながるし速度も十分にでるし、日本のAmazonで手軽に買える。2020年に購入し放置していた。その当時はx86のドライバしかWRTで提供がなかったのでアップデートを待っていた。

今回の構成は、Raspi-UbuntuにLXDでOpenWRTを起動し、USBドライブをパススルーする予定だった。

USBデバイスをパススルーしなくても、Raspi自体がNetGear, Inc. A6210のmt76x2u ドライバをロードしてくれたので、ネットワークデバイスとしてパススルーして試すことにした。

lxd の準備

sudo snap install lxd
sudo lxc init 
sudo lxc launch images:openwrt/22.03 wrt-01

wrt の準備

## ネットワーク疎通確認を兼ねてbashを入れる。
sudo lxc exec wrt-01 -- opkg update
sudo lxc exec wrt-01 -- opkg install bash 

ネットワークデバイスをパススルー

Raspi(LXDホスト)でwlan1として見えている A6210を、LXDゲスト(wrt)にwlan0として譲渡する。

lxc config device add wrt-01 wifi nic nictype=physical parent=wlan1 name=wlan0
lxc config device remove wrt-01 wifi  # 削除できることを確認。
lxc config device add wrt-01 wifi nic nictype=physical parent=wlan1 name=wlan0

ついでの作業用にeth0もMacVLANでパススルー

lxc config device add wrt-01 myvlan nic nictype=macvlan parent=eth0

作業用eth0 にDHCPからLANアドレスを割り当てておく

ip link set eth1 up
udhcpc -i eth1

wifi 関連のモジュールを入れる。

ネットワークメニューに config/wireless を出すために必要

sudo lxc exec wrt-01 -- opkg install wpad-wolfssl

lxdでストレージに余裕があるため、フルパッケージ版wpad-wolfsslを選んだ。

もしWRTだけでやるなら

LXDを経由せずに、WRTをベアメタルで使うのであれば、ドライバをインストールしないと動かないと思う。 適当にドライバを入れる。A6210はmt76x02なので、mt76関連を入れておけばいいはず。細かい一致を調べるのはまた今度。

opkg find *mt76* | cut -d ' ' -f 1  | xargs opkg install
opkg install wpad-wolfssl

今回は実験だけのつもりなので、適当に関連モジュールをインストールした。 正確にやるには、kmod-mt76x02-usb関連を入れておけばいいと思う。

OpenWRT の22.03 からサポートされている。以前はX86のDevにしかなかったのだが、いまはarmやmipsにも配布されている感謝しかない。

動作チェック

再起動をして、ネットワークデバイスがロードされる。

bash-5.2# iw dev
phy#1
        Interface wlan0
                ifindex 15
                wdev 0x100000001
                addr 9c:c9:eb:21:fa:53
                type managed
                txpower 18.00 dBm
                multicast TXQ:
                        qsz-byt qsz-pkt flows   drops   marks   overlmt hashcol tx-bytes        tx-packets
                        0       0       0       0       0       0       0       0               0

再起動を何度か繰り返したり、デバイスのパススルーを追加削除を何度か繰り返してたら認識した。LXD経由だとちょっと不安定。

LXDのホスト側でWifiバイスを完全に開放した状態で、再起動すると起動した。

lxd stop wrt-01

## 無線デバイスを解放
rfkill unblock all

lxd start wrt-01

メニューに出てきた

出てきた!

Wrt on LXD でもWirelessメニューを出せた。ちょっと感動した。時代は進歩した。ソフトウェアのサポートが充実している。

APとして設定して接続

iperf3で負荷を与えてみる。

iperf3 かけててたら XHCI が死んだ。

bash: /sbin/service: /bin/sh: bad interpreter: I/O error
bash-5.2#
exit
Error: Command not executable
takuya@raspi-ubuntu:~$ sudo ps
-bash: /usr/bin/sudo: Input/output error

io error でUSBまるごと死んだ。

これは、USBドライバが、Raspiまるごと死んだということだろう。

つかったRaspi4は、USBーHDDでusb3.0を使っていて、USBのWifiアダプタもUSB3.0でつないでいるので、バスパワー不足になったのだろうか。USB通信の通信量が多すぎたのだろうか、USB3.0がまるごとダウンしてしまった。SDカードでやれば動くかもね。USB−HDDのbtrfs が死んだ。USB3に指すと巻き込みで死ぬ。

usb2.0usb3.0で分けて試す。

2.0/3.0のポートで分けて試すことにした。LXDに渡したWifiドングルでも安定して動作する。

USB3.0のとき、5GHzのAPを使うと、450Mbps前後の速度が出たが、USB2.0であれば、同じく5GHzのAP設定でも、150Mbpsが限界だった。USB自体の速度限界までは使い切れないようだ。3.0だと不安定だったが2.0だと比較的安定した。LXDを経由して通信量やSSL関連でRaspi4には荷が重いのかもしれない。

SDカードなら動くかもしれない。

SDカードをつかってUSBを使わずにWifiドングルがUSB3.0を占拠すれば、もっと安定して動くかもしれない、そのうち試したい。

今回試したUSB-Wifi

NetGear, Inc. A6210

Linuxルータが5GHzでAPになるのは航空無線DSP関連があるので常用は憚られる。ちゃんと国の設定を行っていれば問題にはならないんだけど。。。

X86マシンであればPCI-EのデバイスでもっとかんたんにAP作れる。今回はRaspi4を前提にしたのでUSBで試したが、いまのWRTであれば問題なくAPを作れることがわかった。これさえあれば、次々とAPを購入したり、WRTファームを焼きかえなくてもいい。USBデバイスで5GHzのWifi-APを作れるとわかった。GNUの自由が手に入ることがわかった。

参考資料