Raspberry Pi 5でNVMeストレージ起動を試す
目的
ラズパイ5を入手。CPU速度アップしているので、SDカードではなくM.2 SSDにOSインストールして、さらに高速化したい。
使用するハードウェア
M.2 SSDとそのUSBアダプタ。いずれもAmazonで安めのものです。
下図がHat Drive! bottom
と呼ばれているM.2のマウンタです。
25ユーロ+送料20ユーロで合計45ユーロぐらいだったか?送料が高い。
作業の流れ
ざっと以下の流れでできました。
ネット上にあるやり方は既存のSDカードOSの/boot/config.txt
をチューニングした後で、
内容を丸ごとM.2 SSDにクローンしてブートを変更するやり方でした。
筆者の場合はOSを新規にSSDにインストールしてブートを切り替えれば良いので少し手順が違います。
最初にラズパイを起動してファームウェアを書き換える手順があるので、
一度はSDカードから起動する必要があります。
- とりあえずSDカードに最新のRaspberry Pi OSを入れて普通に起動できるようにしておく。
- M.2 SSDをUSB外付けケースに入れてこちらにも最新のRaspberry Pi OSをインストールする。この作業はPCでやりました。
- M.2 SSDをPCに再マウントしてbootドライブにあるconfig.txtを修正して取り外す。
- SDカードのOSからラズパイを起動して、M.2 SSDからブートできるようにしたら電源OFF。
- SDカードを取り外して、代わりにM.2 SSDをRaspberry Pi 5に取り付ける。
- ラズパイ起動。
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
せっかくなので、ストレージのベンチマークをやってみます。
下記のコマンドで測定スクリプトのダウンロードと測定が行われます。
最後にスコアが表示されます。私の環境だと、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の恩恵を受けている感じです。
ちなみにSDカードのNo.1でも2000~3000ぐらいだったので、10~15倍ぐらい早いです。速度もそうですが、耐久性は圧倒的に良いと思います。SDカードは良く壊れます。
余談)設定ミスして起動しなくなった場合
上記の説明の中でdtparam=pciex1_gen=3
を試しに設定したところ私の環境だとハングしました。そこから復旧する方法をとりあえず載せときます。
- SDカードだけ挿入して(SSDは接続せずに)起動する
- ブート順位をSDに戻して起動
BOOT_ORDER=0xf461
- M.2 SSDをマウントして、
/boot/config.txt
の設定を起動する内容に戻す - ブート順位を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