KVM虚拟化教程

KVM (Kernel-based Virtual Machine) 是Linux内核的一个模块,可以将Linux转变为一个hypervisor。本教程将指导您从零开始搭建KVM虚拟化环境,并创建虚拟机。

1. 环境检查

在开始安装KVM之前,首先需要确认您的硬件是否支持虚拟化。

1
2
3
4
5
6
7
8
# 检测CPU是否支持虚拟化,输出大于0则表示支持
egrep -c '(vmx|svm)' /proc/cpuinfo

# ubuntu也可以安装cpu-checker软件包检查KVM环境
sudo apt install -y cpu-checker

# 运行kvm-ok命令检查,输出"KVM acceleration can be used"即为可用
kvm-ok

2. 软件包安装

根据您的Linux发行版,选择对应的安装方式:

2.1 ARCH系(Arch Linux/Manjaro等)

1
2
3
4
5
6
7
8
# 安装基本组件
sudo pacman -S qemu libvirt ovmf virt-manager virt-viewer dnsmasq vde2 bridge-utils openbsd-netcat

# 安装网络相关组件
sudo pacman -S ebtables iptables

# 安装libguestfs工具
paru -S libguestfs

组件说明:

  • kvm: 负责CPU和内存的虚拟化
  • qemu: 向Guest OS模拟硬件(例如,CPU,网卡,磁盘等)
  • ovmf: 为虚拟机启用UEFI支持
  • libvirt: 提供管理虚拟机和其它虚拟化功能的工具和API
  • virt-manager: 图形界面管理KVM虚拟化

2.2 Debian系(Ubuntu/Debian等)

1
2
3
4
5
6
7
8
# 更新软件包列表
sudo apt update

# 安装KVM及相关工具
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils libguestfs-tools virt-viewer virt-manager virtinst

# 安装Python绑定(可选)
sudo apt install python3-libvirt

组件说明:

  • qemu-kvm: 即qemu+kvm,kvm负责cpu和内存的虚拟化,而qemu负责IO设备,如网卡和磁盘等的虚拟化
  • libvirt-daemon-system: KVM管理工具,为不同的虚拟机监视器提供了统一的接口
  • libvirt-clients: 包含了一组用于与libvirt库交互的命令行工具,包括:
    • virsh: 用于虚拟机的创建,启动,停止,迁移,克隆,配置文件管理等操作
    • virt-install: 用于GuestOS安装
    • virt-clone: 用于虚拟机克隆
  • bridge-utils: 配置网桥
  • libguestfs-tools: 虚拟机镜像管理工具,包括virt-cat、virt-edit、virt-ls、virt-rescue
  • virt-viewer: 用于虚拟机控制台
  • virt-manager: 图形界面管理KVM虚拟化
  • virtinst: 命令行工具,包括virt-install、virt-clone、virt-manager等
  • python3-libvirt: libvirt库的Python绑定,用于在Python中使用libvirt的功能

3. 启动libvirt服务

安装完成后,需要启动并启用libvirt服务:

1
2
3
4
5
6
7
8
# 启动libvirt服务
sudo systemctl start libvirtd.service

# 设置开机自启
sudo systemctl enable libvirtd.service

# 检查服务状态
sudo systemctl status libvirtd.service

4. 检查KVM模块

确认KVM模块已正确加载:

1
2
3
$ lsmod | grep kvm
kvm_intel 372736 5
kvm 1032192 1 kvm_intel

注意:AMD处理器用户会看到kvm_amd而不是kvm_intel

5. 用户权限配置(可选)

为了避免每次操作都需要使用sudo,可以将当前用户添加到kvm和libvirt组。
修改组后,需要重新登录或注销再登录才能使更改生效。

5.1 方法一:直接添加用户到组

1
2
3
4
5
6
7
8
9
# 添加当前用户到kvm组
sudo usermod -aG kvm $USER

# 添加当前用户到libvirt组
sudo usermod -aG libvirt $(whoami)

# 验证用户是否已加入组中
id $(whoami)
# 输出示例:uid=1001(gycx) gid=1001(gycx) groups=1001(gycx),108(kvm),138(libvirt)

5.2 方法二:修改libvirt配置

1
2
# 编辑libvirt配置文件
sudo vim /etc/libvirt/libvirtd.conf

将UNIX域套接字组所有权设置为libvirt(第85行):

1
unix_sock_group = "libvirt"

设置R/W套接字的UNIX套接字权限(第102行):

1
unix_sock_rw_perms = "0770"

将用户帐户添加到libvirt组:

1
2
sudo usermod -a -G libvirt $(whoami)
newgrp libvirt

重启libvirt守护进程:

1
sudo systemctl restart libvirtd.service

6. 启用嵌套虚拟化(可选)

嵌套虚拟化功能使您可以在虚拟机中运行虚拟机,这对于测试和开发环境非常有用。

6.1 Intel处理器

1
2
3
4
5
# 卸载当前kvm_intel模块
sudo modprobe -r kvm_intel

# 重新加载模块并启用嵌套虚拟化
sudo modprobe kvm_intel nested=1

要使此配置持久化,请运行:

1
echo "options kvm-intel nested=1" | sudo tee /etc/modprobe.d/kvm-intel.conf

确认嵌套虚拟化已启用:

1
2
3
4
5
6
systool -m kvm_intel -v | grep nested
# 输出:nested = "Y"
# 输出:nested_early_check = "N"

cat /sys/module/kvm_intel/parameters/nested
# 输出:Y

6.2 AMD处理器

对于AMD处理器,将上述命令中的kvm_intel替换为kvm_amd即可。

7. 网络配置

7.1 创建网桥(br0),配置同一网段

为实现从本机外访问虚拟机,必须将虚拟机的网卡映射至网桥。virbr0网桥是KVM安装完成后自动创建的,仅做测试用途。

1
2
3
4
5
# 显示网桥信息
brctl show
# 输出示例:
# bridge name bridge id STP enabled interfaces
# virbr0 8000.525400a882e2 yes virbr0-nic

通过在/etc/netplan目录下创建文件01-netcfg.yaml来新建网桥:

提示:

  1. 使用ifconfig确认当前网口设备、IP地址和MAC地址
  2. 使用ip route获取默认via和metric值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
network:
ethernets:
eno2: # 替换为您的网络接口名称
dhcp4: false
dhcp6: false
bridges:
br0:
interfaces: [eno2] # 替换为您的网络接口名称
dhcp4: false
addresses: [192.168.100.123/24] # 替换为您的IP地址
macaddress: 7c:c2:55:4d:e1:e9 # 替换为您的MAC地址
routes:
- to: default
via: 192.168.100.1 # 替换为您的网关地址
metric: 101
nameservers:
addresses: [223.5.5.5] # 替换为您的DNS服务器
parameters:
stp: false
dhcp6: false
version: 2

应用网络配置:

1
2
sudo netplan apply
ip add show # 检查配置是否生效

8. 创建虚拟机

创建虚拟机有两种方式,您可以根据自己的喜好选择其中一种:

8.1 图形化创建虚拟机

  1. 运行virt-manager,启动图形化界面进行KVM虚拟机安装
  2. 点击「添加连接」(Add connection),选择「本地安装介质」(Local install media)
  3. 选择「选择ISO或CDROM安装介质」(Choose ISO or CDROM install media)
  4. 选择要安装的ISO镜像,点击「选择卷」(Choose volume)
  5. 点击「前进」(Forward)
  6. 设置CPU和内存,点击「前进」(Forward)
  7. 点击「为此虚拟机启用存储」(Enable storage for this virtual machine),并点击「为虚拟机创建磁盘镜像」(Create a disk image for the virtual machine),选择硬盘大小
  8. 点击「前进」(Forward)
  9. 选择网桥为br0,点击「完成」(Finish)

8.2 命令行创建虚拟机

以下命令创建一个配置为4核CPU、8GB内存、200GB磁盘的Windows 10虚拟机,磁盘为稀疏模式,格式为qcow2,总线类型为virtio:

1
2
3
4
virt-install --virt-type=kvm --name=win10 --vcpus=4 --memory=8192 \
--osinfo=win10 --cdrom=/var/lib/libvirt/images/win10.iso \
--disk path=/var/lib/libvirt/images/win10.qcow2,size=200,format=qcow2,bus=virtio,sparse \
--network bridge=br0 --graphics vnc,listen=0.0.0.0 --noautoconsole --force

9. 常用操作命令

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 列出所有虚拟机
virsh list --all

# 启动虚拟机
virsh start <vm-name>

# 关闭虚拟机(正常关机)
virsh shutdown <vm-name>

# 强制关闭虚拟机
virsh destroy <vm-name>

# 删除虚拟机(先关闭再删除)
virsh undefine <vm-name>

# 克隆虚拟机
virt-clone --original <source-vm> --name <target-vm> --auto-clone