当前位置: 首页 > news >正文

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 文件)定义分区结构,并使用底层工具(如 partedmkfs.ext4dd 等)构建磁盘镜像。最终可生成 .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 类:执行具体的 mkfsddmount 等操作,填充分区内容
  • native 工具依赖:依赖 dosfstools-nativee2fsprogs-nativebmap-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-partitionrootfsempty
--ondisk指定挂载设备,如 mmcblk0
--fstype文件系统类型,如 vfatext4btrfs
--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.gzwic.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工具创建分区镜像
记得三连,标为原始粉丝,感谢大神支持。


http://www.xdnf.cn/news/155791.html

相关文章:

  • 毕业项目-基于java的入侵检测与防御系统
  • 字节 AI 原生 IDE Trae 发布 v1.3.0,新增 MCP 支持
  • 使用MyBatis注解方式的完整示例,涵盖CRUD、动态SQL、分页、事务管理等场景,并附详细注释和对比表格
  • Java爬虫入门:从网页抓取到数据提取(正则表达式篇)
  • 单例设计模式之懒汉式以及线程安全问题
  • 【计算机视觉】CV项目实战- 深度解析TorchVision_Maskrcnn:基于PyTorch的实例分割实战指南
  • 从“拼凑”到“构建”:大语言模型系统设计指南!
  • 【Vue】Vue3项目创建
  • 美团Java后端二面面经!
  • 【数论分块】数论分块算法模板及真题
  • # 家庭网络IPv6地址的一些知识
  • 思科路由器重分发(静态路由+OSPF动态路由+RIP动态路由)
  • 基于MTF的1D-2D-CNN-BiLSTM-Attention时序图像多模态融合的故障分类识别(Matlab完整源码和数据),适合研究学习,附模型研究报告
  • Leetcode刷题 由浅入深之哈希法——454. 四数相加Ⅱ
  • Logi Options+ 的 Flow:端口信息
  • 驱动开发(1)|鲁班猫rk356x内核编译,及helloworld驱动程序编译
  • 微信小程序核心技术栈
  • ORACLE数据库备份入门:第四部分:2-备份场景举例
  • 计算机视觉——对比YOLOv12、YOLOv11、和基于Darknet的YOLOv7的微调对比
  • MyBatis 官方子项目详细说明及表格总结
  • JavaScript基础知识合集笔记1——数据类型
  • TDengine 中的压缩设计
  • 毕业项目-Web入侵检测系统
  • 关于TCP三次握手和四次挥手的疑点
  • 游戏状态管理:用Pygame实现场景切换与暂停功能
  • Unity-Shader详解-其一
  • MySQL多查询条件下深度分页性能优化技巧及示例总结
  • Pytorch(无CPU搭建)+Jupyter
  • Unity-Shader详解-其二
  • 【WLAN】华为无线AC双机热备负载分担—双链路热备份