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

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版です。


$ 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


/boot/firmware/auto_decompress_kernel

#!/bin/bash -e

#Set Variables
BTPATH=/boot/firmware
CKPATH=$BTPATH/vmlinuz
DKPATH=$BTPATH/vmlinux

#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を起動してみました | 日記というほどでも

ブログ気持玉

クリックして気持ちを伝えよう!

ログインしてクリックすれば、自分のブログへのリンクが付きます。

→ログインへ

なるほど(納得、参考になった、ヘー)
驚いた
面白い
ナイス
ガッツ(がんばれ!)
かわいい

気持玉数 : 0

この記事へのコメント