Raspberry Piで設定したこと

# 設定した時のモデルや作業環境
対象モデル:

- Raspberry Pi 2
- Raspberry Pi 3 Model B V2
- Raspberry Pi 4

作業PC: 

- MacBook Pro (Retina, 13-inch, Early 2015), Catalina 10.15.5


## 0: Operating System(OS)の書き込み

SDcardの初期化やOSインストールは以下の2つの方法が主流だと思われます

- `RaspberryPi Imager を用いる方法`　(推奨:かなり楽です)

- `コマンドで設定する方法`

### RaspberryPi Imager で設定する
#### SDcardの初期化
従来通りコマンドで処理を行うのもいいですが、「RaspberryPi Imager」を用いてSDcardを初期化したり、OSをインストールした方が手っ取り早いです
![スクリーンショット 2020-07-12 15.57.43.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136973/9415039c-b54d-6f22-48a3-33d36caecbff.png)

私の場合は環境がMacなので`Raspberry Pi Imager for macOS`を選択しました

<img width="792" alt="スクリーンショット 2020-07-12 15.50.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136973/079255e9-f025-b651-4ba9-b9bcbe222631.png">

上記の画面で`「CHOOSE OS」をクリック`するとインストールしたいOSを選ぶ画面が表示され、スクロールすると下の方にSDcardを初期化する項目が現れます

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136973/a60c69f4-27c1-daaf-bece-6ac0dcb458be.png)


`「Erase」をクリック`した後は、`「CHOOSE SD CARD」をクリック`して初期化したいSDcardを選んでください（選ぶとは言いましたが、ほとんどの環境で一度に挿入するSDcardの枚数は一枚だと思われるので、多分選択できるのは一つだけ表示されると思います）

後は自動で初期化されるので待てば大丈夫です


#### OSのインストール


<img width="792" alt="スクリーンショット 2020-07-12 15.50.15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136973/079255e9-f025-b651-4ba9-b9bcbe222631.png">

上記の画面で`「CHOOSE OS」をクリックする`とインストールしたいOSを選ぶことができ、`「CHOOSE SD CARD」をクリックして`挿入しているmicroSD Cardを指定することができます。
2つの項目を決定した後は「WRITE」ボタンが白くなりクリック可能になります
OSは以下の二つに大きく分かれていますのでお好みで選んでください

- `Raspberry Pi OS` (以前「Raspbian」と呼称されていたもの)

- `NOOBS` (初心者向けで設定しやすいらしい)

<img width="792" alt="スクリーンショット 2020-07-12 16.29.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136973/1cb22bc0-a592-0c85-b12c-4814266cbb14.png">

書き込みが終わると以下のような画面になります

<img width="748" alt="スクリーンショット 2020-07-12 15.57.04.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/136973/02535099-efa7-b701-223b-7ce8cb936771.png">

後はmicroSDをRaspberryPiに挿入すればデスクトップ画面が立ち上がります


### コマンドで設定する
#### OSイメージの入手
ラズベリーパイ用のOSは[公式サイト](https://www.raspberrypi.org/downloads/
)からダウンロードするのが良いと思われます
https://www.raspberrypi.org/downloads/

2020年7月12日時点では以下の2つの形式でOSが公式から配布されています

- `Raspberry Pi OS` (以前「Raspbian」と呼称されていたもの)

- `NOOBS` (初心者向けで設定しやすいらしい)


#### MicroSD初期化
MiroSDcardの初期化は[このサイト](https://7ka.org/raspberrypi-sd-init-mac/)を参照
`diskutil list コマンド`で差し込んだMicroSDを確認する(間違えると作業しているPC本体のデータを吹っ飛ばすことになるので注意)

```:マウントされれているディスク一覧を表示
$ diskutil list
/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.8 GB    disk2
   1:             Windows_FAT_32 boot                    46.0 MB    disk2s1
   2:                      Linux                         15.8 GB    disk2s2
```

私の場合では`/dev/disk2`にマウントされていることがわかったので、`diskutil eraseDisk`で初期化を行います

```
$ diskutil eraseDisk　フォーマット形式 名前　フォーマット対象ディスク
```

フォーマット形式は`「MS-DOS」`、ディスクの名前は好きなものを選んでもいいですがラズベリーパイに関連しているものを名付ける方がいいと思います私は`「RPI」`としています
フォーマット対象ディスクはdiskutil listで表示されたものを選ぶので、この場合は「/dev/disk2」になります
これは環境によって変わるので注視してください

```:SDcardを初期化
$ diskutil eraseDisk MS-DOS RPI /dev/disk2
Started erase on disk2
Unmounting disk
Creating the partition map
Waiting for partitions to activate
Formatting disk2s2 as MS-DOS (FAT) with name RPI
512 bytes per physical sector
/dev/rdisk2s2: 30503616 sectors in 476619 FAT32 clusters (32768 bytes/cluster)
bps=512 spc=64 res=32 nft=2 mid=0xf8 spt=32 hds=255 hid=411648 drv=0x80 bsec=30511104 bspf=3724 rdcl=2 infs=1 bkbs=6
Mounting disk
Finished erase on disk2
```

#### OSのinstall
次にOSのinstallは[このサイト](https://qiita.com/shippokun/items/9070fc58f69d8c063e44)を参考にしました

ファイルを書き込む`dd コマンド`でOSをSDcardに書き込んでいきます

```
$ diskutil list
$ diskutil unMountDisk /dev/disk2
$ sudo dd if=/*ダウンロードしたファイルまでのパス*/[ダウンロードしたOS名].img of=/dev/disk2 bs=1m count=1024
```

## 1: ユーザ・グループの設定

### 一般ユーザ

#### 新ユーザの追加

RaspbianやRaspberryPiOSなどに最初から設定されている「pi」というユーザは初期パスワードが周知されていますし、sudoをパスワード入力なしで実行できてしまうので、セキュリティ面から考えてかなり脆弱だと思われます（私は「pi」をsudoグループから外して、名前を変更するまでネットワーク環境へつなげないようにしています）
ユーザ 「pi」を削除するなり、名前を変更するにしても他のユーザを作ってからの方が作業が楽です（というより私はpiでログイン中にpiを削除したり名前変更する方法を知りません）

ユーザを追加するコマンドは主に「useradd」と「adduser」の2つ存在します。(Debian系列のOSではこの2つのコマンドは異なる挙動をするらしいです)
個人的には対話形式で追加可能なadduserを好んで使っています

ユーザ(例:hoge)を対話的に追加するコマンド

```:ユーザの追加
$sudo adduser hoge
```


#### ユーザをSudoグループに追加

新しいユーザが所属するグループをpiと同じにするため、piの属しているグループを確認する(少なくともSudoが使えるグループには所属させたい)

```:piが所属しているグループを確認
$groups pi
pi : pi adm dialout cdrom sudo audio video plugdev games users input netdev spi i2c gpio
```

ユーザ(例:hoge)をsudoグループに追加

```:hoge(ユーザ)をsudo(グループ)
$sudo gpasswd -a hoge sudo
```


### 初期ユーザ : pi
#### piの名前を変更
一度再起動した後、自分が作成したユーザ(例:hoge)でログインしてpiのユーザ名を変更する
初期ユーザのpiでログインしている場合はプロセスが立ち上がってしまい、変更できない

```
$sudo usermod -l [新しいユーザ名] [古いユーザ名]
```

#### piをSudoのグループから除外
何らかの設定ミスでユーザpiが乗っ取られてしまうことを考慮して、スーパーユーザの権限で処理を実行できないようにします

```：piをsudoグループから除外
$sudo gpasswd -d pi sudo　
```
あと、configの設定も無効にしておく必要があるみたい。

```:/etc/sudoers.d/010_pi-nopasswd
$sudo nano /etc/sudoers.d/010_pi-nopasswd
```

下記の行をコメントアウト(先頭に#をおけばコメントアウトできる)。
nanoエディタを使ったことなくて、終了できない時はCtrl+Xで終了できる。細かいことはググってお願い

```bash:010_pi-nopasswd
pi ALL=(ALL) NOPASSWD: ALL
```

### スーパユーザ : root
#### rootのパスワードを変更
初期パスワードでは心許ないので変更する

```
$sudo passwd root
```

一応変更できたかログインして確認してみる

```
$su
```


## 2:ネットワーク設定

個人的な感想ですが、上記の設定を行うまではかなり脆弱だと思われますので、ネットワークには接続しないほうがいいと思われます。
ラズベリーパイ公式のドキュメントは下記の通り
https://www.raspberrypi.org/documentation/configuration/tcpip/
https://www.raspberrypi.org/documentation/computers/configuration.html

本来Debian系のLinuxOSであれば/etc/network/interfaceなどにipアドレスなどの設定をするのですが、ラズベリーパイでは/etc/dhcpcd.confにて記述を行うことが推奨されています。

### 無線の設定
#### DHCPを利用
周囲のESSID一覧を取得する

```
$sudo /sbin/iwlist *インタフェース名(例:wlan0)* scan | grep ESSID
```

ESSIDとpasswordをハードコーディング(本当はハッシュ値にしたりとかするといいみたい)

```
$ sudo vi /etc/wpa_supplicant
```

### 有線の設定
#### 静的なIPアドレス

`/etc/dhcpcd.conf`に存在するファイルの設定を書き加える
多分ですが、「=」の前後に空白が入ると設定が通らないかもしれないです。

```
interface [インターフェース名(デフォルトなら大抵は、有線がeth0,無線がwlan0)]
static ip_address=[割り当てたいipアドレス]/[サブネットマスク]
static routers=[ルータのipアドレス]
static domain_name_servers=[DNSのIPアドレス]
```

<details>
<summary>他のDebian系列のOSでは？</summary>
<div>
他のDebian系列のOSなら`/etc/network/interfaces`に上記と似たような設定を書くことになります
ただ、DNSの設定をどこに記述するかが自分の中ではバラバラな気がします

RaspberryPI OS -> 

```:/etc/dhcpcd.conf
static domain_name_servers=[DNSのIPアドレス]
```


Ubuntu ->

```:/etc/network/interfaces
dns-nameservers [DNSのIPアドレス]
dns-search [ドメイン名]
```

Kali Linux ->
```:/etc/resolv.conf
nameserver [DNSのIPアドレス]
```

</div>
</details>

### SSHの設定
#### OpenSSHの起動
設定ファイルの中身を変更する

```
$sudo vi /etc/ssh/sshd_config
```

次の一文を追加しておけば、rootでログインされることはない(Linuxではデフォルトで有効になっているOSもあったりしたような気がする)

```bash:/etc/ssh/sshd_config
# Authentication:

PermitRootLogin no
```

保存後、sshを再起動する

```
$sudo service ssh restart
```
または

```
/etc/init.d/ssh restart
```



- 上記の方法以外に 「`raspi-config`」 -> 「`Interfacing Options`」 -> 「`SSH`」 から 「`Enable`」 を洗濯すればSSHサーバとして機能するようでしょう。

- また、そもそもsshが入っていない場合はDebian系列であれば「`sudo apt install openssh-server`」 で対応できるのではないでしょうか

#### 公開鍵の設定
おそらくですが、初期設定を行う場合を除いてラズベリーパイをディスプレイに直で接続して作業することはあまりないでしょう。
今の状態でもクライアント側からSSHでログインすることは可能ですが、それだと以下のようになるでしょう


```bash:クライアント側
$ssh ユーザ名@ホストのアドレス
```

このままだとパスワードを生で入力するので、あまり良くありませんよね。
なのでクライアント側で公開鍵をホスト側に投げる必要があります
まず、公開鍵と秘密鍵を生成します

```:クライアント側
$ssh-keygen -t rsa -b 2048
```

次にホストに公開鍵を渡します(秘密鍵は名前の通り誰にも教えないヒ・ミ・ツにしておいてください)

```:クライアント側
$ssh-copy-id ユーザ名@ホストのアドレス
```

または

```:クライアント側
$scp ./.ssh/id_rsa.pub ユーザ名@ホストのアドレス:/home/ユーザ名/任意のディレクトリ
```

```:ホスト側
$ cat id_rsa.pub >> .ssh/authorized_keys 
```

これで公開鍵を用いて安全にSSHを使って接続できるでしょう

## 3:リポジトリの更新
ここまでである程度の設定が終わりました、しかし今のままではシステムを最新の状態にできていません
そのためにはパッケージマネージャを使う必要があります
RaspberryPiOSはLinuxですが、Linux自体にも様々な種類があり、大きく分けてRedHat系とDebian系が存在します

RaspberryPiOSはDebian系列であり、パッケージマネージャは「apt」が推奨されています
Debianの[公式ドキュメント](https://www.debian.org/doc/manuals/debian-handbook/sect.apt-get.ja.html)にaptとapt-get、aptitudeに関する短い説明が述べられているのでお暇でしたら眺めてみるのもいいかもしれません

```:リポジトリの更新
$sudo apt update
$sudo apt upgrade
```

ちなみに、このaptを実行した時に見ているリポジトリってどこにあるの？
っていうのが私の疑問でしたが、以下で確認できるようです


```:/etc/apt/sources.list 
deb http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://raspbian.raspberrypi.org/raspbian/ buster main contrib non-free rpi
```

```:/etc/apt/sources.list.d/raspi.list
deb http://archive.raspberrypi.org/debian/ buster main
# Uncomment line below then 'apt-get update' to enable 'apt-get source'
#deb-src http://archive.raspberrypi.org/debian/ buster main
```


## おまけ
### バックアップ&レストア方法

```:バックアップ方法
$ diskutil list
$ diskutil unmountDisk /dev/disk2
$ sudo dd if=/dev/disk2 of=raspi-backup.dmg bs=1m
```


上のコマンドを実行すると作業が完了するまで、何も表示されません
そこでDDコマンドの進捗を確認を確認するには`Ctrl + T`を押す必要があります



### 起動時の自動ログインを変更する
設定ファイルを書き換えるよりは対話的に変更するようが楽だと思う

```
$sudo raspi-config
```

「boot option」を選択して「Console(CLI)」or「Desktop」で自動的にログインするかどうかを選択できる



### RaspberryPiとPCをLANケーブルで直接繋げてログインする

<details>
<summary> PCとRaspberry PiをLANケーブルで有線接続してください</summary>
<div>

[このサイト](https://yatakemi.github.io/2017/09/02/raspberrypi-setting-for-direct-connection/)を参考にしました

```
ssh ユーザ名@raspberrypi.local
```

でログインできるはずです。
raspberrypi.localがなんなのかは[このサイト](https://www.howtogeek.com/167190/how-and-why-to-assign-the-.local-domain-to-your-raspberry-pi/#:~:text=local%20instead%20of%20raspberrypi.,local%20.&text=local%20resolves%20to%20192.168.,Pi%20can%20now%20use%20the%20.)を見た方がいいかもしれません。

ただし、hostnameを変更している場合は「raspberrypi」の部分を設定したhostnameで書き換える必要があります

</div>
</details>

### 教育者向けの公式ドキュメント
<details>
<summary>教育者向けドキュメント</summary>
<div>
The Raspberry Pi Foundationは下記のURLにて教育者向けのマニュアルを用意しています。
https://downloads.raspberrypi.org/
</div>
</details>

### 問題が起きた時に参考になるページ
- raspberrypi.orgの公式ドキュメント
 - https://www.raspberrypi.org/documentation/

- raspbianの公式ホームページ
 - https://www.raspbian.org/

- Debianの日本語版リファレンス
 - https://www.debian.org/doc/manuals/debian-reference/index.ja.html