एक लिनक्स कर्नेल का सिस्टम शटडाउन आंतरिक रूप से कैसे काम करता है?


28

मेरे पास किसी तरह का एक मोटा विचार है कि सिस्टम शटडाउन पर उपयोगकर्ता और इन-सिस्टम (यह क्लासिक इनिट sysV / upstart / systemd) कैसे काम करते हैं। (अनिवार्य रूप से "स्टॉप!" का एक क्रमिक क्रम है, "कृपया अब वास्तव में रुकें", "प्रक्रिया मुझे आपको रोकने के लिए मारने की आवश्यकता है" और प्रतीक्षा ... चीजें चल रही हैं)।

मैं किसी भी तरह से इस बात से अनभिज्ञ हूँ कि कैसे कर्नेल में सिस्टम शटडाउन काम करता है (जहाँ निश्चित रूप से बहुत सारा सामान करना है)?

मैंने कर्नेल प्रलेखन https://www.kernel.org/doc/htmldocs/ में देखने की कोशिश की और यहां तक कि यह कैसे काम करता है, यह जानने के लिए NSA के पाल सर्च टूल का इस्तेमाल किया ।

इसके अलावा, मैंने एसई यू + एल पर खोज की और कुछ भी नहीं मिला (क्या मैंने इसे अनदेखा किया?)

वैसे भी प्रश्न, हालांकि संभावित रूप से थोड़ा चुनौतीपूर्ण है, इस प्रश्नोत्तर नेटवर्क में एक उत्तर का गुणन करेगा क्योंकि मुझे लगता है कि अधिक लोगों को दिलचस्पी है कि शटडाउन में लिनक्स कर्नेल में क्या होता है।

संभावित रूप से कुछ और विस्तृत विवरणों से लिंक करने के लिए परिवर्तन भी है।

एक उत्तर में शायद शामिल हो सकता है कि कौन-सी प्रणाली-कॉल और कौन-सी कर्नेल सिग्नल का उपयोग किया जाता है?

https://github.com/torvalds/linux/blob/b3a3a9c441e2c8f6b6760de9331023a7906a4ac6/arch/x86/kernel//bboot.c रीबूट से संबंधित x86 उपयोग की गई फ़ाइल प्रतीत होती है (पहले से ही शटडाउन के करीब, एह)?

शायद यहाँ पाया गया स्निपेट http://lxr.free-electrons.com/source/kernel/reboot.c#L176 का उपयोग स्पष्टीकरण देने के लिए किया जा सकता है

176 शून्य कर्नेल_पॉवर_ऑफ़ (शून्य)
177 {
178 कर्नेल_शटडाउन_परपज (SYSTEM_POWER_OFF);
179 अगर (pm_power_off_prepare)
180 pm_power_off_prepare ();
181 माइग्रेट_टो_रेबूट_ सीपीयू ();
182 syscore_shutdown ();
183 pr_emerg ("पावर डाउन \ n");
184 kmsg_dump (KMSG_DUMP_POWEROFF);
185 मशीन_पावर_ऑफ ();
186}
187 EXPORT_SYMBOL_GPL (kernel_power_off);

8
आप के साथ गेंडा हो सकता है
कीवी

1
@ कीवी सुझाव के लिए धन्यवाद। संभावित बेहतर जवाब आने के लिए कुछ समय बीत जाने के बाद मैं स्वीकार करूंगा। लेकिन कम से कम कुछ जवाब अब है।
मानवतातापीस

मुझे धन्यवाद मत देना, गेंडा धन्यवाद!
किवी

बारे में पता है कि वहाँ / एक था बनें खिड़की के बाहर कूद विकल्प को shutdown(8)यानी पदावनत -n एक जो मैं लगता है कि पढ़ने के लिए प्रयोग किया जाता है पुराने यूनिक्स दस्तावेज में " बंद प्रणाली अपने आप को - कोर इकाई पर आग है " प्रभावी रूप से एक गंदा प्रणाली को मार स्विच जो फर्श पर बिखरे हुए बिट्स को छोड़ सकता है (या कम से कम एक भ्रष्ट स्थिति में फाइल-सिस्टम) - कोई यह कल्पना करता है कि इसका उपयोग मुख्य-फ्रेम प्रकार की प्रणाली के लिए किया जाएगा, जहां किसी ने सिर्फ एक शीतलन प्रशंसक में अपना हाथ पकड़ा है। S
14

जवाबों:


26

लिनक्स कर्नेल कैसे काम करता है, यह समझने के लिए मुख्य संसाधन:

  1. प्रलेखन
  2. लिनक्स साप्ताहिक समाचार लेख
  3. स्रोत। यह एक जटिल जानवर है जो एलएक्सआर , लिनक्स क्रॉस-रेफरेंस के माध्यम से पकड़ना थोड़ा आसान है । LXr.linux.no पर चलने वाला LXR वेरिएंट दूसरों की तुलना में अच्छा है, लेकिन यह अक्सर नीचे है।

इस मामले में, मैं प्रलेखन में या LWN पर कुछ भी प्रासंगिक नहीं पा सकता हूं, इसलिए LXR यह है।

अंतिम बात जो यूजरलैंड कोड करता है वह है rebootसिस्टम कॉल । यह 4 तर्क लेता है, इसलिए SYSCALL_DEFINE4(rebootLXR पर खोज करें , जो आगे बढ़ता है kernel/reboot.c। कॉलर के विशेषाधिकारों और तर्कों की जाँच करने के बाद, syscall प्रविष्टि बिंदु कई कार्यों में से एक को कॉल करता है: kernel_restartरिबूट kernel_haltकरने के लिए, एक तंग लूप पर रुकने के kernel_poweroffलिए, सिस्टम को बंद kernel_kexecकरने के लिए, कर्नेल को एक नया (यदि संकलित करके) प्रतिस्थापित किया जाए, या hibernateबंद करने से पहले मेमोरी को डिस्क पर सहेजने के लिए।

kernel_restart, kernel_haltऔर kernel_power_offकाफी समान हैं:

  1. के माध्यम से जाओ reboot_notifier_list, जो हुक की एक सूची है जो कर्नेल घटक पावरडाउन पर कोड निष्पादित करने के लिए रजिस्टर कर सकते हैं । केवल कुछ ड्राइवरों को इस चरण में कोड निष्पादित करने की आवश्यकता होती है, ज्यादातर वॉचडॉग।
  2. system_stateचर सेट करें ।
  3. यह सुनिश्चित करने के लिए कि कोई उपयोगकर्ता कोड अब शुरू नहीं किया जाएगा, usermode-helper को अक्षम करें । (इस चरण में अभी भी मौजूदा प्रक्रियाएं हो सकती हैं।)
  4. device_shutdownसिस्टम पर सभी डिवाइस को रिलीज़ या पावर डाउन करने के लिए कॉल करें। बहुत सारे ड्राइवर इस अवस्था में आते हैं।
    ध्यान दें कि इस बिंदु पर अभी भी माउंट किए गए किसी भी फाइल सिस्टम को जबरन अनमाउंट किया जाता है। सिस्टम कॉल का कॉल करने वाला किसी भी साफ-सफाई के लिए जिम्मेदारी लेता है।
  5. केवल पावर ऑफ़ के लिए, यदि ACPI कॉन्फ़िगर किया गया है, संभवतः ACPI स्थिति S5 (सॉफ्ट पावर ऑफ़) में जाने के लिए कोड निष्पादित करें ।
  6. मल्टी-सीपीयू मशीन में, कोड किसी भी सीपीयू पर चल सकता है, जो भी सिस्टम कॉल को लागू करता है। migrate_to_reboot_cpuएक विशेष CPU पर स्विच करने और शेड्यूलर को अन्य CPU पर डिस्पैचिंग कोड से रोकने का ध्यान रखता है। इस बिंदु के बाद, केवल एक ही सीपीयू चल रहा है।
  7. syscore_shutdownपंजीकृत syscore संचालन की shutdownविधि को कॉल करता है । मुझे लगता है कि यह ज्यादातर व्यवधानों को निष्क्रिय करने के बारे में है; कुछ हुक में एक विधि है।shutdown
  8. एक सूचना संदेश दर्ज करें - हंस का गीत।
  9. अंत में कुछ मशीन-निर्भर तरीके से कॉल करके आराम करें machine_restart, machine_haltया machine_power_off

हाइबरनेशन कोड निम्न चरणों के माध्यम से चला जाता:

  1. बिजली प्रबंधन हुक के माध्यम से Iterate ।
  2. फाइलसिस्टम सिंक करें।
  3. सभी उपयोगकर्ता कोड को फ्रीज करें
  4. डिवाइस हॉटप्लगिंग को रोकें
  5. स्वैप स्थान के लिए सिस्टम स्थिति को डंप करें।
  6. यदि सब कुछ सफल रहा, तो हार्डवेयर को हाइबरनेट करें । इसमें कॉलिंग kernel_restart, kernel_haltया kernel_power_off, या कुछ प्लेटफ़ॉर्म-विशिष्ट हाइबरनेशन विधि शामिल हो सकती है।

सिस्टम को बंद करने का एक अलग तरीका है machine_emergency_restart। यह जादू SysRq कुंजीB द्वारा लागू किया गया है । Oकुंजी अलग तरह से काम करता है: यह कहता हैkernel_power_off

सिस्टम एक आतंक के लिए बंद हो सकता है , यानी एक अपरिवर्तनीय त्रुटि। पैनिंग एक संदेश को लॉग करने का प्रयास करता है, फिर सिस्टम को रिबूट करता है (या तो हार्डवेयर वॉचडॉग या आपातकालीन पुनरारंभ के माध्यम से)।


+1 धन्यवाद! @Gilles अगर आप कुछ कोड है कि पोंछा करती थी लागू करने के लिए करना चाहता था / sanatize मशीन की रैम एक laststep के रूप में आप एक syscore आपरेशन रजिस्टर होगा के लिए syscore_shutdown(यानी कि मेरे दूसरे प्रश्न का समाधान होगा unix.stackexchange.com/q/122540/24394 ) । चरण (1) और चरण (7) दोनों शटडाउन पर निष्पादित होने के लिए सामान को पंजीकृत करने की अनुमति देते हैं, न कि वह क्या है जो मुझे + 1 में उन कॉलबैक के निष्पादन के आदेश का आभास था! (7) प्रभावित नहीं किया जा सकता है! मैं आपके द्वारा बताए गए डॉक्स, लेकिन यदि आप जानते हैं! धन्यवाद!
मानवतावादी

मुझे आश्चर्य है कि इस प्रश्न और उत्तर में अधिक उभार नहीं है।

2

यह केवल एक आंशिक उत्तर है और मैं निश्चित रूप से अन्य उत्तर को आमंत्रित करता हूं, जो अधिक विस्तृत और स्पष्ट हो सकता है।

इस उत्तर की सामग्री को 3.13 लिनक्स कर्नेल kernel/reboot.cफ़ाइल से लिया गया है (जो कि पहला अनुमान नहीं हो सकता है क्योंकि नाम शटडाउन नहीं है। लेकिन रिबूट।

वैसे भी हमारे पास मूल रूप से तीन कार्य हैं जो सिस्टम को बंद करने की प्रक्रिया को स्केच करते हैं

  • void kernel_halt(void) // जो हाल्ट राज्य में एक प्रणाली के साथ समाप्त होता है
  • void kernel_power_off(void) // जो एक सिस्टम से संचालित होता है
  • void kernel_restart(char *cmd) // जो सिस्टम को समाप्त करता है फिर भी इसे पुनरारंभ करना है

वे कार्य बहुत संक्षिप्त हैं और इसलिए उन्हें यहाँ पूर्ण रूप से चिपकाया जा सकता है। उनका कोड सबसे अच्छा दिखाता है कि कर्नेल में बंद करने के तरीके पर क्या कदम उठाए गए हैं। (टिप्पणियाँ मेरे द्वारा की गई हैं और 100% आदर्श और सही नहीं हो सकती हैं, यह सुनिश्चित करने के लिए अपने आप को जांचें कि यह एक सरल प्रयास है।

void kernel_halt(void)

शून्य कर्नेल_टल (शून्य)
{
    // 1 चरण करता है:
    // ए) कॉल फ़ंक्शन / कॉलबैक रिबूट / शटडाउन पर चलाने के लिए पंजीकृत है
    // b) system_sate को SYSTEM_HALT पर सेट करें
    // c) यूजरपेसटूल इंटरैक्शन को रोकें
    // d) कॉल device_shutdown () फ़ंक्शन
    kernel_shutdown_prepare (SYSTEM_HALT);

    // दूसरा चरण: मुझे लगता है कि यह बहु-सीपीयू प्रणालियों के लिए एक आवश्यकता है
    migrate_to_reboot_cpu ();

    // तीसरा चरण:
    // syscore_shutdown - सभी पंजीकृत सिस्टम कोर शटडाउन कॉलबैक निष्पादित करें 
    syscore_shutdown ();

    // 4 वां संदेश
    pr_emerg ("सिस्टम रुका हुआ \ n");
    kmsg_dump (KMSG_DUMP_HALT);

    // 5 वीं कॉल आर्क विशिष्ट सीपीयू-हाल्ट-कोड
    machine_halt ();
}

पूरी बात को sys_rebootसिस्टम कॉल के साथ शुरू किया गया है, जिसे देखते हुए यह न केवल रिबूट करता है, बल्कि शटडाउन भी करता है, न कि किसी भी तरह से शटडाउन प्रक्रिया से जुड़ने के लिए।

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