🍓

Raspberry Pi をmicroSDブート、SSDルートにする

2021/09/11に公開

前提条件

  • Raspberry Pi 4B
  • Raspberry Pi OS 32bit (2021-05-07-raspios-buster-armhf-lite)

USBブートできるのになぜ?

うちにあるUSB-SATA変換箱のどれを使ってもUSBブートが安定しなかったから。症状は…

  • 起動してしまえば安定する
  • reboot などで再起動するとほぼ確実に再起動に失敗する

やり方

概略は以下の通り

  1. RaspbianのイメージをmicroSDカードに焼く。
  2. vfatパーティションの cmdline.txtroot= の指定を書き換える
  3. 起動後に /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