22
февраля
0

Создание rpm пакета из исходников



Способ установки пакетов из исходников при помощи make install имеет несколько недостатков, а именно это позднее мешает обновлениям, засоряет систему, усложняет контроль версий ПО и т.д. В многих дистрибутивах линукс для управления ПО используется RPM (Red Hat Package Manager), который позволяет устанавливать, удалять и обновлять программное обеспечение.

В этой статье мы рассмотрим способ сборки rpm пакетов из исходников. Сборку пакета будем производить в дистрибутиве RHEL6, а в качестве исходников использовать keepalived-1.2.15.tar.gz

RPM-пакеты делятся на пакеты с исходниками — src.rpm и пакеты, готовые к установке — %{arch}.rpm. В src.rpm пакетах содержится исходный тарболл (исходник программы), какие-либо другие исходники, пачти и самый главный spec-файл, который управляет процессом сборки. Все эти файлы упакованы в cpio архив. Когда вы попытаетесь войти в src.rpm пакет при помощи файлового менеджера mc, вы его увидите. Также в пакете присутствует некоторые файлы с информацией.

В %{arch}.rpm-пакетах содержится cpio-архив с файлами, которые после установки разложатся по соответствующим каталогам, файлы информации и установочные скрипты.

Собирать пакеты можно из-под любого пользователя. Делать это из-под root’а не рекомендуется, т.к. есть вероятность, что корнем для секции инсталляции окажется каталог / и тогда команда rm -rf %{buildroot} удалит корневые файлы. Также бывает, что «кривые» пакеты не правильно выполняют инсталляцию, и ставятся не во временный каталог, а прямо куда-нибудь в %{_prefix} (/usr). Часть файлов в этом случае может быть потеряна, хотя на работоспособности пакета на этой машине это не скажется.

Создадим для сборки пакета пользователя testrpm:

[root@test ~]# useradd testrpm
[root@test ~]# su - testrpm

Для сборки пакетов необходимо наличие утилиты rpmbuild. Установим ее:

[testrpm@test ~]# yum install rpm-build

В домашней директории необходимо создать структуру каталогов, которую мы будем испльзовать для сборки пакета. Сделать это можно двумя способами. Напрямую создав каталоги:

[testrpm@test ~]# mkdir -p ~/rpmbuild/{RPMS,SRPMS,SPECS,SOURCES,BUILD}

Или же воспользовавшись командой rpmdev-setuptree (входит в пакет rpmdevtools):

[testrpm@test]# sudo yum install rpmdevtools
[testrpm@test ~]# rpmdev-setuptree
$ ls rpmbuild/
BUILD RPMS SOURCES SPECS SRPMS

Размещаем файл с исходниками keepalived-1.2.15.tar.gz в папке ~/rpmbuild/SOURCES

Далее необходимо создать или отредактировать .spec файл, в котором описан процесс и параметры сборки rpm-пакета. В архиве с файлами keepalived-1.2.15.tar.gz уже есть пример .spec файла:

Summary: HA monitor built upon LVS, VRRP and services poller
Name: keepalived
Version: 1.2.15
Release: 5
License: GPL
Group: Applications/System
URL: http://www.keepalived.org/

Source0: http://www.keepalived.org/software/keepalived-%{version}.tar.gz
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root

BuildRequires: openssl-devel
# We need both of these for proper LVS support
BuildRequires: kernel, kernel-devel
Requires(post): /sbin/chkconfig
Requires(preun): /sbin/service, /sbin/chkconfig
Requires(postun): /sbin/service

%description
The main goal of the keepalived project is to add a strong & robust keepalive
facility to the Linux Virtual Server project.

%build
%{?el3:export CPPFLAGS="-I/usr/kerberos/include"}
%{?rh9:export CPPFLAGS="-I/usr/kerberos/include"}
%configure \
%{?el3:--includedir="/usr/kerberos/include"} \
%{?rh9:--includedir="/usr/kerberos/include"} \
--with-kernel-dir="/lib/modules/%{kernel}/build"
%{__make} %{?_smp_mflags} STRIP=/bin/true
%install
%{__rm} -rf %{buildroot}
%{__make} install DESTDIR=%{buildroot}
# Remove "samples", as we include them in %%doc
%{__rm} -rf %{buildroot}%{_sysconfdir}/keepalived/samples/

%check
# A build could silently have LVS support disabled if the kernel includes can't
# be properly found, we need to avoid that.
if ! grep -q "IPVS_SUPPORT='_WITH_LVS_'" config.log; then
echo "ERROR: We do not want keeepalived lacking LVS support."
exit 1
fi
%clean
%{__rm} -rf %{buildroot}
%post
/sbin/chkconfig --add keepalived

%preun
if [ $1 -eq 0 ]; then
/sbin/service keepalived stop &>/dev/null || :
/sbin/chkconfig --del keepalived
fi

%postun
if [ $1 -ge 1 ]; then
/sbin/service keepalived condrestart &>/dev/null || :
fi
%files
%defattr(-, root, root, 0755)
%doc AUTHOR ChangeLog CONTRIBUTORS COPYING README TODO
%doc doc/keepalived.conf.SYNOPSIS doc/samples/
%dir %{_sysconfdir}/keepalived/
%attr(0600, root, root) %config(noreplace) %{_sysconfdir}/keepalived/keepalived.conf
%attr(0600, root, root) %config(noreplace) %{_sysconfdir}/sysconfig/keepalived
%{_sysconfdir}/rc.d/init.d/keepalived
%{_bindir}/genhash
%{_sbindir}/keepalived
%{_mandir}/man1/genhash.1*
%{_mandir}/man5/keepalived.conf.5*
%{_mandir}/man8/keepalived.8*

Объяснение часто используемых областей в .spec файле

Name: Базовое имя пакета удовлетворяющее требованиям Packagen Naming Guidelines. После этого, макрос %{name} будет обращаться к данному разделу.
Version: Номер версии, при использовании даты в версии, используйте формат, гг.мм (пример 11.02). %{version} для последуещого обращения к данной области.
Release: Релиз пакета.
Summary: Краткое описание пакета.
Group: Существующая группа пакетов, например Applications/Databases.
License: Лицензия, под которой распространяется программа (обычно указано в самом пакете)
Source0: Ссылка на архив с исходным кодом. Если указана полная ссылка, то одноименный пакет должен быть в папке SOURCES. Если источников исходного кода несколько, то используем Source1, Source2 и т.д.
Patch0: Название первого патча для программы, имя файла должно заканчиваться на .patch и лежать в директории ~/rpmbuild/SOURCES. Патчей может быть несколько.
BuildRoot: Место, выделенное для компиляции и установки исходников приложения во время выполнения процесса «%install».
BuildRequires: Список необходимых приложений для сборки пакета (через запятую). Автоматически не определяются.
Requires: Список необходимых приложений для работы после установки (через запятую). В большинстве случаев определяются автоматически rpmbuild.
%description: Описание программы, строки не должны быть длиннее 80 символов.
%prep: Скрипты для подготовки программы, распаковки и подготовки к сборке.
%build: Скрипты для сборки программы, компиляции и подготовки к установке.
%install: Скрипты для установки программы, команды скопируют файлы из «build directory» %{_builddir} (которая находится ~/rpmbuild/BUILD) в директорию buildroot %{buildroot}, которая обыно находится в /var/tmp.
%clean: Инструкции для очистки buildroot, например,
rm -rf %{buildroot}
%files: Список устанавливаемых файлов.
%changelog: Изменения в программе.

Мы отредактируем только путь к установочным файлам:

[testrpm@test ~]# Source0: ~rpmbuild/SOURCES/keepalived-%{version}.tar.gz

Когда все готово, запускаем компилирование и создание RPM:

[testrpm@test ~]# rpmbuild -ba rpmbuild/SPECS/keepalived.spec.in

В результате будет создан .rpm пакет и .src.rpm

[testrpm@test ~]# Wrote: ~/rpmbuild/SRPMS/keepalived-1.2.15-5.src.rpm
[testrpm@test ~]# Wrote: ~/rpmbuild/RPMS/x86_64/keepalived-1.2.15-5.x86_64.rpm

Установить пакет в систему можно командой:

[testrpm@test ~]# rpm -ivh ~/rpmbuild/RPMS/x86_64/keepalived-1.2.15-5.x86_64.rpm
Preparing... ########################################### [100%]
1:keepalived ########################################### [100%]
Понравилась статья?
Подписаться на RSS feed
Оставить комментарий