第 1 章 · KVM 概述

虚拟化这东西,用起来是「一台机器变多台」,理解起来却是三个层层递进的技术方案。本章先讲清楚虚拟化到底在解决什么问题、三种实现路线各自怎么活下来的,再落到 KVM 本身:它凭什么只靠一个内核模块就把 Linux 变成 Hypervisor。带着这个问题往下读,后面所有安装配置的步骤都会变得有据可依。

1.1 为什么要有虚拟化

一台物理服务器,CPU 平时闲着、内存大片空闲,而隔壁部门又在排队买新机器,这是云计算诞生前的普遍图景。虚拟化的答案:在一台物理机上,用软件(虚拟机监视器,Hypervisor/VMM)抽象出多台互相隔离的「虚拟机」,每台都以为自己独占硬件,有自己的内核、内存、磁盘。

收益四条,重要性排序:隔离(一台崩不影响别人,安全边界)、利用率(一台 128 核机器跑几十个 VM)、灵活(虚拟机是文件,复制、迁移、快照都是文件操作)、成本(合并服务器省电费机房)。云厂商的整套生意就建立在这四条上。

1.2 三种实现路线:翻译、改造、硬件帮忙

让 guest(虚拟机里的系统)的指令安全地跑在物理 CPU 上,历史上有三条路线,理解它们的差异,KVM 的定位就清楚了:

全虚拟化(软件翻译):guest 完全不改,VMM 在旁边实时拦截特权指令、翻译执行。早期产品靠二进制翻译,性能损耗百分之几十,像同时做同声传译,正确但累。

半虚拟化(改 guest):Xen 的路线,把 guest 的操作系统内核改一改,敏感操作不再触发陷阱,而是主动「打电话」给 VMM(hypercall)。性能好,代价是要改内核源码,Windows 这类闭源系统没得玩。

硬件辅助虚拟化(CPU 亲自支持):2005 年前后,Intel VT-x 和 AMD-V 让 CPU 有了专门的客户模式:guest 跑在客户模式,触发敏感操作时 CPU 硬件自动切回宿主模式交给 VMM 处理(VM exit),VMM 干完再 VM entry 放回去。不再需要翻译或改代码,性能损耗降到个位数百分比。今天的 KVM、Hyper-V、现代 Xen 全部站在这条路线上。

现代 CPU 还延伸出一票配套:EPT/NPT(内存二级地址翻译, guest 虚拟地址到物理地址由硬件一次完成)、SR-IOV(网卡直通多 VM)、嵌套虚拟化(VM 里再开 VM)。cat /proc/cpuinfo 里的 flags 一栏,vmx(Intel)或 svm(AMD)就是硬件虚拟化的门票。

1.3 KVM:把内核变成 Hypervisor

KVM(Kernel-based Virtual Machine)的定位一句话:Linux 内核本身的虚拟化模块,不是独立产品:

  • 本质是两个内核模块:kvm.ko(通用部分)+ kvm-intel.ko / kvm-amd.ko(架构相关);
  • 加载后,Linux 本身成为 Type 2 风格的 Hypervisor(宿主 Linux 还是个正常系统,你的桌面照用,同时能跑 VM);
  • 对用户态暴露一个设备文件 /dev/kvm,谁拿着它谁就能造虚拟机。
  QEMU(用户态:设备模拟、VM 生命周期管理)
        │ ioctl(/dev/kvm)      ← 创建 vCPU、注入内存、下发指令
  Linux 内核 + kvm 模块(CPU/内存虚拟化调度)
        │ VT-x / AMD-V 客户模式
       硬件

这个分工值得停下来看一眼,它体现了 Linux 世界「内核管机制、用户态管策略」的一贯品味:KVM 模块只做最难最热的部分(CPU 指令的 trap-and-emulate、内存 EPT 管理),而磁盘、网卡、显卡这些设备的模拟,交给用户态的 QEMU 慢慢来。QEMU 本身是个完整的机器模拟器(没有 KVM 也能纯软件模拟跑,慢几十倍),KVM 把它的 CPU 部分换成硬件加速,组合起来就是「QEMU/KVM」:QEMU 是身体,KVM 是发动机。

1.4 功能与优势清单

功能:多 guest 支持(Linux、Windows、BSD)、CPU/内存/IO 全套虚拟化、快照(保存 VM 当前状态)、热迁移(VM 不停机换物理机,云厂商「宿主机维护不中断服务」的看家本领)、嵌套虚拟化。

优势(相对 VMware 这类商业产品):性能接近原生(硬件虚拟化路线)、开源免费(随内核分发)、生态成熟(libvirt 统一管理接口 + OpenStack 云平台的地基)。劣势也直说:易用性和商业支持不如 VMware,桌面级的体验不如 VirtualBox,它的主场在服务器和云。

1.5 和容器的边界(预告)

虚拟机和容器(本课第 7 章开始)经常被并排比较,这里先立个准确的框架:虚拟机虚拟的是硬件,每台 VM 有完整内核,隔离强、开销大;容器共享宿主内核,只隔离进程视图(操作系统课第 10 章的 namespace),轻快但隔离弱。KVM 是前者的代表,Docker 是后者的代表,它们不是竞争关系,云厂商两个都跑:物理机上起几个大 VM,VM 里跑成百个容器。

练习

  1. 动手:grep -cE 'vmx|svm' /proc/cpuinfo 检查你的 CPU;cat /proc/cpuinfo | grep -o 'vmx\|svm' | sort | uniq -c 看每个核的支持情况。如果是 0,进 BIOS 找 Intel VT-x / AMD SVM 开关(这是最常见的「装不上」原因)。
  2. 动手:lscpu | grep Virtualization 看虚拟化类型;在云服务器上再跑一次,思考为什么输出往往是「VT-x」但云主机其实是别人物理机上的 VM(嵌套虚拟化)。
  3. 手算:一台 64 核 256GB 物理机,跑 40 台 4 核 4GB 的 VM,内存超售比是多少?如果所有 VM 同时打满会怎样(提示:KVM 会用 swap,性能悬崖,操作系统课第 7 章的抖动)。
  4. 思考:全虚拟化的「翻译」和半虚拟化的「hypercall」,本质都是让特权指令「绕道」。硬件辅助路线的 VM exit 依然是绕道,为什么它反而最快?(提示:翻译在软件层每次都要查表;VM exit 由硬件完成,路径更短;再想想哪些操作根本不需要 exit。)