【RaspberryPi 4B】SDカードレスでUSB起動する

今回のエントリは、正式リリースが行われるまでの時間限定的な情報になります。

前回のエントリでは、RaspberryPi 4Bの/rootパーティションのUSBへの配置を行いました。ただ、SDカードメモリは挿しっぱなしになるのであまりスマートとは言えませんでした。

参考

uepon.hatenadiary.com

実はベータ版の機能ではありますが、SDカードレスのUSB起動ができるようです。ということで今回はそのベータ版の起動を行ってみたいと思います。 ※(注意)ベータ版の機能になりますので機器の故障などの可能性もありますのでおすすめしません。もし行う場合には自己責任でお願いします。そろそろ正式されるとの噂なので正式リリースを待ったほうがいいと思います。

また、単にRaspberry Pi OSでUSB起動するのはちょっと物足りないのでOSのほうもRaspberry Pi OSの64bitイメージでインストールを行っていきたいと思います。 確認は完全にはしていませんが、最新版のRaspberry Pi OS(32bit)でも同様に行うことはできそうです。(後述するEEPROMのファイルは存在しています)

Raspberry Pi OS (64 bit) beta test versionはこちらからダウンロードできます。

www.raspberrypi.org

64bitベータ版なのでライブラリなどのパスなどかなり変わっていることもあるので、うまく行かなくても仕方ないかなと思います。実際にパッケージインストールで対応していないものもありました。

ではインストールを行ってみます。

Raspberry Pi OS (64 bit) beta test versionのインストール

基本的にインストールに関しては通常のOSと同様にRaspberry Pi Imagerを使用して書き込めばOKです。

f:id:ueponx:20200601224036p:plain

RaspberryPi 4BではRaspberryPi3までのOTP bootmodeに替わってEEPROMによるbootが採用されています。 Raspberry Pi 4にはSPI接続のEEPROM(4MBits / 512KB)があり、システムを起動するためのコードが埋め込まれています。 SDカードのブートパーティションに以前にあったbootcode.binをこのEEPROMに書き込むことででブートローダーを変更することができます。 ちなみにSDカードのブートパーティションbootcode.binが存在する場合は、EEPROMブートローダーの処理は無視されます。

詳細はこちらに出ています。

www.raspberrypi.org

SDカードに書きこんだ後に起動しました。起動してシステム状態を確認すると、ちゃんと64bit OS(aarch64であれば64bit)になっていました。

f:id:ueponx:20200601002115p:plain

$ sudo apt update
$ sudo apt upgrade
$ sudo rpi-update
$ sudo reboot

再起動したら以下のコマンドを実行(ただし既にインストールされているので実行しなくても大丈夫です。)このrpi-eepromですが、起動を司るEEPROMの更新を自動で行うサービスとなるようです。EEPROMの自動書き込みを行いたくない場合にはサービスを停止することも可能のようです。

$ sudo apt install rpi-eeprom

まずは現状のEEPROMのバージョンを確認します。以下のコマンドでバージョンの確認ができます。

$ vcgencmd bootloader_version

実行後の出力がApr 16 2020 18:11:26となっていれば、初期状態となっています。では、EEPROMの更新を行います。

以下を実行して/etc/default/rpi-eeprom-updateを編集します。/etc/default/rpi-eeprom-updateファイルのFIRMWARE_RELEASE_STATUSパラメータを"critical"から"beta"に変更します。

$ sudo vi /etc/default/rpi-eeprom-update

変更前

FIRMWARE_RELEASE_STATUS="critical"

変更後

FIRMWARE_RELEASE_STATUS="beta"

編集が終わったらファイルの保存をして終了させます。続いて、以下のコマンドでpieeprom-2020-05-15.binをインストールします。

$ sudo rpi-eeprom-update -d -f /lib/firmware/raspberrypi/bootloader/beta/pieeprom-2020-05-15.bin

インストールしてもEEPROMの書き換えは行われません。再起動後に書き換えを行い、バージョンアップが行われます。

$ sudo reboot

再起動が終わったら、以下のコマンドで使用して、ブートローダーのバージョンを確認します。

$ vcgencmd bootloader_version

コマンドの出力がMay 15 2020 11:05:52の様に表示されていれば正常に更新されています。

起動するUSBメモリを準備する

EEPROMに書き込みが終わっているのでSDカードにイメージを書き込んでも良かったのですが、面倒だったのでSDカードの内容をUSBメモリにコピーしました。 ツールとしては前回のエントリーでも使用したSD Card Copierとなります。このあたりの作業もそろそろコマンドラインでやりたいかな~。楽なのはいいのですが。

f:id:ueponx:20200601202643p:plain

Copy From Device(ソース)はSDカードを/dev/mmcblk0を指定、Copy To Device(ディスティネーション)は環境にもよりますが/dev/sdaを選択します。 ただし、前回と一部異なることがあります。【New Partition UUIDs】のチェックを入れないようにしてください。入れてしまうとコピー側のUSBのパーティション情報が新たに作成され、コピー側の情報が違うものになってしまうので、このチェックボックスにはチェックを入れてはいけません。

f:id:ueponx:20200601204018p:plain

コピーが終了したら、システムをシャットダウンして

$ sudo shutdown -h now

USBメモリを挿したままにして、SDカードを抜き、RaspberryPiを起動します。

これでOKです。

起動後の確認

起動ができれば基本的には成功していますが、念の為mount情報を確認します。すると、/bootパーティションも/rootパーティションのどちらも/dev/sda(USBメモリ)が指定されているのがわかります。

$ mount | grep /dev/sda 
/dev/sda2 on / type ext4 (rw,noatime)
/dev/sda1 on /boot type vfat (rw,relatime,fmask=0022,dmask=0022,codepage=437,iocharset=ascii,shortname=mixed,errors=remount-ro)

一応、64bitおよびUSBメモリ起動(SDカードレス起動)ができるようになりました。

ベンチマークを取ろうとsysbenchをインストールしようと思ったのですが、aptコマンドでインストールしようとするとパッケージが見つからず…ベータ版の64bitOSなので仕方ないかな。

f:id:ueponx:20200601211148p:plain

以下からGithub経由でインストールしてもよいのですが、以前インストールしたものとはバージョンが違うようで表示形式が違うので挫折しました。どちらかというと新しいのでこちらに合わせたほうが良さそうではあるのですが。

github.com

おわりに

ベータ版の機能というものの特に設定がわかりにくいということもなく、うまくいきました。リリース情報としてはそろそろ正規リリースされるとのことなのでもう少し待てば何もしなくてもUSB起動ができるのかなと思います。ということで、正規リリースされるまでの時限的な情報となりました。

SSDになると更に高速な速度がでるのではないかと思います。早くリリースされるといいですね。

参考

uepon.hatenadiary.com

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