ユニットファイル用のフォルダが2つあることを読みました(ユーザーモードではありません)。
/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator
この理解と矛盾するのは、この質問に対する答えです。Systemdのスタートアップスクリプトを作成する方法。誰かが不足している情報を記入して、何が起こっているのかを理解することはできますか? (更新:回答が更新され、私の理解が矛盾することはなくなりました。 )
また、スクリプトは / 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ユニットによって実行されるスクリプトをどこに置くのですか?
承認された回答:
システムを配置するのに最適な場所 ユニットファイル: / etc / systemd / system 必ず[インストール]セクションの下にターゲットを追加してください。「どうやってそれを知るのですか?」を読んでください。詳細については。 更新 : / usr / local / lib / systemd / system 別のオプションです。詳細については、「灰色の領域」をお読みください。
ユーザーを配置するのに最適な場所 ユニットファイル: / etc / systemd / user または$HOME / .config / systemd / user ただし、権限と状況によって異なります。
真実は、systemdユニット(またはイントロ文で「ユニット構成」と呼ばれる)はどこにでも移動できるということです。 —手動のシンボリックリンクを作成する意思があり、警告を認識している場合。 systemctl daemon-reloadにユニットを配置するのが簡単になります いくつかの正当な理由でそれを見つけることができます:
- 標準の場所を使用するということは、systemdジェネレーターがそれらを見つけて、
systemctl enableを使用して起動時に簡単に有効にできることを意味します。 。これは、ユニットがユニット依存関係ツリー(ユニットキャッシュ)に自動的に追加されるためです。 - 指定された領域に書き込むことができるのは適切な特権ユーザーのみであるため、権限について考える必要はありません。
どうやってわかりますか?
そして、systemctlはどのように正確に有効にしますか シンボリックリンクを作成する場所を知っていますか? [install]の下の
ユニット自体にハードコーディングします セクション。通常、
[Install]
WantedBy = multi-user.target
これは、ファイルシステム上の事前定義された場所に対応します。
このように、 systemctl このユニットがmulti-user.targetと呼ばれるユニットファイルのグループに依存していることを認識しています (「ターゲット」は、ユニットの依存関係グループを指定するために使用される用語です。 systemctl list-units --type targetを使用してすべてのグループを一覧表示できます。 )。ターゲットとともにロードされるユニットファイルのグループは、 targetname.target.wantsに配置されます。 ディレクトリ。これは、シンボリックリンク(または本物)でいっぱいのディレクトリです。 [Install]の場合 セクションには、 WantedByと記載されています multi-user.target 、ただし、そのシンボリックリンクが multi-user.target.wantsに存在しない場合 ディレクトリの場合、ロードされません。 systemdユニットジェネレーターが起動時にユニットファイルを依存関係ツリーキャッシュに追加する場合( systemctl daemon-reloadを使用してジェネレーターを手動でトリガーできます )、シンボリックリンクを配置する場所(この場合はディレクトリ /etc/systemd/system/multi-user.target.wants/ )を自動的に認識します。 有効にする必要があります。
マニュアルの要点:
追加のユニットは、ユニットのロードパス上にない
ディレクトリからsystemd(「リンク」)にロードされる場合があります。
systemctl(1)のlinkコマンドを参照してください。
systemctlで、ユニットファイルコマンドを探します。
ユニットファイルのロードパス
man systemd.unitからの次の引用の最初の文を読んで理解してください (これは、systemdが異なるパスでコンパイルされている場合、ここで説明するすべてのパスが適用されない可能性があることを意味するため):
ユニットファイルは、以下の2つの表で説明されている、コンパイル中に決定された一連のパスからロードされます。以前にリストされたディレクトリで見つかったユニットファイルは、リストの下のディレクトリにある同じ名前のファイルを上書きします。
変数
$SYSTEMD_UNIT_PATHの場合 が設定されている場合、この変数の内容はユニットのロードパスを上書きします。$ SYSTEMD_UNIT_PATHの場合 空のコンポーネント(「:」)で終わる場合、通常のユニットロードパスが変数の内容に追加されます。
man systemd.unitの表1と表2 良いです。
システムモードで実行しているときにパスをロードする(-system 。
-
/ etc / systemd / systemローカル構成 -
/ run / systemd / systemランタイムユニット -
/ usr / lib / systemd / systemインストールされたパッケージの単位(または/ lib / systemd / system場合によっては、man systemd.unitを読んでください。 )
ユーザーモードで実行している場合のロードパス(-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の場合にのみ使用されます 設定されていません)
-グローバルコード> (すべてのユーザー)
すべてのユーザーに適用される単位-各ユーザーが所有することも意味します。そのため、管理者が起動時にこれらのサービスを有効にしても、各ユーザーはこれらのサービスを停止できます。
-
/ etc / systemd / userすべてのユーザーのローカル構成(systemctl --global enable userunit.service) -
/ usr / lib / systemd / userすべてのユーザー(または/ lib / systemd / system)に対してシステム全体にインストールされたパッケージの単位 場合によっては、man systemd.unitを読んでください) -
/ run / systemd / userランタイムユニット
グレーエリア
一方では、ファイル階層標準は / etcを指定しています バイナリを実行しないローカル構成用です。一方、
は、 / usr / local /を指定します 「ソフトウェアをローカルにインストールするときにシステム管理者が使用するためのものです」。また、(組織化の目的だけでなく)すべてのシステムユニットファイルを / usr / local / lib / systemd / systemの下に置く必要があると主張することもできます。 、ただし、これはパッケージマネージャーからではなく「ソフトウェア」の一部であるユニットファイルを対象としています。
システム全体の対応するsystemdユーザーユニットは、 / usr / local / lib /systemd/の下にあります。ユーザー 。
トランジェントユニット
もう一つの忘れられた場所はどこにもありません!おそらくあまり知られていないプログラムはsystemd-run 。これを使用して、一時的なユニットをその場で実行できます。 man systemd-runを参照してください 。
たとえば、明日の午前4時に再起動をスケジュールするには(-force が必要になる場合があります) 再起動が確実に行われるようにするため):
systemd-run -u restart --description="Restarts machine" --on-calendar="2020-12-18 00:04:00" systemctl --force reboot
これにより、一時的なユニットファイル restart.serviceが生成されます。 および対応するタイマー(-on-calendar のため) 、transient =yesで示されます 。
/run/systemd/transient/restart.service
# This is a transient unit file, created programmatically via the systemd API. Do not edit.
[Unit]
Description=Restarts machine
[Service]
ExecStart=
ExecStart="/usr/bin/systemctl" "--force" "reboot"
より危険なダブルフォースオプション-force--forceもあることに注意してください 、これはカーネルにすぐに停止するように指示します(そして、何をしているのかわからない場合は、電源を切るのとほぼ同じであるため、安全ではありません)。