Устройство бинарных rpm-пакетов
Пакет rpm включает в себя два компонента. С одной стороны, это набор скомпилированных файлов, таких, как исполняемые бинарники и библиотеки, сопровождаемых необходимыми конфигами, документацией и т.д.), готовый к инкорпорацию в файловую иерархию системы.
С другой стороны, пакет содержит метаинформацию -- составленное по определённым правилам описание. Оно включает имя пакета, номер версии и сборки, сведения о разработчике и его мастер-сайте, список файлов, их положение в файловой иерархии, список зависимостей. При необходимости тут могут присутствовать установочные и настроечные сценарии. Всё это вместе позволяет контролировать целостность пакета, отслеживать зависимости, обеспечивать выполнение собственно процедуры инсталляции, и так далее.
Компоненты rpm-пакета запаковывается в архив cpio -- одно из древнейших средств архивирования в UNIX (информацию об этой утилите можно найти здесь), подвергнутый компрессии. Ранее, вплоть до Fedora версии 11 включительно, это делалось посредством утилиты gzip (о ней см. здесь). Начиная с 12-й версии Fedora rpm-пакты сжимаются по алгоритму LZMA, обеспечивающему много большую степень компрессии — правда, ценой времени, на неё затрачиваемого (кое-что на эту тему можно найти здесь). Что для пользователя, впрочем, неудобств не доставит — потому что распаковка lzma-файлов, как это ни парадоксально, осуществляется практически с той же скоростью, что и gzip. А вот скачивание их, разумеется, происходит много быстрее, что не может не радовать обладателей "толстых" и дешёвых каналов: при этих условиях установка пакетов по Сети происходит быстрее, нежели с локальных носителей.
Вернёмся, однако, к тому, что у rpm-пакета "внутре". Для чего сначала распакуем пакет любым стандартным средством (rpm2cpio, например, или с помощью утилиты rpm2tgz) и посмотрим, что получилось:
$ ls rpm-4.7.1-6/ bin/ etc/ usr/ var/
То есть мы видим те компоненты пакета, которые будут инкорпорировано с файловую иерархию целевой системы.
Знакомство со вторым компонентом проще всего сделать с помощью Midnight Commander. По клавише F3 (по прежнему для примера рассматривается пакет rpm) он выдаст всю синтетическую метаинформацию в таком виде
Name : rpm Relocations: (not relocatable) Version : 4.7.1 Vendor: Fedora Project Release : 6.fc12 Build Date: Пнд 21 Сен 2009 17:30:35 Install Date: (not installed) Build Host: x86-3.fedora.phx.redhat. com Group : System Environment/Base Source RPM: rpm-4.7.1-6.fc12.src.rpm Size : 2027173 License: GPLv2+ Signature : RSA/8, Втр 29 Сен 2009 19:37:43, Key ID 9d1cc34857bbccba Packager : Fedora Project URL : http://www.rpm.org/ Summary : The RPM package management system Description : RPM Package Manager (RPM) - это мощная, управляемая из командной строки система установки пакетов, способная устанавливать, удалять, проверять содержимое пакетов и обновлять пакеты программ. Каждый программный пакет содержит архив файлов одновременно с информацией о версии пакета, его описанием и т.д. posttrans scriptlet (using /bin/sh): # XXX this is klunky and ugly, rpm itself should handle this dbstat=/usr/lib/rpm/rpmdb_stat if [ -x "$dbstat" ]; then if "$dbstat" -e -h /var/lib/rpm 2>&1 | grep -q "doesn't match environment ve rsion | Invalid argument"; then rm -f /var/lib/rpm/__db.* fi fi exit 0
и так далее.
Всё это хозяйство можно просмотреть и по частям -- нажав Enter на файле
rpm-4.7.1-6.fc12.x86_64.rpm
мы увидим список входящих в него "метаинформационных" файлов:
/.. │-ВВЕРХ-│Дек 16 12:04 /INFO │ 0│Сен 21 00:00│ CONTENTS.cpio │ 0│Сен 21 00:00 HEADER │ 1185│Сен 21 00:00 *INSTALL │ 39│Сен 21 00:00 *UPGRADE │ 39│Сен 21 00:00
О содержимом файлов легко догадаться. Так, CONTENTS.cpio -- полный список всех файлов и путей к ним:
-rwxr-xr-x 1 root root 20808 Sep 21 17:30 ./bin/rpm drwxr-xr-x 2 root root 0 Sep 21 17:30 ./etc/rpm ...
и так далее. Файл HEADER содержит то самое описание, которое мы только что видели через F3, *INSTALL и *UPGRADE -- исполняемые скрипты соответствующего назначения. А в каталоге /INFO лежит множество мелких файликов, из которых в итоге собирается синтетическая метаинформация. Из них остановлюсь только на REQUIRENAME -- это пресловутый перечень зависимостей, который для пакета rpm выглядит примерно так:
/bin/bash /bin/sh /bin/sh config(rpm) = 4.7.1-6.fc12 coreutils curl db4-utils = 4.7.25 libacl.so.1()(64bit) libbz2.so.1()(64bit) ...
И так далее, единым списком, без разделения на зависимости "жесткие" и "мягкие".
Теги: fedora, rpm