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

Есть и такой ОС.

Модератор: weec

Правила форума
Убедительная просьба юзать теги [cоde] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
Andy
ст. лейтенант
Сообщения: 1117
Зарегистрирован: 2007-03-04 7:48:58
Откуда: Mytischi

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

Непрочитанное сообщение Andy » 2009-07-19 9:32:24

Создание и сборка собственных rpm пакетов.
Данная статья родилась совершенно спонтанно, как оно часто и бывает.
Катализатором послужила необходимость в смене штатного системного логгера,
который, по непонятным мне причинам, перестал работать. В поиске альтернатив
стандартому демону журнализации в CentOS, sysklogd, я нашел два других
решения syslog-ng и rsyslog. Выбор был сделан в пользу второго, так как он
обладал более богатыми возможностями и его конфигурационный файл был
совместим со стандартным демоном, который шел вместе с системой.
Так же статья является отчасти ответом на этот тред -
http://forum.lissyara.su/viewtopic.php?p=155156#p155156
в котором высказана крамольная мысль о сборке из исходных кодов,
вместо пересборки имеющегося rpm. Было сломано много копий, прежде
чем мнение автора изменилось. Почему сборка из исходных текстов
плохо написали давно за меня, рекомендую ознакомится:
http://www.linux.kiev.ua/ru/docs/articl ... ysadm-rpm/
В целях экономии времени и поддержания дальнейшей системы в целостном
состоянии и опровержения мнения о том, что сборка пакетов это очень
сложно - написана эта статья.

Первым делом, смотрим в официальный репозиторий - версия старая,
что в общем и не удивительно. Однако, на сайте http://www.rsyslog.com,
доступна последняя stable версия пакета 4 ветки. Я выбрал именно ее.
Теперь, неплохо бы обзавестись spec файлом. Для этого нам необходим
srpm файл (source rpm - это исходный код программы, спек файл и патчи
к программе). Srpm файлы можно и нужно поискать в доступных
репозиториях, указанных в вики CentOS. Я воспользовался гуглом.
Гугл нашел довольно много, я выбрал адрес мейнтейнера
данной программы в Fedora - http://people.redhat.com/pvrabec/rpms/rsyslog/
Последней версией rsyslog, для дистрибутива Fedora, лежащий на сайте
rsyslog-3.12.0-1.fc8.src.rpm. Вполне подходит. Cкачиваем, но установим
данный пакет только после того, как убедимся, что в нашей системе установлены:

Код: Выделить всё

rpm-build-4.4.2.3-9.el5
redhat-rpm-config-8.0.45-29.el5
gcc-c++-4.1.2-44.el5
gcc-4.1.2-44.el5
auto-buildrequires-1.0-3.el5
Разумеется, это не весь необходимый инструментарий. По ходу написания спека,
можно доустановить необходимые программы.
В CentOS не рекомендуется собирать пакеты от рута, поэтому создадим
сборочную директорию у себя со всеми необходимыми поддиректориями.

Код: Выделить всё

[user@host ~]$ mkdir -p ~/rpmbuild/{BUILD,RPMS,SOURCES,SPECS,SRPMS}
[user@host ~]$ echo '%_topdir %(echo $HOME)/rpmbuild' > ~/.rpmmacros
Вершиной нашего сборочного каталога будет являтся ~/rpmbuild
Устанавливаем rpm:

Код: Выделить всё

rpm -iUvh rsyslog-3.12.0-1.fc8.src.rpm
В директории /usr/src/redhat/SPECS/
находим spec файл - rsyslog.spec и копируем его к себе в ~/rpmbuild/SPECS.
Не забываем и перенести тарболл.

Код: Выделить всё

cp /usr/src/redhat/SOURCES/rsyslog-4.2.0.tar.gz ~/rpmbuild/SOURCES/
Разумеется, после копирования файлов, необходимо поменять
владельца. В моем случае это:

Код: Выделить всё

chown -R andy:andy rpmbuild/
Открываем наш спек.

Код: Выделить всё

%define sbindir /sbin

Summary: Enhanced system logging and kernel message trapping daemons
Name: rsyslog
Version: 3.12.0
Release: 1%{?dist}
License: GPLv3+
Group: System Environment/Daemons
URL: http://www.rsyslog.com/
Source0: http://download.rsyslog.com/rsyslog/%{name}-%{version}.tar.gz
Source1: rsyslog.init
Source2: rsyslog.conf
Source3: rsyslog.sysconfig
Patch1: rsyslog-3.11.4-undef.patch
Patch2: rsyslog-3.11.4-gssMake.patch
Patch3: rsyslog-3.11.4-gssMod.patch
BuildRequires: zlib-devel
BuildRequires: autoconf automake
Requires: logrotate >= 3.5.2
Requires: bash >= 2.0
Requires(post): /sbin/chkconfig coreutils
Requires(preun): /sbin/chkconfig /sbin/service
Requires(postun): /sbin/service
Provides: syslog
Conflicts: sysklogd < 1.4.1-43
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

%package mysql
Summary: MySQL support for rsyslog
Group: System Environment/Daemons
Requires: %name = %version-%release
BuildRequires: mysql-devel >= 4.0

%package pgsql
Summary: PostgresSQL support for rsyslog
Group: System Environment/Daemons
Requires: %name = %version-%release
BuildRequires: postgresql-devel

%package gssapi
Summary: GSSAPI authentication and encryption support for rsyslog
Group: System Environment/Daemons
Requires: %name = %version-%release
BuildRequires: krb5-devel

%description
Rsyslog is an enhanced multi-threaded syslogd supporting, among others, MySQL,
syslog/tcp, RFC 3195, permitted sender lists, filtering on any message part,
and fine grain output format control. It is quite compatible to stock sysklogd
and can be used as a drop-in replacement. Its advanced features make it
suitable for enterprise-class, encryption protected syslog relay chains while
at the same time being very easy to setup for the novice user.

%description mysql
The rsyslog-mysql package contains a dynamic shared object that will add
MySQL database support to rsyslog.

%description pgsql
The rsyslog-pgsql package contains a dynamic shared object that will add
PostgreSQL database support to rsyslog.

%description gssapi
The rsyslog-gssapi package contains the rsyslog plugins which support GSSAPI
authentication and secure connections. GSSAPI is commonly used for Kerberos
authentication.

%prep
%setup -q
%patch1 -p1 -b .undef

%build
%configure --sbindir=%{sbindir} --disable-static --enable-mysql --enable-pgsql --enable-gssapi-krb5
make %{?_smp_mflags}

%install
rm -rf $RPM_BUILD_ROOT

make install DESTDIR=$RPM_BUILD_ROOT

install -d -m 755 $RPM_BUILD_ROOT%{_initrddir}
install -d -m 755 $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
install -d -m 755 $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d

install -p -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_initrddir}/rsyslog
install -p -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/rsyslog.conf
install -p -m 644 %{SOURCE3} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/rsyslog
install -p -m 644 redhat/rsyslog.log $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/syslog

#get rid of *.la
rm $RPM_BUILD_ROOT/%{_libdir}/rsyslog/*.la

%clean
rm -rf $RPM_BUILD_ROOT

%post
/sbin/chkconfig --add rsyslog
for n in /var/log/{messages,secure,maillog,spooler}
do
        [ -f $n ] && continue
        umask 066 && touch $n
done

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

%postun
if [ "$1" -ge "1" ]; then
        service rsyslog condrestart > /dev/null 2>&1 ||:
fi

%triggerun -- rsyslog < 3.0.0
/bin/kill `cat /var/run/rklogd.pid 2> /dev/null`

%files
%defattr(-,root,root,-)
%doc AUTHORS COPYING NEWS README doc/*html
%dir %{_libdir}/rsyslog
%{_libdir}/rsyslog/imklog.so
%{_libdir}/rsyslog/immark.so
%{_libdir}/rsyslog/imtcp.so
%{_libdir}/rsyslog/imudp.so
%{_libdir}/rsyslog/imuxsock.so
%{_libdir}/rsyslog/omtesting.so
%config %{_sysconfdir}/rsyslog.conf
%config %{_sysconfdir}/sysconfig/rsyslog
%config(noreplace) %{_sysconfdir}/logrotate.d/syslog
%{_initrddir}/rsyslog
%{sbindir}/rsyslogd
%{sbindir}/rfc3195d
%{_mandir}/*/*

%files mysql
%defattr(-,root,root)
%doc plugins/ommysql/createDB.sql
%{_libdir}/rsyslog/ommysql.so

%files pgsql
%defattr(-,root,root)
%doc plugins/ompgsql/createDB.sql
%{_libdir}/rsyslog/ompgsql.so

%files gssapi
%defattr(-,root,root)
%{_libdir}/rsyslog/imgssapi.so
%{_libdir}/rsyslog/omgssapi.so

%changelog
* Wed Mar 05 2008 Peter Vrabec <pvrabec@redhat.com> 3.12.0-1
- upgrade
Рассмотрим подробнее данный файл:

Первой строкой в данном файле определяется макрос sbindir,
который указывает на директорию /sbin. Забегая вперед - вы можете
поглядеть список макроопределений в файле /usr/lib/rpm/macros.
Если же нужно быстро узнать, какое значение присвоено макроопределению из
стандартной конфигурации макросов - можно выполнить команду
rpm --eval имямакроса. Например:

Код: Выделить всё

[root@unit1 SPECS]# rpm --eval %{_initrddir}
/etc/rc.d/init.d
[root@unit1 SPECS]# rpm --eval %{_sbindir}
/usr/sbin
[root@unit1 SPECS]#
В поле Summary: указывается краткое описание программы
Name: - имя программы
Version: - соответственно, версия программы
Release: - номер версии в рамках дистрибутива.
Мейнтейнер может работать над имеющейся в версией программы,
с целью бекпортирования новых возможностей и новой версии программы в старую,
либо накладывания патчей, добавления скриптов инициализации и т.д. В этом
случае номер апстрим версии остается неизменным, а поле Release изменяется.
Group: - группа к которой принадлежит программа.
URL: - адрес программы по которому ее можно скачать.
Source0: - как правило - точная ссылка на скачивание программы с указанием ее
имени и версии. Сам rpm не будет ничего самостоятельно загружать, однако
воспользуется именем файла.
Source1: rsyslog.init - стартовый скрипт для программы rsyslog
Source2: rsyslog.conf - конфигурационный файл программы.
Индикатор заботы мейнтенера о пользователе. Как правило заточен под общие
случаи, то есть "поставил и забыл". Для более тонкой настройки, разумеется,
требуется доработка.
Source3: rsyslog.sysconfig - в этом файле содержатся опции, c которыми запускается
демон.
Patch1: rsyslog-3.11.4-undef.patch
Patch2: rsyslog-3.11.4-gssMake.patch
Patch3: rsyslog-3.11.4-gssMod.patch
Патчи накладываемые на софт. Один патч - одна запись в спеке.
BuildRequires: zlib-devel
BuildRequires: autoconf automake

Зависимости для сборки. Зачастую информацию о зависимостях для сборки
можно узнать из документации к программе, либо опытным путем, вываливаясь
с ошибками в момент компиляции и поисками этих строчек с названием ошибки, или файла,
в гугле.
Requires: logrotate >= 3.5.2 - установленный софт, необходимый для работы данной программы.
В указанной строке сообщается, что одним из условий работы программы rsyslog, является наличие
установленной программы logrotate версии 3.5.2 или выше.
Provides: syslog - Так называемая виртуальная зависимость. Программе все равно, какой именно
демон журнализации будет вести ее лог файлы. Фактически, данный софт будет "представлятся"
программам как syslog. Собственно, функционал syslog будет предоставлятся демоном rsyslog.
Conflicts: sysklogd < 1.4.1-43 - как следует из названия, наша программа конфликтует
с установленной программой sysklogd версии ниже, чем 1.4.1-43.
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
Директория, в которой будет проходить сборка программы.
Как правило, программы пишутся с некоторым спектром возможностей, поэтому
функционал у них может быть весьма разнообразным. Применительно к рассматриваемой
программе это значит, что она может работать с разными базами данных, в нее можно
включить аутентификацию через Kerberos, откомпилировать с отладочными средствами
и так далее. Выбор того или иного функционала, как правило, лежит на мейнтейнере.
Именно он, при сборке программы, включает тот или иной функционал в пакет. Если нам
требуются иные возможности программы, необходимо ее перекомпилировать из srpm файла,
с включением нужных опций. Возникает вопрос - что делать, если среди имеющегося
функционала нам часть возможностей совершенно не нужна? Если я хочу поставить
программу без поддержки баз данных, которыми не собираюсь пользоваться? Для
этого существует дробление программы на субпакеты. С помощью субпакетов
мы установим то, что нужно именно нам. Поэтому, каждый плагин
расширяющий функционал rsyslog, оформляется в отдельный субпакет
с помощью директивы %package.
Директива %description применяется для описания пакета или субпакета.
Описанное выше - всего лишь заголовок, в нем мы указали имя и версию пакета,
сделали небольшое описание, перечислили зависимости для сборки и для запуска.
В секции %prep происходит подготовка к сборке пакета, в ней тарболл
распаковывается %setup, ключ -q говорит о том, что вывод будет минимальным.
Затем идет применение патчей, причем применяется только первый из них
%patch1, -p1 - отрезаем первую директорию, -b - создаем резервную копию.
В секции %build надо определить команды и опции необходимые для сборки программы.
В нашем случае вызывается %configure, с опциями, в который мы определяем
что мы хотим включить в сборку. Затем идет непосредственно команда сборки.
Во что раскрывается %{?_smp_mflags} в Вашей системе, Вы можете поглядеть
самостоятельно, у меня это -j2.
Секция инсталляции:
rm -rf $RPM_BUILD_ROOT - очищаем диркеторию в которой будем собирать нашу программу.
make install DESTDIR=$RPM_BUILD_ROOT - устанавливаем программу в директорию для сборки.
Ниже идут команды создания директорий, с необходимыми правами.

Код: Выделить всё

nstall -d -m 755 $RPM_BUILD_ROOT%{_initrddir}
install -d -m 755 $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
install -d -m 755 $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d
Затем запись в эти директории файлов, c указанными правами.
install -p -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_initrddir}/rsyslog
install -p -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/rsyslog.conf
install -p -m 644 %{SOURCE3} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/rsyslog
install -p -m 644 redhat/rsyslog.log $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/syslog
#get rid of *.la
rm $RPM_BUILD_ROOT/%{_libdir}/rsyslog/*.la
- Удаляем la файлы.
Секция %clean
%clean
rm -rf $RPM_BUILD_ROOT
- Очищаем каталог сборки
Директива %post необходима для выполенения собственных действий,
после установки. В рассматриваемом случае, rsyslog добавляется
в список запускемых программ, и создаются необходимые файлы и
им присваиваются значения 600 (на чтение и запись только владельцу).

Код: Выделить всё

%post
/sbin/chkconfig --add rsyslog
for n in /var/log/{messages,secure,maillog,spooler}
do
        [ -f $n ] && continue
        umask 066 && touch $n
done
Директива %preun нужна для выполнения собственных действий
перед удалением пакета. В нашем случае демон останавливается,
и удаляется из списка программ.

Код: Выделить всё

%preun
if [ $1 = 0 ]; then
        service rsyslog stop >/dev/null 2>&1 ||:
        /sbin/chkconfig --del rsyslog
fi
При помощи директивы %postun мы выполняем собственные действия
после удаления пакета. Перезапускаем сервис, если он был удален.

Код: Выделить всё

%postun
if [ "$1" -ge "1" ]; then
        service rsyslog condrestart > /dev/null 2>&1 ||:
fi
Директива %triggerun нужна для исполнения в момент
удаления или обновления пакета в системе.
В данном примере мы вынуждаем rsyslog завершить свою работу.

Код: Выделить всё

%triggerun -- rsyslog < 3.0.0
/bin/kill `cat /var/run/rklogd.pid 2> /dev/null`
Секция %files содержит список файлов, которые
будут установлены в системе, после инсталляции пакета.
Директивой %defattr(-,root,root,-), мы определяем пользователя
и группу, которым принадлежат файлы.
Директива %doc отмечает файлы как файлы с документацией.
Директива %dir %{_libdir}/rsyslog, говорит о том, что упаковывается
вся директория rsyslog. Затем идет перечисление файлов, которые подлежат
упаковке. При помощи директивы %config %{_sysconfdir}/rsyslog.conf,
мы говорим rpm о том, куда следует класть конфигурационные файлы.
Дополнение (noreplace), директивы %config, помогает не затереть уже
имеющийся конфигурационный файл.
%{_mandir}/*/* - эта директива упаковывает man страницы.
Ниже идут списки упаковки для конкретных субпакетов, самостоятельный
разбор которых не должен вызвать трудностей.
Заключительная запись в спек файле - директива %changelog.
После нее указывается дата сборки пакета, мейнтенер, почтовый адрес
мейнтейнера и версия пакета.
Еще ниже идут комментарии - отчет мейнтейнера о проделанной работе.

С форматом spec файла более-менее разобрались. Настал черед изменить
спек под свою версию утилиты rsyslog. Привожу вариант собранный под
собственные нужды, с краткими пояснениями.

Код: Выделить всё

%define	sbindir	/sbin

Summary: Enhanced system logging and kernel message trapping daemons
Name: rsyslog
Version: 4.2.0 - версия исправлена на нужную
Release: 1%{?dist}
License: GPLv3+
Group: System Environment/Daemons
URL: http://www.rsyslog.com/
Source0: http://download.rsyslog.com/rsyslog/%{name}-%{version}.tar.gz
Source1: rsyslog.init
Source2: rsyslog.conf
Source3: rsyslog.sysconfig
BuildRequires: zlib-devel
BuildRequires: autoconf automake
Requires: logrotate >= 3.5.2
Requires: bash >= 2.0
Requires(post): /sbin/chkconfig coreutils
Requires(preun): /sbin/chkconfig /sbin/service
Requires(postun): /sbin/service
Provides: syslog
Conflicts: sysklogd < 1.4.1-43
BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)

%package mysql
Summary: MySQL support for rsyslog
Group: System Environment/Daemons
Requires: %name = %version-%release
BuildRequires: mysql-devel >= 4.0

%package pgsql
Summary: PostgresSQL support for rsyslog
Group: System Environment/Daemons
Requires: %name = %version-%release
BuildRequires: postgresql-devel

%package gssapi
Summary: GSSAPI authentication and encryption support for rsyslog
Group: System Environment/Daemons
Requires: %name = %version-%release
BuildRequires: krb5-devel 

%package rtinst - включил на всякий случай
Summary: Runtime instrumentation mode support for rsyslog 
Group: System Environment/Daemons
Requires: %name = %version-%release

%package diagtools - утилиты для диагностики в моем случае могут понадобится
Summary: Diagnostic tools  support for rsyslog
Group: System Environment/Daemons
Requires: %name = %version-%release

%package snmp - возможность мониторинга по snmp
Summary: SNMP support for rsyslog
Group: System Environment/Daemons
Requires: %name = %version-%release
BuildRequires: net-snmp-devel

%package mail - поддержка почтовых отправок
Summary: Mail support for rsyslog 
Group: System Environment/Daemons
Requires: %name = %version-%release

%description
Rsyslog is an enhanced multi-threaded syslogd supporting, among others, MySQL,
syslog/tcp, RFC 3195, permitted sender lists, filtering on any message part,
and fine grain output format control. It is quite compatible to stock sysklogd
and can be used as a drop-in replacement. Its advanced features make it 
suitable for enterprise-class, encryption protected syslog relay chains while 
at the same time being very easy to setup for the novice user.

%description mysql
The rsyslog-mysql package contains a dynamic shared object that will add
MySQL database support to rsyslog.

%description pgsql
The rsyslog-pgsql package contains a dynamic shared object that will add
PostgreSQL database support to rsyslog.

%description gssapi
The rsyslog-gssapi package contains the rsyslog plugins which support GSSAPI 
authentication and secure connections. GSSAPI is commonly used for Kerberos 
authentication.

%description rtinst
The rsyslog-rtinst package contains the rsyslog plugins which support 
runtime instrumentation mode

%description diagtools
The rsyslog-diagtools package contains the rsyslog plugins which support
diagnostic

%description snmp
The rsyslog-snmp package contains the rsyslog plugins which support
snmp

%description mail
The rsyslog-snmp package contains the rsyslog plugins which support
mail

%prep
%setup -q

%build
%configure --sbindir=%{sbindir} --enable-mysql \
 --enable-pgsql \
 --enable-gssapi-krb5 \
 --enable-rtinst \
 --enable-diagtools \
 --enable-snmp \
 --enable-mail \

make %{?_smp_mflags}

%install
rm -rf $RPM_BUILD_ROOT

make install DESTDIR=$RPM_BUILD_ROOT

install -d -m 755 $RPM_BUILD_ROOT%{_initrddir}
install -d -m 755 $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig
install -d -m 755 $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d

install -p -m 755 %{SOURCE1} $RPM_BUILD_ROOT%{_initrddir}/rsyslog
install -p -m 644 %{SOURCE2} $RPM_BUILD_ROOT%{_sysconfdir}/rsyslog.conf
install -p -m 644 %{SOURCE3} $RPM_BUILD_ROOT%{_sysconfdir}/sysconfig/rsyslog
#install -p -m 644 redhat/rsyslog.log $RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/syslog
В той версии rsyslog, для которой был написан спек, была директория redhat,
с содержищимися в ней: настройками для logrotate, стартовым скриптом, конфигурационным файлом.
В версии rsyslog 4.2.0 данная директория отсутствует, поэтому я решил оставить эти файлы от
предыдущей версии. Ниже идет создание файла для logrotate.

Код: Выделить всё

cat <<EOF>$RPM_BUILD_ROOT%{_sysconfdir}/logrotate.d/syslog
/var/log/messages /var/log/secure /var/log/maillog /var/log/spooler /var/log/boot.log /var/log/cron {
    sharedscripts
    postrotate
        /bin/kill -HUP `cat /var/run/rsyslogd.pid 2> /dev/null` 2> /dev/null || true
    endscript
}
EOF
На вопрос - почему не объявил SOURCE и не указал файл источника, скажу так -
хотелось продемонстирровать еще одну возможность добавления собственных файлов в пакет.
В примере мы перенаправляем поток вывода в файл, пока сам поток не закончится. Признаком
окончания потока служит директива EOF.

Код: Выделить всё

#get rid of *.la
rm $RPM_BUILD_ROOT/%{_libdir}/rsyslog/*.la

%clean
rm -rf $RPM_BUILD_ROOT

%post
/sbin/chkconfig --add rsyslog
for n in /var/log/{messages,secure,maillog,spooler}
do
	[ -f $n ] && continue
	umask 066 && touch $n
done

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

%postun
if [ "$1" -ge "1" ]; then
	service rsyslog condrestart > /dev/null 2>&1 ||:
fi	

%triggerun -- rsyslog < 3.0.0
/bin/kill `cat /var/run/rklogd.pid 2> /dev/null`

%files
%defattr(-,root,root,-)
%doc AUTHORS COPYING NEWS README doc/*html
%dir %{_libdir}/rsyslog
%{_libdir}/rsyslog/imklog.so
%{_libdir}/rsyslog/immark.so
%{_libdir}/rsyslog/imtcp.so
%{_libdir}/rsyslog/imudp.so
%{_libdir}/rsyslog/imuxsock.so
%{_libdir}/rsyslog/omtesting.so
%{_libdir}/rsyslog/lmgssutil.so
%{_libdir}/rsyslog/lmnet.so
%{_libdir}/rsyslog/lmnetstrms.so
%{_libdir}/rsyslog/lmnsd_ptcp.so
%{_libdir}/rsyslog/lmregexp.so
%{_libdir}/rsyslog/lmtcpclt.so
%{_libdir}/rsyslog/lmtcpsrv.so
%config %{_sysconfdir}/rsyslog.conf
%config %{_sysconfdir}/sysconfig/rsyslog
%config(noreplace) %{_sysconfdir}/logrotate.d/syslog
%{_initrddir}/rsyslog
%{sbindir}/rsyslogd
%{_mandir}/*/*

%files mysql
%defattr(-,root,root)
%doc plugins/ommysql/createDB.sql
%{_libdir}/rsyslog/ommysql.so

%files pgsql
%defattr(-,root,root)
%doc plugins/ompgsql/createDB.sql
%{_libdir}/rsyslog/ompgsql.so

%files gssapi
%defattr(-,root,root)
%{_libdir}/rsyslog/imgssapi.so
%{_libdir}/rsyslog/omgssapi.so

%files rtinst
%defattr(-,root,root)
%{_libdir}/rsyslog/omtesting.so

%files diagtools
%defattr(-,root,root)
%{sbindir}/msggen
%{sbindir}/rsyslog_diag_hostname

%files snmp
%defattr(-,root,root)
%{_libdir}/rsyslog/omsnmp.so

%files mail
%defattr(-,root,root)
%{_libdir}/rsyslog/ommail.so
Чейндж лог отредактирован в соответствии с изменениями.
(Внимание, чейндлог приведен не целиком, для удобочитаемости.
При работе со спеком, вы не должны стирать старые записи
в чейнджлоге)

Код: Выделить всё

%changelog
* Thu Jul  9 2009 Andrew Clark <andrewclarkii@gmail.com> 4.2.0-1
- new version

* Wed Mar 05 2008 Peter Vrabec <pvrabec@redhat.com> 3.12.0-1
- upgrade
Теперь, попробуем собрать нашу программу. Для этого тарболл надо
поместить в директорию ~/rpmbuild/SOURCES/, а spec файл -
в директорию ~/rpmbuild/SPECS/. Для сборки программы
служит утилита rpmbuild. Нам необходимо собрать двоичный пакет,
поэтому вводим такую команду:

Код: Выделить всё

[andy@unit1 ~]$ rpmbuild -bb ~/rpmbuild/SPECS/rsyslog.spec
Сборку так же можно проводить по секциям, например ключ -bp
выполнит только секцию %prep. За более подробной информацией
по имеющимся ключам, обращайтесь к странице документации
man rpmbuild. Если сборка прошла успешно, то мы должны
увидеть в директории ~/rpmbuild/RPMS/i386/ несколько файлов
с расширением rpm.

Код: Выделить всё

[andy@unit1 ~]$ ls -lahi rpmbuild/RPMS/i386/
total 1,5M
17056534 drwxr-xr-x 2 andy andy 4,0K Июл 11 14:23 .
17055470 drwxrwxr-x 9 andy andy 4,0K Июл 11 10:21 ..
17056266 -rw-r--r-- 1 andy andy 422K Июл 11 14:23 rsyslog-4.2.0-1.i386.rpm
17056274 -rw-r--r-- 1 andy andy 970K Июл 11 14:23 rsyslog-debuginfo-4.2.0-1.i386.rpm
17056271 -rw-r--r-- 1 andy andy 8,5K Июл 11 14:23 rsyslog-diagtools-4.2.0-1.i386.rpm
17056269 -rw-r--r-- 1 andy andy  18K Июл 11 14:23 rsyslog-gssapi-4.2.0-1.i386.rpm
17056273 -rw-r--r-- 1 andy andy  13K Июл 11 14:23 rsyslog-mail-4.2.0-1.i386.rpm
17056267 -rw-r--r-- 1 andy andy  12K Июл 11 14:23 rsyslog-mysql-4.2.0-1.i386.rpm
17056268 -rw-r--r-- 1 andy andy  12K Июл 11 14:23 rsyslog-pgsql-4.2.0-1.i386.rpm
17056270 -rw-r--r-- 1 andy andy 9,6K Июл 11 14:23 rsyslog-rtinst-4.2.0-1.i386.rpm
17056272 -rw-r--r-- 1 andy andy  13K Июл 11 14:23 rsyslog-snmp-4.2.0-1.i386.rpm
[andy@unit1 ~]$
В принципе, можно начинать пользоваться имеющимися rpm файлами, однако,
если Вы содержите собственный репозиторий, или хотите убедиться в том,
что пакеты будут инсталлироваться без проблем на любой системе, тогда
необходимо произвести сборку в специальной сборочной среде именуемой mock.
Mock - это среда для сборки srpm пакетов в chroot. Содержание этого
самого chroot'а определяется в конфигурационном файле находящимся по адресу
/etc/mock/default.cfg. В нем много конфигурационных файлов, настроенных под разные
дистрибутивы. Нам нужен epel-5-i386.cfg. Его можно либо переименовать в default.cfg,
либо указывать вместе с ключом -r. При сборке в сборочной среде, mock будет
выкачивать пакеты из интернета, если подключение происходит через прокси,
в таком случае, надо добавить следующую строку в секцию [main], в конфигурационном файле:
proxy=http://имяпользователя:пароль@адреспрокси:порт

Поглядим, как собирается наш пакет в сборочной среде.
Для этого нам надо собрать srpm пакет, что мы и делаем:

Код: Выделить всё

[andy@unit1 ~]$ rpmbuild -bs ~/rpmbuild/SPECS/rsyslog.spec
warning: Could not canonicalize hostname: unit1.moskb
Wrote: /home/andy/rpmbuild/SRPMS/rsyslog-4.2.0-1.src.rpm
[andy@unit1 ~]$
После успешной сборки source rpm, можно собрать пакет в сборочной среде:

Код: Выделить всё

mock -v -r epel-5-i386 --rebuild /home/andy/rpmbuild/SRPMS/rsyslog-4.2.0-1.src.rpm
У меня mock вываливается с ошибкой о том, что не может найти файлы
cat и install. Для пересборки пакета без отчистки сборочной директории,
существует опция --no-clean. Добавим ее к нашей команде:

Код: Выделить всё

mock -v -r epel-5-i386 --no-clean --rebuild /home/andy/rpmbuild/SRPMS/rsyslog-4.2.0-1.src.rpm
Пакет должен успешно собраться.

При подготовке данной статьи, были использованы следующие материалы:
Red Hat RPM Guide - русский перевод
http://www.lexpr.ru/node/11

Maximum RPM
http://www.rpm.org/max-rpm-snapshot/index.html

CentOS wiki
http://wiki.centos.org/HowTos/SetupRpmBuildEnvironment

Fedora wiki
http://fedoraproject.org/wiki/PackageMa ... MockTricks

ALT Linux wiki
http://www.altlinux.org/%D0%A1%D0%B1%D0 ... 0%BE%D0%B2

А так же, советы Михаила Шигорина (mike@) и Сергея Кандылы (http://paix.org.ua)
Последний раз редактировалось Andy 2009-07-19 9:38:34, всего редактировалось 1 раз.
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

Andy
ст. лейтенант
Сообщения: 1117
Зарегистрирован: 2007-03-04 7:48:58
Откуда: Mytischi

Re: Создание и сборка собственных rpm пакетов

Непрочитанное сообщение Andy » 2009-07-19 9:36:54

Предложения по улучшению приветствуются.
Модераторы, прикрепите тему, пожалуйста.
Jul 16 19:37:15 freebsd sshd[4152]: Invalid user idiot from 210.75.200.104

paix
лейтенант
Сообщения: 863
Зарегистрирован: 2007-09-24 12:41:05
Откуда: dn.ua
Контактная информация:

Re: Создание и сборка собственных rpm пакетов

Непрочитанное сообщение paix » 2009-07-21 10:14:16

спасибо за статью ;)
В форматированном варианте выглядит читабельней, чем в plain text )


Меня уже долго мучает вопрос, как использовать mock, если нужно внести изменения в spec.

К примеру, имеем src.rpm какого-нибудь php5, и хотим собрать php с каким-нибудь хитрым экстеншеном, по умолчанию выключенным.
mock позволяет быстро, красиво и эфективно пересобрать готовый src.rpm, но как быть когда нужно изменение функционала...

В данной статье ты предлагаеш собрать src.rpm через rpmbuild -bs, но сие не выглядит слишком кошерно, т.к. для сборки система попросит установить все требуемые зависимости. Хотелось бы процесс пересборки полностью запихнуть в chroot окружение как это делает mock. Кроме того, преимущество mock в том, что он сам устанавливает зависимости.

Еще некоторые замечания.
Пишеш, что не рекомендуется собирать пакеты от рута, но в тоже время инсталируеш src.rpm от рута, с вытекающими копированиями, chown и т.д.
Устанавливать src.rpm следует от пользователя, под которым собираеш, тогда все это добро сразу инсталится в ~/rpmbuild/

Еще очень хотелось бы осветить тот факт, что с этого момента последующая поддержка сего кастомного пакета лежит на твоих плечах. И с выходом новой версии софтины (rsyslog) прийдется пересобирать по новой.
Хотелось бы в будущем увидеть дополнение про пересборку пакета в случае обновления софта.
With best wishes, Sergej Kandyla

Anton.M
рядовой
Сообщения: 37
Зарегистрирован: 2009-08-15 19:51:59
Откуда: Ukraine, Simferopol
Контактная информация:

Re: Создание и сборка собственных rpm пакетов

Непрочитанное сообщение Anton.M » 2009-08-15 21:16:22

paix писал(а): Меня уже долго мучает вопрос, как использовать mock, если нужно внести изменения в spec.
Устанавливаете srpm в базовой системе с опцией --nodeps, вносите изменения и создаёте собственный srpm.

Лично я предпочитаю все srpm'ы собирать только с помощью mock.
А в случае сборки для i386 из под amd64 это единственный (мне известный) безпроблемный вариант, когда год назад узнал о mock был в восторге :drinks:.

Цикл статей по сборке RPM и DEB пакетов (http://tigro.info/blog/index.php?id=375) (рекомендуется как дополнение авторской статьи)

Alex_hha
лейтенант
Сообщения: 755
Зарегистрирован: 2005-11-06 18:25:26
Контактная информация:

Re: Создание и сборка собственных rpm пакетов

Непрочитанное сообщение Alex_hha » 2009-08-15 23:01:28

А в случае сборки для i386 из под amd64 это единственный (мне известный) безпроблемный вариант, когда год назад узнал о mock был в восторге
а чем не устраивает buildarch?

Anton.M
рядовой
Сообщения: 37
Зарегистрирован: 2009-08-15 19:51:59
Откуда: Ukraine, Simferopol
Контактная информация:

Re: Создание и сборка собственных rpm пакетов

Непрочитанное сообщение Anton.M » 2009-08-16 12:07:01

Alex_hha писал(а):
А в случае сборки для i386 из под amd64 это единственный (мне известный) безпроблемный вариант, когда год назад узнал о mock был в восторге
а чем не устраивает buildarch?
Самый главный недостаток - количество возникающих warning'ов и ошибок при сборке для х86 на машине x86_64, постоянные попытки ld использовать 64-х битные библиотеки вместо 32х,
необходимость доставлять i386 библиотеки для нормальной линковки... До этого использовал buildarch, очень часто был :st: и :cz2:
ИМХО buildarch хорошо подходит для сборки внутри одной и той же архитектуры (сборка для 486,586 на архитектуре x86).

Alex_hha
лейтенант
Сообщения: 755
Зарегистрирован: 2005-11-06 18:25:26
Контактная информация:

Re: Создание и сборка собственных rpm пакетов

Непрочитанное сообщение Alex_hha » 2009-08-16 17:04:11

сборка для 486,586 на архитектуре x86
для этого есть target