Изучаем Linux, 101: Управление пакетами с помощью RPM и YUM

Установка новых приложений и поддержание системы в актуальном состоянии

Из этой статьи вы узнаете о инсталляции, обновлении и управлении пакетами в операционной системе Linux®. В этой статье будут рассмотрены две системы управления пакетами: Red Hat Package Manager (RPM), разработанная Red Hat, и Yellowdog Updater Modified (YUM), изначально разработанная для управления операционными системами Red Hat Linux физического факультета Университета Дьюка. Вы можете использовать этот материал для подготовки к экзамену LPI 101 программы сертификации на администратора Linux начального уровня или просто, чтобы узнать, как устанавливать новые приложения и поддерживать систему в актуальном состоянии.

Об этой серии

Эта серия статей поможет вам освоить задачи администрирования операционной системы Linux. Вы также можете использовать материал этих статей для подготовки к экзаменам первого уровня сертификации профессионального института Linux (LPIC-1).

Чтобы посмотреть описания статей этой серии и получить ссылки на них, обратитесь к нашему перечню материалов для подготовки к экзаменам LPIC-1. Этот перечень постоянно дополняется новыми статьями по мере их готовности и содержит самые последние (по состоянию на апрель 2009 года) цели экзаменов сертификации LPIC-1. Если какая-либо статья отсутствует в перечне, можно найти ее более раннюю версию, соответствующую предыдущим целям LPIC-1 (до апреля 2009 года), обратившись к нашим руководствам для подготовки к экзаменам института Linux Professional Institute.

Краткий обзор

Из этой статьи вы узнаете, как управлять пакетами приложений в вашей Linux-системе с помощью инструментов управления пакетами RPM и YUM. Вы научитесь:

  • Инсталлировать, переустанавливать, обновлять и удалять пакеты с помощью RPM и YUM.
  • Получать информацию о RPM-пакетах (версия, статус, зависимости, целостность, цифровые подписи).
  • Определять, какие файлы содержатся в пакете, а также находить пакеты, содержащие определенные файлы.

Эта статья поможет вам подготовиться к сдаче экзамена LPI 101 на администратора начального уровня (LPIC-1) и содержит материалы цели 102.5 темы 102. Цель имеет вес 3.

Необходимые условия

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


Введение в управление пакетами

Как связаться с Яном

Ян – один из наших наиболее популярных и плодовитых авторов. Ознакомьтесь со всеми статьями Яна (EN), опубликованными на сайте developerWorks. Вы можете найти контактные данные в профиле Яна и связаться с ним, а также с другими авторами и участниками ресурса My developerWorks.

Раньше многие Linux-приложения поставлялись в виде исходного кода, который пользователи могли компилировать и получать необходимые программы вместе с man-руководствами, конфигурационными файлами и так далее. Сегодня в большинстве дистрибутивов Linux используются так называемые пакеты – предварительно собранные приложения или наборы приложений, которые сразу можно установить на том компьютере Linux, для которого они предназначены. В этой статье вы узнаете об инструментах управления пакетами, которые помогают устанавливать, обновлять и удалять пакеты. Вы познакомитесь с программами Red Hat Package Manager (RPM), разработанной Red Hat, и Yellowdog Updater Modified (YUM), изначально разработанной для управления операционными системами Red Hat Linux физического факультета Университета Дьюка. В статье Изучаем Linux, 101: управление пакетами в Debian, которая является частью этой серии, рассматриваются инструменты управления пакетами операционной системы Debian.

С точки зрения пользователя, основная функциональность управления пакетами обеспечивается на уровне команд. Поскольку разработчики Linux стараются сделать эту систему максимально доступной для пользователей, основные инструменты управления пакетами дополняются различными надстройками, включая графический интерфейс, которые скрывают от конечных пользователей всю изначальную сложность. В этой статье, а также в статье Изучаем Linux, 101: управление пакетами в Debian мы сосредоточимся на рассмотрении основных инструментов, хотя будут затронуты и некоторые другие средства, которые впоследствии вы сможете изучить самостоятельно.

Инструменты RPM, YUM и APT (последняя программа предназначены для управления пакетами в ОС Debian Linux) имеют много общего. Все они умеют инсталлировать и удалять пакеты приложений. Информация об инсталлированных пакетах хранится в базе данных. Все эти инструменты обладают базовой функциональностью командной строки, а дополнительные надстройки позволяют использовать более дружественный интерфейс. Все три программы могут получать пакеты из сети Интернет.

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

RPM

Red Hat представила RPM в 1995 году. В настоящее время система управления пакетами RPM используется для создания пакетов, соответствующих спецификации Linux Standard Base (LSB). Опции команды rpm сгруппированы в три подгруппы и решают следующие задачи:

  • Опрос и проверка пакетов.
  • Инсталляция, обновление и удаление пакетов.
  • Выполнение дополнительных функций.

В этой статье мы сосредоточимся на рассмотрении первых двух подгрупп. Информацию о дополнительных функциях вы можете найти на man-страницах RPM.

Также следует отметить, что rpm – это имя основной команды, использующейся системой RPM, тогда как .rpm – это расширение, используемое для файлов RPM. Таким образом, "RPM-пакет" или "RPM-пакет xxx" будет обычно означать файл RPM, а rpm будет означать команду.

YUM

YUM расширяет возможности систем RPM, дополняя их функциями автоматического обновления и управления пакетами, включая управление зависимостями. YUM позволяет не только получать информацию об установленных в системе пакетах, но, как и система Debian Advanced Packaging Tool (APT), работает с репозиториями, которые представляют собой коллекции пакетов, обычно доступных по сети.


Инсталляция RPM-пакетов

Предположим, вы решили изучить язык Lisp, и ваш коллега посоветовал поработать с компилятором gcl. Для начала можно попробовать освоить команды gcl --help, which gcl или type gcl, однако если gcl отсутствует в вашей системе, то вы увидите сообщения, подобные сообщениям в листинге 1.

Листинг 1. Отсутствие компилятора gcl
[ian@echidna ~]$ gcl --help
bash: gcl: command not found

[ian@echidna ~]$ which gcl
/usr/bin/which: no gcl in (/usr/lib64/qt-3.3/bin:/usr/kerberos/sbin:/usr/kerber
os/bin:/usr/lib64/ccache:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/
sbin:/home/ian/bin)

[ian@echidna ~]$ type gcl
bash: type: gcl: not found

В этой ситуации можно вновь обратиться к коллеге и уточнить, какой именно пакет необходимо установить, или просто догадаться, что компилятор gcl содержится в пакете gcl. Часто этот способ срабатывает, но он не всегда правильный. Позже я покажу, как можно найти требуемый пакет. В нашем случае нам нужен пакет gcl. Предположим, что вы загрузили этот пакет (или получили его каким-то другим способом) и попытались установить его с помощью команды rpm с опцией -i (install – установка), как показано в листинге 2.

Листинг 2. Установка gcl с помощью rpm, первая попытка
[root@echidna ~]# rpm -i gcl-2.6.8-0.6.20090701cvs.fc12.x86_64.rpm
error: Failed dependencies:
gcl-selinux is needed by gcl-2.6.8-0.6.20090701cvs.fc12.x86_64

Команда rpm знает о том, что пакет имеет зависимости, но, к сожалению, не может определить их. Вам нужно будет получить пакет (или пакеты) зависимостей и попытаться установить приложение еще раз. Если при этом обнаружатся дополнительные зависимости, то необходимо повторять эту процедуру до тех пор, пока не будут получены все пакеты зависимостей. Единственная хорошая новость заключается в том, что с помощью команды rpm можно установить сразу несколько пакетов, и если у вас имеются в наличии все пакеты зависимостей, то они будут установлены в нужном порядке.

Если вы уже работали с системой APT в ОС Debian, то, вероятно, вы хотели бы использовать команду, подобную команде apt-get, которая определяет, что требуется для инсталляции того или иного пакета (включая все его зависимости), и просто устанавливала бы его. Для систем на базе RPM эту функциональность предоставляет YUM (или Yellowdog Updater Modified). В листинге 3 показано, как установить пакет gcl и требуемый пакет зависимости, gcl-selinux, выполнив команду yum с опцией install.

Листинг 3. Установка gcl с помощью yum
[root@echidna ~]# yum install gcl
Loaded plugins: presto, refresh-packagekit
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be updated
--> Processing Dependency: gcl-selinux for package: gcl-2.6.8-0.7.20100201cvs.fc12.x86_64
--> Running transaction check
---> Package gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================
 Package           Arch         Version                          Repository     Size
=====================================================================================
Installing:
 gcl               x86_64       2.6.8-0.7.20100201cvs.fc12       updates       6.3 M
Installing for dependencies:
 gcl-selinux       x86_64       2.6.8-0.7.20100201cvs.fc12       updates        17 k

Transaction Summary
=====================================================================================
Install       2 Package(s)
Upgrade       0 Package(s)

Total download size: 6.4 M
Installed size: 40 M
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
updates/prestodelta                                           | 964 kB     00:01     
Processing delta metadata
Package(s) data still to download: 6.4 M
(1/2): gcl-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm              | 6.3 MB     00:12     
(2/2): gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm      |  17 kB     00:00     
-------------------------------------------------------------------------------------
Total                                                398 kB/s | 6.4 MB     00:16     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64                 1/2 
  Installing     : gcl-2.6.8-0.7.20100201cvs.fc12.x86_64                         2/2 

Installed:
  gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12                                            

Dependency Installed:
  gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12                                    

Complete!

Из листинга 3 видно, что программа YUM обнаружила в репозитории "updates" (подробнее о нем далее) файлы gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 и gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12, и определила общий размер загружаемых файлов. После того, как мы ввели "y" и подтвердили продолжение установки, были загружены оба пакета, после чего были установлены пакет зависимостей и непосредственно сам пакет gcl. Более подробно о зависимостях вы узнаете из продолжения этой статьи.


Расположение пакетов

В предыдущем разделе вы научились устанавливать RPM-пакеты. Но откуда они берутся? Каким образом yum узнаёт, откуда их загружать? Поиск начинается с просмотра директории /etc/yum.repos.d/, в которой находятся несколько файлов repo. В этой директории repo-файлы хранятся по умолчанию, а дополнительные местоположения можно указать в конфигурационном файле YUM (обычно это файл /etc/yum.conf). В листинге 4 показано содержимое файла fedora-updates.repo, в котором перечислены источники, из которых в ОС Fedora 12 был загружен пакет gcl.

Типовой repo-файл содержит три раздела: в первом разделе перечислены источники обычных пакетов, во втором разделе – источники отладочных пакетов, и в третьем – источники пакетов исходного кода. Обычно пакеты дистрибутива доступны для загрузки из нескольких местоположений, которые называются зеркалами. Файл repo говорит программе yum о том, где она должна искать самые последние списки зеркал для каждого раздела. Обратите внимание на то, что конфигурация учитывает версию дистрибутива и архитектуру компьютера, поэтому для нашей операционной системы Fedora 12, работающей на компьютере с архитектурой x86_64, программа yum загрузит список зеркал, расположенный по ссылке https://mirrors.fedoraproject.org/metalink?repo=updates-released-f12&arch=x86_64.

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

Листинг 4. Содержимое /etc/yum.repos.d/*.repo
[ian@echidna ~]$ cat /etc/yum.repos.d/fedora-updates.repo
[updates]
name=Fedora $releasever - $basearch - Updates
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever
/$basearch/
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-f$r
eleasever&arch=$basearch
enabled=1
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

[updates-debuginfo]
name=Fedora $releasever - $basearch - Updates - Debug
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever
/$basearch/debug/
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-deb
ug-f$releasever&arch=$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

[updates-source]
name=Fedora $releasever - Updates Source
failovermethod=priority
#baseurl=http://download.fedoraproject.org/pub/fedora/linux/updates/$releasever
/SRPMS/
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=updates-released-sou
rce-f$releasever&arch=$basearch
enabled=0
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-fedora-$basearch

Чтобы определить, какие пакеты установлены в системе, YUM и RPM используют локальную базу данных. Метаданные о пакетах, хранящиеся в локальной базе данных, извлекаются из доступных для использования репозиториев. Хотя необходимость работы с локальной базой данных возникает редко, следует пояснить, что вы можете очищать различные блоки хранящейся в БД информации с помощью команды yum clean и добавлять в БД определенную информацию для разрешенных репозиториев с помощью команды yum makecache. Это может потребоваться, например, в том случае, когда вы меняете конфигурацию репозиториев.


Удаление RPM-пакетов

Если вы хотите удалить пакет из системы, запустите команду yum с опцией remove или команду rpm с опцией -e. В листинге 5 продемонстрировано тестовое удаление пакета gcl с использованием команды rpm -e. Если пакет может быть удален, никакая информация не отображается.

Листинг 5. Тестовое удаление gcl
[root@echidna ~]# rpm -e --test gcl

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

Если вы удаляете пакеты с помощью rpm, то вам не предлагается подтвердить их удаление (в отличие от того, как это происходит при инсталляции пакетов). Однако если вы попытаетесь удалить пакет, от которого зависит какой-либо другой пакет, то операция завершится с ошибкой, и вы увидите сообщение, подобное сообщению в листинге 6.

Листинг 6. Удаление пакета зависимости с помощью rpm
[root@echidna ~]# rpm -e gcl-selinux
error: Failed dependencies:
	gcl-selinux is needed by (installed) gcl-2.6.8-0.7.20100201cvs.fc12.x86_64

В случае удаления пакета с помощью команды yum remove будет выполнено пробное удаление, после чего вам надо будет подтвердить удаление. Если вы пытаетесь удалить пакет, от которого зависят какие-либо другие установленные в системе пакеты, то YUM предложит удалить их вместе с пакетом зависимостей, как показано в листинге 7.

Листинг 7. Удаление пакета зависимостей с помощью yum
[root@echidna ~]# yum remove gcl-selinux
Loaded plugins: presto, refresh-packagekit
Setting up Remove Process
Resolving Dependencies
--> Running transaction check
---> Package gcl-selinux.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be erased
--> Processing Dependency: gcl-selinux for package: gcl-2.6.8-0.7.20100201cvs.fc12.x86_64
--> Running transaction check
---> Package gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be erased
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================
 Package          Arch        Version                            Repository     Size
=====================================================================================
Removing:
 gcl-selinux      x86_64      2.6.8-0.7.20100201cvs.fc12         @updates       90 k
Removing for dependencies:
 gcl              x86_64      2.6.8-0.7.20100201cvs.fc12         @updates       40 M

Transaction Summary
=====================================================================================
Remove        2 Package(s)
Reinstall     0 Package(s)
Downgrade     0 Package(s)

Is this ok [y/N]: n
Exiting on user Command
Complete!

Обновление RPM-пакетов

Теперь, когда вы знаете, как устанавливать и удалять RPM-пакеты, давайте рассмотрим процедуру обновления пакетов до новой версии. Для обновления всей системы или отдельных пакетов (а также нескольких пакетов с использованием групповых символов) используется команда yum update. В листинге 8 показано, как обновить все пакеты, имена которых начинаются с "gr". Обратите внимание на использование апострофов, которые предотвращают интерпретацию знака звездочки ("*") командной оболочкой.

Листинг 8. Обновление с помощью команды yum update
[root@echidna ~]# yum update 'gr*'
Loaded plugins: presto, refresh-packagekit
Setting up Update Process
Resolving Dependencies
--> Running transaction check
---> Package grep.x86_64 0:2.6.3-1.fc12 set to be updated
---> Package groff.x86_64 0:1.18.1.4-20.fc12 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================
 Package         Arch             Version                    Repository         Size
=====================================================================================
Updating:
 grep            x86_64           2.6.3-1.fc12               updates           228 k
 groff           x86_64           1.18.1.4-20.fc12           updates           1.5 M

Transaction Summary
=====================================================================================
Install       0 Package(s)
Upgrade       2 Package(s)

Total download size: 1.7 M
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
Processing delta metadata
Download delta size: 854 k
http://fedora.fastsoft.net/pub/linux/fedora/linux/updates/12/x86_64/drpms/grep-2.5.3-
6.fc12_2.6.3-1.fc12.x86_64.drpm: [Errno 14] HTTP Error 404 : http://fedora.fastsoft.n
et/pub/linux/fedora/linux/updates/12/x86_64/drpms/grep-2.5.3-6.fc12_2.6.3-1.fc12.x86_
64.drpm 
Trying other mirror.
(1/2): grep-2.5.3-6.fc12_2.6.3-1.fc12.x86_64.drpm             | 214 kB     00:00     
(2/2): groff-1.18.1.4-18.fc12_1.18.1.4-20.fc12.x86_64.drpm    | 640 kB     00:00     
Finishing rebuild of rpms, from deltarpms
<delta rebuild>                                               | 1.7 MB     00:02     
Presto reduced the update size by 52% (from 1.7 M to 854 k).
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Updating       : grep-2.6.3-1.fc12.x86_64                                      1/4 
  Updating       : groff-1.18.1.4-20.fc12.x86_64                                 2/4 
  Cleanup        : grep-2.5.3-6.fc12.x86_64                                      3/4 
  Cleanup        : groff-1.18.1.4-18.fc12.x86_64                                 4/4 

Updated:
  grep.x86_64 0:2.6.3-1.fc12             groff.x86_64 0:1.18.1.4-20.fc12            

Complete!

Если вы знаете, откуда можно получить RPM-файлы, или уже загрузили их, то можно выполнить обновление и с помощью команды rpm. Эта процедура похожа на процедуру инсталляции за исключением того, что вместо опции -i используется опция -U или -F. Разница между этими двумя опциями заключается в том, что опция -U обновит существующий пакет или инсталлирует его, если он еще не инсталлирован, тогда как опция -F (freshen – освежить) обновит только те пакеты, которые уже инсталлированы. По этой причине чаще используется опция -U, особенно если в командной строке перечислено несколько RPM-пакетов. В результате все неинсталлированные пакеты будут установлены, а ранее инсталлированные пакеты – обновлены. Две другие опции, -v (verbose – подробно) и -h (hash marks – знаки решетки) часто используются для того, чтобы отобразить индикатор выполнения. В листинге 9 продемонстрировано обновление пакетов vim-common, vim-enhanced и vim-minimal с помощью команды rpm. Пакеты vim-common и vim-enhanced уже были загружены в домашнюю директорию пользователя root, а пакет vim-minimal загружается из одного из источников обновлений.

Листинг 9. Обновление пакетов с помощью rpm
[root@echidna ~]# ls *.rpm
vim-common-7.2.411-1.fc12.x86_64.rpm  vim-enhanced-7.2.411-1.fc12.x86_64.rpm
[root@echidna ~]# rpm -Uvh *.rpm http://mirrors.usc.edu/pub/linux/distributions\
> /fedora/linux/updates/12/x86_64/vim-minimal-7.2.411-1.fc12.x86_64.rpm
Retrieving http://mirrors.usc.edu/pub/linux/distributions/fedora/linux/updates/12/x86
_64/vim-minimal-7.2.411-1.fc12.x86_64.rpm
Preparing...                ########################################### [100%]
   1:vim-common             ########################################### [ 33%]
   2:vim-enhanced           ########################################### [ 67%]
   3:vim-minimal            ########################################### [100%]

Получение информации о RPM-пакетах

Из наших примеров видно, что для инсталляции RPM-пакета с помощью команды rpm необходимо указать его полное имя (или URL-адрес), например, gcl-2.6.8-0.6.20090701cvs.fc12.x86_64.rpm. С другой стороны, для инсталляции пакета с помощью yum или для его удаления (как с помощью rpm, так и с помощью yum) достаточно указать только имя пакета, например, gcl. Так же, как и система APT, система RPM заносит информацию обо всех инсталлируемых пакетах во внутреннюю базу данных, позволяя выполнять различные действия с инсталлированными пакетами на основе их имен. В этом разделе я расскажу, какую информацию можно извлечь из этой базы данных с помощью команды rpm с опцией -q (query – запрос) или с помощью соответствующих запросов команды yum.

Следующий простой запрос проверяет, инсталлирован ли пакет, и если это так, показывает его версию. Добавив к запросу опцию -i, вы получите информацию о пакете. Заметьте, что для установки, обновления или удаления пакетов нужны привилегии пользователя root; для выполнения запросов к базе данных RPM эти привилегии не требуются.

Листинг 10. Вывод информации о пакете gcl
[ian@echidna ~]$ yum list gcl
Loaded plugins: presto, refresh-packagekit
Installed Packages
gcl.x86_64                  2.6.8-0.7.20100201cvs.fc12                  @updates
[ian@echidna ~]$ rpm -q gcl
gcl-2.6.8-0.7.20100201cvs.fc12.x86_64

[ian@echidna ~]$ yum info gcl
Loaded plugins: presto, refresh-packagekit
Installed Packages
Name       : gcl
Arch       : x86_64
Version    : 2.6.8
Release    : 0.7.20100201cvs.fc12
Size       : 40 M
Repo       : installed
From repo  : updates
Summary    : GNU Common Lisp
URL        : http://www.gnu.org/software/gcl/
License    : GPL+ and LGPLv2+
Description: GCL is a Common Lisp currently compliant with the ANSI standard.
           : Lisp compilation produces native code through the intermediary of
           : the system's C compiler, from which GCL derives efficient
           : performance and facile portability. Currently uses TCL/Tk as GUI.

[ian@echidna ~]$ rpm -qi gcl
Name        : gcl                          Relocations: (not relocatable)
Version     : 2.6.8                             Vendor: Fedora Project
Release     : 0.7.20100201cvs.fc12          Build Date: Tue 23 Mar 2010 03:20:36 PM EDT
Install Date: Wed 05 May 2010 01:01:34 PM EDT      Build Host: x86-02.phx2.fedoraproject.
org
Group       : Development/Languages         Source RPM: gcl-2.6.8-0.7.20100201cvs.fc12.sr
c.rpm
Size        : 41667750                         License: GPL+ and LGPLv2+
Signature   : RSA/8, Tue 23 Mar 2010 04:14:06 PM EDT, Key ID 9d1cc34857bbccba
Packager    : Fedora Project
URL         : http://www.gnu.org/software/gcl/
Summary     : GNU Common Lisp
Description :
GCL is a Common Lisp currently compliant with the ANSI standard.  Lisp
compilation produces native code through the intermediary of the
system's C compiler, from which GCL derives efficient performance and
facile portability. Currently uses TCL/Tk as GUI.

Из более подробных листингов можно получить информацию о некоторых тегах, которые могут быть связаны с RPM-пакетом. Нетрудно заметить, что выводимые программами rpm и yum результаты несколько отличаются (так же, как и форматы вывода). В этой статье мы остановимся на базовом формате вывода, предусмотренном стандартными опциями. Если вы хотите использовать опцию rpm --queryformat для создания пользовательского формата вывода, то обратитесь к соответствующей man-странице. Если вы хотите узнать обо всех тегах, поддерживаемых вашей версией rpm, то запустите команду rpm --querytags.

Как видно из листинга 10, для получения списка инсталлированных пакетов можно использовать команду yum. Эту команду также можно использовать для получения списков пакетов, для которых доступны обновления, пакетов, готовых для инсталляции, а также пакетов с другими заданными характеристиками (например, устаревшие или недавно добавленные в репозиторий). Команда yum позволяет даже искать пакеты. Из листинга 11 видно, что пакет texmacs не инсталлирован в системе, но его можно инсталлировать из репозитория "fedora". Поиск по имени "texmacs" выдаст вам список, содержащий четыре пакета. Легко понять, почему были найдены три пакета TeXmacs*. Если выполнить команду yum info pydot, то станет понятно, почему пакет pydot тоже попал в этот список.

Листинг 11. Вывод информации о пакете texmacs
[ian@echidna ~]$ yum list texmacs
Loaded plugins: presto, refresh-packagekit
Available Packages
TeXmacs.x86_64                         1.0.7.2-2.fc12                          fedora
[ian@echidna ~]$ yum search texmacs
Loaded plugins: presto, refresh-packagekit
================================= Matched: texmacs ==================================
TeXmacs-devel.i686 : Development files for TeXmacs
TeXmacs-devel.x86_64 : Development files for TeXmacs
TeXmacs.x86_64 : Structured wysiwyg scientific text editor
pydot.noarch : Python interface to Graphviz's Dot language

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

RPM-пакеты и содержащиеся в них файлы

Часто необходимо узнать, что содержится в пакете, или из какого пакета был получен тот или иной файл. Чтобы получить список файлов, содержащихся в пакете gcl, используйте опцию -ql, как показано в листинге 12 (поскольку в пакете содержится много файлов, показана лишь часть вывода).

Листинг 12. Список файлов, содержащихся в пакете gcl
[ian@echidna ~]$ rpm -ql gcl
/usr/bin/gcl
/usr/lib/gcl-2.6.8
/usr/lib/gcl-2.6.8/clcs
/usr/lib/gcl-2.6.8/clcs/sys-proclaim.lisp
/usr/lib/gcl-2.6.8/cmpnew
/usr/lib/gcl-2.6.8/cmpnew/gcl_cmpmain.lsp
/usr/lib/gcl-2.6.8/cmpnew/gcl_cmpopt.lsp
/usr/lib/gcl-2.6.8/cmpnew/gcl_collectfn.lsp
.
.
.
/usr/share/info/gcl-tk.info.gz
/usr/share/info/gcl.info-1.gz
/usr/share/info/gcl.info-2.gz
/usr/share/info/gcl.info-3.gz
/usr/share/info/gcl.info-4.gz
/usr/share/info/gcl.info-5.gz
/usr/share/info/gcl.info-6.gz
/usr/share/info/gcl.info-7.gz
/usr/share/info/gcl.info-8.gz
/usr/share/info/gcl.info-9.gz
/usr/share/info/gcl.info.gz
/usr/share/man/man1/gcl.1.gz

Вы можете ограничить список только конфигурационными файлами, добавив к запросу опцию -c. Аналогично, опция -d позволяет ограничить список только файлами документации.

Получение информации о файле пакета

Рассмотренные выше команды выполняли запросы к базе данных RPM для получения информации об уже инсталлированных пакетах. Если вы хотите получить эту же информацию о только что загруженном пакете, то используйте в запросе опцию -p (package file – файл пакета) и имя файла пакета (так же, как при установке пакета). В листинге 13 продемонстрировано использование этой команды для двух пакетов vim, которые были загружены нами ранее. Мы запустили эту команду от имени пользователя root лишь по той причине, что указанные файлы находятся в домашней директории данного пользователя. Можно добавить к запросу другие опции, например -l для получения списка файлов или -i – для вывода информации о пакете.

Листинг 13. Вывод информации о двух файлах пакетов vim
[root@echidna ~]# rpm -qp *.rpm
vim-common-7.2.411-1.fc12.x86_64
vim-enhanced-7.2.411-1.fc12.x86_64

Получение информации обо всех инсталлированных пакетах

Опция -a применяет ваш запрос ко всем инсталлированным пакетам. Команда с этой опцией может вывести много информации, поэтому обычно опция -a используется совместно с одним или несколькими фильтрами, такими как sort (для сортировки списка), more или less (для разбивки на страницы), wc (для получения количества пакетов) или grep (для поиска пакетов, имена которых точно не известны). В листинге 14 показаны следующие запросы:

  1. Отсортированный список всех пакетов в системе.
  2. Количество всех пакетов в системе.
  3. Количество всех файлов во всех пакетах системы.
  4. Количество всех файлов с документацией, установленных с помощью RPM.
  5. Поиск всех пакетов, содержащих в своем имени "gcl" (без учета регистра).
Листинг 14. Запросы ко всем пакетам
[ian@echidna ~]$ rpm -qa | sort | more
aalib-libs-1.4.0-0.18.rc5.fc12.x86_64
abrt-1.0.8-2.fc12.x86_64
abrt-addon-ccpp-1.0.8-2.fc12.x86_64
abrt-addon-kerneloops-1.0.8-2.fc12.x86_64
abrt-addon-python-1.0.8-2.fc12.x86_64
abrt-desktop-1.0.8-2.fc12.x86_64
abrt-gui-1.0.8-2.fc12.x86_64
abrt-libs-1.0.8-2.fc12.x86_64
abrt-plugin-bugzilla-1.0.8-2.fc12.x86_64
abrt-plugin-logger-1.0.8-2.fc12.x86_64
abrt-plugin-runapp-1.0.8-2.fc12.x86_64
abyssinica-fonts-1.0-5.fc12.noarch
acl-2.2.49-2.fc12.x86_64
...
[ian@echidna ~]$ rpm -qa | wc -l
1792
[ian@echidna ~]$ rpm -qal | wc -l
281052
[ian@echidna ~]$ rpm -qad | wc -l
45686
[ian@echidna ~]$ rpm -qa | grep -i gcl
gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64
gcl-2.6.8-0.7.20100201cvs.fc12.x86_64

Использование команды rpm -qa может облегчить администрирование нескольких систем. Если на одном компьютере вы перенаправите отсортированный вывод в файл, а затем сделаете то же самое на другом компьютере, то вы сможете найти отличия, сравнив эти файлы с помощью команды diff.

Из какого пакета был получен файл?

Теперь, когда вы можете вывести список всех пакетов и всех содержащихся в пакете файлов, у вас есть вся необходимая информация чтобы выяснить, из какого пакета был получен тот или иной файл. У вас всегда есть в распоряжении опция -f (или --file) команды rpm, которая помогает вам найти пакет, содержащий тот или иной файл. Предположим, вы хотите узнать, в каком из рассмотренных ранее пакетов vim на самом деле содержится команда vim. Для этого будет необходимо указать полный путь к файлу. В листинге 15 продемонстрировано использование команды which для определения полного пути к команде vim, а также приведен полезный пример использования вывода команды which в качестве входных данных команды rpm -qf. Обратите внимание на то, что команда `which guile-config` заключена в обратные апострофы. Этот же прием можно применить в командной оболочке Bash, используя конструкцию $(which vim).

Листинг 15. Из какого пакета был получен исполняемый файл vim?
[ian@echidna ~]$ which vim
/usr/bin/vim
[ian@echidna ~]$ rpm -qf `which vim`
vim-enhanced-7.2.411-1.fc12.x86_64
[ian@echidna ~]$ rpm -qf $(which vim)
vim-enhanced-7.2.411-1.fc12.x86_64

Зависимости RPM

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

Как вы могли убедиться, обычно эта схема хорошо работает. Если вам необходимо установить сразу несколько пакетов, некоторые из которых могут зависеть от других, просто используйте команду yum или передайте полный список пакетов команде rpm -Uvh, которая проанализирует все зависимости и установит пакеты в нужном порядке.

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

Команда rpm позволяет исследовать установленные пакеты или файлы пакетов и определять, от каких функций они зависят (какие функции им требуются). Для этого используется опция --requires, или сокращенно -R. В листинге 16 перечислены функции, которые требуются пакету gcl. Если вы хотите выполнить запрос к файлу пакета, а не к базе данных RPM, то добавьте опцию -p и укажите полный путь к файлу RPM-пакета.

Листинг 16. От каких пакетов зависит gcl?
[ian@echidna ~]$ rpm -qR gcl
/bin/sh  
/bin/sh  
/bin/sh  
/sbin/install-info  
/sbin/install-info  
gcl-selinux  
libX11.so.6()(64bit)  
libc.so.6()(64bit)  
libc.so.6(GLIBC_2.11)(64bit)  
libc.so.6(GLIBC_2.2.5)(64bit)  
libc.so.6(GLIBC_2.3)(64bit)  
libc.so.6(GLIBC_2.3.4)(64bit)  
libc.so.6(GLIBC_2.4)(64bit)  
libc.so.6(GLIBC_2.7)(64bit)  
libc.so.6(GLIBC_2.8)(64bit)  
libdl.so.2()(64bit)  
libgmp.so.3()(64bit)  
libm.so.6()(64bit)  
libm.so.6(GLIBC_2.2.5)(64bit)  
libreadline.so.6()(64bit)  
libtcl8.5.so()(64bit)  
libtk8.5.so()(64bit)  
libz.so.1()(64bit)  
rpmlib(CompressedFileNames) <= 3.0.4-1
rpmlib(FileDigests) <= 4.6.0-1
rpmlib(PayloadFilesHavePrefix) <= 4.0-1
rtld(GNU_HASH)  
rpmlib(PayloadIsXz) <= 5.2-1

Может оказаться не так просто выяснить, в каком из пакетов содержится нужная функция. Решить эту задачу поможет команда yum с опцией deplist. Если вы просто укажете имя пакета без уточнения его версии, вы можете получить список зависимостей для всех известных версий этого пакета. В листинге 17 показано, как получить список зависимостей только для той версии gcl, которая уже установлена.

Листинг 17. Использование команды yum deplist для определения зависимостей gcl
[ian@echidna ~]$ yum deplist $(rpm -q gcl)
Loaded plugins: presto, refresh-packagekit
Finding dependencies: 
package: gcl.x86_64 2.6.8-0.7.20100201cvs.fc12
  dependency: libc.so.6(GLIBC_2.3.4)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: gcl-selinux
   provider: gcl-selinux.x86_64 2.6.8-0.6.20090701cvs.fc12
   provider: gcl-selinux.x86_64 2.6.8-0.7.20100201cvs.fc12
  dependency: libgmp.so.3()(64bit)
   provider: gmp.x86_64 4.3.1-5.fc12
  dependency: libc.so.6(GLIBC_2.8)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libc.so.6(GLIBC_2.4)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libc.so.6()(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: /sbin/install-info
   provider: info.x86_64 4.13a-7.fc12
   provider: info.x86_64 4.13a-9.fc12
  dependency: libX11.so.6()(64bit)
   provider: libX11.x86_64 1.3-1.fc12
  dependency: libc.so.6(GLIBC_2.7)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libtcl8.5.so()(64bit)
   provider: tcl.x86_64 1:8.5.7-4.fc12
   provider: tcl.x86_64 1:8.5.7-5.fc12
  dependency: libc.so.6(GLIBC_2.11)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libtk8.5.so()(64bit)
   provider: tk.x86_64 1:8.5.7-2.fc12
   provider: tk.x86_64 1:8.5.7-3.fc12
  dependency: libc.so.6(GLIBC_2.3)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libm.so.6()(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libz.so.1()(64bit)
   provider: zlib.x86_64 1.2.3-23.fc12
  dependency: rtld(GNU_HASH)
   provider: glibc.i686 2.11-2
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
   provider: glibc.i686 2.11.1-6
  dependency: libdl.so.2()(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libreadline.so.6()(64bit)
   provider: readline.x86_64 6.0-3.fc12
  dependency: /bin/sh
   provider: bash.x86_64 4.0.33-1.fc12
   provider: bash.x86_64 4.0.35-3.fc12
  dependency: libc.so.6(GLIBC_2.2.5)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6
  dependency: libm.so.6(GLIBC_2.2.5)(64bit)
   provider: glibc.x86_64 2.11-2
   provider: glibc.x86_64 2.11.1-6

В этом списке также содержится информация о возможных пакетах-источниках каждой функции. Как видно из листинга, в большинстве случаев требуемые функции содержатся в нескольких пакетах, имеющих различные версии. Например, команда /bin/sh могла появиться в результате установки любого из двух пакетов bash. Проявив немного фантазии, можно сократить вывод этой команды до перечня имен пакетов, как показано в листинге 18.

Листинг 18. Сокращение вывода команды yum deplist до списка имен пакетов
[ian@echidna ~]$ yum deplist $(rpm -q gcl) | grep "provider:" | \
> awk '{ print $2 }'|sort|uniq
bash.x86_64
gcl-selinux.x86_64
glibc.i686
glibc.x86_64
gmp.x86_64
info.x86_64
libX11.x86_64
readline.x86_64
tcl.x86_64
tk.x86_64
zlib.x86_64

Если вы просто хотите узнать, какие пакеты необходимо установить, то всегда можно выполнить команду yum install и увидеть список пакетов прежде, чем вам будет предложено подтвердить продолжение инсталляции.

В дополнение к поиску зависимостей для определенного пакета может возникнуть необходимость выяснить, в каком пакете содержится та или иная функция. Вы уже знаете, как можно определить, в каком пакете содержится тот или иной файл. В листинге 19 показано, как с помощью rpm или yum выяснить, в каком пакете содержится функция gcl-selinux(x86-64). Помимо информации об инсталлированных пакетах, содержащих ту или иную функцию, YUM также выводит информацию о пакетах или их версиях, доступных для загрузки из репозиториев. В нашем примере мы получили информацию о двух пакетах: об исходной версии 2.6.8-0.6 из репозитория "fedora" и обновленной версии 2.6.8-0.7 из репозитория "updates".

Листинг 19. В каких пакетах содержится функция gcl-selinux(x86-64)?
[ian@echidna ~]$ rpm -q --whatprovides 'gcl-selinux(x86-64)'
gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64
[ian@echidna ~]$ yum whatprovides 'gcl-selinux(x86-64)'
Loaded plugins: presto, refresh-packagekit
gcl-selinux-2.6.8-0.6.20090701cvs.fc12.x86_64 : SELinux policy for GCL images
Repo        : fedora
Matched from:
Other       : gcl-selinux(x86-64)



gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64 : SELinux policy for GCL images
Repo        : updates
Matched from:
Other       : gcl-selinux(x86-64)



gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64 : SELinux policy for GCL images
Repo        : installed
Matched from:
Other       : Provides-match: gcl-selinux(x86-64)

Проверка целостности файла RPM-пакета

Каждый RPM-пакет содержит дайджест, такой как MD5 или SHA1, и, как правило, имеет цифровую подпись, по которой можно проверить его целостность. Для проверки пакетов, имеющих цифровую подпись, требуется использовать открытый ключ. Для проверки целостности файла RPM-пакета используется опция --checksig (или сокращенно -K) команды rpm. Для вывода подробной информации полезно использовать опцию -v. В листинге 20 показан пример проверки целостности файла пакета vim-enhanced.

Листинг 20. Проверка целостности файла пакета vim-enhanced
[root@echidna ~]# rpm -vK vim-enhanced-7.2.411-1.fc12.x86_64.rpm
vim-enhanced-7.2.411-1.fc12.x86_64.rpm:
    Header V3 RSA/SHA256 signature: OK, key ID 57bbccba
    Header SHA1 digest: OK (f9a199545a515f7ff0716729768b41eb68fe29a8)
    V3 RSA/SHA256 signature: OK, key ID 57bbccba
    MD5 digest: OK (d4045f1f72d48073e3f401ee9d1f71cf)

Вы можете получить следующий результат:

V3 DSA signature: NOKEY, key ID 16a61572

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

Если пакет подписан цифровой подписью, и вы хотите использовать ее для проверки пакета, то необходимо получить файл ключа этой подписи и импортировать его в вашу базу данных RPM. Прежде чем импортировать ключ с помощью команды rpm --import, следует загрузить его и проверить его контрольную сумму. Дополнительную информацию вы можете найти на man-страницах RPM. Дополнительную информацию о подписанных исполняемых файлах можно найти на домашней странице RPM (см. раздел Ресурсы).


Проверка целостности установленного пакета

Аналогично проверке целостности файла RPM-пакета, вы можете проверять целостность инсталлированных файлов пакета с помощью команды rpm -V. Это позволяет убедиться в том, что файлы, установленные из RPM-пакета, не были изменены после инсталляции. Из листинга 21 видно, что если все файлы в порядке, команда не выводит никакой информации. Для вывода подробной информации можно использовать опцию -v.

Листинг 21. Проверка целостности установленного пакета vim-common
[ian@echidna ~]$ rpm -V vim-common

Давайте войдем в систему под учетной записью пользователя root и испортим установленный пакет vim-common, удалив директорию /usr/bin/xxd и заменив файл /usr/share/vim/vim72/syntax/bindzone.vim файлом /bin/bash. Попытаемся снова выполнить проверку. Результат показан в листинге 22.

Листинг 22. Фальсификация пакета vim-common
[root@echidna ~]# rpm -qf /usr/bin/xxd /usr/share/vim/vim72/syntax/bindzone.vim
vim-common-7.2.411-1.fc12.x86_64
vim-common-7.2.411-1.fc12.x86_64
[root@echidna ~]# rm /usr/bin/xxd
rm: remove regular file `/usr/bin/xxd'? y
[root@echidna ~]# cp /bin/bash /usr/share/vim/vim72/syntax/bindzone.vim
cp: overwrite `/usr/share/vim/vim72/syntax/bindzone.vim'? y
[root@echidna ~]# rpm -V vim-common
missing     /usr/bin/xxd
S.5....T.    /usr/share/vim/vim72/syntax/bindzone.vim

Из листинга 22 видно, что файл /usr/share/vim/vim72/syntax/bindzone.vim имеет неправильную контрольную сумму MD5, неправильный размер и неверную метку времени mtime. Решением этой проблемы могли бы стать удаление и повторная инсталляция пакета, но в системе имеются другие зависящие от vim-common пакеты, с которыми все в порядке. Поэтому в данном случае нам поможет принудительная инсталляция пакета с использованием опции --force команды rpm или опции reinstall команды yum. В листинге 23 показано, как можно выполнить повторную инсталляцию пакета с помощью yum и убедиться в том, что удаленные файлы и целостность пакета были восстановлены.

Листинг 23. Повторная инсталляция пакета vim-common
[root@echidna ~]# yum reinstall vim-common
Loaded plugins: presto, refresh-packagekit
Setting up Reinstall Process
Resolving Dependencies
--> Running transaction check
---> Package vim-common.x86_64 2:7.2.411-1.fc12 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

=====================================================================================
 Package            Arch           Version                     Repository       Size
=====================================================================================
Reinstalling:
 vim-common         x86_64         2:7.2.411-1.fc12            updates         6.0 M

Transaction Summary
=====================================================================================
Remove        0 Package(s)
Reinstall     1 Package(s)
Downgrade     0 Package(s)

Total download size: 6.0 M
Installed size: 17 M
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
updates/prestodelta                                           | 969 kB     00:00     
Processing delta metadata
Package(s) data still to download: 6.0 M
vim-common-7.2.411-1.fc12.x86_64.rpm                          | 6.0 MB     00:01     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
Warning: RPMDB altered outside of yum.
  Installing     : 2:vim-common-7.2.411-1.fc12.x86_64                            1/1 

Installed:
  vim-common.x86_64 2:7.2.411-1.fc12                                                 

Complete!
[root@echidna ~]# rpm -V vim-common
[root@echidna ~]# ls /usr/bin/xxd
/usr/bin/xxd

Если необходимо дополнительное вмешательство

Обычно система управления пакетами поддерживает порядок в установленных пакетах. Однако, если вы случайно удалили какой-то важный файл, являющийся частью пакета, и повторная инсталляция пакета без его удаления не исправила ситуацию, то потребуется удалить пакет. В этом случае можно попробовать удалить инсталлированный экземпляр и установить его повторно, не затрагивая все зависящие от него пакеты. Для этого можно использовать опцию --nodeps команды rpm, позволяющую пропустить проверку зависимостей при удалении пакета. В листинге 24 показано, как это сделать, если вы случайно удалили файл /usr/bin/xxd file, являющийся частью пакета vim-common.

Листинг 24. Обновление пакетов с помощью rpm
[root@echidna ~]# rm /usr/bin/xxd
rm: remove regular file `/usr/bin/xxd'? y
[root@echidna ~]# # Oops! we needed that file
[root@echidna ~]# rpm -Fvh vim-common-7.2.411-1.fc12.x86_64.rpm 
[root@echidna ~]# ls /usr/bin/xxd
ls: cannot access /usr/bin/xxd: No such file or directory
[root@echidna ~]# # Oh! Freshening the package didn't replace the missing file
[root@echidna ~]# rpm -e vim-common
error: Failed dependencies:
	vim-common = 2:7.2.411-1.fc12 is needed by (installed) vim-enhanced-2:7.2.411-1.f
c12.x86_64
[root@echidna ~]# # Can't remove vim-common because vim-enhanced needs it
[root@echidna ~]# rpm -e --nodeps vim-common
[root@echidna ~]# # Bypassing the dependency check allowed removal
[root@echidna ~]# rpm -Uvh vim-common-7.2.411-1.fc12.x86_64.rpm 
Preparing...                ########################################### [100%]
   1:vim-common             ########################################### [100%]
[root@echidna ~]# # Update (or install) vim-common again
[root@echidna ~]# ls /usr/bin/xxd
/usr/bin/xxd
[root@echidna ~]# # And /usr/bin/xxd is back

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


Загрузка RPM-пакетов из репозиториев

Хотя команда yum автоматически загружает пакеты из репозиториев, вам может потребоваться загрузить пакеты и сохранить их, например, для использования на другом компьютере, не подключенном к сети или для проверки их содержимого. Для этого можно использовать команду yumdownloader, как показано в листинге 25. В нашем примере пакет уже установлен, поэтому загружать дополнительные пакеты не требуется. Если бы такие пакеты имелись, они также были бы загружены, благодаря использованию опции --resolve.

Листинг 25. Загрузка пакета gcl
[ian@echidna ~]$ yumdownloader --resolve gcl
Loaded plugins: presto, refresh-packagekit
adobe-linux-i386                                                               17/17
--> Running transaction check
---> Package gcl.x86_64 0:2.6.8-0.7.20100201cvs.fc12 set to be updated
--> Finished Dependency Resolution
gcl-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm                     | 6.3 MB     00:01

Команда rpm2cpio

Если вы загрузили RPM-пакет и хотите проверить его содержимое, не инсталлируя этот пакет, то можно воспользоваться командой rpm2cpio для преобразования содержимого пакета в архив cpio, а затем извлечь из него с помощью команды cpio определенные (или все) файлы. В листинге 26 приведен пример для пакета gcl-selinux и показаны все файлы (и директории), которые были распакованы. Для получения подробной информации о командах rpm2cpio и cpio обратитесь к соответствующим man-страницам.

Листинг 26. Распаковка пакета gcl-selinux с помощью rpm2cpio
[ian@echidna ~]$ yumdownloader gcl-selinux
Loaded plugins: presto, refresh-packagekit
gcl-selinux-2.6.8-0.7.20100201cvs.fc12.x86_64.rpm        |  17 kB     00:00     
[ian@echidna ~]$ mkdir gcl-selinux
[ian@echidna ~]$ cd gcl-selinux
[ian@echidna gcl-selinux]$ rpm2cpio ../gcl-selinux*.rpm | cpio -idv
./usr/share/selinux/packages/gcl
./usr/share/selinux/packages/gcl/gcl.pp
182 blocks
[ian@echidna gcl-selinux]$ find .
.
./usr
./usr/share
./usr/share/selinux
./usr/share/selinux/packages
./usr/share/selinux/packages/gcl
./usr/share/selinux/packages/gcl/gcl.pp

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

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

  • Можно попробовать угадать, какой пакет может содержать нужную программу, и загрузить его без инсталляции. Когда вы получите этот пакет, можно просмотреть его содержимое.
  • Можно поискать информацию в Интернете.
  • Можно воспользоваться функцией command-not-found, о которой будет рассказано в следующем разделе.

Если вы не можете найти определенный RPM-пакет с помощью системных инструментов, можно поискать его в Интернете на сервере Rpmfind.Net (см. раздел Ресурсы).

Команда не найдена

Когда командная оболочка Bash выполняет поиск команды и не находит ее, она пытается обратиться к функции с именем command_not_found_handle. Если функция command_not_found_handle существует, то происходит ее вызов (в качестве аргументов используются исходная команда и ее исходные аргументы), и ее код завершения становится кодом завершения командной оболочки. Если же эта функция не определена, командная оболочка выводит сообщение об ошибке и возвращает код завершения 127. Обычно эта функция определена в системном файле /etc/bash.bashrc. В листинге 27 показано, как мы нашли функцию command-not-found и установили ее.

Листинг 27. Поиск и установка функции command-not-found
[root@echidna ~]# yum search command-not-found
Loaded plugins: presto, refresh-packagekit
========================== Matched: command-not-found ==========================
PackageKit-command-not-found.x86_64 : Ask the user to install command line
                                    : programs automatically
You have new mail in /var/spool/mail/root
[root@echidna ~]# yum install PackageKit-command-not-found.x86_64
Loaded plugins: presto, refresh-packagekit
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package PackageKit-command-not-found.x86_64 0:0.5.7-2.fc12 set to be updated
--> Finished Dependency Resolution

Dependencies Resolved

================================================================================
 Package                          Arch       Version          Repository   Size
================================================================================
Installing:
 PackageKit-command-not-found     x86_64     0.5.7-2.fc12     updates     102 k

Transaction Summary
================================================================================
Install       1 Package(s)
Upgrade       0 Package(s)

Total download size: 102 k
Installed size: 262 k
Is this ok [y/N]: y
Downloading Packages:
Setting up and reading Presto delta metadata
Processing delta metadata
Package(s) data still to download: 102 k
PackageKit-command-not-found-0.5.7-2.fc12.x86_64.rpm     | 102 kB     00:00     
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing     : PackageKit-command-not-found-0.5.7-2.fc12.x86_64         1/1 

Installed:
  PackageKit-command-not-found.x86_64 0:0.5.7-2.fc12                            

Complete!

В листинге 28 показано, как определен обработчик этой функции после установки пакета PackageKit-command-not-found. Если функция не может найти указанную команду, имитируется стандартное поведение системы, т. е. возвращается код завершения 127.

Листинг 28. Функция command_not_found_handle
[ian@echidna ~]$ type command_not_found_handle
command_not_found_handle is a function
command_not_found_handle () 
{ 
    runcnf=1;
    retval=127;
    [ ! -S /var/run/dbus/system_bus_socket ] && runcnf=0;
    [ ! -x /usr/sbin/packagekitd ] && runcnf=0;
    if [ $runcnf -eq 1 ]; then
        /usr/libexec/pk-command-not-found $1;
        retval=$?;
    else
        echo "bash: $1: command not found";
    fi;
    return $retval
}

Если бы эта функция была установлена в тот момент, когда мы пытались запустить отсутствующую в системе команду gcl (вспомните листинг 1), то мы бы увидели следующее сообщение (листинг 29).

Листинг 29. Попытка запуска компилятора gcl при использовании функции command_not_found_handle
[ian@echidna ~]$ gcl
Command not found. Install package 'gcl' to provide command 'gcl'? [N/y]

Другие инструменты управления пакетами

Помимо программ yum и rpm в вашем дистрибутиве Linux могут содержаться и другие инструменты для установки пакетов из репозитория или для обновления всей системы. Эти инструменты могут выполняться из командной строки и/или иметь графический интерфейс. Приведем несколько примеров:

  • YaST (SUSE)
  • up2date (Red Hat)
  • Mandrake Software Management (Mandriva)

Обычно эти инструменты обрабатывают сразу несколько пакетов в автоматическом или полуавтоматическом режиме. Также они могут отображать содержимое репозиториев или выполнять поиск пакетов. Для получения более подробной информации обратитесь к документации вашего дистрибутива.


Комплект PackageKit

Рассмотрение инструментов управления пакетами было бы неполным без упоминания о PackageKit – комплекте инструментов, призванном упростить инсталляцию и обновление программного обеспечения. Основной целью его создания является объединение всех графических инструментов, используемых в различных дистрибутивах Linux. Для работы PackageKit используется системно активируемый демон (это означает, что демон активируется только тогда, когда он необходим). Существуют версии PackageKit для Gnome (gnome-packagekit) и KDE (KPackageKit). Рассмотренная ранее функция command-not-found также является частью пакета PackageKit. В этот пакет также входят утилиты pkcon (для управления пакетами через консоль) и pkmon (для мониторинга работы PackageKit), а также графические инструменты для добавления пакетов приложений и обновления системы. На рисунке 1 изображен пример графического интерфейса менеджера обновлений Software Update.

Рисунок 1. Графический интерфейс Software Update в Fedora 12 (Gnome)
Рисунок 1. Графический интерфейс Software Update в Fedora 12 (Gnome)

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

Ресурсы

Научиться

  • Оригинал статьи: Learn Linux, 101: RPM and YUM package management (EN).
  • На Web-сайте программы сертификации LPIC (EN) вы найдете подробные цели, списки задач и примерные вопросы всех трех уровней сертификации на администратора Linux-систем профессионального института Linux. В частности, на этом сайте представлены цели экзаменов LPI 101 и LPI 102 по состоянию на апрель 2009 года. Всегда обращайтесь к Web-сайту программы сертификации LPIC, чтобы узнать последние цели.
  • На домашней странице RPM (EN) вы найдете самую последнюю информацию о системе управления пакетами RPM, а также ссылки на другие источники информации о ней.
  • Книга Maximum RPM (EN) – это всестороннее, систематизированное рассмотрение всех аспектов работы с RPM. Эта книга доступна как в бумажном, так и в электронном виде.
  • Посетите домашнюю страницу LSB (EN) и узнайте больше о проекте Linux Standard Base (LSB), разрабатываемом некоммерческой организацией Free Standards Group (FSG), целью которого является стандартизация внутренней структуры операционных систем, основанных на Linux.
  • Посетите домашнюю страницу PackageKit (EN), чтобы узнать больше об этом комплекте инструментов.
  • Web-сайт Linux Documentation Project (EN) содержит большое количество полезной документации, в особенности, HOWTO-руководств.

Получить продукты и технологии

  • Найдите пакеты программного обеспечения на зеркалах, предназначенных для вашего дистрибутива Linux, таких как Fedora/12 Public Active Mirrors (EN).
  • Найдите RPM-пакеты, предназначенные для вашего дистрибутива, на серверах Rpmfind.Net (EN) и RPM Search (EN).

Обсудить

Комментарии

developerWorks: Войти

Обязательные поля отмечены звездочкой (*).


Нужен IBM ID?
Забыли Ваш IBM ID?


Забыли Ваш пароль?
Изменить пароль

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Профиль создается, когда вы первый раз заходите в developerWorks. Информация в вашем профиле (имя, страна / регион, название компании) отображается для всех пользователей и будет сопровождать любой опубликованный вами контент пока вы специально не укажите скрыть название вашей компании. Вы можете обновить ваш IBM аккаунт в любое время.

Вся введенная информация защищена.

Выберите имя, которое будет отображаться на экране



При первом входе в developerWorks для Вас будет создан профиль и Вам нужно будет выбрать Отображаемое имя. Оно будет выводиться рядом с контентом, опубликованным Вами в developerWorks.

Отображаемое имя должно иметь длину от 3 символов до 31 символа. Ваше Имя в системе должно быть уникальным. В качестве имени по соображениям приватности нельзя использовать контактный e-mail.

Обязательные поля отмечены звездочкой (*).

(Отображаемое имя должно иметь длину от 3 символов до 31 символа.)

Нажимая Отправить, Вы принимаете Условия использования developerWorks.

 


Вся введенная информация защищена.


static.content.url=http://www.ibm.com/developerworks/js/artrating/
SITE_ID=40
Zone=Linux
ArticleID=756534
ArticleTitle=Изучаем Linux, 101: Управление пакетами с помощью RPM и YUM
publish-date=09082011