Fedora作为Red Hat生态中的社区发行版,对KVM虚拟化支持非常完善。libvirt提供了一套统一的抽象层,让用户无需直接调用QEMU命令即可完成虚拟机创建、修改、迁移等操作。本文将从安装配置、生命周期管理、网络与存储、快照克隆以及故障排查几个方面,系统介绍在Fedora上使用libvirt管理虚拟机的完整方法。

安装与启用libvirt服务
Fedora安装libvirt通常通过dnf包管理器完成。推荐安装@virtualization软件组,该组包含QEMU、KVM内核模块、libvirt守护进程以及virt-manager图形工具。执行安装命令后,还需要确认当前用户属于libvirt组,否则普通用户无法通过virsh命令管理虚拟机。可以使用groups命令检查用户组成员,若不在组内则使用usermod -aG libvirt 用户名添加,添加后需要重新登录才会生效。
sudo dnf install @virtualization sudo usermod -aG libvirt $USER newgrp libvirt
libvirt的服务体系在Fedora中由systemd管理。主守护进程名为libvirtd.service,但现代版本还启用了virtqemud.socket等套接字激活单元。安装完成后需要启用并启动服务,同时建议设置开机自启。virt-manager图形界面依赖libvirt-glib和virt-viewer等库,使用图形工具时需要额外安装。此外,Fedora默认的SELinux策略允许libvirt访问/var/lib/libvirt/images目录,但自定义路径需要手动调整文件上下文,否则虚拟机可能无法读取磁盘镜像。
sudo systemctl enable --now libvirtd sudo systemctl status libvirtd sudo virsh version
使用virsh管理虚拟机生命周期
virsh是libvirt提供的命令行客户端,几乎可以完成所有管理操作。日常最常用的命令包括list查看运行中的虚拟机,list --all查看全部虚拟机(包括关机状态),start启动虚拟机,shutdown优雅关闭,destroy强制断电,undefine删除虚拟机定义。这里需要理解域(domain)的概念,一个域对应一台虚拟机,域的名称在定义时确定,后续操作都通过该名称引用。
virsh list --all virsh start fedora-vm virsh shutdown fedora-vm virsh destroy fedora-vm virsh undefine fedora-vm --remove-all-storage
创建虚拟机可以直接使用virt-install命令,指定名称、内存大小、vCPU数量、磁盘位置和安装源。例如从ISO镜像安装,使用--cdrom和--disk参数。另一种更可控的方式是先编写XML域文件,再通过virsh define导入。XML文件是libvirt描述虚拟机的核心,包含设备定义、启动顺序、网络接口等所有配置。修改XML后需要重新定义并重启虚拟机才能生效。直接使用virsh edit命令可以打开默认编辑器修改当前运行配置,保存后libvirt会自动校验语法。
<domain type='kvm'>
<name>fedora-vm</name>
<memory unit='GiB'>4</memory>
<vcpu placement='static'>2</vcpu>
<os>
<type arch='x86_64'>hvm</type>
<boot dev='hd'/>
</os>
<devices>
<disk type='file' device='disk'>
<driver name='qemu' type='qcow2'/>
<source file='/var/lib/libvirt/images/fedora-vm.qcow2'/>
<target dev='vda' bus='virtio'/>
</disk>
<interface type='network'>
<source network='default'/>
<model type='virtio'/>
</interface>
</devices>
</domain>
配置虚拟机网络
libvirt的默认网络使用NAT模式,通过虚拟网桥virbr0为虚拟机提供网络。虚拟机可以通过NAT访问外部网络,但外部主机无法直接访问虚拟机,这在搭建服务器或测试环境时会带来不便。对于需要局域网直连的虚拟机,应该配置桥接网络。Fedora上桥接需要创建网桥接口br0,并将物理网卡加入该网桥。使用NetworkManager的nmcli命令可以快速完成桥接配置。
nmcli connection add type bridge ifname br0 nmcli connection add type ethernet slave-type bridge con-name bridge-eth0 ifname eth0 master br0 nmcli connection up br0
桥接网络配置完成后,需要修改虚拟机XML中的网络接口类型,将原来的type='network'改为type='bridge',并指定br0作为桥接设备。修改后需要重启虚拟机或使用热插拔方式更新网卡。libvirt还支持macvtap模式,适合不希望创建网桥的场景,通过物理网卡直接转发数据帧。对于需要隔离的网络,可以自定义NAT网络池,使用virsh net-define和net-start管理。Firewalld需要放行相应接口的流量,否则桥接后虚拟机可能无法通信。
<interface type='bridge'> <source bridge='br0'/> <model type='virtio'/> </interface>
存储池与磁盘镜像管理
libvirt将存储抽象为存储池(pool)和卷(volume)。Fedora默认存储池default指向/var/lib/libvirt/images目录。可以使用virsh pool-list查看存储池,pool-autostart设置开机自动启动。创建新存储池可以用virsh pool-define-as,指定类型为dir、lvm或nfs等。卷的创建使用virsh vol-create-as,指定大小和格式(qcow2、raw等)。qcow2格式支持稀疏分配和快照,是虚拟机磁盘的常用选择。
virsh pool-list --all virsh pool-autostart default virsh pool-define-as --name vms --type dir --target /data/vms virsh pool-start vms virsh vol-create-as vms disk1.qcow2 20G --format qcow2
磁盘镜像扩容方面,qcow2格式支持在线扩容,使用qemu-img resize命令增加虚拟磁盘大小,但需要进入虚拟机内部扩展文件系统(例如使用growpart和resize2fs)。添加新的虚拟磁盘到虚拟机可以通过virsh attach-disk命令,可以临时挂载或永久写入配置。存储池权限问题常与SELinux相关,如果自定义目录不在默认路径,需要执行chcon -R -t virt_image_t或使用semanage fcontext设置正确上下文,否则虚拟机启动时会报权限拒绝错误。
快照与克隆操作
libvirt支持内部快照和外部快照两种方式。内部快照将状态保存在同一个qcow2文件中,使用virsh snapshot-create-as命令创建,可以包含内存状态(--memspec)和磁盘状态。外部快照生成新的qcow2文件,原文件变为只读,适合备份和回滚。快照管理命令包括snapshot-list查看快照列表,snapshot-revert回滚到指定快照,snapshot-delete删除快照。内部快照创建和恢复速度较快,但会随着快照数量增加影响性能;外部快照更利于备份和链式管理。
virsh snapshot-create-as fedora-vm snap1 "before update" --disk-only virsh snapshot-list fedora-vm virsh snapshot-revert fedora-vm snap1 virsh snapshot-delete fedora-vm snap1
虚拟机克隆可以通过virt-clone命令快速复制现有虚拟机,自动生成新的MAC地址和磁盘镜像文件。克隆前需要关闭源虚拟机,并且源磁盘格式最好为qcow2,否则克隆生成的磁盘可能无法正常启动。克隆后的虚拟机需要修改主机名、网络配置等避免与源机冲突。对于模板化部署,可以结合cloud-init和virt-sysprep进行系统清理,移除SSH密钥、网络配置等个性化信息,使克隆出的虚拟机进入初始化流程。
virsh shutdown fedora-vm virt-clone --original fedora-vm --name fedora-vm-clone --file /var/lib/libvirt/images/fedora-vm-clone.qcow2 virsh start fedora-vm-clone
SELinux与常见故障排查
Fedora默认启用SELinux,虚拟机镜像和配置目录如果不在默认路径,可能遇到权限拒绝错误。可以通过ausearch -m avc -ts recent查看SELinux拒绝日志,使用restorecon或semanage fcontext设置正确上下文。常见错误包括cannot open /dev/kvm、permission denied等,前者通常是因为KVM内核模块未加载或当前用户不在kvm组,后者则与文件权限或SELinux上下文有关。检查ls -l /dev/kvm和groups输出可以快速定位组权限问题。
ausearch -m avc -ts recent ls -l /dev/kvm groups sudo semanage fcontext -a -t virt_image_t "/data/vms(/.*)?" sudo restorecon -R /data/vms
日志排查是解决虚拟化问题的关键。使用virsh list --all确认虚拟机状态,journalctl -u libvirtd查看libvirt守护进程日志,/var/log/libvirt/qemu/目录保存各虚拟机详细运行日志。使用virt-install安装时添加--debug参数可以输出额外调试信息。综合运用这些手段,再配合virsh dominfo查看虚拟机详细信息,大多数启动失败、网络不通、存储异常的问题都能快速定位和解决。
libvirt在Fedora上的应用远不止上述内容,但它为虚拟化资源提供了统一、稳定的管理接口。掌握命令行与XML配置的组合用法,可以让你在不依赖图形界面的情况下高效管理多台虚拟机,也为后续引入更高层的编排工具打下坚实基础。
Fedora libvirt虚拟机管理KVM虚拟化修改时间:2026-08-23 15:57:44