OpenEuler CreateImage 核心函数库探秘:lib 目录下的 common-functions 与 img-functions

📅 2026/7/17 12:21:01
OpenEuler CreateImage 核心函数库探秘:lib 目录下的 common-functions 与 img-functions
OpenEuler CreateImage 核心函数库探秘lib 目录下的 common-functions 与 img-functions【免费下载链接】CreateImageThe tool to create Machine Image项目地址: https://gitcode.com/openeuler/CreateImage前往项目官网免费下载https://ar.openeuler.org/ar/想要快速创建高质量的 openEuler 系统镜像吗OpenEuler CreateImage 项目正是为此而生这个强大的机器镜像创建工具通过其核心函数库让镜像构建变得简单高效。本文将深入探索 lib 目录下的两大关键文件——common-functions 与 img-functions揭秘它们如何协同工作帮助您轻松打造定制化的 openEuler 系统镜像。 lib 目录结构概览在 OpenEuler CreateImage 项目中lib/目录存放着所有核心的 Bash 脚本函数库这些函数是整个镜像构建过程的基石lib/ ├── common-functions # 通用构建函数库 ├── die # 错误处理函数 └── img-functions # 镜像处理专用函数 common-functions构建流程的核心引擎common-functions文件包含了镜像构建过程中的通用函数是创建 openEuler 镜像的大脑。让我们看看其中的关键功能构建目录管理函数function mk_build_dir () { TMP_BUILD_DIR$(mktemp -t -d --tmpdir${TMP_DIR:-/tmp} hmi_build.XXXXXXXX) [ $? -eq 0 ] || die Failed to create tmp directory export TMP_BUILD_DIR trap trap_cleanup EXIT echo Building in $TMP_BUILD_DIR export TMP_MOUNT_PATH$TMP_BUILD_DIR/mnt export TMP_HOOKS_PATH$TMP_BUILD_DIR/hooks }这个函数创建临时构建目录为后续的镜像构建提供工作空间。它会自动设置挂载路径和钩子路径确保构建环境的隔离性和安全性。镜像保存与版本控制finish_image函数负责处理最终镜像的保存工作function finish_image () { if [ -f $1 -a ${OVERWRITE_OLD_IMAGE:-0} -eq 0 ]; then old_image${1%.*}-$(date %Y.%m.%d-%H.%M.%S).${1##*.} echo Old image found. Renaming it to $old_image mv $1 $old_image if [ -f $1.md5 ]; then mv $1.md5 $old_image.md5 fi if [ -f $1.sha256 ]; then mv $1.sha256 $old_image.sha256 fi fi mv $OUT_IMAGE_PATH $1 if [ $DIB_CHECKSUM 1 ]; then md5sum $1 $1.md5 sha256sum $1 $1.sha256 fi echo Image file $1 created... }这个函数不仅保存镜像文件还提供了版本控制功能——当发现同名镜像时会自动重命名旧文件并添加时间戳。同时如果启用了校验和功能还会生成 MD5 和 SHA256 校验文件确保镜像的完整性。钩子系统管理run_d函数是钩子系统的核心调度器function run_d () { check_hooks check_break before-$1 ${break_cmd:-bash} if [ -d ${TMP_HOOKS_PATH}/$1.d ]; then if [ -n $2 ]; then $SCRIPT_HOME/dib-run-parts ${TMP_HOOKS_PATH}/$1.d | tee $2 if [[ ${PIPESTATUS[0]} ! 0 ]]; then return 1 fi else $SCRIPT_HOME/dib-run-parts ${TMP_HOOKS_PATH}/$1.d fi fi check_break after-$1 bash }这个函数负责执行特定阶段的钩子脚本支持调试断点和输出重定向为镜像构建提供了灵活的扩展机制。基础系统创建create_base函数是构建 openEuler 系统基础环境的关键function create_base() { mkdir $TMP_BUILD_DIR/mnt export TMP_MOUNT_PATH$TMP_BUILD_DIR/mnt # Copy data in to the root. TARGET_ROOT$TMP_MOUNT_PATH run_d root if [ -z $(ls $TMP_MOUNT_PATH | grep -v ^lostfound\|tmp$) ] ; then # No root element copied in. Note the test above allows # root.d elements to put things in /tmp echo Failed to deploy the root element. exit 1 fi # Configure Image # Setup resolv.conf so we can chroot to install some packages if [ -L $TMP_MOUNT_PATH/etc/resolv.conf ] || [ -f $TMP_MOUNT_PATH/etc/resolv.conf ] ; then sudo mv $TMP_MOUNT_PATH/etc/resolv.conf $TMP_MOUNT_PATH/etc/resolv.conf.ORIG fi # Recreate resolv.conf sudo touch $TMP_MOUNT_PATH/etc/resolv.conf sudo chmod 777 $TMP_MOUNT_PATH/etc/resolv.conf # use system configured resolv.conf if available to support internal proxy resolving if [ -e /etc/resolv.conf ]; then cat /etc/resolv.conf $TMP_MOUNT_PATH/etc/resolv.conf else echo nameserver 8.8.8.8 $TMP_MOUNT_PATH/etc/resolv.conf fi mount_proc_dev_sys }这个函数创建基础文件系统结构配置网络解析并挂载必要的系统目录为后续的软件包安装和配置打下坚实基础。️ img-functions镜像处理与优化img-functions文件专注于镜像的后期处理和优化工作是 openEuler 镜像质量的保证。镜像卸载与清理unmount_image函数确保镜像的安全卸载function unmount_image () { # Calling sync before helps ensure the mount isnt busy when you unmount it. # Previously observing having disk corruption issues; one possibility is # qemu-nbd not flushing dirty pages on disconnect? # https://bugs.launchpad.net/diskimage-builder/bug/1214388 sync # unmount from the chroot # Dont use TMP_MOUNT_PATH here, it might not have been set. unmount_dir $TMP_BUILD_DIR/mnt }通过先调用sync确保数据同步再递归卸载所有挂载点这个函数有效避免了磁盘损坏问题。磁盘空间优化fstrim_image函数使用 fstrim 工具回收未使用的磁盘空间function fstrim_image () { # A race condition can occur when trying to fstrim immediately after # deleting a file resulting in that free space not being reclaimed. # Calling sync before fstrim is a workaround for this behaviour. # https://lists.gnu.org/archive/html/qemu-devel/2014-03/msg02978.html sync # Discard all unused bytes sudo fstrim ${TMP_BUILD_DIR}/mnt }这个优化步骤能显著减小镜像文件大小特别是对于稀疏文件系统。Chroot 环境操作run_in_target函数是在 chroot 环境中执行命令的核心function run_in_target () { cmd$ # -E to preserve http_proxy ORIG_HOME$HOME export HOME/root # Force an empty TMPDIR inside the chroot. There is no need to use an user # defined tmp dir which may not exist in the chroot. # Bug: #1330290 # Force the inclusion of a typical set of dirs in PATH, this is needed for guest # distros that have path elements not in the host PATH. sudo -E chroot $TMP_MOUNT_PATH env -u TMPDIR PATH\$PATH:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin sh -c $cmd export HOME$ORIG_HOME }这个函数巧妙地处理了环境变量和路径问题确保在目标系统中正确执行命令是软件包安装和配置的关键。镜像压缩与格式转换compress_and_save_image函数支持多种镜像格式function compress_and_save_image () { # Recreate our image to throw away unnecessary data test $IMAGE_TYPE ! qcow2 COMPRESS_IMAGE if [ -n $QEMU_IMG_OPTIONS ]; then EXTRA_OPTIONS-o $QEMU_IMG_OPTIONS else EXTRA_OPTIONS fi if [ $IMAGE_TYPE raw ]; then mv $TMP_IMAGE_PATH $1-new elif [ $IMAGE_TYPE vhd ]; then cp $TMP_IMAGE_PATH $1-intermediate vhd-util convert -s 0 -t 1 -i $1-intermediate -o $1-intermediate vhd-util convert -s 1 -t 2 -i $1-intermediate -o $1-new # The previous command creates a .bak file rm $1-intermediate.bak else echo Converting image using qemu-img convert qemu-img convert ${COMPRESS_IMAGE:-c} -f raw -O $IMAGE_TYPE $EXTRA_OPTIONS $TMP_IMAGE_PATH $1-new fi OUT_IMAGE_PATH$1-new finish_image $1 }这个函数支持 raw、qcow2、vhd 等多种镜像格式并能根据需要进行压缩满足不同虚拟化平台的需求。 两大函数库的协同工作OpenEuler CreateImage 的构建流程中common-functions和img-functions紧密协作构建阶段common-functions中的create_base创建基础环境配置阶段img-functions中的run_in_target在 chroot 中安装配置软件优化阶段img-functions中的fstrim_image优化磁盘空间保存阶段common-functions中的finish_image处理最终保存逻辑清理阶段img-functions中的cleanup确保资源正确释放 实战应用创建自定义 openEuler 镜像了解这些核心函数后您可以轻松创建自定义的 openEuler 镜像环境准备使用mk_build_dir创建临时工作空间基础构建调用create_base建立基础系统软件安装通过run_in_target在 chroot 中安装额外软件包系统配置利用钩子系统进行个性化配置镜像优化使用fstrim_image减小镜像体积格式转换通过compress_and_save_image生成目标格式镜像 高级技巧与最佳实践调试技巧利用check_break函数在特定阶段插入调试断点# 在 root 阶段前设置断点 breakbefore-root ./create-image ... # 在 install 阶段后设置断点 breakafter-install ./create-image ...性能优化使用DIB_CHECKSUM1环境变量启用校验和生成通过COMPRESS_IMAGE控制镜像压缩级别合理配置QEMU_IMG_OPTIONS优化输出格式参数错误处理所有关键函数都包含完善的错误检查机制确保构建过程的可靠性。die函数提供了统一的错误退出接口trap_cleanup确保异常情况下的资源清理。 函数库功能对比表功能模块common-functionsimg-functions目录管理✅ mk_build_dir❌钩子执行✅ run_d✅ run_d_in_target镜像保存✅ finish_image✅ compress_and_save_imageChroot操作❌✅ run_in_target系统挂载✅ mount_proc_dev_sys✅ unmount_image磁盘优化❌✅ fstrim_image清理函数✅ cleanup_build_dir✅ cleanup 总结OpenEuler CreateImage 项目的lib/common-functions和lib/img-functions是两个功能互补的核心函数库。common-functions专注于构建流程的控制和管理而img-functions则负责镜像的后期处理和优化。通过深入理解这两个文件您可以掌握 openEuler 镜像构建的核心原理 定制个性化的镜像构建流程 优化镜像性能和体积 ⚡快速排查构建过程中的问题 扩展镜像构建的功能特性 无论是为云计算环境准备基础镜像还是为嵌入式设备定制专用系统OpenEuler CreateImage 的这些核心函数都为您提供了强大的工具支持。开始探索这些函数库打造属于您自己的完美 openEuler 镜像吧✨【免费下载链接】CreateImageThe tool to create Machine Image项目地址: https://gitcode.com/openeuler/CreateImage创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考