在Ubuntu上高效管理多个虚拟机,核心思路是组合使用KVM/QEMU与libvirt工具链,配合命令行工具和模板克隆,而不是依赖图形界面逐个启动。
为什么你的多虚拟机管理越来越吃力?
很多人在Ubuntu上跑多个虚拟机,还是用VirtualBox或VMware Workstation,打开管理器,一个个点启动,再切换窗口操作,虚拟机数量少还好,一旦超过三台,内存占用、磁盘空间、启动速度、快照管理全都变得混乱,行业共识认为,服务器场景下的多虚拟机管理,KVM虚拟化方案在性能和资源隔离上明显优于桌面级虚拟机软件。
换个角度想,你需要的不是“能开多个系统”的工具,而是一套能统一调度、批量操作、按需分配资源的管理框架,Ubuntu自带的libvirt和virsh命令,就是干这个的。
搭建高效的KVM管理基础环境
先确认硬件和内核支持
Ubuntu 22.04及以上版本,内核默认包含KVM模块,先检查CPU虚拟化是否开启:
egrep -c '(vmx|svm)' /proc/cpuinfo
返回大于0,说明支持硬件虚拟化,再确认KVM模块加载正常:
lsmod | grep kvm
看到kvm_intel或kvm_amd,就可以继续安装。
安装libvirt工具链
sudo apt update sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst
安装完成后,把当前用户加入libvirt组:
sudo usermod -aG libvirt $USER
重新登录后,用virsh list --all验证命令可用。
设置默认存储池和网络
libvirt默认创建一个NAT网络,名为default,多数场景够用,但建议调整一下存储池目录,避免把镜像全堆在系统盘,创建独立存储池:
sudo mkdir -p /var/lib/libvirt/images/win sudo virsh pool-define-as win dir - - /var/lib/libvirt/images/win sudo virsh pool-build win sudo virsh pool-start win sudo virsh pool-autostart win
后续创建虚拟机时,直接用--disk pool=win,size=50分配磁盘,比手写路径省事得多。
用virsh命令批量管理虚拟机的日常操作
常用命令清单
- 启动:
virsh start 虚拟机名 - 关机:
virsh shutdown 虚拟机名(模拟电源键,需系统内有ACPI支持) - 强制关闭:
virsh destroy 虚拟机名 - 挂起:
virsh suspend 虚拟机名 - 恢复:
virsh resume 虚拟机名 - 查看所有:
virsh list --all - 开机自启:
virsh autostart 虚拟机名
批量操作可以用循环:
for vm in node01 node02 node03; do virsh start $vm; done
配合virsh list --state-running可以筛选运行中的机器,写脚本做自动巡检。
快照与回滚
多虚拟机调试时,快照是救命的,创建快照:
virsh snapshot-create-as 虚拟机名 snap1 "调整配置前的状态"
查看快照列表:
virsh snapshot-list 虚拟机名
回滚:
virsh snapshot-revert 虚拟机名 snap1
需要注意,快照只保存磁盘状态,不包含内存数据,要保存内存状态,得先挂起虚拟机再用virsh save,但恢复时必须保持相同的内核版本。
动态调整资源
不用关机就能改CPU和内存,前提是虚拟机使用virtio驱动且系统内支持热插拔:
virsh setvcpus 虚拟机名 4 --live virsh setmem 虚拟机名 8G --live
改完在虚拟机内执行lscpu或free -h确认。
用模板克隆快速复制多台虚拟机
为什么克隆比新建快十倍
建一台新虚拟机,要装系统、配软件、优化参数,最少半小时,克隆只需要几十秒,尤其是批量部署相同环境的测试集群时,效率提升非常明显。
克隆流程实操
先准备一台基础虚拟机,包含你想要的系统版本、常用软件、SSH配置、时区设置,然后执行:
sudo virt-clone --original 基础虚拟机名 --name 新虚拟机名 --file /var/lib/libvirt/images/新虚拟机名.qcow2
克隆出来的新虚拟机会自动修改网卡MAC地址,不用担心IP冲突,如果虚拟机有多个磁盘,需要分别指定--file和--file2等参数。
克隆后再改主机名和IP:
virsh start 新虚拟机名 virsh console 新虚拟机名
登录后执行sudo hostnamectl set-hostname new01,修改/etc/netplan/下的配置文件,重启网络。
稀疏文件技巧
默认qcow2格式支持稀疏分配,即磁盘文件只占实际使用的空间,可以用du -h查看真实占用,用ls -lh看虚拟大小,这在磁盘规划时很重要,统计宿主机剩余空间别被虚拟大小骗了。
性能调优:让多虚拟机跑得更流畅
存储驱动选择
磁盘总线优先用virtio,半虚拟化性能接近物理硬盘,确认方式:
virsh dumpxml 虚拟机名 | grep -i virtio
如果显示<target bus='virtio'/>,就是正确的,老虚拟机用IDE模拟的,建议迁移:
virsh edit 虚拟机名
把<bus type='ide'/>改成<bus type='virtio'/>,同时需要虚拟机内装有virtio驱动,否则蓝屏无法启动。
内存和CPU的分配原则
多虚拟机共用物理资源,不要把所有虚拟机的内存相加等于或超过宿主机物理内存。预留至少2GB内存给宿主机,避免OOM,CPU分配遵循“核心数=物理核心数”的原则,超线程环境下可以适当超配,但一般不超过物理核心数的1.5倍。
网络优化
默认的NAT网络适合外部访问虚拟机,但虚拟机之间通信走虚拟网桥,会损耗带宽,如果虚拟机之间有大量数据传输,建议创建内部网络:
sudo virsh net-create --name internal --xml '<network><name>internal</name><bridge name="virbr1" stp="on" delay="0"/></network>'
然后编辑各虚拟机,把网卡接到internal网络上,这样虚拟机和宿主机之间通信走内存,速度远高于物理网卡中转。
使用VirtIO-FS共享文件
频繁在宿主机和虚拟机之间传文件,用scp太慢,virtiofs是一种高性能共享文件系统,配置方式:
# 宿主机编辑虚拟机XML,添加 <filesystem type='mount' accessmode='passthrough'> <driver type='virtiofs'/> <source dir='/home/user/shared'/> <target dir='shared'/> </filesystem>
虚拟机内挂载:
mount -t virtiofs shared /mnt/shared
读大文件时速度接近本地磁盘,比SMB和NFS都强。
资源监控与自动运维脚本
用virsh命令查看运行状态
virsh list --state-running virsh dominfo 虚拟机名 virt-top
virt-top需要单独安装,它类似top命令,实时显示每个虚拟机的CPU、内存、磁盘IO占用情况,多虚拟机负载不均时,用这个工具很快就能发现哪台在偷跑。
写一个自动备份脚本
备份虚拟机最稳妥的方式是导出XML配置文件和磁盘文件,XML配置文件很小,定时备份即可;磁盘文件用rsync增量备份:
#!/bin/bash virsh dumpxml 虚拟机名 > /backup/虚拟机名.xml rsync -av /var/lib/libvirt/images/虚拟机名.qcow2 /backup/
把脚本加入cron定时任务,每天凌晨执行,备份文件保留最近7天,在磁盘空间有限的场景下很实用。
统一管理工具推荐
如果你不喜欢黑屏敲命令,也可以用Cockpit的虚拟机插件,它是一个Web管理界面,支持图形化操作虚拟机开关机、修改配置、查看性能曲线,安装方式:
sudo apt install cockpit cockpit-machines
启动服务后,浏览器访问https://宿主机IP:9090,登录系统账号就能管理,注意Cockpit的MAC地址变更功能在某些版本有bug,修改网络配置时优先用virsh。
Q&A:多虚拟机管理常见困惑
在Ubuntu上管理多个虚拟机用KVM还是VirtualBox?
KVM性能更好,资源占用更低,支持命令行批量管理和远程调用,适合服务器和开发测试环境,VirtualBox胜在跨平台和易用性,适合个人桌面偶尔用两三台虚拟机的情况,如果管理数量超过3台,建议直接上KVM。
虚拟机没有图形界面,如何远程登录管理?
优先用SSH,虚拟机安装openssh-server后,宿主机直接ssh 用户名@虚拟机IP,如果是NAT网络,虚拟机IP每次可能变化,可以在宿主机上配置固定IP并在/etc/hosts里做映射,需要图形界面时,用X11转发执行GUI程序即可,无需整个桌面远程。
宿主机内存不够,怎么保证多个虚拟机不卡顿?
先看每台虚拟机的真实内存占用,用virt-top按内存排序,然后移除闲置虚拟机的不必要内存分配,开启KSM内核同页合并:
echo 1 | sudo tee /sys/kernel/mm/ksm/run
如果多台虚拟机运行相同的操作系统和软件,KSM能节省相当一部分内存,这个功能在Ubuntu重启后失效,需要设置开机自动执行。
多虚拟机管理的核心不在于单个工具用得多熟练,而在于建立一套可复用的流程,从基础环境到克隆模板,再到监控和备份,把这套链路跑通后,你管理的不是一台台孤立的虚拟机,而是一个完整的资源池,下次再有人问你怎么管理五台以上虚拟机,你可以直接告诉他:用virsh加脚本,十分钟搞定。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/612064.html





