KVM 简介

KVM |Kernel-Based Virtual Machine
允许在同一台物理主机上运行多个虚拟机。这种技术使用硬件虚拟化技术(如Intel VT-x或AMD-V),提供接近原生性能的虚拟化体验。


环境

系统:Debian 12
内核版本:6.1.0-41-amd64
CPU: intel

安装前提条件

CPU 支持虚拟化技术

1
grep -E --color '(vmx|svm)' /proc/cpuinfo
  • 有输出,说明系统上启用了虚拟化技术
  • 无输出,需要重新启动系统,进入 bios 设置,然后为 Intel 处理器启用 VT-x(虚拟化技术扩展),为 AMD 处理器启用 AMD-V。

安装及配置

第一步:安装 KVM 及相关工具

libvirt是KVM和QEMU虚拟化的必备工具,可以用来创建和管理虚拟机;

首先安装 Qemu、KVM 管理程序和 Libvirt 所需的所有依赖包

1
2
3
4
5
6
7
:~$ sudo apt install -y qemu-kvm \
> libvirt-clients \
> libvirt-daemon-system \
> bridge-utils \
> virtinst \
> libvirt-daemon\
> virt-manager

各包说明:

包名 作用
qemu-kvm 一个提供硬件仿真的开源仿真器和虚拟化包
libvirt-clients 一组客户端的库和API,用于从命令行管理和控制虚拟机和管理程序
libvirt-daemon-system 为运行 libvirt 进程提供必要配置文件的工具
bridge-utils 一套用于创建和管理桥接设备的工具
virtinst 一套为置备和修改虚拟机提供的命令行工具
virt-daemon 用于运行 libvirt 守护进程的包
virt-manager 一款通过 libvirt 守护进程,基于 QT 的图形界面的虚拟机管理工具

第二步:将用户加入必要组

为了安全,我们以普通用户加入 libvirtd 组,获取权限的方式管理虚拟机。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 确保 libvirt 组存在
:~$ getent group libvirt
libvirt:x:124:

# 添加用户到 libvirtd 组
:~$ sudo adduser $USER libvirt
正在添加用户"...""libvirt"组...
完成

# 确保 kvm 组存在
:~$ getent group kvm
kvm:x:104:

# 添加用户到 kvm 组
:~$ sudo adduser $USER kvm
正在添加用户"...""kvm"组...
完成。

$USER 为当前登陆用户,也可以将 $USER 替换为指定用户名

1
sudo adduser 你的用户名 要加入的组名

第三步:验证 KVM 是否正常工作

验证内核模块

1
2
3
4
# 检查 KVM 内核模块是否加载
:~$ lsmod | grep kvm
kvm_intel 380928 0
# 应看到 kvm_intel(Intel)或 kvm_amd(AMD)

验证服务状态

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 立即启动并配置开机启动
:~$ sudo systemctl enable --now libvirtd
# 验证服务状态
:~$ sudo systemctl status libvirtd
---output---
active (running) # running 正在运行
---output---

# 查看kvm版本
:~$ virsh version
根据库编译:libvirt 9.0.0
使用库:libvirt 9.0.0
使用的 API: QEMU 9.0.0
运行管理程序: QEMU 7.2.19

第四步:使用图形化管理(本地或远程)

图形化下管理更加直观清晰。

本地使用图形化管理

1
2
# 启动图形化管理 使用该命令的用户需有 `libvirtd` 组权限
:~$ virt-manager

远程使用图形化管理通过 SSH 连接并转发 GUI,需要本地安装 X11 服务器或使用 Wayland 兼容方案。

1
2
3
:~$ ssh -X <你的用户名>@<服务器ip>
# 成功登陆后
:~$ virt-manager

第五步:配置虚拟网络

虚拟网桥是非常重要的,保证了虚拟机与虚拟机之间的通信和虚拟机和互联网的通信。

虚拟网桥的配置是以 .xml 结尾的文件,默认配置文件:/etc/libvirt/qemu/networks/default.xml

查看默认

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
:~$ sudo cat /etc/libvirt/qemu/networks/default.xml 
<!--
WARNING: THIS IS AN AUTO-GENERATED FILE. CHANGES TO IT ARE LIKELY TO BE
OVERWRITTEN AND LOST. Changes to this xml configuration should be made using:
virsh net-edit default
or other application using the libvirt API.
-->

<network>
<name>default</name> # 虚拟网络名称
<uuid>0f548508-0a6b-45f7-baff-ec2031c0db2a</uuid> # 虚拟网络唯一标识符
<forward mode='nat'/> # 虚拟网络转发模式
<bridge name='virbr0' stp='on' delay='0'/> # 虚拟网桥名称
<mac address='52:54:00:00:3d:e7'/> # 虚拟网桥MAC地址
<ip address='192.168.122.1' netmask='255.255.255.0'> # 虚拟网络IP地址
<dhcp> # 虚拟网络DHCP配置
<range start='192.168.122.2' end='192.168.122.254'/> # DHCP范围
</dhcp>
</ip>
</network>

配置说明:

配置项 作用
虚拟网络名称 kvm 管理的虚拟网络名称,能用 virsh 命令管理
虚拟网络唯一标识符 虚拟网络唯一标识符,用于区分虚拟网络, 唯一,不能冲突
虚拟网络转发模式 虚拟网络转发模式,可以是 nat、route、bridge
虚拟网桥名称 虚拟网桥名称,用于虚拟网络与物理网络进行通信,宿主机 ip address show 可以看到
虚拟网桥MAC地址 虚拟网桥MAC地址,唯一,不能冲突
虚拟网络IP地址 虚拟网络IP地址网段,唯一,不能冲突; address 配置项是 网关地址,通过该设备和外界通信
DHCP范围 DHCP范围,虚拟机启动时,会分配一个IP地址,用于虚拟机与物理网络进行通信

网桥管理命令

命令 作用
virsh net-list [--all] 列出虚拟网络或列出所有虚拟网络
virsh net-start 启动虚拟网络设备
virsh net-destroy 停止虚拟网络设备
virsh net-define 根据 xml 文件创建虚拟网络
virsh net-undefine 删除一个虚拟网络设备
virsh net-edit 修改虚拟网络设备的配置
virsh net-autostart 设置开机自启动

启动虚拟机默认网络配置

1
2
3
4
5
6
7
8
9
10
11
12
13
# 启动 default 网络
:~$ sudo virsh net-start --network default
网络 default 已开始

# 设置 default 网络开机启动
:~$ sudo virsh net-autostart --network default
网络default标记为自动启动

# 查看所有网络状态
:~$ sudo virsh net-list --all
名称 状态 自动开始 持久
-------------------------------------
default 活动 是 是

创建虚拟网桥

官方文档:·https://libvirt.org/formatnetwork.html
不指定 uuid 和 mac 地址,在创建虚拟网桥时,系统会自动生成
我们的网桥定义文件可以在任意位置创建,是用virsh net-define命令创建网桥后,默认会在为 /etc/libvirt/qemu/networks 生成一个同名的以 .xml 结尾的配置文件,

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 创建虚拟网桥
# 虚拟网络名称 kvmNet1
# 网络转发模式 nat
# ip 地址段:10.0.0.0/24 网卡地址:10.0.0.1 网关地址:10.0.0.1
# DHCP范围:10.0.0.128-10.0.0.254

:~$ sudo vim kvmNet1.xml
<network>
<name>kvmNet1</name>
<forward mode='nat'/>
<bridge name='kvmNet1' stp='on' delay='0'/>
<ip address='10.0.0.1' netmask='255.255.255.0'>
<dhcp>
<range start='10.0.0.128' end='10.0.0.254'/>
</dhcp>
</ip>
</network>

定义虚拟网桥

1
2
:~$ sudo virsh net-define --file kvmNat1.xml 
从 kvmNet1定义网络kvmNet1.xml

启动并自启动虚拟网络

1
2
3
4
5
6
7
8
9
10
11
:~$ sudo virsh net-start kvmNet1
网络 kvmNet1 已开始

:~$ sudo virsh net-autostart kvmNet1
网络kvmNet1标记为自动启动

:~$ sudo virsh net-list --all
名称 状态 自动开始 持久
-----------------------------------
default 活动 是 是
kvmNet1 活动 是 是

创建KVM虚拟机

默认虚拟机配置文件路径:/etc/libvirt/qemu/networks/
默认虚拟机磁盘文件路经:/var/lib/libvirt/images/

虚拟机的本质是操作一块磁盘。这块磁盘存储的是已安装好的操作系统。

压缩镜像文件

自动化快速创建虚拟机脚本

总结

虚拟网络配置默认目录:/etc/libvirt/qemu/networks/
默认虚拟机配置文件目录:/etc/libvirt/qemu/
默认虚拟机磁盘文件路经:/var/lib/libvirt/images/