跳转到内容

镜像构建 (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 -> FINISHEDFAILED

下载构建完成的镜像
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 和对应的蓝图版本