☰
树莓派USB Boot实战:用rpiboot摆脱TF卡,刷写U盘/SSD系统
2026/10/7 7:45:00 网站建设 项目流程

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/s3-5 MB/s临时测试长期运行易掉盘
USB 3.0 U盘150/80 MB/s5-8 MB/s轻量服务主控发热降速
SATA SSD转USB400/350 MB/s20-30 MB/s数据库/容器需独立供电
NVMe SSD转USB900/800 MB/s40-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=0

0xf14表示先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 写入后无法启动的排查路径

镜像写完了,但树莓派启动黑屏或反复重启。按以下顺序排查:

  1. 确认BOOT_ORDER:如果SPI里的bootloader还是默认从SD启动,而你又没插SD卡,它可能不会自动切到USB。需要先用SD卡启动一次,改EEPROM配置。
  2. 检查分区表:有些镜像写入后分区表是MBR,但树莓派5的bootloader对GPT支持更好。用fdisk -l看看。
  3. 电源问题:USB SSD启动时峰值电流可能超过树莓派电源适配器能力,导致掉电重启。换5V 3A以上的电源,或者给SSD独立供电。
  4. 镜像不兼容:某些为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盘里,做成一个便携工具包,走到哪台电脑上都能直接编译运行。对于做嵌入式部署的团队,这比每人装一遍环境高效得多。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询