Raspberry Pi4B USBブートでSSD

SDカードは遅いし壊れるから何とかしたい

実際にSDカードが壊れたことはないんだけれども、やっぱり構造的にその傾向は必ずある。
それよりも個人的には速度が気になりだしてきたので、それを改善することを目的としてUSBブートを。

必要なもの

USB接続のSSD

まぁ、これだけですね。
使用中のSDカードをSSDにクローンするのは Raspberry Pi OS の SD Card Copier が最適。
だけど、今回はその手順は(それほど難しことではないので)割愛。

簡単にUSBブートできるOS、できないOS

簡単にUSBブートできるOS

Raspberry Pi OS / Ubuntu Desktop

簡単にUSBブートできないOS

Ubuntu Server
 バージョンによってはそのまま起動できるっぽい。
 …が、一部うちの環境では手を加えてあげないとダメだった。

GUI な OS は確かに使いやすいし利用者も多いとは思う。
思うんだけど、サーバ用途だと GUI いらないよね…
てことで、うちは1台しか GUI なラズパイがない。
しかも、CUI な OS は全て Ubuntu の Server という、それはそれでどうかと思う偏り具合…

追記:もしかしたら同じ Pi4B でも EEPROM の内容が違っていたかもしれない。
   その違いのために、Ubuntu Server が起動しなかった疑惑もある。
   が、以下の手順に沿って行けば、起動しなけりゃその対策、ってことで書いてあるので、大丈夫でしょう。
   たぶん。。。

Lite で良いので Raspberry Pi OS で起動するSDカードを用意すると便利

Ubuntu でも問題ないけど、SD Card Copier が使える強みが Rasberry Pi OS にあるので、既存環境をそのままSSD に移行したい場合には、クローンする作業も必要になるだろうから、素直に Raspberry Pi OS で起動する SD カードを用意しておいた方が、結果的にスムーズ。

用意出来たら、USB ブートの設定を行いたい Raspberry Pi に取り付けて起動。

OSに何を使うかに関わらず必ず必要な作業

1.Raspberry Pi の EEPROM をアップデートする

まずは確認兼必要に応じて変更

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

FIRMWARE_RELEASE_STATUS がいつのバージョンかはわからないけど、critical になっているものがある?
としたら、そこを stable に変更しておく。

FIRMWARE_RELEASE_STATUS="stable"
BOOTFS=/boot/firmware

続いて、次のコマンドで EEPROM の現状をチェック

$ sudo rpi-eeprom-update
*** UPDATE AVAILABLE ***
BOOTLOADER: update available
   CURRENT: 2020年  9月  3日 木曜日 12:11:43 UTC (1599135103)
    LATEST: 2022年  1月 25日 火曜日 14:30:41 UTC (1643121041)
   RELEASE: default (/lib/firmware/raspberrypi/bootloader/default)
            Use raspi-config to change the release.
 
  VL805_FW: Using bootloader EEPROM
     VL805: up to date
   CURRENT: 000138a1
    LATEST: 000138a1

現在、2020年とか…うん、古いね。
ということで、アップデートしてみよう。

$ sudo rpi-eeprom-update -a
*** INSTALLING EEPROM UPDATES ***
 
BOOTLOADER: update available
   CURRENT: 2020年  9月  3日 木曜日 12:11:43 UTC (1599135103)
    LATEST: 2022年  3月 10日 木曜日 11:57:12 UTC (1646913432)
   RELEASE: stable (/lib/firmware/raspberrypi/bootloader/stable)
            Use raspi-config to change the release.
 
  VL805_FW: Using bootloader EEPROM
     VL805: up to date
   CURRENT: 000138a1
    LATEST: 000138a1
   CURRENT: 2020年  9月  3日 木曜日 12:11:43 UTC (1599135103)
    UPDATE: 2022年  3月 10日 木曜日 11:57:12 UTC (1646913432)
    BOOTFS: /boot/firmware
 
EEPROM updates pending. Please reboot to apply the update.
To cancel a pending update run "sudo rpi-eeprom-update -r".

$ sudo reboot

どうやら2022年3月10日のものが適用できそうなので、メッセージに従って reboot する。
(アップデートをキャンセルしたい場合もメッセージ通り sudo rpi-eeprom-update -r を実行する)

2.EEPROM更新の確認

再起動してきたところで、EEPROM がきちんと更新されているかを確認する。

$ sudo rpi-eeprom-update
[sudo] password for taka:
BOOTLOADER: up to date
   CURRENT: 2022年  3月 10日 木曜日 11:57:12 UTC (1646913432)
    LATEST: 2022年  3月 10日 木曜日 11:57:12 UTC (1646913432)
   RELEASE: stable (/lib/firmware/raspberrypi/bootloader/stable)
            Use raspi-config to change the release.
 
  VL805_FW: Using bootloader EEPROM
     VL805: up to date
   CURRENT: 000138a1
    LATEST: 000138a1

CURRENT の行がきちんと最新のもの(LATEST)に更新されているのでOK

3.起動順の確認

次に下記コマンドで起動順序を確かめる。

$ vcgencmd bootloader_config
[all]
BOOT_UART=0
WAKE_ON_GPIO=1
POWER_OFF_ON_HALT=0
DHCP_TIMEOUT=45000
DHCP_REQ_TIMEOUT=4000
TFTP_FILE_TIMEOUT=30000
ENABLE_SELF_UPDATE=1
DISABLE_HDMI=0
BOOT_ORDER=0xf41

最終行にある BOOT_ORDER が 0xf41 になっていればOK

なっていなかったら、下記コマンドで編集して 0xf41 に書き換える。

$ rpi-eeprom-config --edit
4.BOOT_ORDERの表す意味

詳細は公式ドキュメントを参照するのがいいけど、概要はこんな感じ。
https://www.raspberrypi.com/documentation/computers/raspberry-pi.html#BOOT_ORDER

  • 0xの後に続く数字(16進数)が起動デバイスを示している
  • 起動順序は左からではなく右から(0xf41 だと 1 が指すデバイスから起動を試す)
  • 1:SD カード 4:USB-MSD(Mass Strage Device) f:再起動
  • 6:NVMe (Raspberry Pi5 ではNVMeも使えるようになったのでそれ用)
  • つまり、0xf41だと、SD試してダメならUSB、それでもだめなら再起動。を繰り返す。

ほとんどの場合、ここまでUSBブートが可能になる

試した感じだと、Raspberry Pi OS や Ubuntu Desktop は起動に特に問題がなかった。

まっさらな SSD に Ubuntu Server 22.04 LTSを入れてみても起動してきた。

なので、うちで使ってた Ubuntu Server が古いとかいじりすぎとか、何らかの要因でそのままでは起動できなかったのかもしれない。

追記:あるいは Pi4B の EEPROM が何かしらの理由で古いものを導入してしまっていたか…

ということで、起動しない Ubuntu だったら以下の作業を行う

SSD を接続して操作するための PC としては、Linux 系が望ましいのだろうけど、個人的には Windows で十分すぎて、しかも手軽なので Windows で良いと思う。

てことで、USB 接続な SSD を Windwos10 でも 11 でもいいのでつなげる。

SSD の中身の一部が見えるので、次のことを行う。

1.vmlinuzというファイルがあるので措置

まぁ、この vmlinuz というファイル、簡単に言えば圧縮されたファイル。
で、Raspberry Pi が USB ブートを行う時、この圧縮されたファイルの読込が行えない。
なので、起動できない。

というわけで、Windows 上で、vmlinuz に対して解答処理を行ってファイル名を vmlinux に変更する。

解凍ソフトには 7zip を使うのが間違いない。

こんな感じで解凍(展開)して、解凍されたファイル名を vmlinux に変更する。

もちろん Linux 系の OS で処理しても良い。例えば下記のコマンドで。

$ zcat vmlinuz > vmlinux

尚、vmlinux は vmlinuz と同じディレクトリに置いておく。

2.不足しているファイル群を入手する

先人の知恵。これは何よりもありがたいもの。
ということで、以下から拡張子が「dat」と「elf」のファイルを入手する。

firmware/boot at master · raspberrypi/firmware
This repository contains pre-compiled binaries of the current Raspberry Pi kernel and modules, userspace libraries, and ...

必要なファイルは dat、elf、それぞれ8個ずつ。

これらのファイルも vmlinuz (vmlinux) のディレクトリと同じところに保存する。

3.config.txtファイルの編集

config.txt ファイルを開いて、[pi4]セクションに必要事項を追記して以下のようにする。
赤太字が追加した設定。

[pi4]
max_framebuffers=2
arm_boost=1
dtoverlay=vc4-fkms-v3d
boot_delay
kernel=vmlinux
initramfs initrd.img followkernel

尚、config.txt の冒頭[all]セクションで kernel=vmlinuz があったりするけど、そのままで良い。

これで Ubuntu Server も USB ブートが可能になったので、Raspberry Pi を再起動。

実際に使ってみて…

どうせローカルで展開するポータルサイトを WordPress で構築するだけだし、ローカルなんでアクセス数なんてたかが知れてるし、SD カード運用でも時々バックアップさえ取っておけば、まぁ、問題ないっしょ。

と思っていた。

けど、とんでもねぇ。

速い。速いよ Pi4B!

検証用とか一時的な利用とかで端末を用意することもあったけど、これ、SD カードには戻れないな…
(全部メモリ上に乗っかっちゃうのならともかく、Wordpressで静止画や動画、pdfやExcel等々、ちょっとでもSDカードからの読み書きが行われると違いは当然出てくるよね…)

そして、今回調達したUSB接続なSSD、小ささが良さげで購入したけど…

これ、ラズパイのためにある、と言っても過言ではないくらい、ラズパイ用に見える。

発熱も全くないわけではないけど、アイドリング時でほんのり暖か、読み書きが頻繁に行われてる状態がしばらく続くと、ちょっと熱いかな?くらいで触れないほどにはならない。

ちょっとリッチな、Linux が動作するシングルボードコンピュータ、
その選択肢として Raspberry Pi を選ぶなら、SD カードじゃなくて最初から SSD にしていた方がいいかも。

検証用にももってこい、というか検証用だからこそ SSD の方がいいね。

SD カードへの読み書きはやっぱりボトルネックで、Raspberry Pi Imager を使って OS を書き込むにしても、SSD だと圧倒的に高速。

書込みを開始して、ちょとっトイレ行ってコーヒー淹れて戻ってきたら終わってるから。
SD カードだとそうはいかない。
これまでは SD カードをとっかえひっかえする場面もあったけど、SSD だとそうした作業も減るし、待ち時間もかなり短縮できるので、SSD お勧め。

昔、HDD から SSD に乗り換えて感動したときに匹敵するくらい、やっぱ SSD かってなったわ…

この記事にコメントしてみる