Aum++
aum++ — это инструмент для сборки RPM-пакетов в чистом chroot-окружении.
Сама материя, говорят, произошла из звука, а OM является наиболее священным из всех звуков. Это - слог, который предшествовал вселенной, и из которого были созданы боги. Это - "корневой" слог (mula-мантра), космическая вибрация, скрепляющая атомы мира и небес. Как изначальный звук ОМ произносится в пустоте, так aum++ собирает пакеты в чистом, пустом окружении. |
Изначально код aum был написан на perl, но в декабре 2013 года aum был полностью переписан на c++ и получил имя aum++.
Страница проекта: https://sourceforge.net/projects/package-build-service
Использование: aum++ [ОПЦИИ...] SRPM
Содержание
- 1 Зачем нужно собирать пакеты в чистом окружении
- 2 Как использовать aum++
- 2.1 Настройка sudo
- 2.2 Сборка пакета
- 2.2.1 Сборка с указанным образом chroot
- 2.2.2 Включение дополнительных источников
- 2.2.3 Явное указание архитектуры
- 2.2.4 Отключение rpmlint
- 2.2.5 Справка
- 2.2.6 Сохранение сборочной директории
- 2.2.7 Ограничить во времени сборку
- 2.2.8 Подробный режим
- 2.2.9 Где находятся собранные пакеты
- 2.2.10 Подключение собственного локального репозитория
- 2.2.11 Сборка нескольких пакетов
- 2.2.12 Временная директория
- 2.2.13 Журнал сборки
- 2.2.14 Другой rpmmacros
- 2.2.15 Коды возврата
- 2.2.16 Повторная сборка
- 2.2.17 Передача параметров для urpmi
- 2.2.18 Массовая пересборка
- 2.2.19 Проверка корректности установки готовых RPM пакетов
- 2.2.20 Как прервать сборку
- 3 Как сгенерировать новый chroot
- 4 Сборка для начинающих
- 5 Советы
Зачем нужно собирать пакеты в чистом окружении
Сборка в чистом окружении гарантирует, что собираемый пакет будет собираться независимо от установленных в системе пакетов, если вы правильно напишите зависимости для сборки. Кроме того, сборка в 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. Если это не так, установите его:
- Раскомментируйте строку в /etc/sudoers (NOPASSWD - это беспарольный запуск команд, PASSWD - с запросом пароля пользователя):
%wheel ALL=(ALL) PASSWD: ALL
- Добавьте пользователя в группу wheel:
Можно сделать проще. Установить пакет xsudo-sudoers. Затем из Меню запустить утилиту "Добавление пользователя в /etc/sudoers". После этого будет настроен запуск команд с паролем/без пароля пользователя.
Сборка пакета
Вы настроили sudo и готовы приступить к сборке пакетов.
Сборка с указанным образом chroot
При наличии образа chroot вы можете собирать пакеты и в других системах. Пример сборки пакета с удалённым репозиторием и явным указанием используемого образа chroot (подразумевается, что opendpi-1.3.0-1.mga2.src.rpm лежит в текущем каталоге):
Пример сборки пакета с локальным репозиторием и явным указанием используемого образа chroot:
где путь_к_репозиторию может быть вида: --distrib=file:///home/builder/mageia/2/i586
Если необходимо использовать несколько репозиториев, то надо указать каждый из них отдельной опцией --distrib=. Но нужно подключать только минимальный набор репозиториев, чтобы сборка была действительно чистой.
Например:
В данном случае репозиторий MRC подключается, так как требуется сборочная зависимость, которая отсутствует в официальном репозитории, но есть в репозитории MRC.
Включение дополнительных источников
Иногда при сборке пакета оказывается недостаточно подключенных по умолчанию источников. В этом случае предусмотрена опция --add-media=, которая имеет такой же синтаксис как и --distrib=, но необходимо указать путь до источника, который надо подключить. При использовании опции --add-media= опция --distrib= не нужна, достаточно перечислить все источники через несколько опций --add-media=:
В примере показана сборка пакета с подключенными источниками 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= каталог, в который необходимо сложить собранные пакеты.
С помощью ключа --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++ собрал несколько пакетов, просто перечислите их через пробел в конце команды:
Временная директория
По умолчанию используется директория ~/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 (если этой директории не существует, то создайте её).
Например, команда:
будет пересобирать пакеты для 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:
- это нужно если, например, возникает следующая ошибка: "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:
- проверка с подключением официальных репозиториев Магеи (в данном случае Магеи 4 для i586) и с подключением локального собственного репозитория /home/mass_rebuild/repo (в данном случае Магеи 4 для i586)
- тоже, что и предыдущее, но дополнительно будет подключен внешний репозиторий Mageia Russian Community
При тестировании ведётся лог /home/mass_rebuild/test_install.log.
Как прервать сборку
Прервать сборку только текущего собираемого пакета - означает либо послать aum++ сигнал прерывания INT, либо убить его:
Отправить сигнал INT или нажать Ctrl+C:
В крайнем случае:
Прервать массовую пересборку полностью:
Как сгенерировать новый chroot
Вы можете создать новый образ chroot с помощью утилиты genchroot-tarball (она входит в пакет aum++), которая поддерживает в настоящий момент три различных формата: gz, bz2 и xz. Для указания формата используется опция --format=, для указания дистрибутива используется опция distrib= или опция -d. Для того, чтобы создать образ, выполните следующую команду:
Этой командой вы создадите образ chroot для Mageia 2 архитектуры i586. Команда завершается списком устанавливаемых пакетов, их всего 4, поскольку остальные пакеты, составляющие chroot, будут доустановлены по зависимостям. Заметьте, что при создании образа использовался локальный репозиторий file:///home/builder/mageia/2/i586. Вместо него вы можете указать удалённый репозиторий:
В 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
Пример:
Приведём наиболее полный пример с использованием дополнительных ключей:
Этой командой мы соберём образ chroot для Mageia 2 архитектуры i586, образ будет называться mageia_2_i586.tar.xz, устанавливаемые пакеты будут сначала загружены за счёт опции --download-all, а вывод urpmi будет минимален, т. к. мы добавили ещё одну опцию --quiet (если опций несколько, то их необходимо указать через запятую).
Сборка для начинающих
В этом разделе полностью расписан процесс сборки пакетов с помощью aum++. Но mass_rebuild может оказаться проще, и, может быть, лучше начать изучение с него - он пошагово напишет вам чего делать дальше, просто запустите mass_rebuild и следуйте дальнейшим его указаниям.
Шаг 1. Установка пакетов
Чтобы приступить к сборке нам понадобится установить пакет: aum++. Команда выполняется с правами администратора (root):
Также если у нас нет готовых SRPM-пакетов, то нам надо будет их создавать, поэтому нам нужен пакет rpm-build. Команда выполняется с правами администратора (root):
Шаг 2. chroot
Вариант 1. Загрузка chroot из Интернета
Загрузите нужный вам chroot из Интернета.
Наименование образов строится следующим образом: имя_версия_архитектура.формат. Для указанного выше примера это означает, что образ является образом Mageia версии 3 архитектуры i586.
Вариант 2. Самостоятельная сборка chroot
Этот вариант годится только для пользователей Mageia. Пользователи других дистрибутивов должны загрузить внешний образ chroot.
Шаг 3. Подготовка SRPM-пакета
Если вы хотите пересобрать уже существующий SRPM-пакет, то этот шаг можно пропустить. Чтобы подготовить SRPM-пакет для сборки в chroot, необходимо написать spec-файл и положить spec, файлы исходного кода и патчи в соответствующие каталоги (по умолчанию spec должен находиться в каталоге ~/rpmbuild/SPECS, а исходный код и патчи в каталоге ~/rpmbuild/SOURCES). Теперь можно приступить к созданию SRPM-пакета:
Если spec-файл был написан без ошибок, тогда вы должны получить SRPM-пакет. Собранный SRPM-пакет будет находиться в каталоге ~/rpmbuild/SRPMS.
Шаг 4. Сборка
Советы
Если часто собирать пакеты, то лучше сделать локальную копию репозитория, т.к. сборка происходит быстрее, поскольку не требуется подключать и скачивать внешние метаданные, а это занимает существенное время. К тому же с локальными репозиториями трафик экономнее.