我有一堆运行 CentOS 5.3 32 位的服务器。它们都是大约同时使用相同的安装方法(CD 或网络安装)安装的。
我最近注意到其中一台主机出现问题,在尝试验证 RPM 包时报告如下错误:
[sagi@server3 ~]$ rpm -qV coreutils 2>&1| grep mkdir
prelink: /bin/mkdir: at least one of file's dependencies has changed since prelinking
S.?..... /bin/mkdir
[sagi@server3 ~]$
prelink 消息首先引起了我的注意。在尝试执行任何类型的 RPM 相关操作时,它经常出现。但 verify 命令还报告 mkdir 包的大小不匹配,我不明白这一点。
我尝试在其他一些服务器上运行相同的命令,但没有一个出现同样的问题。有问题的服务器和所有其他主机上的 /bin/mkdir 的大小和 coreutils 的版本相同,例如:
[sagi@server3 ~]$ rpm -q coreutils
coreutils-5.97-19.el5
[sagi@server3 ~]$ ls -l /bin/mkdir
-rwxr-xr-x 1 root root 29852 Jan 21 2009 /bin/mkdir
[sagi@server3 ~]$
[sagi@server4 ~]$ rpm -q coreutils
coreutils-5.97-19.el5
[sagi@server4 ~]$ ls -l /bin/mkdir
-rwxr-xr-x 1 root root 29852 Jan 21 2009 /bin/mkdir
[sagi@server4 ~]$
但是 /bin/mkdir 的 MD5 在各个主机上是不同的:
server1 f62677e910d9a3fc3605be5e3e59bb4f /bin/mkdir
server2 7678ac9fdf01a80e4dc45cb8a6929e2b /bin/mkdir
server3 4fe934b9ebd16ba773cf347ebf803225 /bin/mkdir
server4 24800902f32af19879ed5fda0f3ea9d0 /bin/mkdir
server5 a0a02615022c7f607709792a5ceaad0e /bin/mkdir
等等。/bin/mkdir 只是一个示例,我检查的每个实用程序都遇到了同样的问题。
因此,我有两个疑问:1.为什么同一个文件的MD5在不同的机器上会不同?2.上面提到的prelink信息可能是什么原因造成的?
更新:我通过手动运行 /etc/cron.daily/prelink 脚本成功消除了预链接错误。但我仍然不明白 MD5 不同的原因是什么。
答案1
引用手册prelink
页:
prelink 是一个程序修改ELF 共享库和 ELF 动态链接二进制文件 […]
答案2
Prelink 正是这样做的。它会遍历动态链接到应用程序的所有库并修改二进制文件,以便运行时的链接过程更加高效。因此,如果您更新其中一个链接库,则必须重新运行 prelink。警告只是让您知道情况确实如此。
顺便说一句,prelink 有一个“--md5”选项可供您使用。该命令的输出在所有主机上都应该相同。