systemd에서 주문주기를 디버깅하는 일반적인 방법 systemd[1]: Found dependency on cvol.service/start Jan

나는 스레드따르는 것을 알고 아마 그것에 대한 대답 입니다. 답을 제외하면 일반적인 의미의 답은 아닙니다. 특정 경우에 문제가 있었지만 일반적으로는 그렇지 않은 것을 알려줍니다.

내 질문은 : 순서 방식을 일반적인 방식으로 디버깅하는 방법이 있습니까? 예 :주기를 설명하는 명령이 있습니까? 그리고 어떤 장치를 다른 장치에 연결합니까?

예를 들어 다음과 같은 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를 원하지만 적어도 분명하지는 않습니다. 이 링크의 출처를 보여줄 명령이 있습니까? 그리고 일반적으로 사이클을 찾고 사이클의 각 링크가 시작되는 위치를 나타내는 명령이 있습니까?



답변

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

당신이 할 수있는 가장 가까운 것은입니다 systemctl show -p Requires,Wants,Requisite,BindsTo,PartOf,Before,After cvol.service. 이것은 주어진 유닛에 대한 결과적인 (효과적인) 의존성 목록을 보여줍니다.

사이클을 찾고 사이클의 각 링크가 시작되는 위치를 나타내는 명령이 있습니까?

내 지식으로는 그러한 명령이 없습니다. 실제로 시스템은 주문주기 (한숨)를 디버깅하는 데 도움이되지 않습니다.

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

첫째, 요구 사항 종속성 ( Wants=, Requires=, BindsTo=등) 순서 종속 (무관 Before=하고 After=). 여기서 보는 것은 순서 의존성주기입니다. 즉, 그것은 관련이 없습니다 Wants=.

둘째, 특정 유형의 단위간에 생성 된 여러 “기본 종속성”이 있습니다. 섹션의 DefaultDependencies=지시문에 의해 제어됩니다 [Unit]( 기본적으로 활성화되어 있음 ).

특히,이 지시문을 명시 적으로 비활성화하지 않으면 .service-type 단위는 암시 적 Requires=basic.targetAfter=basic.target종속성을 가져옵니다 . 이것은 systemd.service (5)에 설명되어 있습니다.


답변

당신은 명령을주기 시각화 할 수 있습니다 systemd-analyze verify, systemd-analyze dot그리고 graphviz를의 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

모래밭:


답변

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

systemd-analyze verify default.target

2 단계 : “작업을 삭제 하여 시스템 중단 순서주기” 메시지에 언급 된 서비스 또는 대상을 관찰 하고 전체 종속성 목록을 표시하십시오.

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

3 단계 : 서비스 또는 대상 파일에서 일반적으로 정의 된 “after”및 “before”그룹보기

/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가 아웃 바운드로 정의되어 시스템 종료주기가 발생 함을 의미합니다.

치료는 간단합니다 – 변경 단어를 “후”“전에” 반대의 경우도 마찬가지 필요한 경우.