告别手动配置用virt-install一键创建KVM虚拟机的5个实战脚本附CentOS/Ubuntu示例在虚拟化技术日益普及的今天KVM作为Linux内核原生支持的虚拟化解决方案凭借其高性能和低开销成为众多运维工程师的首选。然而每次创建虚拟机时重复输入冗长的命令行参数不仅效率低下还容易出错。本文将带你探索如何通过精心设计的virt-install脚本实现虚拟机创建的自动化彻底告别手动配置的繁琐。无论你是需要快速部署测试环境还是构建标准化的生产虚拟机模板这些经过实战检验的脚本都能大幅提升工作效率。我们将从基础配置到高级技巧逐步拆解每个脚本的设计思路和关键参数让你在15分钟内掌握批量创建虚拟机的核心方法。1. 环境准备与基础概念在开始编写自动化脚本之前确保你的系统已正确配置KVM环境。运行以下命令检查虚拟化支持egrep -c (vmx|svm) /proc/cpuinfo # 应返回大于0的值 lsmod | grep kvm # 应显示kvm_intel或kvm_amd模块KVM虚拟化的核心优势在于其接近原生性能的特性和紧密的内核集成。与容器技术相比虚拟机提供了完整的系统隔离特别适合需要独立内核或特定系统配置的场景。virt-install作为创建虚拟机的命令行工具相比图形界面操作具有以下不可替代的优势可重复性脚本化配置确保每次创建的虚拟机参数一致批量化通过循环或变量替换实现批量部署自动化集成可无缝嵌入CI/CD流程或配置管理系统远程执行通过SSH即可完成全部操作无需图形界面提示虽然本文示例基于CentOS和Ubuntu但脚本逻辑适用于任何支持KVM的Linux发行版。建议使用最新稳定版的libvirt和qemu组件以获得最佳兼容性。2. 基础虚拟机创建脚本解析让我们从一个最基础的本地ISO安装脚本开始这是大多数用户接触KVM虚拟化的起点。以下示例展示了如何创建2核CPU、4GB内存的Ubuntu 22.04虚拟机#!/bin/bash VM_NAMEubuntu22-base ISO_PATH/var/lib/libvirt/images/ubuntu-22.04-live-server-amd64.iso DISK_PATH/var/lib/libvirt/images/${VM_NAME}.qcow2 virt-install \ --name ${VM_NAME} \ --ram 4096 \ --vcpus 2 \ --disk path${DISK_PATH},size20,formatqcow2 \ --os-type linux \ --os-variant ubuntu22.04 \ --network bridgevirbr0 \ --graphics spice \ --cdrom ${ISO_PATH}这个脚本中的每个参数都有其特定作用--disk使用qcow2格式的稀疏磁盘实际占用空间随使用量增长--os-variant优化虚拟机配置以获得更好的性能表现--network连接到默认的NAT网络桥接virbr0--graphics启用SPICE协议实现高性能远程桌面对于需要频繁创建相似配置虚拟机的场景可以将上述脚本保存为create_vm.sh并添加可执行权限。更高级的做法是使用变量替换实现参数化#!/bin/bash read -p Enter VM name: VM_NAME read -p Enter RAM in MB: RAM_SIZE read -p Enter vCPU count: CPU_COUNT virt-install \ --name ${VM_NAME} \ --ram ${RAM_SIZE} \ --vcpus ${CPU_COUNT} \ ...3. 高级网络与存储配置生产环境往往需要更复杂的网络和存储配置。下表对比了三种常见的网络连接方式及其适用场景网络类型配置参数IP分配外部访问典型用途NAT默认--network bridgevirbr0DHCP端口转发开发测试桥接网络--network bridgebr0DHCP/静态直接访问生产环境隔离网络--network networkprivate手动配置不可访问安全测试对于需要高性能磁盘IO的场景virtio驱动配合raw格式磁盘是最佳选择。以下脚本展示了如何创建使用virtio设备和桥接网络的CentOS 8虚拟机#!/bin/bash VM_NAMEcentos8-prod ISO_PATH/var/lib/libvirt/images/CentOS-8-x86_64-minimal.iso DISK_PATH/var/lib/libvirt/images/${VM_NAME}.raw virt-install \ --name ${VM_NAME} \ --ram 8192 \ --vcpus 4 \ --disk path${DISK_PATH},size50,formatraw,busvirtio \ --controller typescsi,modelvirtio-scsi \ --network bridgebr0,modelvirtio \ --os-variant centos8 \ --location ${ISO_PATH} \ --extra-argsinst.kshttp://kickstart.example.com/centos8.cfg关键优化点包括使用raw格式避免qcow2的元数据开销busvirtio参数启用高性能虚拟IO设备--location支持网络安装源而非本地ISO--extra-args传递Kickstart自动安装配置注意桥接网络要求主机物理网卡已配置为桥接模式。使用前请确保br0等桥接接口已正确设置。4. 自动化安装与配置对于需要批量部署的场景结合Kickstart或Cloud-Init实现完全无人值守安装至关重要。以下是通过HTTP获取Kickstart配置的自动化示例#!/bin/bash VM_NAMEcentos7-auto KS_URLhttp://192.168.1.100/ks/centos7-minimal.cfg virt-install \ --name ${VM_NAME} \ --ram 2048 \ --vcpus 2 \ --disk path/var/lib/libvirt/images/${VM_NAME}.qcow2,size15 \ --os-variant centos7.0 \ --location http://mirrors.aliyun.com/centos/7/os/x86_64/ \ --network bridgevirbr0 \ --graphics none \ --console pty,target_typeserial \ --extra-argsks${KS_URL} consolettyS0,115200n8这个脚本有几个值得注意的细节--graphics none禁用图形控制台纯文本安装--console配置串行控制台用于文本输出--extra-args传递内核参数指定Kickstart位置和串行控制台对于Ubuntu系统可以使用Cloud-Init实现类似的自动化。准备一个包含配置的ISO镜像后通过以下方式附加--disk path/path/to/cloud-init.iso,devicecdrom \5. 性能优化与特殊场景针对不同工作负载虚拟机参数需要相应调整。以下表格总结了常见应用场景的优化建议应用类型vCPU建议内存建议磁盘格式网络模型数据库固定分配大页内存rawvirtio桥接virtioWeb服务超额分配常规分配qcow2默认NATCI/CD节点动态调整按需分配qcow2zstd隔离网络开发环境1-2核心2-4GBqcow2默认NAT对于需要GPU加速的场景可以添加以下参数--hostdev pci_0000_0b_00_0 \ --features kvm_hiddenon \ --video qxl内存大页配置示例--memorybacking hugepagesyes \ --memory 16384,hugepagesz1GB最后一个完整的删除虚拟机脚本同样重要特别是当需要频繁创建和销毁测试环境时#!/bin/bash VM_NAME$1 virsh destroy ${VM_NAME} 2/dev/null virsh undefine --remove-all-storage ${VM_NAME}将这些脚本与版本控制系统结合可以构建出灵活高效的虚拟化管理体系。例如将常用脚本存放在Git仓库中配合简单的包装函数实现快速调用function create_ubuntu() { local vm_name$1 local ram${2:-4096} local vcpus${3:-2} # 调用预先准备好的脚本模板 ./ubuntu_template.sh ${vm_name} ${ram} ${vcpus} }在实际使用中发现将磁盘存放在/dev/shm/下可以显著提升IO性能特别适合临时测试环境。但需要注意这种配置会在重启后丢失所有数据。