LINUX.ORG.RU
ФорумAdmin

Как собирать rpm-пакеты

 ,


0

2

Никогда не собирал rpm-пакеты, но тут возникла такая надобность. Нужно для CentOS 7 собрать модули ядра ipt-netflow, nvidia-340 и последнюю версию утилиты iptables (ссылки на исходники и загрузки).
Итак, насколько я изучил тему, мне для этого нужны: исходники, все зависимости, утилита rpmbuild и spec-файл. И вот тут сразу же начинаются непонятки:
1) ipt-netflow и iptables собираются путём стандартной трёхкомандной комбинации: "./configure", «make», «make install», собственно эти команды я и вписываю в секции %build и %install spec-файла. Но как быть с nvidia, это же проприетарный пакет, в нём ничего не собирается, что там нужно в секции %prep, %build и %install вписывать?
2) Структуру каталогов RPMS, SOURCES, SPECS, SRPMS в домашнем каталоге пользователя создавать надо или её можно создать в каком-нибудь общем каталоге, например в /srv/adminfiles. Мне так удобнее, у меня в домашнем каталог только профиль, а все полезные файлы я храню в /srv, который у меня в виде отдельного раздела примонтирован.
3) Где можно почитать (желательно на русском) о макросах, используемых в spec-файлах, таких как %{name} и %setup? Без этой информации механизм написания spec-файлов остаётся непонятным.
4) И да, система же у нас защищена от возможных ошибок в сборочных сценариях? rpmbuild мы ведь запускаем под пользователем, не под рутом? А fakeroot там вызывается?

★★★★★

Последнее исправление: sunny1983 (всего исправлений: 2)

В теме надо было указать, что для CentOS. Это может быть существенно.

1. iptables. Возьми готовый src.rpm из CentOS. Добавть туда extensions/libipt_NETFLOW.c и extensions/libip6t_NETFLOW.c.

2. ipt-netflow. Тут сложнее, если не найдёшь src.rpm для CentOS. Если не найдёшь, найди какой-нибудь и адаптируй под правила написания rpm в CentOS. Можешь в ALT Linux взять.

3. «Но как быть с nvidia». А зачем ? Готовый не подходит ? Но если нет, то какая разница ? В секции %build можешь разложить что и куда положено. Но, вообще-то, там есть процесс сборки. Там не совсем готовые бинарники, помнится.

AS ★★★★★
()
Ответ на: комментарий от AS

2. ipt-netflow. Тут сложнее, если не найдёшь src.rpm для CentOS. Если не найдёшь, найди какой-нибудь и адаптируй под правила написания rpm в CentOS. Можешь в ALT Linux взять.

Хочешь сказать, что процесс написания spec-файла настолько сложен, что самостоятельно его написать нереально, можно только взять аналог и адаптировать?

3. «Но как быть с nvidia». А зачем ? Готовый не подходит ? Но если нет, то какая разница ? В секции %build можешь разложить что и куда положено. Но, вообще-то, там есть процесс сборки. Там не совсем готовые бинарники, помнится.

Не подходит. nvidia-304 стоит и похоже неправильно работает видеоускорение, тормозит видео в youtube. nvidia-340 yum ставить отказывается, говорит, что не та версия ядра. В Федоре всё проще с этим было, там для проприетарных драйверов есть akmod-пакеты, которые сами себя собирают. В CentOS я такого в репозиториях не нашёл (подключены EPEL и ELREPO), есть только kmod-пакеты, а это значит что после установки проприетарного драйвера я лишаюсь возможности в дальнейшем обновлять ядро.

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Хочешь сказать, что процесс написания spec-файла настолько сложен

С первого раза лучше с готовых начинать. Как привыкнешь, если сильно навороченной логики нет, не сложно.

AS ★★★★★
()
Ответ на: комментарий от AS

Как установить пакет исходников iptables. Хочу, раз уж советуют, глянуть на spec-файл старой версии iptables и на основе его написать аналогичный для самосборки пакета последней версии. Репозиторий base-source включён. У меня должен ведь быть доступным для установки пакет iptables-source? Его нет.
Ещё воспользуюсь тем, что в этой теме спецы по CentOS отметились, спрошу по репозиториям. Вот у меня при установке CentOS были включены репозитории «base», «updates» и «extras». Я включил репозитории «base-source», «updates-source» и «extras-source» и установил дополнительно «EPEL», «ELREPO» и «MySQL Community», ещё остались отключёнными «cr», «c7-media», «centosplus» и «fasttrack», они нужны?

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Как установить пакет исходников iptables.

Скачать. Потом rpm -i <название пакета>. От root, или от пользователя - это как принято в дистрибутиве. Если чего-то не будет хватать, rpm подскажет, что доустановить. Вот список на доустановку - это уже от root скорее всего. Может быть, это правильно сделает пакетный менеджер уровня над rpm (у кого что).

AS ★★★★★
()

Вся нвидия опакечена у меня для CentOS 7 по последнему слову, включая glvnd и проч., см. https://github.com/JajaumaPackages/dkms-nvidia. Только там не 340, а актуальный long-lived (на данный 375.20). Модуль прицеплен через dkms, так как шляпный "стабильный" kabi это какой-то лол. Всё остальное что нужно там же найдёте.

PS. Бинарников в public нету.
PPS. Бинарники есть у negativo17 (вообще, хорошо дистрибутит сей муж) и в elrepo (там полный мусор).

d_a ★★★★★
()

Nvidia есть в ELRepo готовая: https://elrepo.org/tiki/kmod-nvidia-340xx

SPEC-файлы обычно и проще быстрее использовать существующие от Fedora, для CentOS 7 — это 19-я Fedora (можно и новее, но там нужно быть аккуратнее).

Про макросы и прочее написано в Maximum RPM.

Чтобы защититься от ошибок при сборке — собирайте от обычного пользователя (можно создать отдельного под эти цели, или собирать в контейнере вообще). Если нужен chroot — смотрите в сторону mock.

trancefer ★★
()
Ответ на: комментарий от sunny1983

дебиан

технологии

/0

Не, неправильно. akmods просто тулза из репы rpmfusion. Но я не
rpmfusion, и упаковывал для себя (точнее, для работодателя) поэтому выбрал dkms от Dell.

d_a ★★★★★
()
Ответ на: комментарий от sunny1983

Пакетный менеджер такой функции не предоставляет?

rpm - нет. А что стоит над ним - это зависит от дистрибутива.

AS ★★★★★
()
Ответ на: комментарий от sunny1983

Я думаю первым делом стоит в irc спросить почему нет akmod. Вряд ли потому что лень.

alpha ★★★★★
()
Ответ на: комментарий от AS

rpm - нет. А что стоит над ним - это зависит от дистрибутива.

Можно подумать, что есть большой выбор того что стоит над ним: yum да dnf.
Кстати, стоит ли заменять yum на dnf в CentOS 7? Я вот dnf поставил, он у меня не работает, при любой команде выводится:

Failed to open: /var/cache/dnf/x86_64/7/x86_64/7/epel/repodata/8c2c7a8febe7c1cf309cd47596b40a9427492196c907a9a79645bed6b1b38603-updateinfo.xml.bz2
Если отключить репозиторий epel - ошибки не будет.

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Архив наверняка битый.
Можно почистить кэш и перекачать.

ArcFi
()
Ответ на: комментарий от sunny1983

Можно подумать, что есть большой выбор того что стоит над ним: yum да dnf.

Ещё apt и yast как минимум.

AS ★★★★★
()
Ответ на: комментарий от AS

Ещё apt и yast как минимум.

А дистры AltLinux и SUSE в этом треде разве кто-то упомянал? Мы обсуждаем сборку пакетов исключительно под CentOS.

Архив наверняка битый. Можно почистить кэш и перекачать.

Ну сочетание команд «yum clean all», «yuck makecache» я делал, содержимое /var/cache/dnf тоже удалял - не помогало.
А вообще на эту тему даже баг есть: https://bugzilla.redhat.com/show_bug.cgi?id=1258416

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

А дистры AltLinux и SUSE в этом треде разве кто-то упомянал?

Так и начало было про rpm. rpm не умеет. :-) Дальше пошло разнообразие.

AS ★★★★★
()

Чувак, создай уже тему «как, после 7 лет беспомощного форумного вяканья при любом вопросе, наконец-то научиться гуглить и читать сраные маны». Это сэкономит всем нам немало времени.

thesis ★★★★★
()
Ответ на: комментарий от sunny1983

Откуда у этого бездаря 4 звезды?

anonymous
()
Ответ на: комментарий от thesis

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

sunny1983 ★★★★★
() автор топика

Минутка самопиара:

http://wiki.russianfedora.pro/index.php?title=Как_пересобрать_RPM-пакет

Про сборку рпм на русском полно стандартных статей написано, гугл находит, но можно глянуть еще на вот это безобразие: http://wiki.russianfedora.pro/index.php?title=Oткрытый_урок_по_сборке_rpm-пак...

4) Rpmbuild запускается с правами пользователя и не изолируется. Если хочется chroot, надо использовать mock

http://wiki.russianfedora.pro/index.php?title=Mock

alpha ★★★★★
()
Ответ на: комментарий от AS

Перешёл от теории к практике.
Так, теперь понятно почему нужно создавать каталог rpmbuild именно в домашнем каталоге пользователя - потому что именно туда пакеты src.rpm и устанавливаются.
Сейчас я попытаюсь написать spec-файл для iptables-1.6.0, основываясь на spec-файл для iptables-1.4.21. Что-то в исходном spec-файле мне непонятно, из-за чего у меня появляется желание упростить код, выкинув из него то, что мне кажется лишним. Собственно можно ли так... ладно, сейчас опишу обо что именно я запнулся.
Макрос %setup я заменяю тем, что он делает, то есть секция %prep у меня такая:

%prep
cd ~/rpmbuild/BUILD
rm -rf %{name}-%{version}
tar --extract --file=~/rpmbuild/SOURCES/%{name}-%{version}.tar.bz2
if [ $? -ne 0 ]; then
  exit $?
fi
cd %{name}-%{version}
chown -R root.root .
chmod -R a+rX,g-w,o-w .
Здесь и здесь нашёл некую инфу по переменным и макросам, но не всю. Так нашёл, что ~/rpmbuild/BUILD я бы мог заменить переменной %{_builddir}, а вот какой переменной можно заменить каталог ~/rpmbuild/SOURCES?
Ещё я выкидываю из кода все патчи, потому что они имеют отношение к версии 1.4.21, а я собираю 1.6.0.
Дальше идут самые ответственные секции %build и %install, где в исходном spec-файле присутствуют непонятные переменные, например строка:
make %{?_smp_mflags}
Пока вопросов хватит. Но это только начало.
Да, очень прошу, не отсылайте в гугл, лучше поделитесь опытом, он бесценен.

sunny1983 ★★★★★
() автор топика
Последнее исправление: sunny1983 (всего исправлений: 1)
Ответ на: комментарий от alpha

полно стандартных статей написано, гугл находит

Деточка не хочет в гугл. Деточка хочет, чтобы ему переварили и отрыгнули в ротик.

thesis ★★★★★
()

checkinstall уже советовали? Это самый простой и быстрый способ.

wolph ★★
()
Ответ на: комментарий от sunny1983

Макрос %setup я заменяю тем, что он делает

Зачем ? Чтобы переносимость src.rpm усложнить ? ~/rpmbuild задаётся в ~/.rpmmacros в переменной %_topdir и может называться совсем не так. У меня вот там написано «%_topdir %homedir/RPM».

а вот какой переменной можно заменить каталог ~/rpmbuild/SOURCES ?

Опять же, зачем ? В этом каталоге не нужно ничего делать руками.

AS ★★★★★
()
Ответ на: комментарий от AS

Опять же, зачем ? В этом каталоге не нужно ничего делать руками.

В sources нужно руками закладывать, что несподручно. Для пробной сборки на локалхосте я юзаю

rpmbuild -ba *.spec -D "_sourcedir $(pwd)"

d_a ★★★★★
()
Ответ на: комментарий от AS

Ну вообще-то я писал, что запнулся совсем на другом.
Как может переносимость src.rpm усложниться? Макрос %setup ведь распаковывает архивы исходников, сжатые архиватором bzip2? А если это будут вообще не исходники, а исполняемый файл, например run-файл для проприетарного драйвера nvidia? Всё, что я сейчас хочу заменить нужно лично мне для упрощения понимания кода. Я не программист и подобные темы для моего понимания сложны.
Да, и где ты эту инфу откопал по макросам и переменным, что тут пишешь? Я вот на fedoraproject.org про переменную %_topdir ничего не нашёл? Список доступных переменных и макросов справочником вообще где-нибудь есть?

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Как может переносимость src.rpm усложниться?

Потому, как, допустим, я беру твой src.rpm, а у тебя там засада в виде cd ~/rpmbuild/BUILD, которого у меня нет.

Да, и где ты эту инфу откопал по макросам и переменным, что тут пишешь?

Вот тут есть, например: /usr/share/doc/rpm-4.0.4/manual/macros

AS ★★★★★
()
Ответ на: комментарий от AS

Хорошо, меняю на:

tar --extract --file=%{_sourcedir}/%{name}-%{version}.tar.bz2
Но я спрашивал про непонятный код в секции %build.
Что тут делается?
sed -i 's|^hardcode_libdir_flag_spec=.*|hardcode_libdir_flag_spec=""|g' libtool
sed -i 's|^runpath_var=LD_RUN_PATH|runpath_var=DIE_RPATH_DIE|g' libtool
И что за загадочный параметр у make?
make %{?_smp_mflags}

sunny1983 ★★★★★
() автор топика
Ответ на: комментарий от sunny1983

Хорошо, меняю на:

Блин. Ну чем, чем %setup не угодил-то ?

sed -i

man sed наверное ? sed - строковый редактор, много что умеет. Тебя интересует, что он делает, или зачем делает ? Зачем делает - это написано строчкой ранее, по крайней мере, в iptables-1.6.0-2.fc25.src.rpm.

И что за загадочный параметр у make?

Не знаю. Если бы там было написано %{?_smp_mflags: bla-bla-bla}, было бы понятно, а так - не очень. Я в таком виде это не использовал. Сделай echo %{?_smp_mflags} и echo %{_smp_mflags} до make, посмотри, что там написано будет. Может быть, таким образом задаётся использование %{_smp_mflags} в случае, если эта переменная определена.

AS ★★★★★
()
Последнее исправление: AS (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.