Использование RPM: Основы (Часть I).
Автор : © Jose Nazario
Перевод : © И. Песин.
Этот документ разработан, как краткое введение в систему управления пакетами Red Hat, или RPM. Часть 1 содержит информацию об установке пакетов, вторая же освещает вопрос построения своих пакетов. Мы разберемся в том, что такое RPM, почему вы можете захотеть его использовать, сравним с другими системами управления пакетами ОС Linux, UNIX. В основном мы будем говорить об установке, проверке и удалении пакетов. На описании API RPM останавливаться не будем.
Что такое RPM?
Система управления пакетами Red Hat (RPM) - это набор утилит, предназначенных для построения и управления пакетами ПО для UNIX-систем. Распространяемая с Linux от фирмы Red Hat и ее клонами, RPM так же работает на любых UNIX-системах, так как является ПО с открытым исходным кодом. В тоже время, поиск RPM пакетов для других UNIX-систем, таких как Solaris или IRIX, может оказаться весьма трудной задачей.
Управление пакетами очень просто в теории, однако на практике оно может получиться очень мудреным. Кратко: управление пакетами ПО - это их установка, управление и удаление в упрощенном режиме. RPM возник в результате потребности эффективного выполнения перечисленных функций, а другого приличного решения не существовало.
RPM использует собственный формат файла, в отличии от некоторых других систем. Это может быть несколько неудобно, если нужно извлечь компоненту из пакета, а утилиты RPM нет под рукой. К счастью имеются утилиты, типа Alien, которые конвертируют формат RPM. С помощью таких утилит можно получить формат, которым вы можете уже управлять, скажем, tar или ar.
Формат названия RPM-пакета стандартизирован и выглядит следующим образом:
(имя)-(версия)-(сборка).(платформа).rpm.
Например, имя cat-2.4-7.i386.rpm означает пакет RPM для утилиты "cat" версии 2.4, сборка 7 для архитектуры x86. Если имя платформы заменено на "src", это означает RPM исходных текстов.
Зачем это нужно?
На первый взгляд, вы можете сказать себе: "Я разберусь сам. Не так уж и много здесь компонент ...". И действительно, для чего-нибудь такого маленького, как, скажем, "cat", у которого один исполняемый файл и одна страничка руководства, это действительно так. Но посмотрим, допустим, на KDE, который состоит из несметного количества элементов, зависимостей и любит всюду их запихивать. Уследить за всем этим будет тяжело, если не невозможно.
Управление пакетами облегчает это. Дав возможность программе поддерживать информацию о программах, их конфигурационных файлах и всем остальном, потом вы сможете легко узнать, какие программы установлены, удалить или обновить их.
Инсталляция становится секундным делом. Вы выбираете, что вам нужно и просите систему сделать всю грязную работу за вас: разархивировать программу, проверить, хватает ли места на диске, установить файлы в правильные каталоги и настроить для вас. Это классно, вроде того, как лакей заботится о вашей машине, в то время как вы сидите в ресторане. Зависимости и дополнительные требования для ПО тоже проверяются хорошим менеджером пакетов.
Управление установленным ПО также сильно облегчается. Существует список всего установленного ПО, что полезно, когда вы хотите посмотреть, установлено ли что-то. Более важно, что задача обновления становится пустячным делом. И, наконец, упрощается проверка ПО. Кроме того, зная какие пакеты установлены и их настройки, можно быстрее обнаружить проблему, если таковая появится.
Сравнение RPM с другими системами.
Имел я (не)счастье работать со множеством вариантов UNIX и приобрел некоторый опыт в обращении с соответствующими системами управления пакетами. Когда мне приходилось использовать не-RPM системы управления, я обнаружил, что в сравнении с другими форматами, RPM, обычно выглядит значительно лучше. Вот короткий обзор достоинств и недостатков других утилит и форматов:
Формат |
Платформа |
Достоинства |
Недостатки |
inst |
IRIX(SGI) |
великолепный графический интерфейс |
поражающе медленный, охочий к перезагрузкам, нет сетевых установок (кроме как с NFS) |
sw |
HPUX(HP) |
(есть ли?), поддерживает сетевую установку |
ужасно медленный |
pkg |
BSD(many) |
архивы в формате tar, сетевая установка |
отсутствие сигнатур, сумм (контрольных - Прим.пер)
|
? |
Solaris(SUN) |
(есть ли?) |
медленный, отсутствие сигнатур, сумм |
.deb |
Debian |
Просто архив в формате ar, прост для работы без утилиты |
отсутствие сигнатур |
Короче, мое наибольшее недовольство касательно RPM вызывает отсутствие мощного единого графического интерфейса. Хотя несколько существует (например, gnorpm и glint), им недостаёт множества функций, которые есть у Менеджера ПО SGI. Однако, в общем, я обнаружил, что RPM лучше обрабатывает конфликтные ситуации чем inst, и гораздо, гораздо быстрее. И я решил, что без графического интерфейса можно обойтись.
Наибольшее восхищение в RPM вызывает скорость и контроль пакета, при помощи, как сигнатур, так и контрольных сумм компонентов. Могу привести следующий пример: однажды мне нужно было перезагрузить SGI лишь потому, что я переустановил текстовый редактор (известный как jot). Кроме того, это заняло до перезагрузки еще около 15 минут для переустановки этого маленького пакета.
RPM в мелочах
Так же, как и архивы типа "tar", RPM использует метод конкатенации файлов в один архив. Кроме того, вставляется дополнительная информация в заголовок. Это включает в себя как скрипты по пред- и послеустановочной подготовке системы для нового пакета, так и информацию для базы которую поддерживает RPM. Зависимости проверяются до инсталляции, и, если указан необходимый флаг, так же запоминаются в базе данных RPM.
Это и есть та база данных, которая позволяет RPM творить чудеса. Там сохраняются все свойства установленных пакетов. И в случае их повреждения, они могут быть восстановлены при помощи утилиты rpm.
Использование RPM
Теперь мы остановимся на трех основных действиях RPM, которые мы здесь будем обсуждать. Они включает в себя установку, управление и удаление пакетов. Начнем с того, как добавлять пакет с помощью RPM.
Инсталляция
Фундаментальная функция RPM - и наиболее популярная - установка новых программ. Для того, что бы это сделать, необходимо указать флаг -i и необходимый RPM:
rpm -i (имя_пакета)
Эта команда повлечет установку пакета, и если все пройдет хорошо вернет вас в командную строку без лишних комментариев. Немного скучнно, и еще хуже, если вам хотелось бы узнать, что пошло не так. Для того, чтобы сделать программу более разговорчивой, укажите флаг -v:
rpm -iv (имя_пакета)
Все, что это даст - будет распечатано имя пакета. Пойдем теперь дальше: попросим программу вывести еще и индикатор прогресса, указав для этого флаг -h. Народу нравится использовать все эти ключи вместе, вроде -ivh, что бы получить "милый" вывод:
rpm -ivh (имя_пакета)
И опять таки, это не даст возможности наблюдать за тем, что и как происходит. Только скажет, что, возможно, все прошло успешно. Потому, я обычно, прошу RPM быть предельно болтливой ключом -vv (обратите внимание, что ключ состоит из трех символов: "-","v","v", а не "-","w" - Прим.пер):
rpm -ivv (имя_пакета)
И теперь можно четко видеть, что происходит, и были ли какие-либо проблемы. Кроме того, я вижу куда что устанавливается (это, конечно, не так важно, потому как эту информацию можно получить при помощи ключа -l. - Прим.пер).
Зависимости очень хорошо обрабатываются программой RPM, но в первую очередь, они зависят от человека, который собирал пакет. Я видел пакеты, которые зависели сами от себя (т.е. чтобы установить некоторый пакет fake.rpm, требуется, что бы в системе был установлен пакет fake.rpm. - Прим.пер), или же два пакета, которые зависели друг от друга (хорошим примером будут ghostscript и ghostscript-fonts, которые зависят друг от друга. - Прим.пер). Так что имейте это в виду.
Иногда RPM может ныть по поводу зависимости, которая установлена, но не зарегестрирована. Возможно, вы установили ее не из пакета RPM (Пример: OpenSSL). Для того, что бы обойти эту трудность, скажите RPM игнорировать зависимости:
rpm -ivv --nodeps (имя_пакета)
Помните, что это не всегда мудро, и вы должны применять это только тогда, когда точно знаете, что делаете. Вряд ли это повредит установленное ПО, скорее это означает, что данный пакет не будет работать нормально.
В некоторых случаях RPM будет сообщать, что у вас установлено ПО, которого на самом деле нет. Хотя это обычно и означает, что что-то не так, это тоже можно объехать следующим образом:
rpm -ivv --force (имя_пакета)
Будьте осторожны. Как и в случае игнорирования зависимостей, принудительная установка может быть необдуманным шагом. Помните, что ваша машина может загореться ярким пламенем или просто перестать работать. Да будет осмотрителен пользователь и все такое.
Следующая особенность RPM, наверное, выиграла бы приз за самый оригинальный сервис: сетевая установка. Может статься, что у вас нет сетевого клиента, а он вам нужен. В RPM встроен FTP- и web-клиентское ПО так, что можно использовать следующие команды:
rpm -iv ftp://ftp.redhat.com/path/package.rpm
rpm -iv http://www.me.com/path/package.rpm
Но, как я понимаю, SSL соединения он не поддерживает (это действительно так, но, зато, rpm поддерживает доступ через прокси сервера. - Прим.пер). Менеджеры пакетов Debian это умеют, как и менеджеры BSD. Тем не менее, как мне кажется, большинство коммерческих утилит этого не умеют.
Управление пакетами
Хорошо, вы умеете устанавливать пакеты. Но, допустим, вам нужно работать с пакетом, вне зависимости от того, установлен он или нет. Как это сделать? Достаточно просто - при помощи утилиты rpm можно работать как с установленными пакетами, так и с не установленными. Это включает в себя и проверки пакетов.
Когда у вас появляется новый пакет, вы можете захотеть посмотреть, что в нем находится. С помощью режима запросов, вы можете заглянуть внутрь пакета. Для получения основной информации, укажите:
rpm -qp (имя_пакета)
Команда просто выведет имя пакета. Скучно, правда? Давайте, спросим еще что-нибудь. Укажите:
rpm -qip (имя_пакета)
Теперь мы увидим автора, хост и дату сборки, установлен ли пакет и тому подобная информация о пакете. Кроме того, включается общая информация о назачении пакета и его возможности.
Все это просто замечательно, но давайте посмотрим, что действительно находится в пакете, то есть какие там есть файлы? Так вот, можно посмотреть содержание пакета, так же как и содержание архива tar (т.е. tar -tvf):
rpm -qlp (имя_пакета)
Команда выведет список файлов, находящихся в архиве с указанием пути. Я использую это для того, что бы посмотреть, что будет установлено с пакетом и, самое главное, куда. Я люблю, когда придерживаются обычных соглашений при размещении файлов, а некоторые паковщики этого не делают. Наконец, для того чтобы вывести все установленные на вашей системе пакеты, введите:
rpm -qa
В ответ вы получите полный список установленных пакетов. Может быть полезным этот список отсортировать (пропустив вывод через sort: rpm -qa | sort). Используйте эти имена при удалении пакетов (см. ниже).
Одна из моих любимейших функций RPM - это проверка пакетов. Это полезно для обнаружения ошибок, отсутствия файлов и т.п. Для того, что бы проверить пакет, просто укажите rpm и флаг -V:
rpm -V (имя_пакета)
Результатом будет короткое описание состояния пакета. Для того, что бы проверить все пакеты в системе, укажите просто:
rpm -Va
Режим проверки выдает некоторую статистику относительно файлов. Вот расшифровка сокращений:
5 |
контрольная сумма MD5 |
S |
размер файла |
L |
Символическая ссылка |
T |
время модификации |
D |
устройство |
U |
пользователь |
G |
группа |
M |
режим (включает в себя привилегии и тип файла) |
В некоторых случаях они не несут смысловой нагрузки. Так, например, если вы изменили файл /etc/inetd.conf, проверка покажет, что изменились размер и сумма MD5. Однако некоторые файлы изменяться не должны, например /bin/login. Следовательно, rpm -Va может использоваться как быстрая проверка защиты, указывающая, куда обратить свое внимание.
Одна из сильных сторон систем управления пакетами, как мы уже указывали, это простота обновления. RPM имеет два метода обновления. Первый:
rpm -U (имя пакета)
Его отличие от второго заключается в поведении утилиты, если обновляемый пакет не установлен. Вышеприведенная команда в указанном случае установит пакет. Такой вариант не всегда подходит, потому есть другой вариант обновления, при котором пакет не устанавливается, если отсутствует обновляемый.
rpm -F (имя пакета)
Это команда обновит пакет, только если он уже был установлен.
Обновление проводится интересным методом. Вначале устанавливается новая версия, а все различия фиксируются. После чего различия старой версии удаляются, т.е. все происходит так чтобы не копировать и не удалять ничего лишнего. Представьте, что было бы, если бы netscape полностью удалялся, а потом полностью ставился!
Удаление пакетов
Вы можете устанавливать, обновлять и управлять пакетами программ. Логическим следствием отсюда является то, что вы можете и удалять пакеты при помощи утилиты RPM. Для этого применяется флаг -e, и многие из дополнительных флагов, использовавшихся и при установке. Следующая команда молча удалит пакет:
rpm -e (имя пакета)
Заметим, что в отличии от установки и обновления, "имя пакета" - это не "пакет-версия.i386.rpm", а только "пакет-версия". Это значения можно получить в режиме запросов. Вообще говоря, вы можете задать лишь уникальную часть имени для удаления. Так, для удаления и linuxconf и linuxconf-devel, достаточно указать linuxconf. Зависимости тоже можно не учитывать:
rpm -e --nodeps (имя пакета)
Обращаю ваше внимание, что такие действия могут повредить некоторые программные средства. Можно также, добавлять флаг информативности, как и при инсталляции.
Размышления о RPM
Иногда пакеты включают в себя глупые зависимости. Так, libsafe, зависит сам от себя. Потому, приходится использовать опцию --nodeps для обычной установки. Другой вариант, это когда пакет содержит ссылку на другой пакет, и в результате вы устанавливаете больше, чем планировали.
Вот что мне еще не нравится в RPM, так это когда имя пакета не отражает его функций. Хотя можно получить информацию с помощью запроса, для меня это слишком долго. Советую называть RPM информативно.
Получение RPM
RPM можно получить для любого линукса или UNIX, так как он является ПО с открытым исходным текстом. RPM поставляется вместе с Red Hat Linux и некоторыми его клонами. Для совместимости, рекомендую версии 3.0 и выше. В них исправлены некоторые ошибки, присутствовавшие ранее. Версия 4.0 содержит уже другой формат базы данных, так что я рекомендую быть внимательным.
RPM обычно распространяется в виде RPM-пакета. Оригинально, да? К счастью, так же он распространяется в виде гзипованого тара. У меня стоит RPM, на пример, на Slackware, и я могу, если надо, установить его на IRIX или Solaris. Вообще говоря, это почти бесполезно на не-Linux системах, так как для других UNIX-систем, программы редко пакуются в формате RPM.
Продолжение следует
В следующей второй части мы будем говорить о построении своих собственных пакетов RPM. Рассмотрим файлы типа "spec", расположение в каталоге /usr/src и флаги построения. Это очень просто, после того, как вы изучили основы RPM.
Ресурсы
Лучшее место, для того чтоб начать изучение RPM - это http://www.rpm.org/. Там вы найдете книгу 'Maximum RPM', которая описывает использование, создание и даже программирование интерфейса, RPM. Страничка помощи RPM (rpm -h), также очень информативна и по ней можно изучать основы RPM. Для поиска архивов RPM, обратитесь к http://www.rpmfind.net/, которая содержит огромную базу данных по пакетам программ. Очень полезно.
Jose Nazario
Жозе (Jose) является докторантом на факультете биохимии университета Case Western Reserve в Кливлэнде, штат Огайо. Пользуется UNIX около 10 лет, а Линуксом, начиная с ядер версии 1.2.
Коммуникация : корпоративный тренинги, 3110 - Тренинг продаж