🍓

Raspberry Pi 3/4 で USB Boot する

2023/11/04に公開

既に至るところに類似の記事があり、散々擦られているネタですが、自分なりに纏めておく。

環境

  • board: Raspberry Pi 3 B
  • OS: Raspbian buster 32bit (Raspberry Pi OS)

ホストPC環境として、Ubuntu 22.04。
以下のツールを使うため。

  • GNOME Disks⁠ (GUI)
  • GParted (GUI)
  • blkid (CUI)

目標

sdcard 32GB と USB メモリ 256GB で運用していた環境を、USB メモリ 1 本に一本化する

作業

USB Boot を有効化する

USB Boot を無効から有効にするために、SD カードによるブートが必要。
Raspberry Pi 上で Raspberry Pi OS を起動し、必要に応じてハードの設定を書き換える。詳細は別の方の記事を見てください。

$ vcgencmd otp_dump | grep 17:
17:1020000a
$ sudo echo "program_usb_boot_mode=1" >> /boot/config.txt
$ sudo echo "program_usb_boot_timeout=1" >> /boot/config.txt
$ sudo reboot
$ vcgencmd otp_dump | grep 17:
17:3020000a

USB メモリにイメージを書き込む

SD カードと USB メモリをホストPCに接続する。勝手にマウントするので、 GNOME Disks を開いてアンマウントする。

GParted を開いて、Resize/Move したりコピーペーストしたりして調整する。
exfat 等のファイルシステムは調整できないので、ext4にフォーマットする。

特に boot パーティションのフラグがコピー元と同じか確認しておく。

UUID の確認

USB メモリの各パーティションの UUID と PARTUUID を blkid コマンドで確認する。
パーティションごとコピーしたため UUID が同一になってしまっているが、PARTUUID を使うので無視する。PARTUUID を控えておく。

# 一部置き換えています
/dev/sda1: LABEL_FATBOOT="boot" LABEL="boot" UUID="X111-111X" TYPE="vfat" PARTUUID="bbbbbbbb-01"
/dev/sda2: UUID="yyyyyyyy-yyyy-yyyy-yyyy-yyyyyyyyyyyy" TYPE="ext4" PARTUUID="bbbbbbbb-02"
/dev/sda3: LABEL="rootfs" UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4" PARTUUID="bbbbbbbb-03"
/dev/mmcblk0p1: LABEL_FATBOOT="boot" LABEL="boot" UUID="X111-111X" TYPE="vfat" PARTUUID="aaaaaaaa-01"
/dev/mmcblk0p2: LABEL="rootfs" UUID="xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" TYPE="ext4" PARTUUID="aaaaaaaa-02"

/boot/cmdline.txt の書き換え

boot パーティションの /cmdline.txt に、どのパーティションを rootfs にするか設定されている。
USB メモリの boot パーティションをマウントし、sudo 権限でテキストエディタを開く。
root=PARTUUID=aaaaaaaa-02 が SD カードのパーティションになっているので、USB メモリのパーティションに置き換える。

$ sudo gedit /media/mai/boot/cmdline.txt
dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=PARTUUID=aaaaaaaa-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait

/etc/fstab の書き換え

忘れがちなやつ。not syncing VFS unable to mouant root fs on... と画面に出たらこれが原因のことが多い。

rootfs パーティションの /etc/fstab にマウント情報が記載されている。
USB メモリの rootfs パーティションをマウントし、sudo 権限でテキストエディタを開く。
SD カードのパーティションが記載されているので、USB メモリのパーティションに置き換える。

$ sudo gedit /media/mai/rootfs/etc/fstab 
proc            /proc           proc    defaults          0       0
PARTUUID=aaaaaaaa-01  /boot           vfat    defaults          0       2
PARTUUID=aaaaaaaa-02  /               ext4    defaults,noatime  0       1

起動

SDカードを外したまま USB メモリを刺して、電源を入れる

Discussion