나읽다두 개의 유닛 파일 폴더가 있습니다(사용자 모드가 아님).
/usr/lib/systemd/system/: units provided by installed packages
/etc/systemd/system/: units installed by the system administrator
이러한 이해와 충돌하는 것은 다음 질문에 대한 대답입니다.Systemd용 시작 스크립트를 작성하는 방법. 무슨 일이 일어나고 있는지 이해할 수 있도록 누군가 누락된 정보를 채워줄 수 있나요? (업데이트: 답변이 업데이트되었으며 내 이해가 더 이상 답변과 충돌하지 않습니다.)
또한 스크립트는 /etc/systemd/system/
폴더 내의 하위 폴더로 구성되어 있는 것으로 보입니다.
getty.target.wants
multi-user.target.wants
다른 곳에서 나는 다른 곳이 있다는 것을 읽었습니다. 이는 사용자별 서비스인 것으로 보입니다.
/usr/lib/systemd/user/ where services provided by installed packages go.
/etc/systemd/user/ where system-wide user services are placed by the system administrator.
~/.config/systemd/user/ where the user puts its own services.
2015년 8월 31일에 업데이트되었습니다:
다른 사람들의 이익을 위해 제가 최근에 질문한 관련 질문에 대한 링크는 다음과 같습니다.시스템 장치에서 실행되는 스크립트를 어디에 넣어야 합니까?
답변1
가장 좋은 장소체계유닛 파일: /etc/systemd/system
[설치] 섹션 아래에 대상을 추가했는지 확인하세요. 자세한 내용은 "어떻게 알 수 있나요?"를 읽어보세요. 고쳐 쓰다: /usr/local/lib/systemd/system
또 다른 옵션입니다. 자세한 내용은 "회색 영역"을 읽어보세요. "
가장 좋은 장소사용자유닛 파일: /etc/systemd/user
또는 $HOME/.config/systemd/user
권한과 상황에 따라 다릅니다. 또한 사용자 서비스는 사용자 세션이 활성화된 동안에만 실행됩니다.
사실은 시스템 단위(또는 소개에서 "단위 구성"이라고 부름)가 다음을 수행할 수 있다는 것입니다.어딘가에—수동으로 심볼릭 링크를 생성하고 주의 사항을 이해하고 있다고 가정합니다. 기기를 systemctl daemon-reload
쉽게 찾을 수 있는 곳에 배치하면 삶이 더 편해집니다. 그 이유는 다음과 같습니다.
- 표준 위치를 사용한다는 것은 시스템 생성기가 해당 위치를 찾아서 시작 시 쉽게 활성화한다는 의미입니다
systemctl enable
. 이는 유닛이 유닛 종속성 트리(유닛 캐시)에 자동으로 추가되기 때문입니다. - 올바른 권한이 있는 사용자만 지정된 영역에 쓸 수 있으므로 권한에 대해 걱정할 필요가 없습니다.
어떻게 알 수 있나요?
systemctl enable
도대체 심볼릭 링크를 생성할 위치를 어떻게 알 수 있나요? 해당 섹션 아래의 장치 자체에 하드코딩할 수 있습니다 [install]
. 일반적으로 다음과 같은 줄이 있습니다.
[Install]
WantedBy = multi-user.target
파일 시스템의 미리 정의된 위치에 해당합니다. 이렇게 하면 systemctl
해당 유닛이 명명된 유닛 파일 세트에 종속된다는 것을 알 수 있습니다 multi-user.target
("대상"은 유닛 종속성 그룹을 지정하는 데 사용되는 용어입니다. List all groups 를 사용할 수 있습니다 systemctl list-units --type target
). 대상과 함께 로드된 유닛 파일 그룹은 targetname.target.wants
디렉토리에 배치됩니다. 이는 단지 심볼릭 링크(또는 실제)로 가득 찬 디렉토리일 뿐입니다. 섹션에 있다고 되어 있으면 [Install]
해당 섹션에 대한 심볼릭 링크가 디렉토리에 없으면 로드되지 않습니다 WantedBy
. 시스템 유닛 생성기가 시작 시 종속성 트리 캐시에 유닛 파일을 추가하면(생성기를 수동으로 트리거할 수 있음) 심볼릭 링크를 넣을 위치를 자동으로 알 수 있습니다. 이 경우 활성화하면 디렉터리에 있습니다.multi-user.target
multi-user.target.wants
systemctl daemon-reload
/etc/systemd/system/multi-user.target.wants/
매뉴얼의 핵심 포인트:
다른 유닛은 해당 유닛의 로드 경로에 없는 디렉터리에서 systemd("링크")로 로드될 수 있습니다. systemctl(1)의 링크 명령을 참조하십시오.
systemctl에서 다음을 찾으세요.유닛 파일 명령
유닛 파일 로딩 경로
다음 인용문의 첫 번째 문장을 읽고 이해하십시오 man systemd.unit
. 왜냐하면 systemd가 다른 경로로 컴파일된 경우 여기서 언급한 모든 경로가 적용되지 않을 수 있기 때문입니다.
유닛 파일은 다음 두 표에 설명된 대로 컴파일 중에 결정된 경로 집합에서 로드됩니다. 이전에 나열된 디렉터리에 있는 유닛 파일은 목록의 하위 디렉터리에 있는 동일한 이름의 파일을 덮어씁니다.
변수가 설정되면
$SYSTEMD_UNIT_PATH
변수의 내용이 단위 부하 경로를 덮어씁니다. 빈 구성 요소(":")로 끝나는 경우$SYSTEMD_UNIT_PATH
일반적인 단위 로딩 경로가 변수 내용에 추가됩니다.
표 1과 표 2는 모두 man systemd.unit
괜찮습니다.
시스템 모드에서 실행할 때 path()를 로드합니다 --system
.
/etc/systemd/system
로컬 구성/run/systemd/system
런타임 단위/usr/lib/systemd/system
패키지가 설치되는 단위 (또는/lib/systemd/system
어떤 경우에는 읽어보세요man systemd.unit
)
사용자 모드 런타임 로딩 경로( --user
)
사이에는 차이가 있습니다사용자당단위와전체/글로벌사용자 단위.
사용자에 따라 다름
$XDG_CONFIG_HOME/systemd/user
사용자 구성($XDG_CONFIG_HOME
설정 중에만 사용됨)$HOME/.config/systemd/user
사용자 구성($XDG_CONFIG_HOME
설정되지 않은 경우에만 사용됨)$XDG_RUNTIME_DIR/systemd/user
런타임 단위($XDG_RUNTIME_DIR
설정 시에만 사용됨)$XDG_DATA_HOME/systemd/user
홈디렉토리에 설치된 패키지 단위($XDG_DATA_HOME
설정시에만 사용)$HOME/.local/share/systemd/user
홈 디렉터리에 설치된 패키지 단위($XDG_DATA_HOME
설정되지 않은 경우에만 사용)
--global
(모든 사용자들)
모든 사용자가 사용할 수 있는 조직 - 각 사용자가 소유함을 의미합니다. 따라서 관리자가 시작 시 서비스를 활성화하더라도 각 사용자는 이러한 서비스를 중지할 수 있습니다.
/etc/systemd/user
모든 사용자에 대한 로컬 구성(systemctl --global enable userunit.service
)/usr/lib/systemd/user
모든 사용자를 위해 시스템 전체에 설치된 패키지 단위(또는/lib/systemd/system
경우에 따라 man systemd.unit 읽기)/run/systemd/user
런타임 단위
회색 영역
한편으로는,파일 계층 표준(또한 man file-hierarchy
) /etc
바이너리를 실행하지 않기 위한 로컬 구성을 지정합니다. 반면에 /usr/local/
"소프트웨어를 로컬로 설치할 때 시스템 관리자가 사용하도록" 지정되어 있습니다. (조직적 목적뿐만 아니라) 모든 시스템 단위 파일이 아래에 있어야 한다고 주장할 수도 있지만 /usr/local/lib/systemd/system
이는 패키지 관리자에서 오는 것이 아니라 "소프트웨어"에 속하는 단위 파일에 적용됩니다. 시스템 전체에 해당하는 시스템 사용자 단위를 포함할 수 있습니다
/usr/local/lib/systemd/user
.
일시적인 단위
존재하지도 않는 또 하나의 잊혀진 장소! 아마도 덜 알려진 프로그램은 systemd-run
임시 셀을 동적으로 실행하는 데 사용할 수 있습니다. 바라보다 man systemd-run
.
예를 들어 내일 오전 4시에 다시 시작하도록 예약하려면 다음과 같이 하세요( --force
다시 시작해야 할 수도 있음).
systemd-run -u restart --description="Restarts machine" --on-calendar="2020-12-18 04:00:00" systemctl --force reboot
이는 임시 단위 파일 restart.service
과 해당 타이머를 생성합니다( --on-calendar
생성된 임시 단위 정의에 표시됨).transient=yes
/run/systemd/transient/restart.service
# This is a transient unit file, created programmatically via the systemd API. Do not edit.
[Unit]
Description=Restarts machine
[Service]
ExecStart=
ExecStart="/usr/bin/systemctl" "--force" "reboot"
커널이 즉시 중지하도록 지시하는 더 위험한 double force 옵션도 있습니다 --force --force
(무엇을 하고 있는지 모르면 전원을 끄는 것과 거의 동일하므로 안전하지 않습니다).
답변2
/etc/systemd/system
거기가 당신이 놓은 곳이에요당신의스크립트, 팩맨 넣기팩스크립트에서 /usr/lib/systemd/system
.
발행하면 에서 까지의 심볼릭 링크가 systemctl enable foo.service
생성됩니다 . 자세한 내용은 장치 로드 경로 섹션을 참조하세요./usr
/etc
man systemd.unit(5)
답변3
systemd가 유닛 파일을 찾는 모든 위치를 알고 싶다면 다음 명령이 도움이 될 것입니다.
사용systemd-analyze
주문하다:
포함할 수 있는 모든 폴더사용자제공하다:
여기에 사용자별 구성을 넣을 수 있습니다.
systemd-analyze --user unit-paths
관리 사용자의 경우 구성을 다음 폴더에 배치하는 것이 좋습니다(이 폴더는 모든 사용자에게 영향을 미칩니다).
systemd-analyze --global unit-paths
포함할 수 있는 모든 폴더체계제공하다:
여기에는 패키지 관리자가 설치한 서비스가 포함될 가능성이 높으며 전체 시스템에 영향을 미칩니다.
systemd-analyze --system unit-paths
바라보다:맨페이지
답변4
검색 경로
systemd
이렇게 하면 구경할 곳이 많아진다 systemctl enable <unit-name>
. 발견되는 곳마다 내부 어딘가에 상징적으로 연결되어 있습니다 /etc/systemd
.
man systemd.unit(5)
전체 목록을 확인 하거나 systemd-analyze
다른 답변에 설명된 명령을 사용할 수 있습니다. 다음 위치 중 하나에 유닛 파일을 배치할 수 있습니다. 하지만 precedence
과 에 주의를 기울여야 합니다 scope
.
Precedence
동일한 이름을 가진 유닛 파일이 발견되면 systemd가 어떤 폴더를 먼저 선택할지 결정합니다.
Scope
사용자, 글로벌, 시스템 등.
폴더 선택
예를 들어 단위 파일을 에 넣은 경우 를 ~/.config/systemd/user.control
사용하여 해당 파일을 활성화해야 합니다 systemctl enable --user <unit-file>
.
일반적으로 단위 파일은 서비스용이고 서비스는 일반적으로 호스트용입니다. 그래서 저는 대부분 시스템 전체에 걸쳐 사용자 지정 단위를 만들고 /etc/systemd/system
이름이 충돌할 경우를 대비해 무엇보다 우선적으로 사용했습니다.
pkg-config systemd --variable=systemdsystemconfdir
pkg-config systemd --variable=systemduserunitdir
pkg-config systemd --variable=systemduserconfdir
내 시스템에서는 다음이 순서대로 반환됩니다.
/etc/systemd/system
/usr/lib/systemd/user
/etc/systemd/user