Новелла восемьдесят шестая, рассказывающая о rpm-бинарниках

Бинарный пакет rpm включает в себя два компонента. С одной стороны, это набор скомпилированных файлов, таких, как исполняемые бинарники и библиотеки, сопровождаемых необходимыми конфигами, документацией и т.д., готовый к инкорпорацию в файловую иерархию системы.

С другой стороны, пакет содержит метаинформацию — составленное по определённым правилам описание. Оно включает имя пакета, номер версии и сборки, сведения о разработчике и его мастер-сайте, список файлов, их положение в файловой иерархии, список зависимостей. При необходимости тут могут присутствовать установочные и настроечные сценарии. Всё это вместе позволяет контролировать целостность пакета, отслеживать зависимости, обеспечивать выполнение собственно процедуры инсталляции, а также удалять пакеты “вчистую”.

«Информационные» компоненты rpm-пакетов и их метаинформация собраны в единый архив утилитой cpio —  одим из древнейших средств архивирования в UNIX, подвергнутый компрессии. Ранее, вплоть до релиза 10.3 включительно, сжатие осуществлялось посредством утилиты gzip>. Начиная с релиза 11.0, компрессия осуществляется по алгоритму LZMA (в настоящее время применяется утилита xz). Он обеспечивает много большую степень сжатия — правда, ценой времени, на него затрачиваемого. Что для пользователя, впрочем, неудобств не доставит — потому что распаковка lzma-файлов, как это ни парадоксально, осуществляется практически с той же скоростью, что и gzip.

Теперь обратимся к внутреннему устройству rpm-пакета. Для чего сначала распакуем пакет любым стандартным средством (например, штатным архиватором KDE — программой Ark) и посмотрим на результат. Для пакета rpm-4.9.1.2-18.2.2.x86_64.rpm , который мы уже использовали в качестве примера, он будет выглядеть так:

bin/  etc/ usr/

То есть мы видим те компоненты пакета, которые будут инкорпорированы в файловую иерархию целевой системы.

Знакомство со вторым компонентом проще всего начать, прибегнув к помощи Midnight Commander — в дальнейшем, в Новелле девяносто четвёртой, мы увидим, что вполне можно обойтись и без него. Но пока MC будет неплохим подспорьем.

Так вот, по клавише F3 (по прежнему для примера рассматривается пакет rpm) MC выдаст всю метаинформацию в суммарном виде. Сначала это будет формальное описание пакета, смысл которого интуитивно понятен:

Name        : rpm
Version     : 4.9.1.2
Release     : 18.2.2
Architecture: x86_64
Install Date: (not installed)
Group       : System/Packages
Size        : 4124884
License     : GPL-2.0+
Signature   : RSA/SHA256, Вс. 15 июля 2012 05:28:31, Key ID b88b2fd43dbdc284
Source RPM  : rpm-4.9.1.2-18.2.2.src.rpm
Build Date  : Вс. 15 июля 2012 05:27:33
Build Host  : build15
Relocations : (not relocatable)
Packager    : http://bugs.opensuse.org
Vendor      : openSUSE
Summary     : The RPM Package Manager
Description :
RPM Package Manager is the main tool for managing the software packages
of the SuSE Linux distribution.

RPM can be used to install and remove software packages. With rpm, it
is easy to update packages.  RPM keeps track of all these manipulations
in a central database.  This way it is possible to get an overview of
all installed packages.  RPM also supports database queries.
Distribution: openSUSE 12.2

Далее мы видим секцию сценариев, выолняемых при инсталляции и деинсталляции пакета:

postinstall scriptlet (using /bin/sh):

    PNAME=services
    SUBPNAME=-rpm
    TEMPLATE_DIR=/var/adm/fillup-templates
    SYSC_TEMPLATE=$TEMPLATE_DIR/sysconfig.$PNAME$SUBPNAME
    SD_NAME=""
...

и так далее.

Затем можно видеть список входящих в пакет файлов с полными путями, определяющими их положение в файловой иерархии.

-rwxr-xr-x    1 root    root                    15224 июля 15 05:27 /bin/rpm
-rwxr-xr-x    1 root    root                     2528 июля 15 05:27 /etc/init.d/rpmconfigcheck
drwxr-xr-x    2 root    root                        0 июля 15 05:27 /etc/rpm
-rwxr-xr-x    1 root    root                    14928 июля 15 05:27 /usr/bin/convertdb1
-rwxr-xr-x    1 root    root                      586 июля 15 05:26 /usr/bin/gendiff
-rwxr-xr-x    1 root    root                    10592 июля 15 05:27 /usr/bin/rpm2cpio
-rwxr-xr-x    1 root    root                    11112 июля 15 05:27 /usr/bin/rpmdb
...

Остальную метаинформацию можно просмотреть в том же Midnight Commander, зафиксировав курсор на имени файла пакета и нажав Enter, что даст нам список входящих в пакет “метаинформационных” файлов:

/INFO
CONTENTS.cpio
HEADER
*INSTALL
*UPGRADE

О содержимом файлов легко догадаться. Так, CONTENTS.cpio — полный список всех файлов и путей к ним, файл HEADER содержит то самое описание, которое мы только что видели через F3, *INSTALL и *UPGRADE — исполняемые скрипты очевидного назначения. А в каталоге /INFO лежит множество мелких файликов, из которых в итоге собирается суммарная метаинформация. Подробнее на эту тему мы поговорим в новеллах об устройстве rpm-пакетов с исходниками и о зависимостях.

Архитектурно-независимые rpm-пакеты устроены точно так же, поэтому останавливаться на них не будем.


Назад | К содержанию | Вперёд