wifiアクセスポイント化 for kernel 2.6.39

Gumstixは、デフォルトで組込の無線機能を利用することができるのが大きな特徴の一つです。そこで、今回はGumstixによる無線アクセスポイントの構築法を紹介します。


ハードウェア準備

今回も、ハードウェアとして

    • Gumstix Overo Fire Storm COM
    • 拡張IFボードTOBI
    • SDカード4GB

を用います。これまでと同じなので、説明は割愛します。また、今回は、Gumstix自身がアクセスポイントになるので、無線ルータは必要ありません。ただし、無線アクセスポイントとして動作していることを実際に確認するためには、ノートパソコンなどの802.11 b/gで接続できる機器が必要になります。


ソフトウェア準備

ソフトウェア環境としては、既に基本的な開発環境(OpenEmbedded)は整っていることを前提とし、今回は、ルートファイルシステムとしてomap3-console-imageを用います。
GUMSTIX開発環境構築のページの続きで、以下では、カーネルイメージ及び、ルートファイルシステムの中身を変更していきます。


カーネルバージョン変更と無線ドライバ・ファームウェア変更

アクセスポイント化を行うに辺り、ドライバにパッチを当てる必要があり、デフォルトのカーネル(3.2)や前回投稿した無線カメラキャプチャ環境のカーネル(2.6.34)では、うまく動作しません。また、デフォルトのカーネルでは、無線の通信速度が遅いことが知られており、そのためのパッチも必要です。

そこで、今回は、通信高速化パッチが取り込まれたカーネルバージョンとして2.6.39を用いることにして、無線AP化を実現するためのパッチを当てる作業を行うことにします。

まず、デフォルトのカーネルをlinux-omap3として、そのlinux-omap3の中で用いるカーネルのバージョンを変更します。変更するファイルは、~/overo-oe/build/conf/local.conf であり、

PREFERRED_VERSION_linux-omap3="2.6.39"

という1行を足してください。

以下、http://corysohrakoff.wordpress.com/2011/09/13/enabling-wifi-ap-mode-on-a-gumstix-overo/ に沿って作業を行うことにします。

1)    http://dev.laptop.org/pub/firmware/libertas/thinfirm/lbtf_sdio-9.0.7.p4.bin をダウンロードし、sd8686tf.binという名前にリネームします。

2)    http://www.marvell.com/support/downloads/driverDownload.do?driverId=203&action=1 をダウンロードし、*.tarを解凍した後、FwImageフォルダにある helper_sd.binをリネームして、sd8686_helper.binにします。

3)    http://dev.laptop.org/git/users/derosier/wireless-testing/commit/?id=70eeb4cc177279dfc57e13cede8257e1f5715b82 をダウンロード、解凍します。wireless-testingというフォルダができます。

4)    http://hostap.epitest.fi/hostapdからhostapdをダウンロードします。バージョンは0.7.2で動作確認を行いました。

5)    hostapdの動作、コンパイルにiw、openssl、openssl-devとlibnl、libnl-dev、libnl1、libnl1-devが必要なので、それらはdsp-consol-imageなどに含めて、新しくomap3-consol-imageのルートファイルシステムを作成します。

~/overo-oe/org.openembedded.dev/recipes/images/omap3-console-image.bbを編集して、TOOLS_INSTALL = ” の部分に下記を追加します。

  iw 
  libnl 
  libnl-dev 
  libnl1 
  libnl1-dev 
  openssl 
  openssl-dev 

追記したらルートファイルシステムの再構築を行い、その後、イメージをSDカードに転送します。

hostpc$ bitbake omap3-console-image
hostpc$ sudo tar xvaf tmp/deploy/glibc/images/overo/Angstrom-omap3-console-image-glibc-ipk-2011.03-overo.rootfs.tar.bz2 -C /media/rootfs/

もし、ルートファイルシステムを作りなおすのが面倒な場合は、各々を個別にbitbakeすると、~/overo-oe/tmp/deploy/glibc/ipk/armv7a/ 以下にipkができるので、必要なものをSDカードにコピーして、Gumstix側でopkg installすることもできます。 opkgは、下記のようにして使います。

GX$ opkg install xxx.ipk

6)    ホストPCにて、

hostpc$ bitbake virtual/kernel

してカーネルソースを1回取得します。その後,上記3)で解凍したwireless-testing/drivers/net/wireless/libertas_tfを~/overo-oe/tmp/work/overo-angstrom-linux-gnueabi/linux-omap3-2.6.39-r103/git/drivers/net/wireless/)にコピーします。

7)    drivers/net/wireless/の下のKconfigに“config LIBERTAS_THINFIRM_USB”の項目を足します。具体的には、「config LIBERTAS_THINFIRM_USB」セクションのすぐ後に、下記のものを丸ごと足す感じです。

config LIBERTAS_THINFIRM_SDIO
 tristate "Marvell Libertas 8686 SDIO 802.11b/g cards with thin firmware"
 depends on LIBERTAS_THINFIRM && MMC
 ---help---
 A driver for Marvell Libertas 8686 SDIO devices and those that include
 the 88W8686 core, such as the Wi2Wi devices. Special SDIO specific
 firmware is required to use this driver, see the OLPC site for details:

<http://wiki.laptop.org/go/Thinfirm_1.5>

8)    ホストPC側で、下記のようにして、uImageとモジュールを作ります。尚、menuconfigでは、Device Drivers―>Network device support―>Wireless LANの下にある「Marvell 8xxx Libertas WLAN driver support with thin firmware」と「Marvell Libertas 8686 SDIO 802.11b/g cards with thin firmware」をモジュールとして選択しておきます。

hostpc$ bitbake -c menuconfig virtual/kernel
hostpc$ cp ~/overo-oe/tmp/work/overo-angstrom-linux-gnueabi/linux-omap3-2.6.39-r103/git/.config ~/overo-oe/tmp/work/overo-angstrom-linux-gnueabi/linux-omap3-2.6.39-r103/defconfig
hostpc$ bitbake -f -c compile virtual/kernel
hostpc$ bitbake -f -c deploy virtual/kernel

9)    ~/overo-oe/tmp/deploy/glibc/images/overo 以下のuImageとmodulesが更新されているのを確認して,SDカードにコピーします。1)、2)のファームウェアは/media/rootfs/lib/firmwareにコピーします。

hostpc$ sudo cp tmp/deploy/glibc/images/overo/uImage-2.6.39-r103-overo.bin /media/boot/uImage
hostpc$ sudo cp tmp/deploy/glibc/images/overo/uImage-2.6.39-r103-overo.bin /media/rootfs/boot/uImage 
hostpc$ cd /media/rootfs/
hostpc$ sudo tar xvzf ~/overo-oe/tmp/deploy/glibc/images/overo/modules-2.6.39-r103-overo.tgz

10) SDカード上のルートファイルシステムを一部変更します。

rootfsのetc/inittabに関して、

S:2345:respawn:/sbin/getty 115200 ttyO2

とします。2.6.34では、シリアルコンソールはttyS2でしたが、2.6.39ではttyO2となります。

11) MLO、u-boot.binは、http://cumulus.gumstix.org/images/angstrom/misc/caspapx/ にあるものをコピーして使います。

12) 9)で作成したSDカードを用いてGustixを再起動し、4)でダウンロードしたhostapdをGumstix側にコピーします。Gumstix側で、解凍します。次に、hostapd-0.7.2/hostapd/defconfig を .config にコピーして以下のように一部書き換えます。

# Driver interface for drivers using the nl80211 kernel interface
CONFIG_DRIVER_NL80211=y
# driver_nl80211.c requires a rather new libnl (version 1.1) which may not be
# shipped with your distribution yet. If that is the case, you need to build
# newer libnl version and point the hostapd build to use it.
#LIBNL=/usr/lib/libnl1/
CFLAGS += -I/usr/include/libnl1/
LIBS += /usr/lib/libnl1/libnl1.a

その後、hostapd-0.7.2/hostapdの下でmake clean;makeを行います。この時出るwarningに関しては無視して大丈夫です。その後、mkdir -p /usr/local/binとして、local/binディレクトリを作成し、make installを行います。

12) 参考ページにサンプルのhostapd.confがあるので、それをGumstix側の/etc/hostapd.confに置きます。このファイルの中で重要なのは、essidの設定です。例えば、


ssid=gumstix

と記述してあれば、アクセスポイントとして起動後、gumstixという名前のアクセスポイントが見えるようになります。

また、もう一点、/etc/hostapd.conf に以下の2行を追加して下さい。これは、電波法に準拠するための設定ですので、必ず行なって下さい。

country_code=JP
hw_mode=g

13) Gumstix再起動後にlsmodして、libertas_sdio、libertasがいるならば、それらは、rmmodします。また、libertas_tf_sdioがないようであれば、下記コマンドを実行します。

GX$ depmod -a
GX$ modprobe libertas_tf_sdio

このあと再起動を行なって、ifconfigを行い、無線の接続があることを確認します。

14) Gumstix再起動後に /usr/local/bin/hostapd -B /etc/hostapd.conf& を行うとAPモードで使えるようになっていることを確認します。AP化ができているかどうかはiwconfigで確認することがができます。AP化されていることを確認し、/etc/network/interfacesに書きを記述することで、次の再起動から自動的に無線アクセスポイントの設定が起動時に行われるようになります。Gumstix上にてwebから直接ソースをwgetして、それを展開、コンパイルします。

auto wlan0
iface wlan0 inet static
address 192.168.0.1
netmask 255.255.255.0
broadcast 192.168.0.255
post-up /usr/local/bin/hostapd -B /etc/hostapd.conf
post-up iwconfig wlan0 txpower 15

iwconfigの行は、電波出力を電波法で許容される範囲に収めるものです。使用時には15dbm以下に設定して頂く必要がありますので、必ず、この設定を忘れないようにして下さい。

15) 更に、アクセスポイントに接続した際に自動でIPをふり与えるためには、DHCPサーバを実行する必要があります。DHCPサーバ に関しては、bitbake環境で構築することはできないので、ソースからのコンパイルを行います。

GX$ wget ftp://ftp.isc.org/isc/dhcp/4.2.3-P2/dhcp-4.2.3-P2.tar.gz
GX$ tar xvzf dhcp-4.2.3-P2.tar.gz
GX$ cd dhcp-4.2.3-P2
GX$ ./configure
GX$ make
GX$ make install

次にDHCPサーバの設定であるdhcpd.confを作って、/etc/dhcp/dhcpd.confに置きます。

GX$ dhcpd -t -cf /etc/dhcp/dhcpd.conf

でエラーがでなければOKです。dhcpd.confの例を以下に示します。先程固定した無線LANのIPと範囲が同じになるようにに指定してください。

default-lease-time 172800;
max-lease-time 259200;
subnet 192.168.10.0 netmask 255.255.255.0 {
option routers 192.168.10.1;
option subnet-mask 255.255.255.0;
option broadcast-address 192.168.10.255;
range 192.168.0.10 192.168.0.200;
}

次に、

GX$ mkdir -p /var/db/
GX$ touch /var/db/dhcpd.leases

をして、その後、手動で下記のコマンドを走らせて、dhcpが動いているかどうかを実際にPCから接続して確認します。

GX$ dhcpd -cf /etc/dhcp/dhcpd.conf &

これで、無事動作するのを確認した上で、/etc/network/interfacesのwlan0の設定のところに下記の1行を追加します。

post-up /usr/local/sbin/dhcpd -cf /etc/dhcp/dhcpd.conf

【トラブルシューティング】

◯’/linux-omap3_2.6.39.bb’ failed と出てbitbakeが通らない場合

~/overo-oe/org.openembedded.dev/recipes/linux/linux-omap3_2.6.39.bbを編集し、git://www.sakoman.com/git/linux-omap-2.6.git を git://www.sakoman.com/git/linux.git に変更します。

◯有線ネットワークが使えない場合

カーネルの設定におけるEthernetの設定を、omap3-caspapx_2.6.34のときと同じにすることで解決できます。bitbake -c menuconfig virtual/kernelを行い、下記にマークをつけて、カーネルを再構築します。

Ethernet (10 or 100Mbit)
→<M>ENC28J60 support
 <*> SMSC LAN911x/LAN921x families embedded ethernet support

◯modprobe libertas_tf_sdioして、再起動するとモジュールが元に戻ってしまう場合

menuconfig でDevice Drivers―>Network device support―>Wireless LANの「Marvell 8xxx Libertas WLAN driver support」をモジュールから外してカーネルを再構築して下さい。


◯Gumstix上でmakeコマンドが使えない場合

omap3-console-image.bb にmakeを足すか、個別bitbakeでipkを作ってインストールして下さい。


FTPによる通信速度テスト

ここまでの段階で、アクセスポイントとして、接続できるている状態だと思いますので、最後に無線アクセスポイントとして通信速度も十分出ているかどうかをftpでテストします。

まず、ホストマシンの側で下記のように、

hostpc$ apt-get install proftpd

ftpをインストールし、起動できる状態にします。次にpingコマンドで通信の確認を行なって、

hostpc$ ping 192.168.0.1

で通信ができていることが確認しておきます。

続いて通信速度を見るためのダミーファイルをホストマシンの側で作ります。 適切な大きさのファイル(下記の例では3Mのファイル)を用意して転送時間を見るようにします。あまりサイズの大きなファイルだとネットワーク環境によっては接続が途中で切れてしまうこともあるので、注意が必要です。

hostpc$ dd if=/home/usrname/ of=dummy.dat bs=1M count=3

最後にGumstix上で速度の確認を行います.下記は実行例です。

root@overo:~# ftp 192.168.0.2
Connected to 192.168.0.2.
220 ProFTPD 1.3.4a Server (Debian) [::ffff:192.168.0.2]
Name (192.168.0.2:root): usrname
331 Password required for usrname
Password:
230 User usrname logged in.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> bin
200 Type set to I
ftp> get /home/usrname/dummy.dat /dev/null
200 PORT command successful
150 Opening BINARY mode data connection for /home/usrname/dummy.dat (3145728 bytes)
226 Transfer complete.
3145728 bytes received in 1.76 seconds (1789728 bytes/s)

上記の環境では、約14.3Mbpsの速度が出ているので、十分高速化されていると判断できます。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>