多くのsysv initスクリプトは、/etc/default
の対応するファイルを使用して、管理者が設定できるようにしました。アップスタートジョブは、.override
ファイルを使用して変更できます。 systemdがUbuntuのデフォルトになったので、systemdユニットをオーバーライドまたは構成するにはどうすればよいですか?
systemd
ユニットは、/etc/default
のファイルに従う必要はありません。 systemd
は簡単に設定できますが、systemdユニットファイルの構文を知っている必要があります。
パッケージは通常、ユニットファイルを/lib/systemd/system/
で出荷します。これらはnot編集されません。代わりに、systemd
を使用すると、/etc/systemd/system/
に適切なファイルを作成してこれらのファイルをオーバーライドできます。
特定のサービスfoo
に対して、パッケージは/lib/systemd/system/foo.service
を提供します。 systemctl status foo
を使用してステータスを確認するか、journalctl -u foo
を使用してログを表示できます。 foo
の定義で何かをオーバーライドするには、次のようにします。
Sudo systemctl edit foo
これにより、ユニットにちなんで名付けられた/etc/systemd/system
にディレクトリが作成され、そのディレクトリ(override.conf
)に/etc/systemd/system/foo.service.d/override.conf
ファイルが作成されます。このファイル(または.conf
内の他の/etc/systemd/system/foo.service.d/
ファイル)を使用して、設定を追加またはオーバーライドできます。
getty
サービスを例にとります。ユーザーにTTY2の自動ログインが必要だとしましょう(これはお勧めできませんが、単なる例です)。 TTY2はgetty@tty2
サービスによって実行されます(tty2
はテンプレート/lib/systemd/system/getty@service
のインスタンスです)。これを行うには、getty@tty2
サービスを変更する必要があります。
$ systemctl cat getty@tty2
# /lib/systemd/system/[email protected]
# This file is part of systemd.
#
# systemd is free software; you can redistribute it and/or modify it
# under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation; either version 2.1 of the License, or
# (at your option) any later version.
[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service
After=rc-local.service
# If additional gettys are spawned during boot then we should make
# sure that this is synchronized before getty.target, even though
# getty.target didn't actually pull it in.
Before=getty.target
IgnoreOnIsolate=yes
# On systems without virtual consoles, don't start any getty. Note
# that serial gettys are covered by [email protected], not this
# unit.
ConditionPathExists=/dev/tty0
[Service]
# the VT is cleared by TTYVTDisallocate
ExecStart=-/sbin/agetty --noclear %I $TERM
Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
KillMode=process
IgnoreSIGPIPE=no
SendSIGHUP=yes
# Unset locale for the console getty since the console has problems
# displaying some internationalized messages.
Environment=LANG= LANGUAGE= LC_CTYPE= LC_NUMERIC= LC_TIME= LC_COLLATE= LC_MONETARY= LC_MESSAGES= LC_PAPER= LC_NAME= LC_ADDRESS= LC_TELEPHONE= LC_MEASUREMENT= LC_IDENTIFICATION=
[Install]
WantedBy=getty.target
DefaultInstance=tty1
特に、ExecStart
行を変更する必要があります。現在は次のとおりです。
$ systemctl cat getty@tty2 | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
これをオーバーライドするには、次のようにします。
Sudo systemctl edit getty@tty2
そして追加:
[Service]
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM
ご了承ください:
ExecStart
、After
(全体ではなく、変数ごとではない)、Environment
に似た追加設定であり、EnvironmentFile
やRestartSec
などの設定をオーバーライドするのではなく、再設定する前に明示的にType
をクリアする必要がありました。 ExecStart
は、Type=oneshot
サービスに対してのみ複数のエントリを持つことができます。ExecStart
は[Service]
セクションにあるため、オーバーライドではExecStart
を[Service]
セクションにも配置する必要があります。多くの場合、systemctl cat
を使用して実際のサービスファイルを見ると、オーバーライドする必要があるものと、それが含まれているセクションがわかります。通常、systemdユニットファイルを編集して有効にするには、次を実行する必要があります。
Sudo systemctl daemon-reload
ただし、systemctl edit
は自動的にこれを行います。
今:
$ systemctl cat getty@tty2 | grep Exec
ExecStart=-/sbin/agetty --noclear %I $TERM
ExecStart=
ExecStart=-/sbin/agetty -a muru --noclear %I $TERM
$ systemctl show getty@tty2 | grep ExecS
ExecStart={ path=/sbin/agetty ; argv[]=/sbin/agetty -a muru --noclear %I $TERM ; ... }
そして、私がそうするなら:
Sudo systemctl restart getty@tty2
を押す CtrlAltF2、プレスト!そのTTYでアカウントにログインします。
前にも言ったように、getty@tty2
はテンプレートのインスタンスです。それで、そのテンプレートのすべてのインスタンスをオーバーライドしたい場合はどうなりますか?これは、テンプレート自体を編集することで実行できます(インスタンス識別子を削除します-この場合はtty2
):
systemctl edit getty@
/etc/default
ファイルの一般的な使用例は、環境変数の設定です。通常、/etc/default
はシェルスクリプトであるため、シェル言語のコンストラクトを使用できます。ただし、systemd
では、そうではありません。次の2つの方法で環境変数を指定できます。
ファイルに環境変数を設定したとします:
$ cat /path/to/some/file
FOO=bar
次に、オーバーライドに追加できます。
[Service]
EnvironmentFile=/path/to/some/file
特に、/etc/default/grub
に割り当てのみが含まれ、シェル構文が含まれていない場合は、EnvironmentFile
として使用できます。
Environment
エントリ経由上記は、次のオーバーライドを使用して実現することもできます。
[Service]
Environment=FOO=bar
しかし、これは複数の変数、スペースなどでは扱いにくい場合があります。そのようなインスタンスの例については、 他の回答の1つ をご覧ください。
このメカニズムにより、systemd
ユニットをオーバーライドしたり、(オーバーライドファイルを削除するだけで)そのような変更を元に戻したりすることが非常に簡単になります。変更できる設定はこれらだけではありません。
次のリンクが役立ちます。
systemd
のWikiエントリをアーカイブsystemd
マンページ 、特に systemd.unit
および systemd.service
のマンページ