어떻게 알 수 있나요?

어떻게 알 수 있나요?

읽다두 개의 유닛 파일 폴더가 있습니다(사용자 모드가 아님).

/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.targetmulti-user.target.wantssystemctl 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/etcman 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

관련 정보