2015-08-03
Raspberry Pi に、USBの無線LANアダプタを接続します。本稿執筆時点の最新版 2015-05-05-raspbian-wheezy.img に基づいています。
USB接続無線LANアダプタを用意します。初めに、Raspberry Piに接続したとき、認識されるか確認しましょう。
root@raspberrypi:/home/pi# lsusb Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. Bus 001 Device 004: ID 05af:0507 Jing-Mold Enterprise Co., Ltd
root@raspberrypi:/home/pi# lsusb Bus 001 Device 002: ID 0424:9514 Standard Microsystems Corp. Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 0424:ec00 Standard Microsystems Corp. Bus 001 Device 005: ID 0bda:8174 Realtek Semiconductor Corp. RTL8192SU 802.11n WLAN Adapter Bus 001 Device 004: ID 05af:0507 Jing-Mold Enterprise Co., Ltd
Realtek Semiconductor Corp. RTL8192SU 802.11n WLAN Adapter というのが、明らかに今回の題材です。
いきなり wpa_supplicant なんか使おうと思っても、慣れてないと絶対うまくいかないので、コマンド入力でやる方法から順を追って、コツを掴んでいく方がおすすめです。
まず ifconfig を実行してみます。
root@raspberrypi:/home/pi# ifconfig eth0 Link encap:Ethernet HWaddr b8:27:eb:34:51:b5 inet addr:192.168.0.234 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:374 errors:0 dropped:0 overruns:0 frame:0 TX packets:206 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:38443 (37.5 KiB) TX bytes:30427 (29.7 KiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:8 errors:0 dropped:0 overruns:0 frame:0 TX packets:8 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:1104 (1.0 KiB) TX bytes:1104 (1.0 KiB) wlan0 Link encap:Ethernet HWaddr 00:22:cf:3e:f8:e6 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)
/etc/network/interfaces を見てみます。
auto lo iface lo inet loopback auto eth0 allow-hotplug eth0 iface eth0 inet manual auto wlan0 allow-hotplug wlan0 iface wlan0 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf auto wlan1 allow-hotplug wlan1 iface wlan1 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
自動的にwlan0/wlan1が立ち上がるようになっているようです。
上記、参考サイトRaspberry Piを無線LAN化 - ぱせらんメモに書かれているとおり、周囲のアクセスポイントをスキャンしてみます。
root@raspberrypi:/home/pi# iwlist wlan0 scan|grep ESSID ESSID:"aterm-xxxxxx-g" ESSID:"aterm-xxxxxx-gw" ESSID:"203Za-xxxxxx" ESSID:"auhome_xxxxxx-W" ESSID:"auhome_xxxxxx" ESSID:"106Fxxxxxxxx-x" ESSID:"0024xxxxxxxx" ESSID:"106Fxxxxxxxx"
iwconfigコマンドを実行します。
iwconfig wlan0 essid {接続先のSSID} key s:{パスフレーズ}
root@raspberrypi:~# iwconfig wlan0 essid MySSID key s:MyPassPhrase root@raspberrypi:~# iwconfig wlan0 wlan0 unassociated Nickname:"rtl_wifi" Mode:Managed Access Point: Not-Associated Sensitivity:0/0 Retry:off RTS thr:off Fragment thr:off Encryption key:off Power Management:off Link Quality:0 Signal level:0 Noise level:0 Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0
上記はうまくいってない例です。一度 ifdown しないと、うまくいかないことがあるようです。
root@raspberrypi:~# ifup wlan0 ifup: interface wlan0 already configured root@raspberrypi:~# ifdown wlan0 root@raspberrypi:~#では、もう一度やってみます。
root@raspberrypi:~# iwconfig wlan0 essid MySSID key s:MyPassPhrase root@raspberrypi:~# iwconfig wlan0 wlan0 IEEE 802.11bgn ESSID:"MySSID" Nickname:"rtl_wifi" Mode:Managed Frequency:2.417 GHz Access Point: XX:XX:XX:XX:XX:XX Bit Rate:150 Mb/s Sensitivity:0/0 Retry:off RTS thr:off Fragment thr:off Encryption key:2331-6164-6131-3831-3924-0000-00 Security mode:open Power Management:off Link Quality=0/100 Signal level=100/100 Noise level=0/100 Rx invalid nwid:0 Rx invalid crypt:0 Rx invalid frag:0 Tx excessive retries:0 Invalid misc:0 Missed beacon:0
コマンドライン編はここまで。
ここで dhclient wlan0 を実行して、IPアドレスが割り当てらたならば通信できるのですが、そもそも、この時点では、プロトコルや暗号に関して一切の設定を行っていません。従って、これ以上先に進めなくても、気にする必要はありません。
2015-05-05-raspbian-wheezy をインストールした直後の interfaces の内容を、もう一度見てみます。
auto lo iface lo inet loopback auto eth0 allow-hotplug eth0 iface eth0 inet manual auto wlan0 allow-hotplug wlan0 iface wlan0 inet dhcp wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf auto wlan1 allow-hotplug wlan1 iface wlan1 inet manual wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
eth0(有線LAN)とwlan1はしばらく使わないので消します。コメントアウトでも構いません。必要になったら後で戻します。ここでは、無線LANを使用するために必要な最小限に限って設定します。
wlan0のために最低必要な設定だけにすると以下のようになります。
auto lo iface lo inet loopback auto wlan0 allow-hotplug wlan0 iface wlan0 inet dhcp wpa-driver wext wpa-scan-ssid 1 wpa-ssid "MySSID" wpa-psk "MyPassPhrase" iface default inet dhcp
参考サイトRaspberry Piを無線LAN化 - ぱせらんメモに書かれているとおり、必要なら、 wpa-proto や、その他設定を書き加えます。
wpa-driver wext は、使用するドライバを指定します。無くても動く場合もありますが、これを書いていなくてハマったという事例もあるようです。
wpa-scan-ssid 1 は、ステルスSSIDを使用する際に必要とのことです。普通のSSIDなら 0 でも構いませんが、常に 1 を設定しても特に問題はないかと思います。
素のDebianの場合、wpasupplicantをインストールする必要があるかもしれません。
apt-get install wpasupplicant
Raspbianでは、初めから入っているはずですので、上のコマンドを実行する必要はありません。
接続先の設定は wpa_supplicant.conf を参照するように変更します。
auto lo iface lo inet loopback auto wlan0 allow-hotplug wlan0 iface wlan0 inet dhcp wpa-driver wext wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf iface default inet dhcp
wpa_supplicant.conf に、最低限必要な設定は、以下の通り。
network={ ssid="MySSID" psk="MyPassPhrase" }
これは、wpa_passphraseコマンドが出力した結果そのものです。
root@raspberrypi:~# wpa_passphrase MySSID MyPassPhrase network={ ssid="MySSID" #psk="MyPassPhrase" psk=a44e1ee40ca3c10a0368242a4f6172f00fc5d265cf5d60e412f9b01131589def }
接続先のアクセスポイントとのやりとりがうまくいけば、上の4行だけで接続できますが、通常は、OSインストール直後の既存の wpa_supplicant.conf に、networkの定義を書き加える形となります。手を抜かずに、もう少し丁寧に記述するなら以下のようになります。
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev update_config=1 network={ ssid="MySSID" #psk="MyPassPhrase" psk=a44e1ee40ca3c10a0368242a4f6172f00fc5d265cf5d60e412f9b01131589def key_mgmt=WPA-PSK proto=WPA2 pairwise=CCMP group=CCMP scan_ssid=1 }
最初の2行は、OSのインストール時に初めから書かれていたものです。コマンドラインの対話型設定ツール wpa_cli を使用するなら、この2行が必要です。
パスフレーズはpskで指定しますが、平文で記述する場合はダブルクォートで囲み、16進数で記述する場合はダブルクォートは使いません。パスフレーズを平文で書いてあるのが気持ち悪いという方は、16進数のpskだけ残して、平文のpskは消しましょう。
protoはWPAやWPA2を指定します。pairwiseとgroupはCCMPやTKIPを指定します。CCMPとは何かを調べたら、ブロック暗号のモードで、無線LANに関して言えば、AES暗号を利用するということのようです(暗号は私の専門ではないので、これ以上深追いしません。)。TKIPはWEPの代替の仕様だそうです。WEPよりTKIPの方がマシですが、どちらももはや時代遅れの様です。WPA(WPA1)とTKIPは、あわせて「WPA-TKIP」などと表記されます。その後継がWPA2で、現時点において最良とされているAES暗号を利用します。CCMPといった場合、WPA2-AESの事を指していると考えて良いと思います。(例によって、私の専門ではry)
通常スキャンでは表示されないSSID(ステルスSSID)を使用する場合、 scan_ssid=1 という設定が必要です。
普通はここで Raspberry Pi を再起動します。
その前に、コマンド入力で、接続してみましょう。
service networking start を実行します。もしこれが失敗するようでしたら、先に service networking stop を実行してからやり直します。
完了まで、およそ40秒程度かかりますので、気長に待ちます。
root@raspberrypi:~# service networking start [.....] Configuring network interfaces...Internet Systems Consortium DHCP Client 4.2.2 Copyright 2004-2011 Internet Systems Consortium. All rights reserved. For info, please visit https://www.isc.org/software/dhcp/ Listening on LPF/wlan0/xx:xx:xx:xx:xx:xx Sending on LPF/wlan0/xx:xx:xx:xx:xx:xx Sending on Socket/fallback DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 3 DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 4 DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 4 DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 7 DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 8 DHCPREQUEST on wlan0 to 255.255.255.255 port 67 DHCPOFFER from 192.168.0.1 DHCPACK from 192.168.0.1 bound to 192.168.0.237 -- renewal in 5816 seconds. ifup: interface wlan0 already configured done.
service networking の stop と start を繰り返していると、たまに start が失敗します。 stop 直後、短時間のうちに start すると、失敗しやすいようです。
DHCPDISCOVER on wlan0 to 255.255.255.255 port 67 interval 6 Terminated failed.
焦らず、もう一度 start すると、たいてい成功します。
ifconfigでアドレスを確認して、pingを実行してみます。
root@raspberrypi:~# ifconfig eth0 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) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 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:0 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) wlan0 Link encap:Ethernet HWaddr xx:xx:xx:xx:xx:xx inet addr:192.168.0.237 Bcast:192.168.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:1313 errors:0 dropped:2 overruns:0 frame:0 TX packets:401 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:151115 (147.5 KiB) TX bytes:63593 (62.1 KiB) root@raspberrypi:~# ping www.google.co.jp PING www.google.co.jp (216.58.221.3) 56(84) bytes of data. 64 bytes from nrt13s38-in-f3.1e100.net (216.58.221.3): icmp_req=1 ttl=56 time=9.98 ms 64 bytes from nrt13s38-in-f3.1e100.net (216.58.221.3): icmp_req=2 ttl=56 time=10.7 ms 64 bytes from nrt13s38-in-f3.1e100.net (216.58.221.3): icmp_req=3 ttl=56 time=11.6 ms 64 bytes from nrt13s38-in-f3.1e100.net (216.58.221.3): icmp_req=4 ttl=56 time=8.86 ms ^C --- www.google.co.jp ping statistics --- 4 packets transmitted, 4 received, 0% packet loss, time 3003ms rtt min/avg/max/mdev = 8.863/10.300/11.615/1.016 ms
もし、 eth0 と wlan0 が両方生きていて、しかも、どちらも同じネットワークに属している場合は、正しくルーティングが行われず、通信が誤動作するかもしれません。あるいは、どちらの経路で通信が行われているか、分からなくなることがあります。有線と無線を異なるネットワークにするか、 /etc/network/interfaces の eth0 の設定を消して、LANケーブルを抜いておくか、そのあたりを確認します。
service networking start で、正常に接続されることが確認できたら 、今度こそ Raspberry Pi を再起動します。
reboot
上のリンクで紹介した、「Raspberry Piで無線LANの反応が悪い時の対処法」に記載されているとおりですが、パワーマネジメント機能が有効になっていると、時々に通信が途切れるたり、反応がもたついたりなど、安定しないことがあります。Realtek社製のチップを使用している場合は、下記の方法でパワーマネジメント機能をオフにします。
まず、 lsusb コマンドを実行して、Realtek Wireless Adapter などと表示されているものがあるか確認します。つぎに、 lsmod コマンドを実行して、8192cuというモジュール名が表示されるか確認します。
root@raspberrypi:/home/pi# cat /sys/module/8192cu/parameters/rtw_power_mgnt 1
「1」と表示されたら、パワーマネジメント機能が有効になっています。
ファイルを編集します。なければ新しく作ります。
options 8192cu rtw_power_mgnt=0
他にも、 rtw_enusbss=0|1 、 rtw_ips_mode=0|1 などの設定があるようですが、よくわかりません。フォーラムに少し説明が載っています。
root@raspberrypi:/home/pi# reboot
root@raspberrypi:/home/pi# cat /sys/module/8192cu/parameters/rtw_power_mgnt 0
「0」と表示されたら、パワーマネジメントがオフになっています。これで通信が安定すると思います。