坑边闲话:KVM (Kernel-based Virtual Machine) 是一个基于 Linux 内核的开源虚拟化技术,它在 2006年 由 Avi Kivity 和他的团队开发,并于 2007年 合并到 Linux 内核中,成为主流虚拟化解决方案之一。KVM 使用较为方便,生态非常良好,本文介绍如何在 Linux 上配置并使用 KVM 虚拟机,同时会介绍 Intel VT-D、AMD-V、IOMMU 等硬件功能。

图 1. KVM 架构图。

1. 初始化 Linux 系统·

在开始之前,读者需要有一个支持裸机安装的 Linux 系统,本文以 Debian 12 为例。强烈建议使用最小化安装程序,因为有些新手可能非常依赖图形化界面配置虚拟机,导致迟迟无法深入理解技术细节,学到最后发现只是学了一个类似 VMware Workstation Pro 的软件。GUI 是用户友好型发明,但是对于学习技术、了解细节并不友好

1.1 调整 Console 界面字体大小·

最小化安装的 Linux 没有桌面环境,只有一个 console tty,因此建议执行以下命令,将界面字体设置为 Termius,并按照自己的喜好和视力设置一个合适的字体大小。

1
sudo dpkg-reconfigure console-setup

2560x1600 分辨率的 16 英寸显示器,建议选择 Termius 最大号字体。

图 2. Debian 12 最小化安装的效果。

1.2 确定 CPU 是否支持硬件虚拟化·

1
lscpu | grep Virtualization

1.3 安装 KVM·

如果根据 debian12-init 这篇文章进行了安装,则无需安装下列任何软件,因为安装 cocipit-machines 时,已经把与 KVM 虚拟机相关的组件都安装好了。否则,请根据下列内容执行。

1
2
sudo apt install bridge-utils
sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients virtinst

如果要使用 Linux 图形化桌面,可以再安装一组图形化工具以方便日常查看,实现类似 VMware Workstation 的效果。命令如下:

1
sudo apt install virt-manager virt-viewer

组件释义

  • bridge-utils:用于创建桥接网络。
  • qemu-kvm:KVM 虚拟化软件包。
  • libvirt-daemon-system:Libvirt 守护进程,用于管理虚拟机。
  • libvirt-clients:与 libvirt 虚拟化管理框架相关的一组客户端工具和命令行工具,它们用于管理虚拟机和虚拟化资源。
  • virt-manager:图形化虚拟机管理工具。
  • virt-viewer:如果你需要图形化界面访问虚拟机的桌面(例如通过 VNC, SPICE),你可以在其他计算机上安装 virt-viewer,通过 VNC 协议访问虚拟机的图形界面。。

libvirt 本身是一个提供虚拟化管理的 API,它支持多种虚拟化技术,如 KVM, Xen, QEMU 和 LXC 等。libvirt-clients 包含了用于与这些虚拟化技术交互的命令行工具。

图 3. libvirt 组件扮演的角色定位。

2. 启动 KVM 并创建虚拟机·

首先启动 libvirtd 守护进程:

1
sudo systemctl enable --now libvirtd

可以通过以下命令检查 KVM 是否已经安装并正常工作:

1
sudo virsh list --all

virsh 是一个强大的命令行工具,用于管理虚拟机。你可以通过它来创建、启动、停止、查看虚拟机等。

启动虚拟机

1
sudo virsh start <vm_name>

停止虚拟机

1
sudo virsh shutdown <vm_name>

创建虚拟机

1
sudo virt-install --name <vm_name> --ram <size> --vcpus <num> --disk <path> --cdrom <iso_path> --network network=default --graphics vnc

查看虚拟机的状态

1
sudo virsh dominfo <vm_name>

virt-install:用于命令行安装和创建虚拟机的工具,可以通过指定多个参数来创建虚拟机,例如 CPU、内存、磁盘和 ISO 镜像等。

3. 创建虚拟交换机·

1
2
3
sudo nmcli connection modify br0 ipv4.method manual ipv4.addresses 10.4.1.21/16 ipv4.gateway 10.4.1.10
sudo nmcli connection modify br0 ipv4.dns "10.4.1.10 1.1.1.1"
sudo nmcli connection up br0

4. 使用 XML 模板定义虚拟机配置·

1
2
3
4
5
<disk type='block' device='disk'>
<driver name='qemu' type='raw'/>
<source dev='/dev/md/storage'/>
<target dev='vdb' bus='virtio'/>
</disk>

由于 Ryzen 7840HS 有 Linux 硬件兼容性问题,因此后续的实验暂时搁置。