openSUSE:Сборка пакетов с поддержкой systemd

Перейти к: навигация, поиск
Эта статья описывает процесс добавления файлов служб systemd в создаваемые пакеты.

Макросы RPM

Начиная с openSUSE 12.1 некоторые RPM макросы могут быть использованы для упаковки файлов служб systemd.

Зависимости времени сборки

Для указания зависимостей времени сборки просто добавьте следующий текст в свой spec-файл:

%if 0%{?suse_version} >= 1210
BuildRequires: systemd-rpm-macros
%endif

Зависимости

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

%{?systemd_requires}

Файлы служб

Файлы служб (как, например, service-, socket- и path-) всегда должны устанавливаться в каталог %_unitdir (то есть /usr/lib/systemd/system) и, ни в коем случае, не в /etc/systemd/system (таким образом пользователь сможет их переопределить, не влияя на файлы принадлежащие установленным пакетам).

This command is an example of a legal install line where %{S:3} is a reference to your service file:

%__install -D -m 644 %{S:3} %{buildroot}%{_unitdir}/foo.service

Service files should be considered not to be edited by system administrators. For this the directory /etc/systemd/system exists. A service file named foo.service should be overriden by the system administrator creating a file /etc/systemd/system/foo.service.d/my.conf

If an instantiated service is needed, then the service file packaged with the RPM should be installed to foo@.service. Thus this command is a legal install line:

%__install -D -m 444 %{S:3} %{buildroot}%{_unitdir}/foo@.service

The user should instantiate the service via a command like:

sytemctl enable autossh@${my-instance}.service

and override the service file by the system administrator creating a file /etc/systemd/system/foo@${my-instance}.service.d/my.conf

Thus each instance must be individually instantiated and overridden by the system administrator.

Регистрация служб при выполнении установки

Добавьте представленный ниже макрос в свой сценарий (foo.service и bar.service — две разных службы systemd):

%pre
%service_add_pre foo.service bar.service

%post
%service_add_post foo.service bar.service

%preun
%service_del_preun foo.service bar.service

%postun
%service_del_postun foo.service bar.service
Localize.png Эта статья содержит фрагменты на иностранном языке. Вы можете помочь переведя её до конца. (cм. руководство по переводу)

If your package is also providing sysv initscripts, those macros will handle sysv initscripts migration transparently (as long as initscripts and systemd services have similar names).

If your package is supposed to build for openSUSE older than 12.1, you should use condition test for those macros.

Активация служб

By default, services are not enabled when package is installed. If you want your service to be enabled by default, you should do a submit request (with OBS) on systemd-presets-branding-openSUSE package, modifying default-openSUSE.preset file by adding :

enable your_service_name.service

Создание файлов (подкаталогов) в /var/run и /run

Since openSUSE 12.2, /var/run (which is either bind mounted or symlinked to /run ) are mounted as tmpfs, so packages should not contain any directories (or files) under /var/run (or /run), since they will disappear at the next reboot.

If new files / directories need to be created there, you should package a tmpfiles.d file (see man tmpfiles.d for the syntax), installed in /usr/lib/tmpfiles.d/. One example of such a file:

# create a directory with permissions 0770 owned by user foo and group bar
d /var/run/my_new_directory 0770 foo bar

You should install them in %install section like this:

%{__install} -d -m 0755 %{buildroot}/usr/lib/tmpfiles.d/
%{__install} -m 0644 %{SOURCE4} %{buildroot}/usr/lib/tmpfiles.d/%{name}.conf

При необходимости, чтобы файл (или директория) были доступны после установки пакета (и до перезагрузки), то не забудьте добавить следующую строку в секцию %post :

systemd-tmpfiles --create /usr/lib/tmpfiles.d/<file_name>
Вместо
/usr/lib/tmpfiles.d
также можно использовать макрос %_tmpfilesdir начиная с версии 13.1. Для более ранних выпусков нужно добавить следующую строку в начало spec-файла:
%{!?_tmpfilesdir:%global _tmpfilesdir /usr/lib/tmpfiles.d}

Обратная совместимость

При возможности, сохраните ссылку на файл /usr/sbin/rcname. Чтобы заставить его работать с Systemd создайте ссылку в /usr/sbin/service для каждого юнита (службы и цели поддерживаются):

openSUSE 13.1 или новее:

ln -s /usr/sbin/service %{buildroot}%{_sbindir}/rcname

openSUSE 12.3:

ln -s /sbin/service %{buildroot}%{_sbindir}/rcname