Yocto构建Raspberry Pi CM3镜像后,如何烧写至eMMC?
嘿,作为刚入门Yocto的新手能搞定Raspberry Pi CM3的自定义镜像已经超棒了!我来帮你理清这些文件的作用,以及怎么把镜像烧写到eMMC里,不用慌~
先搞懂你生成的这些文件都是啥
先给你逐个拆解下这些文件的用途,搞懂了就不会乱:
rpi-basic-image-raspberrypi-cm3.rootfs.tar.bz2:根文件系统的压缩包,里面是整个系统的所有文件,解压后可以放到root分区里rpi-basic-image-raspberrypi-cm3.rootfs.ext3:ext3格式的根文件系统镜像文件,是已经打包好的分区镜像,直接就能写到root分区image-kernelversion-machine.bin:Linux内核镜像(一般是zImage或者Image格式),CM3启动时需要加载它rpi-basic-image-raspberrypi-cm3.rootfs.rpi-sdimg:这是最省心的完整镜像!Yocto已经帮你把boot分区、root分区,还有所有启动必需的文件都打包好了,直接烧写就能用bootcode.bin:树莓派的第一阶段启动固件,CM3从eMMC启动时必须要有它.dtb/.dtbo:设备树文件,用来描述CM3的硬件配置(比如GPIO、外设等),启动时内核需要加载对应的设备树
eMMC的分区要求
Raspberry Pi CM3的eMMC只需要两个主分区,非常简单:
- Boot分区:必须是FAT32格式,大小建议至少64MB(我一般设128MB足够用),用来存放启动固件、内核、设备树和启动配置文件
- Rootfs分区:推荐用ext4格式(ext3也可以,但ext4性能更好),剩下的eMMC空间都给这个分区,用来存放根文件系统
两种烧写方案(新手推荐第一种)
方案1:用完整镜像直接烧写(最省心,新手首选)
这个方案不需要你手动分区或复制文件,Yocto已经帮你搞定一切了:
- 把CM3的eMMC挂载到电脑上:可以用CM3IO开发板,或者买个USB转eMMC的适配器,让电脑把CM3识别成一个U盘
- 确认eMMC的设备节点:打开终端运行
lsblk,找到对应的设备(比如/dev/sdX,注意别把电脑自己的硬盘当成eMMC!可以通过容量和挂载点判断) - 烧写镜像:用
dd命令把完整镜像写到eMMC,替换成你的设备节点:sudo dd if=rpi-basic-image-raspberrypi-cm3.rootfs.rpi-sdimg of=/dev/sdX bs=4M status=progress - 等待烧写完成,然后运行
sudo sync确保所有数据都写入eMMC,再拔掉设备就行
方案2:手动分区烧写(适合需要自定义分区大小或内容的情况)
如果你想自己控制分区大小或者修改boot分区里的配置,可以用这个方法:
- 同样先把eMMC挂载到电脑,找到设备节点
/dev/sdX - 用
fdisk工具分区:
然后按以下步骤操作:sudo fdisk /dev/sdX- 输入
o:创建新的DOS分区表 - 输入
n:创建第一个分区(boot分区),选择主分区(p),起始扇区默认,大小输入+128M - 输入
t:修改分区类型,再输入c把分区类型改成W95 FAT32 (LBA) - 输入
n:创建第二个分区(root分区),选择主分区(p),起始扇区默认,大小用剩下的全部空间 - 输入
w:保存分区表并退出
- 输入
- 格式化分区:
# 格式化boot分区为FAT32 sudo mkfs.vfat /dev/sdX1 # 格式化root分区为ext4(用ext3的话换成mkfs.ext3) sudo mkfs.ext4 /dev/sdX2 - 挂载分区:
mkdir -p /tmp/boot /tmp/root sudo mount /dev/sdX1 /tmp/boot sudo mount /dev/sdX2 /tmp/root - 复制boot分区需要的文件:
把这些文件都复制到/tmp/boot里:bootcode.bin- 内核镜像(建议重命名为
kernel.img,树莓派默认识别这个名字):sudo cp image-kernelversion-machine.bin /tmp/boot/kernel.img - 对应的设备树文件(比如
bcm2837-rpi-cm3.dtb) - 还要注意复制
start.elf、fixup.dat、config.txt和cmdline.txt(这些文件Yocto应该也生成了,一般在你的镜像输出目录里,找不到的话可以从rpi-sdimg里提取) config.txt里至少要指定设备树,比如dtb=bcm2837-rpi-cm3.dtb;cmdline.txt里要指定根分区:root=/dev/mmcblk0p2 rootfstype=ext4 rw
- 部署根文件系统:二选一即可
- 用ext3镜像直接写入:
sudo dd if=rpi-basic-image-raspberrypi-cm3.rootfs.ext3 of=/dev/sdX2 bs=4M status=progress - 或者解压tar包:
sudo tar -xjf rpi-basic-image-raspberrypi-cm3.rootfs.tar.bz2 -C /tmp/root/
- 用ext3镜像直接写入:
- 卸载分区并同步数据:
sudo umount /tmp/boot /tmp/root sudo sync
文件选择总结
- 如果用完整镜像方案:只需要
rpi-basic-image-raspberrypi-cm3.rootfs.rpi-sdimg这一个文件,其他都不用管 - 如果用手动分区方案:
- Boot分区需要:
bootcode.bin、内核镜像、对应的.dtb、start.elf、fixup.dat、config.txt、cmdline.txt - Root分区需要:
rpi-basic-image-raspberrypi-cm3.rootfs.ext3或者rpi-basic-image-raspberrypi-cm3.rootfs.tar.bz2(二选一)
- Boot分区需要:
注意事项
- 一定要确认eMMC的设备节点,别写错成电脑的硬盘,不然会丢失数据!
- 烧写前如果eMMC里有重要数据,记得先备份
- 烧写完成后一定要运行
sync,确保数据完全写入再拔掉设备
内容的提问来源于stack exchange,提问作者Asma Maaroufi
相关产品推荐
相关产品推荐

