首页/云/云平台与虚拟化速查/virt-install 集成 cloud-init
虚拟化操作94 条

virt-install 集成 cloud-init

virt-install 可通过 --cloud-init 把 user-data 注入使用 NoCloud 数据源的镜像:设置初始用户、SSH 公钥、root 密码等,实现装机即达可用状态。

云平台与虚拟化速查云更新于 2026-10-13

virt-install 集成 cloud-init

virt-install 的 --cloud-init 选项可以把 user-data 注入使用 NoCloud 数据源的镜像:设置初始用户、SSH 公钥、root 密码与首次启动脚本,让虚机开机即达到可用状态,不必手工登录做初始化。它属于 libvirt / virt-install 在 Linux(RHEL、Debian 系)上的能力。

基本信息

参数形态--cloud-init user-data=/path/user-data.yaml,root-password=密码
镜像要求镜像内已安装 cloud-init 且支持 NoCloud 数据源
常用内容初始用户、SSH 公钥、首次启动脚本、包安装
风险点root 密码会出现在命令历史与运维平台日志里
校验方式进系统后查 cloud-init 日志与 /var/lib/cloud 目录
替代方案也可手工制作 seed 镜像(ISO 或 vfat)挂载给虚机

典型使用场景

  • 批量创建同构虚机,用 user-data 区分主机名与网络参数
  • 只注入 SSH 公钥、从第一天就禁用密码登录
  • 首次启动执行装机脚本:装包、写配置、拉取代码
  • 验收镜像时快速验证它能否被 cloud-init 正常初始化
  • 在 CI 里自动起虚机跑集成测试

用 cloud-init 创建初始用户

用 cloud-init 创建初始用户
cat > /tmp/user-data.yaml <<'EOF'
#cloud-config
users:
  - name: ops
    sudo: ALL=(ALL) NOPASSWD:ALL
    ssh_authorized_keys:
      - ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAA...(替换为实际公钥)
EOF
virt-install --name app01 --memory 2048 --vcpus 2 --import \
  --disk path=/data/images/rocky9.qcow2,bus=virtio \
  --network network=default,model=virtio --graphics none \
  --console pty,target_type=serial \
  --cloud-init user-data=/tmp/user-data.yaml
ssh ops@<虚机地址> 'cloud-init status --long'   # 进机后确认初始化已完成

常见注入项

项目user-data 写法作用
初始用户users:创建账号并配置 sudo 权限
SSH 公钥ssh_authorized_keys免密登录,替代密码
首次脚本runcmd:开机后执行装机命令
主机名hostname: / fqdn:一次性设定名称
root 密码root-password= 参数走命令行参数,注意泄露风险
root 密码写在命令行里会进入 shell 历史与各类平台日志;生产做法是只注入公钥并禁用密码登录,密码类参数交付后立即轮换。
注入能生效的前提是镜像内置 cloud-init 且识别 NoCloud 数据源:未做 cloud 化的传统安装镜像不会读取这些数据,开机后仍是默认账号。第一次用新镜像时,建议先起一台验证初始化日志,再批量铺开。

易错点

  • 镜像未内置 cloud-init:注入的数据不被读取,装机后仍是默认账号
  • 密码写在命令行里进入 shell 历史:敏感参数应改走文件或密钥
  • user-data YAML 缩进或首行 #cloud-config 写错,cloud-init 静默跳过配置
  • 重复用同一份 user-data 起多台虚机,主机名与密钥相同,资产管理一开始就混乱
  • cloud-init 只在首次启动生效:重装或克隆后不清理状态,注入会直接跳过
  • user-data 里写了装包与拉代码,但虚机没有出口或仓库不可达,首次启动脚本静默失败

数据来源与参考

  • virt-install 手册:--cloud-init
  • cloud-init 文档:NoCloud 数据源
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌