背景
pi 4 は通常ボード上のマイクロSDカードから起動するようになっているけど、Raspbian のようなOS を24/7 稼働するとマイクロSDカードでは不安が大きい。
残念ながらRaspberry pi 4 Model B はファームウェアの関係から、現在USB-SSD から直接(マイクロSDカードを介さずに)起動する事は出来ないようだ。
なので起動時にマイクロSDカードから一旦ブートローダーを読み込み、そこからUSB-SSD のOS領域を起動するようにする。
この場合マイクロSDカードは起動時に読み込みだけが行われ、OS起動後は基本的に読み書きが発生しないので、マイクロSDカードの寿命を気にする必要が無くなる。
事前準備 ハードウェア
たまたまMacOS インストール・イメージに使っていた128GB SSD があったので、こちらを流用する事にした。
(MacOSインストールデバイスはUSB メモリスティックでも作成出来たので、SSD は必要なくなっていた)

pi 4 とはUSB-SATA ケーブルで、USB3.0 端子へ接続。
事前確認 パーティション構成
接続したSSD のパーティション構成を確認。
# fdisk -l
今回のSSD に関するパーティション情報は下記の通りであった。
Disk /dev/sda: 119.2 GiB, 128035676160 bytes, 250069680 sectors
Disk model: id State Disk
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 33553920 bytes
Disklabel type: gpt
Disk identifier: 6841264A-7343-40D3-AC7B-EE00D3815829
Device Start End Sectors Size Type
/dev/sda1 40 409639 409600 200M EFI System
/dev/sda2 409640 250069639 249660000 119G unknown
一応問題無さそうだったので、/dev/sda2 にOS領域を置くことにした。
マイクロSDカード側のパーティション構成は下記の通りであった。
Device Boot Start End Sectors Size Id Type
/dev/mmcblk0p1 32768 5039062 5006295 2.4G e W95 FAT16 (LBA)
/dev/mmcblk0p2 5039063 249737215 244698153 116.7G 5 Extended
/dev/mmcblk0p5 5046272 5111805 65534 32M 83 Linux
/dev/mmcblk0p6 5111808 5636093 524286 256M c W95 FAT32 (LBA)
/dev/mmcblk0p7 5636096 249737215 244101120 116.4G 83 Linux
なので、OS領域は/dev/mmcblk0p7 にあるので、これをソースとし、ディスティネーションを /dev/sda2 とすれば良い事が判った。
OS領域をSD からUSB-SDD へコピー
下記をコマンド実行を実施
# OS root 領域をSD からUSB-SDD へコピー
dd if=/dev/mmcblk0p7 of=/dev/sda2 bs=32M conv=noerror,sync
# エラーチェック
e2fsck -f /dev/sda2
e2fsck -f /dev/sda2
resize2fs /dev/sda2
最初のe2fsck コマンドでの実行結果
# e2fsck -f /dev/sda2
e2fsck 1.44.5 (15-Dec-2018)
root: recovering journal
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
Free blocks count wrong (28287105, counted=28286695).
Fix<y>? yes
Free inodes count wrong (7446190, counted=7446155).
Fix<y>? yes
root: ***** FILE SYSTEM WAS MODIFIED *****
root: 188789/7634944 files (0.2% non-contiguous), 2225945/30512640 blocks
root@myos-pi4:/usr/share/wordpress#
root@myos-pi4:/usr/share/wordpress# e2fsck -f /dev/sda2
e2fsck 1.44.5 (15-Dec-2018)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
root: 188789/7634944 files (0.2% non-contiguous), 2225945/30512640 blocks
root@myos-pi4:/usr/share/wordpress#
root@myos-pi4:/usr/share/wordpress# resize2fs /dev/sda2
resize2fs 1.44.5 (15-Dec-2018)
Resizing the filesystem on /dev/sda2 to 31207500 (4k) blocks.
The filesystem on /dev/sda2 is now 31207500 (4k) blocks long.
root@myos-pi4:/usr/share/wordpress#
幸いな事に問題の出たファイルは少なく、2度目のe2fsck はノーエラーであった。
起動設定ファイルの修正
マイクロSDカード
マイクロSDカードにある’cmdline.txt’ を編集して、USB-SSD 上のパーティションを指すように変更
console=serial0,115200 console=tty1 root=/dev/sda2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet splash plymouth.ignore-serial-consoles
/etc/fstab の更新
USB-SSD 側の /etc/fstab ファイルを更新しておく。
# mount /dev/sda2 /mnt
# vi /mnt/etc/fstab
編集前
proc /proc proc defaults 0 0
/dev/mmcblk0p6 /boot vfat defaults 0 2
/dev/mmcblk0p7 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
編集後
proc /proc proc defaults 0 0
/dev/mmcblk0p1 /boot vfat defaults 0 2
/dev/dsa2 / ext4 defaults,noatime 0 1
# a swapfile is not a swap partition, no line here
# use dphys-swapfile swap[on|off] for that
以上でUSB-SSD から起動するようになった。
# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 119.2G 0 disk
├─sda1 8:1 0 200M 0 part
└─sda2 8:2 0 119G 0 part /
mmcblk0 179:0 0 29.7G 0 disk
└─mmcblk0p1 179:1 0 29.7G 0 part /boot
注:後ほどブート用のマイクロSDカードを128GBの物から32GBへ変更した為、マイクロSDカードのパーティションがmmcblk0p7 からmmcblk0p1へ変わっている。
/dev/sda2 のようなデバイス名は、デバイスの差し替え等で変わる事がある為UUID を使った方が良いみたいだけど、今回はこのままで…
# lsblk -o UUID /dev/sda2
UUID
4a260d54-dda3-4ee8-957a-e3679cd17918
変更結果
起動をSSD に変更してから、少しレスポンスが良くなったような気がする。
元々レスポンスはそれなりに良かったので、プラシーボ効果かもしれない。
ただ書き込みは明白に早くなったと感じる。
モジュールのアップデート等がより高速になった気がするからである。
貴重な情報(USB_SSD 活用索)を公開いただき、ありがとうございました。
事前によく調べもせず、てっきりRPI 4Bであれば 最初からUSBブートできるものなのだと、、思い込んでいました。 実際に、それを購入して実機で試して あれーーー???
それゆえ、遅い伝送スピード、さらに経年変化で信頼性に疑問符がつく ”SDカード”からの脱皮(?)を目指して、SDカードをブート専用にして、USB-SSDでのROOTファイルアクセスを試みました。
当該 投稿内容に救われて、無事 Raspbian Busterのシステムにくわえて、 Ubuntu Server+Mateシステムの両方で、USB-SSDを活用できました。 I/Oスピードが迅速になり、快適なPC代用のRPIデスクトップシステムを享受しており、あきらめずにがんばったことで 良い成果を残せました。
感謝!!!
コメント頂きありがとうございます。
私の備忘録がお役に立ちました様で嬉しい限りです。
本当にPRI4B で直接USBブート出来ないのは謎ですよね。
将来ファームアップで対応される事を切に願っています。
仰る様にRPI4B のI/O(USB3, GB Earthernet)強化は、
PCやサーバーとして充分なもので活用のしがいがあると思います。
安価、コンパクトで小消費電力、安定したハードウェア・ソフトウェア環境等
使い出があり、IoT 等の機器制御まで楽しめる素晴らしいプラットフォーム
であると今でも実感しています。
下記URLにて、RPI4B WEBサーバーを立ち上げています。
7/24 で数ヶ月運用していますが全く問題無く稼働しています。
お時間がありましたらアクセスしてみて下さい。
WEBサーバーとして全く遜色の無いレスポンスだと思います。
http://pi4.mattaka.com:8080/wp/