1. 为什么我要折腾USB Boot这件事
手里攒了好几张树莓派的TF卡,容量从8GB到64GB不等,用久了总有一两张会莫名其妙掉盘、读写变慢,甚至直接变砖。每次系统崩了就得把卡拔下来插到读卡器里重新烧录,来来回回折腾得人很烦。后来我注意到树莓派其实支持直接从USB设备启动,也就是说可以把系统装到U盘或者移动硬盘上,彻底摆脱TF卡这个短板。但问题来了:如果手上只有一块裸盘或者一块已经装过其他系统的USB存储设备,怎么把系统镜像写进去?总不能每次都拆机拔盘吧。
这就是Pi USB Boot这个思路的价值所在——通过USB线把树莓派和电脑连起来,让树莓派进入一种特殊的启动模式,电脑端识别到一个块设备,然后像写U盘一样直接把镜像刷进去。整个过程不需要拆机,不需要读卡器,甚至不需要树莓派已经有一个可启动的系统。核心依赖的是树莓派芯片内置的USB设备控制器和博通SoC的rpiboot协议,配合libusb在电脑端完成通信。对于经常批量部署树莓派、做嵌入式开发、或者单纯想把系统跑在SSD上提升IO性能的人来说,这套流程一旦跑通,效率提升非常明显。
这篇文章我会从原理、工具选型、实操步骤、参数计算、常见报错排查几个角度,把整个USB Boot刷写流程拆开讲清楚。适合手里有树莓派4B、5、CM4、Zero 2 W等支持USB启动的型号,想摆脱TF卡瓶颈、或者需要批量刷写系统的朋友。我会尽量用实际踩过的坑来说明每个步骤为什么这么做,而不是照本宣科念文档。
2. USB Boot的整体设计与核心思路拆解
2.1 树莓派启动顺序与USB Boot的介入时机
树莓派的启动流程和普通PC不太一样。以树莓派4B为例,上电后首先运行的是SoC内部的一小段BootROM代码,然后根据OTP(一次性可编程存储器)里的启动模式配置,依次尝试从不同设备加载bootloader。默认顺序大致是:SPI EEPROM里的bootloader → SD卡 → USB设备 → 网络启动。这里的关键在于,如果SPI EEPROM里的bootloader被配置为优先从USB启动,或者SD卡不存在,那么芯片就会去枚举USB端口上的存储设备。
而rpiboot模式是一种更底层的机制。当你把树莓派的USB OTG口(对于4B是USB-C供电口,对于CM4是USB slave口)连接到电脑时,如果芯片没有找到可启动的bootloader,它会进入一个USB设备模式,对外表现为一个特定的USB设备ID。电脑端的rpiboot工具通过libusb识别到这个设备,然后向树莓派发送一段小的second stage bootloader,这段代码运行起来之后,树莓派就会把自身的存储接口(比如eMMC、SD卡槽、或者USB控制器)通过USB Mass Storage协议暴露给电脑。此时电脑上会多出一个块设备,你就可以用dd或者Raspberry Pi Imager直接写镜像了。
这个设计的巧妙之处在于:它不依赖树莓派上已经有一个可运行的系统,也不需要网络,纯粹靠USB线完成“裸机”级别的存储访问。对于CM4这种板载eMMC的型号,这是官方推荐的刷写方式;对于普通4B/5,也可以用来刷写USB启动盘。
2.2 为什么选rpiboot而不是读卡器
有人可能会问:直接把TF卡拔下来插读卡器不是更简单吗?对于单次操作确实如此,但在以下几种场景里,rpiboot方案优势明显:
- 板载eMMC的CM4/CM5:eMMC是焊在板子上的,根本没有卡可拔,必须用rpiboot。
- 批量部署:一次连接多块板子,脚本化刷写,不需要反复插拔存储介质。
- USB启动盘调试:你想测试某个U盘或SSD能否作为启动盘,用rpiboot可以直接把镜像写进去,然后让树莓派从它启动,省去拆装。
- TF卡槽损坏:有些板子的卡槽物理损坏,但USB口还能用,rpiboot是唯一救砖途径。
从工具链角度看,rpiboot是树莓派官方usbboot仓库里的核心工具,跨平台支持Linux、macOS、Windows。它依赖libusb做底层USB通信,编译出来就是一个命令行程序。相比第三方工具,官方维护的版本对新型号支持最及时,比如树莓派5和CM5的USB启动协议有细微变化,用旧版工具可能会识别失败。
2.3 存储介质选择与性能考量
既然要USB Boot,存储介质的选择直接决定最终体验。我实测过几种方案:
| 介质类型 | 顺序读写 | 随机4K | 适用场景 | 注意事项 |
|---|---|---|---|---|
| TF卡 (A2) | 90/45 MB/s | 3-5 MB/s | 临时测试 | 长期运行易掉盘 |
| USB 3.0 U盘 | 150/80 MB/s | 5-8 MB/s | 轻量服务 | 主控发热降速 |
| SATA SSD转USB | 400/350 MB/s | 20-30 MB/s | 数据库/容器 | 需独立供电 |
| NVMe SSD转USB | 900/800 MB/s | 40-60 MB/s | 高IO负载 | 供电要求高,可能需带电源Hub |
从表格能看出来,随机4K性能才是树莓派系统流畅度的关键。TF卡的随机读写往往只有个位数MB/s,开个浏览器都卡;而SSD转USB能到20MB/s以上,体验天差地别。但要注意,树莓派4B的USB 3.0口理论带宽5Gbps,实际受限于SoC的PCIe通道,NVMe转USB可能跑不满,而且供电不足会导致掉盘。我一般推荐SATA SSD + USB 3.0硬盘盒的组合,性价比和稳定性最平衡。
3. 核心细节解析与实操前的关键准备
3.1 硬件兼容性核对清单
不是所有树莓派都支持rpiboot USB刷写。动手之前先对照下表确认:
| 型号 | USB Boot支持 | rpiboot刷写 | 备注 |
|---|---|---|---|
| Pi 4B | 是 | 是 | 需USB-C口连接电脑 |
| Pi 5 | 是 | 是 | 需修改bootloader配置 |
| CM4 | 是 | 是 | 板载eMMC必用 |
| CM5 | 是 | 是 | 工具需更新到最新 |
| Zero 2 W | 有限 | 否 | 仅支持USB启动,不支持rpiboot刷写 |
| Pi 3B+ | 是 | 否 | 需先有SD卡配置 |
注意:树莓派5的USB Boot默认可能未启用,需要先在EEPROM里把启动顺序改为USB优先,或者按住BOOT按钮上电进入rpiboot模式。具体操作后面会讲。
另外,电脑端的USB口也有讲究。USB 3.0口通常兼容性更好,但某些老主板的USB 3.0控制器对libusb支持不佳,识别不到设备。如果遇到问题,换到USB 2.0口试试,虽然速度慢但稳定。对于CM4,需要一块CM4 IO Board或者带USB slave口的底板,并且要把底板上的nRPIBOOT跳线或按钮正确设置。
3.2 软件工具链的安装与版本选择
电脑端需要两个核心工具:rpiboot和Raspberry Pi Imager。前者负责让树莓派进入存储暴露模式,后者负责写镜像。当然你也可以用dd命令,但Imager对新手更友好,而且自带镜像下载和校验。
安装rpiboot最省事的方式是从官方usbboot仓库编译。以Ubuntu为例:
sudo apt update sudo apt install -y git libusb-1.0-0-dev pkg-config build-essential git clone --depth=1 https://github.com/raspberrypi/usbboot cd usbboot make编译完成后会生成rpiboot可执行文件。macOS用户可以用Homebrew装libusb后同样编译,Windows用户则可以直接下载预编译的rpiboot.exe,但需要手动安装WinUSB驱动(用Zadig工具把树莓派的USB设备绑定到WinUSB)。
Raspberry Pi Imager从官网下载对应平台版本即可,安装后打开,选择“Use custom”加载你下载好的镜像文件。
实操心得:usbboot仓库的master分支更新很频繁,建议每次使用前
git pull一下,尤其是用CM5或Pi 5的时候,旧版本可能不识别新芯片的USB ID。
3.3 镜像选择与启动配置的预修改
刷写之前,最好先想清楚要刷什么系统。官方Raspberry Pi OS、Ubuntu Server、LibreELEC、Home Assistant OS都支持USB启动。但有一个关键点:bootloader的启动顺序。如果你希望树莓派以后默认从USB启动,需要在刷写完成后,进入系统修改EEPROM配置,或者直接在Imager的高级选项里设置。
对于树莓派4B/5,可以在Imager里按Ctrl+Shift+X打开高级菜单,勾选“Enable USB boot”之类的选项(不同版本措辞略有差异)。但更彻底的做法是刷完系统后,在终端执行:
sudo rpi-eeprom-config --edit把BOOT_ORDER改成0xf41(表示先USB后SD),保存重启。这样以后即使插着TF卡,也会优先从USB设备启动。
对于CM4,bootloader在SPI Flash里,需要用rpiboot配合recovery目录下的boot.conf来配置。具体是在usbboot仓库的recovery目录里编辑boot.conf,设置BOOT_ORDER=0xf14,然后运行rpiboot -d recovery来更新bootloader。
4. 完整实操流程与核心环节实现
4.1 进入rpiboot模式并让电脑识别设备
这一步是整个流程的入口,也是最容易卡住的地方。不同型号操作方式不同:
- 树莓派4B:断开电源,把USB-C线插到电脑上(注意是靠近HDMI的那个USB-C口,不是电源口——4B只有一个USB-C,既是电源也是OTG)。然后按住板子上的BOOT按钮(如果有的话,4B没有独立BOOT按钮,需要短接GPIO 4和GND,或者直接上电时让SD卡槽为空)。实际上4B进入rpiboot的条件是:没有可启动的SD卡或SPI bootloader损坏,此时上电就会自动进入USB设备模式。
- 树莓派5:按住BOOT按钮(位于USB-C口旁边)不放,然后插USB-C线到电脑,等2秒松开。此时板子上的绿灯会常亮或闪烁,表示进入rpiboot。
- CM4:把底板上的
nRPIBOOT跳线短接,或者按住BOOT按钮,然后上电。CM4的USB slave口通常在底板边缘,是一个Micro USB或USB-C口。
连接好后,在电脑终端运行:
sudo ./rpiboot如果一切正常,你会看到类似输出:
RPIBOOT: 2024-01-15T10:30:00 Loading embedded: bootcode.bin ...然后电脑上会多出一个块设备,Linux下通常是/dev/sdX,macOS下是/dev/diskX,Windows下是新的盘符。用lsblk或diskutil list确认一下。
注意:如果
rpiboot报“No device found”,先检查USB线是不是数据线(有些线只能充电),再检查是否真的进入了rpiboot模式(树莓派5的BOOT按钮要按够时间),最后检查电脑的USB口和驱动。
4.2 用Raspberry Pi Imager写入镜像
设备识别出来后,打开Raspberry Pi Imager。点击“Choose Device”选择你的树莓派型号,然后“Choose OS”选镜像,或者“Use custom”加载本地.img文件。接着“Choose Storage”里应该能看到刚才暴露出来的USB设备,通常显示为“Raspberry Pi USB Boot”或者类似名称。
点击“Write”,Imager会先校验镜像,然后写入,最后做一次读校验。整个过程根据镜像大小和USB速度,可能从几分钟到十几分钟不等。写入完成后,Imager会提示成功,此时树莓派上的存储设备会自动断开,电脑上的盘符消失。
如果你更喜欢命令行,可以用dd:
sudo dd if=2024-03-15-raspios-bookworm-arm64.img of=/dev/sdX bs=4M status=progress conv=fsync其中/dev/sdX要替换成实际的设备名,千万别写错,否则可能覆盖电脑硬盘。bs=4M是块大小,conv=fsync确保数据完全落盘再退出。
实操心得:Imager的校验功能很实用,尤其是用便宜U盘的时候,能提前发现坏块。但Imager对某些非官方镜像的兼容性一般,如果写入失败,换
dd往往能成。
4.3 首次启动与USB启动顺序固化
镜像写完,拔掉USB线,给树莓派接上电源(如果是4B/5,直接插原来的电源口;CM4则通过底板供电)。第一次启动会进行分区扩展和初始化,可能需要几分钟,期间屏幕可能黑屏或闪烁,正常现象。
启动进入系统后,第一件事是确认系统确实跑在USB设备上:
lsblk看看根分区/挂载在哪个设备上。如果是/dev/sda1或/dev/nvme0n1p1,说明成功了。
接下来固化启动顺序。对于4B/5:
sudo rpi-eeprom-config --edit找到BOOT_ORDER行,改成0xf41。这个值的含义是:先尝试USB(4),再尝试SD(1),最后是网络(f)。保存退出后重启,以后就会优先从USB启动。
对于CM4,需要在usbboot的recovery目录里修改boot.conf,然后重新运行rpiboot -d recovery来更新SPI Flash里的bootloader。具体boot.conf内容示例:
[all] BOOT_ORDER=0xf14 USB_MSD_PWR_OFF_TIME=00xf14表示先USB后eMMC。改完保存,让CM4进入rpiboot模式,执行sudo ./rpiboot -d recovery,等待更新完成即可。
4.4 多设备批量刷写的脚本化思路
如果你要一次刷十几块CM4,手动操作太慢。可以写一个简单的bash脚本,循环检测设备并刷写:
#!/bin/bash IMAGE="raspios.img" for i in $(seq 1 10); do echo "请连接第 $i 块板子,进入rpiboot模式后按回车" read sudo ./rpiboot -d recovery & sleep 5 DEV=$(lsblk -ndo NAME,SIZE | grep -E 'sd[b-z]' | head -1 | awk '{print $1}') if [ -n "$DEV" ]; then sudo dd if=$IMAGE of=/dev/$DEV bs=4M status=progress conv=fsync echo "第 $i 块完成" else echo "未识别到设备,跳过" fi done这个脚本只是示意,实际用的时候要加更多错误处理和设备确认,避免写错盘。但思路就是:rpiboot负责暴露设备,dd负责写,循环起来就能批量。
5. 常见问题与排查技巧实录
5.1 rpiboot识别失败的五种原因
这是最高频的问题。我整理了一个速查表:
| 现象 | 可能原因 | 排查方法 |
|---|---|---|
| 运行rpiboot无输出 | USB线是充电线 | 换一根确认能传数据的线 |
| 报“No device found” | 未进入rpiboot模式 | 检查BOOT按钮/跳线,重新上电 |
| 识别到设备但很快断开 | 供电不足 | 换USB口,或用带电源的Hub |
| Windows下无盘符 | 驱动未绑定 | 用Zadig把设备绑到WinUSB |
| macOS下报权限错误 | 未用sudo | 加sudo运行,或配置udev规则 |
独家技巧:Linux下可以用
lsusb看设备是否出现。树莓派的USB ID通常是0a5c:2711(CM4)或2e8a:000c(Pi 5)。如果lsusb能看到但rpiboot找不到,多半是libusb版本问题,试试sudo apt install --reinstall libusb-1.0-0。
5.2 写入后无法启动的排查路径
镜像写完了,但树莓派启动黑屏或反复重启。按以下顺序排查:
- 确认BOOT_ORDER:如果SPI里的bootloader还是默认从SD启动,而你又没插SD卡,它可能不会自动切到USB。需要先用SD卡启动一次,改EEPROM配置。
- 检查分区表:有些镜像写入后分区表是MBR,但树莓派5的bootloader对GPT支持更好。用
fdisk -l看看。 - 电源问题:USB SSD启动时峰值电流可能超过树莓派电源适配器能力,导致掉电重启。换5V 3A以上的电源,或者给SSD独立供电。
- 镜像不兼容:某些为x86编译的镜像不能用在ARM上,确认下载的是
arm64或armhf版本。
我遇到过最诡异的一次是:镜像写入成功,但启动时卡在彩虹屏。后来发现是USB硬盘盒的桥接芯片(JMicron JMS578)和树莓派4B的USB控制器有兼容性问题,换了个ASMedia芯片的盒子就好了。所以硬盘盒主控也是变量,推荐ASMedia或Realtek方案。
5.3 性能调优与长期运行建议
系统跑起来之后,还可以做一些优化让USB启动更稳定:
- 关闭USB自动挂起:在
/boot/firmware/cmdline.txt里加usbcore.autosuspend=-1,防止空闲时USB设备被挂起导致掉盘。 - 调整I/O调度器:对于SSD,把
/sys/block/sda/queue/scheduler改成none或mq-deadline,减少不必要的寻道。 - 启用TRIM:如果SSD支持,在
/etc/fstab里加discard挂载选项,延长寿命。 - 监控温度:USB硬盘盒长时间读写会发热,加个散热片或者小风扇,避免过热降速。
我个人经验:树莓派5的USB 3.0口供电比4B强不少,但如果你用NVMe转USB,最好还是选带外接供电的硬盘盒。我试过直接插,跑压力测试十分钟就掉盘了。
5.4 关于“efi usb device boot failed”的联想
最近有读者提到在别的设备上看到“efi usb device boot failed”的报错,虽然这和树莓派的rpiboot不是同一套机制,但底层逻辑有相通之处:都是固件在尝试从USB设备加载引导程序时失败。常见原因包括USB设备没有正确的引导分区、固件不支持该USB控制器、或者设备枚举超时。在树莓派场景下,如果你把USB盘插到别的电脑上想引导,也可能遇到类似提示,这时候要检查盘上是否有/boot分区以及start4.elf等文件。不过树莓派不走UEFI,所以这个报错更多是x86设备的问题,这里就不展开了。
6. 一些收尾的实操体会
这套USB Boot流程我前后在4B、5、CM4上都跑过,最深的体会是:线材和供电比想象中重要得多。一开始我用一根随手拿的USB-C线,rpiboot死活识别不到,换了根带E-Marker的线就秒连。还有一次CM4刷写到一半失败,查了半天发现是底板的Micro USB口虚焊。所以硬件层面的排查永远优先于软件。
另外,rpiboot工具本身虽然稳定,但版本更新带来的行为变化要注意。比如某个版本开始,Pi 5需要先更新SPI里的bootloader才能支持USB MSD模式,旧版工具直接刷会报错。养成每次git pull的习惯,能省很多事。
最后分享一个小技巧:如果你经常刷写,可以把rpiboot和常用镜像放在一个U盘里,做成一个便携工具包,走到哪台电脑上都能直接编译运行。对于做嵌入式部署的团队,这比每人装一遍环境高效得多。