開発者ドキュメント

SystemdUnitsとUnitFilesを理解する

序章

ますます、Linuxディストリビューションは systemd initシステム。 この強力なソフトウェアスイートは、サービスからマウントされたデバイスやシステムの状態まで、サーバーの多くの側面を管理できます。

systemdunit システムが操作および管理する方法を知っているリソースを指します。 これは、 systemd ツールは対処方法を知っています。 これらのリソースは、ユニットファイルと呼ばれる構成ファイルを使用して定義されます。

このガイドでは、さまざまなユニットを紹介します systemd 処理できます。 また、これらのリソースがシステムで処理される方法を形作るために、ユニットファイルで使用できる多くのディレクティブのいくつかについても説明します。

Systemdユニットはあなたに何を与えますか?

単位は、 systemd 管理する方法を知っています。 これらは基本的に、一連のデーモンによって管理され、提供されたユーティリティによって操作できるシステムリソースの標準化された表現です。

ユニットは、他のinitシステムのサービスやジョブに類似していると言えます。 ただし、ユニットには、サービス、ネットワークリソース、デバイス、ファイルシステムマウント、および分離されたリソースプールを抽象化するために使用できるため、はるかに広い定義があります。

他のinitシステムでは、1つの統合されたサービス定義で処理できるという考えは、焦点に応じてコンポーネントユニットに分割できます。 これは機能ごとに整理されており、ユニットのコア動作を変更することなく、機能を簡単に有効化、無効化、または拡張できます。

ユニットが簡単に実装できるいくつかの機能は次のとおりです。

他にも多くの利点があります systemd ユニットは他のinitシステムの作業項目を上回っていますが、これにより、ネイティブ構成ディレクティブを使用して活用できる能力についてのアイデアが得られるはずです。

Systemd Unitファイルはどこにありますか?

方法を定義するファイル systemd ユニットを処理するは、それぞれが異なる優先順位と影響を持っている多くの異なる場所で見つけることができます。

システムのユニットファイルのコピーは、通常、 /lib/systemd/system ディレクトリ。 ソフトウェアがシステムにユニットファイルをインストールする場合、これはデフォルトでそれらが配置される場所です。

ここに保存されているユニットファイルは、セッション中にオンデマンドで開始および停止できます。 これは一般的なバニラユニットファイルであり、多くの場合、デプロイするすべてのシステムで動作する必要があるアップストリームプロジェクトのメンテナによって作成されます。 systemd その標準的な実装で。 このディレクトリ内のファイルは編集しないでください。 代わりに、必要に応じて、この場所のファイルに優先する別のユニットファイルの場所を使用してファイルを上書きする必要があります。

ユニットの機能を変更したい場合は、そのための最適な場所は /etc/systemd/system ディレクトリ。 このディレクトリの場所にあるユニットファイルは、ファイルシステム上の他のどの場所よりも優先されます。 システムのユニットファイルのコピーを変更する必要がある場合は、このディレクトリに置換を配置することが、これを行うための最も安全で柔軟な方法です。

システムのユニットファイルから特定のディレクティブのみをオーバーライドする場合は、実際にはサブディレクトリ内にユニットファイルスニペットを提供できます。 これらは、システムのコピーのディレクティブを追加または変更し、変更するオプションのみを指定できるようにします。

これを行う正しい方法は、ユニットファイルにちなんで名付けられたディレクトリを作成することです。 .d 最後に追加。 だからと呼ばれるユニットのために example.service、というサブディレクトリ example.service.d 作成することができます。 このディレクトリ内で、 .conf システムのユニットファイルの属性を上書きまたは拡張するために使用できます。

実行時の単位定義の場所もあります /run/systemd/system. このディレクトリにあるユニットファイルは、 /etc/systemd/system/lib/systemd/system. この場所のファイルには、前者の場所よりも重みが少なくなりますが、後者の場所よりも重みが大きくなります。

The systemd プロセス自体は、実行時に作成される動的に作成されたユニットファイルにこの場所を使用します。 このディレクトリを使用して、セッション中のシステムのユニットの動作を変更できます。 サーバーを再起動すると、このディレクトリで行われたすべての変更が失われます。

ユニットの種類

Systemd 記述しているリソースのタイプに応じてユニットを分類します。 ユニットのタイプを判別する最も簡単な方法は、リソース名の末尾に追加されるタイプ接尾辞を使用することです。 次のリストは、 systemd:

ご覧のとおり、さまざまなユニットがあります systemd 管理する方法を知っています。 ユニットタイプの多くは、機能を追加するために連携して機能します。 たとえば、一部のユニットは、他のユニットをトリガーし、アクティベーション機能を提供するために使用されます。

主に焦点を当てます .service それらの有用性と管理者がこれらのユニットを管理する必要がある一貫性のためにユニット。

ユニットファイルの構造

ユニットファイルの内部構造はセクションで構成されています。 セクションは、角括弧のペアで示されます。[” と “]」で囲まれたセクション名。 各セクションは、次のセクションの先頭またはファイルの末尾まで拡張されます。

ユニットファイルの一般的な特性

セクション名は明確に定義されており、大文字と小文字が区別されます。 だから、セクション [Unit] 次のように綴られている場合、は正しく解釈されません [UNIT]. 非標準セクションを追加して、以外のアプリケーションで解析する必要がある場合 systemd、追加できます X- セクション名のプレフィックス。

これらのセクション内で、ユニットの動作とメタデータは、次のように等号で示される割り当てを持つキー値形式を使用した単純なディレクティブを使用して定義されます。

[Section]
Directive1=value
Directive2=value

. . .

オーバーライドファイルの場合( unit.type.d ディレクトリ)、ディレクティブは空の文字列に割り当てることでリセットできます。 たとえば、システムのユニットファイルのコピーには、次のような値に設定されたディレクティブが含まれている場合があります。

Directive1=default_value

The default_value 参照することにより、オーバーライドファイルで削除できます Directive1 次のように、値なしで:

Directive1=

一般に、 systemd 簡単で柔軟な構成が可能です。 たとえば、複数のブール式が受け入れられます(1, yes, on、 と true 肯定的で 0, no off、 と false 反対の答えのために)。 時間はインテリジェントに解析でき、単位のない値には秒が想定され、内部で複数の形式を組み合わせることができます。

[ユニット]セクションディレクティブ

ほとんどのユニットファイルにある最初のセクションは [Unit] セクション。 これは通常、ユニットのメタデータを定義し、ユニットと他のユニットとの関係を構成するために使用されます。

セクションの順序は重要ではありませんが systemd ファイルを解析するとき、このセクションはユニットの概要を提供するため、多くの場合上部に配置されます。 あなたがで見つけるいくつかの一般的なディレクティブ [Unit] セクションは次のとおりです。

これらのディレクティブと他のいくつかのディレクティブを使用して、ユニットと他のユニットおよびオペレーティングシステムとの関係に関する一般的な情報を確立できます。

[インストール]セクションディレクティブ

ユニットファイルの反対側では、最後のセクションは多くの場合、 [Install] セクション。 このセクションはオプションであり、動作またはユニットが有効または無効になっている場合にそれを定義するために使用されます。 ユニットを有効にすると、起動時に自動的に起動するようにマークされます。 本質的に、これは、問題のユニットを、起動時に開始されるユニットのラインのどこかにある別のユニットにラッチすることによって実現されます。

このため、有効にできるユニットのみがこのセクションを持ちます。 内のディレクティブは、ユニットが有効になっているときに何が起こるかを指示します。

ユニット固有のセクションディレクティブ

前の2つのセクションに挟まれて、ユニットタイプ固有のセクションが見つかる可能性があります。 ほとんどのユニットタイプは、特定のタイプにのみ適用されるディレクティブを提供します。 これらは、タイプにちなんで名付けられたセクション内で利用できます。 ここではそれらについて簡単に説明します。

The device, target, snapshot、 と scope ユニットタイプにはユニット固有のディレクティブがないため、そのタイプに関連するセクションはありません。

[サービス]セクション

The [Service] セクションは、サービスにのみ適用可能な構成を提供するために使用されます。

内で指定する必要がある基本的なものの1つ [Service] セクションは Type= サービスの。 これにより、サービスがプロセスとデーモン化の動作によって分類されます。 これは重要です systemd セルビアを正しく管理し、その状態を確認する方法。

The Type= ディレクティブは、次のいずれかになります。

特定のサービスタイプを使用する場合、いくつかの追加のディレクティブが必要になる場合があります。 例えば:

これまで、いくつかの前提条件情報について説明してきましたが、実際にはサービスの管理方法を定義していません。 これを行うためのディレクティブは次のとおりです。

[ソケット]セクション

ソケットユニットはで非常に一般的です systemd 多くのサービスがソケットベースのアクティベーションを実装して、より優れた並列化と柔軟性を提供するため、構成。 各ソケットユニットには、ソケットがアクティビティを受信したときにアクティブになる対応するサービスユニットが必要です。

サービス自体の外部でソケット制御を解除することにより、ソケットを早期に初期化でき、関連するサービスを並行して開始できることがよくあります。 デフォルトでは、ソケット名は接続を受信すると同じ名前のサービスを開始しようとします。 サービスが初期化されると、ソケットがサービスに渡され、バッファリングされた要求の処理を開始できるようになります。

実際のソケットを指定するには、次のディレクティブが一般的です。

リスニングディレクティブにはさらに多くの種類がありますが、上記のものが最も一般的です。

ソケットの他の特性は、追加のディレクティブを介して制御できます。

[マウント]セクション

マウントユニットにより、内部からのマウントポイント管理が可能になります systemd. マウントポイントは、変換アルゴリズムが適用された、それらが制御するディレクトリにちなんで名付けられます。

たとえば、先頭のスラッシュが削除され、他のすべてのスラッシュがダッシュ「-」に変換され、すべてのダッシュと印刷できない文字がCスタイルのエスケープコードに置き換えられます。 この変換の結果は、マウントユニット名として使用されます。 マウントユニットは、階層内でその上位にある他のマウントに暗黙的に依存します。

マウントユニットは、多くの場合、から直接変換されます /etc/fstab 起動プロセス中のファイル。 自動的に作成されたユニット定義と、ユニットファイルで定義したいユニット定義には、次のディレクティブが役立ちます。

[自動マウント]セクション

このユニットは、関連付けられたを許可します .mount 起動時に自動的に取り付けられるユニット。 と同じように .mount ユニットの場合、これらのユニットは、変換されたマウントポイントのパスにちなんで名前を付ける必要があります。

The [Automount] セクションは非常に単純で、次の2つのオプションのみが許可されています。

[スワップ]セクション

スワップユニットは、システムのスワップスペースを構成するために使用されます。 ユニットには、上記で説明したのと同じファイルシステム変換を使用して、スワップファイルまたはスワップデバイスにちなんで名前を付ける必要があります。

マウントオプションと同様に、スワップユニットはから自動的に作成できます /etc/fstab エントリ、または専用のユニットファイルを介して構成できます。

The [Swap] ユニットファイルのセクションには、構成に関する次のディレクティブを含めることができます。

[パス]セクション

パスユニットは、ファイルシステムパスを定義します。 systmed 変更を監視できます。 パスの場所で特定のアクティビティが検出されたときにアクティブになる別のユニットが存在する必要があります。 パスアクティビティは徹底的に決定されます inotify イベント。

The [Path] ユニットファイルのセクションには、次のディレクティブを含めることができます。

[タイマー]セクション

タイマーユニットは、特定の時間または特定の遅延後に動作するようにタスクをスケジュールするために使用されます。 このユニットタイプは、 cronat デーモン。 タイマーに達したときにアクティブになる関連ユニットを提供する必要があります。

The [Timer] ユニットファイルのセクションには、次のディレクティブの一部を含めることができます。

[スライス]セクション

The [Slice] ユニットファイルのセクションには実際には何もありません .slice ユニット固有の構成。 代わりに、上記の多くのユニットで実際に使用できるリソース管理ディレクティブを含めることができます。

のいくつかの一般的なディレクティブ [Slice] 他のユニットでも使用できるセクションは、 systemd.resource-control マニュアルページ。 これらは、次のユニット固有のセクションで有効です。

テンプレートユニットファイルからのインスタンスユニットの作成

このガイドの前半で、ユニットの複数のインスタンスを作成するために使用されるテンプレートユニットファイルのアイデアについて説明しました。 このセクションでは、この概念について詳しく説明します。

テンプレートユニットファイルは、ほとんどの点で、通常のユニットファイルと同じです。 ただし、これらは、ファイルの特定の部分が実行時に利用できる動的な情報を利用できるようにすることで、ユニットを構成する際の柔軟性を提供します。

テンプレートとインスタンスのユニット名

テンプレートユニットファイルには、 @ 基本ユニット名の後、ユニットタイプの接尾辞の前の記号。 テンプレートユニットのファイル名は次のようになります。

example@.service

テンプレートからインスタンスを作成する場合、インスタンス識別子は @ 記号とユニットタイプの開始を示すピリオド。 たとえば、上記のテンプレートユニットファイルを使用して、次のようなインスタンスユニットを作成できます。

example@instance1.service

インスタンスファイルは通常、テンプレートファイルへのシンボリックリンクとして作成され、リンク名にはインスタンス識別子が含まれます。 このようにして、一意の識別子を持つ複数のリンクが単一のテンプレートファイルを指すことができます。 インスタンスユニットを管理する場合、 systemd 使用するコマンドラインで指定した正確なインスタンス名のファイルを検索します。 見つからない場合は、関連するテンプレートファイルを探します。

テンプレート指定子

テンプレートユニットファイルの威力は、主に、動作環境に応じてユニット定義内の適切な情報を動的に置き換える機能に見られます。 これは、テンプレートファイルのディレクティブを通常どおりに設定することによって行われますが、特定の値または値の一部を変数指定子に置き換えます。

以下は、インスタンスユニットが関連情報で解釈されるときに置き換えられる、より一般的な指定子の一部です。

テンプレートファイルで上記の識別子を使用することにより、 systemd テンプレートを解釈してインスタンスユニットを作成するときに、正しい値を入力します。

結論

で作業するとき systemd、ユニットとユニットファイルを理解すると、管理が容易になります。 他の多くのinitシステムとは異なり、サービスやシステムの起動に使用されるinitファイルを解釈するためにスクリプト言語を知っている必要はありません。 ユニットファイルは、アクティブ化時のユニットの目的と効果を一目で確認できる、かなり単純な宣言型構文を使用しています。

アクティベーションロジックなどの機能を個別のユニットに分割することで、内部 systemd 並列初期化を最適化するプロセス。これにより、構成がかなり単純に保たれ、関連する接続を切断して再構築することなく、一部のユニットを変更および再起動できます。 これらの機能を活用することで、管理時の柔軟性とパワーを高めることができます。

モバイルバージョンを終了