我面临的情况:我设置了一台 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
只列出了这个版本的包,并告诉我它可以在基础存储库中找到。在两台机器上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 可以决定它想要哪些副本,而且它似乎没有在任何日志文件中记录这个决定。
我以前在 RHEL 发行版上遇到过这个问题。比我更聪明的人确定了行为的根源:prelink
要对其进行测试,请在之前识别出不同哈希值的两个系统上运行以下命令并比较输出。