RaspberryPi ZeroW に Raspbian をインストールし、公開鍵で SSH 接続出来るようにする

# 謝辞
こちらの記事を書くにあたり、下記の Qiita を非常に参考にさせて頂きました。

- Raspberry Pi Zero(W)のセットアップ  
[http://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573](http://qiita.com/hishi/items/8bdfd9d72fa8fe2e7573)

この記事は上記などの記事をもとに、自分なりの手順で行った備忘録も兼ねて書いています。

# 対象
- RaspberryPi Zero W を入手したは良いがまず何をすれば良いかわからない人 (自分)
- mac を普段使っていて、セットアップするためだけにモニタやキーボードをつなげたくない人 (自分)

# ゴール
- RaspberryPi ZeroW に Raspbian をインストールし、公開鍵で SSH 接続出来るようにする

# 物理的に準備するもの
- RaspberryPi ZeroW 本体
- セットアップに使う mac
- 適当な容量の microSD カード
- microSD リーダー・ライター
- ZeroW と mac をつなぐ microUSB ケーブル
- SSID とパスワードがわかっている 無線 LAN 環境

# 作業の流れ

1. Raspbian のイメージをダウンロードする
1. dd コマンドで microSD に書き込む
1. mac のターミナルから SSH できるようにする
1. ZeroW に microSD を挿して起動する
1. SSH で ZeroW に入り無線 LAN のセットアップを行う
1. raspi-config で microSD の領域をフルに使えるようにする
1. vim をインストールする
1. 無線 LAN IP アドレスを固定にする
1. .ssh/config に設定を追加する
1. 公開鍵で SSH に入れるようにする
1. ついでに nginx とかインストールしてみる

## Raspbian のイメージをダウンロードする

[https://www.raspberrypi.org/downloads/raspbian/](https://www.raspberrypi.org/downloads/raspbian/) から RASPBIAN JESSIE LITE の ZIP 版をダウンロードし、解凍します。拡張子が img のファイルができるはずです。

このファイルを次の手順で microSD に書き込むのでダウンロードした場所は覚えておきましょう。

## dd コマンドで microSD に書き込む

1. microSD をリーダー・ライタにセットして mac とつなげます
2. ディスクユーティリティを起動して接続されている disk の情報を確認します
3. microSD がマウントされていたら、アンマウントします
4. ターミナルを起動しダウンロードしたイメージをファイルがあるディレクトリに移動します
5. ディスクの情報を参考にして下記のコマンドを実行します  
**※ dd コマンドを使う際には if(転送元) と of(転送先) を間違えないように気をつけてください。意図せずファイルやディスクが破壊されても責任は負いかねます**  

```
[mac]
sudo dd bs=1m if=[転送元のイメージファイル] of=[転送先のデバイス] conv=sync
```

- ダウンロードしたイメージファイルが 2017-07-05-raspbian-jessie-lite.img 
- ディスクユーティリティで確認した microSD の情報が disk2

というケースの場合は、下記のようになります。

```
[mac]
sudo dd bs=1m if=2017-07-05-raspbian-jessie-lite.img of=/dev/rdisk2 conv=sync
```

ここまでの手順で作成した microSD でひとまず起動は出来るようになります。次に mac から SSH で接続するための準備をします。

## mac のターミナルから SSH できるようにする

1. イメージを書き込んだ microSD を改めて mac に接続します。boot というのが見えているはずです。
2. ターミナルを起動して boot に移動します。
	例：```[mac] cd /Volumes/boot```
3. ```[RasPi] touch ssh``` と入力します  
4. ```cmdline.txt``` を開き ```rootwait``` のあとに  
	```
	[RasPi]
	modules-load=dwc2,g_ether 
	```
	と追記します。  
	
	下記は cmdline.txt 全文です。見やすさのため改行していますが実際には一文です。  
	
	```
	[RasPi]
	dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 
	root=PARTUUID=3de82442-02 rootfstype=ext4 elevator=deadline 
	fsck.repair=yes rootwait modules-load=dwc2,g_ether
	```

5. config.txt の最後に ```dtoverlay=dwc2``` と追記します。

	```
	[RasPi]
	echo "dtoverlay=dwc2" >> /Volumes/boot/config.txt
	```

これで mac のターミナルから接続できる準備が整いました。

## ZeroW に microSD を挿して起動する

ようやく ZeroW 本体の出番です。

先程までの手順で作成した microSD を ZeroW にセットして、mac と ケーブルで接続します。
ZeroW には 電源用の USB ポートと、I/F としての USB ポートがありますが、I/F の方につなぎます。

緑色の LED がチカチカしはじめますので1,2分くらい待ちましょう。

LED の点滅が落ち着いたら起動が完了しているはずです。

なお USB ハブなどを経由していると電力が足りなくなる可能性もあるので、その場合は mac と直接接続してみてください。

## SSH で ZeroW に入り無線 LAN のセットアップを行う

ここまでの時点ではまだ ZeroW は 無線LAN などにはつながっていません。

ですが bonjour のおかげで mac から SSH で入ることはできます。

ターミナルから下記のコマンドで SSH で入れます。

```
[mac]
ssh pi@raspberrypi.local
```

初期パスワードは

```
raspberry
```

です。

SSH で無事に入れたらまずは 無線LAN のセットアップをしましょう。

アクセスポイントの SSID と パスワード を用意して下記のコマンドを実行します。
([SSID] と [PASSWD] は自身の環境のものに置き換えてください) 

```
[RasPi]
sudo sh -c 'wpa_passphrase "[SSID]" "[PASSWD]" >> /etc/wpa_supplicant/wpa_supplicant.conf'
sudo wpa_cli reconfigure
```

上記のコマンドが成功したら

```
Selected interface 'wlan0'
OK
```

と表示されるはずです。

ここまでできたらすでに無線 LAN でネットにつながっているはずなので、適当に ping でも打って通るか確認すると良いでしょう。

## raspi-config で microSD の領域をフルに使えるようにする

dd コマンドでイメージを書き込んだ場合は、基本的にもとのイメージがそのままディスクの領域になっているので、今のままでは microSD の領域が全て使えるようになっているわけではありません。

フルに使えるようにするには

```
[RasPi]
sudo raspi-config
```

を実行して

```Advanced Option -> Expand Filesystem```

を選択します。

その後、再起動するとすべての領域が使えるようになります。

再起動は

```
[RasPi]
sudo reboot
```

です。

raspi-config コマンドでは Locale の設定なども行えますので、必要に応じて設定してください。

## vim をインストールする

vim をインストールするのは必須ではありませんが、個人的にはこの段階でやってしまったほうが、以降の手順の設定ファイルの書き換えがやりやすいので、この段階でインストールします。

```
[RasPi]
sudo apt-get update
sudo apt-get install -y vim
```

.vimrc という設定ファイルを作成し、下記のように記述します。
とはいえ単なる設定ファイルなのでご自由に。

```
set nocompatible
set backspace=indent,eol,start
```

## 無線 LAN IP アドレスを固定にする

IP アドレスを固定にするには
```
[RasPi]
/etc/network/interfaces
```
というファイルを編集します。

**※ mac アドレスに応じてルーター側で設定する場合はこの項目の処理は不要です。**

```
allow-hotplug wlan0
iface wlan0 inet manual
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
```

という箇所があるので下記のように編集します。
```192.168.1.101``` や ```192.168.1.1``` の部分は自身の環境に合わせて設定してください。

```
allow-hotplug wlan0
iface wlan0 inet static
    wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf
    address 192.168.1.101
    netmask 255.255.255.0
    gateway 192.168.1.1
```

編集したあと、再起度します。

```
[RasPi]
sudo reboot
```
※ 自分の環境ではなぜか ifdown ifup ではフリーズしてしまいましたので、やむを得ず再起動しています。

再起動後は上記の設定の場合 

```
[mac]
ssh pi@192.168.1.101
```

で SSH 接続が可能になります。

ここまでくれば、mac とつながっている USB ケーブルも不要になりますので電源を確保して外してしまいましょう。

## .ssh/config に設定を追加する

公開鍵の設定のまえに、毎回 ```[mac] ssh pi@192.168.1.101``` と打つのは面倒なので```./ssh/config```に設定を追加します。

mac でホームディレクトリに行き```[mac] .ssh/config```ファイルに下記の記述を追加します。

```.ssh/config``` がなければ作成します。

```
Host raspi0
    HostName 192.168.1.101
    User pi
```

これで以後は

```
[mac]
ssh raspi0
```

と入力すると

```
[mac]
ssh pi@192.168.1.101
```

と同じ事になります。

## 公開鍵で SSH に入れるようにする

mac のターミナルから ```ssh raspi0``` で ZeroW に入ったあと、公開鍵の設定をしておくファイルを準備します。

※ 公開鍵の作成方法は割愛しますが ```~/.ssh/id_rsa.pub``` という公開鍵ファイルが作成されているものとします。

```
[RasPi]
mkdir .ssh
touch .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys
```

このあと mac のターミナルに戻り

```
[mac]
cat ~/.ssh/id_rsa.pub | ssh raspi0 'cat >> .ssh/authorized_keys'
```

と実行すると、公開鍵の設定は完了です。

以後はパスワード無しで ```ssh raspi0``` で SSH できるようになります。

## ついでに nginx とかインストールしてみる

```
[RasPi]
sudo apt-get install -y nginx
```

ひとまず、これだけでOKです。

インストールが完了したらブラウザから```http://192.168.1.101/``` にアクセスすると、nginx の初期画面が見えるはずです。


# 最後に

ここまでの作業は外部に公開する際の定番的な作業はなにもしていないので、必要に応じて SSH のパスワードログインを禁止するとか、ちゃんとユーザーをつくるとかしてください。(そして教えてください)

これでひとまずベースとなる感じの設定は完了です。お疲れ様でした！

これからまともに使えるように勉強します！