镜像构建 (Image Builder)
Image Builder 是 EL 系发行版提供的系统镜像构建工具,可以创建用于各种平台的自定义操作系统镜像,包括 ISO、qcow2(KVM/OpenStack)、AMI(AWS)、VMDK(VMware)等格式。本文将介绍 Image Builder 的安装、使用 cockpit-composer Web 界面和 composer-cli 命令行工具创建蓝图、构建镜像以及自定义配置。
Image Builder 概述
Section titled “Image Builder 概述”Image Builder 包含两个主要组件:
- osbuild-composer — 后端构建服务,负责镜像的实际构建
- composer-cli — 命令行工具,用于管理蓝图和构建任务
- cockpit-composer — Cockpit Web 界面中的图形化插件
支持的输出格式
Section titled “支持的输出格式”| 格式 | 用途 |
|---|---|
qcow2 | KVM / OpenStack / 通用虚拟化 |
vmdk | VMware |
vhd | Microsoft Azure / Hyper-V |
ami | Amazon Web Services |
iso | 可引导安装 ISO |
tar | 通用 tar 归档 |
gce | Google Cloud Platform |
raw | 裸磁盘镜像 |
安装 Image Builder
Section titled “安装 Image Builder”sudo dnf install osbuild-composer composer-cli -ysudo dnf install cockpit cockpit-composer -ysudo systemctl enable --now osbuild-composer.socketsudo systemctl enable --now cockpit.socketsudo firewall-cmd --permanent --add-service=cockpitsudo firewall-cmd --reload安装后可以通过浏览器访问 https://<服务器IP>:9090 使用 Cockpit 的图形界面。
sudo usermod -aG weldr $(whoami)newgrp weldrcomposer-cli status show蓝图 (Blueprint) 管理
Section titled “蓝图 (Blueprint) 管理”蓝图是一个 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"]EOFcomposer-cli blueprints push /tmp/my-server.tomlcomposer-cli blueprints listcomposer-cli blueprints show my-servercomposer-cli blueprints depsolve my-servercomposer-cli blueprints save my-servercomposer-cli blueprints delete my-server修改蓝图的流程是:导出 -> 编辑 -> 重新推送。
composer-cli blueprints save my-servervi my-server.tomlcomposer-cli blueprints push my-server.tomlcomposer-cli compose start my-server qcow2composer-cli compose start my-server isocomposer-cli compose start my-server amicomposer-cli compose start my-server vmdkcomposer-cli compose start my-server vhd监控构建进度
Section titled “监控构建进度”composer-cli compose listcomposer-cli compose status构建状态包括:WAITING -> RUNNING -> FINISHED 或 FAILED。
下载构建结果
Section titled “下载构建结果”composer-cli compose image <UUID>将 <UUID> 替换为构建任务的实际 UUID(从 composer-cli compose list 获取)。
composer-cli compose logs <UUID>composer-cli compose metadata <UUID>清理构建记录
Section titled “清理构建记录”composer-cli compose delete <UUID>高级蓝图配置
Section titled “高级蓝图配置”包含自定义文件
Section titled “包含自定义文件”可以在蓝图中嵌入自定义配置文件:
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配置静态网络
Section titled “配置静态网络”# 网络配置(用于 cloud-init 场景通常不需要)[customizations.timezone]timezone = "UTC"[customizations.hostname]hostname = "prod-server-01"Web 服务器蓝图示例
Section titled “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"]EOFcomposer-cli blueprints push /tmp/web-server.tomlcomposer-cli compose start web-server qcow2使用 Cockpit Composer (Web 界面)
Section titled “使用 Cockpit Composer (Web 界面)”如果已安装 cockpit-composer,可以通过 Web 界面进行可视化操作:
- 打开浏览器访问
https://<服务器IP>:9090 - 使用系统账户登录
- 在左侧菜单中选择 Image Builder
- 点击 Create Blueprint 创建新蓝图
- 在搜索框中添加需要的软件包
- 配置自定义选项
- 点击 Create Image 选择输出格式并开始构建
- 在 Images 标签页中下载构建完成的镜像
使用构建的镜像
Section titled “使用构建的镜像”在 KVM 中使用 qcow2 镜像
Section titled “在 KVM 中使用 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
Section titled “上传 AMI 到 AWS”构建的 AMI 镜像可以使用 AWS CLI 上传:
aws s3 cp <UUID>-image.raw s3://my-bucket/my-server.rawaws ec2 import-image --disk-containers "file://containers.json"Packer 替代方案
Section titled “Packer 替代方案”对于更复杂的镜像构建流水线,可以考虑使用 HashiCorp Packer。Packer 支持更多的构建器和配置管理工具集成。
sudo dnf install -y dnf-plugins-coresudo dnf config-manager --add-repo https://rpm.releases.hashicorp.com/RHEL/hashicorp.reposudo dnf install packer -ypacker versionPacker 使用 HCL 或 JSON 格式的模板定义镜像构建过程,支持 QEMU、VMware、AWS、Azure、GCP 等多种构建器,并可与 Ansible、Shell 脚本等配置管理工具集成。
Image Builder vs Packer 对比:
| 特性 | Image Builder | Packer |
|---|---|---|
| 集成度 | 原生集成于 EL 系统 | 第三方工具 |
| 学习曲线 | 低 | 中等 |
| 灵活性 | 中等 | 高 |
| CI/CD 集成 | 基础 | 优秀 |
| 多平台支持 | 好 | 优秀 |
| 配置管理集成 | 有限 | Ansible/Chef/Puppet/Shell |
- 版本控制蓝图 — 将 TOML 蓝图文件存储在 Git 仓库中
- 使用有意义的版本号 — 每次修改蓝图时更新版本号
- 先在测试环境验证 — 构建的镜像先在测试环境部署验证
- 定期重新构建 — 包含最新的安全补丁
- 最小化安装 — 只包含必需的软件包,减少攻击面
- 利用自定义文件 — 将标准配置嵌入镜像,减少部署后配置工作
- 记录构建信息 — 保存构建 UUID 和对应的蓝图版本