从 SSD 启动 Raspberry Pi 3 Model B

发布: (2026年1月19日 GMT+8 04:19)
12 min read
原文: Dev.to

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=1config.txt 中删除,Pi 仍然会记住该设置。

警告:此操作只能执行一次,写入后不可撤销。


步骤 3:将系统写入 SSD

3.1 下载并烧录镜像

  1. 前往官方页面下载最新的 Raspberry Pi OS Lite(或 Desktop)镜像。
  2. 使用 ddBalena 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,建议手动指定根分区,以避免冲突:

  1. 挂载 SSD 的 boot 分区:
sudo mkdir /mnt/ssdboot
sudo mount /dev/sda1 /mnt/ssdboot
  1. 编辑 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 启动

  1. 关闭 Pi,拔掉 micro‑SD 卡(如果还有插着的话)。
  2. 将 SSD 通过 USB‑SATA 转接线连接到 Pi 的 USB 2.0 端口(推荐使用蓝色端口)。
  3. 接通电源,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 启动,获得更快的系统响应和更长的使用寿命。记得:

  1. 更新系统,确保固件最新。
  2. 写入 OTP 位,一次性开启 USB 启动。
  3. 将 OS 镜像写入 SSD,必要时手动指定根分区。
  4. 拔掉 micro‑SD 卡,直接从 SSD 启动。

祝你玩得开心,期待看到大家基于 SSD 的 Pi 项目! 🚀

介绍

大家好!在这篇文章中,我将分享我使用 SSD 对 Raspberry Pi 3 Model B 进行 USB 引导的经验。虽然我大约在一年前就完成了这项操作,但一直拖到现在才把它写下来(抱歉拖延了 — xD)。

如果你发现我遗漏了什么,请告诉我。欢迎提供反馈!

我使用的

项目数量
Raspberry Pi 3 Model B4
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

注意: 将设备名称(mmcblk0sdb)调整为与你的系统相匹配。

5. 从 SSD 启动

  1. 关闭 Pi 电源。
  2. 移除 SD 卡。
  3. 通过 USB‑to‑SATA 适配器连接 SSD。
  4. 再次给 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 BModel B+ 在启动方面仍存在细微差别。

我的解决方案(偶然)

在多次失败的尝试后,终于有一块 Model B 主板能够从 SSD 启动。我在终端中验证了这一点并运行了 I/O 速度测试——所有结果都表明操作系统正从 SSD 运行。

什么发生了变化?

我意识到 在 SSD 也连接着的情况下,我把 SD 卡一直插在板子上。树莓派仍然需要 SD 卡来启动引导过程,即使根文件系统已经位于 USB SSD 上。

验证假设

  1. 格式化 SD 卡(任何文件系统都可以)。
  2. 将 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)。与其重新格式化并从头开始,我选择了就地进行一次大版本升级。

升级步骤

  1. 编辑 APT 源列表

    sudo nano /etc/apt/sources.list
    sudo nano /etc/apt/sources.list.d/raspi.list

    将所有出现的 bookworm 替换为 trixie

  2. 更新软件包信息并执行升级

    sudo apt update
    sudo apt full-upgrade -y
  3. 重启

    sudo reboot

重启后,系统将在基于更新的 Debian 13 的 Raspberry Pi OS 上运行,同时仍然从 SSD 启动(SD 卡如上所述仍然在位)。

更新系统

  1. 刷新软件包索引

    sudo apt update
  2. 安装最新版本的软件包管理器

    sudo apt install -y apt dpkg
  3. 在不引入新依赖的情况下升级

    sudo apt upgrade --without-new-pkgs

    确保一切正常。

  4. 执行完整升级

    sudo apt full-upgrade
  5. 重启

    sudo reboot

这些步骤在任何配置上都足够(它们适用于 Raspberry Pi 3 Model B+)。然而,由于我们首先从 SD 卡而不是 SSD 启动,需要额外的几步操作。

Source:

调整升级后的启动分区

Linux 内核镜像位于 /boot 目录。由于树莓派从 SD 卡启动,之前安装的启动文件仍然保留在卡上。升级后,内核仍停留在 6.1 版本,而不是预期的 6.12(Debian 13 随附的版本)。

要使升级 100 % 完成,请重复让树莓派从 SSD 启动时使用的步骤:

  1. 挂载 SD 卡的启动分区

    sudo mount /dev/mmcblk0p1 /mnt/sdboot/
  2. 将 SSD 上的固件复制到 SD 卡

    sudo cp -r /boot/firmware/* /mnt/sdboot/
  3. 重启

    sudo reboot

完成以上步骤后,系统将使用新内核启动,升级即可完全生效。

使用容器

如果您计划运行容器(例如 Docker)或容器编排器,如 K3s,请确保在 /boot/firmware/cmdline.txt 中包含以下内核参数:

cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory

这些选项为容器运行时启用所需的 cgroup 功能。

参考文献

  • 官方 Raspberry Pi 文档 – Pi 3 的 USB 引导
  • 各种社区博客文章和论坛帖子(为简洁起见省略链接)
Back to Blog

相关文章

阅读更多 »

让 Linux 成为企业桌面

封面图片:Making Linux Work as a Corporate Desktop https://media2.dev.to/dynamic/image/width=1000,height=420,fit=cover,gravity=auto,format=auto/https%3A%2...

网络工程师

简介 我正踏上成为网络工程师的旅程。我的第一步是获得 Cisco Certified Network Associate(CCNA)认证,...