Raspberry Piを無線LAN化

前回のセットアップでとりあえずRaspberry Piが動いたわけだけど、あのちっちゃいボディに対して給電USB、HDMI、LANケーブル、マウスにキーボードと色々なものが刺さりすぎて鬱陶しかったので、ヘッドレス&無線LAN化してssh経由でアクセスできるようにしてみる。これで繋げるケーブルは給電用のUSBケーブルのみとなってスッキリ!


ちなみにヘッドレス化が目的ではなく、デスクトップで使う人はデスクトップ上にある無線LANの設定ツールから設定すれば簡単……かもしれない。やったことないからわからないw

環境

Raspberry Pi Model B(2012年12月頃)


OSは2012-12-16-wheezy-raspbian.zip

$ uname -a
Linux raspberrypi 3.2.27+ #250 PREEMPT Thu Oct 18 19:03:02 BST 2012 armv6l GNU/Linux

初期状態の設定がググって出てきたサイトと微妙に違ったりしたので、日々改良されているのかもしれない。

無線LANアダプタ

WLI-UC-GNM2 | BUFFALO バッファロー
http://buffalo.jp/product/wireless-lan/client/wli-uc-gnm2/


ヨドバシで適当に買ってきた。マウスのレシーバみたいにちっちゃいやつがいいなーと思って。
お値段も980円と気軽にチャレンジできる。Amazonとかだと700円ぐらいみたい。

とりあえず挿してみる

とりあえずマウスを外して無線LANアダプタを挿して起動してみたところ、なんか自動的に認識してる感じだった。

$ dmesg
[    3.343406] usb 1-1.2: new high-speed USB device number 4 using dwc_otg
[    3.490157] usb 1-1.2: New USB device found, idVendor=0411, idProduct=01ee
[    3.523202] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3
[    3.552689] usb 1-1.2: Product: 802.11 n WLAN
[    3.573216] usb 1-1.2: Manufacturer: Ralink
[    3.593209] usb 1-1.2: SerialNumber: 1.0

なんかそれっぽいデバイスが検出された。


本当はtail -f /var/log/messagesして挿した瞬間を見たかったんだけど、電力が不安定なのか挿した瞬間再起動してしまったので、挿した状態から起動。
セルフパワーのUSBハブにしたらいいのかもしれないけど、それではコンパクト化にならないのでこのまま様子を見る。

$ lsmod
Module                  Size  Used by
aes_generic            31457  2 
snd_bcm2835            12808  0 
snd_pcm                74834  1 snd_bcm2835
snd_seq                52536  0 
snd_timer              19698  2 snd_seq,snd_pcm
snd_seq_device          6300  1 snd_seq
snd                    52489  5 snd_seq_device,snd_timer,snd_seq,snd_pcm,snd_bcm2835
snd_page_alloc          4951  1 snd_pcm
arc4                    1187  2 
rt2800usb              13009  0 
rt2800lib              47242  1 rt2800usb
crc_ccitt               1465  1 rt2800lib
rt2x00usb              11075  1 rt2800usb
rt2x00lib              41057  3 rt2x00usb,rt2800lib,rt2800usb
mac80211              236178  3 rt2x00lib,rt2x00usb,rt2800lib
cfg80211              171957  2 mac80211,rt2x00lib
evdev                   8682  2 

rt2800usb(たぶんこれがドライバ)が読み込まれてる。
rt2800はblacklist入りしてRT3070のやつを別途入れたほうがいいのかもしれないけど、面倒くさそうなのでとりあえずこれで。

$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 001 Device 002: ID 0424:9512 Standard Microsystems Corp. 
Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. 
Bus 001 Device 004: ID 0411:01ee BUFFALO INC. (formerly MelCo., Inc.) WLI-UC-GNM2 Wireless LAN Adapter [Ralink RT3070]
Bus 001 Device 005: ID 060b:6220 Solid Year 

そのものずばりな型番が出てる。

$ ifconfig
wlan0     Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX  
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)
wlan0     IEEE 802.11bgn  ESSID:off/any  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:on

で、こんな感じでインタフェースとして出てきた。
ちなみにHWaddrの部分がMACアドレスなので、アクセスポイント側でMACアドレスフィルタとかしてる場合は、この値を追加してあげる。


この状態でとりあえずアクセスポイントをスキャンしてみる。

sudo iwlist wlan0 scan

# あるいは
sudo iwlist wlan0 scan | grep ESSID

するとなにやらずらずらと出てくるのでとりあえず動作はしている模様。



さて……ここから先、上手くいったりいかなかったり試行錯誤しまくったので不確かですw
この記事を書くにあたって一度全部設定を戻してからなぞってるので大丈夫だとは思うんだけど……。


アクセスポイントに接続してみる

ここまでくれば無線LANアダプタは無事に動いているようなので、この状態でiwconfigでSSIDとキーを設定すると繋がるらしい(大文字小文字区別するので注意)。
キーは16進数で指定する時はそのまま、パスフレーズみたいな任意の文字列で指定する場合は頭に「s:」をつける。

sudo iwconfig wlan0 essid 接続先のSSID key s:接続先のキー

例:SSIDがpaselanでキーがhimitsu123の場合
sudo iwconfig wlan0 essid paselan key s:himitsu123
$ iwconfig wlan0
wlan0     IEEE 802.11bgn  ESSID:"paselan"  
          Mode:Managed  Access Point: Not-Associated   Tx-Power=20 dBm   
          Retry  long limit:7   RTS thr:off   Fragment thr:off
          Power Management:on

iwconfigで確認するとESSIDのところが設定した値になってる。
で、DHCPの場合はこのままdhclientでIPアドレスを割り振ってもらえば繋がるようになる。

sudo dhclient wlan0

少し時間かかる。
特にエラーっぽいメッセージが出ずにPINGどうたらみたいなのが出たらとりあえず成功かもしれない。

$ ifconfig wlan0
wlan0     Link encap:Ethernet  HWaddr XX:XX:XX:XX:XX:XX  
          inet addr:192.168.1.162  Bcast:192.168.1.255  Mask:255.255.255.0
          UP BROADCAST MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000 
          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

ifconfigで確認してみると無事にIPアドレスが割り当てられている。
おそらくpingとかが通るはず。


ちなみに、自分はここでiwconfigで見てもESSIDのところが全然設定されずに繋がらないこともあって、ここでだいぶはまったんだが、とりあえず起動時の設定に進んだら無事に動くようになったりもしたので、ここではまってもとりあえず先に進んでみるといいかもしれないw
だいたい次の起動時の設定ではやたら項目があるのに、先のコマンドではessidとkeyしか指定がないので繋がるほうが不思議な気がする。

起動時に無線LANアダプタで繋がるように設定する(WPA2-PSK)

/etc/network/interfacesをこんな感じに書き換えた。
wpa-*という項目はwpa_supplicant.confの項目と対応している(wpa-をつけて_を-にする)ので、詳しい値はそのへんのヘルプを参照。
たぶんwpa_supplicant.confに設定を書いて、こっちにはwpa-confで設定ファイルを指定してもいいんだと思う(後述)。


以下はWPA2-PSKの例。

auto lo

iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-driver wext
wpa-ap-scan 1
wpa-scan-ssid 1                  # APがステルスモードの場合は1、それ以外は0
wpa-key-mgmt WPA-PSK             # キーの種類
wpa-proto WPA2                   # WPAとかWPA2とか
wpa-pariwise CCMP                # CCMPとかTKIPとか
wpa-group CCMP                   # CCMPとかTKIPとか
wpa-ssid "接続先のSSID"
wpa-psk "接続先のキー"
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

差分はこんな感じ。

--- /etc/network/interfaces.org	2012-12-22 09:04:15.800000003 +0900
+++ /etc/network/interfaces	2012-12-25 01:46:11.506044001 +0900
@@ -1,9 +1,20 @@
 auto lo
 
 iface lo inet loopback
+
+allow-hotplug eth0
 iface eth0 inet dhcp
 
 allow-hotplug wlan0
-iface wlan0 inet manual
-wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
+iface wlan0 inet dhcp
+wpa-driver wext
+wpa-ap-scan 1
+wpa-scan-ssid 1
+wpa-key-mgmt WPA-PSK
+wpa-proto RSN
+wpa-pariwise CCMP
+wpa-group CCMP
+wpa-ssid "接続先のSSID"
+wpa-psk "接続先のキー"
+#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
 iface default inet dhcp
  • eth0をallow-hotplugに
  • wlan0をmanualからdhcp
  • wpa-roamをコメントアウト
  • wpa-*でアクセスポイントの設定を書きまくる

wpa-pskの部分は16進数で指定するんだけど、これはwpa_passphraseというコマンドで得られる。
こんな感じ。

# SSID=paselan, キー=himitsu123の場合
$ wpa_passphrase paselan himitsu123
network={
	ssid="paselan"
	#psk="himitsu123"
	psk=190863550e8b4cf62f28747de7a6545c3ebb7c3e40af26a45811da549eae53a5
}

これは実はwpa_supplicant.confの書式。


以上の設定が終わったら試しに再起動してみる。

sudo reboot

無事繋がるかな?
起動したらifconfigで確認してみよう。

起動時に無線LANアダプタで繋がるように設定する(WEP)

WEPでは設定をしたことがないのでよくわからないけど、wpa-*ではなくwireless-essidとwireless-keyの2つを設定すればいいらしい。
こんな感じ?

auto lo

iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet dhcp
wireless-essid 接続先のSSID
wireless-key 接続先のキー
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp

wpa_supplicant.confに書く場合(WPA2-PSK)

/etc/network/interfacesに全部書くよりwpa_supplicant.confに書いたほうがwpa_supplicantコマンドとか叩けていい気がするので、そうしたい場合はこんな感じかな?

/etc/wpa_supplicant/wpa_supplicant.conf

ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1

network={
	ssid="接続先のSSID"
	scan_ssid=1                  # APがステルスモードの場合は1、それ以外は0
	key_mgmt=WPA-PSK             # キーの種類
	proto=WPA2                   # WPAとかWPA2とか
	pairwise=CCMP                # CCMPとかTKIPとか
	group=CCMP                   # CCMPとかTKIPとか
	psk="接続先のキー(16進数)"
}

最初の2行は書かれていたのでnetwork { 〜 }の部分を追記。


/etc/network/interfaces

auto lo

iface lo inet loopback

allow-hotplug eth0
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet dhcp
#wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp