使用 yocto 创建分区镜像

如果您需要为设备创建SD卡、闪存或HDD上的多个分区,可以使用OpenEmbedded Image Creator Wic,它能为您生成具有正确分区的镜像。

如何生成分区镜像

wic 命令用于从现有的 OpenEmbedded/Yocto 构建产物生成分区镜像,该命令位于 poky/scripts/ 目录。镜像生成是由包含在 Openembedded Kickstart 文件(通常以 .wks 为扩展名) 中的分区命令驱动的。通过使用 wic 命令对特定的构建产物进行处理,可以生成可直接写入介质并在特定系统上使用的镜像或镜像集。

Note

当前版本的 wic 仅支持基本的 kickstart 命令: partition(简称part)和 bootloader。未来可能会有更多功能的支持。

要生成Wic格式的镜像,您需要修改 machine.conf 文件,通常可以按照以下步骤进行:

  • IMAGE_FSTYPES变量需包含 wic,具体配置方式: IMAGES_FSTYPES += "wic"

  • WKS_FILE变量指定需使用的 wks 文件。wks 文件必须位于 wic 目录或 poky/scripts/lib/wic/canned-wks/ 目录中,具体配置方式: WKS_FILE = "wks_file_name"

openEuler 使用实例,创建sd卡启动的香橙派镜像,如下:

  • bsp/meta-openeuler-bsp/conf/machine/orangepi4-lts.conf

  • bsp/meta-openeuler-bsp/conf/machine/include/rockchip-wic.inc

  • bsp/meta-openeuler-bsp/wic/sdimage-opi.wks

wic 命令使用

以下是常用的一些 wic 命令使用参数:

### 帮助命令
$ wic --help
$ wic help rm   ### rm可替换为其它需要查看的命令

### 列出已存在的的 wks 文件
$ wic list images
### 查看 beaglebone-yocto.wks 的帮助信息
$ wic list beaglebone-yocto help

### 列出 wic 镜像所有分区
$ wic ls tmp/deploy/images/qemux86/core-image-minimal-qemux86.wic
### 列出分区1的内容
$ wic ls tmp/deploy/images/qemux86/core-image-minimal-qemux86.wic:1

wic 创建镜像的两种模式

1、raw 模式

调用 wic 命令进行使用,需指定使用的 wks 文件、文件系统目录、bootimg 所在目录、内核所在目录等。以 orangepi4-lts 构建为例:

$ wic create sdimage-opi -o wic-test \
--rootfs-dir tmp/work/orangepi4_lts-openeuler-linux/openeuler-image-tiny/1.0-r0/rootfs \
--bootimg-dir tmp/deploy/images/orangepi4-lts \
--kernel-dir tmp/deploy/images/orangepi4-lts \
--native-sysroot tmp/work/orangepi4_lts-openeuler-linux/openeuler-image-tiny/1.0-r0/recipe-sysroot-native
INFO: Creating image(s)...

INFO: The new image(s) can be found here:
  wic-test/sdimage-opi-202401040309-sda.direct

The following build artifacts were used to create the image(s):
  ROOTFS_DIR:                   /home/openeuler/orange-ok3399-dir/tmp/work/orangepi4_lts-openeuler-linux/openeuler-image-tiny/1.0-r0/rootfs
  BOOTIMG_DIR:                  tmp/deploy/images/orangepi4-lts/
  KERNEL_DIR:                   tmp/deploy/images/orangepi4-lts/
  NATIVE_SYSROOT:               tmp/work/orangepi4_lts-openeuler-linux/openeuler-image-tiny/1.0-r0/recipe-sysroot-native/

INFO: The image(s) were created using OE kickstart file:
  /usr1/openeuler/src/yocto-meta-openeuler/bsp/meta-openeuler-bsp/wic/sdimage-opi.wks

检查输出日志,确认在 wic-test/ 目录中生成了新的分区镜像。

Note

  • –native-sysroot 参数指定使用 wic 所依赖的工具路径,如果主机环境已存在需要的工具,可任意指定一个 recipe-sysroot-native 目录路径,这里指定为 openeuler-image-tiny 的 recipe-sysroot-native 目录;如果主机不存在,则需要构建 wic-tools 配方,并指定 wic-tools 的 recipe-sysroot-native 目录路径为 –native-sysroot 路径;

  • wks 文件也可以使用绝对路径。

2、cooked 模式

此模式基于已使用Yocto构建的镜像,并需在Yocto的构建目录下执行相关命令。具体操作如下:

$ bitbake wic-tools
$ wic create wks_file -e IMAGE_NAME

Note

如果使用IMAGE_FSTYPES已经包含了 wic,则会自动生成 wic 格式的镜像,不需要手动调用执行上述命令。

自动生成 extlinux.conf

要生成 extlinux.conf 文件,您需要配置相关参数。您可以通过参考 uboot-extlinux-config.bbclass 文件来获取详细的配置说明。此类允许您生成用于U-Boot引导的 extlinux.conf 文件,并将其部署到DEPLOY_DIR_IMAGE目录中。

烧录方法

生成的Wic格式镜像可以使用 dd 或 bmaptool 命令进行烧录。以下是一些示例命令:

$ sudo dd if=mkefidisk-201804191017-sda.direct of=/dev/sdX
$ sudo bmaptool --no-bmap copy mkefidisk-201804191017-sda.direct /dev/sdX

参考文献

1、yocto 文档

2、kickstart官方文档: