सिस्टमिक में साइकल ऑर्डर करने के लिए डिबग करने की सामान्य कार्यप्रणाली


23

मैं निम्नलिखित धागे से अवगत हूं और माना जाता हूं कि इसका उत्तर है । एक उत्तर को छोड़कर सामान्य ज्ञान में उत्तर नहीं है। यह बताता है कि समस्या एक विशेष मामले में क्या थी, लेकिन सामान्य रूप से नहीं।

मेरा सवाल यह है: क्या जेनेरिक तरीके से साइकिल ऑर्डर करने का डिबग करने का कोई तरीका है? उदाहरण: क्या कोई कमांड है जो चक्र का वर्णन करेगा और क्या एक इकाई को दूसरे से जोड़ता है?

उदाहरण के लिए, मेरे पास निम्नलिखित हैं journalctl -b(कृपया तारीख की अवहेलना करें, मेरे सिस्टम में समय के साथ सिंक करने के लिए कोई आरटीसी नहीं है):

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 बेसिक.service चाहता है, सिवाय इसके कि यह नहीं, कम से कम स्पष्ट रूप से नहीं। क्या कोई कमांड है जो प्रदर्शित करेगा कि यह लिंक कहां से लिया गया है? और सामान्य तौर पर, क्या कोई आज्ञा है, जो चक्रों को खोजेगी और बताएगी कि चक्र में प्रत्येक लिंक की उत्पत्ति कहां से होती है?

जवाबों:


20

क्या कोई कमांड है जो प्रदर्शित करेगा कि यह लिंक कहां से लिया गया है?

आप जो सबसे करीबी कर सकते हैं systemctl show -p Requires,Wants,Requisite,BindsTo,PartOf,Before,After cvol.service, वह किसी दी गई इकाई के लिए परिणामी (प्रभावी) निर्भरता सूचियों को दिखाएगा।

क्या कोई आज्ञा है, जो चक्रों को खोजेगी और बताएगी कि चक्र की प्रत्येक कड़ी की उत्पत्ति कहां से होती है?

मेरी जानकारी के लिए, ऐसा कोई आदेश नहीं है। वास्तव में systemd डिबगिंग साइकल (आह) में सहायता करने के लिए कुछ भी प्रदान नहीं करता है।

Journalctl के अनुसार, cvol.service बेसिक.service चाहता है, सिवाय इसके कि यह नहीं, कम से कम स्पष्ट रूप से नहीं।

सबसे पहले, आवश्यकता निर्भरता ( Wants=और Requires=, BindsTo=आदि) निर्भरता ( Before=और After=) के आदेश से स्वतंत्र हैं । आप यहां जो देख रहे हैं, वह एक ऑर्डरिंग डिपेंडेंसी चक्र है, इसका कोई मतलब नहीं है Wants=आदि।

दूसरा, कुछ प्रकारों की इकाइयों के बीच बनाई गई "डिफ़ॉल्ट निर्भरता" की एक संख्या है। वे अनुभाग DefaultDependencies=में निर्देश द्वारा नियंत्रित होते हैं [Unit](जो डिफ़ॉल्ट रूप से सक्षम होता है )।

विशेष रूप से, जब तक कि यह निर्देश स्पष्ट रूप से अक्षम नहीं होता है, तब तक किसी भी .serviceप्रकार की इकाई को निहित Requires=basic.targetऔर After=basic.targetनिर्भरता नहीं मिलती है , जो कि वास्तव में आप देखते हैं। यह systemd.service (5) में प्रलेखित है ।


आपके द्वारा उद्धृत कमांड ने पूरी तरह से काम किया है, और वास्तव में Basic.target पर निर्भरता का पता चला है। यह शर्म की बात है कि systemctl के लिए टूलसेट की कमी है, लेकिन ओह ठीक है, यह एक नई परियोजना है
18

2
@galets: मेरे अनुभव को देखते हुए, इस तरह की कमी के बहुत कम उदाहरण हैं ... हो सकता है कि किसी दिन मैं साइकिल रिपोर्टर की बढ़ती वर्बॉसिटी के बारे में जानकारी दूंगा, जिसमें लॉग में कुछ उपयोगी जानकारी होगी। इस बीच, वास्तव में, आप systemd-analyze verify UNITयूनिट की शुद्धता की जांच करने के लिए उपयोग कर सकते हैं । पर्दे के पीछे, यह कमांड एक वर्चुअल सिस्टमड उदाहरण बनाता है और यूएनआईटी को प्रारंभिक लेनदेन के रूप में लोड करने की कोशिश करता है (जैसे कि यह था default.target)। यह किसी भी नई जानकारी (लॉग्स की तुलना में) को प्रकट नहीं करेगा, लेकिन कम से कम आपको यह देखने में सक्षम होने वाली इकाई के साथ रिबूट नहीं करना होगा कि क्या यह विफल होता है।
intelfx

एन्हांसमेंट के लिए
सिस्टमड रिक्वेस्ट

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 स्थापित पर यहां मौजूद नहीं है।
11

@ सज्ज, तब से systemd-analyze verify उपलब्ध है v216। कोशिश करो systemd-verify। क्या यह मौजूद है?
एव्जेनी Vereshchagin

: एचएम, यह जेसी पर मौजूद नहीं है anonscm.debian.org/cgit/pkg-systemd/systemd.git/tree/debian/...
एव्जेनी Vereshchagin

1
systemd-analyze verify default.targetअपने आप में पाश दिखाने में एक अच्छा काम करता है ...
Gert van den Berg

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: आम तौर पर परिभाषित सेवा या लक्ष्य फ़ाइल के अंदर "पहले" और "पहले" समूहों को देखें

/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 को आउटबाउंड के रूप में परिभाषित किया गया है और यह एक प्रणालीगत अंतहीन चक्र का कारण बन रहा है।

इलाज परिवर्तन शब्द - सरल है "के बाद" को "इससे पहले कि" और उपाध्यक्ष प्रतिकूल यदि आवश्यक हो तो।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.