树莓派 3b+ 使用 SSD 作为系统根目录记录

树莓派 4b 最近发售了, 想看看各方面准确参数, 查到 I/O 速度时看到这篇颇为详细的评测, 里面提到虽然树莓派 4b 也还未能直接完全从 SSD/U 盘启动, 但可以通过修改类似”引导文件”的方法指定系统根目录(即是 / 目录)到外置储存.

评测结果显示, 即使对于 3b+, 用 SSD 做系统盘也要比鹌鹑的 TF 卡快上约 2~4 倍. 正好有个神船 Z7M-KP5GZ 上拆下来的闲置群联 OEM 128G SSD, 虽然 3b+ USB 口实际最高传输速度只有约 25MB/s, 但水桶中最短的木板始终是 TF 卡, 而且现在转移了, 以后升级 4b 也能插上稍微改改就用, 所以感觉还是很值得一搞的, 于是开始动手.

题外话, 至于用 U 盘做系统盘, 评测结论是, 慢得要死, 别搞.

具体步骤直接一步步跟着他的教程走就好, 这里只提一些教程中遗漏的点, 和我踩到的坑.

再次提醒: 如上文提到, 这方法并不能让系统完全脱离 TF 卡启动.

不过反正空出来的 TF 卡空间挂载一下也能继续用嘛.

准备 SSD 阶段

转移文件阶段

这句的 rsync 参数可以加上 hP 来显示进度, 毕竟要复制好一会儿, 有个进度比较有底.

sudo rsync -avx / /media/newdrive

最后变成:

sudo rsync -avxhP / /media/newdrive

修改启动参数阶段

这句

  1. Paste the following text at the end of the first (and likely only) line of cmdline.txt.

root=/dev/sda1 rootfstype=ext4 rootwait

不要粘贴, 粘贴了会重复, 直接修改已经存在的 root= 值就好了.

稍微注意下 rootfstype 类型要跟 SSD 的实际文件系统类型对上, 不过如果跟着该文前面步骤的话, 就已经将整个 SSD 格式化成 ext4 了.

同时, root= 的值写成内核名称 /dev/sdXY 也是不太稳的做法, 随着外置设备的插拔, 这里 XY 的值很可能发生变化, 比较稳应该是用 LABELPARTUUID 来定位分区. (坑的是树莓派官方文档都没有介绍 root= 的额外写法.)

用 LABEL

先看看 SSD 上系统所在的分区内核名称.

sudo fdisk -l

这里假设分区内核名称是 /dev/sda1.

给分区加个 LABEL.

sudo e2label /dev/sda1 ssdsys

最后在 /boot/cmdline.txt 写上

root=LABEL=ssdsys

用 PARTUUID

lsblk 根据分区内核名称看 PARTUUID.

sudo lsblk -f

复制粘贴进 /boot/cmdline.txt.

root=PARTUUID=aaecbf2a-35e2-4b27-8b56-a8f5f3xxxxxx

修改 fstab

那篇教程让人改完 /boot/cmdline.txt 就算完了, 但这里明显还应该修改复制之后文件系统的 /etc/fstab, 因为此时这个 fstab 还会跑去挂载默认的 LABEL=writable 为系统根目录. 不改的话除了会造成非常让人混乱的挂载结构, 还会导致实际上迁移不成功.

首先在当前系统 /mnt 下新建个目录准备挂载复制后的文件系统. 这里假设分区内核名称和 UUID 与上文保持一致.

sudo mkdir /mnt/ssdfs

挂载分区.

sudo mount /dev/sda1 /mnt/ssdfs

改复制后系统的 fstab. (这里假设你已经装了 vim.)

sudo vim /mnt/ssdfs/etc/fstab

如果之前没改过什么的话, 打开后大概会是这样子.

LABEL=writable     /               ext4  defaults,noatime  0  0
LABEL=system-boot  /boot/firmware  vfat  defaults          0  1

改完后.

LABEL=ssdsys       /               ext4  defaults,noatime  0  0
LABEL=system-boot  /boot/firmware  vfat  defaults          0  1

演示起见, 加上 UUID 写法.

UUID=aaecbf2a-35e2-4b27-8b56-a8f5f3xxxxxx  /  ext4  defaults,noatime  0  0
LABEL=system-boot  /boot/firmware  vfat  defaults          0  1

想的话也可以把现在的 TF 卡分区挂载回来, 这个随意. 比如挂载去 /mnt/tffs(自行新建目录).

LABEL=ssdsys       /               ext4  defaults,noatime  0  0
LABEL=system-boot  /boot/firmware  vfat  defaults          0  1
LABEL=writable     /mnt/tffs       ext4  defaults,noatime  0  0

最后保存, 重启 sudo reboot, 完事.

觉得 TF 卡上旧系统碍事的可以参考 ArchWiki 的 Full system backup with tar 做个压缩备份扔一边后删掉.

参考链接

How to Run Raspberry Pi 4 or 3 Off an SSD or Flash Drive

fstab (简体中文) – ArchWiki