Raspberry Pi 4 USB Boot

当サイトのRaspberry Pi 4はHDMIモニタが無いことから相変わらずvncserverで試しています。

マイクロSDでもパフォマンスの向上は実感できますが気になるのはやはりUSB3.0経由のSSDからのブートになると思います。
Pi4ではPi3のOTP bootmodeに替わってEEPROMによるbootが採用されています。
但し現時点ではまだ実装されていないので従来通りSD boot〜SSDの起動になります。

実験の途中以前購入したSSD(64GB)を壊してしまいました。後述(・・;)
SSDは購入するとしてマイクロSDで実験〜SSD換装という流れでいきたいと思います。

SPI EEPROM

EEPROMの解説はここにあります。
Raspberry Pi 4 boot EEPROM

update && upgradeするとrpi-eepromはインストールされrpi-eeprom-updateは自動起動しています。
USB Bootが実装されたら改めて設定すれば良いようです。

USB Boot

Raspberry Pi 4 USB Boot Config Guide for SSD / Flash Drives
基本は従来からの方法と同じで内蔵スロット(mmcblk0p1)からboot、USB端子のデバイスから起動する流れになります。
内蔵スロットは(/dev/mmcblk0p1)だけあればいい
/boot/cmdline.txtの冒頭にUSBアダプタのデバイスIDを加える(アダプタによって?)
/dev/mmcblk0pNと/dev/sdXのPARTUUIDは違う値にする(以前はパーテーションを拡張すると違う値になったが現在の仕様は変化しない)
/etc/fstabのPARTUUIDを編集

SD Boot – SD

USB-SDカードからの起動は実用上は意味が無いのですが手順の確認(SSD壊れた)としてSD Boot – SDを実行します。

boot用にレアな512MB
Os起動用にSanDisk 32GB
32GBのカードには通常通り2019-09-26-raspbian-buster.imgを焼いておきます。


512MBのカードはFAT32でフォーマット、フラグにlbaを指定しておきます。
8GBのカードに256MBのFAT32パーティションを確保してもOKですね。
PARTUUIDは重複しなければいいので作業の楽なbootを違う値にします。
raspbian.img(raspbian version)でカードを作成すると同じPARTUUIDになります。


32GBのカードで通常通り起動、ログイン
512MB PARTUUID=”7ba0826f-01″
32GB PARTUUID=”d9b3f436-01″
512MBのカード(/dev/sda1)をマウントして/boot(/dev/mmcblk0p1)をコピーします。

$ sudo mount /dev/sda1 /mnt
$ sudo cp -rp /boot/* /mnt

32GBカードのPARTUUIDは変更していないのでコピーした/boot/cmdline.txtはそのままでOK
/etc/fstabの/boot PARTUUIDを変更

PARTUUID=7ba0826f-01  /boot           vfat    defaults          0       2
PARTUUID=d9b3f436-02  /               ext4    defaults,noatime  0       1

一旦シャットダウンして512MBカードを内蔵スロットに32GBカードをUSB端子に挿し替えて起動

/dev/mmcblk0 512MB
/dev/sda 32GB
あとはSDカードの替わりにSSDを接続すればOK

SD Boot – SSD


今回はkingstonのSSDを購入してみました。
参考サイトで推奨しています。
120GB Amazon ¥2450


最初にメニューのデバイスからパーテーションを作成、FAT32でフォーマット
書き込んで終了するとSDカードと同じように扱えます。


通常通りRaspbian 2019-09-26-raspbian-buster.imgを書き込み
rootfsを30GBに拡張、残りを適当に分割してパーテーション作成
PARTUUIDはSDカードに書き込んだ値と同じです。

# blkid | grep sdc
/dev/sdc1: LABEL_FATBOOT="boot" LABEL="boot" UUID="69D5-9B27" TYPE="vfat" PARTUUID="d9b3f436-01"
/dev/sdc2: LABEL="rootfs" UUID="24eaa08b-10f2-49e0-8283-359f7eb1a0b6" TYPE="ext4" PARTUUID="d9b3f436-02"
/dev/sdc3: LABEL="data" UUID="02b6b4cd-c63e-4048-816d-3b875866c0b0" TYPE="ext4" PARTUUID="d9b3f436-03"
/dev/sdc4: LABEL="data2" UUID="f6f604ff-5a15-4fa7-a812-f51ad8fcdb4f" TYPE="ext4"

USBアダプタ
以前2.5インチHDDで使っていたUSB3.0の古いタイプ

$ lsusb
Bus 002 Device 002: ID 1f75:0621 Innostor Technology Corporation

上記の参考サイトを見るとUSBアダプタによってはIDを指定する必要があると言っています。
上記のアダプタも必要でした。(パフォーマンスは落ちるらしい)
/boot/cmdline.txt (512MB SDカード)

usb-storage.quirks=1f75:0621:u console=serial0,115200 console=tty1 root=PARTUUID=d9b3f436-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles


32GB SDカードをSSDに付け替えて起動
SSDから起動しています。

壊れたSSD、USBアダプタ

アダプタ

Bus 001 Device 007: ID 152d:0578 JMicron Technology Corp. / JMicron USA Technology Corp. JMS567 SATA 6Gb/s bridge


壊れたときの状況はなにかの拍子に突然入出力エラーが発生(マウントが外れているようだ)
再起動すると復帰するが再度発生。何度か繰り返すと全く無反応(死んだ)SSD、そしてUSBアダプタも同時に!
SSD、USBアダプタともOsから全く認識しなくなりました。
この中華アダプタと同タイプのSSDはPi3で現在正常に動作しています。
今回購入したKingston + 中華アダプタの組み合わせではやはり入出力エラーが発生します。(1回確認してそれ以上はやめときました)

このことからPi4とJMS567ドライバになにか問題があるものと思っています。
USB Bootはまだ正式にサポートされていないので自己責任ってやつですね。イタい!

Raspberry Pi Storage Benchmarks

参考にしたサイトにはBenchmarking Scriptのページがあります。

$ sudo curl https://raw.githubusercontent.com/TheRemote/PiBenchmarks/master/Storage.sh | sudo bash


SanDisk 32GB
内蔵スロット mmcblk0p1 mmcblk0p2
マイクロSDも起動してしまえばメモリで動いているので大きなファイル、大量のファイルを扱う場面で無ければPi4ではそう遅さを感じることは少ないと思います。


Kingston SSD 120GB
Disk Reedが遅いですね。本来は300MB/sくらい出るものと思います。
期待したスコアの半分しか出せませんでした。
USBアダプタの性能と思います。

SSDケースの作成

取り敢えずKingston + Innostorアダプタも安定して動作しているのでケースを作成します。

とてもケースと呼べる代物ではありませんがSSDのパッケージ(プラゴミ)と以前工作に使ったアルミ板(0.5mm)とLアングルの廃材で作成します。
SSDの下には水道屋の広告マグネットシートを仕込んでいます。


適当に切って両面テープで軽く止めています。


ケーブルに引きずられることもなくいい感じに収まっています。