Raspberry Pi 4でUSB接続HDDから64ビットUbuntu 20.04.1を起動してみました

2020年9月に入って、Raspberry Pi 4用の新しい安定版ブートローダーがリリースされたということで。

容量1TBのUSB外付けHDDから、64ビット版Ubuntu 20.04.1 LTSを起動してみました。

以前のRaspberry Pi 3の頃は、5秒の制限があったためSSDのみ起動可能でしたが。Raspberry Pi 4の場合は、SSDだけではなくHDDからも起動できるのですね。ただし、ブートローダーの更新やコンフィグの作成等、必要な準備をしっかり行う必要があるようです。

手順を記録しておこうと思います。


Raspbianによるブートローダー更新

ブートローダーの更新はこちらの情報から

起動用/bootの設定はこちらの情報を参考にさせて頂きました。

特に起動用boot設定は、抜けや間違いがあると正常に起動しないため、正しい情報源の選択が重要なようです。

microSDカードにRaspberry Pi OS(Lite)をインストール

起動用のHDDの作成など、基本的にすべてRaspberry Piで行おうと思いますが。最初の最初、ブートローダーの更新に使用するRaspberry Pi OSは、Windows PCで作成したほうが楽かもしれません。

ブートローダーの更新は、Raspberry Pi OSを使用します。ここではLiteを選択しましたが、無印でも問題無いようです。(私はLiteのみ試しました)

microSDカードを作成後、SSHでログインできるように設定します。手順はこちらの記事になります。

最新版への更新もお忘れなく。

sudo apt update
sudo apt upgrade

ブートローダーのバージョン確認

Raspberry Pi OS Liteにログイン後、eepromのバージョンを確認します。

sudo rpi-eeprom-update
vcgencmd bootloader_config
vcgencmd bootloader_version

手持ちのPi 4は、2020年4月16日 17:11:26版のeepromのようです。

USB起動に対応していないせいか、ブートローダーのコンフィグ設定は3行で、少しさみしい感じです。

ブートローダー更新

apt upgrade実行後、/lib/firmware/raspberrypi/bootloader/ディレクトリに、新しいeepromのバイナリがダウンロードされているようです。

たとえばbetaディレクトリには、2020-07-16や2020-07-31等のファイルがあるようです。

安定版であるstableディレクトリ内の、2020-09-03が、USB起動が可能な新しいブートローダーかと思います。こちらを使ってeepromを更新します。

sudo rpi-eeprom-update -d -f /lib/firmware/raspberrypi/bootloader/stable/pieeprom-2020-09-03.bin
# コピペ用
# sudo vi /etc/default/rpi-eeprom-update
# FIRMWARE_RELEASE_STATUS="stable"
# sudo rpi-eeprom-update -a

sudo rpi-eeprom-update -aで最新版に更新されるようですが、うまく行かなかったため、-fオプションで直接binファイルを指定してみました。

ブートローダー更新確認

更新後、再起動してバージョンを確認してみます。

sudo reboot
# 再起動後
vcgencmd bootloader_config
vcgencmd bootloader_version

このような感じで、release版のSep 3 2020つまり2020-09-03版に更新されました。ブートローダーのコンフィグも色々とパラメータが増えています。

BOOT_ORDERの値で、どのメディアから起動するかを指定できるようです。資料を拝見すると、2020-06-15.bin以降から、0x4でUSBブートに対応しているそうです。0xf41は、SDとUSBストレージから連続(繰り返し)起動する設定になります。

もしBOOT_ORDERの値が異なる場合、sudo raspi-configから値を変更できるようです。

以上でブートローダーの更新が完了しました。


起動用HDD作成

次はUSBストレージにOSイメージを書き込んで、新しいブートローダーから起動できるように設定したいと思います。

USBストレージの接続

Raspberry Pi 4にUSBストレージを取り付けます。宜しければこのあたりの記事を御覧ください。

容量512GBのSSDと、1TBの2.5インチHDDでUSBブートを試しましたが、どちらも問題なく起動しました。

Raspberry Pi 3時代の5秒縛りは無いようですので、USB接続のSATAのHDDも問題なく起動するようです。ただしUAS(USB Attached SCSI)はダメとの記述がありました。

64ビット版Ubuntu 20.04.1 LTSダウンロード

以前作成した、とある実験環境を強化したいという目的から。

接続したUSBストレージに、64ビット版のUbuntu 20.04.1 LTSを書き込んで起動したいと思います。

こちらのページからPi 4用の64ビットサーバ版起動イメージをダウンロードしました。

ぜんぶRaspberry Piで済ませたかったので、このような感じでダウンロードしました。

curl https://cdimage.ubuntu.com/releases/20.04.1/release/ubuntu-20.04.1-preinstalled-server-arm64+raspi.img.xz -O ubuntu-20.04.1-preinstalled-server-arm64+raspi.img.xz

OSイメージをUSBストレージへ書き込み

ダウンロードしたimg.xzファイルを、/dev/sdaに書き込みます。

xzcat ubuntu-20.04.1-preinstalled-server-arm64+raspi.img.xz | sudo dd bs=4M of=/dev/sda

Raspberry Pi最新ファームウェアのダウンロード

USB起動のため、最新のRaspberry Piファームウェア(*.elfと*.datファイル)が必要のようです。

こちらからダウンロードさせて頂きたいのですが。手動では手間がかかりそうですし、cloneでは不要なファイルがコピーされてしまいます。

・・・

ここはsubversionのインタフェースを使用させて頂き、boot以下をちぇけr

sudo apt install -y subversion
svn checkout https://github.com/raspberrypi/firmware/trunk/boot


カーネルイメージの展開

通常のブートはgrub等のブートローダーが、圧縮されたカーネルイメージ(vmlinuz)を展開後、initプロセス用のram fsをメモリーにロードするようですが(半分寝言

eepromのブートローダーは、grubを経由せず、直接カーネルイメージとramfsをメモリーにロードする感じなのですね(たぶん

そのため、カーネルイメージを予め展開しておく必要があるようです。

sudo su -
mount /dev/sda1 /media
cd /media/
dd if=vmlinuz bs=1 | zcat > vmlinux

スーパーユーザー変更後、/mediaにUSBストレージのブート領域をマウント、vmlinuzをzcatで展開しました。

config.txtの編集

/boot/config.txtを編集します。[pi4]エントリを1行コメント化して、4行書き足す感じです。

vi config.txt
[pi4]
#kernel=uboot_rpi_4.bin
max_framebuffers=2
dtoverlay=vc4-fkms-v3d
boot_delay
kernel=vmlinux
initramfs initrd.img followkernel
14c14
< #kernel=uboot_rpi_4.bin
---
> kernel=uboot_rpi_4.bin
16,19d15
< dtoverlay=vc4-fkms-v3d
< boot_delay
< kernel=vmlinux
< initramfs initrd.img followkernel

新しいファームウェアのコピー

最後に先程ダウンロードしたファームウェアをUSBストレージにコピーします。

cp ~pi/boot/*.dat ~pi/boot/*.elf /media
ls -al /media/*.dat /media/*.elf

以上でUSBストレージから起動する準備が整いました。

いちどRaspberry Piの電源を落としましょう。

umount /media
sync
halt

さあ、microSDカードを取り外しましょう。

さようなら!microSDカードさん!!(BGM蛍の光


USBストレージによる起動の確認

いよいよHDD(SSD)から起動しますが。

確認のため、シリアルコンソールを接続しました。

Ubuntu 20.04.1は、既定でシリアルコンソールが有効になっています。このため、USBストレージによる起動状況を知るため、シリアルコンソールが有効です。LEDランプはずっと点滅するため、正確な情報を知ることができません。

たとえば新しいファームウェアのコピーを忘れたりして、上述のブートローダーの設定の手順を間違うと、シリアルコンソールに何も出力されない状態になります。(LEDは点滅し続けます

USBストレージから正しく起動すると、次のようにコンソール出力されるようです。ブートローダーが直接vmlinuxカーネルをロードして、ramfsからinitプロセスを生成シテイルノカト(systemdかもさあ、正しく起動できましたでしょうか?

Ubuntu 20.04.1 LTSの初期ログインユーザ/パスワードは、ubuntu/ubuntuのようです。

古いパスワード(ubuntu)と、新しいパスワードを2回入力して、ログインできましたでしょうか?

dfコマンドで確認すると、ルート(/)領域は自動拡張されているようです。1TBのHDDを使用しましたが、918Gの容量が確保されています。

あとはswapファイルを作成すれば、実用になりそうな感じです。そのあたりの調整は、後で記事に書き足そうと思います。


USBストレージから起動しなくなったら

※20.9.15追記:Ubuntuの自動更新で、USBストレージの/boot領域のファイルが更新されると起動しなくなる場合があるようです。

その場合、microSDカードから起動して、vmlinuxファイルの再作成と、*.datと*.elfファイルを/boot領域に再度コピーすれば起動するようになりました。

追々、アップデートでUSBストレージ起動に対応したカーネルやファームウェアが配布されるようになるかもしれませんが、それまでは注意が必要のようです。

Ubuntu 20.04.1 LTSの場合

apt upgradeでカーネルが更新された場合、次回起動時、うまくUSBストレージから起動しない可能性があります。

このため、再起動前に、カーネルの展開と新しいファームウェアのコピーを行っておきます。

cd ~
sudo apt install -y subversion
svn checkout https://github.com/raspberrypi/firmware/trunk/boot
sudo su -
cd /boot/firmware
dd if=vmlinuz bs=1 | zcat > vmlinux
cp ~ubuntu/boot/*.dat ~ubuntu/boot/*.elf /boot/firmware

ああ、とうとう、いつ壊れるかわからないmicroSDカードの束縛から開放される日が来たのですね。

SSDだけではなく大容量のHDDを使用可能。

さらに64ビットのOSの起動が可能になりました。

いよいよ、Raspberry Piがサーバとして本格的に使用できる日が来たのですね(大げさ

ぜひともお試し下さいませ!!!

ちなみにUbuntu 20.04.1 LTSホスト名等の初期設定はこちらの記事になります。

スポンサーリンク

フォローする

スポンサーリンク