ARTICLE DETAIL

资讯详情

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

KVM虚拟化国产化底座解析:从内核原理到生产迁移实践

KVM虚拟化国产化底座解析:从内核原理到生产迁移实践 我入行那年身边还没有多少人认真讨论KVM。大家桌上默认是VMware ESXi机房角落里的KVM切换器反而被当成“老古董”。十六年后回头看这两条线在中国关键行业里悄悄汇合并且成了国产化底座中最绕不开的部分。“十五五”规划落地后我们团队接到的迁移项目越来越多而几乎所有项目最终都指向同一个技术内核——KVM。一个从2009年开始做Linux虚拟化的本土团队就是我所在的这家厂商。这篇文章不是概念科普而是把一个真实跑过的国产化迁移过程以及这16年的取舍摊开来讲。如果你想在国产化项目里少踩坑或者想弄明白为什么关键行业都在谈KVM底座这篇应该能给你一个完整答案。1. 为什么说KVM是国产化底座的“既成事实”1.1 先分清两个KVM别在方案里闹笑话做这行越久越发现一个尴尬问题一屋子人开会谈KVM说的可能是两件完全不同的东西。一个是Linux内核里的KVM虚拟化英文全称是Kernel-based Virtual Machine2007年合入Linux 2.6.20之后发展成服务器虚拟化的绝对主流另一个是机房里的KVM切换器键盘、显示器和鼠标的集中管控设备现在大多带IP远程管理功能也叫KVM over IP。关键行业做国产化底座这两个都得做常常在一个项目里同时出现。虚拟化KVM管的是“计算资源怎么切分”让一台物理服务器上跑多套业务系统KVM切换器管的是“服务器故障时运维人员怎么进场”也就是带外管理通道。我们做信息化项目国产化改造方案时最怕的就是方案里只写了虚拟化漏了带外管理设备等到验收时才发现机房里的远程控制台还是某进口品牌的设备合规性一下子就不够了。所以我的习惯是方案一开始就把这两个KVM分开列成一章。先说虚拟化底座再说带外管理通道。两者名字一样底层逻辑完全不同但共同支撑起了“关键行业业务连续运行”这个目标。1.2 关键行业为什么选KVM而不是自研虚拟化不少人问过一个问题国产化是不是意味着要把虚拟化层也完全从零写一个答案很明确不是也不应该。KVM是Linux内核的一部分本来就是开源底座任何能运行Linux的国产CPU理论上都能跑KVM。这比从零写一套虚拟化要现实得多也安全得多。从工程角度看自研虚拟化面临几个几乎无法逾越的坎。第一是CPU架构适配国产CPU里有ARM、x86、LoongArch等不同指令集每类架构的虚拟化扩展都不一样全自研等于每个架构都要维护一套第二是设备模拟虚拟机里出现的网卡、磁盘控制器、显卡、USB控制器都需要QEMU这种用户态模拟器来提供这部分工作量极大第三是生态Linux厂商、云厂商、安全工具都在围绕KVM做兼容“从零自研”很难获得同类支持。VMware确实成熟但关键行业国产化改造后底层芯片换成了国产平台授权模式、版本升级路径、安全评估工作都成了新的变数。相比之下KVM是开放且可控的内核升级、补丁修复、性能调优都在自己手里。不是“国外的不能用才选KVM”而是“选KVM最符合关键行业长期可控的需求”。1.3 从办公替换到生产替换底座要求完全不同“十五五”落地之前很多单位的国产化项目集中在办公系统装一台虚拟机、跑个OA、再挂几个国产Office基本就满足要求了。但现在明显不一样迁移对象从办公系统走向核心生产系统数据库、中间件、工业控制软件、视频监控平台一个个都要往上搬。“能开虚拟机”早就不是本事真正难的是让虚拟机跑得稳、跑得快、能迁移、可恢复。这对KVM底座的要求是质变。办公系统挂了可以重启生产系统挂了就是事故。底座必须提供虚拟机热迁移、磁盘快照、备份容灾、性能监控、安全审计这些能力。KVM本身提供了热迁移的底层能力但要把这些能力封装成一个运维团队能接受的产品还需要大量工程化工作。这也是为什么我认为KVM国产化底座不是“装个开源平台”那么简单而是一个长期积累的过程。2. 16年路线复盘从版本适配到全栈迁移2.1 早期在一堆发行版上被KVM“教育”我们团队起步是在2009年那时候国内聊KVM虚拟化的人远没有现在多。早期环境很朴素服务器是Intel Xeon 5500系列操作系统是Debian 6/7再配qemu-kvm和libvirt。那时候最常干的事就是手动加载kvm_intel或kvm_amd模块再用一串长长的qemu-system-x86_64命令行把虚拟机拉起来。那个阶段吃了很多亏。内核升级后KVM模块不匹配虚拟机一启动就报KVM: entry failed, hardware error装Windows客户机没有virtio驱动只能用IDE磁盘和rtl8139网卡模拟性能惨不忍睹VNC远程连接卡到几乎没法操作。但也正是这些早期的坑让我们把KVM和QEMU的分层关系看得清清楚楚。现在做国产化很多同事觉得KVM就是装个包的事可一旦遇到国产CPU或者国产OS的内核差异当年那些手工排查经验就变成了救命的东西。Debian上的KVM体验帮助团队建立了“内核模块用户态QEMUlibvirt管理”的完整概念。后来转到CentOS、openEuler、麒麟其实核心逻辑都是一样的KVM负责CPU虚拟化和内存虚拟化QEMU负责设备模拟libvirt负责统一管理。这个分层认知是后续所有国产化适配的基础。2.2 中期平台化与性能调优2014年前后我们开始做自研虚拟化管理平台。理由很简单光靠virsh命令行没法支撑几十台服务器的运维更没法给客户提供一套可视化的管理界面。基于libvirt API做开发把虚拟机生命周期管理、存储池、网络池、快照、备份都做成Web接口。这个阶段真正考验人的是性能调优。关键行业客户最常说的一句话是“虚拟化会不会让性能打折扣”。为了回答这个问题我们把CPU绑定、NUMA亲和性、大页内存、virtio半虚拟化、vhost-net多队列这些参数一个个拉出来测。测下来优化前后的性能差距非常明显不调优的虚拟机网卡吞吐量可能只有几百Mbps用了virtio多队列之后轻松跑满万兆磁盘IOPS也是几倍的差距。那时候积累下来的调优经验后来几乎原封不动应用到了国产平台上。同时我们把机房里的带外KVM切换器也做了国产化替换。一开始只是普通的KVM over IP设备后来加上了统一认证、操作审计、断线重连慢慢和虚拟化底座一起打包交付。这样运维人员不需要进机房就能完成远程安装系统、查看故障、重启服务器这些操作。2.3 近五年国产芯片和国产OS的“配对磨合”真正的挑战出现在国产化替代启动之后。同一个虚拟化平台要适配鲲鹏、飞腾、海光、龙芯这些不同架构的CPU再叠加麒麟、统信、openEuler这些国产操作系统排列组合的数量非常大。ARM架构的鲲鹏和飞腾要处理ACPI表差异、CPU拓扑识别、虚拟化扩展特性检测海光因为兼容x86指令集适配相对顺利但固件和微码层仍然有细节差异龙芯的LoongArch比较年轻QEMU的支持一直在更新每出一个新版本就要重新验证。操作系统层面也一样不同发行版内核版本不同libvirt版本不同默认安全策略也不同。同一个迁移方案在麒麟上跑通到了统信上可能就因为SELinux或者AppArmor策略被拦住了。这些坑没有捷径可走只能一个个配对测试。我们建了一个矩阵清单把CPU、OS、虚拟化版本、内核参数、virtio驱动版本全部列出来每完成一次组合测试就更新记录。做到后面交付团队不再问“能不能跑”而是问“在这个组合里应该用哪个内核参数”。2.4 沉淀下来的完整底座长什么样十六年下来我们说的“底座”已经不是一个单一的软件而是一套分层结构层次内容说明硬件层国产CPU服务器鲲鹏、飞腾、海光、龙芯等虚拟化层KVM QEMU libvirt内核级虚拟化底座平台层自研云管理平台虚拟机生命周期、监控、备份迁移层异构转换、驱动注入、在线迁移解决“怎么搬过去”的问题运维层监控告警、日志采集、带外管理让运维团队愿意接手合规层审计日志、安全基线、等级保护辅助满足关键行业监管要求这套结构的好处是解耦。硬件层可以随时换CPU品牌只要虚拟化层和平台层做好适配迁移层独立出来客户可以先迁业务系统再逐步替换硬件不用一次性推倒重来合规层单独沉淀每个项目做完之后审计报告和配置基线直接复用省掉大量重复沟通。我们跟客户讲“底座”从来不是指某一个软件而是指这六层合在一起能支撑业务系统长期稳定运行的能力。3. 实操用KVM从0搭建国产化迁移环境3.1 硬件检查和宿主机准备不管你是要验证方案还是真的准备生产迁移第一件事都是确认这台服务器能不能跑KVM。方法很简单在宿主机上执行egrep -c (vmx|svm) /proc/cpuinfo返回值大于0说明CPU支持硬件虚拟化扩展Intel叫VMXAMD叫SVM。ARM架构上检查方式不太一样通常看内核是否包含KVM模块比如ls /dev/kvm只要这个设备节点在基本就没问题。接下来安装KVM整套工具链。Debian/Ubuntu系执行apt install qemu-system-x86 libvirt-daemon-system libvirt-clients virtinstopenEuler、麒麟、CentOS系用dnf install qemu-kvm libvirt virt-install安装完成后把当前用户加入libvirt组避免每次都要sudousermod -aG libvirt $(whoami)注意国产OS的软件源里可能内置了qemu和libvirt但版本偏旧。如果遇到兼容性问题优先看官方源是否提供了较新的虚拟化包不要贸然编译否则升级内核后KVM模块的一致性又成问题。3.2 配置桥接网络让虚拟机接入局域网虚拟机默认使用NAT网络也就是宿主机做地址转换虚拟机对外访问没问题但从外面很难直接访问虚拟机。生产环境必须用桥接网络让虚拟机直接挂在局域网里IP由机房统一分配别人能直接访问虚拟机虚拟机也能直接访问其他设备。Debian系的经典配置是编辑/etc/network/interfacesauto br0 iface br0 inet static address 192.168.1.10 netmask 255.255.255.0 gateway 192.168.1.1 bridge_ports eno1 bridge_stp off bridge_fd 0如果使用NetworkManager管理可以用nmcli快速创建nmcli con add type bridge ifname br0 con-name br0 ipv4.method manual ipv4.addresses 192.168.1.10/24 ipv4.gateway 192.168.1.1 nmcli con add type bridge-slave ifname eno1 master br0 nmcli con up br0配置完桥接后在宿主机上执行ip addr show br0确认有IP地址再用brctl show查看桥中包含的物理网卡。如果物理网卡和br0都拿到了IP说明配置成功。这一步极其关键因为很多国产OS默认启用了firewalld或ufw桥接配置好了但防火墙不放行虚拟机照样不通排查时先看一眼防火墙状态。3.3 创建第一台国产OS虚拟机环境准备好后用virt-install创建虚拟机这是最标准的做法。比如给一台国产OS安装系统virt-install \ --name kylin-test \ --memory 8192 \ --vcpus 4 \ --disk path/var/lib/libvirt/images/kylin-test.qcow2,size100,formatqcow2 \ --cdrom /mnt/iso/Kylin.iso \ --os-variant generic \ --network bridgebr0 \ --graphics vnc,listen0.0.0.0 \ --noautoconsole参数含义不复杂--name是虚拟机名字--memory内存--vcpusCPU核数--disk指定磁盘路径和大小--cdrom指定ISO镜像路径--graphics开启VNC远程图形--noautoconsole表示创建完成后不自动进入控制台。执行这个命令之前最好先跑一下osinfo-query os看看libvirt是否认识你用的系统版本。很多国产OS不在osinfo默认列表里直接用--os-variant generic是最稳妥的选择。安装过程中用VNC客户端连接宿主机IP的5900端口第一台虚拟机默认端口就能看到图形安装界面。服务器上不想开图形协议的话也可以加上--location指定网络安装源走文本安装流程。3.4 从VMware或物理机迁移到KVM迁移是国产化项目中最常见、也最容易翻车的环节。最简单的场景是从VMware导出虚拟机磁盘然后用qemu-img转换格式qemu-img convert -p -O qcow2 vmware-disk.vmdk migrated.qcow2转换完成后用virt-install导入这块磁盘创建虚拟机即可。不过这只处理了磁盘格式虚拟机里的配置、驱动、内核参数还是原样能不能起来要看运气。更专业的做法是用virt-v2v做整体转换。它会处理磁盘格式转换、设备模型调整、virtio驱动安装还会重写虚拟机的XML配置virt-v2v -i vmx vmware-virtual-machine.vmx -o local -os /data/vms如果源环境是物理机那就只能先在物理机上把系统做镜像再转换格式。这类迁移最花时间的是驱动适配。Linux迁移相对容易进系统后重新生成initramfs、调整一下grub参数就能跑Windows迁移要提前把virtio-win驱动打进系统否则转换后大概率蓝屏根本进不了系统。实操中有一个很重要的原则迁移不是一次命令就能完成的事尤其是存量生产系统一定要先做演练、再正式迁移并且保留原虚拟机直到新环境稳定运行否则出了问题没有回滚机会。4. 生产环境的性能与安全配置要点4.1 CPU绑定、NUMA与大页内存一台物理服务器上如果跑了很多虚拟机默认的资源调度方式是vCPU时分复用这会带来上下文切换开销。关键生产虚拟机建议做CPU绑定让虚拟机的vCPU固定跑在特定的物理CPU核上降低抢占和缓存失效。绑定配置在虚拟机XML里cputune vcpupin vcpu0 cpuset0/ vcpupin vcpu1 cpuset1/ vcpupin vcpu2 cpuset2/ vcpupin vcpu3 cpuset3/ /cputuneNUMA的问题同样常见。国产服务器大多数是多路CPU跨NUMA节点访问内存的延迟比本节点高不少。新创建的虚拟机如果内存和CPU分配跨越了两个NUMA节点性能会有明显抖动。先用numactl --hardware查看拓扑再用virsh vcpupin和内存绑定的方式把虚拟机收敛到一个NUMA节点上。大页内存是另一个必调项。虚拟机默认用4KB小页内存TLB命中率低数据库这类内存密集应用尤其吃亏。宿主机上预留大页echo 1024 /proc/sys/vm/nr_hugepages或在/etc/sysctl.conf里加vm.nr_hugepages1024然后虚拟机XML改为memoryBacking hugepages/ /memoryBacking配置完成后检查cat /proc/meminfo | grep HugePages确认已分配的页数。如果分配失败通常是内存碎片或预留不足重启宿主机往往是最快的解决办法。4.2 存储与网络必须virtio化很多迁移过来的虚拟机默认使用模拟设备比如e1000网卡、IDE磁盘。这些设备兼容性确实好但性能很差。KVM下必须改用半虚拟化设备virtio让虚拟机知道自己在虚拟化环境中配合宿主机vhost-net直接处理网络包跳过多层模拟。网卡XML配置示例interface typebridge source bridgebr0/ model typevirtio/ driver namevhost queues4/ /interface磁盘用virtiodisk typefile devicedisk driver nameqemu typeqcow2 cachenone ionative iothread1/ source file/var/lib/libvirt/images/app.qcow2/ target devvda busvirtio/ /diskiothread是给磁盘操作开辟独立线程避免IO阻塞vCPU。队列数量和vCPU数量匹配比如4个vCPU配4个队列效果最好。Windows虚拟机记得安装virtio-win驱动否则/dev/vda这类总线根本不识别。我遇到过很多次“性能比VMware差”的反馈去了现场一看虚拟机还在用rtl8139网卡和IDE磁盘性能能好才怪。所以性能问题的第一条排查规则永远是先把设备模型全部virtio化。4.3 安全基线TLS、审计与权限收敛KVM生产环境不是装完就能用的安全基线必须跟上尤其是关键行业。第一是管理通道加密libvirt默认本地socket通信如果需要远程管理必须开启TLS不能直接裸奔TCP。配置/etc/libvirt/libvirtd.conf中的listen_tls 1、listen_tcp 0再补上CA证书和服务端证书。第二是VNC安全。VNC本身不加密传输的键盘鼠标操作都能被抓包。生产环境尽量用SPICETLS或者干脆关闭图形协议用串口控制台配合virt-manager管理。必须开VNC时至少设置密码并绑定到管理网地址别监听0.0.0.0。第三是权限收敛。给运维团队分配账号时按角色最小授权普通运维只给虚拟机的操作权限不给宿主机shell权限。同时开启auditd审计把虚拟机创建、删除、迁移、快照回滚这些操作全部记录。合规审计时这套日志比任何口头解释都有说服力。4.4 国产OS上线前的验证清单我们每次交付前都会做一轮完整验证推荐你也这么做验证项方法通过标准CPU虚拟化特性虚拟机内lscpu能看到Hypervisor厂商内存带宽mbw或lmbench与物理机偏差在10%以内磁盘IOPSfio随机读/写达到物理盘80%以上网络吞吐iperf3打流能跑满业务所需带宽数据库性能sysbench TPS测试符合客户基线虚拟机热迁移迁移中持续ping虚拟机丢包率小于0.1%重启稳定性连续重启10次无启动失败这张表看着简单但每个项目都要靠它挡掉很多无谓的扯皮。有了数据客户再提出“虚拟机性能不行”时可以直接找出是哪个环节出了问题而不是被一句笼统的“感觉卡”带着走。5. 迁移过程中的5个高频故障与排查思路5.1 虚拟机启动即黑屏或内核panic这是迁移后遇到最多的现象原因通常有三个。第一是CPU模型不兼容原来在VMware里用的CPU模型比较老迁移到KVM后默认模型和宿主机差异太大。解决办法是在虚拟机XML里加cpu modehost-passthrough/让虚拟机直接使用宿主机CPU特性避免某些指令集缺失引发panic。第二是内核驱动缺失尤其是Linux虚拟机没有把virtio驱动编进initramfs换成virtio磁盘后找不到根文件系统。需要在迁移前先把virtio驱动加载进initramfs再改磁盘总线。第三是内存配置问题比如宿主机大页预留不足虚拟机启动时申请不到内存表现就是启动卡住看日志会看到Unable to find memory source。5.2 迁移后网络不通、UUID冲突网络不通绝大多数是MAC地址和网卡名变了。从VMware迁过来网卡从原来的一张变成了virtio网卡MAC地址变了DHCP分配的IP自然不同。传统做法是让系统用一致性命名规则重新识别网卡或者修改/etc/default/grub在GRUB_CMDLINE_LINUX里加net.ifnames0让网卡回到eth0命名。UUID冲突是另外一个大坑。有些人复制虚拟机磁盘时直接把XML也复制了一份两个虚拟机UUID完全一样libvirt直接拒绝启动第二台。解决方法是删除或重新生成UUIDuuidgen然后把新UUID填到XML里或者用virt-clone工具生成克隆虚拟机它会自动处理UUID、MAC和磁盘路径。5.3 Windows客户机的驱动与激活问题Windows迁移比Linux麻烦得多。最经典的场景是Windows启动蓝屏提示INACCESSIBLE_BOOT_DEVICE原因就是系统里没有virtio磁盘驱动。解决办法是先挂载virtio-win驱动ISO在迁移前离线安装磁盘控制器驱动再切换磁盘总线。顺序一定不能错先装驱动再换设备模型。激活失效也很常见。Windows的激活机制会记录主板、CPU、硬盘等信息虚拟机从VMware迁到KVM后硬件信息全变了激活状态自然失效。关键行业采购的正版Windows授权一般都有虚拟化许可条款迁移后重新激活一次即可但这个流程一定要提前走别等业务断掉了才发现。5.4 性能比VMware差先查这几个参数客户反馈“性能不如原环境”时按这个顺序查设备模型是否virtio化查virsh dumpxml里的model typeCPU governor是否处于powersave模式用cpupower frequency-info确认是否超分了CPU查virsh vcpuinfo看实际物理核归属内存是否跨越NUMA节点用numactl --membind确认磁盘cache模式是否合适数据库虚拟机建议cachenone或采用直通磁盘这五项检查完百分之八十的性能问题都能定位。剩下百分之二十大概率是应用本身在虚拟化环境下的配置问题比如数据库内存参数没调、JVM堆设置不合理那就不能怪虚拟化层了。5.5 备份与容灾别让快照成为定时炸弹快照是个让人又爱又恨的功能。临时演练时快照很有用但生产虚拟机如果长期挂着快照不合并磁盘性能会越来越差IO请求要一层层查差异文件。我们处理过一个案例某虚拟机快照层叠了四层每个操作延迟高达几百毫秒合并快照之后性能立竿见影恢复。生产环境应该用独立的备份机制而不是靠快照。KVM下可以用virsh dump配合磁盘存储卷复制做整机备份也可以用qemu内部snapshot做时间点备份但一定要设置合并策略避免快照链无限拉长。容灾层面KVM支持存储迁移和在线迁移多台宿主机之间配置共享存储后可以实现虚机漂移节点故障时自动在另一台宿主机拉起业务。这套能力是KVM底座的核心价值也是关键行业选择它的重要原因。6. 关于下一个五年我们还在补什么6.1 从“能跑”到“好管”运维可观测性国产化改造走到今天“能跑”已经不是卖点客户更关心运维体验。一个没有监控告警、没有日志中心、没有资源趋势分析的虚拟化平台在大型项目里很难落地。我们正在把虚拟机的CPU、内存、磁盘IO、网络流量全部上报到统一监控平台配合已有的带外KVM管理通道让运维人员在虚拟化和物理设备之间看到完整视图。这项工作不复杂但很琐碎也是一个“底座”真正成熟的标准。6.2 安全可信从口号变成落地清单越来越多的客户开始问可信计算、虚拟TPM、SecureBoot、远程证明这些能力。KVM在这个方向有天然优势因为它是Linux内核的一部分可以和内核安全机制深度集成例如基于vTPM为虚拟机提供可信根、用SELinux/AppArmor约束虚拟机资源边界。真正要花时间的不是功能而是把安全能力做成开箱即用的配置模板让交付团队不用每次到现场临时摸索。6.3 给正在做同类事情的团队几点实在建议第一别低估兼容性测试。国产CPU和国产OS的组合太多每个都可能踩到不同的坑提前建矩阵逐项测试省得到客户现场再补救。第二用标准镜像和自动化交付不要每个项目都手工装系统能自动化的绝不手动。第三迁移工具要提前打磨商业迁移工具不一定覆盖得了每一种国产组合自研或者深度定制才是长期出路。第四保留一批物理机做性能基准客户说“虚拟化慢”的时候数据是最好的说服工具。第五方案文档趁早沉淀每个项目记录问题、解决方案和配置基线下个项目直接复制修改能省一大半时间。按我个人这16年的体会KVM从来不是最炫的技术但它是最容易被忽视的“底层共识”。十六年前我们趴在Debian机器上调试qemu参数十六年后全国产栈里跑着同一个内核模块这条路没有捷径。真正筑牢底座的是一个个迁移项目里磨出来的经验和数据。如果你正要做国产化迁移别急着选大而全的商业套件先跑通一台KVM虚拟机可能比预想中更能说明问题。
返回列表