Устройство бинарных 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)
...

И так далее, единым списком, без разделения на зависимости "жесткие" и "мягкие".


Теги: ,