news 2026/7/17 12:20:59

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
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 '^lost+found\|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 isn't 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 # Don't 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-functionsimg-functions紧密协作:

  1. 构建阶段common-functions中的create_base创建基础环境
  2. 配置阶段img-functions中的run_in_target在 chroot 中安装配置软件
  3. 优化阶段img-functions中的fstrim_image优化磁盘空间
  4. 保存阶段common-functions中的finish_image处理最终保存逻辑
  5. 清理阶段img-functions中的cleanup确保资源正确释放

🚀 实战应用:创建自定义 openEuler 镜像

了解这些核心函数后,您可以轻松创建自定义的 openEuler 镜像:

  1. 环境准备:使用mk_build_dir创建临时工作空间
  2. 基础构建:调用create_base建立基础系统
  3. 软件安装:通过run_in_target在 chroot 中安装额外软件包
  4. 系统配置:利用钩子系统进行个性化配置
  5. 镜像优化:使用fstrim_image减小镜像体积
  6. 格式转换:通过compress_and_save_image生成目标格式镜像

💡 高级技巧与最佳实践

调试技巧

利用check_break函数在特定阶段插入调试断点:

# 在 root 阶段前设置断点 break="before-root" ./create-image ... # 在 install 阶段后设置断点 break="after-install" ./create-image ...

性能优化

  • 使用DIB_CHECKSUM=1环境变量启用校验和生成
  • 通过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_image
Chroot操作✅ run_in_target
系统挂载✅ mount_proc_dev_sys✅ unmount_image
磁盘优化✅ fstrim_image
清理函数✅ cleanup_build_dir✅ cleanup

🎯 总结

OpenEuler CreateImage 项目的lib/common-functionslib/img-functions是两个功能互补的核心函数库。common-functions专注于构建流程的控制和管理,而img-functions则负责镜像的后期处理和优化。通过深入理解这两个文件,您可以:

  • 掌握 openEuler 镜像构建的核心原理 🧠
  • 定制个性化的镜像构建流程 🔧
  • 优化镜像性能和体积 ⚡
  • 快速排查构建过程中的问题 🐛
  • 扩展镜像构建的功能特性 🚀

无论是为云计算环境准备基础镜像,还是为嵌入式设备定制专用系统,OpenEuler CreateImage 的这些核心函数都为您提供了强大的工具支持。开始探索这些函数库,打造属于您自己的完美 openEuler 镜像吧!✨

【免费下载链接】CreateImageThe tool to create Machine Image项目地址: https://gitcode.com/openeuler/CreateImage

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/17 12:20:57

uos-uwsgi-exporter深度解析:从架构设计到实战部署的完整教程

uos-uwsgi-exporter深度解析:从架构设计到实战部署的完整教程 【免费下载链接】uos-uwsgi-exporter A Prometheus exporter for uwsgi. 项目地址: https://gitcode.com/openeuler/uos-uwsgi-exporter 前往项目官网免费下载:https://ar.openeuler.…

作者头像 李华
网站建设 2026/7/17 12:20:49

终极指南:如何用Zotero Style插件打造你的专属文献阅读体验

终极指南:如何用Zotero Style插件打造你的专属文献阅读体验 【免费下载链接】zotero-style Ethereal Style for Zotero 项目地址: https://gitcode.com/GitHub_Trending/zo/zotero-style 还在为Zotero单调的界面发愁吗?想让文献管理软件变得既美观…

作者头像 李华
网站建设 2026/7/17 12:20:28

3步构建个人云影院:115网盘原码直连Kodi播放方案

3步构建个人云影院:115网盘原码直连Kodi播放方案 【免费下载链接】115proxy-for-kodi 115原码播放服务Kodi插件 项目地址: https://gitcode.com/gh_mirrors/11/115proxy-for-kodi 你是否厌倦了在115网盘和本地播放器之间来回切换的繁琐流程?想要在…

作者头像 李华
网站建设 2026/7/17 12:19:38

如何用happy-lager快速搭建企业级网站?Craft CMS模板开发终极指南

如何用happy-lager快速搭建企业级网站?Craft CMS模板开发终极指南 【免费下载链接】happy-lager Craft CMS demo site. 项目地址: https://gitcode.com/gh_mirrors/ha/happy-lager happy-lager是一个基于Craft CMS的演示站点,它为开发者提供了完整…

作者头像 李华
网站建设 2026/7/17 12:18:23

卤味熟食店如何解决社区获客难题?餐宝盈小程序与GEO服务带来稳定订单,含零代码SAAS、AI编程、源码定制

摘要 在本地生活商家越来越依赖搜索推荐、内容种草和 AI 问答触达用户的背景下,卤味熟食店 门店的获客难点也变得更加明显。很多商家线下服务不差,但线上表达分散、成交入口不统一、客户数据沉淀不到自己手里,导致流量来了也留不住。本文围绕…

作者头像 李华
网站建设 2026/7/17 12:15:19

如何用1个免费应用看遍所有直播?Simple Live终极聚合方案

如何用1个免费应用看遍所有直播?Simple Live终极聚合方案 【免费下载链接】dart_simple_live 简简单单的看直播 项目地址: https://gitcode.com/GitHub_Trending/da/dart_simple_live 厌倦了在多个直播平台间反复切换?Simple Live为你提供一站式直…

作者头像 李华