追記(2020/06/24)
RaspberryPi 4でも正式にUSBメモリー単体ブートに対応しました。
以下は古い情報になります。
Raspberry Pi 3までは(途中から)MicroSDブートでなくUSBメモリー単体でのブートが可能になってましたが、Raspberry Pi 4は構成が変わったため、現時点でのファームウェアではUSBブートができません。
MicroSDはUSBメモリー以上に劣化が激しいので極力常時利用する際には利用したくない。
そこで、ブートに必要なデータだけをMicroSDに配置し、実際のLinux(今回はRaspbian)をUSBメモリーに配置することで、ブート処理だけMicroSDで行う疑似USBブートを行うようにします。
用意するもの
- RaspberryPi 4
- USBメモリー
- MicroSD
MicroSDはUSBメモリーの容量よりも少ない容量のものを。8GBのものがベストです。作業の都合大容量なものだと作業に時間がかかります。
パーティションの作成
まずはとりあえずRaspbianをMicroSDに書き込んでブートさせます。今回はRaspberryPiでの作業をSSH経由で行いたいので、boot領域に ssh
ファイルを作成しておきました。
起動したらまず sudo fdisk -l
を実行。
実行結果
Raspbianがインストールされている領域は /dev/mmcblk0p2
、ブート領域は /dev/mmcblk0p1
となります。
そしてUSBメモリーは /dev/sda
。
現時点ではUSBメモリーは未フォーマットの状態なので、partedを使って初期化を実施。
sudo parted /dev/sda
を実行してから下記のコマンドをそれぞれ実行。
mklabel gpt
y
mkpart primary ext4 0% 100%
p
q
EXT4で全体を初期化するコマンドです。お好みで。
これでファイルを置くための領域として /dev/sda1
が確保されました。
Raspbianの領域をUSBメモリーへコピー
単なるコピーだと特殊なファイルやら権限やらが面倒なので、領域丸ごとddコマンドでコピーします。
コマンド: sudo dd if=/dev/mmcblk0p2 of=/dev/sda1 bs=32M conv=noerror,sync status=progress
空き領域含めて丸ごとコピーするので時間がかかります。
実行したらファイルシステムのチェックを実施。
コマンド:sudo e2fsck -f /dev/sda1
たまに Fix<y>?
と聞かれるので、yを実行。
この状態だと領域がMicroSD側のRaspbianのサイズになってしまっているので、resize2fsを実行して拡張。
コマンド:sudo resize2fs /dev/sda1
fstab更新
USBメモリーにRaspbianの領域をコピーしただけではまだUSBブートされないので、ブート対象を切り替える必要があります。
まずはPARTUUIDの確認。
コマンド:ls -l /dev/disk/by-partuuid/
PARTUUIDが分かったところでマウント情報が書かれているfstabを更新します。
まずはUSBメモリーの領域をマウント。
コマンド:sudo mount /dev/sda1 /mnt
そしたらfstabを適当なエディタで開きます。私はvim使うの苦手なのでnanoで。
コマンド:sudo nano /mnt/etc/fstab
開いた段階ではこんな感じ。
ここでルートディレクトリのPARTUUIDをUSBメモリーのPARTUUIDに書き換え。
boot領域のほうは /dev/mmcblk0p1
に書き換えました。これは今後boot領域を別のMicroSDを用いる場合の対応なので、同じMicroSDを使うなら不要。
編集後
cmdline.txt編集
boot領域側のcmdline.txtを編集します。
編集前
PARTUUIDがMicroSDのLinux領域指定になっているので、ここをUSBメモリー側に向くように修正します。
これでUSBブートの準備は完了。
RaspberryPi4を再起動して正常に起動するならOK。
バックアップ
この後Raspbianをいじって初期化したいと思ったときにまたこの作業をするのは面倒なので、作業完了したらイメージを取っておくべき。
どのソフトでもいいですが、USB Image Toolだと空き領域部までイメージを取得しないので便利。
Download
MicroSDに残してあるboot領域はイメージを取らなくとも、ファイルをバックアップしておけばOK。
参考サイト
Raspberry PiをUSB(HDD)で起動させる