systemdユニットファイルはどこに置きますか?


59

ユニットファイル用に2つのフォルダーがあることを読みました(ユーザーモードではありません)。

/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator

:この理解と競合すると、次の答えですhttps://unix.stackexchange.com/a/47715/33386。何が起こっているのか理解できるように、誰かが不足している情報を記入できますか?(更新:答えが更新され、私の理解はそれと矛盾しなくなりました。

また、スクリプトはフォルダー内のサブフォルダーに整理されているようです/etc/systemd/system/

getty.target.wants
multi-user.target.wants

別の場所に他の場所があることを読みました。これらはユーザー固有のサービス用であるようです。

/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.

更新2015-08-31:

他の人のために、私が最近尋ねた関連する質問へのリンクがありますsystemdユニットによって実行されるスクリプトはどこに置きますか?


4
/etc/systemd/systemは、スクリプト配置する場所であり、pacmanはパッケージスクリプトを配置し/usr/lib/systemd/system、発行systemctl enable foo.serviceするシンボリックリンクを作成/usr/etcます...
jasonwryan

1
参照man systemd.target:グループ化の背後にある理由を説明しています。
-jasonwryan

回答:


57

システムユニットファイルを配置するのに最適な場所: /etc/systemd/system [インストール]セクションの下にターゲットを追加するようにしてください。詳細については。 UPDATE/usr/local/lib/systemd/systemもう1つのオプションです。詳細については、「グレー領域」を参照してください。

ユーザーユニットファイルを置くのに最適な場所: /etc/systemd/userまたは$HOME/.config/systemd/user 、許可と状況に依存します。

真実は、システム化されたユニット(またはイントロ文でそれらを「ユニット構成」と呼ぶ)はどこにでも行くことができるということです。systemctl daemon-reloadいくつかの正当な理由により、ユニットを見つけやすい場所に置くことが簡単になります。

  • 標準の場所を使用するということは、systemdジェネレーターがそれらを見つけて、起動時に簡単に有効にできることを意味しますsystemctl enable。これは、ユニットがユニット依存関係ツリー(ユニットキャッシュ)に自動的に追加されるためです。
  • 適切な特権ユーザーのみが指定された領域に書き込むことができるため、権限について考える必要はありません。

どうやってわかるの?

そしてsystemctl enable、シンボリックリンクを作成する場所を正確にどのように知っていますか?[install]セクションの下のユニット自体にハードコーディングします。通常、次のような行があります

[Install]
WantedBy = multi-user.target

ファイルシステム上の事前定義された場所に対応します。この方法で、systemctlこのユニットはユニットファイルのグループに依存していることがわかりますmulti-user.target(「ターゲット」はユニット依存グループを指定するために使用される用語です。すべてのグループをでリストできますsystemctl list-units --type target)。ターゲットとともにロードされるユニットファイルのグループは、targetname.target.wantsディレクトリに配置されます。これは、シンボリックリンク(または本物)でいっぱいのディレクトリです。あなたの場合は[Install]セクションが言うことはあるが、それへのシンボリックリンクが存在しない場合は、ディレクトリ、それはロードされません。systemdユニットジェネレーターは、起動時にユニットファイルを依存関係ツリーキャッシュに追加すると(手動でジェネレーターをトリガーできます)、シンボリックリンクを配置する場所(この場合はディレクトリ)を自動的に認識しますWantedBymulti-user.targetmulti-user.target.wantssystemctl daemon-reload/etc/systemd/system/multi-user.target.wants/ 有効にする必要があります。

マニュアルのキーポイント:

追加のユニットは、ユニットのロードパス上にないディレクトリからsystemdにロード(「リンク」)される場合があります。systemctl(1)のlinkコマンドを参照してください。

systemctlで、Unit Fileコマンドを探します

ユニットファイルのロードパス

ユニットファイルは、コンパイル中に決定された一連のパスからロードされます。これについては、以下の2つの表で説明します。前述のディレクトリで見つかったユニットファイルは、リストの下のディレクトリにある同じ名前のファイルを上書きします。

変数$SYSTEMD_UNIT_PATHが設定されると、この変数の内容がユニットロードパスをオーバーライドします。$SYSTEMD_UNIT_PATH空のコンポーネント( ":")で終わる場合、通常のユニットロードパスが変数の内容に追加されます。

表1と表2 man systemd.unitは良好です。

システムモードで実行するときにパスをロードします(--system)。

  • /etc/systemd/system ローカル設定
  • /run/systemd/system ランタイムユニット
  • /usr/lib/systemd/system インストール済みパッケージの単位

ユーザーモードで実行中のロードパス(--user

ユーザー単位とすべて/グローバルユーザー単位には違いがあります。

ユーザー依存

  • $XDG_CONFIG_HOME/systemd/user ユーザー構成($XDG_CONFIG_HOME設定されている場合のみ使用)
  • $HOME/.config/systemd/user ユーザー構成($XDG_CONFIG_HOME設定されていない場合のみ使用)
  • $XDG_RUNTIME_DIR/systemd/user ランタイム単位($XDG_RUNTIME_DIRが設定されている場合にのみ使用)

  • $XDG_DATA_HOME/systemd/user ホームディレクトリにインストールされているパッケージの単位($XDG_DATA_HOMEが設定されている場合のみ使用)

  • $HOME/.local/share/systemd/user ホームディレクトリにインストールされているパッケージの単位($XDG_DATA_HOMEが設定されていない場合のみ使用)

--global (すべてのユーザー)

すべてのユーザーに適用されるユニット-各ユーザーが所有することも意味します。そのため、管理者が起動時にサービスを有効にしている場合でも、各ユーザーはこれらのサービスを停止できます。

  • /etc/systemd/user すべてのユーザーのローカル構成(systemctl --global enable userunit.service
  • /usr/lib/systemd/user すべてのユーザーに対してシステム全体にインストールされているパッケージの単位
  • /run/systemd/user ランタイムユニット

グレーエリア

一方では、ファイル階層標準/etcは、バイナリを実行しないローカル構成用であることを指定しています。一方、/usr/local/「ソフトウェアをローカルにインストールするときにシステム管理者が使用する」ことを指定します。また、(組織の目的だけでなくとも)すべてのシステムユニットファイルを管理する必要があると主張することもできます/usr/local/lib/systemd/systemが、これはパッケージマネージャーからではなく「ソフトウェア」の一部であるユニットファイルを対象としています。システム全体に対応するsystemdユーザーユニットは、になり /usr/local/lib/systemd/userます。


にユニットファイルを配置する/etc/systemd/systemことに関するアドバイスは、自分で作成したユニットファイルに関する一般的なアドバイスですか?パッケージマネージャーによってインストールされたものはすべて/usr/lib/systemd/system、たとえば、
slm

@slmはい、質問が私の systemdユニットファイルに言及している場合、それは自分で作成したユニットファイルを意味するものです。
ジョナサンコマー

私は区別します:(/etc/systemd/user保証された)システム全体のユーザーサービスと~/.config/systemd/userカスタムユーザー固有のサービス。
スウエギ

16

/etc/systemd/systemあなたが置く場所で、あなたのスクリプトを、パックマンは、置くパッケージでスクリプトを/usr/lib/systemd/system

発行systemctl enable foo.serviceすると、から/usrへのシンボリックリンクが作成され/etcます。詳細については、「ユニットロードパス」セクションを参照してくださいman systemd.unit(5)


@ macmadness86それは質問とは無関係であるため欠落しています。
-jasonwryan

1

私は3つ、1つはntpd、もう1つは静的なイーサネットカード、もう1つp0fはパッシブOS識別子を実行するために記述しました。全部入れました/etc/systemd/system。私は多分systemdNTPのようなものを扱うことができるように見えますが、私はそれにそれほど頼りたくないと思います。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.