【Raspberry Pi 5】M.2 2230 NVMe SSD で起動してみた(内蔵Bluetoothが不安定になった)

Homebridge のために Raspberry Pi Zero 2W を利用していましたが、Raspberry Pi OS を 64bit版 Bookworm に更新したところ以下の問題が発生するようになりました。

面倒になったので環境を新調しました。オーバースペックですがこのタイミングなので Raspberry Pi 5 4GB を購入です。(当初は「4GBの方が8GBよりも速い」と言われていましたが、現在は対応が行われています)

Raspberry Pi Zero 2 W で使った 64bit版 Bookworm の microSD を入れるだけで問題なく起動し、上記の問題はもちろん解決しました。

ストレージベンチマーク

PiBenchmarks の結果は次のとおりです。

microSD

    Category           Test                 Result
HDParm          Disk Read               74.28 MB/sec
HDParm          Cached Disk Read        41.75 MB/sec
DD              Disk Write              40.2 MB/s
FIO             4k random read          4779 IOPS (19117 KB/s)
FIO             4k random write         712 IOPS (2849 KB/s)
IOZone          4k read                 20717 KB/s
IOZone          4k write                2740 KB/s
IOZone          4k random read          14833 KB/s
IOZone          4k random write         2757 KB/s

                        Score: 1777

USBメモリによる起動も試してみました。

USBメモリ

    Category           Test                 Result
HDParm          Disk Read               288.63 MB/sec
HDParm          Cached Disk Read        295.89 MB/sec
DD              Disk Write              238 MB/s
FIO             4k random read          6243 IOPS (24975 KB/s)
FIO             4k random write         11544 IOPS (46178 KB/s)
IOZone          4k read                 20608 KB/s
IOZone          4k write                29516 KB/s
IOZone          4k random read          15896 KB/s
IOZone          4k random write         24073 KB/s

                        Score: 7385

microSD に比べるとかなり速くなります。

SSDへの換装

ただ、せっかくの Raspberry Pi 5 なら PCIe 接続でSSDを使いたい。また、理由があって公式ケースに収めたい。(後述)

ということで結果はこうなりました。現時点では少し珍しい構成です。

ACE desgin studio PI-2230-SSD

PCIe to M.2 NVMe SSD 拡張ボードは ACE desgin studio の PI-2230-SSD です。

こちらの商品は以下のポストから見つけました。

しかし、この製品の利用者がまったく見つかりません。公式ケースに対応する/しそうな製品としてメジャーなのは Geekworm X1003 や Pineberry Pi HatDrive! Top あたりです。

エアフロー、デザイン、GPIO を塞がない点では PI-2230-SSD に惹かれますが、やっぱり利用者の情報は見つからず。どうしたものかと開発元のプロフィールを覗いてみると...

@ichirowo さんの安心感により購入に踏み切れました。(個人の感想です)

日本時間の3月5日午前に注文して翌日発送、3月11日に到着しました。日本国内の配送は佐川急便で大きな箱にしっかり梱包されていました。

アクティブクーラーに取り付けるネジとスペーサーは予備まで入っている親切さです。

WD SN740 NVMe SSD

取り付ける M.2 2230 NVMe SSD は WD SN740 を用意しました。メルカリで新品PC外しの 512GB を格安で入手できたためです。

Pimoroni NVMe Base による動作確認では 'Maybe' List に分類されていますが、詳細には "Our fresh unit worked well. YMMV." と記載されています。この分類のためか本製品も利用者の情報が見つかりませんでした。

まだ様子見の段階ですが(起動すれば)問題なく動いているように思います。(後述)

PCIe有効化

設定方法は公式資料のほか、いろいろなところで紹介されているため割愛します。

起動ディスクのコピー

Raspberry Pi OS Lite を利用しているので、よく紹介されるデスクトップ版の SD Card Copier による方法は使えません。

microSDUSBメモリSSD へのコピーには rpi-clone を利用しました。

オリジナル版は更新が止まっており、新しいOSのディレクトリ構造や NVMe SSD に対応していないため上記の fork を利用しています。

初期化からパーティション分割、コピーした以下のファイルに含まれる PARTUUID 文字列の書き換えまで対応してくれます。

/boot/firmware/cmdline.txt
/etc/fstab

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

PCIe Gen 2.0

    Category           Test                 Result
HDParm          Disk Read               384.84 MB/sec
HDParm          Cached Disk Read        434.37 MB/sec
DD              Disk Write              317 MB/s
FIO             4k random read          110107 IOPS (440430 KB/s)
FIO             4k random write         80629 IOPS (322519 KB/s)
IOZone          4k read                 182538 KB/s
IOZone          4k write                169971 KB/s
IOZone          4k random read          76074 KB/s
IOZone          4k random write         186991 KB/s

                        Score: 40980

PCIe Gen 3.0

dtparam=pciex1_gen=3 を設定するとかなりスコアが向上します。

    Category           Test                 Result
HDParm          Disk Read               740.70 MB/sec
HDParm          Cached Disk Read        825.93 MB/sec
DD              Disk Write              526 MB/s
FIO             4k random read          211134 IOPS (844536 KB/s)
FIO             4k random write         84979 IOPS (339917 KB/s)
IOZone          4k read                 218940 KB/s
IOZone          4k write                223976 KB/s
IOZone          4k random read          86930 KB/s
IOZone          4k random write         272289 KB/s

                        Score: 57464

オーバークロックしていない Raspberry Pi 5 としては相当良いスコアです。

起動時の不具合(低頻度)

dtparam=pciex1_gen=3 の設定に関係なく、低頻度ではあるものの電源ONやリブート時に正常に起動しないことがありました。(通常 firmware が読み込まれるとファンの回転が止まるが、異常時は高速で回り続けるためすぐに分かる)

再現性が低く、拡張ボードのせいか、SSDとの相性によるものか、電源に起因するのか、などは不明のままですが正常起動時の動作等から拡張ボードが原因ではない気がします。

なお、電源は 5.1V 5A (27W) を利用しています。もしかしたら Geekworm X1003 のように GPIO からも電源を取っていたら安定するのかもしれませんが未確認です。

別のSSDを手配すれば切り分けも可能ですが、異常時には電源ボタンを押せば解決するため、そこまではしないつもりです。(そもそも滅多に再起動しないので)

EEPROM の更新により WD SN550 での起動不具合が改善された実績もあり、ソフトウェア起因であれば解決されるかもしれないことを期待して様子見したいと思います。

ケース加工

SSDの固定ネジが公式ケースの蓋に干渉したので、写真のように少しだけ加工しました。

公式ケースを使いたい理由

以前の記事でも Raspberry Pi から「SwitchBot ボット」を操作していることを書きましたが、金属ケースに入れるとボード内蔵Bluetoothの信号が減衰するためです。

ケースの影響を受けないように以下のBluetooth USB アダプタを過去にも試しましたが、その際はボード内蔵Bluetoothの方が(わずかに)応答が速く採用を見合わせていました。

公式ケースに蓋をしても温度は大丈夫?

有意な温度上昇は確認できず、いまのところ問題なさそうです。

SSDで起動したら内蔵Bluetoothが不安定になった

何を言っているか分からないと思いますが、ありのまま起こったことを書きます。

「SwitchBot ボット」の操作に利用しているスクリプトの実行時間を time コマンドにて計測すると共にスクリプト内の接続リトライ回数もログ出力しています。

USBメモリ起動時とSSD起動時のログを比べたところSSDの方が明らかに遅くなりました。上記のリトライ回数が不安定になるためです。さらに dtparam=pciex1_gen=3 を設定するとリトライ回数が増えることも分かりました。

PCIe接続を行うFPCケーブル端子のすぐ横に無線アンテナがあることが関係しているかもしれません。違うFPCケーブルにすれば改善する可能性もあるかもしれません。

ただ、上記のBluetooth USB アダプタを利用することにより完全に安定した状態となるため、これ以上の切り分けは実施せず内蔵Bluetoothをオフにすることにしました。

つまり、公式ケースにこだわる理由はなくなりました。

最後に

今回の事象は gatttool を使ったBluetooth接続時にリトライ回数が増えるという特殊な状況であるため、一般的なマウスやキーボードなどの常時接続では目に見える影響はないかもしれません。YMMV.