第 24/30 天
引言
虚拟化是现代数据中心和云计算的基础技术。在 Ubuntu 上,KVM(Kernel-based Virtual Machine)是原生支持的虚拟化方案,它利用 Linux 内核的虚拟化模块,将你的 Ubuntu 服务器变成一台强大的虚拟机宿主机。与 VMware 或 Hyper-V 不同,KVM 完全开源、内置于 Linux 内核,并且性能接近裸机。
本篇文章将带你从零开始,在 Ubuntu 上搭建完整的 KVM 虚拟化环境,涵盖 QEMU 模拟器、libvirt 管理工具集和 Virt-Manager 图形界面,让你能够创建、管理、监控虚拟机,为后续的云计算和容器编排学习打下坚实基础。
一、核心概念
1.1 什么是 KVM?
KVM(Kernel-based Virtual Machine)是 Linux 内核的一个模块,它使 Linux 成为 Type 1(裸机型)Hypervisor。这意味着虚拟化层直接运行在硬件之上,没有中间操作系统层,性能接近原生。
┌─────────────────────────────────────────┐
│ 虚拟机 (Guest OS) │
│ (Ubuntu / Windows / ...) │
├─────────────────────────────────────────┤
│ QEMU(用户空间组件) │
│ (模拟设备、I/O、内存管理) │
├─────────────────────────────────────────┤
│ KVM 模块(内核空间) → /dev/kvm │
│ (CPU 虚拟化、内存虚拟化、中断处理) │
├─────────────────────────────────────────┤
│ 硬件 (CPU w/ VT-x/AMD-V) │
└─────────────────────────────────────────┘
关键特点:
– KVM 只处理 CPU 和内存虚拟化(需要 CPU 硬件支持 VT-x 或 AMD-V)
– QEMU 处理设备模拟(磁盘、网卡、USB 等)
– libvirt 提供统一的 API 管理接口
– 每个虚拟机是 Linux 的一个普通进程(qemu-system-x86_64)
1.2 QEMU 的角色
QEMU 在用户空间运行,负责:
– 模拟硬件设备(virtio 网卡、磁盘控制器)
– 管理虚拟机内存映射
– 处理 I/O 请求(网络、磁盘、显示)
– 提供多种虚拟化加速模式(KVM、TCG、HVF)
性能对比:使用 KVM 加速的 QEMU 性能接近裸机(损耗 <5%);纯软件模拟(TCG 模式)性能下降 80-90%。
1.3 libvirt 管理栈
libvirt 是一套虚拟化管理工具集,提供统一的 API 来管理多种 Hypervisor:
┌─────────────────────────────────┐
│ virsh (CLI) │
│ virt-manager (GUI) │
│ virt-install (安装工具) │
│ libvirt API (Python/C/Go) │
├─────────────────────────────────┤
│ libvirtd (守护进程) │
│ 管理:网络、存储、域、快照 │
├─────────────────────────────────┤
│ KVM/QEMU / Xen / LXC │
└─────────────────────────────────┘
libvirt 管理的核心对象:
– 域(Domain):一个虚拟机实例
– 存储池(Storage Pool):磁盘镜像存放位置(目录、LVM、iSCSI)
– 存储卷(Storage Volume):具体磁盘镜像文件
– 网络(Network):虚拟网络(NAT、桥接、隔离)
– 快照(Snapshot):虚拟机状态备份
二、环境准备与安装
2.1 检查 CPU 虚拟化支持
在安装之前,必须先确认 CPU 支持硬件虚拟化:
# 检查 CPU 是否支持硬件虚拟化
egrep -c '(vmx|svm)' /proc/cpuinfo
# 如果输出 > 0,说明支持
# vmx = Intel VT-x, svm = AMD-V
# 也可使用 kvm-ok 工具
sudo apt install -y cpu-checker
sudo kvm-ok
预期输出:
INFO: /dev/kvm exists
KVM acceleration can be used
如果 kvm-ok 显示 KVM acceleration can NOT be used,说明:
– BIOS/UEFI 中未启用虚拟化(Intel VT-x / AMD-V)
– 或你在云服务器上(如 AWS EC2 的嵌套虚拟化需额外配置)
2.2 安装 KVM/QEMU 和 libvirt
# 一键安装 KVM + QEMU + libvirt + 管理工具
sudo apt update
sudo apt install -y qemu-kvm qemu-utils libvirt-daemon-system
libvirt-clients bridge-utils virt-manager virtinst
# 安装完成后检查服务状态
sudo systemctl status libvirtd
# 将当前用户加入 libvirt 和 kvm 组
sudo usermod -aG libvirt $USER
sudo usermod -aG kvm $USER
# 重新登录使组生效(或使用 newgrp)
newgrp libvirt
各组件说明:
| 组件 | 作用 |
|---|---|
qemu-kvm |
KVM 加速的 QEMU 系统模拟器 |
qemu-utils |
磁盘镜像工具(qemu-img) |
libvirt-daemon-system |
libvirtd 守护进程及系统服务 |
libvirt-clients |
virsh 命令行工具 |
bridge-utils |
网络桥接管理工具(brctl) |
virt-manager |
图形化管理界面(可选,桌面环境) |
virtinst |
virt-install 命令行安装工具 |
2.3 验证安装
# 检查 KVM 模块是否加载
lsmod | grep kvm
# 输出示例:
# kvm_intel 372736 0
# kvm 995328 1 kvm_intel
# 检查 libvirtd 运行状态
sudo virsh list --all
# 输出示例:
# Id 名称 状态
# --------------------
三、实战:创建和管理虚拟机
3.1 创建磁盘镜像
在创建虚拟机之前,先准备磁盘镜像:
# 创建存储目录
sudo mkdir -p /var/lib/libvirt/images
# 使用 qemu-img 创建磁盘镜像
# qcow2 格式:按需分配空间,支持快照和压缩
sudo qemu-img create -f qcow2 /var/lib/libvirt/images/ubuntu-server.qcow2 20G
# 查看镜像信息
sudo qemu-img info /var/lib/libvirt/images/ubuntu-server.qcow2
预期输出:
image: /var/lib/libvirt/images/ubuntu-server.qcow2
file format: qcow2
virtual size: 20 GiB (21474836480 bytes)
disk size: 196 KiB
cluster_size: 65536
Format specific information:
compat: 1.1
lazy refcounts: false
refcount bits: 16
corrupt: false
磁盘格式对比:
| 格式 | 特点 | 适用场景 |
|---|---|---|
qcow2 |
按需分配、快照、压缩、加密 | 开发测试、日常使用 |
raw |
性能最佳、无附加功能 | 生产环境、高性能需求 |
vmdk |
VMware 兼容格式 | 迁移 VMware 虚拟机 |
vdi |
VirtualBox 兼容格式 | 迁移 VirtualBox 虚拟机 |
3.2 使用 virt-install 命令行安装虚拟机
virt-install 是从命令行安装虚拟机的最便捷方式:
# 下载 Ubuntu Server ISO
sudo wget -O /var/lib/libvirt/images/ubuntu-22.04-live-server-amd64.iso
https://releases.ubuntu.com/22.04/ubuntu-22.04-live-server-amd64.iso
# 使用 virt-install 创建虚拟机
sudo virt-install
--name ubuntu-server-01
--ram 2048
--vcpus 2
--disk path=/var/lib/libvirt/images/ubuntu-server.qcow2,format=qcow2,bus=virtio
--cdrom /var/lib/libvirt/images/ubuntu-22.04-live-server-amd64.iso
--os-variant ubuntu22.04
--network network=default,model=virtio
--graphics vnc,listen=0.0.0.0
--console pty,target_type=serial
参数说明:
| 参数 | 说明 |
|---|---|
--name |
虚拟机名称,用于 virsh 管理 |
--ram |
内存大小(MB) |
--vcpus |
CPU 核心数 |
--disk |
磁盘配置(路径、格式、总线类型) |
--cdrom |
安装 ISO 镜像路径 |
--os-variant |
操作系统类型,优化虚拟化参数 |
--network |
网络配置(default=NAT 模式) |
--graphics |
显示配置(VNC/SPICE) |
--console |
串行控制台,用于命令行安装 |
3.3 virsh 常用管理命令
# 列出所有虚拟机(包括未运行的)
sudo virsh list --all
# 启动虚拟机
sudo virsh start ubuntu-server-01
# 强制关闭(相当于拔电源)
sudo virsh destroy ubuntu-server-01
# 优雅关机(发送 ACPI 关机信号)
sudo virsh shutdown ubuntu-server-01
# 重启虚拟机
sudo virsh reboot ubuntu-server-01
# 暂停/恢复
sudo virsh suspend ubuntu-server-01
sudo virsh resume ubuntu-server-01
# 设置开机自启
sudo virsh autostart ubuntu-server-01
# 查看虚拟机信息
sudo virsh dominfo ubuntu-server-01
# 查看虚拟机 VNC 端口
sudo virsh vncdisplay ubuntu-server-01
3.4 使用 Virt-Manager 图形界面
如果运行在桌面环境(如 Ubuntu Desktop),Virt-Manager 提供直观的图形化管理界面:
# 启动 Virt-Manager
virt-manager
Virt-Manager 功能包括:
– 创建向导:逐步引导创建新虚拟机
– 性能监控:实时 CPU、内存、磁盘、网络图表
– 硬件热插拔:动态添加/移除 CPU、内存、磁盘、网卡
– 快照管理:创建和回滚快照
– 图形控制台:VNC/SPICE 远程桌面
四、网络配置详解
4.1 默认 NAT 网络
libvirt 安装后默认创建一个 NAT 网络 default,虚拟机通过宿主机的 IP 访问外部网络:
# 查看默认网络配置
sudo virsh net-dumpxml default
输出示例:
<network>
<name>default</name>
<uuid>...</uuid>
<forward mode='nat'/>
<bridge name='virbr0' stp='on' delay='0'/>
<mac address='52:54:00:...'/>
<ip address='192.168.122.1' netmask='255.255.255.0'>
<dhcp>
<range start='192.168.122.2' end='192.168.122.254'/>
</dhcp>
</ip>
</network>
NAT 模式特点:
– 虚拟机 ↔ 宿主机:互通
– 虚拟机 → 外网:通过 NAT 转发
– 外网 → 虚拟机:默认不可达(需端口转发)
4.2 桥接网络(Bridge)
桥接网络让虚拟机直接接入物理网络,获取独立的局域网 IP:
# 创建桥接网络配置
cat > /tmp/bridge-network.xml << 'EOF'
<network>
<name>br0</name>
<forward mode='bridge'/>
<bridge name='br0'/>
</network>
EOF
# 定义并启动桥接网络
sudo virsh net-define /tmp/bridge-network.xml
sudo virsh net-start br0
sudo virsh net-autostart br0
# 创建虚拟机时使用桥接网络
sudo virt-install
--name ubuntu-server-bridge
--network bridge=br0,model=virtio
...
桥接 vs NAT 对比:
| 特性 | NAT | 桥接 |
|---|---|---|
| IP 来源 | DHCP 分配 192.168.122.x | 物理路由分配 |
| 外网访问 | 需额外配置端口转发 | 直接可达 |
| 隔离性 | 与宿主机网络隔离 | 与物理机同级 |
| 适用场景 | 开发测试 | 生产服务器 |
4.3 端口转发到 NAT 虚拟机
如果不使用桥接,可以通过 iptables 转发端口到 NAT 虚拟机:
# 将宿主机 2222 端口转发到虚拟机的 22 端口
sudo iptables -t nat -A PREROUTING -p tcp --dport 2222
-j DNAT --to-destination 192.168.122.100:22
# 保存规则
sudo apt install -y iptables-persistent
sudo netfilter-persistent save
五、磁盘管理与快照
5.1 磁盘格式转换
# raw → qcow2
sudo qemu-img convert -f raw -O qcow2 disk.raw disk.qcow2
# qcow2 → raw(性能优化)
sudo qemu-img convert -f qcow2 -O raw disk.qcow2 disk.raw
# 查看磁盘实际占用
sudo qemu-img info disk.qcow2
5.2 磁盘扩容
# 在线扩容 qcow2 镜像(从 20G 到 50G)
sudo qemu-img resize /var/lib/libvirt/images/ubuntu-server.qcow2 50G
# 确认扩容
sudo qemu-img info /var/lib/libvirt/images/ubuntu-server.qcow2
# 进入虚拟机后需扩展分区和文件系统
# 虚拟机内执行:
# sudo growpart /dev/vda 1
# sudo resize2fs /dev/vda1
5.3 创建和回滚快照
# 创建快照(仅 qcow2 格式支持)
sudo virsh snapshot-create-as ubuntu-server-01
--name "before-update"
--description "快照在系统更新前"
# 列出所有快照
sudo virsh snapshot-list ubuntu-server-01
# 查看快照信息
sudo virsh snapshot-info ubuntu-server-01 --current
# 回滚到快照
sudo virsh snapshot-revert ubuntu-server-01 --snapshotname before-update
# 删除快照
sudo virsh snapshot-delete ubuntu-server-01 --snapshotname before-update
六、常见问题
6.1 权限不足 —— 无法访问 /dev/kvm
现象: Could not access /dev/kvm: Permission denied
解决:
# 将用户加入 kvm 组
sudo usermod -aG kvm $USER
newgrp kvm
# 或检查 /dev/kvm 权限
ls -l /dev/kvm
# 期望:crw-rw---- 1 root kvm 10, 232 ...
6.2 嵌套虚拟化(在虚拟机中运行 KVM)
场景: 在云服务器或虚拟机中再运行 KVM 虚拟机
# 检查是否支持嵌套虚拟化
cat /sys/module/kvm_intel/parameters/nested # Intel
cat /sys/module/kvm_amd/parameters/nested # AMD
# 如果输出为 0,启用嵌套虚拟化
sudo modprobe -r kvm_intel
sudo modprobe kvm_intel nested=1
# 永久启用
echo "options kvm_intel nested=1" | sudo tee /etc/modprobe.d/kvm-intel.conf
6.3 性能优化建议
# 1. 使用 virtio 驱动(半虚拟化)
--disk ...,bus=virtio
--network ...,model=virtio
# 2. 启用 NUMA 亲和性(多路 CPU 场景)
--numatune memory=strict,mode=strict,node=0-1
# 3. 使用 hugepages 减少内存开销
# 在宿主机配置
echo 2048 | sudo tee /proc/sys/vm/nr_hugepages
# 4. CPU pinning——绑定物理核心
# 在 XML 配置中:
# <cputune>
# <vcpupin vcpu='0' cpuset='1-2'/>
# <vcpupin vcpu='1' cpuset='3-4'/>
# </cputune>
6.4 虚拟机迁移
# 导出虚拟机 XML 配置
sudo virsh dumpxml ubuntu-server-01 > /tmp/vm.xml
# 导出磁盘镜像
sudo qemu-img convert -O qcow2
/var/lib/libvirt/images/ubuntu-server.qcow2
/tmp/ubuntu-server-export.qcow2
# 在目标机器上导入
sudo virsh define /tmp/vm.xml
sudo virsh start ubuntu-server-01
总结
今天我们学习了 Ubuntu 上的 KVM 虚拟化技术栈:
| 组件 | 功能 | 命令 |
|---|---|---|
| KVM 模块 | CPU/内存虚拟化 | kvm-ok、lsmod | grep kvm |
| QEMU | 设备模拟 | qemu-img、qemu-system-x86_64 |
| libvirt | 统一管理 API | virsh、virt-install |
| Virt-Manager | 图形化管理 | virt-manager |
KVM 是 Linux 生态中最成熟的虚拟化方案,它把 Ubuntu 服务器变成一台功能完备的 Hypervisor,支持从开发测试到生产环境的全场景需求。掌握了 KVM,你就能:
– 在单台物理机上运行多个隔离的虚拟机环境
– 为后续的云计算(OpenStack)和容器编排(Kubernetes)打好基础
– 实现资源的灵活分配和动态调整
下期预告
第 25 天:容器编排入门——Docker Compose 与 Kubernetes 单节点部署
在掌握了 KVM 虚拟化之后,我们将进入容器编排的世界。从 Docker Compose 多容器编排到 Kubernetes 单节点集群部署,带你体验现代云原生架构的两种核心编排方案。
📖 系列目录
- 第 1 天:Ubuntu 简介与版本选择 ✅
- 第 2 天:手把手安装 Ubuntu ✅
- 第 3 天:Ubuntu 桌面环境初探 ✅
- 第 4 天:Ubuntu 终端基础 ✅
- 第 5 天:用户与权限管理 ✅
- 第 6 天:软件包管理 ✅
- 第 7 天:文件与文本操作 ✅
- 第 8 天:系统服务管理——systemd 与 systemctl ✅
- 第 9 天:磁盘与文件系统管理 ✅
- 第 10 天:网络配置与管理 ✅
- 第 11 天:进程管理与监控 ✅
- 第 12 天:计划任务与自动化 ✅
- 第 13 天:备份与恢复策略 ✅
- 第 14 天:系统更新与升级管理 ✅
- 第 15 天:SSH 远程管理与安全加固 ✅
- 第 16 天:Web 服务器搭建 ✅
- 第 17 天:数据库服务器部署 ✅
- 第 18 天:Docker 在 Ubuntu 上的安装与容器化管理 ✅
- 第 19 天:文件共享服务 ✅
- 第 20 天:监控与告警系统 ✅
- 第 21 天:邮件服务器基础 ✅
- 第 22 天:系统安全加固——AppArmor、SELinux、auditd ✅
- 第 23 天:性能调优与内核参数 ✅
- 第 24 天:虚拟化技术——KVM/QEMU、libvirt、Virt-Manager ← 本篇
- 第 25 天:容器编排入门——Docker Compose 与 Kubernetes 单节点部署 🔜
- 第 26 天:高可用与负载均衡——Keepalived、HAProxy 🔜
- 第 27 天:Ubuntu 自动部署——PXE、Preseed、Cloud-init 🔜
- 第 28 天:故障排查实战 🔜
- 第 29 天:Ubuntu 社区与文档 🔜
- 第 30 天:30 天回顾——从入门到精通的学习路线图 🔜















暂无评论内容