跳转到内容

KVM/libvirt 虚拟化

在安装 KVM 之前,必须确认 CPU 支持硬件虚拟化(Intel VT-x 或 AMD-V)。

Terminal window
# 检查 CPU 是否支持虚拟化扩展
grep -Ec '(vmx|svm)' /proc/cpuinfo

如果返回值大于 0,说明 CPU 支持虚拟化。

Terminal window
# 检查 KVM 内核模块是否已加载
lsmod | grep kvm

正常应看到 kvmkvm_intel(Intel CPU)或 kvm_amd(AMD CPU)。

Terminal window
sudo dnf install -y qemu-kvm libvirt virt-install virt-viewer \
libvirt-client bridge-utils

如果需要图形化管理工具:

Terminal window
sudo dnf install -y virt-manager
Terminal window
sudo systemctl enable --now libvirtd

验证:

Terminal window
sudo systemctl status libvirtd
virsh version
Terminal window
sudo usermod -aG libvirt $(whoami)

重新登录后生效,之后可以以普通用户身份使用 virsh 连接系统级虚拟机。

virsh 是 libvirt 的命令行管理工具,用于管理虚拟机的完整生命周期。

Terminal window
# 列出正在运行的虚拟机
virsh list
# 列出所有虚拟机(包括关闭的)
virsh list --all
# 启动虚拟机
virsh start myvm
# 正常关机
virsh shutdown myvm
# 强制关闭(相当于拔电源)
virsh destroy myvm
# 重启虚拟机
virsh reboot myvm
# 暂停/恢复虚拟机
virsh suspend myvm
virsh resume myvm
Terminal window
# 查看虚拟机详情
virsh dominfo myvm
# 查看虚拟机 XML 配置
virsh dumpxml myvm
# 查看虚拟机 VNC 显示地址
virsh vncdisplay myvm
# 查看虚拟机使用的磁盘
virsh domblklist myvm
# 查看虚拟机网络接口
virsh domiflist myvm
Terminal window
# 编辑虚拟机 XML 配置
virsh edit myvm
# 设置开机自启
virsh autostart myvm
# 取消开机自启
virsh autostart --disable myvm
# 修改虚拟机内存(需要关机状态)
virsh setmaxmem myvm 4G --config
virsh setmem myvm 4G --config
# 修改 vCPU 数量(需要关机状态)
virsh setvcpus myvm 4 --config --maximum
virsh setvcpus myvm 4 --config
Terminal window
sudo virt-install \
--name almalinux9 \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/almalinux9.qcow2,size=20,format=qcow2 \
--os-variant almalinux9 \
--network network=default \
--graphics vnc,listen=0.0.0.0 \
--cdrom /data/iso/AlmaLinux-9-latest-x86_64-minimal.iso \
--boot uefi
Terminal window
sudo virt-install \
--name almalinux9-auto \
--ram 2048 \
--vcpus 2 \
--disk path=/var/lib/libvirt/images/alma9-auto.qcow2,size=20,format=qcow2 \
--os-variant almalinux9 \
--network network=default \
--graphics none \
--location /data/iso/AlmaLinux-9-latest-x86_64-minimal.iso \
--initrd-inject /data/ks/alma9-ks.cfg \
--extra-args "inst.ks=file:/alma9-ks.cfg console=ttyS0"
Terminal window
# 下载云镜像
wget https://repo.almalinux.org/almalinux/9/cloud/x86_64/images/AlmaLinux-9-GenericCloud-latest.x86_64.qcow2
# 复制并调整磁盘大小
cp AlmaLinux-9-GenericCloud-latest.x86_64.qcow2 /var/lib/libvirt/images/myvm.qcow2
qemu-img resize /var/lib/libvirt/images/myvm.qcow2 20G
# 使用 cloud-init 配置创建虚拟机
sudo virt-install \
--name myvm \
--ram 2048 \
--vcpus 2 \
--disk /var/lib/libvirt/images/myvm.qcow2 \
--os-variant almalinux9 \
--network network=default \
--import \
--cloud-init root-password-generate=on,disable=on \
--graphics none
Terminal window
# 创建快照
virsh snapshot-create-as myvm --name "before-update" --description "系统更新前"
# 列出快照
virsh snapshot-list myvm
# 恢复快照
virsh snapshot-revert myvm --snapshotname "before-update"
# 删除快照
virsh snapshot-delete myvm --snapshotname "before-update"
Terminal window
# 创建新磁盘
qemu-img create -f qcow2 /var/lib/libvirt/images/data-disk.qcow2 50G
# 在线添加磁盘到虚拟机
virsh attach-disk myvm /var/lib/libvirt/images/data-disk.qcow2 vdb \
--driver qemu --subdriver qcow2 --persistent
# 查看磁盘信息
qemu-img info /var/lib/libvirt/images/myvm.qcow2
# 卸载磁盘
virsh detach-disk myvm vdb --persistent
Terminal window
# 先关闭源虚拟机
virsh shutdown myvm
# 克隆
virt-clone --original myvm --name myvm-clone \
--file /var/lib/libvirt/images/myvm-clone.qcow2
Terminal window
# 关闭虚拟机
virsh destroy myvm
# 删除虚拟机定义
virsh undefine myvm
# 连同磁盘一起删除
virsh undefine myvm --remove-all-storage

virt-manager 提供了图形化的虚拟机管理界面。

直接在桌面环境中启动:

Terminal window
virt-manager

在本地工作站上连接远程服务器的 libvirt:

Terminal window
virt-manager -c qemu+ssh://root@192.168.1.100/system

或者在 virt-manager 界面中选择”文件 > 添加连接”,选择 QEMU/KVM,勾选”通过 SSH 连接到远程主机”。

libvirt 默认创建一个名为 default 的 NAT 网络(通常是 192.168.122.0/24)。

Terminal window
# 查看网络列表
virsh net-list --all
# 查看网络详情
virsh net-info default
# 启动默认网络
virsh net-start default
# 设置默认网络开机自启
virsh net-autostart default

桥接网络让虚拟机直接接入物理网络,获取与宿主机同一网段的 IP 地址。

  1. 使用 nmcli 创建网桥:

    Terminal window
    # 创建网桥 br0
    sudo nmcli connection add type bridge con-name br0 ifname br0
    # 配置网桥 IP(根据你的网络环境修改)
    sudo nmcli connection modify br0 \
    ipv4.addresses 192.168.1.100/24 \
    ipv4.gateway 192.168.1.1 \
    ipv4.dns "223.5.5.5,8.8.8.8" \
    ipv4.method manual
    # 将物理网卡加入网桥
    sudo nmcli connection add type bridge-slave con-name br0-ens192 \
    ifname ens192 master br0
    # 激活网桥(注意:远程操作时可能断开连接)
    sudo nmcli connection up br0
    sudo nmcli connection down ens192
  2. 创建 libvirt 桥接网络定义文件 /tmp/bridge-net.xml

    <network>
    <name>host-bridge</name>
    <forward mode="bridge"/>
    <bridge name="br0"/>
    </network>
  3. 在 libvirt 中注册桥接网络:

    Terminal window
    virsh net-define /tmp/bridge-net.xml
    virsh net-start host-bridge
    virsh net-autostart host-bridge
  4. 创建虚拟机时使用桥接网络:

    Terminal window
    sudo virt-install \
    --name bridged-vm \
    --ram 2048 \
    --vcpus 2 \
    --disk path=/var/lib/libvirt/images/bridged-vm.qcow2,size=20 \
    --os-variant almalinux9 \
    --network network=host-bridge \
    --cdrom /data/iso/AlmaLinux-9-latest-x86_64-minimal.iso
Terminal window
# 关闭虚拟机
virsh shutdown myvm
# 编辑虚拟机配置
virsh edit myvm

在 XML 中找到 <interface> 部分,修改为:

<interface type='network'>
<source network='host-bridge'/>
<model type='virtio'/>
</interface>

启动虚拟机:

Terminal window
virsh start myvm
Terminal window
# 启用 KSM(内核同页合并)以节省内存
sudo systemctl enable --now ksm
sudo systemctl enable --now ksmtuned
# 查看 KSM 状态
cat /sys/kernel/mm/ksm/pages_shared

虚拟机配置建议:

  • 使用 virtio 驱动获得最佳磁盘和网络性能
  • 磁盘格式优先使用 qcow2(支持快照和精简配置)
  • 对 I/O 密集型负载考虑使用 raw 格式磁盘
  • 为虚拟机分配 Hugepages 以提升内存性能