RaspberryPi 4B
からUSB接続したストレージデバイスからブートを行うことができます。先日から設定していたProxmox
のRaspberryPi版の設定をするにあたって、SDカードは書き込み量もそうですが、アクセススピードが遅いということもネックになってきます。そこで、USBで接続可能なSSDのケースなどを使用することでSSD経由での起動を検討しました。
しかし、何度行ってもうまくいかないというか、起動が安定しないといった状況に陥りました。それに関して色々思考、解決した件についてメモってみようと思います。
RaspberryPiのUSB起動に関して
USBから起動を行う際には事前に確認をしておく事項があります。
- ファームウエア(USB起動が可能なバージョンか?)
- 起動順の設定(SDカードが挿入されている場合でもUSBを優先して起動する)
上記を確認しておけば大丈夫です。(噂ではRaspberryPi 4B
でも初期に販売されたバージョンでは起動できない噂がありますが、自分は持っていなかったのでこのあたりは不明です)
ファームウエアの確認方法
raspi-configコマンド
を実行して、メニューからBootloader
バージョンを選択します。
メニューでいうと以下の流れになります。
【6 Advance Options】→【A7 Bootloader version】→【E1 Latest Use the latest boot ROM software】を順番に選択します。
ここでBootloaderは一定以上のバージョンである必要があるので、今回は最新バージョンにしておきましょう。
起動順の確認方法
raspi-configコマンド
を実行して、メニューから起動順をメニューで【6 Advance Options】→【A6 Boot Order】→【B2 USB Boot】と操作します。
デフォルトでは起動順はSDカード→USBデバイスになっているので、これをUSBデバイス→SDカードと変更します。SDカードが挿入されておらず、USBデバイスが接続されていれば、USBデバイスから起動するのですが、 その後忘れる可能性もあるので変更しておくのが無難かなと思います。
SSDにRaspberryPi OSのイメージを書き込む
OSの書き込みに関してはSDカードと同じでRaspberryPi Imager
を使用することになりますが、変更点などはありません。同様の作業を行ってください。
SSDを接続してRaspberryPi OSを初回起動(注意点あり)
SDカードを挿入せず、USBポート(USB3.0のポート)にSSDを接続して電源を入れます。
ここで一つポイントがありRaspberryPi OS
は初回起動時にイメージで使用しなかったストレージ領域をMAXまで広げるという処理を行っています。(過去はraspi-configコマンド
で手動で処理していましたが、現在は初回起動時に行います)
そのためSSDのサイズが大きくなると当然この処理にかなり時間がかかります。自分は120GBのSSDを接続していましたが、結構時間がかかるなと思います。自分は10分くらいかかったでしょうか。アクセススピードやSSDの容量によって差がありますが結構時間がかかると思った方がよいでしょう。
2回目以降はこの処理は行われないので時間はかかりません。
SSD起動が安定しない
初回起動が終われば、そのあとは設定を色々行っていくのですが、再起動などを行っていくとSSDが安定して起動しないようになってしまいます(デバイスなどに依存?)。ここからかなり迷走していました。
先程もいいましたがSSDで起動を行うと起動がうまくいかないことが相当の確率で発生しました。RaspberryPiのストレージアクセスLEDを見ていると常にアクセスしている形跡はありますが、起動までいかないというような状況です。
この状況からいくつかのことを疑ってテストをしてみています。あくまでも疑いなので確定ではありません。
- SSD-USB接続(2.5インチケース)による原因?
- USBの電力不足による原因?
- ストレージドライバによる原因?
SSD-USB接続(2.5インチケース)による原因
SSD-USB接続をするアダプタがかなり簡易なものを使用していました。この変換アダプタは安いということとケーブルとコネクタのみという形状のため、かなりコンパクトなものでもありました。購入時はWindowsで接続していたのですが、その時点ではトラブルなどはありませんでした。そのため、このアダプタを使用していました。
このアダプタを使用するとほぼ動作しませんでした(たまに起動していましたが)。USBポート側の故障も考えて同じUSBポートに接続したUSBメモリでは問題なく起動できています。テストにはKIOXIA
のUSBメモリを使用しました。
USBメモリでの起動は大丈夫ということで、USBから供給される電源が不足していることが原因なのではないかと疑うようになりました。 ただ、今回使用しているアダプタはストレージ側に電源を供給できるコネクタなどがなかったので、この件についてはケーブルを購入して後程実験することにします。 同じSSDドライブを家にあった別のSSD-USB(2.5インチHDD)ケース2種に変更してみました。その結果1つのケースではかなり安定しているように感じました。 ただし、たまに起動に失敗することもあるようです。
👇こちらの方は不安定でした。
👇こちらはかなり安定しています。
少し改善の兆しあった印象です。
USBの電力不足による原因?
先ほどのケース交換によって安定度はかなり上がってきましたが、完全な安定した状態とはいえないのでさらなる安定を目指してみようと思います。
そこでケース変更をした際に電源供給不足を考え、以下のようなケーブルの購入して接続にしようしてみました。
このケーブルはホスト側が二股になっていてデータ転送ポートと電源供給専用ポートの2つがあります。こちらをRaspberryPi
と電源に接続してテストをしてみました。このケーブル、電源供給専用ポートの部分が短くなっているためACの近くに持って必要があったことが微妙なところです。
また、疑っているのはUSB電源の不足なので電源供給専用ポート側にはPD対応のAnker PowerPort Speed4
を使用しました。これで電力不足が発生することは考えにくいです。
そして使用してみたのですが、ほどんど起動のトラブルは解消しませんでした。現象もほぼ同じように感じました。
また、このケーブルでちょっと困った点があって、USBポート経由の電源供給によりなぜかRaspberryPi
のshutdownができなくなりました。そもそもRaspberryPi
はshutdownコマンドを実行しても本体の電源は切れないのですが、そういう意味ではなく、OSが落とせなくなったといった方がいいのかも。これはこれで毒
でしかなかったのでケーブルの使用をやめることにしました。
ストレージドライバによる原因?
これまでのこと考えると以下のようになります。
これらから導かれるのはドライバが関係しているのではないかという点です。
そこで、ドライバ関連を調べてみるとどうも同じようにトラブルになってる方がいるようです。
【参考】
https://forums.raspberrypi.com//viewtopic.php?t=245931forums.raspberrypi.com
要約するとUSB3.0ではUASP
(USB Attached SCSI Protocol
)というプロトコルを使うと転送速度がアップします。RaspberryPiのドライバではまだ不完全な部分も多く、使用するSSD-USBアダプタによっては相性問題が発生するようです。
ということで、UASP
のドライバを回避することでうまくいきそうです。転送速度と安定起動を考えれば後者が勝るので致し方ないですね。
UASPドライバを回避する
まずはUSAPが適応されているかを確認します。
確認方法はlsusb -t
を実行します。
$ lsusb -t
ここで、SSDのドライブのDriverがuas
になっていればUASPドライバが適用されています。適用されている場合は以下の手順で回避を行っていきます。
回避の方法は以下のように行います。まず、lsubコマンド
を実行してアダプタ側のデバイスID
を特定します。
デバイスIDが特定できたら、/boot/cmdline.txt
のconsoleの行に追記をしていきます。
$ sudo nano /boot/cmdline.txt
console=…
の行にusb-storage.quirks=【デバイスID】:u
を追記します。
※【デバイスID】にはlsusbで調べた値を入れます。また、追記時には改行を入れないようにします。
例えば今回自分が使用したアダプタのデバイスIDは4971:8017
だったので、usb-storage.quirks=4971:8017:u
を追記します。
変更前
console=serial0,115200 console=tty1 root=PARTUUID=f07b73f8-02 rootfstype=ext4 fsck.repair=yes rootwait
変更後
console=serial0,115200 console=tty1 root=PARTUUID=f07b73f8-02 rootfstype=ext4 fsck.repair=yes rootwait usb-storage.quirks=4971:8017:u
値を変更したらRaspberryPiを再起動します。
変更の確認
再起動後にlsusb -t
を実行してストレージのドライバがuas
から、usb-storage
になっていれば回避は成功です。
おわりに
かなり根の深い問題が解決できました。変更後はSSDの起動も全く問題なくなったので精神衛生的にもかなり満足しています。 USB接続をしたSSDでの起動だけでこんな罠があるとは思いもよらなかったです。
正直言うならば、RaspberryPi 4B
のUSB3.0接続で高速化目指すのであればUSBメモリのほうがお手軽なのかもしれません。
自分はこれで2週間費やしてしまいました…。