LoginSignup
0
0

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-02-21

未完成。完成するかも不明
けれども色々な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

調べてるうちにPiBakeryなるものを発見
これ使うほうが今風?まだほとんど調べてない

boot/config.txt

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

dtoverlay

dtoverlay=dwc2

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

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

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

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

dwc2

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

TODO

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

TODO

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

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

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

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

TODO

  • デバイスのUUIDについて

rootfstype

rootfstype=ext4

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

TODO

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が有効になる

Zeroconf

http://www.zeroconf.org/
TODO

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0