phương pháp chung để gỡ lỗi chu kỳ đặt hàng trong systemd


23

Tôi nhận thức được theo chủ đề và được cho là một câu trả lời cho nó . Ngoại trừ một câu trả lời không phải là một câu trả lời theo nghĩa chung. Nó cho biết vấn đề là gì trong một trường hợp cụ thể, nhưng không nói chung.

Câu hỏi của tôi là: có cách nào để gỡ lỗi chu kỳ đặt hàng một cách chung chung không? Ví dụ: có một lệnh sẽ mô tả chu kỳ và những gì liên kết đơn vị này với đơn vị khác?

Ví dụ: tôi đã theo dõi journalctl -b(vui lòng bỏ qua ngày, hệ thống của tôi không có RTC để đồng bộ hóa thời gian với):

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

trong đó cvol.service (dịch vụ đã được giới thiệu và phá vỡ chu trình) là:

[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

Theo tạp chí, cvol.service muốn basic.service, ngoại trừ việc nó không, ít nhất là không rõ ràng. Có một lệnh sẽ chứng minh nơi liên kết này được bắt nguồn từ đâu? Và nói chung, có một lệnh, trong đó sẽ tìm thấy các chu kỳ và hiển thị mỗi liên kết trong chu kỳ bắt nguồn từ đâu?

Câu trả lời:


20

Có một lệnh sẽ chứng minh nơi liên kết này được bắt nguồn từ đâu?

Gần nhất bạn có thể làm là systemctl show -p Requires,Wants,Requisite,BindsTo,PartOf,Before,After cvol.service, nó sẽ hiển thị danh sách phụ thuộc kết quả (hiệu quả) cho một đơn vị nhất định.

Có một lệnh, trong đó sẽ tìm thấy các chu kỳ và hiển thị mỗi liên kết trong chu kỳ bắt nguồn từ đâu?

Theo hiểu biết của tôi, không có lệnh như vậy. Trên thực tế systemd không cung cấp gì để hỗ trợ gỡ lỗi chu kỳ đặt hàng (thở dài).

Theo tạp chí, cvol.service muốn basic.service, ngoại trừ việc nó không, ít nhất là không rõ ràng.

Thứ nhất, sự phụ thuộc yêu cầu ( Wants=, Requires=, BindsTo=vv) là độc lập phụ thuộc trật tự ( Before=After=). Những gì bạn thấy ở đây là một chu kỳ phụ thuộc đặt hàng , tức là nó không có gì để làm với Wants=vv

Thứ hai, có một số "phụ thuộc mặc định" được tạo giữa các đơn vị của một số loại nhất định. Chúng được điều khiển bởi DefaultDependencies=chỉ thị trong [Unit]phần (được bật theo mặc định ).

Đặc biệt, trừ khi lệnh này bị vô hiệu hóa rõ ràng, bất kỳ .serviceđơn vị -type nào cũng được ẩn Requires=basic.targetAfter=basic.targetphụ thuộc, đó chính xác là những gì bạn thấy. Điều này được ghi lại trong systemd.service (5) .


Lệnh bạn trích dẫn đã hoạt động hoàn hảo và thực sự tiết lộ sự phụ thuộc vào basic.target. Thật đáng tiếc khi bộ công cụ cho systemctl rất thiếu, nhưng ồ, đó là một dự án mới
galets

2
@galets: Đánh giá từ kinh nghiệm của tôi, có rất ít ví dụ về sự thiếu hụt như vậy ... Có thể một ngày nào đó tôi sẽ nhận được sự gia tăng tính minh bạch của người báo cáo chu kỳ, thêm một số thông tin hữu ích vào nhật ký. Trong khi đó, trên thực tế, bạn có thể sử dụng systemd-analyze verify UNITđể kiểm tra tính chính xác của đơn vị. Đằng sau hậu trường, lệnh này tạo ra một cá thể systemd ảo và cố gắng tải UNIT như giao dịch ban đầu (như thể nó là vậy default.target). Điều này sẽ không tiết lộ bất kỳ thông tin mới nào (so với nhật ký), nhưng ít nhất bạn sẽ không phải khởi động lại với thiết bị được kích hoạt để xem nếu nó không thành công.
intelfx

Yêu cầu hệ thống để tăng cường (RFE): tăng mức độ chi tiết của phóng viên chu kỳ
adrelanos

20

Bạn có thể hình dung ra chu kỳ với các lệnh systemd-analyze verify, systemd-analyze dotGraphViz dot công cụ:

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

Bạn sẽ thấy một cái gì đó như thế này:

nhập mô tả hình ảnh ở đây

Tại đây bạn có thể thấy chu trình: c.service->b.service->a.service->c.service

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

Liên kết:


systemd-analyze verifykhông tồn tại ở đây trên bản cài đặt debian 8.
sjas

@sjas, systemd-analyze verify có sẵn từ v216. thử systemd-verify. Nó tồn tại?
Evgeny Vereshchagin


1
systemd-analyze verify default.targettự nó làm một công việc tốt trong việc hiển thị vòng lặp ...
Gert van den Berg

0

Bước 1: chạy lệnh xác minh cho default.target

systemd-analyze verify default.target

Bước 2: quan sát dịch vụ hoặc mục tiêu nào được đề cập trong thông báo "systemd Phá vỡ chu kỳ đặt hàng bằng cách xóa công việc" và hiển thị danh sách phụ thuộc hoàn chỉnh của nó

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

Bước 3: xem xét các nhóm "sau" và "trước" bên trong tệp dịch vụ hoặc tệp đích thường được xác định trong

/lib/systemd/system

và tìm các dịch vụ hoặc mục tiêu nổi tiếng là tuần tự nhưng theo thứ tự bên ngoài cho dịch vụ này.

thí dụ:

dbus.service

thường là thị trường "sau"

multi-user.target

nhưng "trước"

sockets.target

sự phụ thuộc như vậy có thể dễ dàng được quan sát bằng cách gọi

systemctl list-dependencies default.target

tuy nhiên nếu tập tin

/lib/systemd/system/dbus.service

chứa các dòng như:

Before=multi-user.target

hoặc là

After=sockets.target

hoặc cả hai đồng thời, có nghĩa là dbus.service được xác định ra bên ngoài và nó gây ra một chu kỳ vô tận của hệ thống.

Cách chữa rất đơn giản - đổi từ "Sau" thành "Trước" và ngược lại nếu cần.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.