1. 为什么KeyarchOS需要单独折腾ipvsadm-1.31-6
先说结论:如果你在KeyarchOS上直接敲yum install ipvsadm,大概率装上的不是1.31-6这个版本,而且很可能是旧版1.28或者1.29。这本身不致命,但如果你做内核升级、做集群节点版本对齐、或者需要特定调度算法的新特性,版本差异就会变成隐性问题。
KeyarchOS作为服务器操作系统,它的软件仓库策略通常偏向“稳定优先”,也就是仓库里的软件版本往往滞后于上游。ipvsadm本身是个很轻量的工具,但它是LVS管理的前端命令行,背后对应的是内核里的IPVS模块。内核在变、IPVS模块在变,ipvsadm的版本就得跟上,否则会出现管理命令和内核模块能力不匹配的情况。最典型的就是新内核里支持了更多的调度算法(比如fo、ovf),旧版ipvsadm根本不知道该算法存在,你敲ipvsadm -A -t 1.2.3.4:80 -s fo它会直接报错。
所以我自己在做KeyarchOS上的负载均衡节点时,直接把ipvsadm从源码编译并打成rpm,锁死在1.31-6。这个过程踩了一些坑,也有一些经验值得记录下来,给接下来要被同样问题困扰的人少走点弯路。
需要说明的是,这篇文章不是简单告诉你“打几个make命令就搞定”,而是从为什么需要适配、环境怎么摸底、编译过程哪里容易翻车、验证怎么做、最后怎么变成rpm交付,完完整整过一遍。无论你是运维、系统工程师还是基础架构组的,只要你需要在KeyarchOS上把LVS管理工具控制在自己手里,这篇文章都适用。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 动手之前的环境摸底:内核、编译器、依赖一个都不能漏
2.1 先搞清楚内核版本和IPVS模块状态
ipvsadm的本质是用户态客户端,它通过setsockopt向内核的IPVS模块下发配置。所以适配工作的第一件事不是解压源码,而是确认内核侧的状态。
先跑几条命令看看:
bash复制uname -r
cat /boot/config-$(uname -r) | grep -i ipvs
lsmod | grep ip_vs
我在一台干净的KeyarchOS测试机上看到的情况是:
- 内核版本:5.10.x(不同版本可能有差异)
- 内核配置里IPVS相关选项:CONFIG_IP_VS=y或=m
- 但lsmod看不到ip_vs相关的模块被加载
这非常正常,IPVS模块按需加载。你只要装了ipvsadm,或者手动modprobe ip_vs,它才会被拉起来。关键是内核编译配置里必须把IP_VS打开,否则后面一切免谈。如果grep ipvs /boot/config-$(uname -r)没有任何输出,说明当前内核没有开启IPVS支持,那适配ipvsadm就成了无根之木。
这里附加一步,确认具体支持了哪些调度算法:
bash复制cat /boot/config-$(uname -r) | grep IP_VS
你会看到类似CONFIG_IP_VS_RR=m、CONFIG_IP_VS_WRR=m这样一堆调度算法模块。确认里面有CONFIG_IP_VS_FO和CONFIG_IP_VS_OVF,这两项在内核4.x时代还属于比较新的算法,如果内核没有编译进去,就算ipvsadm 1.31支持也没用。
2.2 编译工具链和依赖库盘点
ipvsadm-1.31-6的源码编译依赖非常少,主依赖就一个libnl(Netlink库),剩下就是gcc、make这些基础工具。但依赖少不等于没坑,libnl的版本和开发头文件很容易出问题。
先检查基础工具链:
bash复制gcc --version
make --version
pkg-config --modversion libnl-3.0
KeyarchOS默认安装通常自带gcc和make,但系统头文件可能不完整。需要确保kernel-devel和kernel-headers已安装,因为编译过程中需要用到内核头文件:
bash复制yum install -y kernel-devel kernel-headers gcc make libnl3-devel libnl-devel
注意上面我同时装了libnl3-devel和libnl-devel,这是应对麻烦的老办法。实际编译时ipvsadm的Makefile对不同系统会做探测,如果两个版本的库同时存在,它可能会自动选一个。我在KeyarchOS上实测,默认它会选择最新的libnl3。
2.3 版本选择:直接拿上游源码还是用发行版SRPM
ipvsadm-1.31-6这个版本号本身有讲究。1.31是指ipvsadm本身的release版本,-6通常是发行版的打包修订号。从源码编译时,我建议直接去上游官网(Linux Virtual Server项目的官方发布站点)拉ipvsadm-1.31.tar.gz,而不是拿某个发行版的SRPM回来重新编译。
原因有几个:
- SRPM里往往打了发行版自己的一堆补丁,有的补丁是为了适配老内核,有的补丁是为了配合自家systemd脚本,这些补丁未必适合KeyarchOS的环境。
- 上游源码干净,依赖关系清晰,出现问题好排查。
- 1.31-6里的“-6”是发行版维护者打的第6个补丁版本,里面的补丁你未必需要。
所以我的建议是:拿上游1.31源码,如果需要也可以去找对应的发行版补丁列表看看他们改了啥,但别直接拿SRPM回来编。
