ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

树莓派USB Boot烧录指南:免拔卡刷机与rpiboot原理

树莓派USB Boot烧录指南:免拔卡刷机与rpiboot原理 1. 为什么我要放弃拔卡读卡器转向 USB Boot 烧录手里攒了七八张 TF 卡每次给树莓派换系统都要经历一套固定流程断电、拔卡、插读卡器、等电脑识别、用烧录工具写镜像、弹出、拔卡、插回树莓派、上电。这套动作做一次两次还行做十次二十次就烦了尤其是树莓派装在壳子里、卡槽又被挡住的时候拔卡本身就是个体力活。更麻烦的是反复插拔 TF 卡会磨损卡槽的弹片我有一块 Pi 4 的卡槽就是这么被搞松的后来卡插进去偶尔接触不良开机直接卡在彩虹屏。后来我开始用USB Boot这条路子让树莓派自己进入一个特殊的启动模式通过 USB 线把自己暴露成一块可以被电脑直接写入的存储设备电脑端用官方工具把系统镜像灌进去全程不用碰 TF 卡。这个机制在树莓派社区里通常叫rpiboot是 Raspberry Pi 官方提供的一套工具链核心思路是利用树莓派芯片BCM2711、BCM2712 等内置的USB Device Boot能力——芯片上电时如果检测到特定的启动条件会把自己枚举成一个 USB 大容量存储设备USB Mass Storage这时候电脑就能像操作 U 盘一样往里面写数据。这套方案解决的核心痛点有三个。第一是免拆装树莓派装在设备里、卡槽被遮挡也能刷机第二是批量效率做集群或者教学场景时一台电脑可以流水线式地刷几十块板子第三是救砖当 TF 卡上的系统彻底起不来、又不想拔卡的时候USB Boot 是最后的救命通道。适合谁来用如果你只是偶尔刷一次系统拔卡也没啥但如果你在折腾 Pi 集群、做嵌入式产品原型、或者经常需要重装系统那这套流程值得花半小时搭起来后面能省下大量重复劳动。需要提前说清楚一个前提USB Boot 不是所有树莓派型号都支持而且不同型号进入该模式的方式、需要的硬件条件都不一样。下面我会按原理—硬件—实操—排错的顺序把我在 Pi 4、Pi 5、CM4 上踩过的坑和验证过的步骤完整讲一遍。2. rpiboot 到底在芯片层面做了什么2.1 从 BootROM 说起芯片上电后的第一段代码要理解 USB Boot得先知道树莓派芯片上电后发生了什么。以 BCM2711Pi 4为例芯片内部有一块固化在硅片上的BootROM这段代码是出厂就烧死的改不了。上电复位后CPU 先从 BootROM 开始执行BootROM 会按顺序去几个地方找可启动的镜像先是 SPI EEPROM 里的 bootloader然后是 SD 卡再往后才是 USB 设备。关键点在于BootROM 里内置了一个 USB Device 控制器的最小实现。当它发现 SPI EEPROM 是空的、或者 EEPROM 里的 bootloader 被配置成允许 USB 启动、又或者检测到某个特定的 GPIO 条件时它会把自己枚举成一个 USB 设备等待主机端发送一段叫bootcode.bin的固件过来。这个等待主机喂固件的状态就是我们说的rpiboot 模式也叫 USB Device Boot 模式。主机端运行的rpiboot工具干的事情就是识别到这个处于 BootROM 状态的设备把一段二级引导程序second-stage bootloader通过 USB 推给芯片芯片执行这段代码后就具备了完整的 USB Mass Storage 能力于是电脑上就多出来一个盘符可以往里写镜像了。整个过程有点像芯片先裸奔等主机给它穿上衣服它才能干活。2.2 为什么是 USB Mass Storage 而不是别的协议这里有个设计上的取舍值得说。芯片完全可以把自己枚举成一个自定义的 USB 设备用私有协议传输数据但官方选择了USB Mass Storage ClassMSC也就是标准的大容量存储设备类。原因很实际MSC 是操作系统原生支持的Windows、macOS、Linux 都不需要装额外驱动插上就认成磁盘用户可以直接用系统自带的镜像写入工具操作。代价是 MSC 的传输效率不如自定义协议高但对于刷机这种一次性写入几十 MB 到几 GB 的场景完全够用。而且 MSC 的兼容性极好避免了装驱动这个在 Windows 上最容易翻车的环节。我在 Windows 上试过只要 rpiboot 工具跑起来设备管理器里会先出现一个 BCM2711 Boot 之类的设备推完固件后立刻变成 USB Mass Storage Device整个过程不需要手动装任何驱动。2.3 不同芯片代的差异Pi 4、Pi 5、CM4 各不一样这是最容易踩坑的地方。Pi 4 和 CM4 用的是 BCM2711它们的 USB Boot 机制相对成熟rpiboot 工具支持得很好。但Pi 5 用的是 BCM2712芯片架构变了USB Boot 的进入方式和工具版本要求都不一样。我一开始拿 Pi 4 时代的 rpiboot 去怼 Pi 5死活识别不到后来才发现需要更新到较新版本的 rpiboot 才能支持 BCM2712。另外CM4Compute Module 4的情况又特殊一点。CM4 板载 eMMC 版本出厂时 eMMC 是空的必须通过 USB Boot 来灌第一版系统这是官方设计的标准流程。而 CM4 的 Lite 版本没有 eMMC则和普通 Pi 4 一样走 SD 卡或者 USB 启动。所以如果你手上是 CM4 eMMC 版USB Boot 不是可选项而是必选项。型号芯片USB Boot 支持进入方式工具版本要求Pi 4BBCM2711支持空 EEPROM 或 jumper常规 rpibootCM4 eMMCBCM2711必须nRPIBOOT 接地常规 rpibootPi 5BCM2712支持特定条件较新版本 rpibootPi 3BBCM2837有限支持需配置部分支持3. 硬件准备一根线、一个跳线别买错3.1 USB 线材的坑数据线不等于充电线这是我最想强调的一点。很多人随手抓一根 Type-C 线就上结果电脑死活识别不到设备折腾半天以为是软件问题其实是线材只有充电功能、没有数据线芯。市面上大量便宜的 Type-C 线是充电专用线内部只有 VBUS 和 GND 两根线D 和 D- 根本没接这种线插上去只能供电数据传输完全没戏。判断方法很简单拿这根线去连手机和电脑看电脑能不能识别到手机存储或者传输文件。如果只能充电不能传数据那这根线就不能用于 rpiboot。我建议专门备一根质量靠谱的、明确标注支持数据传输的 Type-C 线别混用。另外Pi 4 和 Pi 5 的 USB-C 口有个历史遗留问题早期 Pi 4 的 USB-C 口设计有缺陷某些带 e-mark 芯片的 Type-C 线比如某些笔记本的原装线会导致树莓派无法正常供电或识别。虽然后来官方改进了但如果你用的是早期批次的 Pi 4遇到识别问题可以换一根简单的线试试比如树莓派官方电源附带的线或者普通的 USB-A 转 Type-C 线。3.2 进入 USB Boot 模式的硬件条件不同型号进入 rpiboot 模式的条件不一样这是实操中最容易卡住的地方。Pi 4B的情况如果 SPI EEPROM 是空的比如全新板子或者 EEPROM 被擦除上电后芯片会自动进入 USB Boot 模式不需要任何额外操作。但如果 EEPROM 里已经有 bootloader就需要人为干预。方法是在上电前把GPIO 的某个特定引脚短接到 GND具体引脚随固件版本有变化常见的是把 nRPIBOOT 拉低强制芯片进入 USB Boot。CM4 eMMC 版最明确板子上有一个nRPIBOOT 跳线也叫 J2 或者类似的标注用跳线帽把它短接然后上电芯片就进入 USB Boot 模式。刷完系统后记得把跳线帽拔掉否则每次上电都进 USB Boot系统起不来。Pi 5相对新进入方式我实测下来是需要确保 EEPROM 里的 bootloader 配置允许 USB 启动或者用特定的按键组合。具体操作建议查官方最新的 bootloader 配置文档因为 Pi 5 的固件更新比较频繁我这里给的方法可能随版本变化。提示进入 USB Boot 模式后树莓派的 HDMI 是没有输出的屏幕全黑是正常的不要以为板子坏了。判断是否进入成功的唯一标准是电脑端能不能识别到设备。3.3 供电问题别用电脑 USB 口给整板供电刷机时树莓派是通过 USB 线从电脑取电的但电脑 USB 口的供电能力有限标准 USB 3.0 是 900mAUSB 2.0 只有 500mA。Pi 4 和 Pi 5 满载功耗不低如果只靠电脑 USB 口供电可能出现供电不足导致刷机中途失败的情况。我的做法是刷机时给树莓派单独接官方电源USB 数据线只负责传数据。这样供电稳定刷机过程不会因为掉电中断。特别是刷大镜像比如完整的桌面版系统有好几个 GB中途掉电会导致写入不完整板子起来后各种奇怪问题。4. 软件端实操从装工具到写入镜像的完整链路4.1 安装 rpiboot 工具rpiboot 是官方开源的工具源码在 GitHub 上各平台都有对应的安装方式。Linux推荐 Ubuntu/Debian下最省事直接用包管理器或者从源码编译# 从源码编译安装 git clone --depth1 https://github.com/raspberrypi/usbboot cd usbboot make sudo make install编译依赖libusb-1.0-0-dev如果报错找不到头文件先装依赖sudo apt-get install libusb-1.0-0-devWindows下官方提供了预编译的rpiboot.exe从 usbboot 仓库的 release 页面下载即可。但 Windows 上有个坑需要先安装USB 驱动否则工具识别不到设备。官方仓库里带了一个driver目录里面有用 inf 文件需要手动在设备管理器里给 BCM2711 Boot 设备指定驱动。这一步在 Windows 10/11 上可能会遇到驱动签名问题需要临时禁用驱动签名强制或者用测试签名模式。macOS下可以用 Homebrew 装或者从源码编译。macOS 的坑在于系统对 USB 设备的权限管理比较严可能需要用sudo运行 rpiboot。4.2 识别设备与推送固件工具装好后把树莓派置于 USB Boot 模式用 USB 线连到电脑然后运行sudo rpiboot如果一切正常你会看到类似这样的输出Waiting for BCM2711/BCM2712 device... Found device, sending bootcode...然后电脑上会多出一个磁盘设备。Linux 下用lsblk能看到Windows 下在此电脑里会多一个盘符macOS 下用diskutil list能看到。如果卡在 Waiting for device... 不动说明电脑没识别到处于 BootROM 状态的树莓派。这时候要排查线材是否是数据线、树莓派是否真的进入了 USB Boot 模式、驱动是否装好。4.3 用镜像工具写入系统设备识别出来后写入镜像就和操作普通 U 盘一样了。官方推荐用Raspberry Pi Imager它内置了系统镜像列表选好系统和目标设备点写入就行。命令行党可以用dd# 先确认设备名千万别写错写错会覆盖你电脑的硬盘 lsblk # 假设识别到的设备是 /dev/sda sudo dd if2024-03-15-raspios-bookworm-arm64.img of/dev/sda bs4M statusprogress convfsync注意dd的of参数一定要确认清楚写错设备名会直接覆盖你电脑上的硬盘数据这个错误我见过不止一个人犯。用 Raspberry Pi Imager 这类图形工具会安全很多它会自动过滤掉系统盘。写入完成后如果是 CM4 eMMC 版本记得拔掉 nRPIBOOT 跳线帽然后断电重启系统就会从 eMMC 启动了。4.4 批量刷机的流水线思路如果你要刷多块板子可以写个简单的脚本把流程串起来。核心思路是每块板子进入 USB Boot 模式后rpiboot 推固件、识别设备、dd 写入、然后换下一块。Linux 下可以用udev规则监听设备插入事件自动触发写入脚本。不过批量刷机有个现实问题rpiboot 一次只能处理一个设备因为它是通过 USB Device 模式通信的同一时刻只能有一个设备处于 BootROM 状态。所以批量刷机本质上是串行的一块一块来。想并行的话得用多台电脑或者多个 USB 控制器成本上不划算。我的经验是单块板子从进入模式到写完镜像大概 3 到 8 分钟取决于镜像大小和 USB 速度刷十块板子就是半小时到一小时可以接受。5. 那些让我抓狂的报错与排查过程5.1 Waiting for device 永远等不到这是最高频的问题。我遇到过一次排查了整整一个下午最后发现是线材问题。完整的排查链路是这样的第一步确认线材。换一根明确能传数据的线最好是用手机连电脑能识别存储的那种线。这一步能解决 60% 的问题。第二步确认树莓派是否真的进入了 USB Boot 模式。Pi 4 如果 EEPROM 里有 bootloader光上电是不会进 USB Boot 的必须短接 nRPIBOOT 引脚。我一开始不知道这点以为插上就行结果等半天没反应。后来查了官方文档才知道要短接。第三步确认驱动。Windows 下如果设备管理器里出现带黄色感叹号的 BCM2711 Boot 设备说明驱动没装好。需要手动指定 usbboot 仓库里带的 inf 驱动文件。第四步确认权限。Linux 和 macOS 下普通用户可能没权限访问 USB 设备需要sudo运行 rpiboot或者配置 udev 规则。5.2 设备识别了但写入失败有时候 rpiboot 成功推了固件电脑也识别到盘了但写入镜像到一半报错。这种情况我遇到过两次原因不同。一次是供电不足。当时我用的是电脑前置 USB 口供电能力弱写到一半树莓派掉电重启写入中断。换成后置 USB 口 单独接电源后解决。另一次是镜像文件本身损坏。下载的镜像在传输过程中出了错校验和不匹配。解决办法是下载后先校验 SHA256sha256sum 2024-03-15-raspios-bookworm-arm64.img # 和官网公布的校验值对比5.3 Pi 5 上的特殊问题Pi 5 因为芯片新rpiboot 的支持是后来才加上的。我第一次用旧版 rpiboot 怼 Pi 5工具直接报 Unsupported device。更新到最新版 rpiboot 后解决。另外 Pi 5 的 bootloader 配置和 Pi 4 不一样如果 EEPROM 里的配置禁用了 USB 启动需要先用 SD 卡启动一次用rpi-eeprom-config工具修改配置把 USB 启动打开。# 在 Pi 5 上查看当前 bootloader 配置 sudo rpi-eeprom-config # 编辑配置确保 BOOT_ORDER 里包含 USB 启动选项 sudo rpi-eeprom-config --editBOOT_ORDER是一个十六进制数每一位代表一个启动设备的优先级。比如0xf461表示先试 SD 卡1、再试 USB4、再试网络6、最后试 eMMCf。具体编码规则查官方文档改错了会导致板子起不来改之前建议先备份。5.4 写入完成后系统起不来刷完镜像拔掉跳线上电结果 HDMI 黑屏或者卡在彩虹屏。这种情况通常是几个原因一是镜像和设备不匹配。比如给 Pi 5 刷了 Pi 4 的镜像或者给 64 位板子刷了 32 位镜像虽然大部分情况兼容但某些版本会有问题。二是eMMC 版本没拔跳线。CM4 eMMC 版如果 nRPIBOOT 跳线还短接着上电后芯片又进入 USB Boot 模式当然起不来。三是镜像写入不完整。前面说的供电问题或者 dd 没加convfsync导致数据没完全落盘。重新刷一遍确保写入过程稳定。6. 几个让流程更顺手的经验技巧6.1 给 rpiboot 配个 udev 规则免 sudoLinux 下每次都要sudo rpiboot挺烦的可以加一条 udev 规则让普通用户也能访问设备。在/etc/udev/rules.d/下建一个规则文件# /etc/udev/rules.d/99-rpiboot.rules SUBSYSTEMusb, ATTR{idVendor}0a5c, MODE06660a5c是 Broadcom 的 USB Vendor ID。加完规则后重新加载sudo udevadm control --reload-rules sudo udevadm trigger之后普通用户就能直接跑 rpiboot 了。不过要注意不同芯片的 Vendor ID 可能不同Pi 5 的 BCM2712 可能用的是别的 ID需要先用lsusb确认。6.2 用 Raspberry Pi Imager 的自定义镜像功能Raspberry Pi Imager 除了内置的官方系统还支持写入自定义镜像文件。点选择操作系统→使用自定义镜像选你下载的 img 文件就行。它比 dd 安全的地方在于会自动过滤掉系统盘不会让你误操作覆盖电脑硬盘。而且写入完成后会自动校验比 dd 省心。6.3 保留一份救砖专用的最小镜像我习惯在电脑上常备一份最小化的 Raspberry Pi OS Lite 镜像几百 MB专门用来救砖。当板子出问题、需要快速验证硬件是否正常时刷这个最小镜像最快几分钟就能写完起来后能进系统就说明硬件没问题再慢慢折腾大镜像。6.4 记录每块板子的 EEPROM 配置如果你有多块树莓派建议给每块板子的 bootloader 配置做个记录。因为 EEPROM 配置会影响启动行为改了之后如果忘了改回来下次刷机会遇到莫名其妙的启动问题。我一般会在板子背面贴个小标签写上 EEPROM 版本和 BOOT_ORDER 配置省得每次都要上电查。7. 关于 USB Boot 适用边界的几点个人判断USB Boot 这套流程不是万能的有些场景它并不合适。比如你只有一块树莓派、一年刷一次系统那搭这套流程的时间成本远高于直接拔卡。它的价值在批量、高频、免拆装的场景下才能体现出来。另外USB Boot 依赖芯片的 BootROM 行为这意味着它受固件版本影响很大。官方每次更新 bootloader进入 USB Boot 的条件、支持的设备类型都可能变。我踩过的坑里有一半是因为固件版本和工具版本不匹配。所以养成习惯刷机前先确认 rpiboot 工具是最新版板子的 EEPROM 固件也是较新版本能省掉很多莫名其妙的识别问题。最后说个我自己的体会这套流程搭好之后我给 Pi 集群刷系统的效率提升了不止一倍。以前拔卡插卡、等识别、写镜像、插回去一套下来十几分钟现在板子不用动USB 线一插rpiboot 一跑镜像一写完事。尤其是板子装在机架里、卡槽根本够不着的时候USB Boot 几乎是唯一可行的方案。如果你也在折腾多块树莓派强烈建议把这套流程跑通一次后面会感谢自己。
返回列表