Aum++

Материал из Mageia Russian Community Wiki
Перейти к: навигация, поиск

aum++ — это инструмент для сборки RPM-пакетов в чистом chroot-окружении.

Сама материя, говорят, произошла из звука, а OM является наиболее священным из всех звуков. Это - слог, который предшествовал вселенной, и из которого были созданы боги. Это - "корневой" слог (mula-мантра), космическая вибрация, скрепляющая атомы мира и небес. Как изначальный звук ОМ произносится в пустоте, так aum++ собирает пакеты в чистом, пустом окружении.

Изначально код aum был написан на perl, но в декабре 2013 года aum был полностью переписан на c++ и получил имя aum++.

Страница проекта: http://code.google.com/p/package-build-service

Использование: aum++ [ОПЦИИ...] SRPM

Содержание

Зачем нужно собирать пакеты в чистом окружении

Сборка в чистом окружении гарантирует, что собираемый пакет будет собираться независимо от установленных в системе пакетов, если вы правильно напишите зависимости для сборки. Кроме того, сборка в chroot обладает дополнительными преимуществами:

  • вы можете собирать пакеты не только для используемой в настоящий момент версии дистрибутива, но и для других версий;
  • если у вас есть образ chroot, вы можете собирать пакеты в практически любом современном дистрибутиве, то есть вы можете собирать пакеты для Mageia, работая при этом в openSUSE, Fedora, Ubuntu и т.д.

О том, как создать образ chroot самостоятельно, см. Как сгенерировать новый chroot. Загрузить готовые образы chroot можно отсюда.

Примечание 1: в aum++, поддерживаются только образы chroot в формате tar.gz, tar.xz, tar.bz2, причем созданные только через genchroot-tarball.

Примечание 2: Обратите внимание, что в 32-битном дистрибутиве можно использовать только 32-битный образ chroot, а в 64-битном дистрибутиве - оба. Другими словами, на 64-битной машине можно собирать пакеты как для 64 бит, так и для 32 бит, но на 32-битной машине - только для 32 бит.

Как использовать aum++

Для начала установить пакет package-build-service.

Прежде чем начать использовать aum++, желательно настроить sudo (или не настраивать sudo, а запускать aum++ под root), чтобы вы могли выполнять команды mount, chroot, для использования которых обычно требуются права администратора (на самом деле вам не придётся ничего запускать вручную, за вас всё сделает aum++).

Настройка sudo

Указанные ниже команды и изменения в файлах выполняются от пользователя root.

  • Убедитесь, что в системе установлен пакет sudo. Если это не так, установите его:
Сonsole.png
[root@mageialinux.ru ~]# urpmi sudo


  • Раскомментируйте строку в /etc/sudoers (NOPASSWD - это беспарольный запуск команд, PASSWD - с запросом пароля пользователя):
%wheel	ALL=(ALL)	PASSWD: ALL
  • Добавьте пользователя в группу wheel:
Сonsole.png
[root@mageialinux.ru ~]# usermod -a -G wheel ваше_имя_пользователя



Можно сделать проще. Установить пакет xsudo-sudoers. Затем из Меню запустить утилиту "Добавление пользователя в /etc/sudoers". После этого будет настроен запуск команд с паролем/без пароля пользователя.

Сборка пакета

Вы настроили sudo и готовы приступить к сборке пакетов.

Сборка с указанным образом chroot

При наличии образа chroot вы можете собирать пакеты и в других системах. Пример сборки пакета с удалённым репозиторием и явным указанием используемого образа chroot (подразумевается, что opendpi-1.3.0-1.mga2.src.rpm лежит в текущем каталоге):

Сonsole.png
[user@mageialinux.ru ~]$ sudo aum++ -v --chroot=путь_к_образу_chroot --distrib=http://mirror.yandex.ru/mageia/distrib/2/i586/ opendpi-1.3.0-1.mga2.src.rpm


Пример сборки пакета с локальным репозиторием и явным указанием используемого образа chroot:

Сonsole.png
[user@mageialinux.ru ~]$ sudo aum++ -v --chroot=путь_к_образу_chroot --distrib=путь_к_репозиторию opendpi-1.3.0-1.mga2.src.rpm


где путь_к_репозиторию может быть вида: --distrib=file:///home/builder/mageia/2/i586

Если необходимо использовать несколько репозиториев, то надо указать каждый из них отдельной опцией --distrib=. Но нужно подключать только минимальный набор репозиториев, чтобы сборка была действительно чистой.

Например:

Сonsole.png
[user@mageialinux.ru ~]$ sudo aum++ -v --distrib=http://mirror.yandex.ru/mageia/distrib/2/i586/ --distrib=http://packages.mageialinux.ru/mageia2/i586/ --chroot=mageia_2_i586.tar.gz FreeBASIC-0.24.0-4.mrc.mga2.src.rpm


В данном случае репозиторий MRC подключается, так как требуется сборочная зависимость, которая отсутствует в официальном репозитории, но есть в репозитории MRC.

Включение дополнительных источников

Иногда при сборке пакета оказывается недостаточно подключенных по умолчанию источников. В этом случае предусмотрена опция --add-media=, которая имеет такой же синтаксис как и --distrib=, но необходимо указать путь до источника, который надо подключить. При использовании опции --add-media= опция --distrib= не нужна, достаточно перечислить все источники через несколько опций --add-media=:

Сonsole.png
[user@mageialinux.ru ~]$ sudo aum++ -v --chroot=mageia_2_i586.tar.xz --add-media=http://mirror.yandex.ru/mageia/distrib/2/i586/media/tainted/release/ --add-media=http://mirror.yandex.ru/mageia/distrib/2/i586/media/core/release/ --add-media=http://mirror.yandex.ru/mageia/distrib/2/i586/media/core/updates/ moc-2.5.0_beta1_svn2526-1.mrc.mga2.src.rpm


В примере показана сборка пакета с подключенными источниками Tainted Release, Core Release, Core Updates.

Явное указание архитектуры

Предусмотрена опция --arch=, позволяющая явно указать архитектуру собираемого пакета. Это нужно если вы хотите в 64 битном образе chroot собрать 32 битный пакет. Например, --arch=i586.

Отключение rpmlint

По умолчанию запускается rpmlint, помогающий выявить ошибки при сборке пакета с точки зрения Mageia policy, он носит чисто информационный характер. Опция --norpmlint позволяет отключить запуск rpmlint, она иногда требуется чтобы быстрее закончить сборку пакета, пропустив проверку готовых RPM и SRC.RPM пакетов.

Справка

Опция --help или -h выведет справку по aum++. Запущенный без параметров aum++ также выведет справку.

Сохранение сборочной директории

Для сохранения сборочной директории при выходе из chroot имеется опция --noclear.

Ограничить во времени сборку

Чтобы сборка не зависла, а была по истечении некоторого промежутка времени прервана, используется опция --timeout=. Необходимо указать время в секундах. Например, --timeout=600.

Подробный режим

Для включения подробного режима отладки используется опция --verbose или -v.

Где находятся собранные пакеты

По умолчанию собранные пакеты копируются в текущий рабочий каталог. Вы можете изменить это поведение, указав с помощью ключа --upload-dir= каталог, в который необходимо сложить собранные пакеты.

Сonsole.png
[user@mageialinux.ru ~]$ sudo aum++ --chroot=путь_к_образу_chroot --upload-dir=каталог_для_собранных_пакетов --distrib=путь_к_репозиторию пакет.src.rpm


С помощью ключа --upload-rpm-dir= можно указать куда загружать готовые RPM пакеты, к примеру в локальный репозиторий /путь/mageia3/RPMS, пакеты сами отсортируются по архитектуре и разложатся в mageia3/RPMS/i586, mageia3/RPMS/noarch, mageia3/RPMS/x86_64.

С помощью ключа --upload-srpm-dir= можно указать куда загружать готовые SRC.RPM пакеты, к примеру в локальный репозиторий /путь/mageia3/SRPMS.

Подключение собственного локального репозитория

Как подключить собственный, родной репозиторий, входящий в пакет aum++, такой же формат репозитория у репозитория Mageia Russian Community. Для этого есть опция --distrib-own=. Но эта опция требуется лишь в случае если такой репозиторий локален. Пример использования смотрите в скрипте mass_rebuild.

Сборка нескольких пакетов

aum++ может обрабатывать сборку произвольного числа пакетов. Во всех выше перечисленных примерах aum++ собирал только один пакет, чтобы aum++ собрал несколько пакетов, просто перечислите их через пробел в конце команды:

Сonsole.png
[user@mageialinux.ru ~]$ sudo aum++ -v --chroot=путь_к_образу_chroot --distrib=путь_к_репозиторию пакет_1.src.rpm пакет_2.src.rpm пакет_3.src.rpm ...

Временная директория

По умолчанию используется директория /tmp, но вы можете изменить ее опцией --tmp-dir=. Если указанного каталога не существует, то он будет создан.

Журнал сборки

По умолчанию журналы не записываются. Вы можете указать файл для сохранения журналов с помощью параметра --log-file=.

Другой rpmmacros

С помощью ключа --add-rpmmacros= можно указать свой собственный rpmmacros (он переопределит rpmmacros, если он был включён в образ chroot).

Коды возврата

Если пакет собран успешно, то aum++ возвращает 0, если неудача, то 1. При сборке сразу нескольких пакетов сборка считается успешной, если все пакеты были собраны успешно.

Повторная сборка

Вы можете повторно использовать временный каталог для сборки. Для этого на первом шаге используйте опцию --tmp-dir= (это задаст точный временной каталог, а не случайный, как по умолчанию) и плюс опцию --noclear, чтобы после сборки временный каталог не был очищен. На втором шаге Вам уже не надо указывать опцию --chroot; источники можно повторно не подключать, если они уже успешно подключились на первом шаге. Вам лишь надо будет указать тот же временный каталог, который использовался на первом шаге, с опциями --tmp-dir= и --noclear, тогда сборка продолжится, а не начнется заново.

Передача параметров для urpmi

Aum++ вызывает urpmi для установки зависимостей собираемого пакета, часто требуется передать особые аргументы для вызываемого urpmi.

С помощью ключа --urpmi-options= вы можете передать пакетному менеджеру urpmi любые аргументы, которые он способен принять. Например, ключ --download-all, который позволит сначала скачать все необходимые пакеты перед попыткой их установки, и лишь затем установить, или ключ --no-clean, который позволит не удалять RPM пакеты из кэша, или ключ --downloader=wget, который определяет, что пакеты будет скачивать wget (смотрите urpmi --help чтобы узнать все возможные опции).

Если опций несколько, то их необходимо указать через запятую или через пробел, например: --urpmi-options="--download-all,--no-clean,--downloader=wget"

Массовая пересборка

Иногда надо пересобрать множество пакетов, что случается при выходе нового дистрибутива - нужно пересобрать целый репозиторий, или собираемые пакеты зависят друг от друга - следующий пакет требует для своей сборки предыдущий пакет.

Статья Создание_зеркала_репозитория поможет Вам получить все src.rpm из репозитория.

В пакет aum++ входит утилита mass_rebuild, которая позволяет автоматизировать эти задачи.

mass_rebuild без параметров покажет справку по использованию утилиты.

При первом старте mass_rebuild создаст образ chroot, добавив в него rpmmacros для Mageia Russian Community, но если Вы хотите пропустить этот шаг, то положите готовый образ chroot в /home/mass_rebuild (если этой директории не существует, то создайте её).

Например, команда:

Сonsole.png
[root@mageialinux.ru ~]# mass_rebuild 3 i586


будет пересобирать пакеты для Mageia 3, архитектуры i586.

Вам надо положить пакеты src.rpm, которые Вы хотите пересобрать, в /home/mass_rebuild/SRPMS (если Вы этого не сделали, то утилита сообщит Вам об этом).

В автоматическом режиме будет создан файл /home/mass_rebuild/list.txt со списком всех пакетов src.rpm из /home/mass_rebuild/SRPMS. Однако, если Вы знаете, что какие-то пакеты надо собрать раньше, чем остальные, то повысьте их приоритет в списке - это ускорит массовую пересборку. Если Вы хотите пользоваться не автоматическим списком, а своим отсортированным, то положите его заранее до первого запуска утилиты.

Готовые пакеты будут автоматически рассортированы в репозитории /home/mass_rebuild/repo.

Все пакеты, которые не удастся пересобрать в автоматическом режиме, будут отражены в файле /home/mass_rebuild/list_old.txt.

При массовой пересборке ведётся лог /home/mass_rebuild/mass_rebuild.log.

Утилита mass_rebuild может быть использована в частном случае и для сборки всего одного пакета, поэтому, если вы только начинаете осваивать сборку rpm пакетов, то обратите на неё внимание, она поможет вам в интерактивном автоматическом режиме собрать пакет из src.rpm.

В случае если что-то пошло не так, и массовую пересборку пришлось прервать, то чтобы её продолжить скопируйте файл /home/mass_rebuild/list_new.txt как /home/mass_rebuild/list.txt и запустите mass_rebuild вновь.

Иногда требуется передать дополнительные параметры для aum++, к примеру подключить источник с обновлениями, в этом случае используется третий параметр у mass_rebuild:

Сonsole.png
[root@mageialinux.ru ~]# mass_rebuild 3 i586 "--add-media=http://mirror.yandex.ru/mageia/distrib/3/i586/media/core/updates/"


- это нужно если, например, возникает следующая ошибка: "The following packages can't be installed because they depend on packages that are older than the installed ones".

Проверка корректности установки готовых RPM пакетов

Если Вы пользовались утилитой mass_rebuild, и если Вы собрали все пакеты, какие хотели, то Вы должны проверить их на корректность установки утилитой mass_rebuild_test. Не верьте фразе "Установка возможна.", а смотрите на ошибки типа: "Не удаётся установить запрошенный пакет:", "Установка не удалась:", "конфликт файла" и т. д.

Использование mass_rebuild_test:

Сonsole.png
[root@mageialinux.ru ~]# mass_rebuild_test 4 i586


- проверка с подключением официальных репозиториев Магеи (в данном случае Магеи 4 для i586) и с подключением локального собственного репозитория /home/mass_rebuild/repo (в данном случае Магеи 4 для i586)

Сonsole.png
[root@mageialinux.ru ~]# mass_rebuild_test 4 i586 mrc


- тоже, что и предыдущее, но дополнительно будет подключен внешний репозиторий Mageia Russian Community

При тестировании ведётся лог /home/mass_rebuild/test_install.log.

Как прервать сборку

Прервать сборку только текущего собираемого пакета - означает либо послать aum++ сигнал прерывания INT, либо убить его:

Отправить сигнал INT или нажать Ctrl+C:

Aum++ int.png

В крайнем случае:

Сonsole.png
[root@mageialinux.ru ~]# killall aum++


Прервать массовую пересборку полностью:

Сonsole.png
[root@mageialinux.ru ~]# killall mass_rebuild aum++


Как сгенерировать новый chroot

Вы можете создать новый образ chroot с помощью утилиты genchroot-tarball (она входит в пакет aum++), которая поддерживает в настоящий момент три различных формата: gz, bz2 и xz. Для указания формата используется опция --format=, для указания дистрибутива используется опция distrib= или опция -d. Для того, чтобы создать образ, выполните следующую команду:

Сonsole.png
[user@mageialinux.ru ~]$ sudo genchroot-tarball --format=gz --distrib=file:///home/builder/mageia/2/i586 basesystem-minimal rpm-build sudo urpmi curl


Этой командой вы создадите образ chroot для Mageia 2 архитектуры i586. Команда завершается списком устанавливаемых пакетов, их всего 4, поскольку остальные пакеты, составляющие chroot, будут доустановлены по зависимостям. Заметьте, что при создании образа использовался локальный репозиторий file:///home/builder/mageia/2/i586. Вместо него вы можете указать удалённый репозиторий:

Сonsole.png
[user@mageialinux.ru ~]$ sudo genchroot-tarball --format=gz --distrib=http://mirror.yandex.ru/mageia/distrib/2/i586/ basesystem-minimal rpm-build sudo urpmi curl


В genchroot-tarball имеется ещё несколько полезных ключей:

  • --name=, -n
с помощью этого ключа вы можете задать имя файла образа chroot.
  • --urpmi-options=
с помощью этого ключа вы можете передать пакетному менеджеру urpmi любые аргументы, которые он способен принять. Например, ключ --download-all, который позволит сначала скачать все необходимые пакеты перед попыткой их установки и лишь затем установить.
  • --help или -h
с помощью этого ключа будет выведена справка, запуск genchroot-tarball без параметров также выведет справку.
  • --verbose или -v
с помощью этого ключа будут выводиться отладочные сообщения.
  • --add-rpmmacros=
с помощью этого ключа можно указать свой собственный rpmmacros, то есть можно залить в chroot-архив rpmmacros, чтобы пакеты, собранные aum++, получили нужные суффиксы.

Содержимое файла rpmmacros может быть такое для Магеи 2:

%distsuffix             .mrc.mga%{mgaver}
%distro_release         %{nil}
%mgaversion             %mgaver

Содержимое файла rpmmacros может быть такое для Магеи 3 (не желательно):

%distsuffix             .mga%{mgaver}.mrc
%distro_release         %{nil}
%mgaversion             %mgaver

Содержимое файла rpmmacros может быть такое для Магеи 3 (желательно):

%distro_section mrc

Пример:

Сonsole.png
[user@mageialinux.ru ~]$ sudo genchroot-tarball --format=gz --distrib=http://mageia.mirror.dkm.cz/pub/mageia/distrib/3/x86_64/ --add-rpmmacros=rpmmacros basesystem-minimal rpm-build sudo urpmi curl


Приведём наиболее полный пример с использованием дополнительных ключей:

Сonsole.png
[user@mageialinux.ru ~]$ sudo genchroot-tarball -v --name=mageia_2_i586 --format=xz --urpmi-options="--download-all,--quiet" --distrib=http://mirror.yandex.ru/mageia/distrib/2/i586/ basesystem-minimal rpm-build sudo urpmi curl


Этой командой мы соберём образ chroot для Mageia 2 архитектуры i586, образ будет называться mageia_2_i586.tar.xz, устанавливаемые пакеты будут сначала загружены за счёт опции --download-all, а вывод urpmi будет минимален, т. к. мы добавили ещё одну опцию --quiet (если опций несколько, то их необходимо указать через запятую).

Сборка для начинающих

В этом разделе полностью расписан процесс сборки пакетов с помощью aum++. Но mass_rebuild может оказаться проще, и, может быть, лучше начать изучение с него - он пошагово напишет вам чего делать дальше, просто запустите mass_rebuild и следуйте дальнейшим его указаниям.

Шаг 1. Установка пакетов

Чтобы приступить к сборке нам понадобится установить пакет: aum++. Команда выполняется с правами администратора (root):

Сonsole.png
[root@mageialinux.ru ~]# urpmi aum++



Также если у нас нет готовых SRPM-пакетов, то нам надо будет их создавать, поэтому нам нужен пакет rpm-build. Команда выполняется с правами администратора (root):

Сonsole.png
[root@mageialinux.ru ~]# urpmi rpm-build


Шаг 2. chroot

Вариант 1. Загрузка chroot из Интернета

Загрузите нужный вам chroot из Интернета. Например:

Сonsole.png
[user@mageialinux.ru ~]$ wget ftp://ftp.mageialinux.ru/chroot/chroot_mageia3_i586.tar.gz


Наименование образов строится следующим образом: имя_версия_архитектура.формат. Для указанного выше примера это означает, что образ является образом Mageia версии 3 архитектуры i586.

Вариант 2. Самостоятельная сборка chroot

Этот вариант годится только для пользователей Mageia. Пользователи других дистрибутивов должны загрузить внешний образ chroot.

Шаг 3. Подготовка SRPM-пакета

Если вы хотите пересобрать уже существующий SRPM-пакет, то этот шаг можно пропустить. Чтобы подготовить SRPM-пакет для сборки в chroot, необходимо написать spec-файл и положить spec, файлы исходного кода и патчи в соответствующие каталоги (по умолчанию spec должен находиться в каталоге ~/rpmbuild/SPECS, а исходный код и патчи в каталоге ~/rpmbuild/SOURCES). Теперь можно приступить к созданию SRPM-пакета:

Сonsole.png
[user@mageialinux.ru ~]$ rpmbuild -bs путь_к_spec_файлу


Если spec-файл был написан без ошибок, тогда вы должны получить SRPM-пакет. Собранный SRPM-пакет будет находиться в каталоге ~/rpmbuild/SRPMS.

Шаг 4. Сборка

Советы

Если часто собирать пакеты, то лучше сделать локальную копию репозитория, т.к. сборка происходит быстрее, поскольку не требуется подключать и скачивать внешние метаданные, а это занимает существенное время. К тому же с локальными репозиториями трафик экономнее.