Raspberry Pi 4 Model B で Ubuntu20 をUSB接続のHDD/SSDから起動する

ALL
スポンサーリンク

Raspberry Pi 4 Model B で Ubuntu20 を、USB接続のHDD/SSDから起動する方法です。
途中までの設定で microSDカードが必要ですが、最終的には microSDカードは不要になります。

スポンサーリンク

準備

次のものを用意しておきます。

  • Raspberry Pi をネットワークにつなげるネットワーク環境とLANケーブル
  • Raspberry Pi 4 Model B と ディスプレイ・キーボード
    • 電源ケーブルはまだつなげないでください
    • ネットワークケーブルをつなげておきます
    • HDMIケーブルをディスプレイと接続しておきます。Raspberry Pi 起動時にケーブルがつながっていないと HDMI接続を認識しないためです。
    • HDMI端子が2つありますが、どちらにつなげても映ります
    • ケースをつけていると、HDMIケーブルの差し込みがあまくなって、HDMI認識しないことがあります
  • USB接続の外付けHDD/SSD
  • 2GB以上のmicroSDカードと、PCに接続できるカードリーダ
    • 最初はmicroSDカードを使って Raspberry Pi を起動しますが、この時の OSイメージファイルが1.8GBのサイズなので、2GB以上の容量が必要です
    • HDD/SSDから起動できるようになったら、Raspberry Pi から抜いて使用しません
  • PC

Raspberry Pi の EEPROM更新

USB接続のHDD/SSDから起動できるように設定します。

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

まず、PCで作業します。
microSDカードをさしたカードリーダを、PCに接続しておきます。

Raspberry Pi OS のイメージファイルを取得します。
https://downloads.raspberrypi.org/raspios_lite_armhf_latest から Raspberry Pi OS (32-bit) Lite のイメージをダウンロードします。
(いきなりダウンロード開始します)

https://www.raspberrypi.org/downloads/ から Raspberry Pi Imager をダウンロード・実行してインストールします。

Raspberry Pi Imager を起動します。
次のような画面になるので、[CHOOSE OS] を選択します。

RaspberryPiImager_1.png

下のほうにスクロールして、[Use custom] を選択し、先ほどダウンロードした、Raspberry Pi OS (32-bit) Lite のイメージを指定します。

RaspberryPiImager_2.png

最初の画面に戻るので、[CHOOSE SD CARD] で microSDカードを指定し、[WRITE] を押します。

これで、microSDカードに Raspberry Pi OS がインストールされました。

EEPROM更新

ここでは Raspberry Pi での作業になります。

microSDカードを Raspberry Pi にさします。
電源ケーブルを Raspberry Pi につなげて、Raspberry Pi を起動します。

起動したらログインします。
Raspberry Pi OS の初期ユーザーは pi 、パスワードは raspberry です。

次のコマンドを実行します。
この作業でアップデートされることにより、EEPROMが更新されます。

sudo apt update
sudo apt full-upgrade
sudo reboot

再起動してきたら、EEPROM が更新されたか確認します。

次のコマンドを実行します。
2020.11.17時点では、以下のように 2020.9.3版です。


nbsp;vcgencmd bootloader_version Sep  3 2020 13:11:43 version c305ZZ1a6d7e532693cc7ff57fddfc8649def167 (release) timestamp 1599135103

これで、Raspberry Pi の EEPROM更新は完了です。

USB接続の外付けHDD/SSDへの Ubuntuインストール

PCでの作業になります。

次の箇所から、Raspberry Pi の Ubuntuイメージをダウンロードします。
こちらでは Ubuntu 20.04.1 LTS の 64bit版で試しました。

https://ubuntu.com/download/raspberry-pi

PC に USB接続の外付けHDD/SSDをつなげた後、先の手順でも使った Raspberry Pi Imager を起動します。

[CHOOSE OS] で [Use custom] を選択し、先ほどダウンロードした、Ubuntuイメージを指定します。
最初の画面に戻ったら、[CHOOSE SD CARD] で 外付けHDD/SSDを指定し、[WRITE] を押します。

これで、外付けHDD/SSDへの Ubuntuインストールが完了しました。

Ubuntuの設定

Rasyberry Pi での作業になります。

ブート用の設定

Rasyberry Pi で 外付けHDD/SSD から Ubuntuを起動できるように設定します。

Rasyberry Pi に USB接続の外付けHDD/SSDをつなげて、次のコマンドを実行します。

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

続けて、vi config.txt を実行して、config.txt を編集します。
[pi4]セクションを次のようにして保存してください。

[pi4]
#kernel=uboot_rpi_4.bin
max_framebuffers=2
dtoverlay=vc4-fkms-v3d
boot_delay
kernel=vmlinux
initramfs initrd.img followkernel

次のコマンドを実行して、Rasyberry Pi をシャットダウンします。

umount /media
/sbin/shutdown -h now

Ubuntu初回起動

Rasyberry Pi から microSDカードを抜いて、Raspberry Pi の電源ケーブルをさしなおします。

外付けHDD/SSD から Ubuntu が起動してきます。
ログインできるようになったら、ログインします。初期ユーザーとパスワードはともに ubuntu です。

初回ログインでパスワード変更を求められますので、パスワードを変更します。

Ubuntuアップデートへの自動対処

これで、外付けHDD/SSD から Ubuntu が起動できるようになりました。

ただし、Ubuntuアップデートで、boot/vmlinuz が更新された場合、先の「ブート用の設定」の手順の
dd if=vmlinuz bs=1 | zcat > vmlinux
を実行しないと、Ubuntuが起動できなくなります。

そこで、アップデートの際に自動的にこれを行うようにします。

rootで次のファイルを作成します。
これは、以下のフォーラムで説明されていた内容です。

RPI4 Direct USB Boot Ubuntu 20.04 – Raspberry Pi Forums

2022.2.27
下記のスクリプトで mount -o remount /boot/firmware/ の行を追加しました。

/boot/firmware/auto_decompress_kernel

#!/bin/bash -e
#Set Variables
BTPATH=/boot/firmware
CKPATH=$BTPATH/vmlinuz
DKPATH=$BTPATH/vmlinux
mount -o remount /boot/firmware/
#Check if compression needs to be done.
if [ -e $BTPATH/check.md5 ]; then
    if md5sum --status --ignore-missing -c $BTPATH/check.md5; then
    echo -e "\e[32mFiles have not changed, Decompression not needed\e[0m"
    exit 0
    else echo -e "\e[31mHash failed, kernel will be compressed\e[0m"
    fi
fi
#Backup the old decompressed kernel
mv $DKPATH $DKPATH.bak
if [ ! $? == 0 ]; then
    echo -e "\e[31mDECOMPRESSED KERNEL BACKUP FAILED!\e[0m"
    exit 1
else    echo -e "\e[32mDecompressed kernel backup was successful\e[0m"
fi
#Decompress the new kernel
echo "Decompressing kernel: "$CKPATH".............."
zcat $CKPATH > $DKPATH
if [ ! $? == 0 ]; then
    echo -e "\e[31mKERNEL FAILED TO DECOMPRESS!\e[0m"
    exit 1
else
    echo -e "\e[32mKernel Decompressed Succesfully\e[0m"
fi
#Hash the new kernel for checking
md5sum $CKPATH $DKPATH > $BTPATH/check.md5
if [ ! $? == 0 ]; then
    echo -e "\e[31mMD5 GENERATION FAILED!\e[0m"
    else echo -e "\e[32mMD5 generated Succesfully\e[0m"
fi
#Exit
exit 0

続けて root で下記を実行します。

echo "DPkg::Post-Invoke {"/bin/bash /boot/firmware/auto_decompress_kernel"; };" > /etc/apt/apt.conf.d/999_decompress_rpi_kernel
chmod +x /etc/apt/apt.conf.d/999_decompress_rpi_kernel
chmod +x /boot/firmware/auto_decompress_kernel
/boot/firmware/auto_decompress_kernel

これで、Ubuntuアップデートの際に、自動的に必要な処理がされます。

参考

Raspberry Pi 4 Model B で USB ブート – Qiita
RPI4 Direct USB Boot Ubuntu 20.04 – Raspberry Pi Forums
Raspberry Pi 4でUSB接続HDDから64ビットUbuntu 20.04.1を起動してみました | 日記というほどでも

コメント

  1. 林遠 より:

    失礼します、あなたのブログ投稿の内容を読んだ後、私はそれが非常に興味深いと思います。 私はラズベリーパイを販売しているAmazonの販売者です。 ラズベリーパイ4のケースの記事を書いてほしい。 弊社はあなたに無料で製品を提供します。 よろしくお願いします