1. 为什么我不建议你一开始就装 virt-manager
先说结论:virt-manager 只是图型化管理层,决定能不能用的核心是底层 KVM 和 libvirt。我在 Ubuntu 上反复装过它,头两次全部失败,原因是搞混了“安装 virt-manager”和“让 KVM 可用”这两件事。你敲apt install virt-manager之后桌面会出现图标,但点开就会报错“Unable to connect to libvirt”,这种体验基本劝退所有新手。
virt-manager 是个老牌虚拟机管图型界面。它的全称是 Virtual Machine Manager,底层依赖 libvirt 连接 QEMU/KVM,能够创建虚拟机、管理存储池、配置网络、调整资源、查看图形界面。严格来说,它替代不了你已经知道的那套工作流,而是给 KVM 套上一件容易穿的外衣。适合的场景很固定:开发环境隔离、本地跑异构 Linux 发行版、测试系统镜像、跑 Windows 体验版,以及在不出内网的环境中搭一套小规模虚拟实验室。
它解决的问题很直接:不想记 virsh 命令,又需要比 VirtualBox 更贴近硬件虚拟化的能力。KVM 不像 VirtualBox 那样装完即用,涉及设备直通、嵌套虚拟化、网络桥接时,没有图形界面操作系统的人会很痛苦。virt-manager 就是把 libvirt 的能力用图形形式暴露出来,底层该配的还是一条都不能少。
我见过不少人把 virt-manager 和 KVM 当成同一个东西。实际上,virt-manager 只是一个客户端,服务端是 libvirtd;真正提供虚拟化能力的是 KVM 内核模块和 QEMU。理解这三者的关系,再往下装就不会踩那么多坑。
这篇文章面向两类人:一是刚接触 Linux 虚拟化、希望有一台完整虚拟机拿来折腾的环境搭建者;二是从 Windows 平台迁过来、之前用 VMware Workstation,想在 Ubuntu 上获得类似体验的用户。如果你只是想要一个完全隔离的桌面系统,不关心资源利用率和稳定性,那 VirtualBox 可能更省事。但如果你追求虚拟机性能,或者想认真管理多台机器的 CPU、内存、磁盘,virt-manager 这套组合就是正路。
2. 安装之前必须完成的几项确认
2.1 CPU 虚拟化扩展到底开没开
KVM 能不能跑,完全看 CPU 支不支持虚拟化扩展。Intel 对应 VT-x,AMD 对应 SVM。绝大多数现代 CPU 都带这个功能,问题往往出在 BIOS 里默认没开启。尤其是一些品牌机的出厂默认设置会把虚拟化选项锁掉,或者在 Windows 休眠后直接不加载。
在 Ubuntu 终端里执行下面这条命令,检查 CPU 虚拟化标志是否存在:
egrep -c '(vmx|svm)' /proc/cpuinfo数字为 0 说明没开启,大于 0 说明已支持。也可以使用lscpu,在输出里找 “Virtualization” 这一段:
lscpu | grep Virtualization如果输出是VT-x或AMD-V,说明 CPU 层面没问题;如果什么都没有,需要重启进 BIOS,找到 Intel Virtualization Technology 或 SVM Mode,手动改为 Enabled。这块不做,后面装完 virt-manager 会一直报“KVM is not available”,按什么都没反应。
2.2 确认当前 Ubuntu 版本和内核状态
不同 Ubuntu 版本对虚拟化包的默认行为差异很大。Ubuntu 22.04 LTS 和 24.04 LTS 我都实测过,基本上装完系统自带内核、更新到最新源之后,KVM 模块就已经编译在内核里了。你只需要确认内核模块没有被屏蔽:
ls /dev/kvm如果看到/dev/kvm文件,说明内核已经加载好 KVM 模块。如果提示文件不存在,多半是内核模块没被加载,先手动加载一下:
sudo modprobe kvm_amd或根据 CPU 厂商选择:
sudo modprobe kvm_intel加载成功之后,再次检查/dev/kvm,还是没有则可能需要安装cpu-checker来查看完整状态:
sudo apt install cpu-checker sudo kvm-okkvm-ok的输出很直观,直接告诉你 KVM 加速能不能用。我在一台老款 AMD 机器上遇到过/dev/kvm存在但 kvm-ok 显示不支持的情况,原因是 BIOS 里 SVM 被锁,解决之后才能正常使用。
2.3 用户组权限提前处理
libvirt 默认要求执行用户必须属于libvirt或kvm组,否则 GUI 里所有操作都会被权限卡住。安装前先把自己的账户加入组:
sudo usermod -aG libvirt,kvm $USER需要注意的是,组名在不同版本里可能不一样,Ubuntu 上最常见的两个组是libvirt和libvirt-qemu。如果后面发现还是没权限,再检查一下/var/lib/libvirt的目录权限。
这个操作必须有重新登录或重启 X session 才会生效。很多人装完 virt-manager 后直接打开,连接 libvirt 提示“authentication failed”,其实就是一个原因:当前 shell 没有加载新组身份。临时解决办法是执行newgrp libvirt,但副作用是可能初始化一个新的 shell 环境,建议还是注销重新登录最干净。
3. virt-manager 的安装过程与包依赖拆解
3.1 用 APT 安装完整依赖链
Ubuntu 官方软件源里已经收录了 virt-manager,不需要加第三方 PPA。这一步对新手最友好,对老手也足够稳。直接执行:
sudo apt update sudo apt install virt-managerAPT 会自动拉取 virt-manager 以及它依赖的 python3-libvirt、libvirt-daemon-system 等核心组件。libvirt-daemon-system 这个包很重要,它包含libvirtd系统守护进程和默认网络配置文件,不装它,virt-manager 就是一个空壳。
如果你是从最小系统开始,建议一次性装齐下面这些包,避免后面二次排查:
sudo apt install virt-manager libvirt-daemon-system libvirt-clients qemu-kvm qemu-system-x86 bridge-utilslibvirt-clients提供 virsh 命令行工具,排查问题时非常有用qemu-system-x86是完整版 QEMU 模拟器包bridge-utils用于后续创建桥接网络
如果你的系统桌面环境只保留最小组件,那 virt-manager 还需要 GTK 相关依赖。APT 会自动处理,不需要手动干预。
3.2 安装后先验证 libvirtd 状态
virt-manager 安装完成后,第一件事不是打开它,而是验证 libvirtd 守护进程是不是活着:
systemctl status libvirtd如果显示未运行,直接启动并设置开机自启:
sudo systemctl enable --now libvirtd也可以用service命令,但在现代 Ubuntu 上 systemd 是唯一正确的服务管理方式。这里有个细节:Ubuntu 默认 socket 激活机制下,即使 libvirtd 显示是 inactive,它也可能是在等待连接时自动启动。用systemctl status看到 inactive 不代表出了问题,关键是看有没有报错日志。
确认无误后再检查默认虚拟网络是否正常:
virsh net-list --all正常情况下至少能看到default网络,状态是 active。如果 default 网络缺失或甚至没定义,就需要手动激活或重建。
3.3 通过命令行方式安装的备选方案
对于不关心图形界面,只想快速验证虚拟机能不能用的人,可以直接使用virsh交互方式,不需要安装 virt-manager。但既然标题是 virt-manager,我建议还是老老实实装上 GUI 全套。
反过来,如果装的桌面环境连 GTK 都缺失,而且网络环境不允许大体积包下载,也可以只装 minimal 版 virt-manager,手动跳过几个不需要的推荐包:
sudo apt install --no-install-recommends virt-manager但我不推荐这么做,因为桌面版 virt-manager 通常还需要python3-gi和python3-gi-cairo,这些补起来很痛苦。保证网络带宽充足的话,直接安装完整包是最省心的方案。
4. libvirtd 与网络的初始化细节
4.1 vhost-net 模块与性能底座
KVM 虚拟机的高性能写入,依赖内核的 vhost-net 模块。它允许虚拟机绕过 QEMU 用户态进程直接把网络包送到硬件层,显著降低延迟。在运行虚拟机之前检查一下:
lsmod | grep vhost输出应该包含vhost,vhost_net这些条目。发现没有的话,加载一下:
sudo modprobe vhost_net在 Ubuntu 默认配置里,vhost-net 模块通常随 KVM 模块一起加载,但如果你用的是 VPS 或定制内核,需要手动处理。这不算安装 virt-manager 的必需步骤,但对后续虚拟机网络性能影响很大。
4.2 默认 NAT 网络为什么够用
virt-manager 安装后默认自动定义了一个defaultNAT 网络,网段通常是 192.168.122.0/24。虚拟机通过这个网络访问外部互联网,外部机器无法直接访问虚拟机内部地址。这种模式适合大多数本地测试环境。
如果你希望虚拟机可以像内网普通机器一样,让外部直接访问它的 IP,就需要改成桥接模式。这个操作可以在 virt-manager 图形界面里完成:打开虚拟网络详细信息,把 IPv4 配置改为桥接,并选择你宿主机实际使用的网卡。但要注意,Ubuntu 桌面版默认按 Netplan 管理网络,桥接模式需要在 Netplan 配置里预先创建好 br0 接口,再在 virt-manager 中引用。否则网络会起不来,虚拟机处于 no network 状态。
4.3 缺了 python3-gi 导致界面无法启动
裁判式检查完一切正常后,双击 virt-manager 图标却没有任何反应,这是最让人崩溃的瞬间。原因一般是缺少运行时依赖。在终端启动 virt-manager:
virt-manager如果报错出现ModuleNotFoundError: No module named 'gi',就用下面的命令补上依赖:
sudo apt install python3-gi gir1.2-vte-2.91 gir1.2-gtk-vnc-2.0这几个包缺一不可。GTK 版的 virt-manager 依赖 VTE 终端组件和 VNC 视图组件,缺则无法初始化图形界面。我在某台精简桌面版上踩过这个坑,报错信息甚至没有明确告诉你缺哪个模块,追踪它花了半小时。
4.4 图形化打开后的连接配置
virt-manager 首次打开,左侧列表只显示一个 QEMU/KVM 连接。双击它,如果显示连接失败,需要进入 Edit -> Connection Details,确认连接 URI 不为空。通常默认值qemu:///system是正确选择,它对应 system 级别的 libvirtd,权限要求高,但能管理所有保真功能。另外一个选项是qemu:///session,用户级会话,适合不依赖系统权限的测试,但缺少部分网络能力。
普通用户场景,建议始终使用qemu:///system。使用前确认你的用户已经在 libvirt 组里,否则每次都要 sudo 才能打开 virt-manager,容易在文件权限上翻车。
5. 用 virt-manager 创建第一台虚拟机
5.1 新虚拟机向导的关键选项
点击左上角计算机图标创建虚拟机,向导会让你选择安装方式。这里通常有三个入口:
- 本地安装介质(ISO 镜像,最常见)
- 网络安装(PXE / HTTP URL)
- 导入现有磁盘镜像
本地 ISO 方式最容易理解。你需要在系统中提前准备好 ISO 文件,建议把镜像放在/var/lib/libvirt/images/目录下,或直接指定文件路径。放开权限的方法可以在终端执行:
sudo chmod 644 /path/to/your.iso镜像路径最好不要有中文和空格,libvirt 对路径转义处理不够人性化,容易出莫名其妙的问题。
接着进入资源选择页。CPU 和内存分配是创建时的核心决策点:不要把所有物理资源全部塞给虚拟机,否则宿主机自己会卡死,鼠标都可能冻结。我一般会留出 1 核 2G 给宿主机,CPU 分配不超过物理线程数减一,内存不超过物理内存一半。
5.2 存储池、磁盘格式与性能取舍
默认安装会生成 qcow2 格式磁盘,支持稀疏分配和快照。新手可能喜欢按“最大磁盘大小”来分配,实际发生写入时才占用物理磁盘,但 qcow2 有额外的写放大,性能比起裸设备(raw)差一些,胜在功能齐全。
如果你对性能敏感,可以直接选择 raw 格式或分配一块物理磁盘给虚拟机,后者更接近真实硬件环境。但一旦选错存在后不太能轻松迁移,因为 raw 格式的磁盘无法使用 libvirt 快照功能,只能靠底层文件系统快照,折腾成本高。
建议第一次体验直接使用默认 qcow2,原因是它能让你用快照功能“后悔药”。等后面熟悉了快照、克隆、迁移这些高级操作,再切换到底层性能优化模式。
5.3 图形界面和显示协议
virt-manager 默认提供 Spice 协议,用于虚拟机的图形输出和键鼠交互。如果希望性能更好,可以把显示协议改成 VNC。在绝大多数 Ubuntu 桌面主机上,默认的 Spice 已经非常流畅,不需要额外配置。
启用“VirtIO 视频设备”选项也可以提升图形响应速度。针对 Linux 虚拟机,virtio GPU 是相对现代且高效的解决方案,但某些老发行版镜像不含对应驱动,会显示黑屏或低分辨率,这就需要退回用 QXL 或 VGA。
5.4 网卡与安装后初始设置
虚拟机的默认网卡类型通常配置为 virtio,速度比 e1000 模拟网卡好得多。如果你的系统镜像缺少 virtio 驱动,安装界面会卡在“找不到网络设备”一步。遇到这种情况,先把网卡型号改为 e1000e 或 rtl8139,等系统装好后再装上 virtio 驱动,再改回 virtio 网卡。
安装完成并启动虚拟机后,先把虚拟机内分辨率调出来,再验证网络能不能通。最简单的方式:
ping -c 4 192.168.122.1能 ping 通宿主机的 NAT 网关地址,说明网络链路没问题;ping 不通,先查宿主机的 default 网络状态,再看虚拟机的网卡是否被系统正确识别。
6. 我踩过的坑和排查心得
6.1 “Unable to connect to libvirt” 的真相
这个报错信息是 virt-manager 最常见的错误弹窗。原因可以归纳为三类:libvirtd 没在运行、用户权限不足、URI 配置错误。
先按这个顺序排查:
systemctl status libvirtd sudo systemctl restart libvirtd virsh urivirsh uri返回的内容如果是qemu:///system,说明 URI 没有问题。再执行virsh list --all,如果依然提示“failed to connect”,多半是账号没加入 libvirt 组,或者/var/run/libvirt/libvirt-sock的 sock 权限异常。可以用sudo usermod -aG libvirt $USER修复组权限,然后重新登录。
6.2 虚拟机创建成功但启动不完全
表现是点击“开机”按钮后,虚拟机好像启动了,但图形窗口一直黑屏。解决方法是从两个方向排查:
- CPU 模式是否设置了
host-passthrough。某些 CPU 特性在模拟 CPU 模式下不能正常引导,尤其是 Win10/11 系统 - 检查
/var/log/libvirt/qemu/下的日志文件,重点看 QEMU 命令行参数有没有异常
通过 virt-manager 打开虚拟机的 XML 配置,在<cpu>段里把 mode 改为host-passthrough,能解决大部分兼容性问题。要记得保存后重启虚拟机。
6.3 桥接网络引发宿主断网
桥接模式是最容易导致宿主机和虚拟机同时断网的坑。配置桥接前,务必先备份 Netplan 配置:
sudo cp /etc/netplan/01-network-manager-all.yaml /etc/netplan/01-network-manager-all.yaml.bak然后在 Netplan 里把物理网卡的 dhcp 配置迁移到桥接网卡上:
network: version: 2 renderer: networkd ethernets: enp3s0: dhcp4: no bridges: br0: interfaces: [enp3s0] dhcp4: yes执行sudo netplan apply后立刻检查:
ip a如果 br0 没有拿到 IP,马上回滚备份文件并重新 apply。我的经验是,桌面版 Ubuntu 使用 NetworkManager 管理网络,直接用 networkd 配置有时会冲突,最稳的办法还是海尔点在 virt-manager 里用 libvirt 自带的网桥。
6.4 嵌套虚拟化与运行性能
在虚拟机里再跑虚拟机的场景,需要开启嵌套虚拟化。默认 KVM 不允许嵌套,需要在宿主机加载模块时显式打开:
echo 'options kvm_intel nested=1' | sudo tee /etc/modprobe.d/kvm_intel.conf sudo modprobe -r kvm_intel sudo modprobe kvm_intelIntel 和 AMD 的具体参数不一样,AMD 对应的是kvm_amd。改完以后用cat /sys/module/kvm_intel/parameters/nested查看返回值,1 表示开启成功。
这个功能对想玩虚拟化嵌套实验的人特别有用,但对绝大多数普通用户来说,开启嵌套会增加宿主的 hypervisor 开销,如果只是为了装个 Linux 桌面,没必要开。
6.5 磁盘空间逐渐被吃满
qcow2 镜像在使用中会不断增长,删除文件后不会自动回收空间,因为虚拟机的块设备仍然占用已标记的簇。想释放空间,需要在虚拟机内先执行fstrim或virt-sparsify。宿主侧的操作也很直接:
virt-sparsify --in-place /var/lib/libvirt/images/ubuntu.qcow2这个工具不是随 virt-manager 一起安装的,需要单独安装 libguestfs-tools。运行之前确保虚拟机是关机状态,否则镜像格式会被破坏。我遇到过因为在运行状态下做了 sparsify 导致镜像损坏,最后只能从备份恢复,别的小机器没有备份就只能重建。
7. virt-manager 比你想的更省心
装完 virt-manager 之后,还能利用它做几件容易被忽略但很实用的事:克隆虚拟机、创建虚拟机模板、导出 XML、用快照做系统回滚。
克隆是创建多台测试机器最省事的方式。在 GUI 里右键点击虚拟机,选择克隆,它会自动处理网卡 MAC 和主机名冲突问题,不用手工编辑配置文件。唯一要留意的是克隆出来的虚拟机不应该同时开机,如果两台机器拥有相同的机器 ID 或 SSH 主机密钥,会有麻烦,建议克隆完成后重新生成各自的machine-id和 SSH 密钥。
快照功能对应虚拟机磁盘的一种状态保存方式,类似玩游戏时的存档。创建快照:
- 在 virt-manager 界面中点击“拍摄快照”按钮
- 给快照命名并加上描述
- 系统状态和磁盘状态都会被保存
恢复快照的时机也很重要,必须在虚拟机关机,或者至少是部分停止状态下操作,否则数据不一致。快照数量不宜过多,否则 qcow2 变大,读写性能下降明显。
导出和导入 XML 对应的是修改配置文件的能力。virt-manager 菜单里的“查看”->“详情”能够看到当前虚拟机的 XML,你可以直接修改启动参数、添加 URI、调整 PCI 地址等。但修改前一定要备份原有 XML,很多不可逆的破坏都由手误导致。我一般习惯改之前导出一份完整副本:
virsh dumpxml vm-name > vm-name.xml.bak再放心地去改。
8. 最后补充几条我实测后觉得值得记住的建议
在 Ubuntu 上装 virt-manager 这件事,本身难度不大,真正容易出错的是对虚拟化权限体系的认知。很多人装上图标点不开,就认为是软件坏了,其实是用户组和守护进程的问题。
我建议第一次接触这套工具的人,按这个顺序走一遍:
- 确认 CPU 支持并开启虚拟化
- 更新系统和软件源
- 安装 virt-manager 及核心依赖
- 把自己加入 libvirt 组并重新登录
- 验证 libvirtd 运行正常
- 打开 virt-manager,创建第一台虚拟机
养成“先命令行验证、再图形界面操作”的习惯。virsh list --all和virsh net-list --all两条命令,能解决 80% 的初次连接问题。
如果你想深入学习,下一步可以研究virt-install命令行创建虚拟机,它的参数比图形界面更透明,可脚本化程度高,是自动化部署的关键路径。virt-manager 适合日常管理,但批量创建和配置管理还是得靠命令行才有办法编程实现。
另外,备份习惯一定要有。我在一台测试机上通过 virt-manager 调整网络配置时,不小心把桥接信息写错,导致宿主无法通过 SSH 连接,只能回到物理终端前修复。从那以后,每次改动网络配置前都会先拍快照或导出 XML,这是花钱买来的教训。
最后多说一句,这套方案在 Ubuntu 上完全可以替代一部分商业虚拟化软件。它免费、开源、受上游项目持续维护,而且在 Linux 生态下的兼容性比商业软件更自然,适合开发环境和个人实验室。要说缺点,是对新手不太友好,界面和术语需要一点时间去理解,但解决这个问题的唯一方式就是动手多试。装好 virt-manager,创建一台虚拟机,再删掉它重新来一次,这套流程走三遍,基本就熟悉了。