💻

Raspberry Pi 5でNVMeストレージ起動を試す

2023/12/30に公開

目的

ラズパイ5を入手。CPU速度アップしているので、SDカードではなくM.2 SSDにOSインストールして、さらに高速化したい。

使用するハードウェア

M.2 SSDとそのUSBアダプタ。いずれもAmazonで安めのものです。

下図がHat Drive! bottomと呼ばれているM.2のマウンタです。

https://pineberrypi.com/products/hatdrive-bottom-2230-2242-2280-for-rpi5

25ユーロ+送料20ユーロで合計45ユーロぐらいだったか?送料が高い。

作業の流れ

ざっと以下の流れでできました。

ネット上にあるやり方は既存のSDカードOSの/boot/config.txtをチューニングした後で、
内容を丸ごとM.2 SSDにクローンしてブートを変更するやり方でした。

筆者の場合はOSを新規にSSDにインストールしてブートを切り替えれば良いので少し手順が違います。

最初にラズパイを起動してファームウェアを書き換える手順があるので、
一度はSDカードから起動する必要があります。

  1. とりあえずSDカードに最新のRaspberry Pi OSを入れて普通に起動できるようにしておく。
  2. M.2 SSDをUSB外付けケースに入れてこちらにも最新のRaspberry Pi OSをインストールする。この作業はPCでやりました。
  3. M.2 SSDをPCに再マウントしてbootドライブにあるconfig.txtを修正して取り外す。
  4. SDカードのOSからラズパイを起動して、M.2 SSDからブートできるようにしたら電源OFF。
  5. SDカードを取り外して、代わりにM.2 SSDをRaspberry Pi 5に取り付ける。
  6. ラズパイ起動。

M.2 SSDへOSをインストールする

USB外付けアダプターを使用してM.2 SSDをPCに接続します。

USB外付けアダプターは安いもので良いと思います。

Pi Imagerをインストールして起動します。

  • インストールするOSを選択する
  • フラッシュするドライブ (アダプター経由で接続) を選択します
  • ストレージに書き込む

書き込みが成功すると、ラズパイOSは2つのパーティションが作成されます。
/bootパーティションはFATになっていて起動時の設定などが保存されています。

PCに再接続するとこのbootパーティションがマウントされます。

bootパーティションにあるconfig.txtをエディタで開いて以下を一番下に追記します。
デフォルトではGen2として認識されます。

dtparam=nvme

オプションで以下を設定するとGen3として動作するらしいですが、保証してないです。
試しにやってみましたが、起動で失敗しました。

dtparam=pciex1_gen=3

エラーがモニタに表示されてハングアップしました。内容は良く分からないけど
電源が足りてない(M.2基板への電源供給が足りてないかも?)ようなエラーでした。

非推奨っぽいのと、安定性に欠けそうなので、設定せずにGen2で使うことにしました。

SDカードからラズパイを起動してファームウェアを書き換える

まだこのときはM.2 SSDをラズパイには接続しなくていいです。

SDカードから起動したら、以下このコマンドでブートローダーを更新します。

sudo rpi-eeprom-update
*** UPDATE AVAILABLE ***
BOOTLOADER: update available
   CURRENT: Mon 30 Oct 16:45:10 UTC 2023 (1698684310)
    LATEST: Mon 20 Nov 19:40:17 UTC 2023 (1700509217)
   RELEASE: default (/lib/firmware/raspberrypi/bootloader-2712/default)
            Use raspi-config to change the release.

最新ではないので、アップデートする。

sudo rpi-eeprom-update -d -a
*** PREPARING EEPROM UPDATES ***

BOOTLOADER: update available
   CURRENT: Mon 30 Oct 16:45:10 UTC 2023 (1698684310)
    LATEST: Mon 20 Nov 19:40:17 UTC 2023 (1700509217)
   RELEASE: default (/lib/firmware/raspberrypi/bootloader-2712/default)
            Use raspi-config to change the release.
   CURRENT: Mon 30 Oct 16:45:10 UTC 2023 (1698684310)
    UPDATE: Mon 20 Nov 19:40:17 UTC 2023 (1700509217)
    BOOTFS: /boot/firmware
'/tmp/tmp.ebVV54rgVE' -> '/boot/firmware/pieeprom.upd'
Copying recovery.bin to /boot/firmware for EEPROM update

EEPROM updates pending. Please reboot to apply the update.
To cancel a pending update run "sudo rpi-eeprom-update -r".

成功したら再起動する

sudo reboot

再起動後、ファームウェアのチューニングをします。
以下のコマンドを起動すると設定内容を変更できます。

sudo rpi-eeprom-config --edit

[all]
BOOT_UART=1
POWER_OFF_ON_HALT=0
BOOT_ORDER=0xf461

BOOT_ORDERの値を変更して、PCIE_PROBE=1を追加します。

BOOT_ORDER=0xf416
PCIE_PROBE=1

Ctrl + Oで保存(オプション表示?されるがそのままエンター)
Ctrl + Xで終了

これでM.2 SSDが認識されるようになる。
この設定はSDカードではなく、フラッシュROM?に書き込まれると思います。

M.2 SSDをラズパイに接続して起動する

ここでSDカードは不要になるので、電源OFFの状態で抜いて、
M.2 SSDをラズパイに取り付けます。

ちょっとこの製品で微妙だったのが、

  • M.2 SSDを基板に取り付ける付属の真鍮製のマウンタだと固定してもグラグラする。自前のネジで取り付けた。
  • M.2 SSDを底面に取り付けることになるが、このままだと基板むき出しで机とかに接触するので、自前のマウンタを追加(4本の足)
  • 取付に関する説明が一切ない。利用者が投稿した写真など参考に取り付けた。
  • PCIeのフラットケーブルにも向きがあるのに説明がない。逆向きでも取り付けられてしまって最悪壊れるんじゃないかと。

組み立て完成後の状態。SDカードは抜いた状態で、フラットケーブルを写真のように接続します。

代わりにPCIeコネクタにM.2 SSDのケーブルを接続したら、電源ONします。

最初はトラブル対応の為にモニタを接続して状況を見れると良いです。
成功するとOSが起動するはずです。

M.2 SSDのベンチマーク測定

上記の手順で無事起動しました。
接続されているストレージを確認しておきます。

デバイスパスの/dev/nvme0n1p2、235GBとして正常にマウントされています。

> sudo df -h

Filesystem      Size  Used Avail Use% Mounted on
udev            3.8G     0  3.8G   0% /dev
tmpfs           805M  5.7M  800M   1% /run
/dev/nvme0n1p2  235G  4.5G  218G   3% /
tmpfs           4.0G  240K  4.0G   1% /dev/shm
tmpfs           5.0M   48K  5.0M   1% /run/lock
/dev/nvme0n1p1  510M   73M  438M  15% /boot/firmware
tmpfs           805M  144K  805M   1% /run/user/1000

fdiskで確認すると、SUNEAST SE900NVG3 256Gと認識されてます。問題なさそう。

> sudo fdisk -l

:
Disk /dev/nvme0n1: 238.47 GiB, 256060514304 bytes, 500118192 sectors
Disk model: SUNEAST SE900NVG3 256G                  
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x952ae70a

Device         Boot   Start       End   Sectors  Size Id Type
/dev/nvme0n1p1         8192   1056767   1048576  512M  c W95 FAT32 (LBA)
/dev/nvme0n1p2      1056768 500118191 499061424  238G 83 Linux

せっかくなので、ストレージのベンチマークをやってみます。

https://jamesachambers.com/2022-raspberry-pi-storage-benchmarks/

下記のコマンドで測定スクリプトのダウンロードと測定が行われます。
最後にスコアが表示されます。私の環境だと、Score: 32598 でした。

sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash

     Category                  Test                      Result
HDParm                    Disk Read                 436.03 MB/sec
HDParm                    Cached Disk Read          437.41 MB/sec
DD                        Disk Write                262 MB/s
FIO                       4k random read            110702 IOPS (442810 KB/s)
FIO                       4k random write           54323 IOPS (217294 KB/s)
IOZone                    4k read                   122789 KB/s
IOZone                    4k write                  146112 KB/s
IOZone                    4k random read            63325 KB/s
IOZone                    4k random write           148329 KB/s

                          Score: 32598

以下で、最新のベンチマーク結果が見れます。おおよそ第7位って感じでした。悪くないです。ちゃんとM.2の恩恵を受けている感じです。

https://pibenchmarks.com/fastest/

ちなみにSDカードのNo.1でも2000~3000ぐらいだったので、10~15倍ぐらい早いです。速度もそうですが、耐久性は圧倒的に良いと思います。SDカードは良く壊れます。

余談)設定ミスして起動しなくなった場合

上記の説明の中でdtparam=pciex1_gen=3を試しに設定したところ私の環境だとハングしました。そこから復旧する方法をとりあえず載せときます。

  1. SDカードだけ挿入して(SSDは接続せずに)起動する
  2. ブート順位をSDに戻して起動 BOOT_ORDER=0xf461
  3. M.2 SSDをマウントして、/boot/config.txtの設定を起動する内容に戻す
  4. ブート順位をM.2に変更して再起動
> sudo fdisk -l

Disk /dev/nvme0n1: 238.47 GiB, 256060514304 bytes, 500118192 sectors
Disk model: SUNEAST SE900NVG3 256G                  
:
Device         Boot   Start       End   Sectors  Size Id Type
/dev/nvme0n1p1         8192   1056767   1048576  512M  c W95 FAT32 (LBA)
/dev/nvme0n1p2      1056768 500118191 499061424  238G 83 Linux

> sudo mkdir -p /mnt/nvme
> sudo mount /dev/nvme0n1p1 /mnt/nvme
> sudo vi /mnt/nvme/config.txt
:

Discussion