在RHEL及其衍生发行版上做虚拟化运维,libvirt几乎是绕不开的话题。它不仅提供了统一的虚拟化管理接口,还把KVM、QEMU、LXC等多种虚拟化技术封装成一致的操作方式,让管理员不必直接面对底层细节。这篇文章将从架构入手,逐步讲解libvirt的核心概念、virsh的日常操作以及存储与网络管理,帮助你建立一套完整的虚拟机运维思路。

一、libvirt的架构与核心概念
libvirt采用C/S架构,主要由三部分组成:客户端工具(virsh、virt-manager等)、守护进程libvirtd以及底层驱动。管理员通过客户端发出指令,libvirtd负责接收请求并调用对应的 Hypervisor 驱动完成实际操作。这种分层设计的好处在于,无论底层是KVM、Xen还是容器,上层命令完全一致,大大降低了学习成本。
理解libvirt必须掌握几个核心概念。第一是域(Domain),也就是我们常说的虚拟机实例,每个域对应一份XML定义文件,默认存放在/etc/libvirt/qemu/目录下。第二是存储池(Storage Pool)和存储卷(Volume),前者是宿主机上的存储资源集合,后者是池中的具体磁盘镜像。第三是虚拟网络,libvirt默认会创建一个名为default的NAT网络,供虚拟机对外通信。
安装libvirt相关组件非常简单,在RHEL上执行以下命令即可:
# 安装虚拟化平台及工具 dnf install -y qemu-kvm libvirt virt-install virt-manager # 启动并设置开机自启 systemctl enable --now libvirtd # 验证安装结果,确认KVM可用 virt-host-validate qemu
如果virt-host-validate输出中出现多条FAIL,常见原因是BIOS中没有开启VT-x或AMD-V虚拟化支持,需要先到硬件层面解决,否则后面所有操作都无从谈起。
二、virsh命令:虚拟机生命周期管理
virsh是libvirt自带的命令行管理工具,也是运维自动化的基础。相比图形界面的virt-manager,virsh可以脚本化执行,特别适合在生产环境中批量操作。一台虚拟机从创建到销毁的完整生命周期,都可以通过virsh完成。
创建虚拟机推荐使用virt-install,它会自动生成XML定义并注册到libvirt:
virt-install \ --name=webserver \ --vcpus=2 \ --memory=4096 \ --disk path=/var/lib/libvirt/images/webserver.qcow2,size=40,format=qcow2 \ --cdrom=/var/lib/libvirt/images/rhel-server.iso \ --network network=default \ --graphics vnc,listen=0.0.0.0 \ --os-variant=rhel9.0
虚拟机创建完成后,日常管理离不开下面这组高频命令:
# 查看所有虚拟机(含未运行的) virsh list --all # 启动、正常关机、强制断电 virsh start webserver virsh shutdown webserver virsh destroy webserver # 设置虚拟机随宿主机开机自启 virsh autostart webserver # 查看虚拟机详细信息和VNC端口 virsh dominfo webserver virsh vncdisplay webserver
需要强调的是,shutdown是优雅关机,依赖虚拟机内的ACPI服务;而destroy相当于直接拔电源,可能导致文件系统损坏,只应在虚拟机无响应时作为最后手段使用。如果发现shutdown不生效,多半是客户机没有安装acpid服务。
修改虚拟机配置时,推荐使用virsh edit而不是直接编辑XML文件,因为edit会在保存时做语法校验,并自动处理版本兼容问题。修改内存、CPU数量的示例如下:
# 在线增加内存(需XML中配置maxMemory) virsh setmem webserver 6G --live # 修改CPU热插拔上限后调整数量 virsh setvcpus webserver 4 --live --maximum virsh setvcpus webserver 4 --live
三、快照、克隆与迁移的实战要点
快照功能在系统升级、补丁测试前非常有用。libvirt支持内部快照和外部快照两种方式:内部快照将数据保存在qcow2镜像文件内,配置简单但性能开销较大;外部快照则基于overlay镜像实现,写入性能更好,是生产环境的首选。
# 创建快照 virsh snapshot-create-as webserver before_upgrade \ --description "升级前备份点" # 查看快照列表与详细信息 virsh snapshot-list webserver virsh snapshot-info webserver before_upgrade # 回滚到指定快照(会丢弃之后的数据) virsh snapshot-revert webserver before_upgrade # 删除不再需要的快照 virsh snapshot-delete webserver before_upgrade
克隆虚拟机可以使用virt-clone工具,它会对磁盘镜像做完整复制并自动修改MAC地址等唯一性信息,适合快速搭建测试集群:
virt-clone \ --original webserver \ --name webserver-clone \ --file /var/lib/libvirt/images/webserver-clone.qcow2
当需要把虚拟机从一台宿主机迁移到另一台时,可以使用virsh migrate。在线迁移要求两台宿主机CPU型号相近、存储共享(如NFS),且时间同步。命令示例如下:
# 在线迁移到目标主机 virsh migrate webserver qemu+ssh://dest-host/system \ --live --persistent --undefinesource --verbose
其中--live表示不停机迁移,--persistent会在目标主机上保留虚拟机定义。迁移过程中的停顿时间取决于内存脏页的同步速度,网络带宽越充足,业务感知越小。
四、存储池与虚拟网络管理
libvirt对存储的管理是池和卷两级结构。默认安装后会有一个dir类型的default池,指向/var/lib/libvirt/images。实际生产中,我们常常需要基于NFS、LVM或iSCSI建立池,实现集中存储。以下是以LVM卷组为基础创建存储池的示例:
# 定义基于LVM的存储池 virsh pool-define-as vg_vms logical --source-name vg_vms \ --target /dev/vg_vms # 启动池并设置自启 virsh pool-start vg_vms virsh pool-autostart vg_vms # 在池中创建一个100G的卷 virsh vol-create-as vg_vms vm_db_disk 100G # 查看池和卷的信息 virsh pool-info vg_vms virsh vol-list vg_vms
网络方面,除了默认的NAT模式,桥接模式在生产环境中更为常用,它让虚拟机直接接入物理网络,获得与宿主机同网段的IP地址。可以先在宿主机上创建网桥,再让虚拟机的虚拟网卡挂接到桥上:
# 用nmcli创建桥接设备br0并绑定物理网卡 nmcli con add type bridge con-name br0 ifname br0 nmcli con add type bridge-slave con-name br0-port0 \ ifname enp3s0 master br0 nmcli con up br0 # 将虚拟机的网卡改为桥接模式 virsh edit webserver # 将接口部分的XML修改为: # <interface type='bridge'> # <source bridge='br0'/> # <model type='virtio'/> # </interface>
这里顺便提一句,网卡型号尽量选择virtio半虚拟化驱动,相比传统的e1000模拟网卡,吞吐量可以提升数倍,CPU占用也明显更低。磁盘同样建议使用virtio总线。
五、常见问题排查思路
虚拟化运维中遇到问题,建议按顺序排查。首先看libvirtd服务状态和日志,日志文件位于/var/log/libvirt/qemu/虚拟机名.log,虚拟机启动失败的原因几乎都能在这里找到。其次是SELinux,RHEL默认启用SELinux后,非标准路径下的镜像文件可能因为上下文不对而无法启动,用ls -Z检查并执行restorecon -Rv修复即可。
另一个高频问题是虚拟机时钟漂移。宿主机和虚拟机都要启用chronyd做时间同步,虚拟机XML中建议将时钟元素配置为rtctimer,并开启 hv_timer 相关特性。如果虚拟机网络不通,可以用virsh net-dhcp-leases default查看DHCP分配情况,再检查宿主机的iptables转发规则和/proc/sys/net/ipv4/ip_forward是否开启。
掌握libvirt并不是背熟几十条命令,而是理解它的分层模型和XML定义体系。当你能读懂一份完整的域XML文件,能够熟练运用快照、克隆、迁移这些能力组合出适合业务的运维方案时,才算真正迈进了RHEL虚拟化进阶的大门。建议在日常工作中多用virsh dumpxml导出现有虚拟机的配置作为参考模板,逐步积累属于自己的一套标准化部署脚本。