向Raspberry Pi CM3的eMMC烧录Yocto镜像的分区疑问
关于Raspberry Pi CM3 eMMC镜像制作的分区疑问解答
嘿,这个问题问到点子上了——必须要为boot分区单独预留空间,而且你当前的命令流程存在不少误区,我来给你梳理清楚:
为什么必须单独划分boot分区?
Raspberry Pi的启动机制依赖独立的FAT32格式boot分区,这个分区要存放启动固件(bootcode.bin)、设备树文件(.dtb)、内核镜像(zImage/Image)以及启动配置文件(config.txt)等关键内容。如果把这些文件和rootfs混在一起,CM3根本无法识别启动。
你当前命令的问题分析
- 你用
dd bs=512 count=2880创建的镜像只有1.44MB,空间远远不够装下boot文件和rootfs - 直接对整个镜像做
mkfs.msdos格式化,没有创建分区表,eMMC无法被Pi的固件识别 - 直接复制所有部署目录的内容,会把rootfs的文件也丢到这个单一分区里,完全不符合Pi的启动要求
正确的镜像制作步骤
1. 创建足够大的空镜像文件
建议至少创建4GB的镜像(可根据你的rootfs大小调整):
dd if=/dev/zero of=raspberry-cm3.img bs=1G count=4
2. 给镜像创建分区表和分区
用fdisk工具给镜像划分两个分区:
fdisk raspberry-cm3.img
执行以下操作:
- 输入
n创建新分区,选择p主分区,分区号1,起始扇区默认,结束扇区输入+256M(给boot分区分配256MB,足够用) - 输入
t修改分区类型,选择分区1,输入c设置为W95 FAT32 (LBA)类型 - 输入
n创建第二个分区,选择p主分区,分区号2,起始扇区默认,结束扇区默认(占用剩余所有空间作为rootfs) - 输入
w保存分区表并退出
3. 挂载分区并写入Yocto生成的内容
先把镜像关联到loop设备,方便操作分区:
losetup -P /dev/loop0 raspberry-cm3.img
处理boot分区
# 格式化boot分区为FAT32 mkfs.vfat /dev/loop0p1 # 创建挂载点 mkdir -p boot_mount # 挂载分区 mount /dev/loop0p1 boot_mount # 复制Yocto生成的boot相关文件(注意是部署目录里的boot子目录内容,不是所有文件) cp -r tmp/deploy/images/raspberrypi-cm3/boot/* boot_mount/ # 卸载分区 umount boot_mount
处理rootfs分区
# 格式化rootfs分区为ext4 mkfs.ext4 /dev/loop0p2 # 创建挂载点 mkdir -p rootfs_mount # 挂载分区 mount /dev/loop0p2 rootfs_mount # 写入Yocto生成的rootfs镜像(替换成你实际的rootfs文件名) dd if=tmp/deploy/images/raspberrypi-cm3/raspberrypi-cm3-core-image-base.rootfs.ext4 of=/dev/loop0p2 # 如果你的rootfs是tar包格式,用下面的命令解压: # tar -xf tmp/deploy/images/raspberrypi-cm3/raspberrypi-cm3-core-image-base.rootfs.tar.gz -C rootfs_mount/ # 卸载分区 umount rootfs_mount # 解除loop设备关联 losetup -d /dev/loop0
4. 烧录到eMMC
现在你就可以用dd或者balenaEtcher等工具把制作好的raspberry-cm3.img烧写到CM3的eMMC里了。
额外省心技巧:让Yocto直接生成可烧录镜像
其实Yocto本身支持直接生成带分区的可烧录镜像,不需要手动操作。在你的Yocto项目的conf/local.conf里添加:
IMAGE_FSTYPES = "ext4 wic.gz"
重新bitbake你的镜像后,会在tmp/deploy/images/raspberrypi-cm3/目录下生成.wic.gz格式的镜像,直接解压后就能烧录,完全避免手动分区的麻烦。
内容的提问来源于stack exchange,提问作者Asma Maaroufi




