क्या सभी कर्नेल तर्क वास्तव में कर्नेल द्वारा उपयोग किए जाते हैं?


11

लिनक्स 'init = / bin / bash' की अनुमति क्यों देता है?

मैंने इसे पढ़ा, जवाब कह रहे हैं कि यह KERNEL इस init प्रोग्राम को चला रहा है।

फिर मैंने आश्चर्य करना शुरू कर दिया, लिनक्स आमतौर पर एक इनट्रैमफैट्स के साथ आता है, जो अंततः वास्तविक रूट फाइलसिस्टम को माउंट और पिवोट करेगा। तो इस initतर्क का क्या मतलब है? Initramfs में पथ? या जैसे मैंने अनुमान लगाया, यह कर्नेल द्वारा नहीं बल्कि initramfs द्वारा वास्तविक इनिट को निष्पादित करने के लिए पढ़ा गया है।

इसके अलावा, root=UUID=xxxxतर्क यह है कि क्या वास्तव में कर्नेल द्वारा या सिर्फ initramfs द्वारा वास्तविक रूट फाइलसिस्टम खोजने के लिए पढ़ा जाता है?

ऐसा लगता है कि मैं किसी भी तर्क को मैं कर्नेल तर्क के रूप में पारित कर सकता हूं, इसलिए क्या वे सभी कर्नेल द्वारा पढ़े जाते हैं या उनमें से कम से कम कुछ केवल उपयोगकर्ता कार्यक्रम के लिए सार्थक हैं?

जवाबों:


18

कर्नेल कमांड लाइन पर पारित पैरामीटर को कर्नेल के लिए सार्थक होने की आवश्यकता नहीं है: कर्नेल पैरामीटर दस्तावेज़ कहता है

कर्नेल कर्नेल कमांड लाइन से "-" तक के पैरामीटर को पार्स करता है; यदि यह किसी पैरामीटर को नहीं पहचानता है और इसमें '' नहीं है, तो पैरामीटर init में पास हो जाता है: '=' के साथ पैरामीटर init के वातावरण में चले जाते हैं, अन्य को init में कमांड लाइन तर्क के रूप में पारित किया जाता है। "-" के बाद सब कुछ init के तर्क के रूप में पारित किया जाता है।

यह लागू नहीं होता है initऔर rootजो वास्तव में कर्नेल पैरामीटर हैं, और कर्नेल द्वारा नियंत्रित किया जाता है। वे उपयोगकर्ता-स्थान पर भी काम कर सकते हैं, क्योंकि वे दिखाई देते हैं /proc/cmdline। (इस प्रकार उदाहरण के लिए systemd quietअपने उत्पादन को कम करने के लिए कर्नेल पैरामीटर को ध्यान में रखता है।)

जब कर्नेल को इनट्रामाफ़्स के साथ बूट किया जाता है, तो rootपैरामीटर सीधे कर्नेल द्वारा उपयोग नहीं किया जाता है, और initपैरामीटर केवल तभी उपयोग किया जाता है यदि rdinitविफल हो जाता है। initस्टार्टअप को संभाला जाता है kernel_init, जो निम्नानुसार काम करता है:

  • अगर वहाँ एक "रैमडिस्क कमांड निष्पादित करें" (या तो rdinitकर्नेल कमांड लाइन पर दिया गया मूल्य , या /init) जो सुलभ है, कर्नेल उसे चलाने का प्रयास करता है;
  • यदि वह विफल रहता है, और एक "निष्पादित कमांड" ( initकर्नेल कमांड लाइन पर दिया गया मूल्य ) है, तो कर्नेल उसे चलाने का प्रयास करता है, और यदि वह नहीं कर सकता है, तो आतंकित होता है;
  • एक अंतिम उपाय के रूप में, कर्नेल चलाने की कोशिश करता है /sbin/init, /etc/init, /bin/init, और /bin/sh; यदि उनमें से कोई भी नहीं चलाया जा सकता है, तो यह आतंकित करता है

जब इनट्रामाफ़्स होता है, तो यह सब वहां होता है, और लक्ष्य वॉल्यूम कर्नेल द्वारा माउंट नहीं किया जाता है। कर्नेल पहला प्रोग्राम चलाने के बाद क्या होता है init(आमतौर पर, /initinitramfs में स्क्रिप्ट) प्रोग्राम पर निर्भर है, कर्नेल के लिए नहीं। यदि फ़ाइल सिस्टम आरोहित है init, /proc/cmdlineतो तर्क जो पारित नहीं हुए हैं, वे अभी भी उपलब्ध हैं /proc


थोड़ा उत्सुक भी, क्या होगा अगर init-in-the-initramfs एक सेट-यूआईडी-गैर-रूट फ़ाइल है? निष्पादन योग्य बिट के बिना एक फ़ाइल? क्या इसे वैसे भी रूट के रूप में चलाया जाएगा? क्या होगा अगर यह ईएलएफ टूट गया है या ld-linux.soईएलएफ या पुनरावृत्ति-बहुत-गहरी स्क्रिप्ट या कुछ भी नहीं मिल सकता है बस निष्पादित नहीं किया जा सकता है?
:58 德里克

3
मुझे पूरा यकीन है कि कर्नेल initramfs से "init =" में निर्दिष्ट प्रोग्राम को लोड नहीं करता है। यह initramfs उपयोग में है तो यह उपयोगकर्ता-निर्दिष्ट init प्रोग्राम चलाने से पहले सामान्य रूप से चलता है (यदि यह कर्नेल initramfs में ऐसा करता है या कोड करता है तो सुनिश्चित नहीं है)।
प्लगवेट

@ @ Instead d /initरैमडिस्क से बूट करने के बजाय वैकल्पिक प्रोग्राम निर्दिष्ट करने के लिए , आप rdinit=/path/toबूट पैरामीटर का उपयोग कर सकते हैं ।
पिज्डलेक्ट

3

कस्टम कर्नेल तर्क पास करना किकस्टार्ट संस्थापन के दौरान सिस्टम को अनुकूलित करने का एक तरीका है, उदाहरण के लिए एक पीएक्सई सर्वर सेट कर सकता है:

linuxefi /c7/vmlinuz ks=http://.../ks/c7 lab ksdevice=eth0 net.ifnames=0 biosdevname=0

जहां labउसके बाद किकस्टार्ट विन्यास में प्रयोग किया जाता है के लिए अन्य प्रणाली बनाता है की तुलना में अलग काम करने के लिए:

%pre
...
case " $(cat /proc/cmdline)" in
   ...
   *\ lab*)
      filesystems_lab
      ;;
   *)
      filesystems_common
      ;;
...

अन्य सिस्टम प्रकारों पर उपयोग किए जाने की तुलना में एक अलग फाइल सिस्टम लेआउट को सेटअप करने के लिए। उम्मीद है कि अलग-अलग लेबल स्थानीय अनुकूलन के लिए उपयोग किए जाते हैं, कर्नेल द्वारा उपयोग किए जाने वाले एकल नामस्थान को शामिल करते हुए।

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