Ubuntu 系统系列 | 第 24 天:虚拟化技术——KVM/QEMU、libvirt、Virt-Manager 虚拟化方案

第 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-oklsmod | grep kvm
QEMU 设备模拟 qemu-imgqemu-system-x86_64
libvirt 统一管理 API virshvirt-install
Virt-Manager 图形化管理 virt-manager

KVM 是 Linux 生态中最成熟的虚拟化方案,它把 Ubuntu 服务器变成一台功能完备的 Hypervisor,支持从开发测试到生产环境的全场景需求。掌握了 KVM,你就能:
– 在单台物理机上运行多个隔离的虚拟机环境
– 为后续的云计算(OpenStack)和容器编排(Kubernetes)打好基础
– 实现资源的灵活分配和动态调整


下期预告

第 25 天:容器编排入门——Docker Compose 与 Kubernetes 单节点部署

在掌握了 KVM 虚拟化之后,我们将进入容器编排的世界。从 Docker Compose 多容器编排到 Kubernetes 单节点集群部署,带你体验现代云原生架构的两种核心编排方案。


📖 系列目录

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容