Raspberry Pi Compute Module 4(CM4)向けのNVMe boot support のEEPROM( 2021-07-07 – Promote pieeprom-2021-07-06 to stable – STABLE )がリリースされたので、on-board eMMCと PCIeスロットに挿したNVMe M.2 SSDからのOSブートを試しました。安定した高速アクセスによるGUI操作はとても快適です。
準備したパーツ
CM4は Raspberry Pi 4 Model B の産業・組み込み用途向けモデルです。無線LAN及びBluetoothの有無、RAMのサイズ、on-board eMMCのサイズにより多くのラインナップがあります。

CM4にはIOコネクタの実装がないので、専用のRaspberry Pi Compute Module 4 IO Board(以下、IOボード)とセットで使ってます。IOボードには、USB3.0の代わりにPCIeが、RTCとバックアップ用の電池ホルダ(CR2031)などが追加されています。
この PCIeスロットにNVMe M.2 SSD カードを挿します。PWM Fan付ヒートシンクは、「Raspberry Pi OSの設定」で65℃でFANがONになる設定にしています。



# | 名称 | 仕様 |
1 | Raspberry Pi CM 4 | 無線LAN及びBluetooth:無、 RAM:8GB、eMMC:32GB モデル |
2 | Raspberry Pi CM 4 IO Board | |
3 | CM4用ヒートシンク GeeekPi PWM Fan付(ZP-0112) | ※サポートサイト |
4 | ACアダプター | 12V 5A |
5 | ジャンパーピン | ※J2ピンに利用 |
6 | PCI-E 3.0 x1レーン- M.2 NGFF M-Key SSD Nvme AHCI PCI Express アダプタカード | ※ラズベリーパイ財団の文書にカード要件の記載があります。 |
7 | NVMe M.2 SSD(2280) ・MZ-VPV2560 ・MZ-V7S250 | 250GB 2280 m.2 pci express x4 ※PCリプレスで余っていた手持ち品 ※NVMe (non-volatile memory express) |
8 | microB – A USBケーブル | ※CM4 IOボードとPCのUSB接続用 |
9 | キーボートとマウス | ※手持ちのUSBレシーバ型 |
10 | Windows PC | ※CM4 eMMCのドライブマウント、OS書き込み |
11 | Raspberry Pi 4B | ※EEPROMイメージの CM4 書込み 、ブートの設定 |
12 | NVMe M.2 SSD M Key USB外付けケース | 2242/2260/2280 SSD対応 ※PC接続してフォーマット時に利用 |
on-board eMMCからRaspberry Pi OSを起動する手順メモ
CM4のeMMC は外付けのUSBメモリやmicroSDカードのように取り外せないので、PCに専用ツール rpiboot をインストールして USB大容量ストレージとして認識させてから 、IOボートとUSBケーブルでつないで、Raspberry Pi Imagerから on-board eMMC にOSを書き込みます。
WindowsPCとCM4をつないでon-board eMMCにOS書き込み
(1)rpiboot( Windowsインストーラ)をダウンロード してインストールしておきます。インストールが完了するとWinsowsメニューに「 rpiboot 」ができます。
(2)on-board eMMCを「USB 大容量ストレージ」モードに設定するために、IOボードの「Fit jumper to disable eMMC Boot」というラベルの付いたJ2ピンにジャンパピンを挿します。
(3)PCからUSBケーブルをIOボードの「USB Slave」ラベルのmicroUSBポートに差し込み、12V電源を入れます。IOボードの電源が入り、赤い D1 LED が点灯(J2ジャンパで eMMC ブートを無効にしているので CM4は起動しません)。
(4) 「rpiboot」を起動すると、コマンドが実行され、eMMC がストレージとしてマウントされます(D:¥など)。もし、FAT32でフォーマットしますか?とのポップアップメッセージが出たらOKします。これでeMMC ストレージはPCに接続した USB ドライブと同じように動作します。緑のD2 LEDが点灯。
(5)「Raspberry Pi Imager」を起動してOSをeMMC ストレージ 「RPi-MSD-0001」に書き込みます。今回は「Raspberry Pi OS(32bit)」をセットアップしました。
(6) 書き込みが終了したら、電源を切って、USBケーブル、J2ジャンパーを外します。再度電源を入れると eMMC ストレージ に書き込んだ Raspberry Pi OS(32bit) が起動します。


USB2.0を有効化してマウスとキーボート接続(2022/02/25訂正)
CM4 IOボードのUSB2.0は デフォルトでは有効化されていないので、USB2.0につないだマウスやキーボートが使えません。 configファイルを直接編集します。なお、(5)のRaspberry Pi Imagerで書き込んだ直後ではeMMC内には configファイルが見えませんでした。一回でもCM4を起動すると D:¥フォルダ内にconfig.txtファイルがあります。
(7) IOボード の電源を切った後、J2にジャンパーを挿して、PCとIOボードをUSBケーブルで接続します。 IOボード の電源を入れ、 PCで「rpiboot」を起動してCM4の eMMC ストレージ に保存されている「config.txt」ファイルに下記の3行を追記して保存します。
# Enable USB2.0
dtoverlay=dwc2
dr_mode=host
IOボード の 電源を切って、USBケーブル、J2ジャンパーを外します。
Raspberry Pi OSの初期設定
(8) LANケーブル、HDMIディスプレイ、マウス、キーボードをつないで電源を入れると Raspberry Pi OSの初期設定画面が立ち上がるので設定を行います。 その後、苺マークのメニューから「設定 」–>「Raspberry PIの設定」でSSHとVNC Serverを有効化を行いました。
設定完了後にCM4をShutdownして 電源を切ります。
NVMe M.2 SSDからRaspberry Pi OSを起動する手順メモ
CM4のEEPROMアップデート(2021/9/21 ファイル名の誤り訂正)
CM4の NVMe boot support のEEPROMが latest beta から stable になりました。
Release notes :2021-07-07 – Promote pieeprom-2021-07-06 to stable – STABLE
Firmware:pieeprom-2021-07-06.bin
下記はEEPROMイメージファイル作成、書き込み時にRaspberry PI 4BのLXTerminalから打ち込んだコマンドのメモです。
0x1 SD card or eMMC on CM4
0x6 NVMe SSD

sudo apt install git
git clone --depth=1 https://github.com/raspberrypi/usbboot
cd usbboot
sudo apt install -y libusb-1.0-0-dev
make
cd recovery
rpi-eeprom-config /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2021-07-06.bin -o boot.conf
sudo nano boot.conf ※BOOT_ORDER=0xf16を追加
rpi-eeprom-config -c boot.conf -o pieeprom.bin /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2021-07-06.bin
sha256sum pieeprom.bin | awk '{print $1}' > pieeprom.sig
sudo ../rpiboot -d .
rpibootの実行で Raspberry Pi 4B が待機状態になるので、4B のUSBポートとCM4 IOボードのmicroUSBポートをUSBケーブルで接続し、CM4 IOボードのJ2ジャンパーをショートして、CM4 IOボードの電源をオンにします。
電源をオンすると待機状態の画面が動き出して書き込みが始まります。書き込みが終わったら、CM4の電源を切ります。

CM4のUSBケーブル、J2ジャンパーを外して電源をオン、eMMCのRaspberry Pi OSを起動してバージョン日付を確認します。
vcgencmd bootloader_version
更新後のbootloaderバージョン日付は「July 6 2021」になりました。


PCIeスロットにブランクのNVMe M.2 SSDカードを挿して認識するかを確認
NVMe M.2 SSDカードはUSB外付けケースを使ってWindows PCに接続して、FAT32でフォーマットしておきます。
Raspberry Pi Imagerの「Erase」でFAT32でフォーマットするのが簡単ですが、フォーマットできない大容量サイズの場合は、Fat32Formatterといったフリーソフトを利用させていただきました(2024/07/03追記)。
FAT32でフォーマットしたNVMe M.2 SSDカードを実装したPCIeアダプターカードを、電源を切った状態で、IOボードの PCIeスロットに挿します。このPCIeアダプターカードは、NVMe M.2 SSDにアクセスがあると緑色のLEDが眩し過ぎるくらい点滅します。


eMMCからブートしたRaspberry Pi OSから、NVMe M.2 SSD を下記コマンドで確認したところ、無事ストレージとして認識しました。
lsblk
ls -l /dev/nvme*

NVMeブートに変更(2021/9/21 ディレクトリ名の誤り訂正)
下記は Raspberry Pi 4BのLXTerminalで打ち込んだコマンドラインのメモです。前記した CM4のEEPROMアップデートと同様に、J2ジャンパーをつけて、Raspberry Pi 4BとUSBケーブルをつないでからCM4の電源を入れます。下記のコマンドを実行してrpibootを実行します。
cd usbboot/recovery
sed -i 's/\(BOOT_ORDER=.*\)6\(.*\)/\1\26/' boot.conf
./update-pieeprom.sh
cd ..
sudo ./rpiboot -d recovery
0x6 NVMe SSD
0x1 SD card or eMMC on CM4

rpibootが完了したら、USBケーブルとJ2ジャンパを抜いてCM4 IOボードの電源を入れなおします。
なお、 NVMeブート変更しても NVMe M.2 SSD には未だOSがインストールされていないので、eMMCで起動します。
引き続き、eMMCのRaspberry Pi OSを NVMe M.2 SSD にコピー、ファームウェアやカーネルなどを最新のプレリリースバージョンにアップデートすることで NVMeブート設定が完了します。
eMMCのRaspberry Pi OSをNVMe M.2 SSDにコピー
CM4のRaspberry Pi OSの苺メニューの「SD Card Copier」でコピーします。その際、「New Partition UUIDs」にチェックを入れます。

NVMeディスクのファームウェアとカーネルを最新バージョンにアップデート
コピーが完了したら、引き続き、VideoCoreファームウェア、Raspberry Pi OS Linuxカーネルなどを最新のプレリリースバージョンにアップデートします。
CM4のRaspberry Pi OSのLXTerminalから打ち込んだコマンドラインのメモです。
mkdir mnt
mkdir mnt/fat32
mkdir mnt/ext4
sudo mount /dev/nvme0n1p1 mnt/fat32
sudo mount /dev/nvme0n1p2 mnt/ext4
sudo ROOT_PATH=mnt/ext4 BOOT_PATH=mnt/fat32 rpi-update

NVMeブートの動作検証
アップデート完了後に再起動すると、NVMeブートでRaspberry Pi OSが起動することを確認できました。PCIeスロットのNVMe M.2 SSDカードを取り外すと、eMMCからOSブートします。
NVMe M.2 SSDブートしたデスクトップの壁紙は、間違わないように「設定」→「外観の設定」「画像」で「cliff.jpg」に変更しています。
vcgencmd bootloader_version
lsblk
ls -l /dev/nvme*

NVMe M.2 SSDの速度をhdparmで簡易測定
Raspberry Pi OS(32bit) をNVMeブートした NVMe M.2 SSDの速度をhdparmを使って簡易測定しました。
sudo apt install hdparm
sudo hdparm -t /dev/nvme0n1
sudo hdparm -t /dev/mmcblk0
-t:Timing buffered disk reads
-T:Timing cached reads
# | 接続コネクタ | ※5回平均 hdparm -t (MB/s) | 接続デバイス |
1 | eMMC | 83 | on-board eMMC 32GB |
2 | PCIe Gen2.0 x 1socket | 333 376 | NVMe M.2 SSD MZ-VPV2560 256GB MZ-V7S250 256GB |
参照したサイト (2021/8/12 URL見直し)
CM4のeMMCブート、NVMeブートの設定手順は、ラズベリーパイ財団の下記Webサイトのドキュメントを参照しました。
・NVMe SSD Boot – raspberrypi.org
・Raspberry Pi USB booting code, moved from tools repositor – Github
・Flashing the Compute Module eMMC – raspberrypi.org
Mistake in documentation, “Flashing the Compute Module eMMC”- forums
・Raspberry Pi 4 bootloader configuration – raspberrypi.org
・Raspberry Pi 4 boot EEPROM – raspberrypi.org
・Raspberry Pi 4 boot flow – raspberrypi.org
・Raspberry Pi4 bootloader EEPROM release notes – github.com
2021-07-07 – Promote pieeprom-2021-07-06 to stable – raspberrypi.org
・rpi-eeprom-firmware at master · raspberrypi-rpi-eeprom · GitHub
・Compute Module 4 specification – raspberrypi.org
・Compute Module 4 IO Board specification – raspberrypi.org
・Compute Module 4 Datasheet – raspberrypi.org
・Compute Module 4 IO Board Datasheet – raspberrypi.org
・Raspberry Pi – GitHub
・Raspberry Pi 4 Model B specifications – Raspberry Pi
・Raspberry-Pi-4-Product-Brief.pdf (raspberrypi.org)
・SCHEMATIC1 : REDUCED SCHEMATICS (raspberrypi.org)