Raspberry Piのヘッドレスセットアップ(with mac)

#用意するもの
- 母艦（mac）
- Raspberry Pi（必要に応じてケースも）
- ラスパイ用ACアダプタ、コード
- LANケーブル
- microSDカード
- （SDカードリーダー・ライター）

##今回の環境
- Macbook Pro 13inch early 2015
- macOS Catalina(10.15.7)
- Raspberry Pi 3 Model B+
- Raspbian Buster Lite(2020-02-13)

#Raspbianをダウンロード
　まず、Raspbianのイメージファイルをダウンロードします。
　本家は遅いので日本ミラーからダウンロードしましょう。
　　通常版：http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian/images/
　　Lite版：http://ftp.jaist.ac.jp/pub/raspberrypi/raspbian_lite/images/
　リンクを開き、一番新しいディレクトリの中にあるzipファイルをダウンロードします。
　（ちなみに、Lite版はデスクトップ環境がありません。そのため、通常版の約1/5のサイズです。）

#Raspbianを焼く
　1. SDカードをMS-DOS(FAT32)でフォーマットする
　2. ダウンロードしたzipファイルを展開
　3. 以下のコマンドを実行する

```shell-session:コマンド
$ diskutil list
/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *251.0 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                 Apple_APFS Container disk1         250.8 GB   disk0s2

/dev/disk1 (synthesized):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      APFS Container Scheme -                      +250.8 GB   disk1
                                 Physical Store disk0s2
   1:                APFS Volume Macintosh HD            11.1 GB    disk1s1
   2:                APFS Volume Preboot                 104.2 MB   disk1s2
   3:                APFS Volume Recovery                1.0 GB     disk1s3
   4:                APFS Volume VM                      6.4 GB     disk1s4
   5:                APFS Volume Macintosh HD - Data     131.1 GB   disk1s5

/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.9 GB    disk2
   1:                 DOS_FAT_32 UNTITLED                15.9 GB    disk2s1
```
　容量などから、SDカードがどのパスかを判断しておく（この場合は/dev/disk2）
　**※以下、「disk2」は自分の環境に合わせて読み替えてください**

　4. 以下のコマンドを実行し、ディスクをアンマウント、imgファイルを書き込む

```shell-session:コマンド
$ diskutil unmountDisk /dev/disk2
Unmount of all volumes on disk2 was successful
$ sudo dd if=/Users/xxxxx/yyyy-mm-dd-raspbian-xxxxxxxx.img of=/dev/rdisk2 bs=4m
Password:
986+0 records in
986+0 records out
4135583744 bytes transferred in 189.369500 secs (21838700 bytes/sec)
```
- `dd`コマンドのifはimgファイルのパス
- `/dev/rdisk2`のように、ディスク名の前に「r」をつけると書き込みが速くなる(らしい)
- `dd`コマンドの途中で`control + t`で進捗状況をみられる

#SSHを有効にしておく
　SDカード（bootパーティション）直下に「ssh」という名前の空ファイルを作成する
　×「ssh.txt」　○「ssh」

```shell-session:コマンド
$ touch /Volumes/boot/ssh
```

#WiFiの設定をする(必要な場合)
```:boot/wpa_supplicant.conf
ctrl_interface=/var/run/wpa_supplicant
country=JP
network={
    ssid="SSID"
    psk="パスワード"
}
```
　※その他の設定は[こちら](http://www.yosbits.com/opensonar/rest/man/freebsd/man/ja/man5/wpa_supplicant.conf.5.html?l=ja)を参照
　※セキュリティを気にするならパスワードを`wpa_passphrase`などで暗号化しておく
　※ルーターでmacアドレスのフィルタリングをしている場合(筆者宅)、ルーターの設定からフィルタをオフにするか、起動後に下記の方法でWiFiの設定をする
　※有線LANと併用したい場合、ここでは設定せず、起動後に設定する

#オーバークロック(必要な場合)
　**※自己責任でお願いします！！！**
　`boot/config.txt`の末尾に以下を追記

```:boot/config.txt
# overclock
arm_freq_min=900
arm_freq=1200
core_freq_min=400
core_freq=500
over_voltage_min=0
over_voltage=5
gpu_freq=500
temp_limit=80
# sdram overclock
sdram_freq=500
sdram_freq_min=400
sdram_schmoo=0x02000020
over_voltage_sdram_p=6
over_voltage_sdram_i=4
over_voltage_sdram_c=4
```
　私は怖かったのでやりませんでした。
　そのため、この設定で本当にあっているのかは保証できません。

#起動とSSHでのログイン
　1. SDカードをラズパイにぶっさす
　2. (WiFiを設定してなかったらLANケーブルと)電源を取り付ける
　3. MacにはBonjourがインストールされているので、以下のコマンドをターミナルで実行してssh接続をする

```shell-session:コマンド
$ ssh pi@raspberrypi.local
pi@raspberrypi.local's password:
pi@raspberrypi:~ $
 ```
　4. なんかわけわからん英文が出てきて(yes/no)って聞かれたらyesって言っとく
　5. 初期パスワードは`raspberry`なので、入力したら接続される
　**※以下の設定は個々の環境に合わせて行なってください**

##SSHで蹴られたら
　何度も接続していると、接続している母艦PCの中の設定がごっちゃになって蹴られることがある。
　そんな時は、下のコマンドの`<remote_host_name>`を蹴られてるホスト名やらIPやらにして実行する。

```shell-session:コマンド
$ ssh-keygen -R <remote_host_name>
```
　あるいは設定ファイルをそのままいじってもいい。
　下のコマンドを実行し、問題になってるホスト名etc.から始まる行を`dd`でごっそり消す。

```shell-session:コマンド
$ vi ~/.ssh/known_hosts
```

#WiFiの設定をする(必要な場合)
　1.以下のコマンドを実行し、`dhcpcd`の停止(`wicd-curse`と競合した)、`wicd-curses`をインストール、設定画面を開く

```shell-session:コマンド
pi@raspberrypi:~ $ sudo systemctl disable dhcpcd
pi@raspberrypi:~ $ sudo apt-get -y install wicd-curses
pi@raspberrypi:~ $ sudo wicd-curses
```
　2.`Shift + P`で`Preferences`へ飛び、上の方の`Always〜`から始まる二つに`Enter`で`X`をつける(有線LANが使えるときはそっちを使う設定)
　3.`Shift + S`で保存して戻る
　4.繋ぎたいネットワークを選択し、`→`で設定画面へ
　5.`Use static IPs`にチェックし、IPアドレスを固定する設定をする(有線LANもIPを固定した)

```
IP:     192.168.x.x
Netmask:255.255.255.0
Gateway:192.168.x.1

DNS server 1:    192.168.x.1
DNS server 2:    8.8.8.8
```
　6.下の方の`Use these settings〜`と`Automatically connect〜`にチェック
　7.`WPA 1/2 (Passphrase)`を選択、下でパスワードを入力
　8.`Shift + Q`を2回押し、コマンドラインへ戻る
　9.再起動、IPが固定されているか確認する

#swapを無効にする
```shell-session:コマンド
pi@raspberrypi:~ $ sudo systemctl disable dphys-swapfile
```

#ソフトウェアアップデート
　※使うサーバーを日本ミラーにしてからアップデートする
　1.以下のコマンドを入力
　2.まったり待つ

```shell-session:コマンド
pi@raspberrypi:~ $ sudo sed -i.bak -e "s%http://raspbian.raspberrypi.org/raspbian/%http://ftp.jaist.ac.jp/raspbian/%g" /etc/apt/sources.list
pi@raspberrypi:~ $ sudo apt update && sudo apt -y upgrade
```
　※`rpi-update`によるファームウェアの更新は不安定になる可能性があるので、必要がない限りはやらない

#ラズパイの設定
```shell-session:コマンド
pi@raspberrypi:~ $ sudo raspi-config
```
※上記「ソフトウェアアップデート」を行っていない状態だと、設定項目のナンバリングがずれているかと思います。適宜読み替えてください。
- 1 System Options → S5 Boot Options → お好みで
- 5 Localisation Options → L2 Timezone → Asia → Tokyo
- 5 Localisation Options → L4 WLAN Country → JP Japan
- 6 Advanced Options → A1 Expand Filesystem

##WiFi Countryの設定
　筆者の環境では上記`raspi-config`から`Wifi Country`の設定がうまく反映されなかったのでファイルで直接設定する

```shell-session:コマンド
pi@raspberrypi:~ $ sudo vi /etc/wpa_supplicant/wpa_supplicant.conf
pi@raspberrypi:~ $ sudo cat /etc/wpa_supplicant/wpa_supplicant.conf 
country=JP
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
pi@raspberrypi:~ $ sudo reboot
```

#SSHのホスト鍵を更新
```shell-session:コマンド
pi@raspberrypi:~ $ sudo rm -v /etc/ssh/ssh_host*
pi@raspberrypi:~ $ sudo dpkg-reconfigure openssh-server
```
　この後、SSH接続をしなおしたら絶対に蹴られるので、上記`SSHで蹴られたら`を参照

#パス無しsudoの禁止
```shell-session:コマンド
pi@raspberrypi:~ $ sudo rm /etc/sudoers.d/010_pi-nopasswd
```

#パスワードを変更
　**※rootはデフォルトで無効なので、`sudo passwd`とか`sudo passwd root`とかしないこと！**

```shell-session:コマンド
pi@raspberrypi:~ $ sudo passwd pi
```

#rootをロック
```shell-session:コマンド
pi@raspberrypi:~ $ sudo passwd -l root
```

#ユーザー名を変更
　1.作業ユーザーを追加する(ここでは`tmp`)

```shell-session:コマンド
pi@raspberrypi:~ $ sudo useradd -M tmp
pi@raspberrypi:~ $ sudo gpasswd -a tmp sudo
pi@raspberrypi:~ $ sudo passwd tmp
pi@raspberrypi:~ $ exit
```
　2.作業ユーザーでログインし、以下のコマンドを実行(Lite版は不要)

```shell-session:コマンド
tmp@raspberrypi:~ $ sudo vi /etc/lightdm/lightdm.conf
```
　3.`autologin-user=pi`をコメントアウト、保存して以下のコマンドを実行

```shell-session:コマンド
tmp@raspberrypi:~ $ sudo vi /etc/systemd/system/autologin@.service
```
　4.`ExecStart=-/sbin/agetty --autologin pi --noclear %I $TERM`の`pi`を新しく変更する予定のユーザー名(`newuser`)にして保存、再起動
　5.下記のコマンドを実行(`newuser`は読み替えて)

```shell-session:コマンド
tmp@raspberrypi:~ $ sudo usermod -l newuser pi
tmp@raspberrypi:~ $ sudo usermod -d /home/newuser -m newuser
tmp@raspberrypi:~ $ sudo groupmod -n newuser pi
tmp@raspberrypi:~ $ sudo vi /etc/lightdm/lightdm.conf
```
　6.`3.`でコメントアウトした行のコメントを解除、`pi`を`newuser`にして保存(Lite版は不要)
　7.再起動
　8.`newuser`でSSHログインし、以下のコマンドを実行

```shell-session:コマンド
newuser@raspberrypi:~ $ sudo userdel tmp
```

#SSHを公開鍵認証にする
　1.Mac上で以下のコマンドを実行

```shell-session:コマンド
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/xxxx/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /Users/xxxx/.ssh/id_rsa.
Your public key has been saved in /Users/xxxx/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:xxxxxxxxxxxxx xxxx@xxxx.local
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
|                 |
+----[SHA256]-----+
$ scp ~/.ssh/id_rsa.pub pi@raspberrypi.local:
```
　2.ターミナルを2つ立ち上げ(設定変更用(①)と接続確認用(②))、①だけラズパイにSSH接続する
　3.以下のコマンドを①で実行

```shell-session:コマンド
pi@raspberrypi ~ $ mkdir .ssh
pi@raspberrypi ~ $ cat id_rsa.pub >> .ssh/authorized_keys
pi@raspberrypi ~ $ chmod 700 .ssh
pi@raspberrypi ~ $ chmod 600 .ssh/authorized_keys
pi@raspberrypi ~ $ rm id_rsa.pub
pi@raspberrypi ~ $ sudo vi /etc/ssh/sshd_config
```
　4.以下の設定を変更する(〇〇の部分はお好きにどうぞ。[ここ](http://www.vwnet.jp/mura/PortNumbers/tcpip-port.asp)を見ると幸せになるかも。)

```
#Port 22　→→→　Port 〇〇
PermitRootLogin no
RSAAuthentication yes
PubkeyAuthentication yes
AuthorizedKeysFile %h/.ssh/authorized_keys
PasswordAuthentication no
```

　5.以下のコマンドを①で実行

```shell-session:コマンド
pi@raspberrypi ~ $ sudo /etc/init.d/ssh restart
```

　6.以下のコマンドを②で実行し、接続できるか確認する

```shell-session:コマンド
$ ssh -i .ssh/id_rsa -p 〇〇 pi@raspberrypi.local
```

#SSHを便利にする
##SSHの多重接続の設定
```shell-session:コマンド
$ cd ~/.ssh
$ mkdir connections
$ chmod 700 connections/
$ vi config
```
```:.ssh/config
Host *
ControlMaster auto
ControlPath ~/.ssh/connections/%r_%h_%p
```

##SSHの接続コマンドを短縮する
```shell-session:コマンド
$ vi ~/.ssh/config
```
```:.ssh/config
Host raspi
	HostName raspberrypi.local
	User pi
	Port 〇〇
	IdentityFile ~/.ssh/id_rsa
```
```shell-session:コマンド
$ ssh raspi
```

#ファイアウォールの設定
```shell-session:コマンド
pi@raspberrypi ~ $ sudo apt-get install ufw
pi@raspberrypi ~ $ sudo ufw default deny
pi@raspberrypi ~ $ sudo ufw allow 〇〇
pi@raspberrypi ~ $ sudo ufw enable
```