Использование RPM

15.2. Использование RPM

RPM имеет пять основных режимов работы (не считая создания пакета): установка, удаление, обновление, анализ и проверка. Этот раздел содержит описание каждого режима. Чтобы получить полное описание всех подробностей и параметров, попробуйте выполнить rpm --help или обратиться к разделу 15.5 Дополнительные ресурсы.

15.2.1. Поиск RPM-пакетов

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

15.2.2. Установка

Обычно файлы, содержащие пакеты RPM, имеют имена вроде foo-1.0-1.i386.rpm. Имя файла включает название пакета (foo), версию (1.0), выпуск (1) и архитектуру (i386). Чтобы установить пакет, войдите в систему под именем root и введите в приглашении оболочки следующую команду:

rpm -Uvh foo-1.0-1.i386.rpm

Если установка пройдёт успешно, на экране появится следующее:

Preparing...                ########################################### [100%]
   1:foo                    ########################################### [100%]

Как вы видите, RPM выводит имя пакета, а затем, по мере установки пакета, последовательность символов «решётка», отражающую процесс установки.

При установке или обновлении пакета автоматически проверяется подпись пакета. Эта подпись подтверждает то, что пакет был подписан разработчиком и не был изменён. Например, если при проверке подписи происходит ошибка, вы получите примерно следующее сообщение:

error: V3 DSA signature: BAD, key ID 0352860f

Если это новая подпись только для заголовка появляется такое сообщение:

error: Header V3 DSA signature: BAD, key ID 0352860f

Если у вас не установлен ключ, подходящий для проверки подписи, сообщение об ошибке содержит слово NOKEY, например:

warning: V3 DSA signature: NOKEY, key ID 0352860f

За дополнительными сведениями о проверке подписи пакета обратитесь к разделу 15.3 Проверка подписи пакета.

ПредупреждениеПредупреждение
 

Если вы устанавливаете пакет ядра, вместо этой команды следует использовать rpm -ivh. За подробностями обратитесь к главе 37 Обновление ядра вручную.

Установка пакетов должна выполняться просто, но иногда вы можете встретить ошибки:

15.2.2.1. Пакет уже установлен

Если пакет той же версии уже установлен, вы увидите:

Preparing...                ########################################### [100%]
package foo-1.0-1 is already installed

Если версия пакета, который вы пытаетесь установить, совпадает с версией уже установленного, но вы, тем не менее, хотите установить пакет, вы можете указать параметр --replacepkgs и RPM проигнорирует эту ошибку:

rpm -ivh --replacepkgs foo-1.0-1.i386.rpm

Этот параметр полезен, если файлы, установленные из пакета RPM, были удалены или вы не хотите, чтобы были установлены оригинальные файлы конфигурации RPM.

15.2.2.2. Конфликтующие файлы

Если вы пытаетесь установить пакет, который содержит файл, установленный другим пакетом или более ранней версий того же пакета, на экране появляется сообщение:

Preparing...                ########################################### [100%]
file /usr/bin/foo from install of foo-1.0-1 conflicts with file from package bar-2.0.20

Чтобы RPM игнорировал эту ошибку, укажите параметр --replacefiles:

rpm -ivh --replacefiles foo-1.0-1.i386.rpm

15.2.2.3. Нарушенная зависимость

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

error: Failed dependencies:
        bar.so.2 is needed by foo-1.0-1
    Suggested resolutions:
        bar-2.0.20-3.i386.rpm

Если вы устанавливаете пакет с набора компакт-дисков Red Hat Enterprise Linux CD-ROM, обычно вам предлагается название пакета, необходимого для разрешения зависимости. Найдите предлагаемый пакет(ы) на компакт-дисках Red Hat Enterprise Linux или на FTP-сайте Red Hat (или зеркале) и добавьте его в команду:

rpm -ivh foo-1.0-1.i386.rpm bar-2.0.20-3.i386.rpm

Если установка обоих пакетов прходит успешно, на экран выводится примерно следующее:

Preparing...                ########################################### [100%]
   1:foo                    ########################################### [ 50%]
   2:bar                    ########################################### [100%]

Если система не предлагает пакет для разрешения зависимости, вы можете попробовать параметр --redhatprovides, чтобы определить, какой пакет содержит требуемый файл. Для использования этого параметра вам потребуется установить пакет rpmdb-redhat.

rpm -q --redhatprovides bar.so.2

Если пакет, содержащий bar.so.2, есть в установленной базе данных из пакета rpmdb-redhat, вы увидите название этого пакета:

bar-2.0.20-3.i386.rpm

Чтобы выполнить установку, нарушив зависимости (что не рекомендуется делать, так как пакет может работать некорректно), воспользуйтесь параметром --nodeps.

15.2.3. Удаление

Удаление пакета выполняется также просто, как и его установка. Введите в приглашении оболочки следующую команду:

rpm -e foo

ЗамечаниеЗамечание
 

Обратите внимание, здесь используется имя пакета foo, а не имя файла оригинального пакета foo-1.0-1.i386.rpm. Чтобы удалить пакет, замените foo действительным именем первоначального пакета.

Вы можете столкнуться с нарушением зависимости при удалении пакета, если другой установленный пакет зависит от пакета, который вы пытаетесь удалить. Например:

error: Failed dependencies:
        foo is needed by (installed) bar-2.0.20-3.i386.rpm

Чтобы заставить RPM игнорировать эту ошибку и удалить пакет, что может привести к поломке пакета, зависящего от него, используйте параметр --nodeps.

15.2.4. Обновление

Обновление пакета похоже на его установку. Введите в приглашении оболочки следующую команду:

rpm -Uvh foo-2.0-1.i386.rpm

В процессе обновления пакета RPM автоматически удаляет все старые версии пакета foo. В действительности, вы можете всегда использовать параметр -U для установки пакетов, так как он работает, даже если предыдущая версия пакета не установлена.

ПодсказкаПодсказка
 

Не стоит использовать параметр -U для установки пакетов ядра, так как при этом RPM заменит предыдущий пакет ядра. Это не влияет на работающую систему, но если после следующей перезагрузки запустить новое ядро не удастся, никакого другого ядра для загрузки вместо него не будет.

Параметр -i добавляет ядро в меню загрузчика GRUB (/etc/grub.conf). Подобным образом, при удалении старого, ненужного ядра, запись этого ядра удаляется из GRUB.

Так как RPM выполняет умное обновление пакетов с файлами конфигурации, вам может встретиться подобное сообщение:

saving /etc/foo.conf as /etc/foo.conf.rpmsave

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

Обновление в самом деле представляет собой комбинацию удаления и установки, поэтому во время обновления RPM вы можете встретить ошибки и удаления, и установки, плюс ещё одну. Если RPM считает, что вы пытаетесь обновить пакет с более старой версией, он сообщает примерно следующее:

package foo-2.0-1 (which is newer than foo-1.0-1) is already installed

Чтобы, несмотря на это, принудительно обновить пакет, укажите параметр --oldpackage:

rpm -Uvh --oldpackage foo-1.0-1.i386.rpm

15.2.5. Освежение

Освежение пакета похоже на его обновление. Введите в приглашении оболочки следующую команду:

rpm -Fvh foo-1.2-1.i386.rpm

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

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

В этом случае выполните следующую команду:

rpm -Fvh *.rpm

RPM автоматически обновит только уже установленные пакеты.

15.2.6. Анализ

Чтобы обратиться к базе данных установленных пакетов, используйте команду rpm -q. Команда rpm -q foo выводит название пакета, версию и номер выпуска установленного пакета foo:

foo-2.0-1

ЗамечаниеЗамечание
 

Чтобы запросить информацию о пакете, замените foo действительным именем пакета.

Вместо указания имени пакета используйте следующие параметры команды -q для указания запрашиваемого пакета (ов). Эти параметры называются Параметрами выбора пакета.

  • -a запрашивает все установленные пакеты.

  • -f <file> запрашивает пакет, к которому относится файл <file>. Указывая файл, вы должны определить полный путь к файлу (например, /bin/ls).

  • -p <packagefile> запрашивает пакет <packagefile>.

Указать параметры запроса можно разными способами. Следующие параметры определяют тип искомой информации. Они называются Параметрами запроса информации.

  • -i отображает информацию о пакете, включая имя, описание, выпуск, размер, дату сборки, дату установки, производителя и другую разнообразную информацию.

  • -l выводит список файлов, содержащихся в пакете.

  • -s выводит состояние всех файлов в пакете.

  • -d выводит список файлов, помеченных как документация (страницы man, info, файлы README, и т.д.).

  • -c выводит список файлов, помеченных как файлы конфигурации. Таковыми считаются файлы, изменяемые вами после установки при настройке пакета в вашей системе (например, sendmail.cf, passwd, inittab и т.д.).

Добавьте для параметров, выводящих списки файлов, команду -v и вы получите списки в знакомом формате ls -l.

15.2.7. Проверка

При проверке пакета информация о файлах, установленных из пакета, сравнивается с информацией из оригинального пакета. Помимо прочего, при такой проверке проверяется размер, сумма MD5, разрешения, тип, владелец и группа владельца каждого файла.

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

  • Чтобы проверить пакет, содержащий конкретный файл, выполните:

    rpm -Vf /usr/bin/vim
  • Чтобы проверить ВСЕ установленные пакеты:

    rpm -Va
  • Чтобы сравнить установленный пакет с файлом RPM-пакета:

    rpm -Vp foo-1.0-1.i386.rpm

    Эта команда может быть полезна, если вы сомневаетесь в целостности баз данных RPM.

Если проверка проходит успешно, никакие сообщения на экран не выводятся. В случае обнаружения каких-либо нарушений, вы увидите сообщения об этом. Для каждого несоответствия на экран будет выведена строка из восьми символов ( c обозначает файл конфигурации), а затем имя файла. Каждый из восьми символов обозначает результат сравнения одного атрибута файла со значением атрибута, записанного в базе данных RPM. Единственная точка (.) означает, что тест пройден. Следующие символы обозначают ошибки при выполнении определённых проверок:

  • 5 — контрольная сумма MD5

  • S — размер

  • L — символическая ссылка

  • T — дата изменения файла

  • D — устройство

  • U — пользователь

  • G — группа

  • M — режим (включая разрешения и тип файла)

  • ? — файл не удалось прочитать

Если вы увидели такие сообщения, вы должны решить, будете ли вы удалять или переустанавливать пакет, или исправлять проблему другим способом.