답변:
systemd
에있는 파일을 준수 할 필요는 없습니다 /etc/default
. 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
재정의해야 할 내용과 해당 섹션을 알려줍니다.일반적으로 시스템 단위 파일을 편집하는 경우 적용하려면 다음을 실행해야합니다.
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
, 그러나 이것은 사실이 아니다. 두 가지 방법으로 환경 변수를 지정할 수 있습니다.
파일에 환경 변수를 설정했다고 가정 해보십시오.
$ 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
맨 , 특히,의 맨 페이지 systemd.unit
및systemd.service
systemd.service(5)
맨 페이지의 @MarkEdington 섹션 ExecStart
: "Type =이 oneshot 인 경우 정확히 하나의 명령을 지정해야합니다. Type = oneshot을 사용하는 경우 0 개 이상의 명령을 지정할 수 있습니다. 동일한 명령에 여러 명령 줄을 제공하여 명령을 지정할 수 있습니다. 지시문 또는 다른 방법으로이 지시문을 동일한 효과로 두 번 이상 지정할 수 있습니다. 빈 문자열이이 옵션에 지정되면 시작할 명령 목록이 재설정되며이 옵션의 이전 지정은 적용되지 않습니다. "
sudo rm
는 재정의 파일을 누른 다음 systemctl daemon-reload
을 사용하거나 systemctl edit
재정의의 모든 것을 주석으로 바꿀 수 있습니다 . 서비스 파일의 주석은로 시작합니다 #
.
systemctl revert foo
ExecStart=
빈 항목으로 with를 지우면 다음 과 같이 주석을 달 수 없습니다.ExecStart= # Empty line to clear previous entries.
이것은 다른ExecStart=
항목 으로 간주 되어 목록에 추가됩니다. 추신. 저의 명성으로 인해 muru의 답변에 의견을 추가 할 수 없었습니다.