systemd는 어떻게 "종속" 대상 파일과 디렉터리를 대상 "단위"에 포함합니까?

systemd는 어떻게 "종속" 대상 파일과 디렉터리를 대상 "단위"에 포함합니까?

내 컴퓨터 /lib/systemd/system디렉토리에 파일이 있습니다. multiuser.target이 파일에는 다음이 포함되어 있습니다.

[Unit]
Description=Multi-User System
Documentation=man:systemd.special(7)
Requires=basic.target
Conflicts=rescue.service rescue.target
After=basic.target rescue.service rescue.target
AllowIsolate=yes

이 줄은 다음과 같습니다. Requires: basic.target이는 파일을 "실행"한다는 뜻이라고 생각합니다 basic.target.
그러나 /lib/systemd/system동일한 디렉토리에는 하위 디렉토리도 있습니다 multi-user.target.wants/. 여기에는 더 많은 단위 파일이 포함되어 있습니다.

/lib/systemd/system $tree multi-user.target.wants/
multi-user.target.wants/
├── dbus.service -> ../dbus.service
├── getty.target -> ../getty.target
├── systemd-ask-password-wall.path -> ../systemd-ask-password-wall.path
├── systemd-logind.service -> ../systemd-logind.service
├── systemd-update-utmp-runlevel.service -> ../systemd-update-utmp-runlevel.service
└── systemd-user-sessions.service -> ../systemd-user-sessions.service

대상이 기본적으로 실행되면 다음 유닛 중 어느 것이 실행됩니까? 즉, 파일: basic.target아니면 하위 디렉터리의 모든 유닛입니까? 위의 내용이 전부인가요? 그렇다면 어떤 순서로?multi-user.wants.targetmulti-user.target

답변1

Before/ AfterWants/ / Requires사이에는 차이가 있습니다 Requisite. 첫 번째 그룹은 다음을 의미합니다.타이밍단위부터 시작하여 후자 그룹은 다음을 나타냅니다.종속성. 일반적으로 둘 사이에는 차이가 거의 없지만 때로는 중요합니다. 읽다문서자주 보지 않는 내용을 생략했기 때문에 자세한 내용을 확인하는 데 유용합니다.

예를 들어, 종속성이 있는 일부 서비스가 있다고 가정해 보겠습니다.

서비스

[Service]
Type=oneshot
ExecStart=/bin/sh -c 'sleep 5;/bin/false'
RemainAfterExit=yes

b.서비스

[Unit]
After=a.service

[Service]
Type=oneshot
ExecStart=/bin/echo B
RemainAfterExit=yes

c.서비스

[Unit]
Requires=a.service

[Service]
Type=oneshot
ExecStart=/bin/echo C
RemainAfterExit=yes

d.서비스

[Unit]
After=a.service
Requires=a.service

[Service]
Type=oneshot
ExecStart=/bin/echo D
RemainAfterExit=yes

로드되는 항목(및 로드되는 순서)은 실행하는 항목에 따라 크게 달라집니다.

  • a:a
  • b:b
  • c(또는 a+ c): a동시에 c( 실패 c하더라도 a계속 실행됨 )
  • d(또는 a+ d): a-> c( a시작이 성공한 경우)
  • a+ b: a-> b( a시작 여부)

왜 그렇게 복잡합니까? 이는 유닛 로딩 속도를 높이기 위한 것입니다. 서비스가 서로를 갖고 있지 않거나 참조하지 않는 경우 Before동시에 After시작할 수 있습니다(다른 장치에서 서비스가 필요하지 않다고 가정).

파일은 어디서 왔나요 .target? 시스템이 시작(또는 중지 등)될 때 해당 단계에 필요한 장치가 함께 시작될 수 있도록 장치를 기능 그룹에 배치하고 장치는 다른 단계가 시작될 때까지 기다리고 싶다는 것을 나타낼 수 있습니다. 예 를 들어, 유닛에는 After=network.target.multi-user.target

단위가 서로 의존하는 순서를 보려면 다음을 실행하면 됩니다. (그러나 로드되는 순서는 / 설정 외부에서 약간 무작위 systemctl list-dependencies이기 때문에 알려주지 않습니다 .)BeforeAfter

관련 정보