回答:
systemd
ユニットはのファイルに従う必要はありません/etc/default
。systemd
設定は簡単ですが、systemdユニットファイルの構文を知っている必要があります。
パッケージには、通常、ユニットファイルが含まれてい/lib/systemd/system/
ます。これらは編集されません。代わりに、で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/getty@.service
# 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 serial-getty@.service, 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
ただし、これは複数の変数、スペースなどでは扱いにくい場合があります。そのようなインスタンスの例については、他の回答のいずれかをご覧ください。
このメカニズムを使用すると、systemd
ユニットをオーバーライドしたり、そのような変更を元に戻したりすることが簡単になります(オーバーライドファイルを削除するだけです)。変更できる設定はこれらだけではありません。
次のリンクが役立ちます。
systemd
systemd
manページ、特に、のmanページsystemd.unit
とsystemd.service
systemd.service(5)
マンページのセクションExecStart
:「Type =がoneshotでない場合、コマンドを1つだけ指定する必要があります。Type= oneshotを使用すると、0個以上のコマンドを指定できます。このオプションに空の文字列が割り当てられている場合、開始するコマンドのリストはリセットされ、このオプションの以前の割り当ては無効になります。
sudo rm
オーバーライドファイルを作成してからsystemctl daemon-reload
、または、またはsystemctl edit
オーバーライドですべてをコメントに置き換えることができます。サービスファイル内のコメントはで始まります#
。
systemctl revert foo
ExecStart=
空白のエントリでをクリアするとき、次のようにコメントを追加できないことに注意してください。ExecStart= # Empty line to clear previous entries.
これは別のExecStart=
エントリとして取得され、リストに追加されます。PS。評判が悪いため、muruの回答にコメントを追加できませんでした。