
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-xAMD 对应 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-managervirt-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 nested1 | 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创建一台虚拟机再删掉它重新来一次这套流程走三遍基本就熟悉了。