1. 国产化环境下的KVM安装:一个典型的“连环坑”
最近几年,国产化替代的浪潮席卷而来,很多朋友都开始接触基于飞腾、鲲鹏这类ARM架构CPU的服务器,搭配的操作系统也换成了银河麒麟V10。我所在的团队也不例外,为了搭建一个内部的开发和测试环境,我们拿到了一台搭载飞腾FT-1500A处理器的服务器,系统是银河麒麟V10。任务很明确:在这台机器上安装KVM虚拟化平台,跑几个虚拟机。
听起来是不是和你在x86服务器上干的事儿一样?无非就是 yum install 几个包,然后 systemctl start 一下服务。我一开始也是这么想的,结果一脚踩进了一个“连环坑”里,从环境检查一路排查到GLIBC版本冲突,整个过程堪称一部国产化环境下的“疑难杂症”排查教科书。今天我就把这趟“踩坑之旅”完整地复盘一遍,尤其是那个让人头疼的 Cannot find CPU model with PVR 0x660 和 GLIBC符号未定义的问题,希望能帮你少走弯路。
为什么说这是个“连环坑”呢?因为在国产化平台上,问题往往不是孤立的。一个简单的安装失败,背后可能串联着硬件架构支持、操作系统定制、软件包版本匹配、依赖库冲突等一系列问题。你解决了A,B又冒出来,环环相扣。这次在飞腾1500A + 麒麟V10上安装KVM,就完美地诠释了这一点。接下来,我们就从最基础的环境检查开始,一步步拆解这个故障链。
2. 第一步:基础环境检查与KVM安装
动手之前,先摸清家底。这是所有运维工作的黄金法则,在陌生的国产化平台上尤其重要。
2.1 确认操作系统与CPU架构
首先,我们得知道自己到底在什么系统上干活。打开终端,输入 uname -a,这是最直接的命令。
uname -a
输出大概长这样:
Linux my-kylin-server 4.19.90-17.ky10.aarch64 #1 SMP Sun Jun 28 14:27:40 CST 2020 aarch64 aarch64 aarch64 GNU/Linux
关键信息抓取:aarch64。这说明我们用的是ARM 64位架构,不是熟悉的x86_64。系统内核版本是 4.19.90,这是麒麟V10基于某个LTS内核定制的版本。
接下来,看看这颗“中国芯”的详细信息。运行 lscpu:
lscpu
输出会非常详细,你要重点关注这几行:
架构: aarch64
厂商 ID: Phytium
型号名称: Phytium,FT-1500A
确认无误,是飞腾的FT-1500A处理器。这里有个小细节,lscpu 输出的信息里,CPU型号的标识是 FT-1500A,但后续libvirt服务报错时,寻找的CPU模型PVR(Processor Version Register)值是 0x660。这个对应关系需要记一下,后面排查CPU模型找不到的错误时,它就是关键线索。
2.2 检查虚拟化硬件支持
KVM是内核级别的虚拟化,前提是CPU硬件必须支持虚拟化扩展。对于ARM架构,这个扩展通常是KVM。检查命令和x86时代类似,但看的内容不一样:
dmesg | grep kvm
如果输出里能看到类似下面的信息,就说明内核在启动时已经识别并初始化了KVM支持:
[ 0.878732] kvm [1]: 8-bit VMID
[ 0.878741] kvm [1]: IPA Size Limit: 44bits
[ 0.878885] kvm [1]: vgic-v2@29c20000
[ 0.878894] kvm [1]: GIC system register CPU interface enabled
[ 0.879121] kvm [1]: vgic interrupt IRQ1
[ 0.879321] kvm [1]: Hyp mode initialized successfully
看到 Hyp mode initialized successfully 这一行,心里就踏实了一半。这说明飞腾1500A的硬件虚拟化支持是没问题的,底层基础是牢固的。如果这里什么都没有输出,那问题就大了,可能需要检查BIOS里是否开启了虚拟化支持(虽然ARM服务器BIOS设置项通常较少),或者这颗CPU是否真的支持硬件虚拟化。
2.3 安装KVM相关软件包
基础条件满足,开始安装。在麒麟V10上,我们可以使用系统自带的yum源。安装的软件包组和x86时代大同小异:
yum -y install qemu* libvirt* virt-install virt-manager
这条命令会安装QEMU(硬件模拟器)、libvirt(虚拟化管理工具栈)、virt-install(命令行创建虚拟机的工具)以及virt-manager(图形化管理工具,可选,如果服务器是纯命令行环境可以不装)。安装过程一般很顺利,依赖关系会自动解决。
安装完成后,按照惯例,我们需要启动libvirtd这个核心守护进程,并设置开机自启:
systemctl enable libvirtd
systemctl start libvirtd
坑,从这里开始出现了。 当你信心满满地执行 systemctl start libvirtd 时,很可能会看到这样的错误:
Job for libvirtd.service failed because the control process exited
5210



被折叠的 条评论
为什么被折叠?



