从 SSD 启动 Raspberry Pi 3 Model B
Source: Dev.to
用 SSD 启动 Raspberry Pi 3 Model B
在这篇文章中,我将向大家展示如何让 Raspberry Pi 3 Model B 从外接的 SSD 启动。相比于传统的 micro‑SD 卡,SSD 能提供更快的读写速度和更高的可靠性。下面的步骤已经在我的设备上完整测试,按部就班操作即可。
前置条件
| 项目 | 说明 |
|---|---|
| Raspberry Pi 3 Model B | 必须是 3B(不是 3B+) |
| SSD + USB‑SATA 转接线 | 推荐使用带外部电源的转接线,以免供电不足 |
| 官方 Raspberry Pi OS(32‑bit) | 以 2022‑04‑04 版为例 |
| 具备网络的 micro‑SD 卡 | 用来先更新固件并写入 OTP 位 |
| 5 V/2.5 A 电源适配器 | 确保 Pi 与 SSD 同时供电稳定 |
提示:如果你已经在 Pi 上运行最新的系统,仍然建议先备份重要数据。
步骤 1:更新系统并检查固件
打开终端,执行以下命令:
sudo apt update && sudo apt full-upgrade -y
sudo reboot
系统重启后,确认固件已经是最新版本:
vcgencmd bootloader_version
如果显示的版本号低于 2021-05-07,说明仍需更新。可以通过以下方式手动更新(虽然大多数 Pi 3 已经默认最新):
sudo rpi-eeprom-update -d -a
注意:
rpi-eeprom-update主要针对 Pi 4,但在 Pi 3 上运行不会产生负面影响。
步骤 2:启用 USB 启动模式(一次性)
Raspberry Pi 3 需要在 OTP(一次性可编程)位中写入 program_usb_boot_mode=1,才能从 USB 设备启动。执行:
echo program_usb_boot_mode=1 | sudo tee -a /boot/config.txt
sudo reboot
重启后,使用以下命令检查 OTP 位是否已经设置:
vcgencmd otp_dump | grep 17:
如果返回类似 17:3020000a(第 17 位的第 2 位为 1),则说明 USB 启动已被激活。此后即使把 program_usb_boot_mode=1 从 config.txt 中删除,Pi 仍然会记住该设置。
警告:此操作只能执行一次,写入后不可撤销。
步骤 3:将系统写入 SSD
3.1 下载并烧录镜像
- 前往官方页面下载最新的 Raspberry Pi OS Lite(或 Desktop)镜像。
- 使用
dd或 Balena Etcher 将镜像写入 SSD(假设 SSD 在系统中显示为/dev/sda):
sudo dd if=2022-04-04-raspios-bullseye-armhf-lite.img of=/dev/sda bs=4M conv=fsync status=progress
重要:确保
of=指向的是 整个磁盘(如/dev/sda),而不是分区(如/dev/sda1)。
3.2 调整 cmdline.txt(可选)
默认情况下,镜像会在启动时自动检测根文件系统所在的设备。如果你在同一台机器上同时使用 micro‑SD 卡和 SSD,建议手动指定根分区,以避免冲突:
- 挂载 SSD 的 boot 分区:
sudo mkdir /mnt/ssdboot
sudo mount /dev/sda1 /mnt/ssdboot
- 编辑
cmdline.txt,将root=PARTUUID=xxxxxx-02替换为root=/dev/sda2(或对应的 PARTUUID):
sudo nano /mnt/ssdboot/cmdline.txt
保存后,卸载:
sudo umount /mnt/ssdboot
提示:如果你只使用 SSD 而不再使用 micro‑SD 卡,保持原始的
PARTUUID也可以正常工作。
步骤 4:从 SSD 启动
- 关闭 Pi,拔掉 micro‑SD 卡(如果还有插着的话)。
- 将 SSD 通过 USB‑SATA 转接线连接到 Pi 的 USB 2.0 端口(推荐使用蓝色端口)。
- 接通电源,Pi 将自动从 SSD 启动。
首次启动可能会比 SD 卡慢一点,因为系统需要检测 USB 设备。之后你会看到明显的启动速度提升。
故障排查
| 症状 | 可能原因 | 解决方案 |
|---|---|---|
| Pi 卡在 rainbow screen,不继续启动 | OTP 位未成功写入 | 再次执行步骤 2,确认 vcgencmd otp_dump 中第 17 位的第 2 位为 1 |
| 系统启动后找不到根文件系统 | cmdline.txt 中的 root= 参数错误 | 检查并确保指向正确的分区(/dev/sda2 或对应的 PARTUUID) |
| SSD 供电不足导致频繁重启 | 使用的转接线没有外部电源 | 更换带独立电源的 USB‑SATA 盒 |
| 读取速度仍然很慢 | 仍在使用 micro‑SD 卡启动 | 确认已拔掉所有 micro‑SD 卡,且 cmdline.txt 已指向 SSD |
小结
通过以上四个步骤,你就可以让 Raspberry Pi 3 Model B 从外接 SSD 启动,获得更快的系统响应和更长的使用寿命。记得:
- 更新系统,确保固件最新。
- 写入 OTP 位,一次性开启 USB 启动。
- 将 OS 镜像写入 SSD,必要时手动指定根分区。
- 拔掉 micro‑SD 卡,直接从 SSD 启动。
祝你玩得开心,期待看到大家基于 SSD 的 Pi 项目! 🚀
介绍
大家好!在这篇文章中,我将分享我使用 SSD 对 Raspberry Pi 3 Model B 进行 USB 引导的经验。虽然我大约在一年前就完成了这项操作,但一直拖到现在才把它写下来(抱歉拖延了 — xD)。
如果你发现我遗漏了什么,请告诉我。欢迎提供反馈!
我使用的
| 项目 | 数量 |
|---|---|
| Raspberry Pi 3 Model B | 4 |
| Raspberry Pi 3 Model B+ | 1 |
| 电源(适当的电压和电流) | 5 |
| 固态硬盘(SSD) | 5 |
| USB转SATA适配器 | 5 |
从 SSD 启动
有许多博客文章、论坛帖子,甚至 LLM 生成的指南解释了如何在 Pi 3 Model B 上进行 USB 启动。下面是对我有效的步骤的简要概述。
1. 在 SD 卡上更新系统
sudo apt update -y && sudo apt full-upgrade -y
2. 检查 USB 启动是否已启用
vcgencmd otp_dump | grep 17
可能的输出
17:1020000a # USB 启动已禁用
17:3020000a # USB 启动已启用
3. 启用 USB 启动(如有必要)
在 /boot/firmware/config.txt 中添加以下行。
(较旧的教程提到 /boot/config.txt;该位置现已过时。)
program_usb_boot_mode=1
program_usb_boot_timeout=1
4. 将 SD 卡镜像克隆到 SSD
# /dev/mmcblk0 → SD 卡(在我的情况下)
# /dev/sdb → 通过 USB 连接的 SSD
sudo dd if=/dev/mmcblk0 of=/dev/sdb status=progress bs=4M conv=fsync
注意: 将设备名称(
mmcblk0、sdb)调整为与你的系统相匹配。
5. 从 SSD 启动
- 关闭 Pi 电源。
- 移除 SD 卡。
- 通过 USB‑to‑SATA 适配器连接 SSD。
- 再次给 Pi 通电。
如果一切顺利,Pi 应该会从 SSD 启动。此时你可以调整分区大小、运行基准测试等。
结果: 该方法在 Pi 3 Model B+ 上成功,但在 我拥有的 5 台 Raspberry Pi 3 Model B 中有 4 台失败。后面的章节将解释原因。
The difference between Pi 3 Model B and Pi 3 Model B+
我先在 Pi 3 Model B+ 上执行了上述步骤,结果启动毫无问题。将相同的操作在四块 Pi 3 Model B 上重复后,仍然出现 “no USB boot” 的结果,即使在 /boot/firmware/config.txt 中添加了 program_usb_boot_timeout=1。
这让我得出结论,尽管它们属于同一系列,Model B 与 Model B+ 在启动方面仍存在细微差别。
我的解决方案(偶然)
在多次失败的尝试后,终于有一块 Model B 主板能够从 SSD 启动。我在终端中验证了这一点并运行了 I/O 速度测试——所有结果都表明操作系统正从 SSD 运行。
什么发生了变化?
我意识到 在 SSD 也连接着的情况下,我把 SD 卡一直插在板子上。树莓派仍然需要 SD 卡来启动引导过程,即使根文件系统已经位于 USB SSD 上。
验证假设
- 格式化 SD 卡(任何文件系统都可以)。
- 将 SSD 的
/boot/目录内容复制到新格式化的 SD 卡上。
两个/boot目录必须完全相同。
完成上述操作后,树莓派再次从 SSD 启动,证实了 Model B 需要一张 SD 卡来启动引导,无论操作系统位于何处。
重要细节
- 不要把 某一 SSD 的
/boot/firmware目录复制到 所有 SD 卡上。 - 每个 SSD 在
/boot/firmware/cmdline.txt中都有唯一的 UUID。 - 要么把对应 SSD 的
/boot/firmware复制到相应的 SD 卡上,要么编辑cmdline.txt,使其中的PARTUUID=指向正确的磁盘。
示例 cmdline.txt(单行,无换行):
console=serial0,115200 console=tty1 root=PARTUUID=e000a75d-02 rootfstype=ext4 fsck.repair=yes rootwait cfg80211.ieee80211_regdom=US cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory
升级操作系统
所有上述步骤都是在最新的 Raspberry Pi OS 基于 Debian 12(bookworm) 时完成的。当前的 Raspberry Pi OS 已经改为基于 Debian 13(trixie)。与其重新格式化并从头开始,我选择了就地进行一次大版本升级。
升级步骤
-
编辑 APT 源列表
sudo nano /etc/apt/sources.list sudo nano /etc/apt/sources.list.d/raspi.list将所有出现的
bookworm替换为trixie。 -
更新软件包信息并执行升级
sudo apt update sudo apt full-upgrade -y -
重启
sudo reboot
重启后,系统将在基于更新的 Debian 13 的 Raspberry Pi OS 上运行,同时仍然从 SSD 启动(SD 卡如上所述仍然在位)。
更新系统
-
刷新软件包索引
sudo apt update -
安装最新版本的软件包管理器
sudo apt install -y apt dpkg -
在不引入新依赖的情况下升级
sudo apt upgrade --without-new-pkgs确保一切正常。
-
执行完整升级
sudo apt full-upgrade -
重启
sudo reboot
这些步骤在任何配置上都足够(它们适用于 Raspberry Pi 3 Model B+)。然而,由于我们首先从 SD 卡而不是 SSD 启动,需要额外的几步操作。
Source: …
调整升级后的启动分区
Linux 内核镜像位于 /boot 目录。由于树莓派从 SD 卡启动,之前安装的启动文件仍然保留在卡上。升级后,内核仍停留在 6.1 版本,而不是预期的 6.12(Debian 13 随附的版本)。
要使升级 100 % 完成,请重复让树莓派从 SSD 启动时使用的步骤:
-
挂载 SD 卡的启动分区
sudo mount /dev/mmcblk0p1 /mnt/sdboot/ -
将 SSD 上的固件复制到 SD 卡
sudo cp -r /boot/firmware/* /mnt/sdboot/ -
重启
sudo reboot
完成以上步骤后,系统将使用新内核启动,升级即可完全生效。
使用容器
如果您计划运行容器(例如 Docker)或容器编排器,如 K3s,请确保在 /boot/firmware/cmdline.txt 中包含以下内核参数:
cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory
这些选项为容器运行时启用所需的 cgroup 功能。
参考文献
- 官方 Raspberry Pi 文档 – Pi 3 的 USB 引导
- 各种社区博客文章和论坛帖子(为简洁起见省略链接)