web-dev-qa-db-ja.com

systemdユニットファイルはどこに置くのですか?

I read (ユーザーモードではなく)ユニットファイル用のフォルダーが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 。誰かが不足している情報を記入して、何が起こっているのかを理解できますか? (UPDATE:回答が更新され、私の理解がそれと矛盾することはなくなりました。

また、スクリプトは/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ユニットによって実行されるスクリプトはどこに置くのですか?

81
Jonathan Komar

最適な配置場所systemユニットファイル:/etc/systemd/system必ず追加してください[インストール]セクションのターゲットで、「どうやって知るのですか?」を読んでください。詳細については。 [〜#〜]更新[〜#〜]/usr/local/lib/systemd/systemは別のオプションです。詳細は「グレー領域」を参照してください。 "

配置するのに最適な場所userユニットファイル:/etc/systemd/userまたは$HOME/.config/systemd/userしかしそれは許可と状況に依存します。

真実は、systemdユニット(または導入文で「ユニット構成」と呼ばれているように)はどこにでも移動できるどこでも—手動でシンボリックリンクを作成する場合そしてあなたは警告を知っています。ユニットを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]セクションにWantedBymulti-user.targetであると記載されていても、そのシンボリックリンクがmulti-user.target.wantsディレクトリに存在しない場合、ロードされません。 systemdユニットジェネレーターが起動時に依存関係ツリーキャッシュにユニットファイルを追加すると(systemctl daemon-reloadでジェネレーターを手動でトリガーできます)、シンボリックリンクを配置する場所を自動的に認識します。この場合は/etc/systemd/system/multi-user.target.wants/有効にする必要があります。

マニュアルの要点:

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

Systemctlの下で、Unit File Commandsを探します

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

ユニットファイルは、コンパイル中に決定された一連のパスから読み込まれます。以前にリストされたディレクトリで見つかったユニットファイルは、リストの下のディレクトリにある同じ名前のファイルをオーバーライドします。

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

man systemd.unitの表1と表2は適切です。

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

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

ユーザーモードで実行するときにパスを読み込む(--user

ユーザーあたりの単位とall/globalユーザーの単位には違いがあります。

ユーザー依存

  • $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ランタイムユニット

灰色の領域

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

79
Jonathan Komar

_/etc/systemd/system_はyourスクリプトを配置する場所で、pacmanはpackageスクリプトを_/usr/lib/systemd/system_に配置します。

_systemctl enable foo.service_を発行すると、_/usr_から_/etc_へのシンボリックリンクが作成されます。詳細については、man systemd.unit(5)のUnit Load Pathセクションを参照してください。

19
jasonwryan

3つはntpd用、もう1つは静的イーサネットカード用、そしてもう1つはパッシブOS識別子であるp0fを実行するために作成しました。それらをすべて/etc/systemd/systemに入れます。おそらくsystemdにNTPのものを処理させることができるように見えますが、それほどそれには依存したくないと思います。

1
Bruce Ediger