1. 项目概述:为树莓派计算模块刷写系统镜像
如果你手头有一块树莓派计算模块,无论是用于工业控制、嵌入式网关还是定制化硬件产品,第一步往往就是给它“装系统”。与普通的树莓派单板计算机不同,计算模块没有SD卡槽,它的“硬盘”是一颗焊接在板载的eMMC存储器。这意味着你不能像给树莓派4B那样,直接把镜像烧录到SD卡里插上就用。这个过程,我们称之为“刷写”或“烧录”。
我经手过从初代Compute Module到最新的CM5,也遇到过各种稀奇古怪的报错。这篇文章就是把我这些年给不同型号计算模块刷写系统镜像的完整流程、核心原理以及那些官方文档里没写的“坑”和技巧,系统地梳理一遍。无论你是第一次接触计算模块的开发者,还是需要批量部署的工程师,这篇指南都能帮你绕过弯路,高效、稳定地完成系统部署。
2. 核心思路与硬件准备解析
给计算模块刷写系统,核心思路是让它暂时“忘记”自己的eMMC,转而从一个临时的USB设备启动一个极简的引导程序。这个引导程序会扮演一个“USB大容量存储设备”的角色,将计算模块的eMMC暴露给你的电脑,此时你的电脑会把它识别为一个普通的U盘或移动硬盘。接下来,你就可以像往U盘里拷贝文件一样,使用标准的镜像烧录工具(如dd或Raspberry Pi Imager)将系统镜像写入eMMC。
2.1 硬件清单与选型考量
要完成这个操作,你需要以下几样东西,每一件的选择都有讲究:
计算模块本体:这是你的目标设备。需要特别注意,计算模块有标准版和Lite版之分。标准版内置eMMC,是我们本次操作的对象。Lite版没有eMMC,需要通过SD卡或NVMe接口启动,刷写流程完全不同,不在本文讨论范围内。在购买或确认型号时,务必看清后缀。
对应的IO板:计算模块本身只有金手指接口,必须搭配专用的IO板才能供电和连接外设。不同代际的计算模块需要匹配的IO板:
- Compute Module 1/3/3+:使用通用的Compute Module IO Board。
- Compute Module 4:使用Compute Module 4 IO Board。
- Compute Module 5:使用Compute Module 5 IO Board。 IO板不仅是载体,其上的跳线帽是控制启动模式的关键。切勿混用,物理接口和供电设计都不同,强行插入会损坏设备。
一台主机电脑:用于运行刷写工具和提供镜像文件。它可以是:
- Linux电脑(推荐):树莓派本身(Raspberry Pi 4或5,运行64位Raspberry Pi OS)就是绝佳的主机,兼容性最好。Ubuntu等主流发行版也可。
- macOS电脑:操作稍复杂,需要从源码编译工具。
- Windows 11电脑:有官方安装包,相对方便。 我的经验是,Linux环境(尤其是树莓派本身)是最稳定、问题最少的平台,后续的命令行操作也最为直接。
连接线缆:
- CM4及更早型号的IO板:需要一根Micro USB数据线,连接IO板上的“USB Slave”端口到主机。
- CM5 IO板:需要一根USB-C数据线,同样连接“USB Slave”端口。
- 重要提示:务必使用数据线,而非仅能充电的电源线。很多廉价的USB线内部只有电源引脚,无法传输数据。如果你发现主机无法识别设备,首先应怀疑线缆。
电源:为IO板供电。通常IO板有桶形插座或USB-C电源接口,使用官方推荐规格的电源适配器即可。
注意:很多用户反馈识别失败的问题,根源在于使用了USB集线器。USB协议在枚举设备时对时序要求严格,一些质量不佳或芯片兼容性差的集线器会导致通信失败。最稳妥的做法是,将IO板直接连接到主机电脑的USB端口上,尤其是USB 2.0端口(兼容性通常更好)。
2.2 理解启动模式与跳线设置
这是整个流程中最关键的一步,设置错误会导致计算模块无法进入刷写模式。其原理是通过物理跳线改变计算模块上某个GPIO引脚的电平,告诉芯片:“这次不要从内部的eMMC启动,请等待来自USB的指令。”
- CM4/CM5 IO板:关键跳线是J2 (nRPI_BOOT)。
- 刷写模式:需要插上跳线帽,连接两个针脚。此时
nRPI_BOOT信号被拉低(Enable),禁用了从eMMC启动,迫使芯片进入USB启动等待状态。 - 正常启动模式:拔掉跳线帽。此时
nRPI_BOOT信号被拉高(Disable),芯片会尝试从eMMC启动你刚刚刷入的系统。
- 刷写模式:需要插上跳线帽,连接两个针脚。此时
- CM1/CM3 IO板:关键跳线是J4 (USB SLAVE BOOT ENABLE)。
- 刷写模式:将跳线帽设置在引脚1-2上(标记为
USB BOOT ENABLED)。 - 正常启动模式:将跳线帽设置在引脚2-3上(标记为
USB BOOT DISABLED)。
- 刷写模式:将跳线帽设置在引脚1-2上(标记为
实操心得:在操作前,花一分钟对照IO板丝印图确认跳线位置。很多匆忙中的失败都是跳线设错导致的。完成刷写后,务必记得将跳线改回正常启动模式,否则下次上电它又会傻等着你去刷机。
3. 主机环境配置与rpiboot工具详解
主机电脑需要安装一个名为rpiboot的工具。这个工具的作用是:当计算模块处于USB启动模式并连接主机时,rpiboot会向计算模块发送一个极小的引导程序(第二阶段的bootloader)和固件。计算模块的芯片内置的ROM程序(第一阶段的bootloader)接收到这些数据后,会将其运行起来,这个引导程序随后会将计算模块的eMMC配置成一个USB大容量存储设备。
3.1 Linux主机配置(以树莓派OS为例)
这是最推荐的路径,步骤简洁明了。
安装rpiboot:打开终端,一行命令即可。系统会从仓库中下载并安装预编译好的
rpiboot工具及其依赖。sudo apt update sudo apt install rpiboot -y安装完成后,可以通过
rpiboot --version查看版本号以确认安装成功。连接与上电:用数据线将IO板的USB Slave口连接到树莓派主机的USB口上。然后,再给IO板接通电源。这个顺序有时有影响,先连接数据线可以确保主机能捕获到设备插入的整个枚举过程。
运行rpiboot:在终端中执行:
sudo rpiboot此时终端会挂起,并显示类似
Waiting for BCM2835/6/7/2711...的信息。这表明rpiboot正在等待计算模块连接并进入可引导状态。触发计算模块启动:确保IO板上的跳线已设置为刷写模式。然后,短按一下IO板上的“RUN”或“RESET”按钮(如果有),或者直接给IO板重新上电。这个操作是告诉计算模块:“现在开始启动流程”,由于跳线设置为USB启动,它就会响应主机的
rpiboot工具。识别设备:如果一切顺利,几秒钟后,
rpiboot会输出一系列信息,最后可能显示Loading: mass-storage-gadget...并退出。此时,计算模块的eMMC应该已经作为存储设备挂载到了主机。 你可以通过lsblk命令来查看。你会看到多出来一个块设备,比如/dev/sda或/dev/sdb,其容量正好对应你的计算模块的eMMC大小(例如8GB、16GB、32GB)。lsblk输出示例:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 14.9G 0 disk mmcblk0 179:0 0 29.7G 0 disk ├─mmcblk0p1 179:1 0 256M 0 part /boot └─mmcblk0p2 179:2 0 29.5G 0 part /在这个例子中,
mmcblk0是主机树莓派自己的SD卡,而sda(14.9G) 很可能就是刚刚连接的计算模块eMMC。
重要排查点:如果
rpiboot运行后长时间等待无反应,或提示超时:
- 首先检查跳线设置是否正确。
- 检查USB数据线是否可靠,尝试更换端口或线缆。
- 尝试重新给IO板上电(在
rpiboot运行的情况下)。- 对于CM4,有时需要先按住IO板上的“BOOT”按钮(如果有),再上电,进入一种更底层的恢复模式。
3.2 Windows主机配置
Windows用户可以使用官方提供的安装包,相对省心。
- 下载安装包:前往
rpiboot项目的 GitHub Releases 页面,下载最新的.exe安装程序。 - 以管理员身份运行安装:右键点击安装程序,选择“以管理员身份运行”。安装过程中,Windows可能会弹出“驱动程序安装”的警告窗口,务必选择“始终安装此驱动程序软件”或类似选项。这是安装计算模块USB设备所需驱动关键一步。
- 重启电脑:安装完成后,按照提示重启电脑。这不是可选项,驱动生效需要重启。
- 连接设备并运行:将计算模块(跳线设为刷写模式)通过IO板连接到Windows主机并上电。在开始菜单中找到并运行 “rpiboot - Mass Storage Gadget”。一个命令行窗口会弹出并执行,成功后窗口会自动关闭。此时,你可以在“我的电脑”或“磁盘管理”中看到一个新的可移动磁盘。
Windows常见坑:驱动安装失败是最常见的问题。如果设备管理器中出现带黄色感叹号的“未知设备”,可以尝试手动指定驱动。在设备管理器里右键点击该设备 -> “更新驱动程序” -> “浏览我的电脑以查找驱动程序” -> 指向rpiboot安装目录(通常为C:\Program Files\Raspberry Pi\rpiboot\或类似路径)下的drivers文件夹。
3.3 macOS主机配置
macOS没有预编译的安装包,需要从源码编译,对新手门槛稍高。
安装编译依赖:首先需要安装 Xcode Command Line Tools 和 Homebrew。
xcode-select --install /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" brew install libusb pkg-config克隆并编译rpiboot:
git clone --depth=1 https://github.com/raspberrypi/usbboot cd usbboot make编译成功后,当前目录下会生成
rpiboot可执行文件。运行并连接设备:
- 先运行工具,指定使用64位的大容量存储模式:
sudo ./rpiboot -d mass-storage-gadget64 - 再将计算模块(跳线设为刷写模式)通过IO板连接到Mac并上电。
- 工具识别到设备后,macOS可能会弹窗提示“您插入的磁盘电脑无法读取”。一定要点击“忽略”,不要点击“初始化”。这个弹窗是正常的,因为eMMC目前是空白或未格式化的状态。点击忽略后,磁盘就会出现在“磁盘工具”或
diskutil list命令的列表中。
- 先运行工具,指定使用64位的大容量存储模式:
4. 镜像烧录:工具选择与实操命令
当计算模块的eMMC被成功识别为存储设备(例如/dev/sda)后,烧录镜像就变成了一个标准的磁盘写入操作。你有两个主流选择:图形化的 Raspberry Pi Imager 或命令行的dd工具。
4.1 使用Raspberry Pi Imager(推荐新手)
这是最安全、最不易出错的方法,尤其适合刷写官方系统镜像。
- 启动Imager:在你的主机电脑上打开 Raspberry Pi Imager。
- 选择操作系统:点击“选择操作系统”,你可以从列表中选择一个(如Raspberry Pi OS),或者点击“自定义”选择你已下载好的
.img镜像文件。 - 选择存储设备:点击“选择存储设备”。这里需要非常小心。在列表中找到代表你计算模块eMMC的那个设备,通常可以通过容量来辨别(例如“14.9 GB USB驱动器”)。务必再三确认,选错了会覆盖你主机电脑的硬盘!
- 写入:点击“下一步”,再点击“是”确认覆盖。Imager会自动完成格式化和写入,并会在最后验证写入的数据是否正确。这个过程耗时取决于镜像大小和USB速度。
Imager的优势:除了操作简单,它还能在烧录前对镜像进行一些自定义设置,如预配置Wi-Fi、SSH、主机名、用户名密码等,这对于批量部署或无头(无显示器)启动的设备极其有用。
4.2 使用dd命令(推荐高级用户与自动化)
dd是Linux/macOS下的底层磁盘复制工具,功能强大但需要谨慎使用,因为一旦目标设备指定错误,后果是灾难性的。
基本命令格式如下:
sudo dd if=/path/to/your/image.img of=/dev/sdX bs=4M status=progress conv=fsync让我们拆解这个命令的每个部分及其背后的考量:
if=/path/to/your/image.img:if代表输入文件(input file)。这里替换成你的系统镜像文件的实际路径,例如~/Downloads/raspios_lite_arm64.img。of=/dev/sdX:of代表输出文件(output file)。这是最危险的部分。/dev/sdX必须替换为计算模块eMMC对应的设备标识符,如/dev/sda或/dev/sdb。绝对不要指向你的系统硬盘(如/dev/mmcblk0,/dev/nvme0n1)!使用lsblk命令在插入设备前后对比,确认新增的设备名。bs=4M:块大小(block size)。设置为4兆字节。这个值不是随便定的。设置过小(如默认的512字节)会导致写入速度极慢,因为IO次数太多。设置过大(如100M)可能会超出某些缓冲区限制或造成不必要的内存占用。4M是经过实践检验的、在兼容性和速度之间取得良好平衡的值。status=progress:显示写入进度。这是现代dd版本的一个非常实用的参数,能让你实时看到写入速度和已完成量,避免在漫长的等待中焦虑。conv=fsync:确保数据完全同步到物理存储后再返回。这保证了在命令完成后,所有数据都已切实写入eMMC,而不是还在操作系统的缓存里。
执行过程:输入命令并按回车后,终端会开始显示进度。写入一个完整的Raspberry Pi OS镜像到32GB eMMC,通过USB 2.0接口可能需要20-30分钟,通过USB 3.0接口会快很多。期间请保持设备连接稳定,不要断电或拔线。
写入完成后的验证:dd命令本身没有内置验证。一个简单的验证方法是写入完成后,重新拔插设备(或重新运行sudo rpiboot让主机再次识别),然后使用lsblk查看设备。你应该能看到设备下出现了两个分区(以Raspberry Pi OS为例):
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS sda 8:0 0 29.7G 0 disk ├─sda1 8:1 0 256M 0 part └─sda2 8:2 0 29.5G 0 partsda1是启动分区(FAT32格式),sda2是根文件系统分区(通常是ext4)。你可以手动挂载它们检查内容:
sudo mkdir -p /mnt/cm_boot /mnt/cm_root sudo mount /dev/sda1 /mnt/cm_boot sudo mount /dev/sda2 /mnt/cm_root # 查看文件 ls /mnt/cm_boot/ ls /mnt/cm_root/ # 操作完成后卸载 sudo umount /mnt/cm_boot /mnt/cm_root5. 首次启动与故障排查实录
烧录完成,最激动人心的时刻就是第一次启动。但这往往也是问题最容易暴露的时候。
5.1 启动配置与操作
- 更改跳线:这是必须的一步!将IO板上的跳线从刷写模式改回正常启动模式。
- CM4/CM5:拔掉J2 (
nRPI_BOOT) 上的跳线帽。 - CM1/CM3:将 J4 (
USB SLAVE BOOT ENABLE) 跳线帽从1-2改到2-3。
- CM4/CM5:拔掉J2 (
- 断开USB数据线:拔掉连接主机和IO板USB Slave端口的线。这一步很重要,因为计算模块启动时如果检测到USB Slave连接,可能会干扰正常的启动顺序。
- 上电启动:确保IO板连接了显示器(如果需要)和网络,然后给IO板上电。计算模块现在应该从eMMC上的新系统启动了。你会看到屏幕上开始滚动启动日志,或者绿灯有规律的闪烁。
5.2 常见问题与解决方案
即使严格按照步骤操作,也可能遇到问题。以下是我遇到过的典型情况及其解决方法:
问题一:主机运行rpiboot后无法识别到计算模块eMMC磁盘。
- 可能原因与排查:
- 跳线错误:再次确认跳线设置完全正确,并且接触良好。
- USB线或端口问题:换一根确认可传输数据的USB线,换一个主机USB端口(优先尝试USB 2.0口)。
- 供电不足:IO板电源不稳定可能导致计算模块无法正常工作。使用官方推荐或质量可靠的5V电源。
- 驱动问题(Windows):在设备管理器中检查是否有未识别的设备,尝试重新安装驱动。
- rpiboot版本问题:特别是在Ubuntu 24.04及更早版本中,仓库里的
rpiboot可能有bug。解决方案是从源码重新编译安装(方法同macOS章节)。 - 计算模块硬件问题:极少数情况下,计算模块本身或IO板接触不良。尝试重新插拔计算模块,确保金手指清洁且完全插入卡槽。
问题二:系统刷写成功,但计算模块无法从eMMC启动(无显示、绿灯常亮或不闪)。
- 可能原因与排查:
- 跳线未改回:这是最常犯的错误!请再次确认跳线已设置为“正常启动模式”。
- 镜像文件损坏:重新下载系统镜像,并校验SHA256哈希值,确保文件完整。
- 烧录过程出错:虽然
dd显示完成,但数据可能未完整写入。尝试用Raspberry Pi Imager重新烧录一次,它会进行验证。 - CM3的特殊问题:官方文档提到,少量CM3设备因eMMC与CPU时序问题,可能无法从自动创建的FAT分区启动。解决方案是手动创建启动分区:
- 将计算模块再次进入刷写模式并连接到主机。
- 使用
parted或fdisk对设备(如/dev/sda)重新分区。先删除所有现有分区,然后创建一个起始于4MiB、大小为60MiB的FAT32主分区。
sudo parted /dev/sda (parted) mklabel msdos (parted) mkpart primary fat32 4MiB 64MiB (parted) quit- 格式化该分区:
sudo mkfs.vfat -F32 /dev/sda1- 挂载这个分区,并将官方镜像中启动分区(通常是
.img文件第一个分区)的所有文件拷贝进去。
sudo mount /dev/sda1 /mnt/boot # 假设你已经挂载了官方镜像的启动分区到 /mnt/img_boot sudo cp -r /mnt/img_boot/* /mnt/boot/ sudo umount /mnt/boot - 电源或外围设备问题:断开所有非必要的外设(如USB设备、HAT板),仅连接电源和显示器,看能否启动。
问题三:刷写速度异常缓慢。
- 可能原因:
- USB 2.0接口限制:如果主机或IO板只有USB 2.0,速度上限约35-40MB/s,写入32GB镜像需要较长时间。
- 主机性能或磁盘IO瓶颈:如果主机电脑本身磁盘读写慢或CPU占用高。
dd块大小设置不当:bs参数设置太小。
- 优化建议:使用USB 3.0端口和数据线;确保主机性能充足;
dd命令使用bs=4M或bs=8M。
问题四:在macOS上,rpiboot运行后系统反复提示“磁盘未初始化”。
- 原因与解决:这是正常现象,因为eMMC被呈现为空白磁盘。关键在于点击“忽略”。如果误点了“初始化”,macOS会尝试格式化它,这会破坏刷写模式。如果不小心初始化了,需要重新给计算模块上电(在刷写模式下),并再次运行
sudo ./rpiboot -d mass-storage-gadget64。
5.3 批量刷写与镜像定制建议
如果你需要为几十甚至上百个计算模块刷写系统,手动操作是不可行的。
- 批量刷写:官方推荐使用Raspberry Pi Secure Boot Provisioner。这是一个更专业的工具链,配合网络启动服务器,可以自动化地完成多台设备的系统部署、安全密钥注入等流程,适合生产环境。
- 镜像定制:如果你需要在刷写前对系统镜像进行深度定制(如预装软件、修改配置、裁剪系统),可以使用pi-gen工具。它是用来构建Raspberry Pi OS镜像的官方框架,你可以基于它创建符合自己项目需求的衍生镜像,然后再用本文的方法刷写到计算模块中。
给树莓派计算模块刷写系统,是一个连接软件与硬件、概念与实体的关键操作。整个过程像是一场精密的对话:通过跳线设置发出指令,通过USB通道传输引导程序,最终将完整的操作系统交付给那片沉默的eMMC芯片。我最深刻的体会是,耐心和细致远比技术本身更重要。每一次跳线的确认,每一次设备号的核对,都是对可能发生的数小时调试时间的节省。当你看到计算模块的绿灯开始有节奏地闪烁,屏幕上出现熟悉的启动日志时,那种将抽象代码转化为物理设备生命力的成就感,正是嵌入式开发的魅力所在。