나는 스레드 를 따르는 것을 알고 아마 그것에 대한 대답 입니다. 답을 제외하면 일반적인 의미의 답은 아닙니다. 특정 경우에 문제가 있었지만 일반적으로는 그렇지 않은 것을 알려줍니다.
내 질문은 : 순서 방식을 일반적인 방식으로 디버깅하는 방법이 있습니까? 예 :주기를 설명하는 명령이 있습니까? 그리고 어떤 장치를 다른 장치에 연결합니까?
예를 들어 다음과 같은 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.target
및 After=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가 아웃 바운드로 정의되어 시스템 종료주기가 발생 함을 의미합니다.
치료는 간단합니다 – 변경 단어를 “후” 에 “전에” 반대의 경우도 마찬가지 필요한 경우.