Raspberry Pi Raspbian Wheezy(2015-05-05)で最速Wi-Fiセットアップ

Raspberry Pi用OSインストーラー、NOOBS v1.4.1(2015-05-11)でインストールされるRaspbian Wheezy(2015-05-05)では、Bonjourのオープンソース実装``Avahi``が最初から稼働しているなど、Raspberry Piの実運用に即した更新がされています。時期的にRaspberry Pi用Debian 8 Jessieの登場も見えてきているので、Raspbian Wheezyを使った場合の定番のWi-Fiセットアップになるよう、まとめました。

（2015-09-30追記）
Debian 8 JessieベースのRaspbianリリースの発表がありました。
[Raspberry Pi's Raspbian Rebased To Debian 8 "Jessie" - Phoronix](http://www.phoronix.com/scan.php?page=news_item&px=Raspbian-Jessie-Released)

# 忙しい人のためのWi-Fi設定方法まとめ

1. Raspberry Piに①HDMIモニタ②USBキーボード③USB Wi-Fiアダプタ **バッファロー WLI-UC-GNM**または**プラネックス GW-USNANO2A**をつなぐ
1. ``NOOBS v1.4.1``で**Raspbian Wheezy(2015-05-05)**をインストール
1. 初回表示される**``raspi-config``をいきなり［Finish］**してコンソールへ
1. Wi-Fiルータの**WPSプッシュボタン**を押す
1. Raspberry Pi側で**``sudo wpa_cli wps_pbc``を実行してWPS認証**をする
1. 1分ぐらい待ち``ifconfig``で**wlan0にDHCPでIPアドレスが振られた**ことを確認
1. **一巻の終わり**（この時点で他のホストからSSHログインできるようになっている）

追加作業として、

* 他のホストからsshを使い``pi``ユーザでログイン
* Wi-Fiアダプタの省電力防止設定を以下で入れます

```sh:WLI-UC-GNM
sudo sed /etc/network/interfaces -i -e '/wpa-conf \/etc\/wpa_supplicant\/wpa_supplicant.conf/i wireless-power off'
```

```sh:GW-USNANO2A
echo "options 8192cu rtw_power_mgnt=0 rtw_enusbss=1 rtw_ips_mode=1" | sudo tee /etc/modprobe.d/8192cu.conf
```

* ``sudo raspi-config``で先ほど飛ばした設定作業を続行してもいいですね

## せっかちな人のための従来の方法との違い

従来のやり方と比較して、

* ``/etc/network/interfaces`` に、**よくわからない記述をする必要が無い**
* ``/etc/wpa_supplicant/wpa_supplicant.conf`` に、**よくわからない記述をする必要が無い**
* 使用する**USB無線LANアダプタがバッファロー WLI-UC-GNM**または**プラネックス GW-USNANO2A**に決め打ち
* **Wi-FiルータがWPS認証できる**ことが前提

というあたりが違います。

## ほかのUSB Wi-Fiアダプタはダメなの？

USB無線LANアダプタは、Raspbian Wheezy側にドライバがあること、ドライバがアダプタの同定ができることで、接続するだけで利用できます。そうでない場合は、ドライバにアダプタの情報を教えてあげたり、ドライバを用意したりする必要があります。

### 挿すだけで認識するアダプタ（今回取り上げた、検証済みのもの）

* **Buffalo WLI-UC-GNMシリーズ**（rt2800usb）<br />WLI-UC-GNM／WLI-UC-GNM2／WLI-UC-GNM2T／WLI-UC-GNMEと何世代かあり、WLI-UC-GNMは当方で利用、WLI-UC-GNM2はネット上で接続実績があります。2015/8から現行製品のWLI-GNMEは他の方のレポートを見ると同じ方法で行けるらしい。http://qiita.com/nownabe/items/a6ec3dfcfcb6ab37ea1e 消費電流は通常時で200mA流れるので大量に通信するようとだと熱で自己破壊を起こすかも。当方も1機壊れた。
* **プラネックス GW-USNANO2A**（rtl8192cu）<br />挿すだけで認識する。WLI-GNMとは低速化回避方法が違う（後述）。消費電流は通常時で50mAと比較的少ないので多い日も安心。

### 挿すだけで認識するアダプタ（当方では未検証）

* **ロジテック LAN-WH300NU2**・**アイ・オー・データ IO-DATA WN-G300UA**（rtl8192cu）<br />挿すだけで認識するとあるので、プラネックス GW-USNANO2Aとみなして今回の方法でセットアップできると思うが、持っていないので試していない。低速化回避方法は後述のプラネックス GW-USNANO2Aの場合を参照。

### 追加設定が必要なアダプタ

Wi-Fiアダプタ購入前ならRaspberry Piに挿すだけでは使えないアダプタはなるべく避けるべきですが、手持ちのアダプタを使ってみた場合もあるよね……

- **バッファロー WLI-UC-GNP**（rt2800usb）<br />ドライバは存在しているが、ドライバがそのUSBデバイスを知らないので動かない。使えるようにするにはUSBアダプタのベンダID・デバイスIDを設定する必要がある http://qiita.com/github0013@github/items/e78577039c29447b2235
- **IO-DATA WN-G150UM**（rtl8192cu）<br />ドライバは存在しているが、<span style="text-decoration: underline;">ドライバがそのUSBデバイスを知らないので動かない</span>。使えるようにするにはUSBアダプタのベンダID・デバイスIDを設定する必要がある http://marm.cocolog-nifty.com/jokanaan/2012/12/wn-g150um-on-ra.html Interface誌2015/9でも書いてた
- **エレコム WDC-150SU2M**（rtl8188eu）<br />ドライバをビルドしなくちゃならん http://qiita.com/amutake/items/8f0e23c59442379a05bf
- **プラネックス GW-450D**（mt7650u_sta）<br />[プラネックス自身がドライバビルド方法を書いている](http://www.planex.co.jp/articles/RaspberryPi_GW-450D/index.shtml)のだが工程がけっこうマゾいし現行Raspberry Piだと動かないとかで別の方法があるみたい http://qiita.com/tsukaman/items/44abe042d2184c021b4b

# 最速Wi-Fiセットアップのための機材

* Raspberry Pi A+
    * ちいさい。うすい。省電力。
    * USBが1ポート。
    * Raspberry Pi B+でもいいよ。
* 2ポートUSBハブ
    * Raspberry Pi A/A+だと、Wi-Fiとキーボードでどうしても2ポート必要。
    * Raspberry Pi BやB+なら、本体に2ポート以上あるので、いらない。
* USBキーボード
    * ポインティングデバイス付だとなおよいですね。
* HDMIモニタ
    * 1920x1080が表示できる実モニタがベスト。
    * HDMI⇒VGAアダプタはインストール直後だとほぼ表示できないのでNG（マゾならそれはそれでがんばれ）。
* USB Wi-Fiアダプタ バッファロー WLI-UC-GNM or プラネックス GW-USNANO2A
    * 今回は2機種で決め打ち。
    * Wi-Fiアダプタについては[Interface誌 2015年9月号](http://shop.cqpub.co.jp/hanbai/books/MIF/MIF201509.html)がなぜか詳しい。
* 4GB microSDカード
    * セットアップ直後のフリーエリアは155MB。
    * sudo apt-get upgradeするとフリーエリアが22MBになって詰む。
    * SonicPiなどGUI用のアプリ消せば何とか。
    * 4GBはインストールテスト用だよね……

![raspi-aplus.jpg](https://qiita-image-store.s3.amazonaws.com/0/50435/a7db1e22-6a3d-f6f0-ab6f-25c3a7db1aca.jpeg)

## NOOBSセットアップ時のTips

NOOBSのグラフィカルインストーラー操作の際、HDMIモニタや、HDMI⇒VGAアダプタで画面表示ができない場合は、フルキーボード側の``1``もしくは``2``を押すと、**HDMIポートの再ネゴシエーションが働き、モニタ表示ができるようになる**ことがあります[^1]。

当方、VGA入力の液晶モニタCentury LCD-8000V＋謎のHDMI⇒VGAアダプタで確認しています。

![zatu-hdmi-vga-adaptor.jpg](https://qiita-image-store.s3.amazonaws.com/0/50435/e42cceef-e3d1-e5f6-7f87-5ce3b94a9027.jpeg)

謎、ていうよりも、雑ではないだろうか……さすがにその位置の水晶は設計とは違うんじゃないだろうか……

# [本題]Raspbian ブートアップ後の作業

作業は、NOOBSによるグラフィカルインストーラにより、Raspbianのインストールが終了した後の初回ブートアップ完了直後から始めます。

Raspbian初回ブートアップ時は、自動的にフルスクリーン設定メニュー``raspi-config``が起動するようになっていますが、これをおもむろに［Finish］で終わらせます（/etc/inittab が書き換わり、/etc/profile.d/raspi-config.sh が削除され、二回目以降のブートでは表示されなくなります[^2]）。

画面は、``pi``ユーザのコンソールに切り替わります。

## /etc/network/interfaceはいつものmanual⇒dhcpやwpa-conf⇒wpa-romeの書き換えは不要

よく「/etc/network/interface の ``iface default inet manual``を``iface default inet dhcp``に書き換える」というふうに書いている記事がありますが、Raspbianでは、ネットワークインタフェースの有効化の時点ではなく、バックグラウンドで動いている別のデーモンであとからDHCPで配られたIPをネットワークアダプタに割り当てる方式なので、**/etc/network/interface にてDHCPから割り振りを受ける仕組みを利用する必要はありません**。

また、``wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf`` を ``wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf``に書き換えるという記事も多いですが、現Raspbianでは、wpa_supplicant.confの中に``wpa-roam``が存在せず、**あらかじめすべて``wpa-conf``になっています**ので、これも作業は不要です。

それらの代わりに、Wi-Fiアダプタが省電力モードに入って通信が切れがちになる不具合を解消するオプションを、SSH接続が可能になったあとに入れます。

## WPSによるWi-Fi接続認証の自動設定

現在販売されているWi-Fiルータは、WPSによる接続認証の自動化ができるようになっています。これは、接続認証をしたいときだけ一時的にWi-Fiルータのモードを切り替えてWPS認証受け入れ態勢にして、Wi-Fi機器側でWPS認証を要求して接続認証のネゴシエーションを行うというものです。

この仕組みにより、Wi-Fiルータが提供するアクセスポイントのSSID名、パスフレーズ、認証方式など複雑な設定を手入力せずに認証が可能となります。

さて、今回利用したバッファロー WLI-UC-GNMは、Raspbianでは最初からドライバが入っているので、USBポートに挿すだけで既に動作しているのですが、Wi-Fiルータのアクセスポイントとの接続認証がまだ行われていない状態なので、ネットワークに参加できていない状態でいます。

よって、ここでWi-FiルータをWPS認証受け入れモードに切り替えて、Raspbeery PiからWPS認証を実行することで、ネットワークに参加できるということになります。

### A. ルータのWPSプッシュボタンを押す場合

まず、ルータのWPSプッシュボタンを押して（長押しで動作開始になる機種が多い）、プッシュボタン式WPS認証受け入れモードへ切り替えます。

つぎに、Raspberry Piのコンソールから以下のように入力します。

```
sudo wpa_cli wps_pbc
```

OKと表示され、バックグラウンドでWPS認証が進み、認証ができたら、/etc/wpa-supplicant/wpa-supplicant.conf にアクセスポイントの設定が追加されています。

### B. ルータのPIN発行によるPINコード式WPS認証の場合

ルータ側で認証用PINを4桁または8桁設定し、もしくはあらかじめPINコードが印刷されていて、機材側でWPS認証するときPINを使う方法です。

まず、ルータに何らかの方法でPINを設定した後にPINコード式WPS認証受け入れモードにします。このルータはPINをユーザが自分で入力できるタイプなので、例えばPINとして"0123"を設定したとします。

![wps-pin.jpg](https://qiita-image-store.s3.amazonaws.com/0/50435/d7ac2a1b-f855-448c-7ef3-a36a13c7c27d.jpeg)

つぎに、Raspberry Piのコンソールから以下のように入力します。"0123"はルータ側に設定されたPINです。

```
sudo wpa_cli wps_pin any 0123
```

OKと表示され、バックグラウンドでWPS認証が進み、認証ができたら、/etc/wpa-supplicant/wpa-supplicant.conf にアクセスポイントの設定が追加されています。

## Wi-Fi認証が終わったら dhcpcd wlan0 の入力は不要

``wpa_supplicant``デーモンによるWi-Fiネットワークアダプタ接続のマネージメントが、DHCPの処理もしてくれるので、手動でDHCPのIP配信リクエストをする必要はありません。

## ifconfigで確認してみよう

``ifconfig``で``wlan0``にIPアドレスが割り当てられているか確認します。

```
pi@raspberrypi ~ $ ifconfig
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:40 errors:0 dropped:0 overruns:0 frame:0
          TX packets:40 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:3696 (3.6 KiB)  TX bytes:3696 (3.6 KiB)

wlan0     Link encap:Ethernet  HWaddr dc:fb:02:XX:XX:XX
          inet addr:192.168.0.2  Bcast:192.168.0.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1
          RX packets:132 errors:0 dropped:16 overruns:0 frame:0
          TX packets:104 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:15103 (14.7 KiB)  TX bytes:16749 (16.3 KiB)

pi@raspberrypi ~ $
```

なお、Raspbian Wheezy(2015-05-05)からBonjourサービスデーモン``Avahi``が最初から動いているので、この時点で``raspberrypi.local``というホスト名がネットワーク内に広告されています。Bonjourデーモンは、それぞれのホストで動いていれば、ブロードキャストされたホスト名を受信して、自ホストの名前解決に割り込んで名前解決をします[^3]。なので、Mac OS Xなら``Rendezvous``改め``Bonjour``サービスが最初から動いているためそのままホスト名を使いSSHでつなげることができますし、Linuxなら``Avahi``、Windowsなら``AppleのBonjourサービス``[^4]を入れておくことでホスト名でアクセスできます。

## 他ホストからSSHログインしてみよう

NOOBS v1.4.1からインストールしたRaspbian Wheezy（2015-5-5）では、あらかじめSSHデーモンが動いていますので[^5]、この時点で他のホストからSSHで接続できます。

### Bonjourサービス環境下

```
[www-data@linux ~]$ ssh pi@raspberry.local
The authenticity of host 'raspberrypi.local (192.168.0.2)' can't be established.
RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.2' (RSA) to the list of known hosts.
password: raspberry
Linux raspberrypi 3.18.11+ #781 PREEMPT Tue Apr 21 18:02:18 BST 2015 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Aug 30 15:02:34 2015 from tty1
pi@raspberrypi ~ $
```

### IPアドレスによる接続

```
[www-data@linux ~]$ ssh pi@192.168.0.2
Finger Print? y
The authenticity of host 'raspberrypi.local (192.168.0.2)' can't be established.
RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added '192.168.0.2' (RSA) to the list of known hosts.
password: raspberry
Linux raspberrypi 3.18.11+ #781 PREEMPT Tue Apr 21 18:02:18 BST 2015 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Aug 30 15:02:34 2015 from tty1
pi@raspberrypi ~ $
```

### 最初に公開鍵転送しちゃうと以降パスワードいりませんね

```
[www-data@linux ~]$ ssh-copy-id pi@raspberrypi.local
The authenticity of host 'raspberrypi.local (192.168.0.2)' can't be established.
RSA key fingerprint is xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx.
Are you sure you want to continue connecting (yes/no)? yes
Warning: Permanently added 'raspberrypi.local' (RSA) to the list of known hosts.
pi@raspberrypi.local's password: raspberry
Now try logging into the machine, with "ssh 'pi@raspberrypi.local'", and check in:

  .ssh/authorized_keys

to make sure we haven't added extra keys that you weren't expecting.

[www-data@linux ~]$
```

```
[www-data@linux ~]$ ssh pi@raspberrypi.local
Linux raspberrypi 3.18.11+ #781 PREEMPT Tue Apr 21 18:02:18 BST 2015 armv6l

The programs included with the Debian GNU/Linux system are free software;
the exact distribution terms for each program are described in the
individual files in /usr/share/doc/*/copyright.

Debian GNU/Linux comes with ABSOLUTELY NO WARRANTY, to the extent
permitted by applicable law.
Last login: Sun Aug 30 15:10:52 2015 from linux.local
pi@raspberrypi ~ $
```

# SSH接続後の作業

SSH接続ができてしまったら、テキストファイルからのコピペなどお手のものなので、設定が捗ります。

## WLI-UC-GNM（rt2800usb）省電力モード禁止設定

``/etc/network/interfaces``に、今回利用するWi-Fiアダプタのバッファロー WLI-UC-GNMが省電力モードに入って通信が切れがちになる不具合を解消するオプション``wireless-power off``を入れます。

```sh:add_WLI-UC-GNM_pm_disabled.sh
sudo sed /etc/network/interfaces -i -e '/wpa-conf \/etc\/wpa_supplicant\/wpa_supplicant.conf/i wireless-power off'
```

see also : http://lowreal.net/2014/01/09/1

## GW-USNANO2A（rtl8192cu）省電力モード禁止設定

GW-USNANO2Aを使った時の省電力モード禁止設定は、以下の通りです。

```sh:add_rtl8192cu_pm_disabled.sh
echo "options 8192cu rtw_power_mgnt=0 rtw_enusbss=1 rtw_ips_mode=1" | sudo tee /etc/modprobe.d/8192cu.conf
```

see also : http://denshikousaku.net/fix-sluggish-response-of-raspberry-pi-wifi-adaptor

## sudo raspi-config で設定続行

```
sudo raspi-config
```

で初回ブート時に表示された全画面設定メニューがSSHコンソールで表示できます。SSHクライアントの状態によっては画面が崩れる場合もありますが、リモートで設定ができますよ。

![raspi-config.png](https://qiita-image-store.s3.amazonaws.com/0/50435/81ba16e7-8f16-05be-719b-0d9b1297c4ee.png)

# まとめ

* ネット上にある資料の謎のファイル書き換えが割と不要
* なるべくデフォルト設定で行きたい人におすすめ
* Wi-Fi認証はWPSを使うならコマンド一行で完了

Wi-Fiさえつながってしまえば、自動構築スクリプトは構築し放題ですよね。``sudo raspi-config``で設定する内容でさえ全部シェルスクリプトでできてしまう[^6]ので、プロビジョニングが捗ることうけあいです！

# つらい

いまの2015-08の時点で``sudo rpi-update``をすると、kernelバージョンが4.0系のやつが落ちてくるのでいろいろ変わっていそうでつらい。

# 脚注

[^1]: NOOBSでしか効かないので、初回ブート時にHDMIに謎モニタがつながっている場合はやっぱり表示できません。
[^2]: ``raspi-config``をエスケープキーで終わらせると、書き換えが起こらないので、次回ブート時もraspi-configが実行される。
[^3]: Avahiを入れることで、``/etc/nsswitch.conf``内で``hosts:      files mdns4_minimal [NOTFOUND=return] dns``と書き換えられ、名前解決シーケンスの途中でAvahiにおける名前解決を担う``mdns4``（マルチキャストDNS）に引き込みされます。
[^4]: Windows用Bonjourサービスは、iTunesを使っているとインストール済みになっている可能性がある。もしくは、[Bonjour - Apple サポート](https://www.apple.com/jp/support/bonjour/) から、「Bonjour Print Services for Windows」を選んでダウンロード・インストールする。
[^5]: ``raspi-config``のメニュー内にSSHを起動するオプションがあるが特に操作は不要
[^6]: ``sudo dpkg-reconfigure --frontend noninteractive locales`` ``sudo dpkg-reconfigure --frontend noninteractive tzdata`` ``sudo dpkg-reconfigure --frontend noninteractive keyboard-configuration`` などを駆使しましょう