「Raspberry Pi 4 Model B で USB ブート(1)」では microSD 用のイメージを USB マスストレージにそのまま書き込んで、その後でパーティションのサイズを変更する手順を記した。
しかし実のところ、USB マスストレージにはシステムのファイルが配置されてさえいればよく、Raspberry Pi Imager や dd コマンドを使って厳密にコピーを行わなければならないわけではない。
ここでは最初にパーティションを作成し、次にファイルをコピーする手順を紹介する。
パーティションの作成
インストールイメージのパーティションを確認する
Raspberry Pi OS (64bit) のインストールイメージのパーティションは gdisk
コマンドで調べることができる。
$ unzip 2020-08-20-raspios-buster-arm64.zip
$ gdisk -l 2020-08-20-raspios-buster-arm64.img
GPT fdisk (gdisk) version 1.0.5
Partition table scan:
MBR: MBR only
BSD: not present
APM: not present
GPT: not present
***************************************************************
Found invalid GPT and valid MBR; converting MBR to GPT format
in memory.
***************************************************************
:
Number Start (sector) End (sector) Size Code Name
1 8192 532479 256.0 MiB 0700 Microsoft basic data
2 532480 7380991 3.3 GiB 8300 Linux filesystem
インストールイメージでは MBR によるパーティション管理がされていることがわかる。
なお1つ目のパーティションは /boot
、2つ目のパーティションは /
に割り当てられる。
パーティションを作成する
gdisk
コマンドで以下のようなパーティションを作成する。
$ sudo gdisk -l /dev/sdb
GPT fdisk (gdisk) version 1.0.5
Partition table scan:
MBR: protective
BSD: not present
APM: not present
GPT: present
Found valid GPT with protective MBR; using GPT.
:
Number Start (sector) End (sector) Size Code Name
1 2048 526335 256.0 MiB 0700 Microsoft basic data
2 526336 5860533134 2.7 TiB 8300 Linux filesystem
使用した USB マスストレージの容量は 3TB なので、GPT を選択した。2TB 未満(かつ 1 sector が 512 bytes 以下)なら MBR でも問題ないだろう。
USB マスストレージが HDD なら、ここで swap パーティションを作成してもいい。
パーティションのフォーマット
/boot
を vfat
、/
を ext4
でフォーマットする。
$ sudo mkfs -t vfat /dev/sdb1
$ sudo mkfs -t ext4 /dev/sdb2
ファイルのコピー
インストールイメージ、USB マスストレージをマウントし、内容をコピーする。
$ mkdir img_boot img_root
# イメージ内の /boot, / パーティションを loop デバイスに割り当てる
$ sudo losetup -Pr --show -f 2020-08-20-raspios-buster-arm64.img /dev/loop20
$ sudo mount /dev/loop20p1 img_boot
$ sudo mount /dev/loop20p2 img_root
# ファイルをコピーするため、USB マスストレージのパーティションをマウント
$ mkdir boot root
$ sudo mount /dev/sdb1 boot
$ sudo mount /dev/sdb2 root
# ファイルコピー
$ sudo cp -a img_boot/* boot/
$ sudo cp -a img_root/* root/
# インストールイメージの後片付け
$ sudo umount img_boot img_root
$ sudo losetup -d /dev/loop20
$ rmdir img_boot img_root
設定変更
cmdline.txt
と fstab
のパーティション情報を更新する。
# パーティションの PARTUUID を確認する
$ sudo blkid /dev/sdb?
/dev/sdb1: SEC_TYPE="msdos" UUID="C7EE-35DE" TYPE="vfat" PARTLABEL="Microsoft basic data" PARTUUID="09468d30-111e-4028-8f37-16f65e497c25"
/dev/sdb2: UUID="8aff8673-0851-45af-a8cd-8c31614b9632" TYPE="ext4" PARTLABEL="Linux filesystem" PARTUUID="9522d40d-e6df-422a-a5f6-26195aa7e074"
# root=PARTUUID= の値を上記の /dev/sdb2 の PARTUUID に書き換える
$ cat boot/cmdline.txt
console=serial0,115200 console=tty1 root=PARTUUID=9522d40d-e6df-422a-a5f6-26195aa7e074 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh splash plymouth.ignore-serial-consoles
# /boot と / の PARTUUID= に /dev/sdb1 と /dev/sdb2 のものをセットする
# swap など他のパーティションも作成した場合はここで追加しておく
$ cat root/etc/fstab
proc /proc proc defaults 0 0
PARTUUID=ee96d62f-2fe6-44c0-abcf-f70569772297 /boot vfat defaults 0 2
PARTUUID=035df15c-ccbe-45c0-9e9a-f97096bd3ee9 / ext4 defaults,noatime 0 1
# 後片付け
$ sudo umount boot root
$ rmdir boot root
あとはこの USB マスストレージを Raspberry Pi 4 に接続すれば起動できる。