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 管理”。
方法一: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 模板,把创建过程纳入版本控制与审计。