引言
Linux 原生的虚拟化方案是 KVM + QEMU:KVM 是内核模块(利用 CPU 硬件虚拟化指令),QEMU 是用户态模拟器(提供设备与内存仿真),两者配合实现高性能虚拟机。本文从架构原理讲起:先确认硬件支持与安装,再讲 libvirt 管理栈(virsh 命令行 + virt-manager 图形),演示用 virt-install 从零创建一台虚拟机,最后覆盖快照、迁移、嵌套虚拟化与性能调优,让你在 Linux 上自如开虚拟机。
前置:/linux-process-management/(系统资源)、/linux-performance-tuning/(CPU/内存调优)。容器见 /linux-containers-isolation/,VM 与容器对比在该文第 8 节。
目录
- 1. KVM/QEMU 架构:内核虚拟化 + 用户态模拟
- 2. 硬件支持检测与安装
- 3. libvirt 管理栈:virsh 与 virt-manager
- 4. 创建第一台虚拟机:virt-install
- 5. virsh 常用管理命令
- 6. 快照与克隆
- 7. 虚拟机迁移:静态与动态
- 8. 嵌套虚拟化与 GPU 直通
- 9. 性能调优与常见问题
- 10. 速查表
- 延伸阅读
1. KVM/QEMU 架构:内核虚拟化 + 用户态模拟
KVM 与 QEMU 的分工:
宿主机内核:
KVM 模块 → 直接执行 guest 指令(利用 VT-x/AMD-V 硬件虚拟化)
→ guest 几乎原生速度
用户态:
QEMU → 模拟设备(网卡/磁盘/显示器)、管理内存
→ 提供「虚拟硬件」
libvirt → 管理 QEMU/KVM 的统一 API(virsh/virt-manager 用它)
为什么 KVM 快:
传统模拟:每条 guest 指令都要翻译 → 极慢
KVM:guest 指令直接在 CPU 上跑(硬件辅助)
→ 只有特权指令需要陷入内核处理 → 接近原生性能
| 层次 | 职责 | 类比 |
|---|---|---|
| KVM | CPU/内存虚拟化 | 硬件加速器 |
| QEMU | 设备模拟 | 虚拟硬件供应商 |
| libvirt | 管理/编排 | 虚拟机管家 |
心智:KVM 给速度、QEMU 给硬件、libvirt 给管理——三件套合起来才是完整的虚拟化平台。
2. 硬件支持检测与安装
检测 CPU 是否支持虚拟化:
# 确认 VT-x(Intel)或 AMD-V(AMD)
grep -E '(vmx|svm)' /proc/cpuinfo | head -1
# 或
lscpu | grep Virtualization
# 确认 KVM 模块加载
lsmod | grep kvm
ls /dev/kvm # 存在则 KVM 可用
安装虚拟化组件(Debian/Ubuntu):
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst virt-manager
sudo systemctl enable --now libvirtd
sudo usermod -aG kvm,libvirt $USER # 加入组免 sudo
RHEL/CentOS:
sudo dnf install qemu-kvm libvirt virt-install virt-manager
sudo systemctl enable --now libvirtd
验证安装:
virsh version # libvirt + QEMU 版本
virsh list --all # 当前虚拟机(应为空)
铁律:没有
/dev/kvm就没有硬件加速——在云主机/无嵌套虚拟化的环境里 KVM 不可用,只能纯软件模拟(慢)。
3. libvirt 管理栈:virsh 与 virt-manager
libvirt 统一管理入口:
virsh(命令行) + virt-manager(图形) + 云平台 API
↓ 都走 libvirt
QEMU/KVM、Xen、LXC、VMware...
virsh 最常用命令:
virsh list --all # 全部虚拟机
virsh start <vm> # 启动
virsh shutdown <vm> # 优雅关机
virsh destroy <vm> # 强制断电
virsh reboot <vm>
virsh suspend <vm> / virsh resume <vm>
virsh autostart <vm> # 宿主机启动自动起
virsh dominfo <vm> # 查看配置信息
virsh vcpuinfo <vm> # vCPU 情况
virsh domifaddr <vm> # 虚拟机 IP
virsh console <vm> # 连接串口控制台
virt-manager(图形界面):启动后点「新建虚拟机」,向导式创建——适合新手。
记忆:virsh 是虚拟机的 systemctl——list/start/shutdown/destroy/autostart,一套命令管理所有 VM。
4. 创建第一台虚拟机:virt-install
virt-install 命令行创建 VM(Ubuntu 镜像示例):
# 1. 下载 ISO(或已有镜像)
wget https://releases.ubuntu.com/24.04/ubuntu-24.04-desktop-amd64.iso
# 2. virt-install 创建
sudo virt-install \
--name ubuntu24 \
--ram 4096 \
--vcpus 4 \
--disk path=/var/lib/libvirt/images/ubuntu24.qcow2,size=40,format=qcow2 \
--os-variant ubuntu24.04 \
--cdrom /path/to/ubuntu.iso \
--network network=default \
--graphics vnc,listen=127.0.0.1,port=-1 \
--noautoconsole
参数详解:
| 参数 | 含义 |
|---|---|
| –name | VM 名字 |
| –ram / –vcpus | 内存/vCPU |
| –disk path,size | 磁盘路径与大小(qcow2) |
| –os-variant | 系统类型(优化配置) |
| –cdrom / –location | 安装源 |
| –network | 网络(default 桥接 NAT) |
| –graphics vnc | 图形控制台(VNC/SPICE) |
| –noautoconsole | 不自动连控制台 |
检查创建:
virsh list --all
virsh domifaddr ubuntu24 # 等装完查 IP
记忆:virt-install 一条命令生成 VM——名字、内存、CPU、磁盘、ISO、网络六要素配齐即可。
5. virsh 常用管理命令
虚拟机生命周期管理:
virsh list --all # 列出
virsh start web01 # 启动
virsh shutdown web01 # 优雅关机
virsh destroy web01 # 强制断电(慎用)
virsh undefine web01 # 删除定义(不删磁盘)
virsh undefine web01 --remove-all-storage # 连磁盘一起删
资源调整(在线/离线):
virsh setvcpus web01 8 --live --config # 加 vCPU(热加)
virsh setmem web01 8G --live --config # 加内存(热加)
磁盘管理:
# 磁盘格式转换
qemu-img convert -O qcow2 disk.raw disk.qcow2
# 查看磁盘信息
qemu-img info /var/lib/libvirt/images/web01.qcow2
控制台访问:
virsh console web01 # 串口控制台(配了 serial 才可用)
记忆:virsh 三块——生命周期(start/shutdown/destroy)、资源(vcpus/mem 热调)、磁盘(qemu-img)——日常运维全够。
6. 快照与克隆
快照(恢复点):
# 创建快照
virsh snapshot-create-as web01 snap-before-upgrade "before system upgrade"
# 列出快照
virsh snapshot-list web01
# 恢复快照
virsh snapshot-revert web01 snap-before-upgrade
# 删除快照
virsh snapshot-delete web01 snap-before-upgrade
克隆(复制虚拟机):
# 克隆(需先关闭源 VM)
virt-clone --original web01 --name web02 --auto-clone
# --auto-clone 自动处理磁盘路径
快照 vs 克隆:
| 维度 | 快照 | 克隆 |
|---|---|---|
| 目的 | 恢复点/回滚 | 复制出新 VM |
| 关系 | 依赖原盘 | 独立 |
| 场景 | 升级前存档 | 批量部署 |
记忆:升级/高危操作前先打快照,部署多台时用克隆——快照保回滚、克隆保复制。
7. 虚拟机迁移:静态与动态
静态迁移(关机迁移):拷贝磁盘 + 定义到目标主机。
动态迁移(在线迁移,零停机):
# 同一宿主机组/共享存储下
virsh migrate --live --p2p web01 qemu+ssh://target-host/system
# --live:不中断服务
# --p2p:对等直连,不走管理节点
迁移前提:
1. 共享存储(NFS/iSCSI)或镜像磁盘
2. 目标主机同架构(CPU 兼容)
3. 网络互通 + SSH 信任
| 迁移类型 | 停机 | 场景 |
|---|---|---|
| 静态 | 有 | 简单/跨机房 |
| 动态 | 无 | 维护窗口零停机 |
记忆:动态迁移靠共享存储 + CPU 兼容——在线把 VM 从宿主机 A 挪到 B,业务无感知。
8. 嵌套虚拟化与 GPU 直通
嵌套虚拟化(VM 里再跑 KVM)——测试/开发常用:
# 宿主机确认嵌套虚拟化(Intel)
cat /sys/module/kvm_intel/parameters/nested
# 启用(写到 /etc/modprobe.d/kvm.conf)
options kvm_intel nested=1
# 生效后 VM 里才能再用 KVM(见第 2 节检测)
GPU 直通(VFIO,游戏/GPU 计算):
把物理 GPU 直接给 VM 用:
1. 确认 CPU 支持 IOMMU(intel_iommu=on)
2. 绑定 GPU 到 vfio-pci 驱动
3. virt-install 里加 --hostdev <pci-address>
| 技术 | 用途 | 复杂度 |
|---|---|---|
| 嵌套虚拟化 | VM 里测虚拟化 | 低 |
| GPU 直通 | 图形/计算 | 高 |
记忆:嵌套虚拟化开一个内核参数即可;GPU 直通要 IOMMU + VFIO——前者改配置、后者动硬件,难度不同量级。
9. 性能调优与常见问题
性能调优:
| 手段 | 说明 |
|---|---|
| 直通网卡(virtio) | virtio 网卡比模拟 e1000 快 |
| 直通磁盘(virtio-blk) | 同样 virtio 更快 |
| CPU 亲和 | virsh vcpupin 绑核 |
| 大页内存 | 减少 TLB miss |
| 关闭无用设备 | 精简 QEMU 设备模拟 |
常见问题:
| 问题 | 原因 | 解法 |
|---|---|---|
| 无 /dev/kvm | 无硬件虚拟化 | 开嵌套/换真机 |
| VM 起不来 | 磁盘路径/权限 | 查 qemu-img、libvirt 日志 |
| 网卡不通 | 网络配置 | virsh net-list 检查默认网络 |
| 性能慢 | 设备模拟 | 换 virtio 设备 |
| 磁盘占满 | qcow2 增长 | qemu-img info + trim |
| 迁移失败 | CPU 不兼容 | 检查 host-passthrough |
日志查看:
journalctl -u libvirtd -f # libvirt 日志
tail /var/log/libvirt/qemu/<vm>.log # 单 VM 日志
记忆:KVM 性能关键是「设备直通」——virtio 网卡/磁盘、绑核、大页,三招吃透虚拟机性能。
10. 速查表
| 需求 | 做法 |
|---|---|
| 检测虚拟化 | `grep -E ‘(vmx |
| 装平台 | qemu-kvm + libvirt + virt-install |
| 建 VM | virt-install --name web01 ... |
| 启动/关机 | virsh start/shutdown web01 |
| 快照 | snapshot-create-as / snapshot-revert |
| 克隆 | virt-clone --original A --name B |
| 动态迁移 | virsh migrate --live --p2p |
| 热加资源 | setvcpus/setmem --live |
| 嵌套虚拟化 | kvm_intel nested=1 |
| GPU 直通 | IOMMU + VFIO + –hostdev |
| 加速 | virtio 设备 + 绑核 + 大页 |
一句话记忆:KVM 给硬件加速、QEMU 模拟设备、libvirt 统一管理;virt-install 建机、virsh 管生命周期、快照保回滚、克隆复制、动态迁移零停机;嵌套虚拟化开参数、GPU 直通上 VFIO;性能靠 virtio 直通 + 绑核 + 大页——Linux 虚拟化一条链全在这。
延伸阅读
- /linux-containers-isolation/ — 容器 vs VM 对比
- /linux-performance-tuning/ — CPU/内存调优
- /linux-filesystem-disk/ — 磁盘与存储
- [[infra]] — 云与虚拟化基础设施
- [[os]] — 操作系统原理
继续阅读
探索更多技术文章
浏览归档,发现更多关于系统设计、工具链和工程实践的内容。