Ситуация, с которой я столкнулся: я установил машину 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 или более включенных репозиториях, при повторном запросе будут перечислены все пакеты. Yum может решить, какой из дубликатов ему нужен, и, похоже, не записывает это решение ни в какие файлы журнала.
Я уже сталкивался с этим раньше в дистрибутиве RHEL. Более умный человек, чем я, определил источник поведения: prelink
Чтобы проверить это, запустите следующее в обеих системах, которые ранее идентифицировали разные хэши, и сравните результат.
/usr/sbin/prelink -y /bin/traceroute | md5sum