ラズパイ3 で「テレビもねぇ マウスもねぇ 有線LANって何者だ」な時のブートディスク作成

テレビ（モニタ）も無い、マウスも無い、キーボードも無い。

そんな WiFi と MacBookPro と SD カードアダプタしかない「ど田舎」で、**RaspberryPi3（Raspbian OS Lite）を新規セットアップ ＆ SSH 接続を可能にするサバイバル設定方法**。LAN ケーブルなんか、もちろんないよ。

## TL;DR

> ブートディスク（SD カード）にあらかじめ、「WiFi の接続設定ファイル」と「SSH 接続許可ファイル」を設置しておき、WiFi 経由でラズパイに SSH 接続して設定する。

Jessie Lite だけでなく Stretch Lite/Buster Lite でも同じ手順で動作しました。

## TS;DR（サバイバル環境下でラズパイ3をセットアップする）

ヘッドレス[^1]な RaspberryPi3 に Raspbian（Jessie Lite）を新規にインストールして WiFi 経由で SSH 接続する必要がありました。タイトルにあるような極めて限定された条件下で[試行錯誤した](https://blog.keinos.com/20170803_2844)結果をまとめました。（Buster Lite のより詳しい手順は[こちら](https://qiita.com/KEINOS/items/43394e4bd3c8fcfb5ee8)）

[^1]: 【ヘッドレスとは】 モニタやキーボードなどのインターフェースをつなげずに動かす状態のこと。主にサーバー用途などで使われる。モニタをつなげないため、デスクトップ環境（[X Window](https://ja.wikipedia.org/wiki/X.Org_Server)）など GUI によるリソース消費がもったいないので、GUI 系のライブラリやプログラムを含まない軽量の OS が使われることが多い。Raspbian OS の場合は、"`lite`" が OS の後ろに付く。例： Jessie Lite/Buster Lite など

1. Mac で [Raspbian OS のイメージ](https://www.raspberrypi.org/downloads/raspbian/)をダウンロードする。ヘッドレス用途がメインなら軽量版の `Lite` を選ぶ。<br><sup>（ダウンロードしたファイルのチェックサム（SHA-256 の値）を確認したい場合は `shasum -a 256 ファイル` で確認する）</sup>

2. [Etcher](https://www.balena.io/etcher/) でイメージを SD にコピーする。<br><sup>（`boot` という名前で初期化される。書き込み後 Finder や `/Volumes` に表示されない場合は、SD カードリーダーを抜き差しする）</sup>

3. SD カードの `/boot` 直下に ssh ファイルを置く。（空でよい）

    ```php:bash
    $ touch /Volumes/boot/ssh
    ```

4. SD カードの `/boot` 直下に `wpa_supplicant.conf` ファイルを置き WiFi 設定を記載する。<br>**国コードがポイント**。psk は`""`で囲うこと。

    ```php:bash
    $ sudo vi /Volumes/boot/wpa_supplicant.conf
    ```

    ```conf:wpa_supplicant.confの内容
    country=JP
    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
    network={
    	ssid="<YOUR SSID>"
    	psk="<YOUR PASSWROD>"
    }
    ```
    - <sup>**既存のラズパイが別途ある場合**は設定ファイルをコピーしても可能、その場合は `/etc/wpa_supplicant/wpa_supplicant.conf` にあるファイルをコピーすること。</sup>
    - <sup>**ラズパイ3 の WiFi は 2.4GHz** です。アクセスポイントが 5GHz だとつながらないので注意。</sup>

5. SD カードをラズパイ3に挿して、電源投入。<br><sup>（ラズパイの LED が定期的に点滅している場合はエラーが発生しています。文末の参考文献参照）</sup>

6. `raspberrypi.local` に PING を飛ばし、現れたら[デフォルトのアカウント](https://www.raspberrypi.org/documentation/linux/usage/users.md)（ユーザーを "`pi`"、パスワードを "`raspberry`"）で `ssh` 接続して設定を続ける。<br><sup>（`ping` が戻ってこない場合、`bonjour` による名前解決が出来ていない可能性もあります。IP アドレスで `ping` を飛ばしてみたいと思うも「DHCP で IP わからん」系の場合、ラズパイの起動前・起動後でネットワーク上にラズパイがいるか [arp コマンドを使って調べてみる](https://qiita.com/Reetok/items/033e013eab09483e37fa#ip%E3%82%A2%E3%83%89%E3%83%AC%E3%82%B9%E6%A4%9C%E5%87%BA)のも手だと思います。）</sup>

    ```shell-session
    $ ssh -l pi raspberrypi.local
    The authenticity of host 'raspberrypi.local (fe80::0000:0000:0000:0000%en0)' can't be
    established.
    ECDSA key fingerprint is SHA256:og46cbmOXd36c3N4ntXXXXXXXXXXXXXXXXXXXXXXXXX.
    Are you sure you want to continue connecting (yes/no)? yes
    Warning: Permanently added 'raspberrypi.local,fe80::0000:0000:0000:0000%en0' (ECDSA) to
    the list of known hosts.
    pi@raspberrypi.local's password: <パスワード>
    Linux raspberrypi 4.19.57+ #1244 Thu Jul 4 18:42:50 BST 2019 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.
    -bash: warning: setlocale: LC_ALL: cannot change locale (ja_JP.UTF-8)

    SSH is enabled and the default password for the 'pi' user has not been changed.
    This is a security risk - please login as the 'pi' user and type 'passwd' to set a new
    password.
    
    pi@raspberrypi:~ $ 
    pi@raspberrypi:~ $ sudo raspi-config
    ```

以上

### 設定のポイント

**国コードを指定すること**。国コードが指定されていないと、国ごとに許可された（ WiFi の）周波数帯を特定できないため、接続先を解決できません。吸った揉んだしたのですが、ネットのどの情報も SSH の設定だけだったり、有線 LAN での初期セットアップ後が前提で、どこも「<strong>WiFi と SSH Ready な状態</strong>でブートディスクを作る」方法と「国コード」に言及していなかったので記事にしました。

### 検証環境（実績のある機器の型番など）

1. MacBookPro と WiFi 環境
    - MacBookPro（Retina, 13in, Early2015, 8GB）
    - macOS Sierra（OSX 10.12.6）
    - 2.4GHz(g), WPA2-PSK+AES, BUFFALO
2. RaspberryPi3
    - BCM2835, Rev.A22082
3. ブランクの microSD カードと USB SD カードリーダー
    - Digio2 CRW-38M56BK（ナカバヤシ株）
    - Transcend 16GB microSD HC I
4. ラズパイ用電源アダプタと電源用USBケーブル×１本
    - GCF315S-0630（株ケイエスワイ）×付属ケーブル

セットアップに**普通は必要だけどないもの**「HDMI モニタ、HDMI ケーブル、USB マウス、USB キーボード、HUB やルーター、LAN ケーブル、LAN アダプタ、OTG 対応の USB ケーブル」

## 参考文献

### Wi-Fi

> If a `wpa_supplicant.conf` file is placed into the `/boot/` directory, this will be moved to the `/etc/wpa_supplicant/` directory the next time the system is booted, overwriting the network settings; this allows a Wifi configuration to be preloaded onto a card from a Windows or other machine that can only see the boot partition.
> （[Tweaks | The latest update to Raspbian](https://www.raspberrypi.org/blog/another-update-raspbian/) @ ラズパイ公式ブログ より）

### SSH

> **3. Enable `SSH` on a headless Raspberry Pi (add file to SD card on another machine)**
> 
> For headless setup, SSH can be enabled by placing a file named `ssh`, without any extension, onto the boot partition of the SD card from another computer. When the Pi boots, it looks for the `ssh` file. If it is found, SSH is enabled and the file is deleted. The content of the file does not matter; it could contain text, or nothing at all.
>
> If you have loaded Raspbian onto a blank SD card, you will have two partitions. The first one, which is the smaller one, is the boot partition. Place the file into this one.
> （[Enable SSH on a headless Raspberry Pi | SSH (Secure Shell)](https://www.raspberrypi.org/documentation/remote-access/ssh/README.md) @ ラズパイ公式ドキュメント より）

### LED の点滅によるエラー

> - 3 flashes: start.elf not found
> - 4 flashes: start.elf not launch-able (corrupt) See below:
> - 7 flashes: kernel.img not found
> - 8 flashes: SDRAM not recognized. You need newer bootcode.bin/start.elf firmware, or your SDRAM is damaged
>
> **Potential reason for 4 flashes.**
> Note that 4 flashes could be an indication of a more or less broken SD-card connector. If Databit 1 is connected, but one of the other three Databits doesn't make contact, so the SD-card only works in 1-bit (SPI) mode, then this will lead to the four flashes error! Check if all pins of your card holder make good contact with the card!
> 
> （[Error ACT LED patterns | Is your Pi not booting? (The Boot Problems Sticky)](https://www.raspberrypi.org/forums/viewtopic.php?p=437084#p437084) @ ラズパイ公式フォーラム より）