कर्नेल और बिजीबॉक्स के साथ न्यूनतम लिनक्स: / etc / inittab को अनदेखा किया जाता है, केवल / init निष्पादित किया जाता है


12

मैं एक छोटा और पूरी तरह कार्यात्मक लाइव लिनक्स सीडी बनाने में कामयाब रहा जिसमें केवल कर्नेल (डिफ़ॉल्ट विकल्पों के साथ संकलित) और बिजीबॉक्स (डिफ़ॉल्ट विकल्पों के साथ संकलित + स्थैतिक, सभी एप्लेट मौजूद हैं, जिसमें शामिल हैं /sbin/init)। मेरे पास बनाने initrdऔर आबाद करने के लिए कोई मुद्दा नहीं था /dev, /procऔर /sysसाथ ही मेरे पास अपनी /initशेल स्क्रिप्ट के साथ कोई समस्या नहीं थी ।

हाल ही में मैंने पढ़ा कि बिजीबॉक्स /etc/inittabकॉन्फ़िगरेशन (कम से कम कुछ स्तर तक) का समर्थन करता है और मैं बहुत निम्न में से किसी एक को करना चाहता हूं:

  • मेरी /initशेल स्क्रिप्ट के बारे में भूल जाओ और पूरी तरह से /etc/inittabकॉन्फ़िगरेशन पर भरोसा करो ।
  • /initशेल स्क्रिप्ट और /etc/inittabकॉन्फ़िगरेशन दोनों का उपयोग करें ।

अब वास्तविक समस्या है - ऐसा लगता है कि /etc/inittabजब मेरा डिस्ट्रो बूट शुरू हो जाता है तो इसे पूरी तरह से नजरअंदाज कर दिया जाता है। लक्षण हैं:

  • जब मैं हटाता हूं /initऔर छोड़ता हूं तो मैं /etc/inittabकर्नेल पैनिक करता हूं। मेरी धारणा यह है कि कर्नेल बिल्कुल भी निष्पादित नहीं करता है /sbin/init, या जो /sbin/initनहीं ढूंढता (या पढ़ता है) /etc/inittab
  • मैंने पढ़ा कि बिजीबॉक्स को भी बिना ठीक काम करना चाहिए /etc/inittab। तो, मैं हटा दिया दोनों /initऔर /etc/inittabऔर लगता है क्या - फिर से आतंक गिरी।
  • मैंने /sbin/initअपने शेल से निष्पादित करने की कोशिश की और कई अनुमानों के बाद जो इसमें शामिल थे exec /sbin/init, setsid /sbin/initऔर exec setsid /sbin/initमैं कर्नेल आतंक के साथ समाप्त हुआ। फाइल सिस्टम पर मौजूद होने के साथ और बिना / etc / inittab दोनों।

यहाँ मेरे /initशेल स्क्रिप्ट की सामग्री है :

#!/bin/sh
dmesg -n 1
mount -t devtmpfs none /dev
mount -t proc none /proc
mount -t sysfs none /sys
setsid cttyhack /bin/sh

इस बिंदु पर मुझे परवाह नहीं है कि क्या सामग्री /etc/inittabहोगी, जब तक कि मेरे पास यह जानने का एक तरीका है कि वास्तव में वहां कॉन्फ़िगरेशन काम करता है। मैं कई की कोशिश की /etc/inittabविन्यास, सभी जानकारी मैंने पाया जिसके आधार पर यहाँ

नंगे न्यूनतम के रूप में मेरे / etc / inittab में सिर्फ यही एक पंक्ति निहित थी:

::sysinit:/bin/sh

फिर से - मैं कर्नेल घबराहट के साथ समाप्त हुआ और ऐसा लगता है कि /etc/inittabइसे अनदेखा कर दिया गया।

किसी भी सुझाव कैसे व्यस्त व्यस्त के साथ ठीक काम करने के लिए मेरे छोटे रहते distro को मजबूर करने के /etc/inittabलिए बहुत सराहना की है!

अपडेट करें:

  • बस यह स्पष्ट करने के लिए - मुझे अपनी वर्तमान शेल स्क्रिप्ट के साथ और बिना दोनों के साथ कर्नेल पैनिक की परेशानी नहीं है । यह सब ठीक काम करता है, मेरा कंसोल बढ़िया काम करता है और मैं किसी भी अप्रत्याशित परेशानी का अनुभव नहीं करता हूं। एकमात्र मुद्दा यह है कि पूरी तरह से अनदेखा किया गया है, जैसा कि मैंने ऊपर वर्णित किया है।/init/etc/inittab/bin/ash/etc/inittab
  • मैंने 3 अलग-अलग लाइव लिनक्स वितरणों की जांच की: स्लैक्स, फिनिक्स और SysResCD। उन सभी के पास है /initऔर उनमें से कोई भी नहीं है /etc/inittab। इसके अलावा यह विकी लेख मेरे संदेह को समाप्त करता है जो /sbin/initबिल्कुल भी नहीं है।

यदि आप यहां आए, तो मिनिमल लिनक्स लाइव पर एक नज़र डालें, जो ऐसा करना चाहता है, और बस काम करता है: github.com/ivandavidov/minimal
Ciro Santilli 冠状 take take take

आह, ओपी ने मिनिमल लिनक्स लाइव लिखा! यार तुम रॉक।
सिरो सेंटिल्ली 冠状 病毒 iro i 法轮功

जवाबों:


11

ठीक है, मैंने बहुत व्यापक शोध किया और मुझे पता चला कि क्या गलत था। आइए एक-एक करके शुरू करें:

  • जब हम initramfsबूट स्कीम का उपयोग करते हैं तो वह पहली प्रक्रिया होती है जो कर्नेल की /initस्क्रिप्ट होती है। कर्नेल कभी भी /sbin/initसीधे निष्पादित करने का प्रयास नहीं करेगा ।
  • /init है सौंपा पहचानकर्ता 1. यह बहुत महत्वपूर्ण है!
  • अब समस्या यह है कि /sbin/initइसे केवल शुरू किया जा सकता है PID 1लेकिन हम पहले से ही /initपीआईडी ​​1 के रूप में चल रहे हैं ।
  • समाधान कमांड लाइन को निष्पादित करना है, exec /sbin/initजबकि हम अभी भी अंदर हैं /init। इस तरह नई प्रक्रिया (जो है /sbin/init) पीआईडी ​​को उसके अभिभावक ( /initपीआईडी ​​1 के साथ ) से विरासत में मिली होगी और यही हमें करना है।

समस्या जो मैंने अपने प्रारंभिक कॉन्फ़िगरेशन के साथ अनुभव की (प्रश्न देखें) इस तथ्य के कारण थी कि मेरी /initस्क्रिप्ट जो आखिरी काम करती है वह नई /bin/shप्रक्रिया को स्पॉन करना है जिसे ब्रांड पीआईडी ​​को सौंपा गया है। इस बिंदु /sbin/initसे सीधे इंटरेक्टिव कंसोल से चलाना असंभव है क्योंकि जब हम कमांड लाइन को निष्पादित करते हैं exec /sbin/init, तो हम जो सबसे अच्छा प्राप्त करते हैं, वह उसी पीआईडी ​​को असाइन करना है जो पहले ही शेल को सौंपा गया है और यह पीआईडी ​​निश्चित रूप से पीआईडी ​​1 नहीं है।

छोटी कहानी - कमांड लाइन को exec /sbin/initसीधे से निष्पादित करें /initऔर बस इतना ही।

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