systemdターゲットを作成する方法は?


16

systemdの問題に関する多くの投稿、Youtubeビデオ、および「ドキュメント」を十分に検索した後、私はまだ途方に暮れています。

リンク(https://wiki.archlinux.org/index.php/systemd#Create_custom_target)は有望であるように見えましたが、少し曖昧でした(私には)。

質問

select .serviceユニットで起動できるように、カスタムsystemdターゲット(IE:foo.target)を作成するにはどうすればよいですか?

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

理由

1つのXプログラムをすばやく起動するためのカスタムターゲットを作成するだけです。不要なすべてのサービスを除外すると便利です。

前もって感謝します!

回答:


16

通読man 5 systemd.unitし、man 5 systemd.targetユニットファイルを対象としてだけでなく、他のすべてにsystemdを定義するために使用されていることを教えてくれる。ターゲットの作成方法に関するドキュメントは特にないので、どのように実行すべきかを判断するのは困難ですが、サービスの作成とそれほど違いはありません。

ターゲットを作成するときは、systemdサービスディレクトリからディレクトリへのシンボリックリンクを作成する必要がありtarget.wantsます。その後、ターゲットを設定/起動できます。以下に例を示します。

/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=ディレクティブに追加します。


上記に従って新しいターゲットを作成し、いくつかのターゲットをサービスに追加しました。ただし、これらのサービスはいずれもsystemdによって起動されません。新しく追加されたターゲット内でサービスが機能することを示す完全な例はありますか?
linuxfan

1
ブート時に実行するカスタムサービスを設定する簡単な手順を探している場合は、necromancerのスタックポストを参照してください。
フィルボックス

私が追加@linuxfan foo.targetRequiresフィールドとBeforeのフィールドmulti-user.target、およびそれが好きRequires: base.target foo.target。その後、Arch Linux vmを再起動foobar.serviceすると、デーモンとして自動的に実行されます。
L_K

2
いい答えですが、実際には期待どおりに動作しないようです。1.不足しているからといって、そのターゲットでサービスが開始されるわけではありません。2. multi-user.targetには、それを機能させる何らかの隠されたものがあるようです。
オテウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.