openSUSE:Systemd パッケージングガイドライン
目次
RPM マクロ
openSUSE 12.1 以降のバージョンでは、 systemd のサービスファイルをパッケージ化する際、使用しなければならないマクロがあります。
構築時要件 (BuildRequires)
必ず下記を spec ファイル内に追加してください:
%if 0%{?suse_version} >= 1210 BuildRequires: systemd %endif
パッケージ要件 (Requires)
下記を spec ファイルに追加して、必要な依存関係をパッケージに追加できるようにしてください:
%{?systemd_requires}
サービスファイル
サービスファイルは必ず %_unitdir (/usr/lib/systemd/system
) ディレクトリにインストールする必要があります。 /etc/systemd/system
内にはインストールしてはなりません (そのためもパッケージングの際に矛盾なくユーザ側で上書きできます) 。
インストールスクリプト内でのサービス登録
お使いのスクリプト内に下記のマクロを追加します:
たとえば foo.service bar.service
の 2 つの 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
お使いのパッケージが sysv init スクリプトも提供している場合は、これらのマクロで sysv init スクリプトを等価的に移行する処理も行います (init スクリプトと systemd のサービス名が似通った名前の場合のみ) 。
お使いのパッケージが openSUSE 12.1 以前に対して構築する必要がある場合は、これらのマクロに条件分岐を設定する必要があります。
サービスの有効化
既定では、パッケージをインストールしてもサービスは有効化されません。サービスを既定で有効化したい場合は、 OBS の systemd-presets-branding-openSUSE
パッケージに対して submit request を送信し、 default-openSUSE.preset
ファイル内に下記の行を追加するように依頼してください:
enable (サービス名).service
/var/run や /run 内のファイル/サブディレクトリ作成について
openSUSE 12.2 以降のバージョンでは、 /var/run (バインドマウントまたは /run へのシンボリックリンクになっています) は tmpfs でマウントされるため、/var/run (または /run) のディレクトリ内にファイルを配置するようなパッケージ構成にしてはなりません。 tmpfs はメモリ内にのみ保存されるため、システムを再起動すると消えてしまうためです。
上記のディレクトリ内にファイルやディレクトリを作成したい場合は、 tmpfiles.d ファイル (書式について詳しくは tmpfiles.d を参照) をパッケージに含めていただき、 /usr/lib/tmpfiles.d/ 内にインストールするように設定してください。たとえば下記のようになります:
# ユーザ foo, グループ bar が所有し、パーミッション 0770 でディレクトリを作成する d /var/run/my_new_directory 0770 foo bar
%install セクションでは下記のようにしてインストールします:
%{__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>
13.1 以降のバージョンでは、 /usr/lib/tmpfiles.d を指定する代わりに、 %_tmpfilesdir マクロを使用することもできます。それ以前のバージョンをお使いの場合は、 spec ファイルの冒頭に下記のように追加してください:
%{!?_tmpfilesdir:%global _tmpfilesdir /usr/lib/tmpfiles.d}
後方互換性
rc シンボリックリンク
/usr/sbin/rc名前 のシンボリックリンクを維持することもできます。 systemd でこれらを使いたい場合は、各ユニットに対して /usr/sbin/service へのシンボリックリンクを作成してください (サービスおよびターゲットに対応しています):
ln -s /usr/sbin/service %{buildroot}%{_sbindir}/rcname
追加の動作
init スクリプトには start/stop/status などの通常の動作に加えて、追加の動作を提供している場合があります。 systemd のサービスファイルでは、このような追加の機能には対応していませんが、サービスによってはあったほうが便利な場合もあります。そのため、 /usr/sbin/service では Fedora のような "レガシーアクション" としてそれらに対応しています。
たとえば従来の init スクリプトが "foo" という名称で、 "frob" というアクションに対応していたものとします。また、サービスファイルは "foo.service" というファイル名で、 "frob" という動作に対応させたいものとします。 2014-03-11 (13.1 より後のバージョン) の Factory では、下記のようなスクリプトファイルを作成することで、対応できるようになりました:
/usr/lib/initscripts/legacy-actions/foo/frob
なお、上記のアクションは /usr/sbin/service 経由で呼び出された場合にのみ利用することができます。たとえば
# service foo frob
または
# rcfoo frob
のように実行します。