systemd에서 주문주기를 디버깅하는 일반적인 방법


23

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

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

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

답변:


20

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

당신이 할 수있는 가장 가까운 것은입니다 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)에 설명되어 있습니다.


인용 한 명령은 완벽하게 작동했으며 실제로 basic.target에 대한 종속성을 공개했습니다. 그것은 systemctl위한 도구 세트가 너무 부족하지만 잘 오, 그것은 새로운 프로젝트 있다는 부끄러운
galets을

2
@galets : 내 경험에 비추어 볼 때, 그러한 부족의 예는 거의 없습니다 ... 언젠가 나는 사이클 리포터의 자세한 정보를 얻고 로그에 유용한 정보를 추가 할 것입니다. 한편, 실제로 systemd-analyze verify UNIT장치의 정확성을 확인 하는 데 사용할 수 있습니다 . 이면에서이 명령은 가상 시스템 인스턴스를 작성하고 지정된 UNIT를 초기 트랜잭션 (있는 것처럼)으로로드하려고 시도합니다 default.target. 이렇게하면 새로운 정보 (로그와 비교)가 표시되지 않지만 최소한 장치가 활성화 된 상태에서 재부팅하여 다시 부팅 할 필요는 없습니다.
intelfx

시스템 개선 요청 (RFE) : 사이클 리포터의 상세도
adrelanos

20

당신은 명령을주기 시각화 할 수 있습니다 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

모래밭:


systemd-analyze verify데비안 8 설치에는 존재하지 않습니다.
sjas

@sjas, systemd-analyze verify 사용할 수 부터 v216. 시도하십시오 systemd-verify. 존재합니까?
Evgeny Vereshchagin

흠, 그것은 제시에 존재하지 않습니다 : anonscm.debian.org/cgit/pkg-systemd/systemd.git/tree/debian/…
Evgeny Vereshchagin

1
systemd-analyze verify default.target그 자체 ... 루프를 보여주는에 유리한 일을
덴 베르그 거트 반

0

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

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.