Raspberry Pi 4をSSDからブートしてベンチマークしてみた

7 min read読了の目安(約6600字

はじめに

Raspberry Pi 4 Model Bの8GB版を入手したので、以前からやってみたかったSSDからのブートについて試してみました。
・・・あっさり成功しました。
特段に記事にする内容はありませんでしたが、手順を整理し、ストレージのI/Oについてベンチマークテストの結果を記します。

Raspberry Pi 4をUSB接続のSSDからブートする

Raspberry Pi 4のUSBマスストレージデバイスからのブートは、当初はいろいろと大変だったみたいですが、現時点(2021年5月4日)ではブートローダも正式版になり、誰でも手軽に試すことができます。

以下の記事が参考になりました。

環境

OSには、Raspberry Pi OS Lite 64ビット版(2021-04-09版)を使用しました。イメージのファイルサイズとSHA-1ハッシュ値は以下の通りです。

$ ls -l 2021-03-04-raspios-buster-arm64-lite.*
-rw-r--r--@ 1 yuya  staff  1807745024 Mar  5 09:14 2021-03-04-raspios-buster-arm64-lite.img
-rw-r--r--@ 1 yuya  staff   403415352 Apr 27 16:43 2021-03-04-raspios-buster-arm64-lite.zip

$ shasum 2021-03-04-raspios-buster-arm64-lite.*
496813e17c51d863ee22aea449e45798fbd077c8  2021-03-04-raspios-buster-arm64-lite.img
1bf60e17074decf585cf1ba1736c7fcc575eb39d  2021-03-04-raspios-buster-arm64-lite.zip

microSDカードからのブート

まずは動作確認と設定のために、microSDカードにOSイメージを書き込んでブートしました。ブート後の環境は以下の通りです。メモリに余裕があって良いですね。

$ cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
VERSION_ID="10"
VERSION="10 (buster)"
VERSION_CODENAME=buster
ID=debian
HOME_URL="https://www.debian.org/"
SUPPORT_URL="https://www.debian.org/support"
BUG_REPORT_URL="https://bugs.debian.org/"

$ uname -a
Linux raspi4b8g-1 5.10.17-v8+ #1403 SMP PREEMPT Mon Feb 22 11:37:54 GMT 2021 aarch64 GNU/Linux

$ grep Model /proc/cpuinfo
Model		: Raspberry Pi 4 Model B Rev 1.4

$ free
              total        used        free      shared  buff/cache   available
Mem:        8000844       70332     7565916       16844      364596     7798872
Swap:        102396           0      102396

ブートローダの更新

OSのアップデート後、raspi-configコマンドを使って最新のブートローダに変更します。

$ sudo apt update
$ sudo apt upgrade
$ sudo rpi-eeprom-update
*** UPDATE AVAILABLE ***
BOOTLOADER: update available
   CURRENT: Thu Mar 19 14:27:25 UTC 2020 (1584628045)
    LATEST: Thu Sep  3 12:11:43 UTC 2020 (1599135103)
   RELEASE: default (/lib/firmware/raspberrypi/bootloader/default)
            Use raspi-config to change the release.

  VL805_FW: Using bootloader EEPROM
     VL805: up-to-date
   CURRENT: 000137ad
    LATEST: 000137ad

$ sudo raspi-config
# 6 Advanced Options
# A7 Bootloader Version
# E1 Latest  Use the latest version boot ROM software

# 再起動

$ sudo rpi-eeprom-update
BOOTLOADER: up-to-date
   CURRENT: Thu Mar 18 08:54:11 UTC 2021 (1616057651)
    LATEST: Thu Mar 18 08:54:11 UTC 2021 (1616057651)
   RELEASE: stable (/lib/firmware/raspberrypi/bootloader/stable)
            Use raspi-config to change the release.

  VL805_FW: Using bootloader EEPROM
     VL805: up-to-date
   CURRENT: 000138a1
    LATEST: 000138a1

microSDカードからSSDへのコピー

USB接続のSSD「BUFFALO SSD-PGM480U3-B/N」をRaspberry Pi 4のUSB 3.0ポート(青い方)に接続し、ddコマンドを使ってmicroSDカードの内容をSSDにコピーしました。64GBのコピーに約25分掛かりました。
念のため、lsusbで接続速度を確認しました。5000Mとなっているので、USB 3.0で接続されていることが分かります。

$ lsusb -t
/:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/4p, 5000M
    |__ Port 1: Dev 2, If 0, Class=Mass Storage, Driver=uas, 5000M
/:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=xhci_hcd/1p, 480M
    |__ Port 1: Dev 2, If 0, Class=Hub, Driver=hub/4p, 480M

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0 447.1G  0 disk
mmcblk0     179:0    0  59.7G  0 disk
|-mmcblk0p1 179:1    0   256M  0 part /boot
`-mmcblk0p2 179:2    0  59.4G  0 part /

# 注意: デバイス名を間違えると、データの消失などの回復不能な問題が生じますので注意してください。
$ sudo dd if=/dev/mmcblk0 of=/dev/sda bs=16M status=progress
64088965120 bytes (64 GB, 60 GiB) copied, 1455 s, 44.0 MB/s
3820+0 records in
3820+0 records out
64088965120 bytes (64 GB, 60 GiB) copied, 1465.68 s, 43.7 MB/s

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda           8:0    0 447.1G  0 disk
|-sda1        8:1    0   256M  0 part
`-sda2        8:2    0  59.4G  0 part
mmcblk0     179:0    0  59.7G  0 disk
|-mmcblk0p1 179:1    0   256M  0 part /boot
`-mmcblk0p2 179:2    0  59.4G  0 part /

ブート順序の変更

raspi-configコマンドを使って、USBデバイスから優先的にブートするように設定します。

$ sudo raspi-config
# 6 Advanced Options
# A6 Boot Order
# B2 USB Boot     Boot from USB if available, otherwise boot from SD Card

再起動すれば、USBデバイスからブートします。楽チンですね。

ストレージのベンチマーク

microSDカードからブートした場合と、SSDからブートした場合のそれぞれについて、ストレージのベンチマークテストを実施しました。

以下の記事を参考に、fioコマンドを使い、以下の設定で測定を実施しました。

LinuxでもCrystalDiskMarkぽいディスクベンチマークしたい - 動かざることバグの如し

$ sudo apt update
$ sudo apt install fio
$ cat <<EOS > fio.config
[global]
ioengine=libaio
iodepth=1
size=1g
direct=1
runtime=60
directory=/tmp
stonewall

[Seq-Read]
bs=1m
rw=read

[Seq-Write]
bs=1m
rw=write

[Rand-Read-512K]
bs=512k
rw=randread

[Rand-Write-512K]
bs=512k
rw=randwrite

[Rand-Read-4K]
bs=4k
rw=randread

[Rand-Write-4K]
bs=4k
rw=randwrite

[Rand-Read-4K-QD32]
iodepth=32
bs=4k
rw=randread

[Rand-Write-4K-QD32]
iodepth=32
bs=4k
rw=randwrite
EOS

microSDカードの測定結果

microSDカードからブートした場合の測定結果は以下の通りです。

$ lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
mmcblk0     179:0    0  59.7G  0 disk
|-mmcblk0p1 179:1    0   256M  0 part /boot
`-mmcblk0p2 179:2    0  59.4G  0 part /

$ fio -f fio.config
項目 速度 IOPS
Seq-Read 43.9MB/s 41
Seq-Write 22.5MB/s 21
Rand-Read-512K 42.3MB/s 80
Rand-Write-512K 19.0MB/s 36
Rand-Read-4K 10.6MB/s 2575
Rand-Write-4K 3849kB/s 939
Rand-Read-4K-QD32 14.3MB/s 3493
Rand-Write-4K-QD32 4559kB/s 1113

SSDの測定結果

$ lsblk
NAME   MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
sda      8:0    0 447.1G  0 disk
|-sda1   8:1    0   256M  0 part /boot
`-sda2   8:2    0  59.4G  0 part /

$ fio -f fio.config
項目 速度 IOPS
Seq-Read 295MB/s 281
Seq-Write 244MB/s 232
Rand-Read-512K 213MB/s 405
Rand-Write-512K 203MB/s 386
Rand-Read-4K 20.6MB/s 5040
Rand-Write-4K 24.0MB/s 5862
Rand-Read-4K-QD32 69.4MB/s 16.9k
Rand-Write-4K-QD32 42.5MB/s 10.4k

最後に

今回はRaspberry Pi 4のSSDからのブートを試しました。
当たり前ですが、microSDカードよりSSDの方がだいぶ高速ですね。
また、耐久性もSSDの方が高いと思われることから、より安定した運用が期待できそうです。