Часть 4. Chroot. Mock. Pbuilder

Chroot — это операция изменения корневого каталога. Собирая пакеты в рабочей операционной системе, мы можем дойти до такого момента, когда в системе будет много не нужных библиотек, на которые собираемые пакеты будут линковаться. Также может возникнуть желание собрать пакет под другой дистрибутив. В этих случаях целесообразно создать «девственно чистый» образ дистрибутива и собирать пакеты в нем.

Но как создать такой образ? Это делается при помощи утилит mock в Fedora и pbuilder в Debian/Ubuntu. Принцип работы этих утилит следующий. При первом запуске они создают базовый образ операционной системы с минимальным количеством пакетов, необходимых для работы. Это делается либо автоматически (так делает mock) или при помощи определённой команды (pbuilder). Далее образ запаковывается в архив (mock делает это начиная с версии 0.7) и при каждой сборке распаковывается. Далее из репозиториев доставляются необходимые для сборки пакеты и осуществляется сборка. Собранные пакеты складываются в определённый каталог.

В Debian/Ubuntu за сборку пакетов в chroot отвечает pbuilder. В принципе им можно пользоваться не только в Debian/Ubuntu, так как это всего лишь набор bash-скриптов. Я собрал этот пакет в Fedora 7 и положил в свой репозиторий. Теперь под Fedora можно собирать пакеты для всевозможных Debian и Ubuntu (ставить этот пакет следует при помощи YUM, так как он потянет за собой другие пакеты).

Pbuilder кажется более навороченным, с кучей параметров, но качество довольно низкое. Первым делом нам необходимо определится под какой дистрибутив мы хотим собирать пакеты. В файле /etc/pbuilderrc следует указать путь к базовому образу, переменная BASETGZ, а также дистрибутив DISTRIBUTION и репозиторий MIRRORSITE в зависимости от системы Debian или Ubuntu. В принципе все эти параметры можно передать pbuilder'у через командную строку.

После этого следует создать базовый образ командой:

/usr/sbin/pbuilder create

Для создания базового образа для архитектуры i386 под x86_64 эта команда сильно усложняется:

/usr/sbin/pbuilder create --debootstrapopts --arch --debootstrapopts i386

Для пересборки пакета нам необходимо иметь исходные тексты .deb-пакета. В них входит файл с расширением .dsc. Необходимо отдать команду:

/usr/sbin/pbuilder build .dsc-файл

или для архитекты i386 из-под x86_64:

linux32 /usr/sbin/pbuilder build .dsc-файл

В Fedora вместо linux32 следует использовать setarch i386. Собранный пакет будет лежать в каталоге /var/cache/pbuilder/result/. Однако подобная сборка имеет по крайней мере три недостатка: сборка только из-под root, возможна только пересобрка (а что делать если у нас только дерево исходников?) и пакет не будет подписан, что в случае с .deb не так тривиально исправить.

Эта проблема решается при помощи команды pdebuild. Но это опять не сахар. Она не понимает кучи параметров, такие как --basetgz, --distribution, так что вам под каждый дистрибутив и архитектуру придётся исправлять конфигурационный файл, однако его можно создать в домашнем каталоге под именем .pbuilderrc и указать свои каталоги для сборки (в моей сборке на каталог result стоят права 1777, так что собирать можно и в стандартные каталоги). Однако предпочтительнее для каждого дистрибутива создать собственный конфигурационный файл (как в mock) и передавать pdebuild конфиги через параметр --configfile файл.

Эта команда делает тоже, что и стандартная для Debin/Ubuntu — debuild. Для подписи пакета необходимо, чтобы цифровая подпись существовала и вам был известен идентификатор ключа (gpg --list-key в строке pub после "/").

Для сборки пакета необходимо отдать команду:

pdebuild [--configfile файл_конфигурации] --auto-debsign --debsign-k keyid

при этом необходимо находиться в дереве исходников, в котором находится папка debian с правилами для сборки пакета.

После сборки у вас два раза спросят секретную фразу (для подписи двух файлов) и сборка будет завершена.

В Debian/Ubuntu есть пакет mock. Под этими дистрибутивами вы также сможете собирать пакеты под Fedora. А по чему собственно только под Fedora? Под любой rpm-дистрибутив, который поддерживает подключение к репозиториям через YUM. Вам будет необходимо только создать пакеты с зависимостями для генерации базового образа, что скорее всего не станет тривиальной задачей. Впрочем они могут в том или ином виде уже существовать.

Далее - Часть 5. Репозитории
Назад - Часть 3. Накладывание патчей
Указатель