Yocto项目实战教程-第8章-树莓派启动定制镜像-8.4小节-使用Wic工具创建分区镜像
🔍
B站相应的视频教程:
📌 Yocto项目实战教程-第8章-树莓派启动定制镜像-8.4小节-使用Wic工具创建分区镜像
记得三连,标为原始粉丝,感谢大神支持。
下周一发售
一、引言
在嵌入式系统的构建过程中,镜像的格式和结构往往直接决定了系统的启动行为、数据分区策略以及更新机制。Yocto 项目作为主流的嵌入式 Linux 构建系统,其默认的镜像生成机制在很多场景下已经非常完善,但在需要对分区结构进行灵活定制时,wic
工具则显得尤为关键。
Wic(完整名称为 Image Creator
)是 Yocto 项目中的一个镜像打包工具,能够根据预设模板灵活地生成具有多分区结构的镜像文件,包括可引导分区、根文件系统分区、数据分区甚至空分区等。在系统部署、测试和量产中都具有极高的实用价值。
二、Wic 工具概述
2.1 Wic 是什么?
Wic 是 Yocto 项目中 oe-core
提供的一个 Python 工具,位于路径:
poky/scripts/wic
它基于 Kickstart 脚本(.wks
文件)定义分区结构,并使用底层工具(如 parted
、mkfs.ext4
、dd
等)构建磁盘镜像。最终可生成 .wic
、.sdimg
、.img
等格式的镜像文件,适用于 SD 卡、eMMC、U 盘或虚拟机磁盘。
2.2 Wic 的定位
与传统的 .ext4
、.cpio
、.tar.gz
镜像不同,Wic 的核心优势在于支持多分区布局和启动配置的精细控制,尤其适用于:
- 自定义启动分区(如 U-Boot 分区)
- 多根文件系统(rootfs A/B)更新策略
- 增加数据分区、日志分区、配置分区
- 特定格式的磁盘结构,如 GPT/MBR
三、Wic 架构原理
3.1 Wic 的执行流程
Wic 的工作流程大致如下:
解析 WKS 文件 → 创建空磁盘 → 分区分配 → 拷贝内容 → 创建文件系统 → 填充文件系统 → 镜像输出
其核心组件包括:
- WKS 文件解析器:提取分区定义、文件系统类型、大小、label、bootloader 等信息
- Partition 实例:内部使用 Python 类构建一个“分区计划表”
- Image Creator 类:执行具体的
mkfs
、dd
、mount
等操作,填充分区内容 - native 工具依赖:依赖
dosfstools-native
、e2fsprogs-native
、bmap-tools-native
等 BitBake native 包支持
3.2 Wic 的镜像结构
一个典型的 .wic
镜像结构示例如下:
/dev/sda1 → FAT32 启动分区,挂载 boot/
/dev/sda2 → ext4 根文件系统,挂载 /
/dev/sda3 → ext4 数据分区,挂载 /data
支持 MBR 或 GPT 分区表,并可使用 --no-table
创建原始分区镜像。
四、Kickstart 文件详解(.wks)
WKS(Yocto Kickstart)文件是 Wic 的核心配置文件,用于定义分区方案。其语法部分兼容 Fedora Kickstart,但也包含 Yocto 的扩展格式。
4.1 示例:标准三分区方案
part --source bootimg-partition --ondisk mmcblk0 --label boot --active --fstype=vfat --size=64
part --source rootfs --ondisk mmcblk0 --label rootfs --fstype=ext4 --size=1024
part --source empty --ondisk mmcblk0 --label data --fstype=ext4 --size=512
bootloader --ptable msdos --append="console=ttymxc0,115200"
4.2 参数说明
参数 | 含义 |
---|---|
--source | 来源:可为 bootimg-partition 、rootfs 、empty 等 |
--ondisk | 指定挂载设备,如 mmcblk0 |
--fstype | 文件系统类型,如 vfat 、ext4 、btrfs |
--label | 分区标签,便于系统识别 |
--size | 分区大小,单位为 MiB |
--active | 是否设为启动分区 |
bootloader | 指定启动加载器,如 grub、syslinux、u-boot |
--ptable | 分区表类型:msdos 或 gpt |
--align | 对齐大小(可选),通常为 4MB 或 1MiB |
五、Wic 使用方法
5.1 生成 Wic 镜像
Yocto 通常默认通过 wic
类型生成 .wic
镜像文件:
bitbake core-image-minimal
镜像路径为:
tmp/deploy/images/<machine>/core-image-minimal-<machine>.wic
也可以手动执行:
wic create myimage.wks --image-name=core-image-minimal -o ./out
常见参数:
--image-name=
:指定构建的菜谱镜像--wks=
:指定 Kickstart 文件--outdir=
:输出目录--no-fstab-update
:防止自动更新 rootfs 中的 fstab 文件
5.2 烧录到 SD 卡
sudo dd if=core-image-minimal.wic of=/dev/sdX bs=4M status=progress && sync
或者使用 bmaptool
:
bmaptool copy core-image-minimal.wic /dev/sdX
六、Wic 与 BitBake 集成实践
6.1 启用 Wic 输出格式
在 local.conf
或 machine 文件中添加:
IMAGE_FSTYPES += "wic.bz2"
也可以添加 wic.gz
、wic.xz
等压缩格式,方便发布或 OTA。
6.2 自定义 WKS 文件路径
在 BSP 层或 meta-custom
层中添加:
meta-custom/wic/my-custom.wks
并通过 local.conf
指定:
WKS_FILE = "my-custom.wks"
或者使用 override:
WKS_FILE_imx8mp-evk = "imx8mp-custom.wks"
七、Wic 分区高级特性
7.1 使用 raw 分区
part --source rawcopy --sourceparams="file=bootloader.bin" --ondisk mmcblk0 --no-table --align=4
可用于烧写 bootloader、签名区域或 TrustZone 信息。
7.2 使用 --use-uuid
与 fstab 配置
在 .wks
文件中添加:
--use-uuid
结合系统 fstab
中使用 UUID=
进行挂载,增强稳定性。
7.3 多 rootfs 支持(A/B 分区)
part --source rootfs --label rootfs_a --ondisk mmcblk0 --fstype=ext4 --size=1024
part --source rootfs --label rootfs_b --ondisk mmcblk0 --fstype=ext4 --size=1024
适用于双系统更新机制。
八、调试与常见问题
8.1 分区挂载失败
检查:
- 分区 label 是否正确
- WKS 文件中是否指定了正确的 label 与 fstype
- fstab 中是否存在挂载信息
8.2 镜像大小异常
建议使用 --align
统一分区起始地址(如4MiB)避免误差,或查看 .wks
文件是否设置不合理。
8.3 使用 bmaptool 失败
需确认是否生成 .bmap
文件:
ls core-image-minimal.wic.bmap
如果未生成,可在 IMAGE_CLASSES
中添加:
IMAGE_CLASSES += "image_types_wic"
九、典型项目实战案例:NXP i.MX8MP EVK
NXP 的 meta-imx
层默认使用 .sdcard
和 .wic.bz2
作为镜像输出格式。在 imx-boot
启动后,rootfs 来自 .wic
分区镜像。可通过以下命令生成对应镜像:
bitbake imx-image-full
产出文件路径:
tmp/deploy/images/imx8mp-evk/imx-image-full-imx8mp-evk.wic.bz2
自定义分区方案:
part --source bootimg-partition --label boot --fstype=vfat --size=64
part --source rootfs --label rootfs --fstype=ext4 --size=1024
part --source empty --label data --fstype=ext4 --size=512
十、总结与建议
Wic 工具为 Yocto 项目提供了灵活而强大的分区镜像创建能力。相比单一的根文件系统格式,它更适合复杂系统的定制部署需求,尤其在产品发布、升级管理、A/B 系统、数据分区隔离等场景中有广泛应用。
建议在项目初期就定义好 WKS 文件,并使用版本管理工具跟踪,保持分区结构的清晰可控。同时配合 bmaptool
进行高效烧录,是 Yocto 项目构建完整系统镜像不可或缺的重要工具。
🔍
B站相应的视频教程:
📌 Yocto项目实战教程-第8章-树莓派启动定制镜像-8.4小节-使用Wic工具创建分区镜像
记得三连,标为原始粉丝,感谢大神支持。