Raspberry Pi 4 Model B で USB ブート(2) パーティション作成編

「[Raspberry Pi 4 Model B で USB ブート(1)](https://qiita.com//nowlinuxing/items/3c7f61bca6e5ef0d1c47)」では microSD 用のイメージを USB マスストレージにそのまま書き込んで、その後でパーティションのサイズを変更する手順を記した。
しかし実のところ、USB マスストレージにはシステムのファイルが配置されてさえいればよく、Raspberry Pi Imager や dd コマンドを使って厳密にコピーを行わなければならないわけではない。
ここでは最初にパーティションを作成し、次にファイルをコピーする手順を紹介する。

## パーティションの作成

### インストールイメージのパーティションを確認する

Raspberry Pi OS (64bit) のインストールイメージのパーティションは `gdisk` コマンドで調べることができる。

```sh
$ 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` コマンドで以下のようなパーティションを作成する。

```sh
$ 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` でフォーマットする。

```sh
$ sudo mkfs -t vfat /dev/sdb1
$ sudo mkfs -t ext4 /dev/sdb2
```

## ファイルのコピー

インストールイメージ、USB マスストレージをマウントし、内容をコピーする。

```sh
$ 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` のパーティション情報を更新する。

```sh
# パーティションの 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 に接続すれば起動できる。

---

* [Raspberry Pi 4 Model B で USB ブート(1)](https://qiita.com/nowlinuxing/items/3c7f61bca6e5ef0d1c47)
* [Raspberry Pi 4 Model B で USB ブート(2) パーティション作成編](https://qiita.com/nowlinuxing/items/7af17f1272ca0c558d47)
* [Raspberry Pi 4 Model B で USB ブート(3) LVM 編](https://qiita.com/nowlinuxing/items/b57b3aa910fee9b82052)