Raspberry Pi 初期設定


Raspbianで使う場合の最低限の初期設定のメモ
たまにしかやらなくて覚えてられないのでメモ。

MacOS上でのモニター不要な手順を記す。

この手順は、一応次で試している。

- RASPBERRY PI 1 MODEL B+
- RASPBERRY PI 2 MODEL B
- RASPBERRY PI 3 MODEL B
- RASPBERRY PI 4 MODEL B
- RASPBERRY PI ZERO W

## boot イメージの作成

### 準備
- bootイメージを書き込むMicroSDカードを用意する。
	- 8GB、Class4以上が推奨スペック。
- [Raspberry Pi Imager](https://www.raspberrypi.org/downloads/)をダウンロードしてインストールしておく[^etcher]。
    - MacOSだと `brew cask install raspberry-pi-imager` でインストール可能

もし、Raspiに直接キーボード、モニタを接続して設定するなら次も用意する。

- USBキーボード
- HDMIケーブル（特にRaspi4はまだあまり一般的でないmicro-HDMIなので注意）
- HDMIで接続できるモニタ（テレビでOK）

[^etcher]: 以前は[Etcher](https://etcher.io/)を使っていた

64bit のPiOSを利用する場合には次のURLからさがしてダウンロードしておく

https://downloads.raspberrypi.org/

### Raspberry Pi Imager による設定

Raspberry Pi Imager がアップデートされ書き込みと同時に SSH や Wifi の設定も行えるようになった。
Raspberry Pi Imager を開いて `Ctrl + Shit + X` を同時押しすると設定ダイアログが開く。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32533/6c0b8859-bd65-dddd-e232-54c87b185518.png)

設定できるのは次の項目。

- Disable ovewrscan
- Set hostname
- Enable SSH
    - pi user のパスワード
    - pi user の authorized_key
- Configure wifi
    - SSID
    - Password
    - Wifi country
- Set locale settings

これだけ設定できれば十分というのであればこれで済ませてしまうほうがお手軽。

### BootイメージのSDカードへの書き込み
1. Raspberry Pi Imager を起動する
2. *[CHOOSE OS]* をクリックして利用するイメージを選択する
2. *[CHOOSE SD CARD]* をクリックして書き込み先のSDカードを選択する
3. そして*[WRITE]*ボタンをクリックして書き込み
  ![raspi-imager.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/32533/0884373b-888e-0975-a250-57c9b6302dda.gif)

以下は Raspberry Pi Imager によるイメージ書き込み時の設定を使わずに設定する手順を記載する。

### SSHサーバの有効化

1. Raspberry Pi Imagerによる書き込みが終わったら、自動的にアンマウントされるので、再度SDカードをマウントする。
2. SSHを有効にするために次のコマンドを実行して、ルートフォルダに*ssh*（中身は空）ファイルを作る

```bash
> touch /Volumes/boot/ssh
```

### WiFi接続の有効化

もし、いきなりWiFiで接続したいのなら、SDカードをマウントした状態で次の内容のファイルをSDカードのルート（MacOSだと */Volumes/boot*） にファイル *wpa_supplicant.conf* を作る

```
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
    ssid="<接続先のSSID>"
    psk="<平文のパスワード>"
}
```

平文のパスワードは後ほどハッシュ化した値に書き換える。

ここまで設定したら、SDカードをRaspberry Piに挿入して起動する。

## SSHでの接続

電源を入れて数分後には立ち上がっているので、次のコマンドで接続する。

```bash
$ ssh pi@raspberrypi.local
```

初期パスワードは `raspberry` となっている。

## WiFiパスワードの書き換え

SDカードに書き込んだ *wpa_supplicant.conf* はRaspberry Pi内の */etc/wpa_supplicant/wpa_supplicant.conf* に転写されている。
パスワードを平文のままにしておくのは良くないので書き換える。

1. 次の様に `wpa_passphrase` コマンドを実行し、`<ハッシュ化されたパスワード>`を求める。

    ```
    pi@raspberrypi:~ $ sudo sh -c 'wpa_passphrase "<接続先のSSID>" "<平文のパスワード>"'
    network={
	    ssid="<接続先のSSID>"
	    #psk="<平文のパスワード>"
	    psk=<ハッシュ化されたパスワード>
    }
    ```

2. */etc/wpa_supplicant/wpa_supplicant.conf* を vim などで開いて、`"<平文のパスワード>"`を削除して`<ハッシュ化されたパスワード>`に書き換える。
`<ハッシュ化されたパスワード>`は<font color="red">クオテーション`""`で囲わないように注意</font>

## raspi-config による設定

次のコマンドでRaspbianの設定ツール、raspi-configを起動する。

```bash
pi@raspberrypi:~ $ sudo raspi-config
```

すると次のようなキャラクタベースのUIが起動する

![Kobito.if2E3c.png](https://qiita-image-store.s3.amazonaws.com/0/32533/eb2549da-dced-9ca0-4c25-ebfcac3c8233.png "Kobito.if2E3c.png")

### raspi-config自体の更新
初設定の前にツール自体を最新にしておく。

`8 Update` を選択する。すると更新処理が始まる。
終了すると、raspi-config にもどる。

### ホスト名の変更
複数のRasPiを接続する可能性のある環境だとホスト名、ひいてはAvahiがネットワークにブロードキャストする名前がかぶるので変更しておく。

raspi-configのメニューから `2 Network Options` - `Hostname` を選択する。

> ascii文字の`a`から`z`、数字の`0`から`9`、`-`(ハイフン)を使って名前をつけてね、ただし、最初と終わりはハイフン以外で。他の記号やスペースを使っちゃダメだよ

という表示が出るので、「OK」を選択する。次の画面で指示に従ったホスト名を設定する。

ホスト名変更後はSSH接続の接続先が`<付け替えたホスト名>.local`と変わるので注意。

### ファイルシステムの拡張
`7 Advanced Options` - `A1 Expand Filesystem` を選択する。
次回のboot時に反映するというメッセージが出れば成功。
これで、MicroSDの全容量を利用できるようになる。

### ロケール等の変更
`4 Localisation Options` を選択して、そのサブ設定を変更していく。

日本語で使いたいなら`I1 Change Locale`を選択してロケール `ja_JP.UTF-8 UTF-8`を選択する。 
さらにシステム全体のデフォルトロケールを尋ねられるので `ja_JP.UTF-8`を選択する。

`I2 Change Timezone` を選択してタイムゾーン `Asia` を選択して更に `Tokyo` を選択する
`I4 Change WLAN Country`を選択して
 `JP Japan`を選択。

### パスワードの変更
必要に応じて変更する。
というか、デフォルトのママ SSHサーバを有効にするとパスワード変えろと警告が出たりするので変更しておいたほうがいいだろう。

### SSH serverの有効化/無効化

すでにSDカードで有効化していると思うが、`raspi-config`を使っても sshd をON/OFFできる。

sshd を設定するには次の手順。

raspi-configのメニューから `5 Interfacing Options` - `P2 SSH` を選択する。

> Would you like the SSH Server to be enabled?

と聞いてくるので `Yes` と答える。
`No`と答えればsshdが無効となる。

### Wifi設定

raspi-configのメニューから `2 Network Options` - `N2 Wi-fi` でWifi設定が可能となっている。

簡単に設定できるようになったのは結構なのだが、この結果作成される設定ファイル */etc/wpa_supplicant/wpa_supplicant.conf* にpassphraseが**平文のみで記録される**ので利用はおすすめできない。
後述の [コマンドによるWi-Fi設定](#コマンドによるWi-Fi設定) で示すようにハッシュ化された値で設定するほうが良い。

## 公開鍵認証でSSH接続する

そこそこ強度のあるパスワードは長くなるし、入力が面倒なのでさっさと鍵認証にしておいたほうがいいだろう。

### キーペアの生成

ここで書くまでのない気がするけど、`ssh-keygen` コマンドでサクッと作る。

以下の例では `raspi`という名前を指定して、*raspi*(秘密鍵) と *raspi.pub*（公開鍵）のキーペアを作っている。

```console
❯ ssh-keygen -t rsa -b 4096 
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/hoge/.ssh/id_rsa): raspi
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in raspi.
Your public key has been saved in raspi.pub.
〜略〜
```

### Raspberry Piへの公開鍵の登録

次の様に`ssh-copy-id` で簡単に公開鍵を登録できる。

```console
> ssh-copy-id -i ~/.ssh/raspi.pub pi@raspberrypi.local
/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/Users/hoge/.ssh/raspi.pub"
/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
pi@raspberrypi.local's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh 'pi@raspberrypi.local'"
and check to make sure that only the key(s) you wanted were added.
```

で、実際に秘密鍵を使ってログインできるか確認して入れればOK。

```console
ssh -i ~/.ssh/raspi pi@<ホスト名>.local
```

## パッケージとOSの更新
次のコマンドを実行する。

``` bash
pi@raspberrypi:~ $ sudo apt-get update       # パッケージリストの更新
pi@raspberrypi:~ $ sudo apt-get upgrade      # パッケージの更新
pi@raspberrypi:~ $ sudo apt-get dist-upgrade # OSのアップグレード
```

## ファームウェアの更新

`rpi-update` コマンドを使って更新する。再起動して反映。

```bash
pi@raspberrypi:~ $ sudo rpi-update      # ファームウェア更新実行
pi@raspberrypi:~ $ sudo reboot          # 反映のための再起動
```

実行途中で次の様なメッセージが表示される。頻繁に行う様なものではないのでご注意を。

> 'rpi-update' should only be used if there is a specific
> reason to do so - for example, a request by a Raspberry Pi
> engineer or if you want to help the testing effort
> and are comfortable with restoring if there are regressions.
> 
> DO NOT use 'rpi-update' as part of a regular update process.

## コマンドによるWi-Fi設定

SDカードで設定してすでに接続しているだろうが、接続先を変更する場合のためにコマンドでの設定方法を記しておく。

1. `ifconfig` コマンドを使って、無線LAN IFのインターフェース名を調べる。
	- RasPi3の内蔵のものだと wlan0 になっていると思う。
	- 無線LANのアクセスポイント側でMACアドレス制限している場合にはMACアドレスも出力されているので控えて、アクセスポイントでMACアドレスで制限してあれば設定しておく
2. 次のコマンドで接続先のSSIDを調べる。<br>無線AP側でステルス設定していると見えないのでスキップしてもよい。
    
    ```bash
    pi@raspberrypi:~ $ sudo iwlist wlan0 scan|grep ESSID
    ```
    
3. `wpa_passphrase`コマンドを使って接続設定する。
   以下は `testing` というSSIDにパスフレーズ`tetingpass`で接続する例。
    
    ```bash
    pi@raspberrypi:~ $ sudo sh -c 'wpa_passphrase "testing" "tetingpass" >> /etc/wpa_supplicant/wpa_supplicant.conf'
    ```
    
4. `nano` エディタ等を使って`/etc/wpa_supplicant/wpa_supplicant.conf`を開いて`network={...}`の部分を編集する
	- コメントアウトされている平文のパスフレーズは削除しておく。
	- 接続先がステルスSSIDの場合は`scan_ssid=1`を追記しておくと良いらしい
    
    ```bash
    network={
   		ssid="testing"
	   	#psk="tetingpass" <-- 平文のパスフレーズが書き込まれているのでこの行を削除
   		scan_ssid=1  # 接続先がステルスSSIDの場合は追加する
   		psk=f85fad981d229fa28876626c1c9b9a1f9b43df8c228cdfb2883c061d50da2547
    }
    ```
    
5. 再起動して`ifconfig`等で接続を確認する。IPアドレスが取れていれば成功。

## 参考
- [Raspberry Pi \- Teach, Learn, and Make with Raspberry Pi](https://www.raspberrypi.org/)
- [Hexxeh/rpi\-update: An easier way to update the firmware of your Raspberry Pi](https://github.com/Hexxeh/rpi-update)
- [Setting WiFi up via the command line \- Raspberry Pi Documentation](https://www.raspberrypi.org/documentation/configuration/wireless/wireless-cli.md)
- [Raspberry PiをHeadlessでセットアップする \- Qiita](https://qiita.com/rhene/items/828858afae699c5ac0ab)