Pull to refresh

RPM-репозиторий своими руками

Reading time4 min
Views14K

О чем речь


Доброго времени суток, %username%.

Сегодня я хотел бы рассказать как легко и ненавязчиво создать свой rpm-репозиторий, а так же заполнить его оптимизированными под ваш любимый дистрибутив пакетами. И так, для этого нам надо: дистрибутив любимый одна штука(в моём случае это VZшка с Centos 5.5), rpm-build, mock, createrepo. Все пакеты можно обнаружить в стандартных репозиториях centos.

Build-root и компания

Для примера будем собирать haproxy. Инструкции в интернете не рекомендуют собирать пакеты под root, не будем им сопротивляться и создадим пользователя build. Заходим под свежесозданым пользователем и в домашней директории создаем ряд каталогов и файлов которые нам в дальнейшем будут нужны:

mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros


Немного пояснений. В SOURCES мы будем качать исходники тех пакетов которые хотим собрать, а так же все патчи и конфиги к этим исходникам. В BUILD система будет разархивировать ваш пакет, применять к нему патчи и компилировать всё это дело, в нашем случае использоваться не будет об этом далее. RPMS — тут будут лежать разбитые по архитектуре(noarch, x86_64, x86) собранные пакеты, так же не используется. SRPMS — сюда rpmbuild положит .srpm пакет с которым мы и будем в дальнейшем работать. SPECS — здесь будет самая интересная часть. Дело в том, что для сборки rpm из исходников нам понадобится .spec файл в котором описано что мы собираем, с какими параметрами configure, changelog нашей rpm'ки и прочие вещи, это я попытаюсь описать ниже.

SPEC и с чем его едят*

Сразу предупреждаю: самому составлять .spec файлы — смерти подобно, посему я обычно их ищу в интернете либо они прилагаются к исходникам пакета. Но основные моменты всё же рассмотреть стоит. Для наглядности можно подсматривать сюда.

В «шапке» у нас имеется название, версия, тип лицензии, и еще пара строк. В основном вам может понадобится сменить номер релиза и возможно добавить патчи(Path1, Path2). Так же иногда приходилось шаманить с BuildRequires и Requires. Первое это зависимости для сборки, второе — зависимости самого пакета для корректной роботы. Мелкий hint — в Source0 может стоять как имя пакета который находится у вас в SOURCES, так и путь к файлу где-то в интернете.

Далее идёт расширенное описание пакета, подготовка к сборке, возможно наложение патчей и непосредственно сборка. В секции %build можно указать параметры для gcc — CFLAGS, CPPFLAGS итд. Для нас особо интересной может быть секция %configure которой к сожалению нет в примере. Именно в этой части и задаются параметры для configure специфичные для пакета который вы собираете. Другие секции я описывать не буду, что они выполняют можно понять по названию. Единственное что хочу заметить — в секции %files надо будет перечислить что конкретно из build-root должно быть собрано в вашей rpm'ке. Иногда это может быть очень длинный список. Есть возможность проигнорировать некоторые файлы, но к сожалению я еще не разобрался с этим.

Собираем srpm

С этим всё просто, после того как вы составили/нашли в интернете/пакете .spec-файл и положили его в SPECS запускаем rpmbuild:
rpmbuil -bs haproxy.spec

Это создаст в каталоге SRPMS соответствующую rpm'ку из которой в дальнейшем мы и сделаем пакет для своего дистра.

Используй mock, юный падаван

Собственно для чего нам нужен пакет mock — с его помощью мы соберем полученный .srpm и «прикрутим» к нему все необходимые зависимости для установки в вашем дистрибутиве. Он умеет собирать под все версии fedora(i386,x86_64,ppc), redhat 8/9, centos начиная с 3й версии.

Для того, что бы собрать пакет под centos5 x86_64 нам надо в каталоге /etc/mock сделать ссылку default.cfg -> /etc/mock/centos-5-x86_64.cfg. В этом файле указывается список стандартных для centos репозиториев. Вы без проблем можете добавить туда дополнительные репозитории, тогда mock будет считать что пакеты из него всегда имеются в вашем дистре и их можно использовать для удовлетворения зависимостей.

Так же полезным может оказаться defaults.cfg. Mock создаёт chroot в котором находится минимальная система со всем необходимым для сборки — gcc, make, autoconf итд. Мне приходилось добавлять специфические пакеты не идущие в изначальном chroot, делается это в строке config_opts['chroot_setup_cmd'].

Сборка пакета происходит натравливанием mock на .srpm файл:
mock ~/rpmbuild/SRPMS/haproxy.srpm
Если всё пройдёт удачно, то в /var/lib/mock/centos-5-x86_64/result/ вы получите готовые для установки rpm пакеты. Если же что-то пойдёт не так, то там же можно посмотреть лог-файлы. В root.log будет процесс создания chroot, в build.log — сборка.

Допустим всё прошло успешно и вы получили заветные haproxy.rpm, haproxy-debug.rpm. Осталось самоё простое.

Репозиторий

Где-то создаём директорию RPMS, допустим это /var/www/htdocs/ и переносим полученные файлы в неё. Да, эта часть уже делается от более привилегированного пользователя. Процесс создания репозитория так же прост:
createrepo /var/www/htdocs
Внутри получим нашу директорию RPMS и repodata.

Теперь на нужных серверах создаём .repo файл и пользуемся своим репозиторием. При добавлении пакетов надо каждый раз делать createrepo, а на серверах — yum clean all, что б свежие пакеты из вашего репозитория были видны для установки.

* Для расширения сознания и достижения дзена при создании .spec файлов предлагаю обратиться к таким документам:
fedoraproject.org/wiki/How_to_create_an_RPM_package
www.rpm.org/max-rpm-snapshot
tldp.org/HOWTO/RPM-HOWTO

Вот собственно и всё, что я хотел вам поведать. Надеюсь кому-то будет полезно.
Tags:
Hubs:
Total votes 27: ↑23 and ↓4+19
Comments31

Articles