ARTICLE DETAIL

资讯详情

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

KVM国产化底座:16年沉淀与迁移实操全解析

KVM国产化底座:16年沉淀与迁移实操全解析 聊KVM国产化底座先还原一个现场。一家省级能源集团的数据中心里一批跑着核心生产系统的服务器要完成国产化替代。上面有监控平台、业务中间件、数据库都是跑了好多年的老系统。接手这件事的工程师脑子里最先冒出来的问题往往不是“装哪个国产系统”而是“底座怎么换”。因为信息化项目国产化改造方案里最笨也是最优的做法往往不是把每台物理机都重装成国产操作系统而是先把老系统整体“搬”进KVM虚拟机里让新的国产操作系统作为宿主老系统作为虚拟机继续运行。这就是KVM在这类项目里的典型位置它不是被替代的对象而是替代工作的底座。这篇文章要聊的正是这个底座是怎么长出来的。一家中国厂商用16年时间把KVM打磨成关键行业的生产级底座背后涉及的不只是虚拟化技术本身还有CPU架构适配、驱动兼容、迁移工具、性能调优和故障排查这一整套体系。不管你是要给服务器做系统还是正在做国产化迁移或者只想搞懂Debian KVM环境怎么搭这篇都能给你一套能直接落地的思路和操作。我会把原理、选型、实测步骤和踩过的坑放在一起讲尽量说人话。1. 为什么是KVM16年底座背后的逻辑1.1 先搞清楚KVM在国产化里到底管哪一段KVM全称Kernel-based Virtual Machine直译就是“基于内核的虚拟机”。它不是一套独立的操作系统而是作为Linux内核的一个模块存在。只要CPU支持硬件虚拟化扩展Intel叫VT-xAMD叫SVMLinux内核加载KVM模块后这台机器就变成了一个虚拟机监视器可以跑各种操作系统。你去看国产化主流操作系统——麒麟、统信UOS、欧拉openEuler这些系统的底层都是Linux内核。KVM本身就是Linux内核的一部分所以国产操作系统一装上KVM天然就在那里。这就是为什么KVM会是国产化底座的核心选择它不是“外挂”而是和系统同源的“原装件”。日常部署中我们通常把三样东西合在一起用KVM负责CPU和内存的虚拟化是性能的根基QEMU负责设备模拟比如网卡、磁盘、USB控制器libvirt负责统一管理提供virsh、virt-manager这些操作入口。打个比方KVM像发动机提供动力QEMU像车身和内饰libvirt像方向盘和仪表盘。三者配合一台物理机才能变成一台可以随意切分、回收、克隆的“虚拟机工厂”。1.2 16年时间到底沉淀了什么很多做国产化的人会问KVM是开源技术全世界都在用凭什么说一家厂商用16年就能“筑牢底座”这里的关键不在于代码本身而在于三件事适配记录、兼容矩阵、工程经验。先说适配记录。KVM虽然通用但在不同CPU架构上的表现差异极大。国产CPU阵营里海光和兆芯是x86架构兼容性好鲲鹏和飞腾是ARM架构需要适配中断控制器、设备树、GIC版本龙芯是LoongArch申威是SW64这两类更特殊连QEMU的模拟代码都要改动。一个厂商如果只在自己实验室里跑过x86是不能说自己支持国产化的。16年意味着它把主流国产CPU都跑过一轮生产负载哪些特性可用、哪些内核参数要调心里是有数的。再说兼容矩阵。关键行业的数据中心里老系统千奇百怪Windows Server 2008、CentOS 6、Ubuntu 14、甚至还有跑着老版本Oracle的Unix-like系统。KVM要作为底座就必须保证这些老系统能被迁进去、跑得稳、性能不崩。这个兼容清单不是写文档写出来的是几百个失败案例堆出来的。最后是工程经验。16年积累下来什么时候该用p2v什么时候该重装ARM架构上的虚拟机怎么避免中断风暴大规模迁移时怎么控制风险这些经验在教科书里找不到只能在项目里攒。这也是为什么在十五五规划落地之后、国产化改造密集启动的当口大家更愿意找“跑过很多次长途的老师傅”而不是“刚拿到驾照的新手”。2. KVM国产化的核心细节与实操要点2.1 三件套选型CPU架构、内核版本、QEMU的协同搭建KVM国产化底座第一步不是装系统而是选型。我见过很多项目一上来就装KVM结果CPU架构和内核版本不匹配虚拟机频繁报错。选型其实就三件事。第一件是CPU架构。国产CPU主流分四类各自的适配策略完全不同CPU品牌架构兼容性特点适配关注点海光x86AMD Zen系对x86指令集兼容好开启SVM、嵌套虚拟化兆芯x86对x86指令集兼容好开启SVM、老内核补丁鲲鹏ARMARMv8需编译ARM版内核与QEMUGIC版本、中断亲和性飞腾ARM需编译ARM版内核与QEMUSMMU、PCIe直通配置龙芯LoongArch需专用QEMU补丁KVM模块编译参数申威SW64需专用工具链用户态模拟较多如果你的现有应用全部是x86的二进制包那就别去挑战ARM架构的源码级迁移老老实实选海光或兆芯先把业务跑起来再说。如果是新建系统且应用有源码可以选ARM架构把生态重构当成长期工程。第二件是内核版本。国产操作系统一般基于LTS内核比如4.18、5.10、5.15、6.1这些长期维护版本。KVM的功能与内核版本绑定得比较紧比如virtio-mem在5.8才稳定、vhost-vdpa在5.5以后才好用。选内核的原则只有一个跟着操作系统官方默认走不要自己追新。因为厂商的驱动、安全加固、技术支持都是基于官方内核测试的乱换内核等于脱保。第三件是QEMU版本。QEMU提供设备模拟能力版本太老会缺设备模型版本太新又可能与内核模块不匹配。稳妥的做法是使用操作系统仓库里自带的QEMU版本用virsh和libvirt管理时它们之间的版本兼容性也更好。自己做QEMU/KVM开发的话另说但生产环境求稳不求新。2.2 虚拟机形态与设备模型virtio为什么是性能关键刚接触KVM的人最容易踩的坑是创建虚拟机时不注意设备模型默认用了模拟设备结果跑起来性能奇差。KVM里有两类I/O路径一类是全软件模拟设备比如e1000网卡、IDE磁盘另一类是virtio半虚拟化设备。全模拟设备的本质是让QEMU“演”一台老硬件客户机每发一个I/O请求QEMU要模拟真实的硬件行为CPU开销非常大。virtio则不同它有一套前后端协议客户机里的virtio驱动直接把数据交给宿主机不再模拟“假硬件”。用网卡举例e1000模拟网卡跑千兆都吃力virtio-net轻松跑满万兆磁盘也一样IDE模拟磁盘的IOPS惨不忍睹virtio-blk加上多队列可以到几十万IOPS。所以在创建虚拟机时磁盘总线选virtio网卡模型选virtio这个操作能直接决定虚拟机性能上限。如果是把老Windows系统迁进KVM系统里没有自带virtio驱动需要在关机状态下给虚拟机挂载一个virtio-win驱动盘再启动系统安装驱动。顺序错了会怎样驱动认不到磁盘迁移后开不了机。注意对老Linux虚拟机尤其CentOS 6/7这类迁移前先把virtio驱动编入initramfs不然从IDE盘切到virtio盘时内核在启动阶段找不到根文件系统直接进入emergency mode。2.3 无感替换的关键兼容层与驱动适配关键行业的国产化改造最难的不是装KVM而是让老系统“无感”地跑在KVM上。所谓无感是指用户、业务部门甚至监控系统都感觉不到底层换了。要做到这一点兼容层和驱动适配是核心。兼容层方面老应用往往依赖特定版本的glibc、特定的内核模块、甚至特定的时钟源。KVM可以给虚拟机配置不同的CPU模型比如把CPU模式设为custom并指定为老CPU型号这样客户机看到的CPU特性与原来物理机一致某些依赖CPU特性做授权的软件才不会出问题。对Windows老系统还要在虚拟机配置里加上hyperv相关的clock源设置避免时间跳变导致应用报错。驱动适配方面主要是三类virtio块设备/网卡驱动负责性能PCIe直通驱动负责让虚拟机直接使用物理硬件比如GPU、解码卡、采集卡嵌套虚拟化驱动如果虚拟机上还要再跑一层KVM就需要开启nested1选项。实际项目里我见过最典型的场景是“老数据库跑虚拟机”。数据库对内存和磁盘延迟极度敏感单纯用virtio-blk还不够得给虚拟机绑大页内存、绑NUMA节点、再用vhost-user-blk提升PIO性能。驱动适配不是装上就完事适配完还要压测压测不过就要继续调。3. 实操过程从迁移评估到落地的完整路径3.1 迁移评估先盘点再动手国产化迁移项目里最常见的翻车原因不是技术不行而是没做评估就动手。KVM底座做得再好如果源系统的情况没摸清迁移就是赌博。我建议评估阶段至少要完成五件事评估项要确认的内容决定的影响物理机配置CPU型号、核数、内存、磁盘类型决定虚拟机规格与性能预期应用依赖老系统里的应用是二进制包还是源码决定走P2V还是重装网络依赖IP地址、域名、防火墙策略、负载均衡决定网络规划是否要调整存储依赖数据库数据量、备份策略、是否用多路径决定磁盘格式与存储架构许可证与合规老系统是否有授权绑定CPU/物理机决定虚拟机恢复时的认证策略评估完成后做一个决定这个系统是“重装”还是“搬迁”。能重装的系统尽量重装重装是干净状态没有历史包袱不能重装的系统比如找不回部署手册的老系统才走P2V物理转虚拟。这个决定直接影响后续所有操作。3.2 在Debian系宿主机构建KVM环境Debian系是很多国产操作系统的底层参照很多国产化环境也直接用Debian衍生系统做宿主机。下面这套操作我在新环境里反复验证过可以照着抄。先确认CPU虚拟化是否开启grep -E -c (vmx|svm) /proc/cpuinfo # 结果大于0说明CPU支持硬件虚拟化 # 如果结果为0去BIOS里确认VT-x或SVM有没有打开然后安装KVM组件apt update apt install -y qemu-kvm libvirt-daemon-system libvirt-clients virtinst bridge-utils systemctl enable --now libvirtd这里解释一下每个包的作用qemu-kvm提供用户态设备模拟libvirt-daemon-system提供libvirtd守护进程virtinst提供virt-install命令用于创建虚拟机bridge-utils提供网桥管理工具。装完后用virsh验证环境是否正常virsh list --all创建一个用于NAT默认网络的虚拟机实例qemu-img create -f qcow2 /var/lib/libvirt/images/webserver.qcow2 100G virt-install \ --name webserver \ --memory 8192 \ --vcpus 4 \ --disk path/var/lib/libvirt/images/webserver.qcow2,formatqcow2,busvirtio \ --os-variant centos7.0 \ --network networkdefault,modelvirtio \ --cdrom /path/to/os.iso \ --graphics vnc,listen0.0.0.0参数都不多余--memory和--vcpus按源系统配置给别贪心--disk里busvirtio就是前面强调的性能关键--os-variant让libvirt自动选择最合适的客户机配置--network里modelvirtio同样是为了I/O性能。如果需要让虚拟机被外部网络直接访问不能只用默认NAT要创建桥接网络。Debian系可以这样apt install -y bridge-utils # 编辑/etc/network/interfaces添加 # auto br0 # iface br0 inet static # address 192.168.10.2 # netmask 255.255.255.0 # gateway 192.168.10.1 # bridge_ports eth0 # bridge_stp off # bridge_fd 0然后重启网络创建虚拟机时把network指定为bridgebr0即可。桥接配置里有个细节bridge_stp和bridge_fd建议关闭否则虚拟机启动后网络要等几十秒才通运维会被误判成故障。3.3 P2V迁移把物理服务器“搬”进KVM评估之后如果确定某些老系统必须整体搬迁P2V就是核心手段。P2V全称Physical to Virtual把物理机上的整个操作系统原封不动地搬进虚拟机。我的习惯做法是分为三步。第一步在目标物理机上用Clonezilla或dd把磁盘做成镜像。dd命令最通用# 在源物理机上执行 dd if/dev/sda of/data/backup/system.img bs4M convsync,noerror但要注意dd的镜像会包含整个磁盘的空闲空间磁盘越大镜像越大耗时越长。更务实的做法是rsync整机同步只拷贝文件系统里的实际文件# 源机执行把整个根文件系统同步到中转存储 rsync -aAXv --exclude{/proc/*,/sys/*,/dev/*,/tmp/*,/run/*} / /data/backup/rootfs/第二步创建一台新的KVM虚拟机磁盘大小等于或大于源磁盘然后启动一个救援环境比如用安装ISO的救援模式把刚才同步过来的rootfs解包到新磁盘再修复引导。第三步修复引导。这一步最容易被忽视。同步过来的系统里/etc/fstab里的磁盘UUID还是老的内核里也没有virtio驱动。不修复迁完的虚拟机开机就是kernel panic。修复操作需要在救援环境里执行# chroot进入新系统 mount --bind /dev /mnt/root/dev mount --bind /proc /mnt/root/proc mount --bind /sys /mnt/root/sys chroot /mnt/root # 修复fstab把设备UUID改成新磁盘的UUID blkid /dev/vda vi /etc/fstab # 重新生成引导写入virtio驱动 grub2-install /dev/vda grub2-mkconfig -o /boot/grub2/grub.cfg dracut --add-drivers virtio virtio_blk virtio_net -f这套操作做完再关闭虚拟机、把磁盘总线从IDE改成virtio启动通常就能正常开机。如果开机后网络不通检查虚拟机网卡模型是否也改成了virtio再看网卡配置文件里的接口名是否从eth0变成了ens3这类新命名。如果你是从VMware等老虚拟化平台迁移V2V更省事的方式是直接用virt-v2vvirt-v2v -i ova /path/to/old.ova -o local -os /var/lib/libvirt/imagesvirt-v2v会自动转换磁盘格式、注入virtio驱动、重写引导配置是同类工具里最成熟的。3.4 性能调优与稳定性加固虚拟机跑起来只算及格要上生产还得做调优和加固。以下是我每次搭建KVM底座必做的几件事。第一大页内存。虚拟机内存访问默认走普通4KB页面TLB容易命中不足延迟高。启用1GB大页能明显改善数据库和在线交易类应用的性能# 宿主机保留4个1GB大页 echo 4 /proc/sys/vm/nr_hugepages_mempolicy mkdir -p /dev/hugepages mount -t hugetlbfs hugetlbfs /dev/hugepages然后编辑虚拟机XML把memoryBacking和hugepages配置加进去让虚拟机使用大页。第二NUMA绑定。在多路服务器上如果虚拟机内存和vCPU跨NUMA节点内存访问要走跨路互联延迟会显著增加。用virsh vcpupin把虚拟机的vCPU固定在物理核上同时让内存分配在同一个NUMA节点。具体做法是在虚拟机配置里加上cputune vcpupin vcpu0 cpuset0-3/ /cputune numatune memory modestrict nodeset0/ /numatune第三I/O线程。对磁盘密集型应用给虚拟机配置iothread把磁盘中断处理放到独立线程避免阻塞vCPUvirsh iothreadadd webserver 1然后在磁盘设备配置里引用这个iothread。第四开启sVirt。这是KVM的安全加固层基于SELinux给虚拟机进程做隔离。操作上只要确保宿主机SELinux是enforcinglibvirtd正常启动即可。开启sVirt后即使一个虚拟机被攻破攻击者也无法通过进程逃逸去读写其他虚拟机的文件这对多租户场景尤其重要。调优有个原则做完一项就测一项别一次性堆叠。我用fio测磁盘、用netperf测网络、用unixbench测综合性能每一项调整都做前后对比不然出了问题都不知道是哪个参数造成的。4. 典型场景与配套生态底座不止是虚拟机4.1 安防监控平台的KVM适配海康4200这类客户端的落地十五五周期开始后交通、能源、园区类项目的安防系统国产化也是一大块。这里经常遇到的一个具体场景就是海康4200这类监控平台客户端要跑在国产化环境里。监控平台的难点不在CPU而在视频流的IO密集和解码卡等专用硬件的接入。KVM在这类场景里做得比较多的是两件事。第一件事把老监控服务器整体P2V进虚拟机里面保留Windows Server和熟悉的IVMS-4200客户端网络层面通过桥接模式把虚拟网卡直接接入监控专网视频流延迟基本不变。我实测过在一个园区监控项目中30路1080P视频流在KVM虚拟机里客户端预览正常录像回放也没有明显卡顿。第二件事解码卡这类专用硬件的适配。监控系统通常需要硬件解码卡KVM可以启用PCIe直通IOMMU/VFIO让虚拟机直接使用物理解码卡。宿主机BIOS里开启VT-d然后# 查看IOMMU是否开启 dmesg | grep -i iommu # 绑定vfio驱动 modprobe vfio-pci virsh nodedev-detach pci_0000_06_00_0直通后的虚拟机对解码卡的操作和物理机几乎一样性能损失可以忽略。但要注意一旦把设备直通给某个虚拟机其他虚拟机就不能用了这个规划要在架构设计阶段就想清楚。4.2 云平台与国产化工具链的衔接单机KVM只是底座规模化之后必然要接云平台。OpenStack和KVM结合最常见的架构是KVM提供虚拟化层OpenStack的Nova负责虚拟机的生命周期管理Neutron负责网络Cinder负责块存储。国产化环境下很多私有云也是这么做的只是底层CPU换成了国产型号宿主机OS换成了国产Linux。除了OpenStack还有两条链路值得关注。一条是容器场景下用Kata Containers替代普通容器运行时让每个容器跑在轻量级KVM虚拟机里既保容器效率又加了一层隔离。另一条是国产化迁移工具链有专门的迁移评估工具扫描源服务器的应用、驱动、端口依赖自动输出国产化改造方案下载包有镜像转换工具把VMware格式的磁盘转成qcow2有自动化批量替换工具直接在KVM API上批量创建、配置、迁移虚拟机。这些工具的价值在于把“手工操盘”变成“自动化流水线”。一个几十台服务器的项目手工一台台迁很容易漏掉配置用脚本调libvirt API批量操作就能保证每台虚拟机的设备模型、内存策略、网络配置完全一致排查时也方便对比。4.3 常见问题与排查技巧实录最后把我这些年遇到最多的问题整理成一张速查表都是可以直接用的排障思路。现象可能原因排查与解决虚拟机启动黑屏/卡在引导内核没有virtio驱动用救援模式进系统重建initramfs并加入virtio_blk等驱动虚拟机网络不通网桥配置异常或网卡模型错误检查br0配置确认虚拟机XML里model为virtio尝试用传统型号对比性能远低于物理机未开启大页、未做NUMA绑定、设备模型非virtio按3.4节逐项调整并压测嵌套虚拟化不可用KVM内层模块未开启在宿主机执行modprobe kvm_intel nested1并加入/etc/modprobe.d/迁移后系统找不到根分区fstab里设备名变了用blkid获取新磁盘UUID修改/etc/fstab虚拟机时间跳动过大客户机时钟源不合适启用kvm-clock或hyperv时钟源调低tsc漂移还有一个前几次准能踩中的坑Windows虚拟机迁移后磁盘控制器没有换成virtio系统因为找不到磁盘直接蓝屏。解决方法是先把virtio驱动下载到客户机并安装好再关机改磁盘总线。Windows下改总线要小心必须在停机前把驱动准备好。另一个容易被忽略的点是快照策略。很多人把KVM快照当备份用其实快照只是增量文件不是在硬盘上另外拷贝一份数据。真要备份要么用libvirt的external snapshot再加完整块备份要么直接用备份软件对qcow2文件做一致性备份。快照会越积越大不做合并的话磁盘会被撑爆这个坑我见过不止一次。提示在大规模P2V之前强烈建议先找一台业务量最小的服务器做“泥牛入海”演练把整套流程跑通一遍记录每个步骤的耗时和风险点。演练完成后再开始批量操作速度和安全都能兼顾。写在最后我个人在实际操作中的最大体会是KVM作为国产化底座最值钱的地方不是“免费”或“开源”而是可控。虚拟化的每一层都能打开来看——内核模块、QEMU源码、libvirt XML、磁盘镜像所有行为都可以审计、可以回溯、可以定制。在电力、交通、金融这些讲究责任和追溯的行业里这种可控性比任何商业支持都更重要。当然16年的积累不是靠安装文档堆出来的是靠一次次故障处理、一次次性能压测、一次次凌晨的割接换来的。国产化改造从来不是“换一个软件”那么简单它更像给一辆跑了十几年的车换底盘要先把老零件稳妥地拆下来再用新底盘把它们重新装好最后还得保证车上的人完全感觉不到变化。KVM在这套体系里是最值得花时间打磨的那块底盘。如果这篇文章能在你搭建或迁移KVM的时候少踩几个坑那它就没白写。
返回列表