2.9. Отслеживание библиотек, построенных по исходным текстам, в системах на базе RPM
Проблема
В одной системе должны использоваться как программы, построенные по исходным текстам, так и пакеты RPM. Но RPM ничего не знает о библиотеках, построенных по исходным текстам, и ошибочно выдает сообщения о неразрешенных зависимостях.
Решение
Воспользуйтесь сценарием rpm-orphan-find. Сценарий находит все библиотеки в вашей системе, а затем сравнивает результаты с содержимым базы данных RPM. Все «бесхозные» библиотеки объединяются в новый, виртуальный пакет .rpm. Пакет не содержит файлов, а только список обеспечиваемых зависимостей. Сценарий запускается как любой сценарий Bash:
# chmod +x rpm-orphan-find
# ./rpm-orphan-find
После завершения работы сценария установите новый пакет, и прежде «бесхозные» библиотеки будут включены в базу данных RPM.
Спасибо Полу Хайнлайну (Paul Heinlein) и Питеру Сэмюэльсону (Peter Samuelson) за этот замечательный сценарий.
Листинг 2.1. Программа rpm-orphan-find
#!/bin/bash
# rpm-orphan-find: сценарий для поиска "бесхозных" библиотек в системах на базе RPM
# и их преобразования в виртуальный пакет .rpm
## Авторы: Пол Хайнлайн и Питер Сэмюэльсон
# Copyright 2003
# Допускается использование, распространение или модификация программы на условиях GPL.
OS=$(uname -s)
LIBS="/lib /usr/lib $(cat /etc/ld.so.conf)"
NAME=$(echo ${OS}-base-libs | tr '[A-Z]' '[a-z]')
VER=1.0
REL=1
TMPSPEC=$(mktemp /tmp/${NAME}.spec.XXXXXX)
exec 9>$TMPSPEC
cat <<_EOF_ >&9
Summary: SOS Base Virtual Package
Name: $NAME
Version: $VER
Release: $REL
Group: System Environment/Base
License: None
_EOF_
found=0
orphan=0
echo "Scanning system libraries $NAME version $VER-$REL"
find $LIBS -type f \( -name '*.so.*' -o -name '*.so' \) |
while read f
do
((found++))
if ! rpm -qf $f >/dev/null 2>&1
then
((orphan++))
echo "Provides: $(basename $f)" >&9
fi
echo -ne "Orphans found: $orphan/$found...\r"
done
echo ""
echo ""
cat <<_EOF_ >&9
%description
This is a virtual RPM package. It contains no actual files. It uses the 'Provides' token from RPM 3.x and later to list many of the shared libraries that are part of the base operating system and associated subsets for this SOS environment.
%prep
# nothing
%build
# nothing
%install
# nothing
%clean
# nothing
%post
# nothing
%files
_EOF_
exec 9>&-
rpmbuild -ba $TMPSPEC
rm $TMPSPEC
См. также