2007 - KVM 虛擬化(硬體輔助的勝利)#
案件摘要#
2007 年 2 月,KVM(Kernel-based Virtual Machine)進入 Linux 核心 2.6.20—— 第一個進入主線核心的虛擬化技術:
\[ \text{KVM} = \text{Linux 核心(排班/記憶體)} + \text{Intel VT-x/AMD-V(硬體輔助)} + \text{QEMU(設備模擬)}. \]
每個虛擬機就是一個普通行程——虛擬化從「重量級 hypervisor」變成「核心的一個模組」。
前因 -- 為什麼會有這個案子#
- 硬體虛擬化的到來:Intel VT-x(2005.11)與 AMD-V(2006)在 CPU 加入虛擬化指令——二元翻譯(binary translation,VMware 的手法)不再必要。
- Xen 的缺陷:Xen(2003)需要修改 guest 核心(paravirtualization)——未修改的 Windows 跑不了——彌補的缺陷:需要改 guest。KVM 用硬體輔助,任何 OS 原封不動就能跑。
- Avi Kivity 的洞察:與其寫獨立 hypervisor,不如把 Linux 核心變成 hypervisor——排班器、記憶體管理、驅動全部現成,每個 VM 就是一個行程。
線索與推理 -- 技術面貌(2007)#
| 技術 | 狀態 | 彌補的缺陷 |
|---|---|---|
| KVM 模組 | 核心 2.6.20(2007.2) | Xen 需改 guest 核心 |
| 硬體輔助 | Intel VT-x / AMD-V | 二元翻譯的效能損耗 |
| QEMU 設備模擬 | 磁碟/網卡/顯卡 | 設備驅動從零寫 |
| virtio(2008) | 半虛擬化設備介面 | 全模擬設備太慢 |
| libvirt(2007.7) | 統一管理 API(KVM/Xen) | 各 hypervisor 管理介面不同 |
C 範例:KVM 的本質——VM 就是一個行程#
/* KVM API:/dev/kvm 是一切皆檔案的虛擬化版本 */
#include <linux/kvm.h>
#include <fcntl.h>
#include <sys/ioctl.h>
int kvm = open("/dev/kvm", O_RDWR); /* 1. 開啟 KVM */
int vmfd = ioctl(kvm, KVM_CREATE_VM, 0); /* 2. 建立虛擬機 */
int vcpufd = ioctl(vmfd, KVM_CREATE_VCPU, 0);/* 3. 建立虛擬 CPU */
/* 4. mmap guest 記憶體,5. KVM_RUN 執行 vCPU */
Shell 範例:KVM 的日常使用#
# libvirt(2007)之後:一個指令建立虛擬機
$ virt-install --name myvm --memory 2048 \
--disk size=10 --cdrom ubuntu-22.04.iso
$ virsh list # 虛擬機就是行程
Id Name State
----------------------
1 myvm running
$ ps aux | grep qemu # 每個 VM 一個 qemu 行程——KVM 的本質
Python 範例:libvirt 的管理 API#
import libvirt
conn = libvirt.open("qemu:///system")
dom = conn.createXML("""
<domain type='kvm'>
<name>myvm</name>
<memory unit='MiB'>2048</memory>
<vcpu>2</vcpu>
</domain>""", 0)
print(dom.name(), dom.ID()) # VM 即行程——用行程的思維管理
Shell 範例:virtio 的效能差異#
# 全模擬設備 vs virtio(2008):網路吞吐量的數量級差距
# 全模擬:虛擬 e1000 網卡(慢)
# virtio:半虛擬化 virtio-net(快 3-5 倍)
$ qemu-system-x86_64 -netdev user,id=n0 -device virtio-net-pci,netdev=n0
結案 -- 後果與影響#
- 雲端的基礎:AWS EC2(2006 初為 Xen,後轉 KVM/Nitro)、Google Cloud、OpenStack(2010)——KVM 是公有雲的主流 hypervisor。
- VMware 的挑戰:KVM 免費開源 + 硬體輔助——企業虛擬化的價格崩塌。
- 演化:QEMU/KVM → NFV/SDN → Firecracker(2018,AWS):輕量微虛擬機(serverless 的基礎)——VM 與容器的合流。
- 理論總結:虛擬化的三個世代——二元翻譯(VMware 1998)→ 半虛擬化(Xen 2003)→ 硬體輔助(KVM 2007)——硬體進步每次都改寫軟體的設計。
- 歷史教訓:把 Linux 核心當 hypervisor,是「重用現成抽象」的教科書案例。
關鍵人物與文獻#
- A. Kivity:KVM (2006–07);〈kvm: the Linux Virtual Machine Monitor〉。
- Intel/AMD:VT-x (2005)、AMD-V (2006)。
- R. Russell:virtio (2008)。
- 相關案件:
2008-cgroups與LXC.md、../UNIX/2013-Docker容器.md。