В началоLinux не для идиотов → Менеджер пакетов и зависимости
Gentoo-doc HOME Пред.: ЛокализацияВ началоУровень выше: Linux не для идиотовСлед.: Gentoo для разработчиков

21. Менеджер пакетов и зависимости

Современные дистрибутивы Linux (да и все представили семейства операционных систем UNIX) — это модульные системы. Они состоят из множества программ, которые взаимодействуют между собой. Разделяемые библиотеки, в свою очередь, используются множеством программ. Данная идеология означает, что один некоторые компоненты системы не могут работать без наличия других компонентов — например, программам графической среды GNOME требуются библиотеки тулкита GTK, компонентам KDE нужна библиотека Qt и так далее.

Менеджер пакетов — это приложение, которое поддерживает базу данных установленных программных пакетов и их зависимостей, что позволяет сохранить работоспособность системы в процессе установки, удаления или обновления программ и библиотек.

Файл программного пакета, устанавливаемый пакетным менеджером, состоит из двух условных частей — архива с бинарными файлами программ и спецификации пакета, в которой перечислены зависимости пакета и предоставляемые им библиотеки и инетрфейсы. Соответственно, когда пользователь пытается установить пакет, пакетный менеджер читает оглавление (спецификацию) пакета, и если какая-либо из зависимостей не удовлетворена —  например, в системе отсутствует разделяемая библиотека нужной версии, которую используют программы и библиотеки из устанавливаемого пакета, то пакетный менеджер выдаст соответствующее сообщение  и откажется устанавливать пакет, что в принципе верно, поскольку программы из этого пакета все равно не смогут работать корректно пока зависимость не будет удовлетворена.

При удалении или обновлении пакета пакетный менеджер проверит по базе установленных пакетов не нарушатся ли зависимости при соответствующем действии, то есть если в результате удаления или обновления пакета будет удалена или кардинально изменена версия используемой каким-либо приложением библиотеки или программы, пакетный менеджер не станет выполнять удаление или обновление и выдаст сообщение об ошибке.

Система зависимостей не всегда «прозрачна» и понятна пользователю, поэтому для решения этой проблемы была выработана концепция репозитория — базы данных собранных для данного дистрибутива пакетов. В этой базе перечисляются доступные в репозитории пакеты и их оглавления. Клиентские программы загружают эту базу и с ее помощью определяют какие пакеты кроме указанных пользователем должны быть установлены или обновлены для удовлетворения зависимостей.

21.1. Менеджер пакетов RPM

В большинстве инсталляций современных популярных дистрибутивов Linux в качестве менеджера пакетов используется разработка фирмы RedHat, программа rpm. Ее главными возможностями являются установка, обновление и удаление пакетов с соблюдением зависимостей, верификация пакетов и предоставление информации о пакетах и файлах, входящих в состав пакетов. Для своей работы rpm использует собственную базу данных, расположенную обычно в каталоге /var/db/rpm. Более подробную информацию можно узнать в справочной системе, воспользовавшись командой man rpm.

Нет особого смысла в том, чтобы рассказывать о базовом функционале rpm, поскольку он подробно описан в документации, и просто кратко пробежимся по ним, и более подробно рассмотрим лишь некоторые редко используемые, но часто необходимые его возможности:

# rpm -i zisofs-tools-1.0.8-2.fc8.i386.rpm
# rpm -U zisofs-tools-1.0.8-2.fc8.i386.rpm
# rpm -F zisofs-tools-1.0.8-2.fc8.i386.rpm
# rpm -e zisofs-tools

Данные вызовы иллюстрируют примеры установки, обновления или удаления пакета. Следует помнить, что при установке или обновлении пакета надо указывать имя файла, а при удалении пакета — только имя пакета. Устанавливать и удалять можно и по несколько пакетов сразу, при этом достаточно перечислить в командной строке несколько файлов или пакетов.

Ключ -i означает установку пакета.

Ключ -U означает установки или обновление пакета, то есть если в системе уже установлен этот же пакет, но более старой версии, то будет выполнено обновление. Если пакет не был установлен — то он будет установлен.

Ключ -F означает обновление пакета. Если в системе установлен пакет более старой версии, то будет произведено обновление. Если пакет не был установлен, то никаких действий производиться не будет.

Ключ -e означает удаление пакета. Пакет может быть удален только в том случае, когда он и все файлы, входящие в его состав, не используется никаким другим из установленных пакетов. Если же это условие нарушен, то пользователь получит примерно такое сообщение:

В качестве имени файла можно также использовать и ссылку:

# rpm -U ftp://localhost/fedora/zisofs-tools-1.0.8-2.fc8.i386.rpm

21.2. Конфликты зависимостей

Рассмотрим пример следующей команды:

# rpm -e exiv2-libs 
error: Failed dependencies: 
  libexiv2.so.0 is needed by (installed) libkexiv2-0.1.6-1.fc8.i386 
  libexiv2.so.0 is needed by (installed) exiv2-0.15-5.fc8.i386 
  exiv2-libs = 0.15-5.fc8 is needed by (installed) exiv2-0.15-5.fc8.i386

В данном случае мы попытались удалить пакет, который используется другими пакетами, и rpm в после проверки отказался удалять пакет exiv2-libs. Аналогичное сообщение можно увидеть, если устанавливать пакет, для работы которого нужен какой-либо другой пакет, не установленный в системе.

Чтобы деинсталировать пакет, в нашем примере, есть два пути: деинсталировать его принудительно, или деинсталировать также те пакеты, которые ссылаются на пакет exiv2-libs:

# rpm -e exiv2-libs exiv2 libkexiv2 
error: Failed dependencies: 
   libkexiv2.so.3 is needed by (installed) digikam-0.9.2-5.fc8.i386 
   libkexiv2.so.3 is needed by (installed) kipi-plugins-0.1.4-4.fc8.i386 
# rpm -e exiv2-libs exiv2 libkexiv2 digikam kipi-plugins

В данном примере было произведено удаление пакета exiv2-libs и тех пакетов, от которых он зависит, причем удалось это только со второй попытки. Аналогичная ситуация возникает и в случае установки пакета:

# rpm -i exiv2-0.15-5.fc8.i386.rpm 
error: Failed dependencies: 
        exiv2-libs = 0.15-5.fc8 is needed by exiv2-0.15-5.fc8.i386 
        libexiv2.so.0 is needed by exiv2-0.15-5.fc8.i386 
# rpm -i exiv2-0.15-5.fc8.i386.rpm exiv2-libs-0.15-5.fc8.i386.rpm

В этом примере при попытке установить пакет exiv2 утилита rpm сообщила, что ей нужен пакет exiv2-libs, и со второй попытки была произведена удачная установка пакета exiv2 и пакета exiv2-libs, нужного для его работы. Иногда встречаются ситуации, когда два пакета ссылаются друг на друга. Решается эта проблема аналогично — при вызове rpm достаточно просто указать одновременно оба пакета.

21.3. Дополнительные возможности rpm

Первой такой возможностью является возможность верификации пакета. Если вызвать команду rpm с ключом -V, то она проверит все файлы указанного пакета, и сообщит о том, какие файлы были изменены с момента установки пакета. Эта возможность очень удобна для того, чтобы проверять целостность системы после сбоя, или для того, чтобы выяснить какие файлы необходимо сохранить перед выполнением обновления пакета или системы:

# rpm -V httpd
S.5....T c /etc/httpd/conf/httpd.conf

Данный пример иллюстрирует проверку пакета httpd. В выводе команды rpm сообщается, что на компьютере где была вызвана эта команда изменялся только один файл из состава пакета httpd, и этот файл отличается от исходной версии по трем критериям — размеру (S), контрольной сумме (5) и времени модификации (T). Соответственно, при миграции или обновлении сервера следует сохранить резервную копию этого файла.

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

# rpm -q --whatrequires grep 
tcsh-6.14-15 
MAKEDEV-3.23-1.2 
sysreport-1.4.3-10 
krb5-libs-1.6.2-9.fc8 
sgml-common-0.6.3-21.fc8 
mysql-5.0.45-4.fc8 
xml-common-0.6.3-21.fc8 
docbook-dtds-1.0-32.fc8 
nfs-utils-1.1.0-6.fc8 
autoconf-2.61-9.fc8 
mkinitrd-6.0.19-4.fc8 
zsh-4.3.4-4.fc8 
zsh-4.3.4-4.fc8 
microcode_ctl-1.17-1.38.fc8 
prelink-0.4.0-1 
irda-utils-0.9.18-3.fc8 
krb5-workstation-1.6.2-9.fc8 
logwatch-7.3.6-9.fc8 
hal-0.5.10-1.fc8 
rpm-build-4.4.2.2-7.fc8 
autofs-5.0.2-20 
bind-chroot-9.5.0-20.b1.fc8
Пред.: ЛокализацияВ началоУровень выше: Linux не для идиотовСлед.: Gentoo для разработчиков
В началоLinux не для идиотов → Менеджер пакетов и зависимости