KVM 是 Linux 内核级虚拟化方案,配合 libvirt 提供完整的虚拟机管理能力。本文覆盖从安装、桥接网络、安装系统到克隆管理的完整流程。

一、安装 KVM 与 libvirt

CentOS 7.9

sudo yum -y install qemu-kvm libvirt virt-install bridge-utils

Ubuntu 24.04

sudo apt install qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virt-manager

检查与启动

virsh --version          # 4.5.0
lsmod | grep kvm         # 确认 kvm 模块已加载

systemctl start libvirtd
systemctl enable libvirtd

二、配置桥接网络

默认的 virbr0 是 NAT 网络,虚拟机无法直接获得局域网地址。桥接模式让虚拟机与宿主机在同一网段。

2.1 前提

Ubuntu 需要让 NetworkManager 接管网卡。编辑 /etc/netplan/xx.yaml:

network:
  version: 2
  renderer: NetworkManager

2.2 使用 nmcli 创建桥

# 1. 创建桥接接口 br0
nmcli connection add type bridge autoconnect yes con-name br0 ifname br0

# 2. 配置 IP / 网关 / DNS
nmcli connection modify br0 ipv4.addresses 192.168.0.115/24 ipv4.method manual
nmcli connection modify br0 ipv4.gateway 192.168.0.1
nmcli connection modify br0 ipv4.dns 114.114.114.114

# 3. 把物理网卡 em1 添加为 br0 的从属接口
nmcli connection delete em1
nmcli connection add type bridge-slave autoconnect yes con-name em1 ifname em1 master br0

# 4. 重启 NetworkManager
sudo systemctl restart NetworkManager

验证:

nmcli device status
brctl show br0

2.3 绑定失败时的备用方案

如果桥创建成功但 interfaces 为空,使用 connection.master 方式绑定:

nmcli connection modify eno2 connection.master br0 connection.slave-type bridge
nmcli connection up eno2
sudo systemctl restart NetworkManager

三、virt-install 安装虚拟机

3.1 查看可用的系统类型

osinfo-query os

用输出确定 --os-variant 的取值。

3.2 安装 Ubuntu

mkdir -p /data/virtual_data/kvm/images

virt-install \
  --name ubuntu2004 \
  --ram 8196 \
  --disk path=/data/virtual_data/kvm/images/ubuntu2004.img,size=40 \
  --vcpus 4 \
  --os-variant ubuntu20.04 \
  --network bridge=br0 \
  --graphics vnc,listen=0.0.0.0 --noautoconsole \
  --console pty,target_type=serial \
  --cdrom /data/virtual_data/os/ubuntu-20.04.6-live-server-amd64.iso

3.3 安装 CentOS / openEuler

# CentOS 7.9
virt-install \
  --name CentOS-7.9-dag \
  --ram 8196 \
  --disk path=/data/virtual_data/kvm/images/CentOs-7.9-dag.img,size=40 \
  --vcpus 4 \
  --os-variant rhel7.9 \
  --network bridge=br0 \
  --graphics vnc,listen=0.0.0.0 --noautoconsole \
  --console pty,target_type=serial \
  --cdrom /data/virtual_data/os/CentOS-7-x86_64-DVD-2009.iso

# openEuler
virt-install \
  --name openEuler-20.03 \
  --ram 8196 \
  --disk path=/data/virtual_data/kvm/images/openEuler-20.03-LTS-x86_6.img,size=40 \
  --vcpus 4 \
  --os-variant rhel7.9 \
  --network bridge=br0 \
  --graphics vnc,listen=0.0.0.0 --noautoconsole \
  --console pty,target_type=serial \
  --cdrom /data/virtual_data/os/openEuler-20.03-LTS-x86_64-dvd.iso

3.4 通过 VNC 完成系统安装

--graphics vnc,listen=0.0.0.0 会在宿主机监听 VNC(默认端口从 5900 开始),使用 VNC 客户端连接后完成图形安装。

3.5 virsh console 卡住的问题

安装完成后 virsh console 可能一直卡在转义字符处。原因是没有给内核传递串口参数。编辑虚拟机内的 /etc/default/grub:

GRUB_CMDLINE_LINUX_DEFAULT="... console=ttyS0"

然后:

update-grub
reboot

四、日常管理

virsh list --all          # 查看所有虚拟机
virsh domrename old_name new_name   # 重命名
virsh start vm-name       # 启动
virsh console vm-name     # 进入串口终端
virsh shutdown vm-name    # 优雅关机
virsh destroy vm-name     # 强制断电

生产环境建议通过 SSH 连接虚拟机,而不是依赖 virsh console。

五、克隆虚拟机

virt-clone \
  -o ubuntu2004 \
  -n k8s_node1 \
  -f /data/virtual_data/kvm/images/ubuntu2004-node1.img

克隆过程会自动修改 MAC、UUID 等冲突项,但以下内容需要手动处理:

  • 虚拟机 IP 地址
  • 主机名
  • /etc/hosts 中的主机名映射

六、删除虚拟机

# 强制关机
virsh destroy guest1

# 删除虚拟机及其存储卷
virsh undefine guest1 --remove-all-storage

七、总结

  • KVM + libvirt + virt-install 是最常用的开源虚拟化组合。
  • 桥接网络让虚拟机获得局域网 IP,nmcli 创建桥失败时可用 connection.master 补救。
  • osinfo-query os 帮助选择正确的 --os-variant。
  • virsh console 卡住时给内核加 console=ttyS0。
  • 克隆后的虚拟机必须修改 IP、主机名和 hosts 映射。

相关脚本

整理自 cyy-tag/bash-example 仓库: