Linux KVM 配置说明

KVM(Kernel-based Virtual Machine) 是 Linux 内核的一个模块,它将 Linux 内核转变为一个 Type-1(裸机级) 虚拟机管理程序(Hypervisor/VMM)

KVM 本身并不模拟硬件,它只负责处理器虚拟化和内存虚拟化。它需要配合 QEMU 来模拟 I/O 设备(如磁盘、网卡、显卡)。

  • 内核态 (KVM Module) : 负责将 CPU 切换到 客户模式(Guest Mode) ,处理高权限指令。

  • 用户态 (QEMU) : 负责模拟硬件设备,并提供用户操作接口。

  • 管理层 (Libvirt) : 一个标准的 API 库,我们常用的 virsh 命令、 virt-manager 界面都是通过 Libvirt 来调用 QEMU/KVM 的。

核心技术特性

  • CPU 虚拟化 (Intel VT-x / AMD-V) 。KVM 利用硬件辅助虚拟化技术。它将 CPU 分为四种模式,使得虚拟机(Guest)可以直接在物理 CPU 上执行绝大多数指令,只有在执行敏感指令时才由内核接管,性能损耗极低。

  • 内存管理 (EPT/NPT) 。通过 扩展页表 (EPT) 技术,KVM 实现了物理内存与虚拟机内存的直接映射。

    • KSM (Kernel Same-page Merging) 扫描多个 VM 的内存,如果发现相同的内存页(例如多个 VM 都运行 Ubuntu),则将其合并为一页,极大节省物理内存。
  • 存储与网络 (VirtIO) 。传统的模拟设备(如模拟一张经典的百兆网卡)效率极低。KVM 引入了 VirtIO 准虚拟化驱动。VM 意识到自己处于虚拟化环境,通过“共享内存”的方式与宿主机通信。实现磁盘 IO 和网络吞吐量几乎接近物理机性能。

KVM 家族工具链

  • qemu-kvm : 核心包,提供底层仿真。

  • libvirt-daemon : 守护进程,负责管理 VM 的生命周期。

  • virsh : 命令行工具(运维最常用)。

  • virt-install : 用于创建虚拟机的命令行脚本工具。

KVM 安装

环境信息

  • Ubuntu 22.04.5 LTS 5.15.0-119-generic
  • 最好不要和 Docker、K8s 等虚拟化工具同时安装。可能会因为内核参数(如 net.bridge.bridge-nf-call-iptables)冲突导致 VM 无法获得 DHCP 地址。

首先需要确认你的物理机 CPU 是否支持虚拟化技术(VT-x 或 AMD-V)

# egrep -c '(vmx|svm)' /proc/cpuinfo
64

如果输出大于 0,说明支持虚拟化

安装 KVM 及相关工具 。参考以下命令安装 Linux 原生的虚拟化栈

sudo apt update
sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager
sudo systemctl enable --now libvirtd

KVM 中安装 Talos Linux 系统

Talos Linux OS Github 下载地址 ,从中下载 Talos Linux AMD64 版本的 RAW 镜像并提取 raw 文件

wget https://github.com/siderolabs/talos/releases/download/v1.14.0-alpha.0/metal-amd64.raw.zst

zstd -d metal-amd64.raw.zst

使用解压后的 metal-amd64.raw 文件创建虚拟机

创建 Talos 虚拟机 。可以使用 virt-install 命令行快速创建多个 VM。 创建控制平面 (Control Plane) 虚拟机

cp metal-amd64.raw /var/lib/libvirt/images/talos-control-plane-01.raw

# 建议稍微扩容一下,20G 比较稳妥
qemu-img resize /var/lib/libvirt/images/talos-control-plane-01.raw 20G

# 导入并运行虚拟机
virt-install \
--name talos-control-plane-01 \
--ram 4096 \
--vcpus 4 \
--disk path=/var/lib/libvirt/images/talos-control-plane-01.raw,bus=virtio \
--os-variant ubuntu22.04 \
--network network=default,model=virtio \
--graphics none \
--import \
--boot hd \
--console pty,target_type=serial
  • --name talos-control-plane-01 : 虚拟机唯一名称为 talos-control-plane-01
  • --ram 4096 : 内存大小为 4096MB
  • --vcpus 4 : 虚拟 CPU 数量为 4 个
  • --disk path=/var/lib/libvirt/images/talos-control-plane-01.qcow2,size=20path 虚拟磁盘文件存放路径, size 虚拟磁盘文件大小为 20GB
  • --os-variant ubuntu22.04--os-variant 用于指定操作系统类型,这里指定为 Ubuntu 22.04。虽然安装的是 Talos,但指定 ubuntu22.04 会让 KVM 自动应用适合该内核版本的硬件加速参数(如 VirtIO 队列优化)
  • --network network=default,model=virtio : 将 VM 挂载到宿主机的 default 网桥上。这是 Libvirt 默认网桥,是 KVM 安装后自动生成的 NAT 网桥。虚拟机可以访问外网,宿主机可以访问虚拟机,但外部机房的其他服务器无法直接访问该虚拟机。
  • --graphics none : 不显示图形界面,禁用图形输出
  • --console pty,target_type=serial : 串口控制台,将虚拟机的控制台重定向到当前的 shell 终端。运行命令后,你可以直接在当前的终端窗口看到 Talos 的启动日志。
  • --cdrom /opt/Talos/metal-amd64.iso : 安装镜像,Talos 首次启动需要通过 ISO 引导来进入安装模式。
  • --boot hd : 设置启动优先级。先尝试从硬盘 (hd) 启动,如果硬盘没系统(如首次启动),则从 光盘 (cdrom) 启动。

执行 VM 安装命令后,你的终端会变为 VM 的输出界面。你会看到 Talos 启动并显示以下信息:

Starting install...
Allocating 'talos-control-plane-01.qcow2' | 3.1 MB 00:00:00 ...
Creating domain... | 0 B 00:00:00
Running text console command: virsh --connect qemu:///system console talos-control-plane-01
Connected to domain 'talos-control-plane-01'
Escape character is ^] (Ctrl + ])


到这一步说明虚拟机已经成功创建并运行了。由于你看到了 Escape character is ^] (Ctrl + ]) 且屏幕停止滚动,这意味着你已经成功进入了虚拟机的串口终端 (Serial Console)。

Talos 启动非常快,大约 10-20 秒。如果 1 分钟后还没输出,说明内核可能还在尝试初始化硬件。

如果你想回到宿主机命令行,执行后续的 talosctl 命令,你需要先 Ctrl + ] (先按住 Ctrl 不放,再按右中括号)退出虚拟机的串口终端。

如果 VM 安装异常,可以查询 libvirtd 服务日志

# journalctl -u libvirtd -n 50 --no-pager
May 07 15:13:11 vp-jmpsvr systemd[1]: Starting Virtualization daemon...
May 07 15:13:11 vp-jmpsvr systemd[1]: Started Virtualization daemon.
May 07 15:13:12 vp-jmpsvr dnsmasq[417014]: started, version 2.90 cachesize 150
May 07 15:13:12 vp-jmpsvr dnsmasq[417014]: compile time options: IPv6 GNU-getopt DBus no-UBus i18n IDN2 DHCP DHCPv6 no-Lua TFTP conntrack ipset no-nftset auth cryptohash DNSSEC loop-detect inotify dumpfile
May 07 15:13:12 vp-jmpsvr dnsmasq-dhcp[417014]: DHCP, IP range 192.168.122.2 -- 192.168.122.254, lease time 1h
May 07 15:13:12 vp-jmpsvr dnsmasq-dhcp[417014]: DHCP, sockets bound exclusively to interface virbr0
May 07 15:13:12 vp-jmpsvr dnsmasq[417014]: reading /etc/resolv.conf
May 07 15:13:12 vp-jmpsvr dnsmasq[417014]: using nameserver 8.8.8.8#53
May 07 15:13:12 vp-jmpsvr dnsmasq[417014]: using nameserver 114.114.114.114#53
May 07 15:13:12 vp-jmpsvr dnsmasq[417014]: read /etc/hosts - 3 names
May 07 15:13:12 vp-jmpsvr dnsmasq[417014]: read /var/lib/libvirt/dnsmasq/default.addnhosts - 0 names
May 07 15:13:12 vp-jmpsvr dnsmasq-dhcp[417014]: read /var/lib/libvirt/dnsmasq/default.hostsfile
May 07 17:20:03 vp-jmpsvr libvirtd[416897]: libvirt version: 8.0.0, package: 1ubuntu7.16 (Hector Cao <hector.cao@canonical.com> Wed, 04 Feb 2026 11:49:12 +0100)
May 07 17:20:03 vp-jmpsvr libvirtd[416897]: hostname: vp-jmpsvr
May 07 17:20:03 vp-jmpsvr libvirtd[416897]: Unable to read from monitor: Connection reset by peer
May 07 17:20:03 vp-jmpsvr libvirtd[416897]: internal error: qemu unexpectedly closed the monitor: 2026-05-07T09:20:03.828580Z qemu-system-x86_64: -append only allowed with -kernel option
May 07 17:20:03 vp-jmpsvr libvirtd[416897]: internal error: process exited while connecting to monitor: 2026-05-07T09:20:03.828580Z qemu-system-x86_64: -append only allowed with -kernel option

virsh 命令行工具

虚拟机管理命令

列出所有虚拟机

# virsh list --all
Id Name State
----------------------------------------
1 talos-control-plane-01 running

查看虚拟机分配的 IP 地址

virsh net-dhcp-leases default

彻底删除虚拟机

virsh destroy talos-control-plane-01
virsh undefine talos-control-plane-01

连接虚拟机串口终端

# virsh console 1
Connected to domain 'talos-control-plane-01'
Escape character is ^] (Ctrl + ])

Network 管理

查看所有网络

# virsh net-list
Name State Autostart Persistent
--------------------------------------------
default active yes yes

查看虚拟机分配的 IP 地址

virsh net-dhcp-leases default