システムターゲットを作成するには?

システムターゲットを作成するには?

systemd に関する多数の投稿、Youtube ビデオ、「ドキュメント」を検索した後も、まだ迷っています。

リンク(https://wiki.archlinux.org/index.php/systemd#Create_custom_target)有望に見えますが(私にとっては)少しあいまいです。

質問

選択した.service単位で開始できるように、カスタムsystemdターゲット(foo.targetなど)をどのように生成しますか?

はい

  1. システムはdefault.target("foo.target"へのシンボリックリンク)を起動します。
  2. 「foo.target」は、ベアボーンXサーバーや「gvim」などのGUIプログラムのみを起動します。

理由

Xプログラムをすばやく起動するためのカスタムターゲットを作成したいと思います。不要なすべてのサービスを除外することを嬉しく思います。

よろしくお願いします!

答え1

ユニットファイルはsystemdのターゲットと他のすべてを定義するために使用されることを読んでman 5 systemd.unit教えてください。man 5 systemd.target作成方法に関する具体的な文書はありません。ターゲットだからどうすればいいのかわかりにくいですが、サービスを作るのと大きく変わりません。

目標を作る際に必要なことシンボリックリンクtarget.wantssystemdサービスディレクトリからこのディレクトリに移動します。その後、目標を設定/実行できます。あなたの例に応じて、次のように見えます。

/etc/systemd/system/foo.target

これはターゲットのユニットファイルです。 graphic.target を例として、それに基づいて独自のターゲットを作成できます。

[Unit]
Description=Foobar boot target
Requires=multi-user.target
Wants=foobar.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target
AllowIsolate=yes

systemdのマンページのオプションを説明してください。

  • Description- 目標を説明してください。あなたは理解する必要があります
  • Requires- ターゲットの強い依存関係。自分のサービスを開始する前に、基本システムを起動する必要があります。
  • Wants——ソフト依存性。対象ではない必要それが始まるのに必要なすべてです。
  • Conflicts- あるデバイスに他のデバイスとの設定が衝突した場合、前者を起動すると後者も停止し、その逆も同様です。
  • After- このサービスの後に始めてください。
  • AllowIsolate- それはすべてあなたとあなたの状況に依存します。詳細はマンページで確認できます。systemd.unit(5)

/etc/systemd/system/foo.target.wants/

このディレクトリでは、ターゲットに対して作成/必要なサービスを接続します。Wants=単位ファイルのオプションと同じです。このディレクトリを作成し、次のシンボリックリンクを作成しますln -s /usr/lib/systemd/system/bar.service /etc/systemd/system/foo.target.wants/bar.service。これにより、システムディレクトリのbar.serviceからfoo.target.wantsディレクトリへのシンボリックリンクが作成されます。


サービス用の単位ファイルを生成することはこの回答の範囲から少し外れていると考えられ、質問は確かにさらに文書化されているので、今はそのままにします。ユニットファイルを作成するときは、単にtarget.wantsディレクトリにシンボリックリンクを付けるか、Wants=ディレクティブに追加してください。

答え2

以前の回答で言及されていないことは、カスタムsystemdターゲットが起動時にmulti-user.targetのように機能するために、起動プロセスの一部として指定する必要があることです。

基本的にあなたが望むのは、現在のデフォルト値が何であるかを確認することですsystemctl get-defaultgraphical.targetまたはいずれかの可能性が高いですmulti-user.target

次に、/etc/systemd/system新しいデフォルトターゲットにシンボリックリンクを作成し、ターゲットが起動プロセスの拡張であることを確認する必要があります。

ln -s /etc/systemd/system/foo.target /etc/systemd/system/default.target

調べる:

systemctl daemon-reload
systemctl get-default

以前のデフォルトの場合は、multi-user.targetm32で説明したように、カスタム単位で次のように設定する必要があります。

[Unit]
Description=Foobar boot target
Requires=multi-user.target
Wants=foobar.service
Conflicts=rescue.service rescue.target
After=multi-user.target rescue.service rescue.target
AllowIsolate=yes

ここで重要なのは、multi-user.targetがRequiresとして指定されていることです。すべての意味の詳細については、@ m32の回答を参照してください。

ここで行うことは、カスタム単位を使用して起動プロセスを拡張することです。これをsystemdのデフォルト値に設定すると、systemdは起動時にデバイスをロードするように指示します。その後、その目標の設定は、最も基本的な目標に達するまで別の目標を取得します。少なくとも今はそう理解する。

その後、他の回答で述べたように、ディレクティブWants=でデバイスを指定し、デバイスのインストールセクションにfoo.target追加できます。WantedBy=foo.target実行時に使用したいユニットはまだ有効にする必要がありますsystemd enable foobar.service

結論として:

  1. 既存の目標を拡張して目標を作成する
  2. デフォルトのターゲットにするためにシンボリックリンクを作成します。
  3. 開始するすべての単位にこの目標を割り当てます。
  4. この方法で起動時に起動したいすべてのデバイスを有効にします。

ランレベルのこのドキュメントには詳細があります。https://www.landoflinux.com/linux_runlevels_systemd.html

答え3

この作業を完了する前に、次の例を検討することをお勧めします。

vim /lib/systemd/system/*.target

独自のターゲットを作成する場合は、手動で接続する必要はありません。

サービスを追加し/etc/systemd/systemて実行するだけですsystemctl enable。ちょうどそれWantedByまたはRequiredBysystemdはあなたのためにすべての作業を行います。

関連情報