virt-customize 是什么
virt-customize 属于 libguestfs 工具集,不启动虚机即可修改镜像内容:设置主机名与密码、安装软件包、执行命令、上传文件。它适合批量制作基线镜像,也常用于迁移前给镜像预装 virtio 驱动,避免换平台后找不到磁盘。
基本信息
| 主机名与密码 | --hostname web01 --root-password password:xxx |
|---|---|
| 安装软件 | --install nginx(Debian / RHEL 系均支持) |
| 执行命令 | --run-command 'systemctl enable nginx' |
| 上传文件 | --upload 本地路径:镜像内路径 |
| 前置条件 | 宿主已安装 libguestfs 与对应工具,镜像未被运行中的虚机占用 |
| 批量做法 | 脚本里循环对多份镜像执行同一组参数 |
典型使用场景
- 制作公司基线镜像:时区、软件源、监控 agent 一次写进去
- 迁移前预装 virtio 驱动与 cloud-init,避免换平台后起不来
- 清理镜像里遗留的旧主机名、SSH 主机密钥与日志
- 批量写入合规要求的审计与代理配置
- 交付镜像前统一移除临时文件与测试账号
定制一台应用基线镜像
定制一台应用基线镜像
virt-inspector /data/images/base.qcow2 | head -20 # 先看清镜像里的系统与版本
sudo virt-customize -a /data/images/base.qcow2 \
--hostname web01 --root-password password:'ChangeMe_2026' \
--install nginx --run-command 'systemctl enable nginx' \
--upload /etc/app/app.conf:/etc/app/app.conf
sudo virt-customize -a base.qcow2 --run-command 'cloud-init clean --logs' # 清理 cloud-init 状态
sudo virt-customize -a base.qcow2 --firstboot-command 'hostnamectl reset' # 首次开机再执行的动作常用参数
| 参数 | 作用 | 注意点 |
|---|---|---|
| --hostname | 设置镜像内主机名 | 与 cloud-init 的 hostname 可能互相覆盖 |
| --install | 安装软件包 | 离线镜像没有可用仓库时会失败 |
| --run-command | 在镜像内执行命令 | 命令返回非零会中断整个定制过程 |
| --upload | 上传文件到镜像 | 目标目录必须已存在 |
| --root-password | 设置 root 密码 | 明文出现在命令行历史里 |
不要对正在运行的域所使用的磁盘做定制:文件系统层会互相写冲突,镜像可能直接损坏。必须先关机,或改为对一份只读副本操作。
定制会改变镜像内容:完成后应重新生成校验值并更新镜像清单,否则分发时无法验证完整性,也说不清哪一版被部署到了哪里。定制前最好留一份未改动的原始镜像作为母本。