Raspberry Pi Zero W をキーボード、マウス、ディスプレイなし (ヘッドレス) でセットアップ

何番煎じかわからないが、Raspberry Pi Zero W のセットアップ手順をまとめる。
OS インストール、自宅 Wi-Fi への接続、自宅 Mac から SSH でアクセスできるようにするまでを、ヘッドレス（外付けマウス・キーボード・ディスプレイを使用しない）で完結する。

# 0. 必要なもの
- Raspberry Pi Zero WH (Hはピンヘッダ付きを指す）
    - [スイッチサイエンス](https://www.switch-science.com)から購入
- micro SD カード (今回は家に転がっていた 16GB ものもを使用）
- MacBook Pro (15-inch, 2018) MacOS Catalina
- SD カードリーダー (USB-C 接続タイプ)
- 自宅 Wi-Fi 環境

# 1. Raspberry Pi OS (旧名称:Raspbian) インストール
従来、SD Card Formater で SD カードをフォーマット後、Raspbian OS のイメージファイルをダウンロードし、Wn32 Disk Imager で SD カードにコピーをしていたが、最近は `Raspberry Pi Imager` なるツールが公式にリリースされており、このツールを使えば SD カードのフォーマット、OS の選択から SD カードへのコピーまでひとつのソフトででき、とても便利。
（2020 年 5 月に正式名称が Raspbian から Raspberry Pi OS へ変更された、らしい)

## Raspberry Pi Imager を Mac へインストール
以下から DL し Mac へインストールする。
https://www.raspberrypi.org/downloads/

## Raspbian OS を SD カードにインストール
Mac へインストールした Raspberry Pi Imager を起動し、
0. SD カードの FAT32 フォーマットがまだであればこのツールでそれも可能 (※1)
1. ラズパイにインストールしたいOSを選択
2. インストール先の SD カードを選択
3. インストール (※2)
※1. Mac のディスクユーティリティーだと FAT32 でフォーマットできないようなので（知らないだけ？）、Raspberry Pi Imager にある Erase という機能を使って SD カードを Erase すると FAT32 にフォーマットされてよい。
※2. 自分の環境だとフォーマットからインストール完了まで15分くらいだった。]

↓Raspberry Pi Imager を起動した状態
![スクリーンショット 2020-08-29 22.59.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186524/2d7a9a4c-7d97-7e1a-9900-b428e803c46e.png)
↓今回は Raspberry Pi OS を選択
![スクリーンショット 2020-08-29 23.01.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186524/2d324221-7be7-4425-58b9-c9a3bdea8f53.png)
↓YESでインストール開始
![スクリーンショット 2020-08-29 23.02.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/186524/8cdb2fc0-3aa1-5635-9449-963910240db8.png)





# 2. Wi-Fi ネットワークへの接続、SSH 有効化
## Wi-Fi の設定
自宅 Wi-Fi の設定を Raspberry Pi にほどこしてやります。まだ Mac から SD カードは抜きません。
Mac から SD カードが取り出されている状態であれば一度 SD カードを抜き、再度挿してください。Finder から boot ドライブが見えていればOK。Mac のターミナルを開き、以下のように SD カードの boot ディレクトリに wpa_supplicant.conf という Wi-Fi の設定ファイルを作成します。ファイル内の Wi-Fi の SSID とパスワードは自宅の環境に合わせて入力してください。
(インストール後のラズパイ側から参照する時は /etc/wpa_supplicant/wpa_supplicant.conf)

```bash:Macのターミナルで実行
$ vi /Volumes/boot/wpa_supplicant.conf
```

```wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP

network={
 ssid="Wi-FiのSSID"　#注意：5GHz帯だめ。2.4GHz帯
 psk="Wi-Fiのパスワード"
}
```

## SSH の設定
ラズパイはセキュリティの観点からデフォルトでSSH無効になっている。ヘッドレスなのでログインして `raspi-config` を実行することもできない。
まだ SD カードは Mac から抜かず、Mac のターミナルを開いて以下コマンドで、SD カードの boot ディレクトリに ssh という名前の空ファイルを作成します。

```bash:Macのターミナルで実行
$ touch /Volumes/boot/ssh
```
これで Raspberry Pi の初回起動に SSH が有効化されます。

ここまでで、自宅 Wi-Fi 環境に接続し、SSH ログインを受け付ける準備が整いました。Mac から SD カードを抜き、ラズパイに挿し、電源ON。
ラズパイが立ち上がるのを数十秒待ったところで、Mac のターミナルから以下を実行。

```bash:Macのターミナルで実行
$ ssh pi@raspberry.local
```
Macとラズパイが同一ネットワーク上にあればこれでパスワード入力画面が出てくるはず。
うまくいかない場合 Mac 側の `known_hosts` に過去に使用した別のラズパイの MAC アドレス等が残っているせいかもしれないので Mac 側の `known_hosts` から `raspberry.local` の行を削除する。

```bash:Macのターミナルで実行
$ vi ~/.ssh/known_hosts　<-これを vi エディタ等で開き raspberry.local の行があれば削除
```

それでもうまく行かない（該当しない）場合は力技。`arp -a` コマンドでネットワーク内に存在する機器のIPアドレスが列挙し、

```bash:Macのターミナルで実行
$ arp -a
? (10.148.252.**) at 0:60:b9:**:**:** on en0 ifscope [ethernet]
? (10.148.253.**) at 14:20:5e:**:**:** on en0 ifscope [ethernet]
? (10.148.253.**) at 90:8d:6c:**:**:** on en0 ifscope [ethernet]
? (10.148.253.***) at b8:27:eb:**:**:** on en0 ifscope [ethernet]
? (10.148.253.***) at 90:8c:43:**:**:** on en0 ifscope [ethernet]
? (10.148.253.***) at b8:27:eb:**:**:** on en0 ifscope [ethernet]
〜以下省略〜
```
順に ssh 接続を試みる

```
$ ssh pi@10.148.253.xxx
pi@10.148.253.xxx's password:
```

ヒットすれば上記のようにパスワード入力待ち状態となるのでパスワードを入力してログイン

```
Linux raspberrypi 5.4.51+ #1333 Mon Aug 10 16:38:02 BST 2020 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: Thu Sep  3 23:08:05 2020 from 10.148.253.xxx
```

無事ラズパイに SSH ログイン成功。
*※過去に同じ Mac から別のラズパイ (但し IP アドレスが同一) に SSH ログインした履歴があるときは Mac に known_hosts として記録されており、うまくいかない。`$ vi ~/.ssh/known_hosts` で当該 IP の行を削除する*

#3. その他、初期設定
## パスワード変更
```
$ passwd
```
でパスワード変更しておく。

## SSH 有効化 (恒久的に)
raspi-config で SSH を恒久的に有効化しておく（※シャットダウン前に必ずこれやらないと touch で ssh ファイル作ってもなぜか connection refused になる。。）

```
$ sudo raspi-config
```

## emacs インストール
emacs (エディタ) も入れておく（お好みで）

```bash
$ sudo apt-get update
$ sudo apt-get install emacs
```


## IPアドレス固定
次に、IPアドレスを固定
*いままで使用していないIPが良さそう。理由はわからないが使用履歴のあるIPだとconnection refused になる。。*
**/etc/dhcpcd.conf** の末尾に以下内容を記述することで設定する。

```bash
$ sudo vi /etc/dhcpcd.conf
```

```shell-session:dhcpcd.conf
~中略~
interface wlan0
static ip_address=(固定したいIPアドレス)/(サブネットマスク) #例)192.168.1.10/22
static routers=(ルータのIPアドレス) # 例)192.168.1.1
static domain_name_servers=(DNSのIPアドレス) #例)8.8.8.8など
```
設定完了したら再起動。

以上で完了です。これで Mac さえあれば SSH でラズパイをいじることができるのでラクですね。