为什么用 yum 安装相同的软件包两次没有给我相同的文件?

use*_*840 5 centos yum rpm

我面临的情况:我设置了一台 CentOS 5.9 机器,它应该尽可能接近另一台 CentOS 5.9 机器的副本,但不是克隆。使用 yum,我在目标机器上安装了(尽可能)所有也安装在源机器上的包(如yum list installed和所报告的rpm -qa)。之后我使用 md5deep 查找目标机器上仍然丢失的文件。我发现丢失的文件比我预期的要多得多,从而发现了我当前的问题。

在目标和源机器上都安装了包 traceroute-3:2.0.1-6.el5.i386(说yum list installed)。在两台机器上repoquery --info --show-duplicates traceroute都只列出了这个版本的包,并告诉我它可以在 base-repository 中找到。在两台机器上rpm -ql traceroute-2.0.1-6.el5.i386列出相同的文件。在两台机器上都rpm -V traceroute-2.0.1-6.el5.i386告诉我安装进行得很顺利(没有修改/丢失文件)。快速查看 traceroute-2.0.1-6.el5.i386.rpm 仅显示一个二进制文件 (/bin/traceroute)、符号链接和文档,因此我不希望在安装该软件包时进行编译(但是我不是 RPM 专家,这只是快速浏览,而不是彻底检查)。在两台机器上file /bin/traceroute告诉我/bin/traceroute: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), for GNU/Linux 2.6.9, dynamically linked (uses shared libs), stripped。/bin/traceroute 在两台机器上的大小相同。

然而,当我md5sum /bin/traceroute在两台机器上执行时,我得到了不同的结果。xxd & diff 显示有几十个字节不同,差异似乎在实际代码中(尚未反汇编,但更改的部分不是人类可读的字符串)。traceroute 只是一个随机示例,/bin、/sbin 和/lib 中还有几十个不同的文件。

知道发生了什么吗?我一直认为,只要编译/编辑不是安装的一部分,安装相同的包两次会导致完全相同的文件。至少我希望这rpm -V能告诉我有关已被篡改的文件的信息。如果 yum 有一个工具告诉我它从哪个存储库下载了 RPM 文件,那会很有帮助,但据我所知,这个工具在我的 yum (3.2.22) 版本中不存在。需要明确的是:repoquery 不会告诉我包是从哪个存储库下载的,它只告诉我它在哪里可用。如果同一个包在 2 个或更多启用的存储库中可用,repoquery 会列出所有包。Yum 可以决定它想要哪些副本,而且它似乎没有在任何日志文件中记录这个决定。

Jos*_*ler 3

我之前在 RHEL 发行版上遇到过这个问题。一个比我更聪明的人确定了行为的根源:prelink

要测试它,请在之前识别出不同哈希值的两个系统上运行以下命令并比较输出。

/usr/sbin/prelink -y /bin/traceroute | md5sum
Run Code Online (Sandbox Code Playgroud)