ブログ

Armadillo-640:無線LAN USBドングルを使ってアクセスポイントを構築する

at_takuma.fukuda
2023年3月29日 15時31分

はじめに

Armadillo-640を無線LANのアクセスポイントとして使用するために、市販のUSBドングルを使う方法をご案内します。

Armadillo-640はWLANオプションモジュールを使用することでWLANのSTA(ステーション)/AP(アクセスポイント)それぞれとして使用することが出来ますが、下記のようなケースでは別途USBドングルを使用するのが良いかと思います。

  • 拡張インタフェースをそれ以外の機能のために使用したい場合
  • 5GHzのWLAN通信を使用したい場合

過去にも下記の記事で5GHz対応のUSBドングルを使用する方法をご紹介しておりますが、
Armadillo-640:USBドングルの5GHz対応無線LAN(WI-U2-433DHP、WI-U2-433DMS)を使う
この記事ではAPとして使用出来るUSBドングルをご紹介します。

使用したUSBドングル

この記事で動作を確認したUSBドングルとそのドングルを使用するために必要なデバイスドライバは下記の通りです。

概要

USBドングルのデバイスドライバを組み込み、hostapdとdnsmasqを使ってソフトウェアアクセスポイントを構築します。

手順説明

以下、具体的な手順を説明します。
動作を確認するだけであれば、パッケージのインストールや設定ファイルの変更等を直接Armadillo上で実行することでより簡略化可能ですが、製品を量産される際にはこの手順を参考にしてください。
以下の順序で行います。

  • カーネルコンフィギュレーションの変更
  • デバイスドライバのクロスビルド
  • ルートファイルシステムの構築
  • インストールディスク作成

カーネルのコンフィギュレーション変更・ビルド

USBドングルのデバイスドライバをカーネルモジュールとしてビルドして読み込ませるため、
Linuxカーネルのコンフィギュレーションを変更してEnable loadable module supportを有効にしておく必要があります。
*initramfs アーカイブへのシンボリックリンク作成やデフォルトコンフィギュレーションの反映をまだ行っていない場合は下記を参考に実施しておいてください。
10.2. Linuxカーネルをビルドする

 
[PC:~]# cd 「Linuxカーネルのソースコードディレクトリ」
[PC:~]# make ARCH=arm menuconfig
 
Kernel Configuration
 [*] Enable loadable module support

デバイスドライバのクロスビルド

USBドングルのデバイスドライバを、Armadillo-640で実行出来るようにクロスビルドします。

[ATDE ~]$ git clone https://github.com/puuuuh/rtl8814au.git
[ATDE ~]$ cd rtl8814au
対象のアーキテクチャをarm、クロスツールチェインにarm-linux-gnueabihf- を指定し、カーネルソースコードのファイルパスを指定しておきます
[ATDE ~]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf KSRC=[Linuxカーネルソースコードのファイルパス]
[ATDE ~]$ ls 8814au.ko
8814au.ko
[ATDE ~]$ git clone https://github.com/ivanovborislav/rtl8188eu.git
[ATDE ~]$ cd rtl8188eu
[ATDE ~]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf KSRC=[Linuxカーネルソースコードのファイルパス]
[ATDE ~]$ ls 8188eu.ko
8188eu.ko

ルートファイルシステムの構築

at-debian-builderを使ってルートファイルシステムを構築します。

モジュールインストール

カーネルモジュールをルートファイルシステムに配置します。

 
[ATDE ~]$ cd [Linuxカーネルのソースコードディレクトリ]
[ATDE ~]$ make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf INSTALL_MOD_PATH="[at-debian-builder]/a600_resources/resources/" modules_install
[ATDE ~]$ cd  [at-debian-builder]

カーネルモジュール配置

[ATDE ~]$ mkdir a600_resources/resources/lib/modules/[linuxカーネルバージョン]/extra
[ATDE ~]$ cp [カーネルモジュールファイル] a600_resources/resources/lib/modules/[linuxカーネルバージョン]/extra/

インストールパッケージ設定

packagesを編集してアクセスポイントとDHCPサーバとして必要なパッケージをインストールしておいてください。

[ATDE ~]$ vi [at-debian-builder]/a600_resources/resources/packages
末尾に以下を追加
wireless-tools
dnsmasq
hostapd

ネットワークインタフェース設定

/etc/network/interfacesファイルを設定します。

[ATDE ~]$ vi [at-debian-builder]/a600_resources/resources/interfaces
末尾に以下を追加
auto wlan0 up
iface wlan0 inet static

udevルールを設定

USBドングルのインターフェース名がwlan0となるようにudevルールを設定

[ATDE ~]$ mkdir [at-debian-builder]/a600_resources/etc
[ATDE ~]$ mkdir [at-debian-builder]/a600_resources/etc/udev
[ATDE ~]$ mkdir [at-debian-builder]/a600_resources/etc/udev/rules.d
[ATDE ~]$ vi [at-debian-builder]/a600_resources/etc/udev/rules.d/70-persistent-net.rules
 
SUBSYSTEM=="net",ACTION=="add",ATTRS{idVendor}=="056e", ATTRS{idProduct}=="4008",NAME="wlan0"
SUBSYSTEM=="net",ACTION=="add",ATTRS{idVendor}=="2357", ATTRS{idProduct}=="0106",NAME="wlan0"

hostapdのコンフィグファイル作成

hostapdのアクセスポイント設定ファイルを作成します。

[ATDE ~]$ mkdir [at-debian-builder]/a600_resources/etc/hostapd
[ATDE ~]$ vi [at-debian-builder]/a600_resources/etc/hostapd/hostapd.conf
任意の内容を設定してください。以下設定例です。
 
interface=wlan0
driver=nl80211
ssid=testssid
hw_mode=g
channel=10
ieee80211n=1
wpa=2
wpa_passphrase=testpassphrase
wpa_key_mgmt=WPA-PSK
rsn_pairwise=CCMP

システム起動時のスクリプト設定

システム起動時にアクセスポイントが起動するよう以下の通りに設定してます。

[ATDE ~]$ vi [at-debian-builder]/a600_resources/resources/rc.local
 
末尾に以下を追加
ip link set wlan0 down
ip addr flush dev wlan0
ip link set wlan0 up
ip addr add 192.168.100.1/24 dev wlan0
hostapd /etc/hostapd.conf

dnsmasq設定

dnsmasqの設定を行います。パッケージインストール時に生成される設定ファイルに追記する必要があるため、
追記部分を別ファイルに作成しておき、後ほどスクリプトでマージさせます。

[ATDE ~]$ vi [at-debian-builder]/a600_resources/resources/dns.txt
任意の設定を行ってください。以下設定例です。
 
listen-address=127.0.0.1, 192.168.100.1
interface=wlan0
dhcp-range=192.168.100.100, 192.168.100.254, 12h

depmodコマンド実行

ルートファイルシステムをビルドする際にdepmodコマンドを実行することで追加したカーネルモジュールを読み込むよう設定します。
また、その他にルートファイルシステムビルド時に実行すべき項目をスクリプトに追加しておきます。

[ATDE ~]$ vi [at-debian-builder]/a600_resources/resources/fixup
 
末尾に以下を追加する
cp -r /resources/lib/modules /lib/
cat /resources/dns.txt >> /etc/dnsmasq.conf
depmod 4.14-at54

ビルド

下記のマニュアルを参考にルートファイルシステムのビルドを行ってください。
10.3. Debian GNU/Linuxルートファイルシステムをビルドする

書込み・動作確認

インストールディスク作成・実行

ビルドしたLinuxカーネル・ルートファイルシステムをArmadillo-640に書込み、動作を確認します。
インストールディスクを使って書き込むのが最も効率的です。
以下を参考にインストールディスクを作成し、書き込みを行ってください。
8.3. イメージファイルの更新(Armadillo-600シリーズ向け)

動作確認

Armadillo-640にUSBドングルを挿入した状態で電源を投入すると、システム起動後アクセスポイントが動作します。
他の機器から設定したSSIDに接続出来るかを確認してみて下さい。

おまけ

APではなくSTAとしてどうさせたい場合も、基本的には上記手順を行いつつ、ルートファイルシステム構築時に下記の点を変更しておいてください。

パッケージ

アクセスポイントとの接続に使用するため、wpa_supplicantをインストールしておく必要があります。

[ATDE ~]$ vi [at-debian-builder]/a600_resources/resources/packages
末尾に以下を追加
wpasupplicant

wpa_supplicantのコンフィグレーションファイル作成

wpa_supplicantでAPに接続するためのSSIDやパスワード等の設定をファイルに出力しておきます。
ファイル出力の際にパスワードが暗号化されるので、平文のパスワードがファイルに残さないことが可能です。

[ATDE ~]$ mkdir [at-debbian-builder]/a600_resources/etc/wpa_supplicant/
[ATDE ~]$ wpa_passphrase [SSID] [PASSWORD] > [at-debbian-builder]/a600_resources/etc/wpa_supplicant/wpa_supplicant.conf
 
出力内容を確認する
[ATDE ~]$ cat [at-debbian-builder]/a600_resources/etc/wpa_supplicant/wpa_supplicant.conf
 
network={
        ssid=[SSID]
        #psk=[PASSWORD]
        psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}
 
以下のように編集する
[ATDE ~]$ vi [at-debbian-builder]/a600_resources/etc/wpa_supplicant/wpa_supplicant.conf
 
network={
        ssid=[SSID]
        proto=WPA
        key_mgmt=WPA-PSK
        pairwise=CCMP
        group=CCMP
        psk=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
}

ネットワークインタフェース設定

/etc/network/interfacesファイルを設定します。

[ATDE ~]$ vi [at-debian-builder]/a600_resources/resources/interfaces
wlan0関連の部分を下記の通りに変更する
 
auto wlan0 up
iface wlan0 inet dhcp
       wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf

起動時のスクリプト削除

上記アクセスポイント構築手順時にrc.localファイルに加えた変更箇所を全て削除しておきます。



以上を反映した上で、再度ルートファイルシステムをビルド、書込みを行うと、起動直後からSTAとして機能し、設定したアクセスポイントへ接続します。