第一次自己“做”KVM,最容易出现的一种情况是什么?不是命令敲不出来,而是你装完之后,发现自己根本不知道刚才那几分钟发生了什么。明明输入了一行virt-install,结果有的机器起来了,有的机器黑屏,有的机器报错;明明在图形界面里看到一个大窗口,却说不清 Host OS、Guest OS、libvirt、QEMU 之间到底是谁在干活。这篇文章会从一次最小化测试出发,把 KVM 从环境检查、组件安装、创建虚拟机到功能验收完整跑一遍,同时讲清楚那些手册里不会直接告诉你的关系:KVM 到底是不是一个软件?Guest OS 有什么用?剪贴板为什么不能互通?全屏为什么缩小不了?
需要先说明一个问题:标题里的“KVM 1.25”并不代表 KVM 有一个叫 1.25 的发行版。更合理的理解是,这是你给第一台 KVM 测试虚拟机起的名字,类似“我的第 1.25 版镜像”。KVM 作为 Linux 内核自带的虚拟化基础架构,本身没有传统意义上的“安装包版本号”。这一点如果不先建立认知,很容易在搜索资料时被各种名词带偏。
读完这篇文章,你能掌握一套完整的 KVM 最小测试流程,知道自己创建的 Guest OS 到底是干什么的,也能快速定位网络不通、剪贴板不可用、UEFI 固件缺失、全屏无法缩放这四类经典问题。
1. 先说结论:KVM 解决的是什么问题
KVM 的全称是 Kernel-based Virtual Machine,中文常翻译为“基于内核的虚拟机”。它解决的问题可以概括成一句话:在一台物理 Linux 服务器上,以接近原生性能的方式同时运行多台虚拟机。
这个“接近原生性能”是关键。
过去很多人在 Windows 上熟悉的是 VirtualBox、VMware Workstation 这类软件。它们安装简单,开箱即用,但本质上是把整个 CPU、内存、磁盘设备通过软件模拟出来,性能和隔离性都会打折扣。KVM 走的是另一条路:它直接使用 CPU 自带的硬件虚拟化扩展,比如 Intel 的 VT-x 和 AMD 的 SVM,让虚拟机里的指令可以大部分绕过软件模拟,直接在物理 CPU 上执行。
所以它的适用场景非常明确:
- 服务器虚拟化。在数据中心里用 KVM 给多台业务系统做隔离,一台物理机当好几台用。
- 开发测试环境。需要多套不同系统、不同配置环境时,用 KVM 快速创建和销毁。
- 给服务器做系统。也就是网络热搜词里提到的“通过 KVM 给服务器做系统”,这里的做法是在宿主机上通过
virt-install向虚拟机里装操作系统,而不是把 ISO 写到 U 盘再去插物理机。 - 学习虚拟化底层原理。对于想理解内核模块、设备模拟、虚拟网络的人来说,KVM 是最直接的学习材料。
初次接触的人容易误以为 KVM 是个像 VirtualBox 一样独立安装的软件。实际不是。KVM 是一个内核模块,它提供的只是 CPU 和内存层面的虚拟化能力,用户还得配合 QEMU、libvirt 这些组件才能拼出完整虚拟机。这一点直接决定你后面排错的方向。
从材料看,当前你关心的重点也都在这些方向:Guest OS 是干什么的、KVM 剪贴板互通、KVM 全屏无法缩小、UEFI 固件下载。这四类问题对应着四个模块:虚拟化基础、SPICE 客户端工具链、显卡驱动、OVMF 固件。后面都会逐个展开。
2. 必须分清楚的概念:KVM、QEMU、libvirt、Guest OS
先做一个类比。如果一台虚拟机是一辆车:
- KVM 内核模块是发动机。它负责让物理 CPU 的虚拟化扩展真正可用,是动力来源。
- QEMU 是底盘和车身。它模拟出内存条、磁盘、网卡、显卡、USB 控制器这些设备,让虚拟机看起来像一台完整电脑。
- libvirt 是调度中心。它统一管理虚拟机的创建、启动、停止、销毁,屏蔽不同虚拟化平台的差异。
- virt-manager、virt-install、virsh 是方向盘和仪表盘。它们不直接干活,而是把用户操作翻译给 libvirt。
所以 KVM、QEMU、libvirt 不是三个竞争关系的东西,而是三层配合关系。更准确的表述是:KVM 负责 CPU/Memory 虚拟化,QEMU 负责设备模拟和用户态管理,libvirt 负责统一 API 与管理层。
用表来梳理更清楚:
| 名称 | 类型 | 职责 | 常见误解 |
|---|---|---|---|
| KVM | Linux 内核模块 | 提供硬件辅助虚拟化能力 | 被误认为一个独立虚拟机软件 |
| QEMU | 用户态程序 | 模拟 CPU、内存之外的设备 | 被误认为必须单独打字使用 |
| libvirt | 守护进程+API | 统一管理虚拟机和存储网络 | 被误认为只是图形工具 |
| virt-manager | 图形前端 | 提供 GUI 操作 | 被误认为非装不可 |
| virt-install | 命令行工具 | 从命令行创建虚拟机 | 被误认为只能用于专家 |
| Guest OS | 虚拟机里运行的系统 | 承载真实业务和应用 | 被误认为和宿主机系统有关联 |
Guest OS 是什么?字面意思就是“客户机操作系统”,也就是跑在虚拟机里的操作系统。它可以是一个精简版 Linux,也可以是一套 Windows Server,甚至可以是一套网元设备的专用系统。它的作用和一台真实物理服务器上安装的操作系统没有本质区别:承载软件、服务和数据。区别只在于它运行在虚拟化层之上,可以得到快照、克隆、热迁移这些物理机不具备的能力。
用一个实际场景解释:你在一台物理服务器上装了 CentOS,同时用 KVM 启动了一台 Windows 测试机。那么 CentOS 是 Host OS,Windows 就是 Guest OS。你运行virsh list时看到的一个个名字,就是一台台 Guest OS 对应的虚拟机实例。
为什么要在 KVM 里跑 Guest OS,而不是直接往物理机里装多套系统?因为物理机只能同时运行一个系统,而虚拟化可以在一台物理机上运行多个 Guest OS。这就是服务器整合的基本逻辑。后台系统需要隔离、开发需要环境复现、测试需要快速回滚时,Guest OS 都会是比物理机更灵活的选择。
概念厘清之后,就可以开始动手了。下面的内容默认使用 Ubuntu 22.04 LTS 作为演示系统,CentOS/RHEL 系命令也会单独标注。版本细节请以你实际项目为准,本文重点演示通用思路。
3. 环境准备:先确认这台机器能不能跑 KVM
KVM 运行有一个硬性前提:物理 CPU 必须支持硬件虚拟化扩展。如果 CPU 不支持,或者 BIOS/UEFI 里没有开启相关选项,后面所有步骤都跑不起来。要避免“安装了半天结果一个虚拟机都启动不了”,环境检查阶段务必执行三件事。
第一件事:查看 CPU 是否支持虚拟化扩展。
egrep -c '(vmx|svm)' /proc/cpuinfo如果输出结果大于 0,说明 CPU 支持 Intel VT-x 或 AMD SVM。如果输出是 0,就需要进入物理机 BIOS/UEFI,找到类似 Intel Virtualization Technology、VT-d、SVM Mode 的选项并开启,然后再重新进入系统验证。这里注意,在实体机上改 BIOS 属于安全范围内的配置操作,改之前先确认这台机器可以被停机和重启,避免影响业务。
也可以用更直观的命令查看:
lscpu | grep -i virtualization在 Intel 平台上会看到Virtualization: VT-x,在 AMD 平台上会看到Virtualization: AMD-V。
第二件事:确认内核模块已经加载。
lsmod | grep kvm正常输出会包含kvm和kvm_intel或kvm_amd。如果你的内核已经加载了 KVM 模块但没有对应平台模块,则说明 CPU 虚拟化可能未被识别。可以尝试手动加载:
sudo modprobe kvm_intel或者,在 AMD 平台上:
sudo modprobe kvm_amd注意:如果宿主环境本身是一台云服务器,而且云厂商没有开启嵌套虚拟化,那么lsmod | grep kvm可能没有输出。这种环境不代表物理机硬件不支持,而是虚拟化能力没有透传给你。此时可以联系云厂商确认是否支持嵌套虚拟化,或者在本地物理机上验证。
第三件事:确认系统内存和磁盘预算。
第一次做 KVM 测试时,建议宿主机至少有 4 GB 内存和 30 GB 空闲磁盘。这 30 GB 里要预留出系统安装镜像、虚拟磁盘文件、临时快照三部分空间。如果给测试机分配 2 GB 内存,给虚拟磁盘 20 GB,那么宿主机自身内存至少还要留下 2 GB,不然物理机内存耗尽会触发 OOM,直接把宿主机搞挂。这是一个生产环境里非常容易踩的坑:所有资源都给了虚拟机,宿主机反而没有余量了。
4. 安装 KVM 全套组件
安装 KVM 不是只安装一个包。在 Ubuntu 上,推荐安装全套组件,包括内核模块、QEMU、后端管理守护进程、创建工具、图形管理工具和 UEFI 固件。
sudo apt update sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients virtinst virt-manager ovmf如果你在 CentOS/RHEL 系环境中,安装命令类似:
sudo yum install -y qemu-kvm libvirt virt-install virt-manager edk2-ovmf安装完成后,启动 libvirtd 守护进程并设置开机自启:
sudo systemctl enable --now libvirtd sudo systemctl status libvirtd如果systemctl status显示active (running),说明管理服务已经正常。
接下来要把当前用户加入 libvirt 和 kvm 用户组,否则每次执行 virsh 命令都需要加 sudo,比较麻烦:
sudo usermod -aG libvirt $(whoami) sudo usermod -aG kvm $(whoami)执行完后必须重新登录一次,用户组才会生效。如果不想重新登录,可以使用newgrp libvirt临时切换。
最后验证安装结果:
virsh version virsh list --allvirsh version会输出 libvirt 版本信息,virsh list --all应该显示空的虚拟机列表,比如:
Id Name State --------------------到这里,KVM 的软件栈已经准备好了。值得强调的一点是,安装过程本身并不复杂,真正复杂的是理解安装的这些包分别承担什么角色。如果你之后看到virsh找不到 socket,或者libvirt无法连接,大概率是守护进程没有启动,或者当前用户没有权限。不要一上来就重装系统。
5. 创建第一台 KVM 测试机(KVM1.25)
现在开始创建第一台测试虚拟机。在项目里我给它起的名字是kvm1.25。名字只是一个标识,相当于给虚拟机做标签,不影响性能,也不影响内部系统识别。
创建虚拟机有两条主路径:命令行virt-install和图形界面virt-manager。生产环境我建议优先掌握命令行,因为可以脚本化、可以参数化,后续批量创建时效率差距会非常大。
先准备一个操作系统 ISO 镜像文件。我把 Ubuntu 22.04 Server 的 ISO 放到了/opt/iso/目录。然后创建一个虚拟磁盘文件。虚拟磁盘格式我推荐用qcow2,支持写时复制、快照和稀疏文件,默认情况下不会占用全部预分配空间。
5.1 用 virt-install 创建虚拟机
下面是一份最小可用的创建命令:
sudo virt-install \ --name kvm1.25 \ --memory 2048 \ --vcpus 2 \ --disk path=/var/lib/libvirt/images/kvm1.25.qcow2,size=20,format=qcow2 \ --cdrom /opt/iso/ubuntu-22.04.3-live-server-amd64.iso \ --os-variant ubuntu22.04 \ --network network=default \ --graphics spice \ --video qxl解释一下每个参数的作用:
--name kvm1.25:虚拟机名称,以后执行virsh start kvm1.25、virsh shutdown kvm1.25时都用这个名字。--memory 2048:分配给虚拟机的内存大小,单位 MB。首次测试 2 GB 够用,生产环境按业务评估,不要贪多。--vcpus 2:分配给虚拟机的 CPU 核数。--disk path=...,size=20,format=qcow2:指定虚拟磁盘路径,预分配 20 GB,使用 qcow2 格式。--cdrom /opt/iso/...:挂载系统安装镜像。--os-variant ubuntu22.04:告诉 libvirt 针对该系统做优化。可以通过osinfo-query os查看系统支持列表。--network network=default:使用 libvirt 默认的 NAT 网络。--graphics spice:启用 SPICE 显示协议。这个参数非常重要,它决定了你能不能做剪贴板互通、无缝窗口等操作。--video qxl:使用 QXL 显卡。QXL 专门为虚拟桌面优化,配合 SPICE 能提高图形显示效率。
执行命令后,virt-install 会进入一个交互界面,让你完成系统安装。如果是在有图形界面的宿主机上执行,会弹出 virt-viewer 窗口。如果是 SSH 登录的服务器,最好在脚本里加上--graphics vnc或者使用 headless 方式。
如果当前服务器没有图形环境,推荐加两个参数:
sudo virt-install \ --name kvm1.25 \ --memory 2048 \ --vcpus 2 \ --disk path=/var/lib/libvirt/images/kvm1.25.qcow2,size=20,format=qcow2 \ --cdrom /opt/iso/ubuntu-22.04.3-live-server-amd64.iso \ --os-variant ubuntu22.04 \ --network network=default \ --graphics spice \ --video qxl \ --virt-type kvm \ --noautoconsole加--noautoconsole后,virt-install 不会自动弹出图形窗口,创建完成即返回命令行。之后你可以用 virt-manager 或者 SPICE 客户端连接过去完成安装。
5.2 用 virt-manager 启动图形界面
如果宿主机安装了桌面环境,直接启动 virt-manager:
virt-manager然后在 GUI 里点击左上角“新建虚拟机”,选择“本地安装介质”,选择 ISO,再分配内存和 CPU,最后指定磁盘即可。virt-manager 本质上调用的是与virt-install相同的底层 API,只是把操作界面图形化了。
第一次操作我不建议只看 GUI,命令行的含义更直观,排错时你也更容易理解系统在做什么。
5.3 安装 Guest OS 后的基础检查
系统安装完成后,先不要急着装业务,先做三个基础检查:
virsh list --all virsh dominfo kvm1.25 virsh dumpxml kvm1.25 | grep -E '(memory|vcpu|mac address)'如果virsh list --all能列出kvm1.25并且状态为running,说明虚拟机从 KVM 角度已经创建成功。接下来尝试从宿主机 ping 虚拟机 IP,或者通过 SSH 登录虚拟机。如果你使用的默认 NAT 网络,虚拟机通常会自动获取 192.168.122.x 网段 IP。
6. 运行结果与效果验证
创建虚拟机只是第一步,我们需要验证这台测试机是否真的可用。我建议按下面四个层面逐项验收。
第一层面:libvirt 状态验证。
virsh list --all virsh dominfo kvm1.25预期输出中有State: running、CPU(s): 2、Max memory: 2097152 KiB等信息。若状态为shut off,需要手动启动:
virsh start kvm1.25第二层面:Guest OS 网络验证。
在虚拟机内执行:
ip addr show ping -c 4 8.8.8.8如果外网通,说明默认 NAT 网络工作正常。如果内网能通,外网不通,通常是因为宿主机的iptables转发规则还没有生效,或者是内核ip_forward未开启。可以临时打开转发:
sudo sysctl -w net.ipv4.ip_forward=1第三层面:CPU 和内存资源验证。
在宿主机上执行:
virsh vcpupin kvm1.25 virsh vcpuinfo kvm1.25在 Guest OS 里执行:
lscpu free -h这里的核心判断标准是:Guest OS 看到的 CPU 数和内存数,是否与virt-install分配的参数一致。如果不一致,很可能是 virtio 驱动没加载完整,或者你没有重启 Guest OS。
第四层面:快照与回滚验证。
测试虚拟机最核心的价值之一就是可以随便折腾、出了事直接回滚。用快照测试一下:
virsh snapshot-create-as kvm1.25 --name "after-install" virsh snapshot-list kvm1.25之后再在虚拟机里改坏配置,执行:
virsh snapshot-revert kvm1.25 --snapshotname "after-install"这一步能直接证明 KVM 的快照能力是可靠的,也是后续所有实验的安全兜底。
每次验收都要有输出对比,不要只看命令“没报错”就认为成功。比如你运行virsh list,就得确认列出的是kvm1.25而不是其他残留实例。你运行free -h,就得确认 2G 内存确实被识别。实践中的“成功”必须落到可观察的指标上,否则就等于没验证。
7. 常见问题与排查思路
新手测试 KVM 时,最容易遇到下面四类问题。每一类我都会给出现象、原因、排查方式和解决方案。
| 问题现象 | 可能原因 | 排查方式 | 解决方案 |
|---|---|---|---|
虚拟机启动失败,提示/dev/kvm不存在 | CPU 虚拟化未开启或宿主机不支持 | 执行ls -l /dev/kvm,用lscpu查看虚拟化标志 | 进入 BIOS 开启 VT-x/AMD-V,或确认云厂商支持嵌套虚拟化 |
virsh list无法连接 libvirt socket | libvirtd 未启动或当前用户不在 libvirt 组 | 执行systemctl status libvirtd,执行groups查看用户组 | 启动 libvirtd,将用户加入 libvirt 组后重新登录 |
| 剪贴板无法与 Guest OS 互通 | 没有安装 SPICE 客户端工具,或显卡驱动未安装 | 在 Guest OS 中检查 spice-vdagent 进程是否存在 | 安装并启动 spice-vdagent |
| KVM 虚拟机全屏后无法缩小 | 图形驱动和窗口管理器集成缺失 | 查看是否存在 QXL 渲染异常 | 安装 qemu-guest-agent 和 spice-vdagent,切换 virtio 显卡 |
| 需要 UEFI 启动但找不到 UEFI 固件 | 宿主机未安装 OVMF 固件包 | 检查/usr/share/OVMF/目录 | Ubuntu 安装 ovmf,CentOS 安装 edk2-ovmf |
| 虚拟机可以 PING 通,但外网不通 | 宿主机未开启 IP 转发或 iptables 规则异常 | 执行sysctl net.ipv4.ip_forward | 开启 ip_forward,并确认 NAT 规则 |
下面详细展开三个最容易困惑的点。
7.1 剪贴板互通
所谓“KVM 内外剪贴板互通”,指的是在 virt-manager 打开的虚拟机窗口里,把宿主机上的文本复制粘贴到 Guest OS 里。很多人以为这应该默认可用,实际不是。
剪贴板互通依赖的是 SPICE 协议下的主机与客户机共享通道。Guest OS 里必须安装spice-vdagent,宿主机端要安装spice-vdagent和virgl等客户端库。在 Ubuntu Guest 中可以这样安装:
sudo apt install -y spice-vdagent systemctl start spice-vdagent安装后重新登录 Guest OS 桌面,剪贴板互通才会生效。对于纯命令行服务器,其实不需要剪贴板互通,直接用 SSH 即可。也就是说,这个功能主要面向桌面虚拟化场景,服务器场景可以关闭 SPICE 以减少资源开销。
7.2 全屏无法缩小
“KVM 链接服务器全屏无法缩小”这个热搜词,通常指的是使用 virt-manager 或 virt-viewer 连接远程虚拟机时,窗口切到全屏后无法退出,或者界面被强制拉伸,鼠标还被困在虚拟机里。
一般原因有两个。第一,Guest OS 没有安装增强驱动,分辨率无法动态跟随窗口调整。第二,SPICE 的 attention 键被占用,导致全屏快捷键无效。KVM 下全屏切换的默认快捷键是Ctrl+Alt+P,但如果你之前设置的是抓取鼠标热键,比如Ctrl+Alt+G,两者会出现冲突。
解决方法是:
- 安装增强组件。
sudo apt install -y spice-vdagent qemu-guest-agent在 virt-manager 菜单里找到“查看” -> “缩放显示模式”,改为“总是缩放”。
如果还是无法缩小,可以用快捷键切换全屏状态,或执行
virsh send-key向 Guest 发送键值组合。
7.3 UEFI 固件缺失
KVM 默认使用 SeaBIOS 引导,但有些操作系统要求 UEFI 启动,比如部分 Windows Server 版本或者镜像集成了安全引导的系统。如果创建虚拟机时指定了--boot uefi,宿主机却没有安装 OVMF 固件,virt-install 就会报如下错误:
ERROR Unable to find UEFI firmware解决方案是安装 OVMF。Ubuntu 上:
sudo apt install -y ovmfCentOS/RHEL 上:
sudo yum install -y edk2-ovmf安装完成后,可以在创建虚拟机时显式指定 UEFI 固件路径:
sudo virt-install \ --name kvm1.25 \ --memory 2048 \ --vcpus 2 \ --disk path=/var/lib/libvirt/images/kvm1.25-uefi.qcow2,size=20,format=qcow2 \ --cdrom /opt/iso/ubuntu-22.04.3-live-server-amd64.iso \ --os-variant ubuntu22.04 \ --boot uefi注意:UEFI 和 BIOS 引导模式会影响磁盘分区表。同一块虚拟磁盘不要在两种引导模式之间反复切换,否则容易引导失败。
8. 最佳实践与生产环境建议
测试跑通了,接下来要考虑怎么把它用到真实项目中。下面是几条从实践里沉淀出来的建议。
第一,虚拟磁盘一律用 qcow2,不要用 raw。qcow2 支持快照、压缩、稀疏存储,raw 虽然性能略高一点,但维护成本高很多。如果追求磁盘性能,可以先创建 raw 磁盘,再用qemu-img convert转成 qcow2 结合 IO 调优参数,而不是在初始化时直接裸用 raw。
qemu-img create -f qcow2 /var/lib/libvirt/images/kvm1.25.qcow2 20G第二,内存分配要留余量。宿主机内存必须预留至少 2 GB 给系统内核和 libvirtd 运行。贸然把所有内存都分配给虚拟机,可能导致宿主机 OOM,直接杀掉物理机上所有进程,包括你正在远程连接的那个 SSH 会话。这在生产环境里是极其严重的事故。
第三,网络模式按场景选择。默认 NAT 模式只适合临时测试,因为外部无法直接访问虚拟机。生产环境如果要让虚拟机对外提供业务,建议用桥接模式,让虚拟机直接接入物理网络。桥接模式的配置在 libvirt 中一般通过网桥br0实现:
<interface type='bridge'> <source bridge='br0'/> <model type='virtio'/> </interface>但改桥接前,请一定确认物理网卡和交换机的配置允许,否则会导致宿主机断网,无法远程恢复。
第四,在安全边界上要谨慎。KVM 是根权限级的虚拟化平台,操作时默认使用普通用户加sudo即可,不建议长期用 root 执行所有命令。对于生产虚拟机,尽量不要执行virsh destroy这种强制断电操作,先尝试virsh shutdown,让它优雅关闭。强制关闭有可能导致文件系统损坏。
第五,快照是很强的工具,但不要依赖单点。虚拟机快照不能替代备份。快照文件通常和原始磁盘在同一个存储上,如果存储盘故障,快照也一起丢失。生产环境中建议将关键虚拟机定期导出为离线镜像,放到独立备份存储上:
qemu-img convert -O qcow2 /var/lib/libvirt/images/kvm1.25.qcow2 /backup/kvm1.25-backup.qcow2第六,版本兼容问题要提前测试。KVM、QEMU、libvirt 的版本组合非常多,不同发行版自带的 KVM 内核补丁也不一样。在实际项目中引入一套虚拟机模板时,先在测试环境完整跑一遍创建、启动、快照、迁移,再复制到生产环境使用。这是一种低成本、高回报的工程习惯。
9. 总结与后续学习方向
从零到一创建一台 KVM 虚拟机,这个流程本身不复杂。真正有价值的是你理解了整套架构之间的关系:KVM 是内核模块,QEMU 负责设备模拟,libvirt 负责管理,virt-install 是入口工具。只有当这些概念在脑中标定清楚,你才会在出现问题时知道去查哪个日志、看哪个进程、改哪个配置。
这篇文章里,你已经完成了:
- 确认 CPU 是否支持硬件虚拟化。
- 安装完整 KVM 软件栈。
- 用
virt-install创建第一台kvm1.25测试机。 - 通过
virsh命令验证虚拟机状态。 - 解决了剪贴板互通、全屏缩放、UEFI 固件等常见问题。
- 拿到了几条针对生产环境的工程建议。
下一步建议从两个方向继续提升。一是深入网络层,学习如何创建自定义网桥、vLAN 隔离和 NAT 转发规则,这是从“会建虚拟机”到“会做服务器虚拟化组网”的必由之路。二是学习自动化,用virt-install --unattended或者 cloud-init 批量部署 Guest OS,解决团队里反复手工安装系统的效率问题。
最后留一个建议:第一次测试 KVM 时,不要急着调度太多资源。先把一台 2 GB 内存、20 GB 磁盘的小机器完整跑通,再逐步加 CPU、加内存、接桥接网络。KVM 本身是个非常稳定的平台,大多数问题上不是它不行,而是使用者在第一次配置时把宿主机资源榨干,把网络配置改错,然后还回不去。从最小案例开始,你的第一台 KVM 测试机会比预想中顺利很多。