yocto构建镜像分析(基于STM32MP1157)

yocto构建自定义镜像

本文将基于STM32MP157开发板分析yocto构建镜像的流程,并刨析开发板自带的自定义镜像菜谱是如何设计的,最后尝试编写自己的自定义镜像。

yocto创建镜像流程

OpenEmbedded核心和其他Yocto项目层包括一些样例镜像。这些镜像提供用于典型Linux操作系统栈的根文件系统配置。所有核心镜像菜谱都继承自core-image类,core-image类自己从image类继承。所有镜像设置IMAGE_INSTALL变量来指定什么包被安装进根文件系统。IMAGE_INSTALL可以指定单个包,也可以指定包组(package group)。core-image类提供的默认值安装packagegroup-core-boot和packagegroup-base-extended这两个包组。默认创建启动到控制台的工作的根文件系统。
如果要增加包到根文件系统,可以在conf/local.conf中添=追加IMAGE_INSTALL_append变量,eg:

IMAGE_INSTALL_append+=" demo"

注意双引号中间前面要加空格。
IMAGE_INSTALL_append_pn-<image> : 可以向特定镜像追加包/包组
CORE_IMAGE_EXTRA_INSTALL: core-image类定义的变量,可以使用该变量增加包到所有继承自core-image的镜像。

定制镜像菜谱必须继承image或者core-image类。

inherit core-image

下面介绍一些和创建镜像相关的变量

PACKAGE_CLASSES :在构建环境的conf/local.conf中控制使用什么包管理系统用于构建镜像
IMAGE_FSTYPES:设置一个或者多个由类提供的文件系统类型, tar ext4…
IMAGE_LINGUAS :添加语言支持到根文件系统或者镜像中
IMAGE_ROOTFS_SIZE:以KB定义被创建的根文件系统镜像大小。
IMAGE_ROOTFS_ALIGNMENT:以KB定义根文件系统镜像的对齐。
IMAGE_ROOTFS_EXTRA_SPACE:以KB定义增加额外可用空间到根文件系统镜像。
IMAGE_OVERHEAD_FACTOR:这个变量指定用于根文件系统镜像的乘数。
EXTRA_USERS_PARMS:用于增加和修改组、用户和密码等命令。
IMAGE_PREPROCESS_COMMAND:在实际根文件系统镜像被创建前进一步地定制根文件系统
ROOTFS_POSTPROCESS_COMMAND:在其已经被构建系统创建后进一步地定制根文件系统

分析STM32MP1开发板bootfs vendorfs userfs生成过程

STM32MP1 yocto里面创建了除rootfs外的三个镜像,bootfs vendorfs 和userfs。
在这里插入图片描述
三个bb文件均引用了st-image-partitions.inc,下面先从它开始分析:
st-image-partitions.inc

inherit core-image

# Disable flashlayout generation for the partition image as this is supposed
# to be done only for complete image
ENABLE_FLASHLAYOUT_CONFIG = "0"

# Disable image license summary generation for the partition image as this is
# supposed to be done only for complete image
ENABLE_IMAGE_LICENSE_SUMMARY = "0"

# Remove WIC image generation for the partition image
IMAGE_FSTYPES_remove = "${WKS_IMAGE_FSTYPES}"

# Append DISTRO to image name even if we're not using ST distro setting
# Mandatory to ease flashlayout file configuration
IMAGE_BASENAME_append = "${@'' if 'openstlinuxcommon' in OVERRIDES.split(':') else '-${DISTRO}'}"

# Reset image feature
IMAGE_FEATURE = ""

# Reset PACKAGE_INSTALL to avoid getting installed packages added in machine through IMAGE_INSTALL_append:
PACKAGE_INSTALL = ""

# Reset LINGUAS_INSTALL to avoid getting installed any locale-base package
LINGUAS_INSTALL = ""
IMAGE_LINGUAS = ""

# Reset LDCONFIG to avoid runing ldconfig on image.
LDCONFIGDEPEND = ""

# Remove from IMAGE_PREPROCESS_COMMAND useless buildinfo
IMAGE_PREPROCESS_COMMAND_remove = "buildinfo;"
# Remove from IMAGE_PREPROCESS_COMMAND the prelink_image as it could be run after
# we clean rootfs folder leading to cp error if '/etc/' folder is missing:
#   cp: cannot create regular file
#   ‘/local/YOCTO/build/tmp-glibc/work/stm32mp1-openstlinux_weston-linux-gnueabi/st-image-userfs/1.0-r0/rootfs/etc/prelink.conf’:
#   No such file or directory
IMAGE_PREPROCESS_COMMAND_remove = "prelink_image;"

IMAGE_PREPROCESS_COMMAND_append = "reformat_rootfs;"

# Cleanup rootfs newly created
reformat_rootfs() {
    if [ -d ${IMAGE_ROOTFS}${IMAGE_PARTITION_MOUNTPOINT} ]; then
        bbnote "Mountpoint ${IMAGE_PARTITION_MOUNTPOINT} found in ${IMAGE_ROOTFS}"
        bbnote ">>> Remove all files and folder except ${IMAGE_PARTITION_MOUNTPOINT}"
        TARGETROOTFS=${IMAGE_ROOTFS}${IMAGE_PARTITION_MOUNTPOINT}
        while [ "${TARGETROOTFS}" != "${IMAGE_ROOTFS}" ]
        do
            find $(dirname ${TARGETROOTFS})/ -mindepth 1 ! -regex "^${TARGETROOTFS}\(/.*\)?" -delete
            TARGETROOTFS=$(dirname ${TARGETROOTFS})
        done
        bbnote ">>> Move ${IMAGE_PARTITION_MOUNTPOINT} contents to ${IMAGE_ROOTFS}"
        mv ${IMAGE_ROOTFS}${IMAGE_PARTITION_MOUNTPOINT}/* ${IMAGE_ROOTFS}/
        bbnote ">>> Remove remaining ${IMAGE_PARTITION_MOUNTPOINT} folder"
        # Remove empty boot folder
        TARGETROOTFS=${IMAGE_ROOTFS}${IMAGE_PARTITION_MOUNTPOINT}
        while [ "${TARGETROOTFS}" != "${IMAGE_ROOTFS}" ]
        do
            bbnote ">>> Delete ${TARGETROOTFS}"
            rm -rf ${TARGETROOTFS}/
            TARGETROOTFS=$(dirname ${TARGETROOTFS})
        done
    else
        bbwarn "${IMAGE_PARTITION_MOUNTPOINT} folder not available in rootfs folder, no reformat done..."
    fi
}

通过 yocto创建镜像流程介绍的部分变量定义大部分内容都比较易懂,主要关注一下reformat_rootfs函数,部分变量可以通过如下命令查看

 bitbake fs-mp1a-qt -e | grep XXX

IMAGE_ROOTFS: tmp-glibc/work/fsmp1a-ostl-linux-gnueabi/fs-mp1a-qt/1.0-r0/rootfs
IMAGE_PARTITION_MOUNTPOINT_pn-st-image-bootfs=“/boot”
IMAGE_PARTITION_MOUNTPOINT_pn-st-image-userfs=“/usr/local”
IMAGE_PARTITION_MOUNTPOINT_pn-st-image-vendorfs=“/vendor”

创建自己的自定义镜像

TODO

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值