yum源无法更新新版本rpm包-rpmvercmp算法比较原理

1.问题现象

查看本都repo仓库无法查看到sudo全量包版本rpm包。yum install 提示已安装但安装的是旧rpm版本包; => 理解错误

  yum list sudo --showduplicates

2.问题原因

在 RPM 包版本排序规则中,版本号由三部分组成:AME-VERSION-RELEASE.ARCH.rpm

sudo-1.9.5p2-1.0.2.al8.1.x86_64
sudo-1.9.5p2-1.0.2.al8.x86_64

RPM 将 RELEASE 字段(即 -1.0.2.al8.1 和 -1.0.2.al8)进行字符串比较时,使用的是 lexicographical(字典序)比较算法,而不是数值逻辑。
📌 关键点:.al8.1 vs .al8 的排序结果
RPM 使用 rpmvercmp() 函数来比较版本号。我们可以通过工具验证其行为:

示例:.al8 和 .al8.1 的比较


image.png

因此:
当 repodata 生成时,YUM 认为 .al8 是更高版本
.al8.1 被视为“旧版本”或“降级”
在默认视图中被隐藏(除非显式启用所有 repo 并刷新缓存)

3.验证方法

方法一:使用 repoquery 查看所有可用版本(包括被隐藏的)

repoquery --all --name=sudo --show-duplicates

方法二:使用 rpmdev-vercmp 工具测试版本比较

# 使用 rpmdev-vercmp 工具测试版本比较
yum install rpmdev-tools -y
# 测试比较版本大小
rpmdev-vercmp 1.0.2.al8 1.0.2.al8.1
# 输出示例:
1.0.2.al8 > 1.0.2.al8.1

👉 再次确认:.al8 被认为更新!

4.解决方案与建议

方案1:重命名 RELEASE 字段,避免歧义(推荐)
将版本号改为可正确排序的形式: 这样 .al8.0 < .al8.1,排序正常。


image.png

方案2:手动安装 .al8.1 版本(绕过 yum list 展示问题)
虽然 yum list 不显示,但如果该包确实在源中,仍可通过直接安装:

yum install sudo-1.9.5p2-1.0.2.al8.1.x86_64
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容