RaspberryPiでUSB-SSD接続でのトラブルメモ

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メモリでは問題なく起動できています。テストにはKIOXIAUSBメモリを使用しました。

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が落とせなくなったといった方がいいのかも。これはこれででしかなかったのでケーブルの使用をやめることにしました。

ストレージドライバによる原因?

これまでのこと考えると以下のようになります。

  • USBメモリでは問題はなく起動できる
  • SSD-USB変換アダプタを変更すると改善がみられる
  • SSDの給電不足が問題ではなさそう

これらから導かれるのはドライバが関係しているのではないかという点です。

そこで、ドライバ関連を調べてみるとどうも同じようにトラブルになってる方がいるようです。

【参考】

https://forums.raspberrypi.com//viewtopic.php?t=245931forums.raspberrypi.com

要約するとUSB3.0ではUASPUSB 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 4BUSB3.0接続で高速化目指すのであればUSBメモリのほうがお手軽なのかもしれません。

自分はこれで2週間費やしてしまいました…。

/* -----codeの行番号----- */