4. 虚拟机创建方法

在 KVM 生命周期中,“创建”是承上启下的关键动作:它把宿主机的 CPU、内存、磁盘、网络等资源,按照业务需求组合成一台可运行的虚拟机。KVM 本身只提供内核级虚拟化能力,真正完成创建动作的是 libvirt 及其工具链。理解不同创建入口的差异,能帮助我们在批量部署、交互式调试和自动化编排之间做出正确选择。

核心原理:libvirt 是统一的抽象层

无论使用哪种方式创建虚拟机,最终都会落到 libvirt 的域(Domain)定义上。libvirt 将一台虚拟机的全部配置抽象为 XML 文档,其中包含 <name>、<memory>、<vcpu>、<disk>、<interface>、<os> 等核心节点。命令行工具、图形界面和 XML 文件只是操作这一抽象层的不同“外壳”。

创建过程通常包含三个动作:定义配置、分配资源、启动安装。libvirt 会把 XML 持久化到 /etc/libvirt/qemu/ 目录,并在 virsh list --all 中登记状态。理解这一点后,就能明白为什么“用 virt-manager 创建的虚拟机,也能用 virsh 管理”。

KVM 虚拟机创建入口与安装介质关系图 virt-install 命令行 / 脚本化 适合批量与自动化 virt-manager 图形界面 / 交互式 适合学习与调试 XML 定义文件 virsh define / create 适合版本化与复用 libvirt 统一抽象层(Domain XML) name / memory / vcpu / disk / interface / os / graphics 安装介质与引导方式 本地 ISO 镜像 | PXE / HTTP / FTP 网络安装 ISO 本地安装 --cdrom / --location 指向镜像 网络安装 --pxe / --location http://...

方法一:virt-install 命令行创建

virt-install 是最适合脚本化和批量部署的方式。它通过参数直接描述虚拟机规格,并调用 libvirt 完成定义与启动。一个典型的本地 ISO 安装命令如下:

virt-install \
  --name web01 \
  --memory 2048 \
  --vcpus 2 \
  --cpu host-passthrough \
  --disk path=/var/lib/libvirt/images/web01.qcow2,size=20,format=qcow2 \
  --network network=default,model=virtio \
  --graphics vnc,listen=0.0.0.0 \
  --cdrom /iso/CentOS-7-x86_64-DVD.iso \
  --os-variant centos7.0 \
  --boot cdrom,hd

如果采用网络安装,把 --cdrom 换成 --location 或 --pxe 即可。例如:

virt-install --name db01 --memory 4096 --vcpus 4 \
  --disk size=50,format=qcow2 \
  --network bridge=br0,model=virtio \
  --location http://mirror.example.com/centos/7/os/x86_64/ \
  --extra-args "ks=http://mirror.example.com/ks/db01.ks" \
  --os-variant centos7.0 --noautoconsole

其中 --extra-args 可传入 Kickstart 应答文件,实现无人值守安装,这是生产环境批量交付的常用手段。

方法二:virt-manager 图形界面创建

virt-manager 提供向导式创建流程,适合初学者理解各配置项的含义。其步骤为:选择连接(QEMU/KVM)→ 新建虚拟机 → 选择安装介质(本地 ISO 或网络 URL)→ 设置内存与 CPU → 配置磁盘 → 命名并选择网络 → 完成。图形界面背后同样生成 XML,只是把参数填写变成了可视化表单。

它的优势在于可以直观查看控制台、实时调整硬件、观察资源占用;不足在于难以纳入自动化流水线,重复操作效率低。

方法三:XML 定义文件创建

XML 方式最贴近 libvirt 的本质,适合需要精确控制设备模型、做版本化管理的场景。先编写 XML 文件,再用 virsh 定义并启动:

<domain type='kvm'>
  <name>app01</name>
  <memory unit='MiB'>2048</memory>
  <vcpu>2</vcpu>
  <os><type arch='x86_64'>hvm</type></os>
  <devices>
    <disk type='file' device='disk'>
      <source file='/var/lib/libvirt/images/app01.qcow2'/>
      <target dev='vda' bus='virtio'/>
    </disk>
    <interface type='network'>
      <source network='default'/>
      <model type='virtio'/>
    </interface>
  </devices>
</domain>
virsh define app01.xml
virsh start app01
virsh list --all

XML 方式便于用 Git 管理配置变更,也便于通过模板批量生成不同规格的虚拟机。

四种创建方式对比

方式 适用场景 优点 局限
virt-install 批量部署、自动化脚本 参数清晰、可重复执行 参数较多,需熟悉选项
virt-manager 学习、调试、单台创建 直观、可视化控制台 难以自动化、效率低
XML 定义文件 精确控制、版本化管理 可复用、可审计 需掌握 XML 结构
ISO 本地安装 无网络或需离线部署 不依赖网络、稳定 需提前准备镜像
网络安装 大规模、集中化交付 可配合 Kickstart 无人值守 依赖网络与镜像源

案例场景:批量交付 10 台 Web 节点

某业务需要快速上线 10 台规格一致的 Web 服务器。若用 virt-manager 逐台点击,耗时长且易出错;更合理的做法是编写一个 shell 循环,用 virt-install 配合 Kickstart 自动安装:

for i in $(seq 1 10); do
  virt-install --name web$i --memory 2048 --vcpus 2 \
    --disk path=/var/lib/libvirt/images/web$i.qcow2,size=20 \
    --network network=default,model=virtio \
    --location http://mirror.example.com/centos/7/os/x86_64/ \
    --extra-args "ks=http://mirror.example.com/ks/web.ks" \
    --os-variant centos7.0 --noautoconsole
done

执行后可用 virsh list --all 确认状态,用 virsh console web1 进入控制台检查安装进度。

提示:使用 --noautoconsole 可避免 virt-install 自动打开控制台,适合脚本批量执行;安装完成后用 virsh console 或 SSH 登录验证。

常见误区与复盘

  • 误区一:认为 virt-manager 创建的虚拟机不能用命令行管理。实际上两者共享 libvirt,完全互通。
  • 误区二:忽略 --os-variant。它影响 virtio 驱动优化与时钟配置,缺失可能导致性能下降或安装异常。
  • 误区三:网络安装时未配置 --extra-args,导致仍需人工交互,失去自动化意义。
  • 误区四:磁盘未指定 format=qcow2,默认 raw 格式占用空间大且不支持快照。
  • 复盘建议:生产环境优先使用 virt-install + Kickstart 或 XML 模板,把创建过程纳入版本控制与审计。
核心结论:三种创建入口最终都归一到 libvirt Domain XML;ISO 与网络安装是介质与引导方式的选择。批量与自动化选 virt-install,学习与调试选 virt-manager,精确控制与版本化选 XML 定义文件。