Назад | Перейти на главную страницу

Почему `rpm` показывает 3 пакета httpd, а какой из них предоставляет настоящий httpd?

Я побежал yum update на моем веб-сервере CentOS5 несколько дней назад. Сегодня только заметил, что у меня 3 httpd- * rpms!

Как я могу получить три RPM для httpd (на других моих серверах только один httpd rpm). Я хочу убедиться, что на моем сервере установлена ​​исправленная обновленная версия /usr/sbin/httpd. Как узнать, какой из этих пакетов предоставляет двоичный файл httpd по адресу /usr/sbin/httpd?

[root@node1 ~]# rpm -q httpd
httpd-2.2.3-76.el5.centos
httpd-2.2.3-78.el5.centos
httpd-2.2.3-83.el5.centos

[root@node1 ~]# /usr/sbin/httpd -V |grep version
Server version: Apache/2.2.3

[root@node1 ~]# rpm -q httpd-2.2.3-76.el5.centos --list |grep -w /usr/sbin/httpd
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
[root@node1 ~]# rpm -q httpd-2.2.3-78.el5.centos --list |grep -w /usr/sbin/httpd
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
[root@node1 ~]# rpm -q httpd-2.2.3-83.el5.centos --list |grep -w /usr/sbin/httpd
/usr/sbin/httpd
/usr/sbin/httpd.event
/usr/sbin/httpd.worker
[root@node1 ~]# 

root@node1 ~]# rpm -q --provides httpd |grep -w httpd
config(httpd) = 2.2.3-76.el5.centos
httpd-mmn = 20051115
httpd = 2.2.3-76.el5.centos
config(httpd) = 2.2.3-78.el5.centos
httpd-mmn = 20051115
httpd = 2.2.3-78.el5.centos
config(httpd) = 2.2.3-83.el5.centos
httpd-mmn = 20051115
httpd = 2.2.3-83.el5.centos

Обновить: Отвечая на вопросы Марка Вагнера:

[root@node1 ~]# rpm -q -f /usr/sbin/httpd 
httpd-2.2.3-76.el5.centos
httpd-2.2.3-78.el5.centos
httpd-2.2.3-83.el5.centos
[root@node1 ~]# rpm -V httpd-2.2.3-83.el5.centos
S.5.....  c /etc/logrotate.d/httpd
S.5.....  c /etc/rc.d/init.d/httpd
....L...    /var/www

Обновление2: Попытка восстановить базу данных RPM, но безуспешно.

[root@node1 ~]# cd /var/lib
[root@node1 lib]# tar zcvf /var/preserve/rpmdb-`date +"%d%m%Y"`.tar.gz rpm
[root@node1 lib]# cd /var/lib/rpm
[root@node1 rpm]# rm -f __db*
[root@node1 rpm]# /usr/lib/rpm/rpmdb_verify Packages
[root@node1 rpm]# mv Packages Packages.orig
[root@node1 rpm]# /usr/lib/rpm/rpmdb_dump Packages.orig | /usr/lib/rpm/rpmdb_load P
ackages
[root@node1 rpm]# /usr/lib/rpm/rpmdb_verify Packages
[root@node1 rpm]# rpm -qa 1> /dev/null
[root@node1 rpm]# rpm -v --rebuilddb
[root@node1 rpm]# rpm -q httpd
httpd-2.2.3-76.el5.centos
httpd-2.2.3-78.el5.centos
httpd-2.2.3-83.el5.centos
[root@node1 rpm]# 

Это похоже на классический случай прерванных обновлений. Обновление выполняется в два этапа: новые файлы устанавливаются и новые пакеты добавляются в базу данных, затем все старые файлы удаляются, а старый пакет удаляется из базы данных. Если обновление будет прервано между этими двумя этапами, вы получите такую ​​несогласованность.

Что бы я сделал в этой ситуации (это потребует короткого периода обслуживания):

  1. Сохраните копию ваших файлов конфигурации. RPM все равно сделает это с .rpmsave расширение для любых файлов, которые вы изменили, но лучше быть уверенным вдвойне.

  2. Принудительно удалить все пакетов:

    rpm -e --allmatches httpd
    
  3. Переустановите пакет:

    yum -y install httpd
    
  4. Восстановите ваши файлы конфигурации.

Я бы также перестроил базу данных об / мин. Обычно я просто делаю:

cd /var/lib/rpm
rm __db*
rpm --rebuilddb

но вот более длинный, безопасный и официальный метод:

http://www.rpm.org/wiki/Docs/RpmRecovery