ラズパイを外付けSSDから起動する

ラズパイはMicro-SDから起動するのが一般的ですが、外付けSSDから起動することも可能です。今回は外付けSSDからUbuntu Serverを起動できるようにします。

※2021年9月29日時点の情報です

必要なもの

  • Raspberry pi 4 8GB
  • Micro-SD(ラズパイの初回起動に使用します)
  • 外付けSSD
  • 有線LANケーブル(ラズパイをインターネットに繋げるのに使います)
  • Micro-HDMI変換アダプター(ラズパイをモニターに繋げるのに使います)
  • WindowsまたはMac(OSのダウンロードに使います)

手順

  1. WindowsまたはMacに公式サイトからRaspberry pi OS with DesktopbelenaEtcherをダウンロードします。
  1. belenaEtcherを使い、Micro-SDにRaspberry pi OSを書き込みます。
  1. 有線LANとMicro-SDをRaspberry piに挿入して起動します。外付けSSDはまだ繋げません。
  1. Raspberry pi OSの初期設定が完了したらターミナルを開き、Raspberry pi OSを更新し、Imagerをインストールします。
sudo apt update && sudo apt upgrade -y
sudo apt install rpi-imager -y
  1. Raspberry pi OSを起動したまま外付けSSDを繋げます。画面左上のラズパイのマークをクリックし、「アクセサリ」→「Imager」をクリックしてImagerを開きます。ImagerでUbuntu Serverを外付けSSDに書き込みます。
  1. 外付けSSDを一度外し、再度繋げるとデスクトップに「system-boot」と「writable」というパーティションが表示されます。
  1. ターミナルを開き、Raspberry pi OSから必要なファイルを外付けSSDにコピーします。
cp /boot/*.dat /media/pi/system-boot/
cp /boot/*.elf /media/pi/system-boot/
  1. vmlinuxというファイルを作成します。
cd /media/pi/system-boot
zcat vmlinuz > vmlinux
  1. 「system-boot」パーティション内のconfig.txtをダブルクリックして開き、[pi4]セクションに以下を追記します。
max_framebuffers=2
dtoverlay=vc4-fkms-v3d
boot_delay
kernel=vmlinux
initramfs initrd.img followkernel
  1. 今の段階でapt upgradeをするとvmlinuzとvmlinuxのバージョンが合わなくなるため、「system-boot」パーティションにバージョンを合わせるスクリプトを作成します。
sudo nano /media/pi/system-boot/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

スクリプトを保存したら権限を変更します。

sudo chmod +x /media/pi/system-boot/auto_decompress_kernel
  1. 「writable」パーティションにもスクリプトを作成します。
sudo nano /media/pi/writable/etc/apt/apt.conf.d/999_decompress_rpi_kernel

スクリプトの中身は以下にします。

DPkg::Post-Invoke {"/bin/bash /boot/firmware/auto_decompress_kernel"; };

スクリプトを保存したら権限を変更します。

sudo chmod +x /media/pi/writable/etc/apt/apt.conf.d/999_decompress_rpi_kernel
  1. ターミナルから起動ドライブを外付けSSDに変更するための設定を開きます。
sudo raspi-config

Advanced OptionsからBoot OrderUSB Bootに変更し、ラズパイをシャットダウンします。

  1. Micro-SDを取り外し、ストレージは外付けSSDだけ接続されている状態で電源を入れます。初回ログイン時はユーザー名ubuntuパスワードubuntuを使用します。