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-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 阶段前设置断点 break="before-root" ./create-image ... # 在 install 阶段后设置断点 break="after-install" ./create-image ...性能优化
- 使用
DIB_CHECKSUM=1环境变量启用校验和生成 - 通过
COMPRESS_IMAGE控制镜像压缩级别 - 合理配置
QEMU_IMG_OPTIONS优化输出格式参数
错误处理
所有关键函数都包含完善的错误检查机制,确保构建过程的可靠性。die函数提供了统一的错误退出接口,trap_cleanup确保异常情况下的资源清理。
📊 函数库功能对比表
| 功能模块 | common-functions | img-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-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),仅供参考
