未完成。完成するかも不明
けれども色々な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)を使用
対象範囲は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なるものを発見
これ使うほうが今風?まだほとんど調べてない
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にはデバイス名は起動のたびにランダムに切り替わりうる(他にもいくつかデバイス名を使わない方がいい理由が挙げられている)ので永続的な名前で指定した方がいいよって書いてある
色々フォーラムとかみてると元々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
以下目についたところ
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の書き換えをしている
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
カンマ区切りでモジュールのリストを指定するとブート時にそれらのモジュールをロードする
rd.modules-loadってのもある模様
dwc2はドライバ、g_etherはUSB On-the-GoでEthernetを利用するためのモジュール
これらが有効化されることでUSBケーブルを使ってTCP/IP通信が可能になる
TODO
- initial RAM disk
boot/ssh
bootパーティション上にsshという名称のファイルを置くことでsshが有効になる