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
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