Yocto项目实战:手把手教你为i.MX8MP EVK定制WKS分区表(含imx-boot-container配置详解)
Yocto项目实战i.MX8MP EVK定制WKS分区表与imx-boot-container配置全解析在嵌入式Linux开发领域NXP的i.MX8M Plus处理器因其强大的多媒体处理能力和丰富的外设接口而广受欢迎。作为开发者我们经常需要为特定硬件平台定制系统镜像而Yocto项目提供的WIC工具和WKS脚本正是实现这一目标的关键。本文将深入探讨如何为i.MX8MP EVK开发板定制WKS分区表并详细解析imx-boot-container的配置方法。1. WIC与WKS基础概念解析WICWic Image Creator是Yocto项目中的镜像创建工具它能够根据WKSWic Kickstart脚本的描述将各种系统组件如Bootloader、内核、设备树和根文件系统打包成一个可直接烧录的完整镜像。对于i.MX8MP平台这个镜像通常以.wic后缀结尾可以直接通过dd命令写入SD卡或eMMC存储设备。WKS脚本采用类似Kickstart的语法主要包含以下几个核心部分分区定义使用part命令指定每个分区的挂载点、大小、文件系统类型等属性数据源指定通过--source参数定义分区内容的来源引导加载程序配置使用bootloader命令设置引导相关参数分区表类型指定使用MS-DOSMBR还是GPT分区格式对于i.MX8MP EVK开发板Yocto提供了两个关键的WKS模板文件meta-freescale/wic/imx-imx-boot-bootpart.wks.in meta-freescale/wic/imx-boot-container-bootpart.wks.in这两个文件的区别主要在于Bootloader的处理方式我们将在后续章节详细分析。2. i.MX8MP启动架构与WKS选择策略i.MX8MP的启动过程相比传统ARM处理器更为复杂涉及多个固件组件的协同工作。理解这些组件的加载顺序和相互关系对于正确配置WKS文件至关重要。2.1 i.MX8MP启动流程典型的i.MX8MP启动流程包含以下阶段ROM Code芯片内置的不可修改固件负责初始化基本硬件并加载SPLSPLSecondary Program Loader由U-Boot生成的二级引导程序负责初始化DDR和更复杂的外设ATFARM Trusted FirmwareARM提供的安全固件为系统提供安全启动环境U-Boot Proper完整的引导加载程序负责加载操作系统内核Linux Kernel最终的操作系统内核2.2 WKS文件选择依据选择正确的WKS模板文件取决于以下几个因素U-Boot版本2021.04之后的U-Boot版本支持boot container机制BSP类型使用NXP官方BSP还是Mainline BSPUBOOT_PROVIDES_BOOT_CONTAINER变量这个变量决定了是否使用U-Boot内置的boot container功能在imx-base.inc文件中相关配置如下UBOOT_PROVIDES_BOOT_CONTAINER 0 UBOOT_PROVIDES_BOOT_CONTAINER:imx-boot-container 1如果使用支持boot container的U-Boot版本系统会自动选择imx-boot-container-bootpart.wks.in作为WKS模板。3. 标准WKS文件解析与定制让我们首先分析标准的imx-imx-boot-bootpart.wks.in文件内容# 短描述创建包含启动分区的SD卡镜像 # 长描述为i.MX8M系列创建可直接dd写入SD卡的镜像 # 包含imx-boot文件中的U-Boot及其他二进制文件 # 磁盘布局 # 0 - 8MiB - 72MiB - 72MiB rootfs IMAGE_EXTRA_SPACE(默认10MiB) # imx-boot偏移量为32或33kiB(参考手册) part u-boot --source rawcopy --sourceparamsfileimx-boot \ --ondisk mmcblk --no-table --align ${IMX_BOOT_SEEK} part /boot --source bootimg-partition --ondisk mmcblk \ --fstypevfat --label boot --active --align 8192 --size 64 part / --source rootfs --ondisk mmcblk \ --fstypeext4 --label root --align 8192 bootloader --ptable msdos3.1 关键参数详解u-boot分区--source rawcopy表示直接原始拷贝二进制文件--sourceparamsfileimx-boot指定源文件为imx-boot--no-table该分区不在分区表中显示--align ${IMX_BOOT_SEEK}对齐到32KB边界/boot分区--source bootimg-partition使用bootimg插件处理内核和设备树--fstypevfat使用FAT32文件系统--active标记为活动分区--size 64分区大小为64MB/分区--source rootfs使用构建的根文件系统--fstypeext4使用ext4文件系统bootloader配置--ptable msdos使用MBR分区表3.2 常见定制场景场景1调整分区大小假设我们需要更大的/boot分区来存放多个内核版本可以修改如下part /boot --source bootimg-partition --ondisk mmcblk \ --fstypevfat --label boot --active --align 8192 --size 128场景2添加自定义分区如果需要添加一个专门存放应用数据的分区part /data --ondisk mmcblk --fstypeext4 \ --label data --align 8192 --size 256场景3修改文件系统类型将根文件系统改为btrfs以获得更好的可靠性part / --source rootfs --ondisk mmcblk \ --fstypebtrfs --label root --align 81924. imx-boot-container配置详解对于使用较新U-Boot版本2021.04的系统推荐使用imx-boot-container-bootpart.wks.in模板。这个模板的主要特点是使用了U-Boot直接提供的flash.bin和u-boot.itb文件而不是传统的imx-boot。4.1 文件结构对比让我们比较两个WKS模板的关键差异特性imx-imx-boot-bootpart.wks.inimx-boot-container-bootpart.wks.inU-Boot文件单个imx-boot文件flash.bin u-boot.itb两个文件分区布局imx-boot - /boot - /flash.bin - u-boot.itb - /boot - /对齐要求32KB对齐flash.bin 32KB对齐u-boot.itb 384KB对齐适用场景传统U-Boot配置U-Boot 2021.04 with boot container4.2 关键配置解析imx-boot-container-bootpart.wks.in的典型内容如下part u-boot --source rawcopy --sourceparamsfileflash.bin \ --ondisk mmcblk --no-table --align ${IMX_BOOT_SEEK} part u-boot-itb --source rawcopy --sourceparamsfileu-boot.itb \ --ondisk mmcblk --no-table --align 384 part /boot --source bootimg-partition --ondisk mmcblk \ --fstypevfat --label boot --active --align 8192 --size 64 part / --source rootfs --ondisk mmcblk \ --fstypeext4 --label root --align 8192 bootloader --ptable msdos4.2.1 flash.bin与u-boot.itb的作用flash.bin包含SPL、ATF和可选的OP-TEE组件u-boot.itb包含完整的U-Boot和设备树由U-Boot的binman工具生成4.2.2 对齐参数说明${IMX_BOOT_SEEK}通常为32表示32KB对齐384表示u-boot.itb需要384KB对齐这是由i.MX8MP的ROM Code要求的4.3 启用boot container的配置方法要在Yocto中启用boot container功能需要进行以下配置在local.conf或machine配置文件中设置UBOOT_PROVIDES_BOOT_CONTAINER 1确保使用的U-Boot版本支持此功能2021.04或更新检查imx-boot-container类是否被正确继承MACHINEOVERRIDES . imx-boot-container:5. 高级配置技巧与问题排查5.1 动态分区大小调整在某些情况下我们可能希望根分区自动填充剩余空间可以使用以下语法part / --source rootfs --ondisk mmcblk \ --fstypeext4 --label root --align 8192 --size 1G --extra-space 2G这表示根分区至少有1GB空间但可以额外扩展2GB。5.2 多设备树支持对于需要支持多种硬件变体的场景可以在/boot分区中包含多个设备树文件part /boot --source bootimg-partition --ondisk mmcblk \ --fstypevfat --label boot --active --align 8192 --size 64 \ --extra-space 10M然后在bitbake配置中指定多个设备树KERNEL_DEVICETREE \ freescale/imx8mp-evk.dtb \ freescale/imx8mp-evk-rm67191.dtb \ freescale/imx8mp-evk-it6263-lvds.dtb \ 5.3 常见问题排查问题1镜像烧录后无法启动可能原因及解决方案bootloader未正确安装检查WKS文件中的--no-table参数使用是否正确确认IMX_BOOT_SEEK值设置正确通常为32分区对齐问题确保所有分区都按照硬件要求对齐特别是u-boot.itb需要384KB对齐文件系统损坏使用fsck检查文件系统完整性考虑使用更健壮的文件系统如ext4或btrfs问题2根分区空间不足解决方案增加根分区大小part / --source rootfs --ondisk mmcblk \ --fstypeext4 --label root --align 8192 --size 2G或者启用自动扩展part / --source rootfs --ondisk mmcblk \ --fstypeext4 --label root --align 8192 --size 1G --extra-space 3G问题3boot container组件缺失检查步骤确认UBOOT_PROVIDES_BOOT_CONTAINER设置为1检查U-Boot配方是否支持binman工具验证构建目录中是否生成了flash.bin和u-boot.itb文件6. 实战案例定制i.MX8MP EVK镜像让我们通过一个实际案例演示如何为i.MX8MP EVK开发板定制一个完整的系统镜像。6.1 需求分析假设我们需要构建一个满足以下要求的系统镜像支持安全启动包含OP-TEE较大的/boot分区128MB以存放多个内核版本单独的数据分区/data采用btrfs文件系统根分区自动扩展至4GB使用最新的boot container机制6.2 定制WKS文件基于上述需求我们可以创建如下的WKS文件保存为custom-imx8mp.wks# Custom WKS file for i.MX8MP EVK with OP-TEE support part u-boot --source rawcopy --sourceparamsfileflash.bin \ --ondisk mmcblk --no-table --align ${IMX_BOOT_SEEK} part u-boot-itb --source rawcopy --sourceparamsfileu-boot.itb \ --ondisk mmcblk --no-table --align 384 part /boot --source bootimg-partition --ondisk mmcblk \ --fstypevfat --label boot --active --align 8192 --size 128 part / --source rootfs --ondisk mmcblk \ --fstypeext4 --label root --align 8192 --size 1G --extra-space 3G part /data --ondisk mmcblk --fstypebtrfs \ --label data --align 8192 --size 1G bootloader --ptable msdos6.3 配置Yocto构建在local.conf或machine配置文件中添加以下配置# 启用boot container UBOOT_PROVIDES_BOOT_CONTAINER 1 # 指定自定义WKS文件 WKS_FILE custom-imx8mp.wks # 启用OP-TEE支持 MACHINE_FEATURES optee # 增加镜像额外空间默认为10MB IMAGE_EXTRA_SPACE 64M6.4 构建与测试使用以下命令构建镜像bitbake core-image-minimal构建完成后镜像位于tmp/deploy/images/imx8mp-lpddr4-evk/core-image-minimal-imx8mp-lpddr4-evk.wic可以使用dd命令将镜像写入SD卡进行测试sudo dd ifcore-image-minimal-imx8mp-lpddr4-evk.wic of/dev/sdX bs1M convfsync