.$redefine CHAPTER=make .$redefine SECTION=rpm .$redefine TITLE=Подробно про rpm .+ section.inchtml .$redefine SEC_JUMPER=^(RELS_PTN intro,bin) .+ section_begin.inchtml ^(|BEGIN_PAGE Зачем нужен rpm)

Как уже упоминалось в разделе "Добавление и удаление пакетов", ^(H_PROG:rpm) (Redhat Package Manager) служит для работы с пакетами -- установка, удаление, проверка и т.д.

При установке пакета ^(H_PROG:rpm) записывает информацию о нем в свою базу данных, что и позволяет в дальнейшем удалять пакет, просматривать информацию о нем и т.д.

Такой подход к установке ПО имеет несколько достоинств, в частности:

^(END_PAGE) ^(|BEGIN_PAGE Режимы работы rpm)

Если вызвать ^(H_CMD:rpm) без параметров, то он покажет "краткий" список ключей. Обычно же формат вызова ^(H_CMD:rpm) такой: ^(QUOTE_CMD rpm -КлючРежима [дополнительные ключи] [параметры])

КлючРежима, указываемый первым, определяет режим работы. Самые частоиспользуемые режимы перечислены в таблице. ^(|BEGIN_DTABLE Основные варианты вызова rpm|Команда|Назначение) ^(|DTRT rpm -i файл-пакета.rpm|Установка пакета (install)) ^(|DTRT rpm -U файл-пакета.rpm|Обновление пакета (Upgrage)) ^(|DTRT rpm -e пакет|Удаление пакета (erase)) ^(|DTRT rpm -q пакет|Получение информации (query)) ^(|DTRT rpm -y пакет|Проверка пакета (verify)) ^(|DTRT rpm -b|Создание пакета .rpm из .src.rpm (build); здесь не рассматривается) ^(END_DTABLE)

Установку, обновление и удаление пакетов мы рассмотрели ранее, поэтому сейчас остановимся лишь на общих параметрах, получении информации и проверке. ^(END_PAGE) ^(|BEGIN_PAGE Ключи и параметры, общие для разных режимов)

В аргументах обычно используется два варианта ссылок на пакеты.

Имя-файла-пакета.rpm для режимов -i и -U -- это полное (с директорией) имя файла. Например, ^(H_PATH:~/RPMS/apache-1.3.3-1.i386.rpm). В принципе, ^(H_PROG:rpm) понимает имена файлов в виде ftp-URL, т.е. ^(H_PATH:ftp://сервер/директория/файл.rpm), но ими имеет смысл пользоваться только в быстрой и надежной сети (в нашей стране -- в локальной). Впрочем, в локальной сети (и любой быстрой) удобнее пользоваться NFS-сервером, если он есть.

Пакет -- это имя уже установленного пакета для режимов -e, -q и -y. Оно может указываться как с номером версии, так и без него. Примеры: ^(H_PATH:acroread-3.01-4), ^(H_PATH:acroread). Если вместо списка пакетов указать ключ ^(H_TYPE:-a) (all), то это будет означать "все пакеты". Кроме того, ключ ^(H_TYPE:-f) позволяет вместо имени пакета указать какой-либо файл, принадлежащий этому пакету (см. ниже).

Можно указывать не один файл-пакета или пакет, а сразу несколько, разделяя их пробелами. ^(END_PAGE) ^(ANCHOR query) ^(|BEGIN_PAGE Получение информации)

Команда ^(H_CMD:rpm -q) позволяет получать следующую информацию о пакете:

Просто ^(H_TYPE:rpm -qимя-пакета) выдает полное название пакета, вместе с версией: ^(BEGIN_EXAMPLE) bobby:~% rpm -q gcc gcc-2.7.2.3-14 bobby:~% _ ^(END_EXAMPLE)

Но чаще всего команда ^(H_TYPE:rpm -q) используется для получения списка файлов пакета. ^(|SUBPAGE Краткая информация о пакете -- rpm -qi)

Команда ^(H_TYPE:rpm -qi) (info) выдает сводку информации о пакете -- название, версия, объем и т.д., плюс краткую аннотацию: ^(BEGIN_EXAMPLE) bobby:~% rpm -qi xjewel Name : xjewel Distribution: Manhattan Version : 1.6 Vendor: Red Hat Software Release : 9 Build Date: Thu Aug 13 05:51:53 1998 Install date: Wed Dec 9 21:00:59 1998 Build Host: porky.redhat.com Group : X11/Games/Video Source RPM: xjewel-1.6-9.src.rpm Size : 50289 License: MIT Packager : Red Hat Software <bugs@redhat.com> Summary : Game like Sega's columns Description : Jewel is a game much like Domain/Jewelbox which is a puzzle game like Tetris. It is played by controling the motion of blocks which continue to fall from the top of the screen. One can move them left and right, as well as rotate the jewel segements. The object is to get the most points before the grim reaper ends the fun. bobby:~% _ ^(END_EXAMPLE) ^(|SUBPAGE Список файлов пакета -- rpm -ql)

Для получения списка файлов используется ключ ^(H_TYPE:-l) (list): ^(BEGIN_EXAMPLE) bobby:~% rpm -ql xjewel /etc/X11/wmconfig/xjewel /usr/X11R6/bin/xjewel /usr/X11R6/man/man1/xjewel.1x /var/lib/games/xjewel.scores bobby:~% _ ^(END_EXAMPLE)

Поскольку некоторые пакеты содержат очень большое количество файлов, то стоит отправлять вывод от ^(H_CMD:rpm -ql) команде ^(H_CMD:less): ^(QUOTE_CMD rpm -ql gcc | less)

Для получения "полной" информации о пакете (аннотации и списка файлов) можно указать ключи ^(H_TYPE:-i) и ^(H_TYPE:-l) одновременно: ^(BEGIN_EXAMPLE) bobby:~% rpm -qil xjewel Name : xjewel Distribution: Manhattan Version : 1.6 Vendor: Red Hat Software Release : 9 Build Date: Thu Aug 13 05:51:53 1998 Install date: Wed Dec 9 21:00:59 1998 Build Host: porky.redhat.com Group : X11/Games/Video Source RPM: xjewel-1.6-9.src.rpm Size : 50289 License: MIT Packager : Red Hat Software <bugs@redhat.com> Summary : Game like Sega's columns Description : Jewel is a game much like Domain/Jewelbox which is a puzzle game like Tetris. It is played by controling the motion of blocks which continue to fall from the top of the screen. One can move them left and right, as well as rotate the jewel segements. The object is to get the most points before the grim reaper ends the fun. /etc/X11/wmconfig/xjewel /usr/X11R6/bin/xjewel /usr/X11R6/man/man1/xjewel.1x /var/lib/games/xjewel.scores bobby:~% _ ^(END_EXAMPLE) ^(|SUBPAGE Какому пакету принадлежит файл)

Часто возникает необходимость узнать, какому пакету принадлежит какой-то файл (например, чтобы знать, где искать к нему документацию). Для этого можно воспользоваться ключом ^(H_TYPE:-f) (file): ^(BEGIN_EXAMPLE) bobby:~% rpm -qf /etc/dosemu.users dosemu-0.98.1-2 bobby:~% _ ^(END_EXAMPLE)

При этом надо указывать полное имя файла -- с директорией. Кроме того, если к файлу есть "несколько путей" (из-за символьных линков на директории), то следует указывать "основной" (обычно тот, который без символьных линков), иначе ^(H_PROG:rpm) не сможет дать ответ: ^(BEGIN_EXAMPLE) bobby:~% ls -ld /usr/X11 /usr/X11R6 lrwxrwxrwx 1 root root 5 Dec 9 20:44 /usr/X11 -> X11R6 drwxr-xr-x 8 root root 1024 Jan 19 05:14 /usr/X11R6 bobby:~% rpm -qf /usr/X11/lib/X11/app-defaults/GV file /usr/X11/lib/X11/app-defaults/GV is not owned by any package bobby:~% rpm -qf /usr/X11R6/lib/X11/app-defaults/GV gv-3.5.8-5 bobby:~% _ ^(END_EXAMPLE)

Вообще-то действие ключа ^(H_TYPE:-f) не ограничивается простым запросом "скажи кому принадлежит файл". Этот ключ позволяет другим способом сослаться на пакет, т.е. вместо имени пакета указать один из принадлежащих ему файлов. Так, команды ^(QUOTE_CMD rpm -qif /etc/zshenv) и ^(QUOTE_CMD rpm -qi zsh) эквивалентны. ^(|SUBPAGE А как там назывался пакет...)

Иногда возникает такая ситуация: примерно помнишь, как назывался некий пакет, но только примерно (а мало ли где в имени были заглавные буквы, где маленькие, где дефисы...). В этой ситуации можно заставить ^(H_PROG:rpm) выдать список всех пакетов (ключ ^(H_TYPE:-a)) и найти нужное при помощи ^(H_CMD:grep). Пример ("как назывались пакеты, содержащие netscape?"): ^(BEGIN_EXAMPLE) bobby:~% rpm -qa | grep netscape netscape-communicator-4.08-1 netscape-common-4.08-1 bobby:~% _ ^(END_EXAMPLE)

Другой пример ("к чему там относится afterstep?"): ^(BEGIN_EXAMPLE) bobby:~% rpm -qa | grep -i after AfterStep-1.5-0.7 AfterStep-APPS-1.5-0.3 bobby:~% _ ^(END_EXAMPLE) ^(|SUBPAGE Где же был этот файл...)

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

Вместо того, чтобы делать поиск по всему диску (что очень долго), можно заставить ^(H_PROG:rpm) выдать список файлов всех пакетов (ключ ^(H_TYPE:-al)) и отфильтровать нужное при помощи ^(H_CMD:grep). Пример ("где там был файл с параметрами разных мониторов?"): ^(BEGIN_EXAMPLE) bobby:~% rpm -qal | grep -i monitors /usr/X11R6/share/Xconfigurator/MonitorsDB /usr/X11R6/lib/X11/doc/Monitors bobby:~% _ ^(END_EXAMPLE)

Искомый файл в данном примере -- второй. ^(|SUBPAGE Информация о неинсталлированном пакете)

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

Получить информацию о содержимом .rpm-файла можно, если вместо имени пакета указать ключ ^(H_TYPE:-p) (package) и полное имя .rpm-файла, содержащего пакет. Пример: ^(BEGIN_EXAMPLE) bobby:~% rpm -qip /net/rdist/dist/contrib/libc6/i386/x11amp-0.65r2-1.i386.rpm Name : x11amp Distribution: (none) Version : 0.65r2 Vendor: (none) Release : 1 Build Date: Fri Mar 13 16:09:25 1998 Install date: (not installed) Build Host: fallenAngel.intrak.tuke.sk Group : X11/Applications Source RPM: x11amp-0.65r2-1.src.rpm Size : 349571 License: Not GPL, please read http: //www.x11amp.ml.org/source.html Summary : mp3 player for X windows Description : This player will have the same features as the original winamp from Windows 95 but it will of course feature some specials only available for the linux version. Some features that are already included are: Nice file requester, Seeking in files, Volume/Balance, Shuffle play, Repeat play, Playlist editor, Spectrum Analyzer, Realtime Playing. bobby:~% _ ^(END_EXAMPLE) ^(|SUBPAGE Чего требует пакет -- rpm -qR)

Ключ ^(H_TYPE:-R) (Requirements) позволяет узнать, какие пакеты и библиотеки требуются пакету. Особенно часто это требуется перед установкой пакета. Пример: ^(BEGIN_EXAMPLE) bobby:~% rpm -qRp /net/rdist/dist/contrib/libc6/i386/x11amp-0.9-alpha2-2.i386.rpm gtk+ >= 1.1.13 ld-linux.so.2 libX11.so.6 libXext.so.6 libc.so.6 libdl.so.2 libgdk-1.1.so.13 libglib-1.1.so.13 libgmodule-1.1.so.13 libgtk-1.1.so.13 libm.so.6 libpthread.so.0 libx11amp.so.0 bobby:~% rpm -q gtk+ gtk+-1.0.6-3 bobby:~% _ ^(END_EXAMPLE)

В вышеприведенном примере видно, что данный пакет установить не удастся, как минимум потому, что установленная версия пакета gtk+ слишком старая. ^(END_PAGE) ^(|BEGIN_PAGE Проверка)

Команда ^(H_CMD:rpm -y пакет) позволяет сравнить текущее состояние файлов пакета с информацией, записанной в базе данных. Это требуется, например, при проверке, не испорчены ли какие-нибудь важные для системы файлы (такое случается после внезапного отключения питания).

При нахождении различий печатается ключевая строка, с обозначением отличий и имя файла, в котором они найдены.

Сравниваются следующие параметры:

5
Контрольная сумма (подсчитанная по алгоритму MD5)
S
Размер файла #
L
Символьный линк (мне это не разу не встречалось, так что что это...)
L
Куда указывает символьный линк (если проверяемый файл является симлинком)
T
Время модификации
D
Устройство (раздел), на котором расположен файл
U
Владелец
G
Группа-владелец
M
Права доступа

Проверку лучше выполнять как ^(H_USER:root), так как некоторые файлы (например, ^(H_PATH:/usr/X11R6/bin/xterm)) могут быть недоступны на чтение другим пользователям и для них всегда будет выдаваться несовпадение по контрольной сумме.

Пример: ^(BEGIN_EXAMPLE) bobby:~# rpm -y setup S.5....T c /etc/exports S.5....T c /etc/printcap S.5....T c /etc/securetty S.5....T c /etc/services bobby:~# _ ^(END_EXAMPLE)

Как видно из этого примера, в некоторых файлах обязательно будут отличия, поскольку тот же ^(H_PATH:/etc/passwd) изменяется при создании и изменении пользователей.

Аналогично команде ^(H_CMD:rpm -q), ^(H_CMD:rpm -y) можно вместо имени пакета указывать ^(H_TYPE:-f файл) или ^(H_TYPE:-a).

Команда ^(H_CMD:rpm -ya) полезна для проверки всей системы, но ее исполнение занимает много времени. ^(BEGIN_NOTE) Иногда в документации вместо ^(H_TYPE:-y) указывается ^(H_TYPE:-V) (Verify) -- эти два ключа эквивалентны. ^(END_NOTE) ^(END_PAGE) ^(|BEGIN_PAGE Где еще брать информацию про rpm)

Основные сведения содержатся в man-странице по rpm. Кроме того, с системой поставляется "HOWTO" документация -- ^(QUOTE_MSG /usr/doc/HOWTO/other-formats/html/RPM-HOWTO.html)

Самое лучшее справочное пособие по ^(H_PROG:rpm) -- книга Ed Bailey "Maximum RPM". Она есть в электронном виде на сайте ^(H_PROG:rpm): ^(QUOTE_URL http://www.rpm.org/) ^(END_PAGE) .+ section_end.inchtml