Raspberry Piにssh接続できるまでをちゃんと調べる

未完成。完成するかも不明
けれども色々なHow toを参考にして実行してるけど、それぞれの設定について納得できてないという人は自分だけじゃないと思うので軌跡だけでも置いておく
わかる方はどうかご教授お願いします

はじまり
--------
Raspberry Piのセットアップの最中ふと場当たり的にトラブルシュートして一連の手順をまとめることはしていたけども、設定項目について調べたと言えるほど調べてなかったなと思い至り手順を見つめ直して一つ一つ理解を深めようと思った

Hard: Raspberry Pi Zero WH
Host OS: macOS Catalina
Raspberry PiのOS: Raspbian Buster Lite(Version:February 2020)
OSの書き込みには[balenaEtcher(Writer)](https://www.balena.io/etcher/)を使用

対象範囲は`ssh pi@raspberrypi.local`で接続できるようになるところまで

```
echo "dtoverlay=dwc2" >> /Volumes/boot/config.txt
sed -i '1s/console=serial[^ ]* //g' /Volumes/boot/cmdline.txt
sed -i '1s/$/ modules-load=dwc2,g_ether/g' /Volumes/boot/cmdline.txt
touch /Volumes/boot/ssh
```

- https://gist.github.com/gbaman/50b6cca61dd1c3f88f41
- https://gist.github.com/gbaman/975e2db164b3ca2b51ae11e45e8fd40a

調べてるうちに[PiBakery](https://www.pibakery.org/)なるものを発見
これ使うほうが今風？まだほとんど調べてない

boot/config.txt
---------------
https://www.raspberrypi.org/documentation/configuration/config-txt/README.md
Raspberry PiではBIOSのかわりにconfig.txtが使用される

### dtoverlay
> dtoverlay=dwc2

オーバーレイにノードを追加する

- https://www.raspberrypi.org/documentation/configuration/device-tree.md
- https://www.raspberrypi.org/forums/viewtopic.php?t=179259#p1141001

SoCの完全なデバイスツリーは何百行もの大きいもの
さらに他コンポーネントを一緒に配置するとさらに大きくなる

管理しやすくするためにコンポーネントを共有するデバイスについては共通要素は共通ファイルで管理し別ファイルからインクルードするのがいい
なんだけどもRaspberry Piでプラグインアクセサリをサポートしようとすると共存可能な組み合わせが膨大で大変

解決策として部分的なデバイスツリーを用意しそこに必要なパラメータを記述するようにして
それをベースのデバイスツリー(Raspberry Piのモデルによって違う)と組み合わせることで完全なデバイスツリーを構築する
この部分的なデバイスツリーがオーバレイ

#### dwc2
DesignWare IPに含まれるUSB On-the-Goを実装したドライバ

- https://kinneko.hatenadiary.org/entry/20090401/p6
- https://www.synopsys.com/dw/ipdir.php?ds=dwc_usb_2_0_hs_otg

#### TODO
全体的によくわかってない

### TODO
- bootcode.bin
- start.elf
- USB On-the-Go https://www.usb.org/usb-on-the-go

boot/cmdline.txt
----------------
> console=serial0,115200 console=tty1 root=PARTUUID=xxxxxxxx-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh

- https://www.raspberrypi.org/documentation/configuration/cmdline-txt.md
- https://github.com/raspberrypi/linux/blob/rpi-4.0.y/Documentation/kernel-parameters.txt

### console
> console=serial0,115200 console=tty1

https://www.kernel.org/doc/html/latest/admin-guide/serial-console.html
利用するコンソールの設定
スペース区切りで複数指定可能。またカンマの後につづける形でオプションを指定可能
複数指定した場合全てのコンソールに出力が表示される
Rasbianの場合、上記のようにデフォルトでシリアルコンソールと一つの仮想コンソールが設定されている
自分の場合シリアルコンソールは利用しない&UARTとかでバッティングするようなのでserial0の方は削除している

#### TODO
- 仮想コンソールについて

### root
> root=PARTUUID=738a4d67-02

ルートファイルシステムとしてマウントするデバイスの指定

- https://github.com/raspberrypi/linux/blob/rpi-4.0.y/Documentation/kernel-parameters.txt#L3244
- https://github.com/raspberrypi/linux/blob/rpi-4.19.y/init/do_mounts.c#L173

デバイス名(/dev/sdb1とか)を指定する他デバイスのUUIDを指定する方法もある
[debianのwiki](https://wiki.debian.org/Part-UUID)にはデバイス名は起動のたびにランダムに切り替わりうる(他にもいくつかデバイス名を使わない方がいい理由が挙げられている)ので永続的な名前で指定した方がいいよって書いてある
色々フォーラムとかみてると元々PARTUUIDの使用はできなかった？のがどこかのタイミングでできるようになった？(色々検索しているときにPARTUUIDは使えないと書いてるページがあった。それ以上追っていないので定かではない)

#### TODO
- デバイスのUUIDについて

### rootfstype
> rootfstype=ext4

rootfsで使用するファイルシステムの指定

#### TODO
- ファイルシステムについて https://qiita.com/sion_cojp/items/c8e015db39ddbf43012e
- rootfsとルートファイルシステム

### elevator
> elevator=deadline

I/Oスケジューラの指定
https://github.com/raspberrypi/linux/blob/rpi-4.0.y/Documentation/kernel-parameters.txt#L1061

deadlineを指定することで全てのI/O操作に期限を課し、リクエストの枯渇を防ぐことができる

#### TODO
- その他のスケジューラ
  - cfq
  - noop

### fsck.repair
> fsck.repair=yes

起動時にファイルシステムが破損していた場合リペアを行うかどうかの指定らしい

#### TODO
一次情報がみつけられていない

### rootwait
> rootwait

ルートデバイスが認識されるのを待つ

USBデバイスなど非同期に認識されるデバイスにルートディレクトリがある場合、デバイスが認識されないと解決できない

#### TODO
- SDカードのみ使ってる場合必要？(SDカードもUSBデバイスと同じ扱いなのか？)

### quiet
> quiet

デフォルトのログレベルを*KERN_WARNING*に設定し、起動中のログ出力を抑える

### init
> init=/usr/lib/raspi-config/init_resize.sh

指定した実行ファイルを/sbin/initの代わりにinitプロセスとして実行する

ここで指定しているスクリプトは以下で管理されている模様
[/usr/lib/raspi-config/init_resize.sh](https://github.com/RPi-Distro/raspi-config/blob/7aca4ec3b06b7db2f424dd4014e0c96d1811aa0b/usr/lib/raspi-config/init_resize.sh)

以下目についたところ

https://github.com/RPi-Distro/raspi-config/blob/7aca4ec3b06b7db2f424dd4014e0c96d1811aa0b/usr/lib/raspi-config/init_resize.sh#L174

```
sed -i 's| init=/usr/lib/raspi-config/init_resize\.sh||' /boot/cmdline.txt
```

2回目以降の起動時には実行しないようになっている

https://github.com/RPi-Distro/raspi-config/blob/7aca4ec3b06b7db2f424dd4014e0c96d1811aa0b/usr/lib/raspi-config/init_resize.sh#L161
https://github.com/RPi-Distro/raspi-config/blob/7aca4ec3b06b7db2f424dd4014e0c96d1811aa0b/usr/lib/raspi-config/init_resize.sh#L77

```
  fix_partuuid
```

PARTUUIDの書き換えをしている

https://github.com/RPi-Distro/raspi-config/blob/7aca4ec3b06b7db2f424dd4014e0c96d1811aa0b/usr/lib/raspi-config/init_resize.sh#L177

```
if ! grep -q splash /boot/cmdline.txt; then
  sed -i "s/ quiet//g" /boot/cmdline.txt
fi
```

なぜquietを削除するんだろう

### modules-load
> modules-load=dwc2,g_ether

https://manpages.debian.org/stretch/systemd/systemd-modules-load.service.8.en.html#KERNEL_COMMAND_LINE

カンマ区切りでモジュールのリストを指定するとブート時にそれらのモジュールをロードする
rd.modules-loadってのもある模様

dwc2はドライバ、g_etherはUSB On-the-GoでEthernetを利用するためのモジュール
これらが有効化されることでUSBケーブルを使ってTCP/IP通信が可能になる

#### TODO
- initial RAM disk

boot/ssh
--------
https://www.raspberrypi.org/documentation/remote-access/ssh/README.md

bootパーティション上にsshという名称のファイルを置くことでsshが有効になる

Zeroconf
--------
http://www.zeroconf.org/
TODO