当前位置: 首页 > news >正文

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),仅供参考

http://www.cnnetsun.cn/news/3453769.html

相关文章:

  • uos-uwsgi-exporter深度解析:从架构设计到实战部署的完整教程
  • 终极指南:如何用Zotero Style插件打造你的专属文献阅读体验
  • 3步构建个人云影院:115网盘原码直连Kodi播放方案
  • 如何用happy-lager快速搭建企业级网站?Craft CMS模板开发终极指南
  • 卤味熟食店如何解决社区获客难题?餐宝盈小程序与GEO服务带来稳定订单,含零代码SAAS、AI编程、源码定制
  • 如何用1个免费应用看遍所有直播?Simple Live终极聚合方案
  • 完整指南:如何使用IDM激活脚本永久解决Internet Download Manager试用限制
  • 解密本地视频字幕提取:从手动转录到智能AI的进化之路
  • dnSpyEx:3大核心功能解析.NET程序调试与逆向工程的终极解决方案
  • Hermes 完整部署排障清单,解决 90% Windows 安装异常
  • SillyTavern突破指南:3大挑战与高效解决方案
  • 2026私域商城小程序平台口碑榜单:餐宝盈、BBWEYY、比文云、SaaS哥、维双云对比,含零代码SAAS、AI编程、源码定制
  • 小程序毕设项目:同城生鲜配送系统的设计与实现 基于 SpringBoot + 微信小程序的家庭生鲜采购服务小程序 (源码+文档,讲解、调试运行,定制等)
  • Go-Queryset项目实战:从零构建企业级应用的数据访问层
  • 【Springboot毕设全套源码+文档】基于SpringBoot的音乐分享与交流平台设计与实现(丰富项目+远程调试+讲解+定制)
  • Legacy-iOS-Kit:让经典苹果设备重获新生的终极工具链
  • 罗丹明类荧光染料:从分子结构到前沿应用
  • C++实现Bresenham直线光栅化算法:原理详解与代码实战
  • PCB布局设计核心原则与高频电路优化技巧
  • STM32H7 MCU驱动MIPI DSI显示接口实战指南
  • GaN Doherty功放设计:效率优化与宽带实现
  • SingGuard-4b实战应用:10个常见场景的安全检测案例
  • 如何在Windows 11家庭版免费启用远程桌面多用户连接:RDP Wrapper完整教程
  • OBS Studio转场效果终极指南:如何创建专业级场景切换动画
  • 电子元件知识汇总2-封装
  • 5分钟开启Windows本地实时语音转文字:TMSpeech完整指南
  • 绝区零一条龙:如何用自动化工具彻底解放你的游戏时间?
  • li-wen开发者指南:如何扩展支持其他云平台的完整教程
  • 如何用JPEXS免费Flash反编译器拯救你的经典Flash内容?终极指南来了![特殊字符]
  • Fable 5 的 7 月 19 日不是发布延期:模型可用性正在变成动态资源(九维可用性 + SLO 重构)