十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

KVM虚拟化快速部署实战:从环境检查到UEFI虚拟机创建

KVM虚拟化快速部署实战:从环境检查到UEFI虚拟机创建 这次测试的是我自己的第一版 KVM 虚拟化快速部署方案脚本和文档统一标记为 v1.25。先解释一个容易误解的点Linux 内核里的 KVM 模块本身没有 1.25 这种版本号这里的 1.25 是我整理出来的那套自用部署脚本和操作清单的版本标记。它不是商业软件也不存在“一键安装包”那种魔法就是把一套完整的 KVM 环境从检查 CPU 虚拟化开关、安装 qemu-kvm 和 libvirt、配置默认网络、用 virt-install 创建虚拟机、指定 UEFI 引导固件、再解决剪贴板互通和显示自适应这些零散操作全部固化成可重复执行的步骤。文章的核心关注点就是几个实用问题普通 x86_64 服务器能不能用最少命令把 KVM 跑起来guest OS 到底拿来做什么创建虚拟机时哪些参数必须提前给、哪些可以后续改能不能批量创建虚拟机以及遇到“UEFI 固件缺失”“剪贴板不互通”“全屏无法缩小”这类问题时应该先查哪一层。下面所有内容都围绕这次部署测试展开环境是支持 Intel VT-x 或 AMD-V 的 x86_64 宿主机操作系统为常见的 Debian/Ubuntu 或 CentOS/Rocky 系具体版本不固定命令里会区分说明。这套方案最值得参考的地方是“测试链路”而不是“某个短视频里的单条命令”。我会按环境检查 - 安装组件 - 启动 libvirtd - 创建第一台 UEFI 虚拟机 - 验证客机系统 - 测试剪贴板和分辨率 - 批量建机 - 性能资源观察 - 问题排查 的顺序走一遍。如果你正准备第一次在 Linux 服务器上搭 KVM 虚拟化这篇文章可以当一份可落地的检查清单用。1. 核心能力速览能力项说明项目类型Linux KVM 虚拟化部署脚本与操作清单版本v1.25自用脚本清单版本核心技术栈KVM QEMU libvirt virt-manager/virsh虚拟化硬件要求CPU 支持 Intel VT-x 或 AMD-VBIOS/UEFI 中开启对应开关支持平台Debian / Ubuntu / CentOS / Rocky 等主流 Linux 发行版管理方式CLIvirsh、virt-install为主图形环境可用 virt-managerUEFI 引导支持通过 OVMF 固件实现也可使用传统 BIOS 引导剪贴板互通通过 SPICE agent 和 spice-vdagent 实现批量建机支持脚本循环调用 virt-install 批量创建API 接口virsh 命令接口Python 可调用 libvirt API适合场景服务器虚拟化、多系统隔离测试、桌面虚拟机、学习 KVM 工作原理需要先明确一点KVM 的性能上限取决于 CPU 硬件虚拟化和 I/O 设备模拟方式并不是脚本版本号越高就越快。1.25 这个版本完成的是“把环境跑通并稳定复现”这是后续所有性能优化的基础。2. KVM 是什么guest OS 用来做什么KVMKernel-based Virtual Machine是 Linux 内核自带的虚拟化模块。它把 CPU 的硬件辅助虚拟化能力Intel VT-x 或 AMD-V直接暴露给用户态软件所以虚拟机的 vCPU 调度和内存隔离由内核负责设备模拟则交给 QEMU生命周期管理交给 libvirt。三者合在一起才得到一个完整可用的虚拟机平台。而 guest OS 就是运行在虚拟机里的客户操作系统。简单说宿主机的 Linux 是“外面的系统”guest OS 是“虚拟机里的系统”。guest OS 可以是另一个 Linux、Windows、FreeBSD也可以是只跑一个应用的极简系统。它和宿主机在 CPU、内存、磁盘、网络层面都是隔离的guest OS 崩溃通常不会影响宿主机。实际使用中guest OS 主要用于三种场景第一种是服务器整合一台物理服务器跑多个互相隔离的业务系统第二种是测试环境可以用独立虚拟机验证软件安装、网络策略、系统升级坏了直接删掉重建第三种是桌面系统隔离宿主机跑 Linux虚拟机里跑 Windows 处理只兼容 Windows 的办公软件同时保持主系统安全。我这次测试的第一台 guest OS 选用的是 Linux 发行版原因是镜像体积小、virtio 驱动支持完整、排查问题方便。3. 环境准备与前置条件3.1 检查 CPU 虚拟化支持KVM 想要正常运行CPU 必须支持硬件虚拟化指令集。如果 CPU 不支持KVM 会退化到纯 QEMU 软件模拟性能远达不到可用标准。安装之前先检查宿主机# 检查 CPU 是否支持虚拟化返回数字表示支持的逻辑核数 egrep -c (vmx|svm) /proc/cpuinfo # 检查内核模块是否已加载 lsmod | grep kvmIntel 平台对应kvm_intelAMD 平台对应kvm_amd。如果egrep返回 0说明 CPU 虚拟化没开需要重启进 BIOS/UEFI找到Intel Virtualization Technology或SVM Mode并开启。如果模块未加载先确认 CPU 支持后再手动加载# Intel CPU sudo modprobe kvm_intel # AMD CPU sudo modprobe kvm_amd3.2 内存、磁盘和网络规划KVM 本身占用资源很低资源消耗主要取决于你想跑多少个 guest OS。建议宿主机 8GB 内存起步磁盘至少预留 50GB。所有虚拟机的磁盘镜像统一放到独立分区避免根分区被撑满。网络方面libvirt 安装后会默认创建 NAT 网卡virbr0这个网卡可以让你在几分钟内先跑通一台虚拟机如果后续要对外提供服务再配置 Linux Bridge 或 SR-IOV。3.3 操作系统包管理器准备无论使用 Debian 系还是 RHEL 系安装新组件前先把软件源索引更新一下# Debian / Ubuntu sudo apt update # CentOS / Rocky / RHEL sudo dnf makecache需要注意如果你用的是最小化安装的 CentOS/Rocky默认可能没有dnf以外的额外软件源安装包出错时优先检查网络和源配置。4. 安装部署与启动方式4.1 安装 KVM 组件Debian/Ubuntu 和 RHEL 系的包名略有差异这里分开写# Debian / Ubuntu sudo apt install -y qemu-kvm libvirt-daemon-system libvirt-clients bridge-utils virtinst virt-manager ovmf # CentOS / Rocky / RHEL sudo dnf install -y qemu-kvm libvirt virt-install bridge-utils virt-manager edk2-ovmfovmf或edk2-ovmf就是 UEFI 固件包里面的 OVMF 文件用于虚拟机以 UEFI 模式启动。如果不装virsh 创建虚拟机时只能使用传统 BIOS 引导后面会遇到“UEFI 固件缺失”的问题。4.2 启动 libvirtd 服务安装完成后把 libvirtd 设为开机自启并立即启动sudo systemctl enable --now libvirtd sudo systemctl status libvirtd看到active (running)后还需要把当前用户加到libvirt和kvm组否则非 root 用户执行 virsh 时会提示权限不足sudo usermod -aG libvirt $USER sudo usermod -aG kvm $USER # 重新登录当前会话或执行 newgrp libvirt 让组权限生效4.3 验证 virsh 是否能管理虚拟机virsh version virsh list --all第一条命令能正常输出libvirt版本信息和 QEMU 版本信息说明服务可用第二条命令目前应该显示为空列表因为还没有创建任何虚拟机。5. 功能测试与效果验证5.1 创建第一台 Linux guest OS测试从创建第一台虚拟机开始。用virt-install创建一个 4GB 内存、2 个 vCPU、40GB qcow2 磁盘、使用默认 NAT 网络的 Linux 虚拟机sudo virt-install \ --name first-vm \ --memory 4096 \ --vcpus 2 \ --disk path/var/lib/libvirt/images/first-vm.qcow2,size40,formatqcow2 \ --cdrom /tmp/ubuntu-24.04-server.iso \ --os-variant ubuntu24.04 \ --network networkdefault \ --graphics vnc,listen0.0.0.0 \ --noautoconsole判断成功的标准是命令到最后没有报错并且virsh list --all里多出一台状态为running的虚拟机。如果virt-install提示找不到--os-variant对应的系统类型可以先执行osinfo-query os | grep ubuntu查看系统里支持的名称写法。5.2 通过 KVM 给服务器/虚拟机安装系统上面命令使用 ISO 镜像作为光驱安装系统。在服务器场景下还可以用 PXE 网络引导安装guest OS 从 DHCP 获取 IP再从 TFTP 服务器拉取安装内核适合批量交付服务器。对第一次测试而言ISO 安装链路更简单。安装时注意选择安装 virtio 相关组件尤其是 Linux 系统virtio 磁盘和 virtio-net 驱动可以明显提升 I/O 性能。5.3 UEFI 引导测试传统 BIOS 和 UEFI 是两种完全不同的启动路径。想要验证 UEFI 引导创建虚拟机时增加一行启动参数sudo virt-install \ --name uefi-vm \ --memory 4096 \ --vcpus 2 \ --disk path/var/lib/libvirt/images/uefi-vm.qcow2,size40,formatqcow2 \ --cdrom /tmp/ubuntu-24.04-server.iso \ --os-variant ubuntu24.04 \ --network networkdefault \ --boot loader/usr/share/OVMF/OVMF_CODE.fd,loader_royes,loader_typepflash \ --graphics vnc,listen0.0.0.0 \ --noautoconsole上面loader_typepflash表示使用 OVMF 固件且固件所在路径因发行版不同可能有差异。Debian/Ubuntu 通常在/usr/share/OVMF/OVMF_CODE.fdRHEL 系通常在/usr/share/edk2/ovmf/OVMF_CODE.fd。如果执行时报固件文件不存在执行find /usr/share -name OVMF_CODE.fd查找实际路径即可。如果固件路径正确虚拟机启动后进入安装界面时你可以看到设备名不再是传统的sd*而是nvme*或 UEFI 风格的分区结构说明已经走 UEFI 引导链路。5.4 内外剪贴板互通测试“KVM 内外剪贴板互通”是很多人关心的点。它依赖两件事宿主机侧的显示协议是 SPICE以及客户机内安装了spice-vdagent。如果创建虚拟机时--graphics使用的是 SPICE那么在 guest OS 里安装一个 agent 即可# Ubuntu / Debian guest sudo apt install -y spice-vdagent # CentOS / Rocky guest sudo dnf install -y spice-vdagent重启客户机后在 virt-manager 中打开虚拟机窗口宿主机和 guest OS 之间复制文本粘贴到对端测试。如果复制无效先在 guest 内执行systemctl status spice-vdagent确认服务是active (running)再检查 virt-manager 的虚拟机视图菜单里是否启用了 SPICE 通道。剪贴板互通在文本复制场景下最明显文件拖拽支持取决于 virtio-fs 或 shared folder 配置不要把两者混为一谈。5.5 全屏无法缩小的处理“全屏无法缩小”这个现象在 virt-manager 管理 Windows 或未安装驱动的 Linux 时最常出现。原因是虚拟机内部没有正确上报分辨率窗口管理器无法做动态缩放。处理思路如下第一安装客户机内的 spice-vdagent 或 virtio-win 驱动包Windows 系统还要额外安装 virtio-win 的显示驱动第二在 virt-manager 菜单里打开View-Scale Display选择Always或Auto第三如果你用的协议是 VNC那么 SPICE 的动态分辨率功能不生效换成 SPICE 显示协议才能获得最佳体验。只要 agent 正常虚拟机内部分辨率和外部窗口通常会自动联动。5.6 虚拟机生命周期操作验证创建完成后建议完整验证一遍生命周期操作# 关闭虚拟机发送 ACPI 关机信号 virsh shutdown first-vm # 启动虚拟机 virsh start first-vm # 重启虚拟机 virsh reboot first-vm # 查看虚拟机详细配置 virsh dumpxml first-vm这一轮测试可以确认 libvirt 对虚拟机的管理是否稳定。如果shutdown一直不生效通常是 guest 内没有安装 ACPI 服务改为virsh destroy可以强制关机但那是模拟断电尽量少用。6. 接口 API 与批量任务6.1 virsh 作为命令行接口virsh 本身就是 libvirt 提供的命令行接口适合脚本调用。判断一台虚拟机状态可以直接用virsh list --all virsh domstate first-vm在自动化脚本里可以先用virsh list --all拿到所有虚拟机名称再通过virsh vcpuinfo vm、virsh dominfo vm采集 CPU 和内存信息。这套接口稳定且不需要额外安装服务是 KVM 批量运维最直接的方式。6.2 Python libvirt API 示例如果需要写更复杂的管理程序可以使用 Python 的libvirt库。先安装 Python 绑定sudo apt install -y python3-libvirt # 或 pip install libvirt-python下面是一个查询所有虚拟机名称和状态的示例import libvirt conn libvirt.open(qemu:///system) if conn is None: raise SystemExit(无法连接 libvirt请检查服务状态) for vm_id in conn.listAllDomains(libvirt.VIR_CONNECT_LIST_DOMAINS_ACTIVE | libvirt.VIR_CONNECT_LIST_DOMAINS_INACTIVE): print(名称:, vm_id.name()) print(状态:, 运行 if vm_id.state()[0] libvirt.VIR_DOMAIN_RUNNING else 关闭) conn.close()实际项目接入时需要注意qemu:///system连接路径需要当前用户有 libvirt 组权限并以普通用户连接而不是直接用 root 避权。6.3 批量创建虚拟机KVM 的批量建机逻辑就是把 virt-install 放到循环里。这里给一个通用的 bash 模板按需修改虚拟机名前缀、vCPU 数量、内存大小和镜像路径#!/bin/bash VM_PREFIXbatch-vm IMAGE_DIR/var/lib/libvirt/images OS_VARIANTubuntu24.04 ISO_PATH/tmp/ubuntu-24.04-server.iso for i in 01 02 03 do VM_NAME${VM_PREFIX}-${i} DISK_PATH${IMAGE_DIR}/${VM_NAME}.qcow2 echo 创建虚拟机 ${VM_NAME} ... virt-install \ --name ${VM_NAME} \ --memory 2048 \ --vcpus 2 \ --disk path${DISK_PATH},size20,formatqcow2 \ --cdrom ${ISO_PATH} \ --os-variant ${OS_VARIANT} \ --network networkdefault \ --graphics vnc,listen0.0.0.0 \ --noautoconsole if [ $? -eq 0 ]; then echo ${VM_NAME} 创建成功 else echo ${VM_NAME} 创建失败请检查日志 fi done批量任务的关键不是循环而是幂等和失败重试。每个虚拟机都使用独立、唯一的名称和磁盘文件出错后只重试失败的那一台避免重复创建造成命名冲突和磁盘覆盖。7. 资源占用与性能观察KVM 的资源占用不能只看宿主机空闲内存。虚拟机创建后libvirt 会通过 QEMU 进程消耗实际物理内存所以直接用free -h看到的剩余内存下降是正常的。建议观察每个 QEMU 进程ps aux | grep qemu如果你发现某个虚拟机内存占用远高于配置值认真检查 guest 内部的实际负载如果你发现远低于配置值并且配置了内存气球驱动 virtio-balloon那说明宿主机正在回收该虚拟机的空闲内存这是正常现象。CPU 方面默认情况下虚拟机的 vCPU 是对应到宿主机的逻辑核上调度并不保证独占物理核。如果需要性能稳定可以后续配置 vCPU pinning 或 host-passthrough CPU 模式。创建虚拟机时如果没指定--cpu host-passthrough默认 CPU 模式可能无法使用某些较新的 CPU 指令集测试密集型计算时会看到性能差异。磁盘方面qcow2 是稀疏文件ls -lh显示的文件大小远小于实际写入量这是正常的。磁盘 I/O 模式建议使用 virtio这是 Linux guest 下默认支持的磁盘模型性能远好于 IDE。网络方面同样用 virtio-net如果当前是默认网卡可以通过修改虚拟机 XML 将model typee1000/替换为model typevirtio/。资源优化顺序建议是先确认 guest 内 virtio 驱动是否全装齐再决定要不要改 CPU 模式最后才考虑大页内存和 NUMA 绑定。不要一上来就调底层参数驱动缺失导致的性能下降远比 CPU 调度配置更常见。8. 常见问题与排查方法问题现象可能原因排查方式解决方案virt-install 创建失败提示 /dev/kvm not foundCPU 虚拟化未开启或 kvm 模块未加载检查egrep -c (vmx|svm) /proc/cpuinfo执行lsmod | grep kvmBIOS/UEFI 开启 VT-x/SVM执行modprobe kvm_intel或modprobe kvm_amdUEFI 固件缺失提示找不到 OVMF 固件未安装 ovmf / edk2-ovmf 包执行find /usr/share -name OVMF_CODE.fd安装对应固件包并把--boot loader路径改为find查到的实际路径内外剪贴板不互通guest 内未安装 spice-vdagent 或显示协议是 VNCguest 内执行systemctl status spice-vdagent安装 spice-vdagent将显示协议改为 SPICE 后重启客户机全屏无法缩小或分辨率无法调整缺少 guest 显示驱动缩放模式不对检查 virt-manager 的 View 菜单检查 guest 内是否识别 virtio-gpu 或 QXL安装 spice-vdagent / virtio-win选择 Scale Display 为 Auto普通用户执行 virsh 提示 permission denied用户不在 libvirt/kvm 组执行id查看当前用户组执行usermod -aG libvirt,kvm $USER后重新登录虚拟机开机后网络不通guest 内网卡未识别 virtio-net 驱动或 DHCP 没有获取到地址virt-manager 打开 console执行ip addr安装 guest 内对应驱动检查 virbr0 和 default 网络状态virsh net-listvirsh shutdown 后虚拟机一直不关guest 内没有安装 ACPI 服务登录 guest 执行systemctl status acpid安装 acpid或用virsh destroy强制关闭批量脚本创建第二台时报名称已存在上一次失败但虚拟机被部分创建执行virsh list --all查看残留虚拟机删除残留虚拟机和对应磁盘文件后重试宿主机重启后虚拟机没有自动启动未设置 autostart执行virsh list --all查看状态执行virsh autostart vm开启自启这里有一个概念需要额外提醒KVM 这个词在市场上也被用来指硬件 KVM 切换器。那种 KVM 是键盘、显示器、鼠标切换设备和 Linux 的 KVM 虚拟化没有任何关系。搜索资料时经常能看到 “ATEN KVM 登录密码”“KVM 切换器”之类的内容如果你是在做虚拟化直接忽略硬件切换器相关内容不要被关键词混淆。9. 最佳实践与使用建议第一次部署 KVM 时尽量控制变量不要一次性把 UEFI、SR-IOV、巨页、vCPU 绑定全部打开。正确顺序是先用默认配置创建一台虚拟机确认系统能装、能启动、网络通再逐步加 UEFI、改 virtio 设备、调分辨率、测试剪贴板。1.25 版本这套方案最大的价值就是“稳定基线”有了基线后续优化才有对比依据。目录规划上建议固定图片存储位置。先创建独立目录例如/data/kvm/images不要把虚拟机镜像全部堆在/var/lib/libvirt/images之外的任意位置尤其是不要放在用户主目录里权限混乱会影响 libvirt 正常读写。关键目录最好挂在独立磁盘分区上防止根分区写满导致所有虚拟机一起挂掉。批量任务要写日志。每次调用 virt-install 时把 stdout 和 stderr 重定向到日志文件报错时可以直接定位是哪一台、哪一步。加一个失败重试的简单循环比事后再翻屏幕输出高效得多。接口层面virt-manager 适合单机人肉操作真正的批量管理和定时任务请走 virsh 或 Python libvirt API。安全方面不要在公网直接暴露 libvirtd 的 TCP 端口也不要让 virt-manager 直接监听0.0.0.0做远程管理。VNC 监听地址最好设置为本机或内网受限地址必要时配合 SSH 隧道访问。所有 guest OS 必须单独评估用途测试系统不要用生产环境的账户密码涉及版权软件、闭源镜像和真实用户数据的虚拟机要确认授权和数据合规后再使用。映像文件建议配合快照使用。virsh snapshot-create-as vm backup可以在重要变更前快速留一个恢复点。快照不是备份长期保留快照会拖慢磁盘性能建议在验证完成后及时删除旧快照另用qemu-img做定期导出备份。10. 总结与下一步第一次把整套 KVM 方案跑通之后最值得验证的功能就三个guest OS 能否正常创建并安装系统、UEFI 引导是否生效、剪贴板和分辨率是否正常。先把这三件事测完其他优化项都可以往后放。最容易踩的坑也明确CPU 虚拟化开关没开、OVMF 固件路径写错、guest 内 spice-vdagent 没装齐这三个问题占了大多数失败案例。如果你也想试建议第一步先执行egrep -c (vmx|svm) /proc/cpuinfo确认硬件支持再继续。后续扩展方向可以考虑配置 Linux Bridge 让虚拟机桥接到物理网络、用 virt-customize 预置系统盘实现免交互安装、再接上 Ansible 做批量虚拟机交付。KVM 的稳定性和灵活性都够关键是把第一套基线搭好后面的自动化才有地方生根。
返回列表