虚拟化:KVM 安装与虚拟机管理
介绍 KVM/libvirt 的安装、nmcli 桥接网络配置、virt-install 安装虚拟机、日常管理和克隆操作。
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 仓库: