systemd에서 정렬 주기를 디버그하는 일반적인 방법

systemd에서 정렬 주기를 디버그하는 일반적인 방법

알아요다음 스레드이라고 한다대답하라. 그러나 대답은 일반적인 대답이 아닙니다. 이는 특정 사례의 문제를 보여 주지만 일반적인 것은 아닙니다.

내 질문은: 정렬 주기를 디버깅하는 방법이 있습니까?일반적인방법? 예: 루프를 설명하고 한 장치가 다른 장치에 연결되는 이유를 설명하는 명령이 있습니까?

예를 들어 다음과 같습니다 journalctl -b(날짜를 무시하십시오. 내 시스템에는 시간을 동기화할 RTC가 없습니다).

Jan 01 00:00:07 host0 systemd[1]: Found ordering cycle on sysinit.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on local-fs.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on cvol.service/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on basic.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on sockets.target/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on dbus.socket/start
Jan 01 00:00:07 host0 systemd[1]: Found dependency on sysinit.target/start
Jan 01 00:00:07 host0 systemd[1]: Breaking ordering cycle by deleting job local-fs.target/start
Jan 01 00:00:07 host0 systemd[1]: Job local-fs.target/start deleted to break ordering cycle starting with sysinit.target/start

여기서 cvol.service(루프를 깨기 위해 도입된 서비스)는 다음과 같습니다.

[Unit]
Description=Mount Crypto Volume
After=boot.mount
Before=local-fs.target

[Service]
Type=oneshot
RemainAfterExit=no
ExecStart=/usr/bin/cryptsetup open /dev/*** cvol --key-file /boot/***

[Install]
WantedBy=home.mount
WantedBy=root.mount
WantedBy=usr-local.mount

Journalctl에 따르면 cvol.service는 basic.service를 원하지만 적어도 분명하지는 않지만 그렇지 않습니다. 이 링크의 출처를 보여주는 명령이 있습니까? 일반적으로 루프를 찾고 루프에 있는 각 링크의 출처를 표시할 수 있는 명령이 있습니까?

답변1

명령을 사용하여 루프를 시각화할 수 있습니다 systemd-analyze verify.systemd-analyze dot그래픽 시각화 dot도구:

systemd-analyze verify default.target |&
perl -lne 'print $1 if m{Found.*?on\s+([^/]+)}' |
xargs --no-run-if-empty systemd-analyze dot |
dot -Tsvg >cycle.svg

다음과 같은 내용이 표시됩니다.

여기에 이미지 설명을 입력하세요.

여기에서 이 루프를 볼 수 있습니다.c.service->b.service->a.service->c.service

Color legend: 
    black     = Requires
    dark blue = Requisite
    dark grey = Wants
    red       = Conflicts
    green     = After

링크:

답변2

이 링크의 출처를 보여주는 명령이 있습니까?

얻을 수 있는 가장 가까운 결과는 systemctl show -p Requires,Wants,Requisite,BindsTo,PartOf,Before,After cvol.service특정 단위에 대한 결과(유효한) 종속성 목록을 표시한다는 것입니다.

루프를 찾고 루프에 있는 각 링크의 출처를 표시할 수 있는 명령이 있습니까?

제가 아는 한 그런 순서는 없습니다. 실제로 systemd는 정렬 주기를 디버깅하는 데 도움이 되는 기능을 제공하지 않습니다(한숨).

Journalctl에 따르면 cvol.service는 basic.service를 원하지만 적어도 분명하지는 않지만 그렇지 않습니다.

첫째, 요구사항 종속성( Wants=Requires=) 은 종속성 순서( 및 ) BindsTo=와 독립적입니다 . 여기 보이는 것은Before=After=주문하다Wants=의존성 순환, 즉 등과 아무 관련이 없습니다.

둘째, 특정 유형의 단위 간에 많은 "기본 종속성"이 생성됩니다. 그들은 다음에 의해 통제됩니다DefaultDependencies=이 섹션의 지침 [Unit](예:기본적으로 활성화됨).

특히 이 지시문이 명시적으로 비활성화되지 않는 한 모든 .service-type 단위는 암시적 Requires=basic.targetAfter=basic.target종속성을 가져옵니다. 이는 정확히 여러분이 보고 있는 것과 같습니다. 이 내용은 다음과 같이 기록됩니다.시스템 서비스(5).

답변3

1단계: default.target에 대해 확인 명령 실행

systemd-analyze verify default.target

2단계: 메시지에 언급된 서비스 또는 대상 관찰"systemd는 작업을 제거하여 주문주기를 중단합니다"전체 종속성 목록을 표시합니다.

systemctl show -p Requires,Wants,Requisite,BindsTo,PartOf,Before,After <service or target name mentioned in the "breaking cycle" message>

3단계: 일반적으로 서비스 또는 대상 파일에 정의된 "이후" 및 "이전" 그룹을 확인합니다.

/lib/systemd/system

연속되어 있지만 아웃바운드 순서로 알려진 서비스나 대상을 찾습니다.

예:

dbus.service

일반적으로 표시"뒤쪽에"

multi-user.target

하지만"앞으로"

sockets.target

이 종속성은 다음을 호출하여 쉽게 관찰할 수 있습니다.

systemctl list-dependencies default.target

하지만 파일의 경우

/lib/systemd/system/dbus.service

다음과 같은 줄을 포함합니다.

Before=multi-user.target

또는

After=sockets.target

또는 둘 다는 dbus.service가 아웃바운드로 정의되어 systemd가 무한 루프되도록 함을 의미합니다.

이것치유법매우 간단합니다 - 단어를 바꾸세요"뒤쪽에"도착하다"앞으로"필요한 경우 그 반대의 경우도 마찬가지입니다.

관련 정보