ラズパイで遊ぶために最初にやること(Macからssh接続できるようにする)

# はじめに

日本の技適にも対応し、大幅にパワフルになった、*Raspberry pi 4 model B* を頂いたので、
開発をするための準備として、Macからssh接続できるよう設定しようと思います。

# 目次
- [環境](#環境)
- [fanの取り付け](#fanの取り付け)  
- [Macからssh接続](#macからssh接続)  
- [ssh公開鍵認証で接続できるようにする](#ssh公開鍵認証で接続できるようにする)
- [sshのポートを変更](#sshのポートを変更)
- [アドレスを固定する](#アドレスを固定する)
- [(番外編)パスワードを忘れてログインできなくなった場合](#パスワードを忘れてログインできなくなった場合)

## 環境

- Raspberry pi 4 model B(以降、ラズパイと記載)
    - OSは[Raspbian Buster Lite](https://www.raspberrypi.org/downloads/raspbian/)(CLIのみ)を使用
    - Raspbian Buster with desktop(GUI+CLI)のほうが無難かも

- Mac

```bash
$ sw_vers                       
ProductName:	Mac OS X
ProductVersion:	10.14.6
BuildVersion:	18G95
```

- BUFFALO WiFi 無線LAN ルーター(WSR-2533DHPL)
    - 一般家庭にある無線ルータです

今回、登場する機器の関係図は以下のイメージです。(DHCPは設定の必要なし)

<img width="530" alt="ScreenShot 2019-12-20 22.38.47.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253644/ff477045-9b3f-c4d5-7e64-606ffe23e49d.png">


## fanの取り付け

こちらは任意の手順ですが、ラズパイ4になってから性能の向上と引き換えに[発熱量が増えています。](https://www.jeffgeerling.com/blog/2019/raspberry-pi-4-might-not-need-fan-anymore)
そのため、以下のような使用予定の場合は設置を検討した方が良さそうです。

- 連続稼働させる
- ヘビーな処理をする(Kubernetes-clusterなど)

**[赤線は4番、黒線を6番にさす](https://www.jeffgeerling.com/blog/2019/raspberry-pi-4-needs-fan-heres-why-and-how-you-can-add-one)** とファンが稼働します。

> When you're putting the Pi back into the case, put it in as normal, then connect the red wire from the pan to the Pi's pin 4 (5V), and the black wire to the Pi's pin 6 (ground).

[GPIO(General-purpose input/output)を参考に](https://learn.sparkfun.com/tutorials/raspberry-gpio/gpio-pinout)、以下の画像のように取り付けました。
(ファンが動いていることを確認してからケースを組み立てるのがおすすめ)

![raspi.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253644/c01739d1-eb60-17b7-e82a-36c390668fd0.jpeg)


## macからssh接続

ラズパイのコンソール接続の状態のまま使用すると以下の点が不便です。

- コピペができない
- ラズパイに物理的にキーボード、マウス、ディスプレイを接続する必要がある

上記の点はラズパイが、 **1枚の回路基板上にコンピューター(サーバ)として最低限の機能を持たせた「シングルボードコンピューター」** という性質を考えると当然のことではあります。

コンソール接続してサーバに入り作業するということは、
**オンプレ**であればデータセンターの**サーバラックにマウントされているサーバに物理的に接続すること**であり、
**クラウド**であれば**ブラウザのクラウドコンソールで作業すること**と同じです。

なので、ラズパイにMacからssh接続できるようにします。

- ラズパイを起動、コンソール接続でログイン
    - ラズパイにマウス、キーボード、ディスプレイを接続する必要あり

```
# 初期設定のログイン情報
user: pi
password：raspberry
```

- ssh接続を有効化する

```bash
$ sudo raspi-config

# ［5 Interfacing Options］を選択
# ［P2 SSH］を選択
# 有効化して、finish
```

- IPアドレスの確認、Macからping疎通

```bash
# raspberry pi
$ ifconfig

inet 192.168.11.46 # 以降、こちらで表示されるIPに書き換えて作業

# Mac
$ ping 192.168.11.46 -c 3
PING 192.168.11.46 (192.168.11.46): 56 data bytes
64 bytes from 192.168.11.46: icmp_seq=0 ttl=64 time=2.394 ms
64 bytes from 192.168.11.46: icmp_seq=1 ttl=64 time=2.495 ms
64 bytes from 192.168.11.46: icmp_seq=2 ttl=64 time=2.681 ms

--- 192.168.11.46 ping statistics ---
3 packets transmitted, 3 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 2.394/2.523/2.681/0.119 ms
```

- Macからラズパイにssh接続

```bash
$ ssh pi@192.168.11.46
# 初期パスワード「raspberry」を入力
pi@raspberrypi:~ $
```

## ssh公開鍵認証で接続できるようにする

パスワード認証よりもセキュリティ的に安全な公開鍵認証で接続できるようにします。
.ssh/config も設定することで、毎回、接続先の情報を記載する手間も省きます。

- ラズパイ側で秘密鍵と公開鍵のペアを生成
    - 自身の公開鍵を authorized_keys に登録

```bash
# raspberry pi
$ ssh-keygen

# 公開鍵を登録
$ cat /home/pi/.ssh/id_rsa.pub >> /home/pi/.ssh/authorized_keys
```

- ラズパイの秘密鍵をMacに登録

```bash
# raspberry pi
# プロンプトのバファに残らないように、less で開く
# 中身をコピーしておく(そのため、mac側からsshで繋いで作業する必要がある)
$ less /home/pi/.ssh/id_rsa

# Macに戻る
$ exit

# Mac
# ホームディレクトリにラズパイ用のディレクトリをつくる(場所は任意)
$ mkdir ~/raspi

# 先ほど、lessで確認してコピーした秘密鍵をペースト
$ vi ~/raspi/raspi.pem

# 鍵のパーミッションを変更
$ chmod 400 ~/raspi/raspi.pem
$ ls -l ~/raspi/raspi.pem
-r--------  1 yourname  staff  1823 12  8 10:59 /Users/yourname/raspi/raspi.pem
```

- .ssh/config の設定

```bash
# .ssh/configにssh接続に必要な情報を追記(IPは各自確認したものに変更)
$ cat << EOF >> ~/.ssh/config
Host raspberrypi
  User pi
  Hostname 192.168.11.46
  IdentityFile ~/raspi/raspi.pem
  Port 22
EOF
```

- ssh接続を確認

```bash
# Mac
# ssh r でtabキーを押すと接続先の候補として補完されるはず
$ ssh raspberrypi
Linux raspberrypi 4.19.75-v7l+ #1270 SMP Tue Sep 24 18:51:41 BST 2019 armv7l

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: Sun Dec  8 02:25:21 2019 from 192.168.11.37

# raspberry pi
pi@raspberrypi:~ $
```

## sshのポートを変更

今回の状況だとLANでの使用なので気にすることはないですが、デフォルトの22番から変更しておきます。
VPSなどでグローバルIPを取得してサーバを公開する際は、必ず変更しましょう！

```bash
# raspberry pi
# ブレース展開を使用してバックアップファイルを作成
$ sudo cp /etc/ssh/sshd_config{,org}
$ sudo vi /etc/ssh/sshd_config

     # :set nu で行番号を表示
     # 13G で該当箇所に移動
     13 #Port 22
     14 Port xxxxx # ウェルノーンポート番号以上の値で、好きな番号にする

# sshのデーモンを再起動(切断されるため、Macに戻ります)
$ sudo systemctl restart sshd
```

- .ssh/config を修正

```bash
# Mac
$ vi ~/.ssh/config

  Port xxxxx # 変更したものに修正
```

- 再度、接続

```bash
# Mac
$ ssh raspberrypi

# raspberry pi
pi@raspberrypi:~ $
```

## アドレスを固定する

現在の状態だと、ルータからDHCPで払い出されたプライベートIPが設定されています。
そのため、払い出し期間が終わりLAN内の接続機器の台数が変動した際に、
IPが変わってしまい .ssh/config に記載した設定で接続できなくなってしまう恐れがあります。

正解かわかりませんが、ルータとラズパイ両方の設定でIPを固定(static)にしておきます。
ルータの設定については、使用している機器の設定方法をご確認いただければと思います。
(参考までに、バッファローの無線LANルータの設定画面は以下のように設定)

- ラズパイのmacアドレスを確認

```bash
$ cat /sys/class/net/eth0/address
dc:a6:32:70:aa:e4　# 表示されたものmacアドレスに対応するIPを、ルータで手動割り当てに変更
```

<img width="939" alt="ScreenShot 2019-12-14 12.59.19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/253644/ac7ff2da-489f-efbd-f71a-ca159646fddb.png">


- ラズパイ側のIPをstaticにする設定

```bash
# raspberry pi
# バックアップをとる
$ sudo cp /etc/dhcpcd.conf{,.org}
$ sudo ls /etc/dhcpcd.conf*
/etc/dhcpcd.conf  /etc/dhcpcd.conf.org

$ sudo vi /etc/dhcpcd.conf

# 好きなところに、static IPの設定を追記
# 今回はこれまでの手順で動的に払い出されていたIPをそのまま、statc IPに

# addtitonal static IP configuration
profile static_eth0
static ip_address= 192.168.11.46/24
static routers=192.168.11.1
static domain_name_servers=192.168.11.1

```

- 再起動、接続を確認

```bash
### raspberry pi
### ルートユーザになる
$ sudo su -
# sync
# sync
# reboot

### Mac
$ ssh raspberrypi

### raspberry pi
### 再起動しても、IPが固定されている
$ ip a | grep inet
    inet 127.0.0.1/8 scope host lo
    inet6 ::1/128 scope host
    inet 192.168.11.46/24 brd 192.168.11.255 scope global noprefixroute eth0
    inet6 fe80::f340:6592:e61f:598d/64 scope link
```

お疲れ様でした。
これで、IPを固定にして、Macからssh接続できるようになり、
ラズパイを使用した開発準備ができましたね！

---
## パスワードを忘れてログインできなくなった場合

今回の手順には記載していないですが、
piユーザのパスワードは変更して運用するのが一般的かもしれないです。

ssh接続の設定の前に忘れてしまい、コンソール接続できなくなってしまいましたので、解決までの流れをメモしておきます。

- シングルユーザモードで起動するため設定
    - MicroSDを取り外し、パソコン側で編集

```
### cmdline.txt の末尾に init=/bin/sh を追加
console=serial0,115200 console=tty1 root=PARTUUID=6c586e13-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait init=/bin/sh
```

- ラズパイに、MicroSDをマウントして起動
    - シングルユーザモードで起動する
    - rootユーザになり、piユーザのパスワードを更新
    
```bash
$ su -
# passwd pi
```

- 通常起動に戻すため、MicroSDを取り外し、パソコン側で編集

```
### cmdline.txt の末尾の init=/bin/sh を削除
console=serial0,115200 console=tty1 root=PARTUUID=6c586e13-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait init=/bin/sh
```

- ラズパイに、MicroSDをマウントして起動
    - シングルユーザモードで設定したパスワードでログインできる