跳转到内容
搜索 RunEntLinux 文档

仅搜索 RunEntLinux 通用文档,各发行版文档使用各自的搜索入口。

    浏览当前文档目录

    镜像构建 (Image Builder)

    Image Builder 是 EL 系发行版提供的系统镜像构建工具,可以创建用于各种平台的自定义操作系统镜像,包括 ISO、qcow2(KVM/OpenStack)、AMI(AWS)、VMDK(VMware)等格式。本文将介绍 Image Builder 的安装、使用 cockpit-composer Web 界面和 composer-cli 命令行工具创建蓝图、构建镜像以及自定义配置。

    Image Builder 包含两个主要组件:

    • osbuild-composer — 后端构建服务,负责镜像的实际构建
    • composer-cli — 命令行工具,用于管理蓝图和构建任务
    • cockpit-composer — Cockpit Web 界面中的图形化插件
    格式用途
    qcow2KVM / OpenStack / 通用虚拟化
    vmdkVMware
    vhdMicrosoft Azure / Hyper-V
    amiAmazon Web Services
    iso可引导安装 ISO
    tar通用 tar 归档
    gceGoogle Cloud Platform
    raw裸磁盘镜像
    安装 osbuild-composer 和命令行工具
    sudo dnf install osbuild-composer composer-cli -y
    安装 Cockpit Web 界面(可选)
    sudo dnf install cockpit cockpit-composer -y
    启动并启用 osbuild-composer 服务
    sudo systemctl enable --now osbuild-composer.socket
    启动 Cockpit(如已安装)
    sudo systemctl enable --now cockpit.socket
    sudo firewall-cmd --permanent --add-service=cockpit
    sudo firewall-cmd --reload

    安装后可以通过浏览器访问 https://<服务器IP>:9090 使用 Cockpit 的图形界面。

    将当前用户添加到 weldr 组(允许使用 composer-cli)
    sudo usermod -aG weldr $(whoami)
    newgrp weldr
    验证 composer-cli 可用
    composer-cli status show

    蓝图是一个 TOML 格式的配置文件,定义了镜像中包含的软件包和配置。

    创建一个基础蓝图文件
    cat > /tmp/my-server.toml << 'EOF'
    name = "my-server"
    description = "Custom server image for production deployment"
    version = "1.0.0"
    distro = ""
    # 包含的软件包
    [[packages]]
    name = "vim-enhanced"
    version = "*"
    [[packages]]
    name = "wget"
    version = "*"
    [[packages]]
    name = "curl"
    version = "*"
    [[packages]]
    name = "chrony"
    version = "*"
    [[packages]]
    name = "bash-completion"
    version = "*"
    [[packages]]
    name = "net-tools"
    version = "*"
    [[packages]]
    name = "tmux"
    version = "*"
    [[packages]]
    name = "htop"
    version = "*"
    # 包含的模块/组
    [[groups]]
    name = "core"
    # 自定义内核参数(可选)
    [customizations.kernel]
    append = "net.ifnames=0"
    # 设置时区
    [customizations.timezone]
    timezone = "Asia/Shanghai"
    ntpservers = ["ntp.aliyun.com", "ntp.tencent.com"]
    # 设置 locale
    [customizations.locale]
    languages = ["zh_CN.UTF-8"]
    keyboard = "us"
    # 创建用户
    [[customizations.user]]
    name = "admin"
    description = "Admin user"
    password = "$6$rounds=4096$randomsalt$hashedpassword"
    groups = ["wheel"]
    # 防火墙设置
    [customizations.firewall]
    ports = ["22:tcp", "80:tcp", "443:tcp"]
    # 启用的服务
    [customizations.services]
    enabled = ["chronyd", "sshd", "firewalld"]
    disabled = ["postfix"]
    EOF
    推送蓝图到 Image Builder
    composer-cli blueprints push /tmp/my-server.toml
    列出所有蓝图
    composer-cli blueprints list
    查看蓝图详情
    composer-cli blueprints show my-server
    检查蓝图依赖
    composer-cli blueprints depsolve my-server
    导出蓝图为 TOML 文件
    composer-cli blueprints save my-server
    删除蓝图
    composer-cli blueprints delete my-server

    修改蓝图的流程是:导出 -> 编辑 -> 重新推送。

    导出蓝图
    composer-cli blueprints save my-server
    编辑蓝图文件
    vi my-server.toml
    推送更新后的蓝图
    composer-cli blueprints push my-server.toml
    构建 qcow2 镜像(用于 KVM/OpenStack)
    composer-cli compose start my-server qcow2
    构建 ISO 安装镜像
    composer-cli compose start my-server iso
    构建 AMI 镜像(用于 AWS)
    composer-cli compose start my-server ami
    构建 VMDK 镜像(用于 VMware)
    composer-cli compose start my-server vmdk
    构建 VHD 镜像(用于 Azure)
    composer-cli compose start my-server vhd
    查看所有构建任务
    composer-cli compose list
    查看正在运行的构建
    composer-cli compose status

    构建状态包括:WAITING -> RUNNING -> FINISHED 或 FAILED。

    下载构建完成的镜像
    composer-cli compose image <UUID>

    将 <UUID> 替换为构建任务的实际 UUID(从 composer-cli compose list 获取)。

    下载构建日志(用于排错)
    composer-cli compose logs <UUID>
    查看构建元数据
    composer-cli compose metadata <UUID>
    删除已完成的构建
    composer-cli compose delete <UUID>

    可以在蓝图中嵌入自定义配置文件:

    蓝图中嵌入自定义文件
    cat >> /tmp/my-server.toml << 'EOF'
    # 自定义文件
    [[customizations.files]]
    path = "/etc/motd"
    data = "Welcome to My Custom Server\n"
    [[customizations.files]]
    path = "/etc/sysctl.d/99-custom.conf"
    data = "vm.swappiness=10\nnet.core.somaxconn=65535\n"
    EOF
    蓝图中的网络配置
    # 网络配置(用于 cloud-init 场景通常不需要)
    [customizations.timezone]
    timezone = "UTC"
    蓝图中设置主机名
    [customizations.hostname]
    hostname = "prod-server-01"
    创建 Web 服务器蓝图
    cat > /tmp/web-server.toml << 'EOF'
    name = "web-server"
    description = "Nginx web server image"
    version = "1.0.0"
    [[packages]]
    name = "nginx"
    version = "*"
    [[packages]]
    name = "certbot"
    version = "*"
    [[packages]]
    name = "python3-certbot-nginx"
    version = "*"
    [[packages]]
    name = "vim-enhanced"
    version = "*"
    [[packages]]
    name = "chrony"
    version = "*"
    [customizations.services]
    enabled = ["nginx", "chronyd", "sshd", "firewalld"]
    [customizations.firewall]
    ports = ["22:tcp", "80:tcp", "443:tcp"]
    [customizations.timezone]
    timezone = "UTC"
    [[customizations.user]]
    name = "deploy"
    groups = ["wheel"]
    EOF
    推送并构建 Web 服务器镜像
    composer-cli blueprints push /tmp/web-server.toml
    composer-cli compose start web-server qcow2

    如果已安装 cockpit-composer,可以通过 Web 界面进行可视化操作:

    1. 打开浏览器访问 https://<服务器IP>:9090
    2. 使用系统账户登录
    3. 在左侧菜单中选择 Image Builder
    4. 点击 Create Blueprint 创建新蓝图
    5. 在搜索框中添加需要的软件包
    6. 配置自定义选项
    7. 点击 Create Image 选择输出格式并开始构建
    8. 在 Images 标签页中下载构建完成的镜像
    使用构建的 qcow2 镜像创建虚拟机
    sudo virt-install \
    --name my-server \
    --ram 2048 \
    --vcpus 2 \
    --import \
    --disk path=/path/to/<UUID>-disk.qcow2 \
    --os-variant almalinux9 \
    --nographics

    构建的 AMI 镜像可以使用 AWS CLI 上传:

    上传 AMI 到 S3 并注册
    aws s3 cp <UUID>-image.raw s3://my-bucket/my-server.raw
    aws ec2 import-image --disk-containers "file://containers.json"

    对于更复杂的镜像构建流水线,可以考虑使用 HashiCorp Packer。Packer 支持更多的构建器和配置管理工具集成。

    安装 Packer(EL 9 / EL 10)
    sudo dnf install -y dnf-plugins-core
    sudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.repo
    sudo dnf install packer -y
    验证 Packer 安装
    packer version

    Packer 使用 HCL 或 JSON 格式的模板定义镜像构建过程,支持 QEMU、VMware、AWS、Azure、GCP 等多种构建器,并可与 Ansible、Shell 脚本等配置管理工具集成。

    Image Builder vs Packer 对比:

    特性Image BuilderPacker
    集成度原生集成于 EL 系统第三方工具
    学习曲线低中等
    灵活性中等高
    CI/CD 集成基础优秀
    多平台支持好优秀
    配置管理集成有限Ansible/Chef/Puppet/Shell
    1. 版本控制蓝图 — 将 TOML 蓝图文件存储在 Git 仓库中
    2. 使用有意义的版本号 — 每次修改蓝图时更新版本号
    3. 先在测试环境验证 — 构建的镜像先在测试环境部署验证
    4. 定期重新构建 — 包含最新的安全补丁
    5. 最小化安装 — 只包含必需的软件包,减少攻击面
    6. 利用自定义文件 — 将标准配置嵌入镜像,减少部署后配置工作
    7. 记录构建信息 — 保存构建 UUID 和对应的蓝图版本