🍓
Raspberry Pi をmicroSDブート、SSDルートにする
前提条件
- Raspberry Pi 4B
- Raspberry Pi OS 32bit (2021-05-07-raspios-buster-armhf-lite)
USBブートできるのになぜ?
うちにあるUSB-SATA変換箱のどれを使ってもUSBブートが安定しなかったから。症状は…
- 起動してしまえば安定する
- reboot などで再起動するとほぼ確実に再起動に失敗する
やり方
概略は以下の通り
- RaspbianのイメージをmicroSDカードに焼く。
- vfatパーティションの
cmdline.txt
のroot=
の指定を書き換える - 起動後に
/etc/fstab
を変更してmicroSDのbootをマウントする
2. cmdline.txtのルートファイルシステムの指定を書き換える
PARTUUIDの取得
microSDカードから起動してもUSBデバイスからブートしても良いので、ルートファイルシステムにしたいディスクがつながっている状態で sudo blkid
を実行する。
ここでほしいのはPARTUUIDの値である。
$ sudo blkid
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="5DE4-665C" TYPE="vfat" PARTUUID="8024d03d-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="7295bbc3-bbc2-4267-9fa0-099e10ef5bf0" TYPE="ext4" PARTUUID="8024d03d-02"
/dev/sda1: LABEL_FATBOOT="boot" LABEL="boot" UUID="7581-8A48" TYPE="vfat" PARTUUID="7a063ee3-01"
/dev/sda2: LABEL="rootfs" UUID="fa37d515-e741-4d35-bcec-4580aef395e1" TYPE="ext4" PARTUUID="7a063ee3-02"
/dev/mmcblk0: PTUUID="8024d03d" PTTYPE="dos"
/dev/mmcblk...
で始まる行はmicroSDカードなので無視する。
たいていの場合は、 /dev/sda2
になっていると思われる。上記の例の場合は、7a063ee3-02
が欲しい値。 これをメモしておく。
cmdline.txtの書き換え
Windowsから編集するのであれば microSDカードの cmdline.txt
microSDカードから起動しているのであれば、 /boot/cmdline.txt
USBデバイスから起動しているのであれば、
sudo mkdir /mnt/tmp
sudo mount /dev/mmcblk0p1 /mnt/tmp
した上で、 /mnt/tmp/cmdline.txt
変更前
console=serial0,115200 console=tty1 root=PARTUUID=8024d03d-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
変更後
console=serial0,115200 console=tty1 root=PARTUUID=7a063ee7-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait
これでmicroSDカードを差した状態で起動すれば、microSDカードから起動して / がUSBデバイスな状態になります。
/etc/fstab
を変更してmicroSDのbootをマウントする
USBデバイスの状態によりますが、microSDカードの中身をそのままUSBデバイスにコピーする。というパターンが多いと思います。
この場合、USBデバイス内にあるbootパーティションが /boot としてマウントされるようになっているので修正する。
/etc/fstab
PARTUUID=8024d03d-01 /boot vfat defaults 0 2
# ↓は元の値
#PARTUUID=7a063ee7-01 /boot vfat defaults 0 2
PARTUUID=7a063ee7-02 / ext4 defaults,noatime 0 1
完了
あとは普通にRPiが起動してくれば完了です。
起動したら mount | grep "/dev"
で想定通りになっているか確認しておきます。
だめな例 (/boot
が/dev/sda
になってしまっている)
/dev/sda2 on / type ext4 (rw,noatime)
/dev/sda1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
よい例
/dev/sda2 on / type ext4 (rw,noatime)
/dev/mmcblk0p1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)
Discussion