न्यूनतम रूट फाइल सिस्टम एप्लिकेशन क्या हैं जो पूरी तरह से बूट करने के लिए आवश्यक हैं?


17

यह उपयोगकर्ता अंतरिक्ष अनुप्रयोगों के बारे में एक सवाल है, लेकिन मुझे सुनें!

तीन "एप्लिकेशन", इसलिए बोलने के लिए, लिनक्स के कार्यात्मक वितरण को बूट करने के लिए आवश्यक हैं:

  1. बूटलोडर - एम्बेडेड के लिए आमतौर पर यह यू-बूट है, हालांकि एक कठिन आवश्यकता नहीं है।

  2. कर्नेल - यह बहुत सीधा है।

  3. रूट फाइलसिस्टम - बिना शेल के बूट नहीं किया जा सकता है। फाइलसिस्टम को कर्नेल बूट्स में समाहित करता है, और जहां initफॉर्म कहा जाता है।

मेरा प्रश्न # 3 के संबंध में है। यदि कोई व्यक्ति एक अत्यंत न्यूनतम रूटफुट बनाना चाहता है (इस प्रश्न के लिए कोई GUI, शेल केवल कहते हैं), शेल को बूट करने के लिए कौन सी फाइलें / प्रोग्राम आवश्यक हैं?


न्यूनतम परिभाषित करें। आप केवल एक ही निष्पादन योग्य का उपयोग कुछ और नहीं कर सकते हैं जैसा कि समझाया गया है: superuser.com/a/991733/128124 बस इतना है कि यह हर निकास या अन्य आतंक नहीं कर सकता है, इसलिए आपको एक अनंत लूप या लंबी नींद की आवश्यकता है। इसी तरह के सवाल: unix.stackexchange.com/questions/17122/…
Ciro Santilli 中心।।।

जवाबों:


33

यह पूरी तरह से इस बात पर निर्भर करता है कि आप अपने डिवाइस में कौन सी सेवाएं लेना चाहते हैं।

कार्यक्रम

तुम एक में सीधे लिनक्स बूट कर सकते हैं खोल । यह उत्पादन में बहुत उपयोगी नहीं है - जो सिर्फ एक खोल के साथ बैठे रहना चाहते हैं - लेकिन यह एक हस्तक्षेप तंत्र के रूप में उपयोगी है जब आपके पास एक इंटरैक्टिव बूटलोडर है: init=/bin/shकर्नेल कमांड लाइन को पास करें। सभी लिनक्स सिस्टम (और सभी यूनिक्स सिस्टम) में एक बॉर्न / POSIX- शैली शेल है /bin/sh

आपको शेल उपयोगिताओं के एक सेट की आवश्यकता होगी । बिजीबॉक्स एक बहुत ही आम विकल्प है; यह फ़ाइल और पाठ हेरफेर (के लिए एक खोल और आम उपयोगिताओं शामिल cp, grepनेटवर्किंग सेटअप,, ...) ( ping, ifconfig, ...), प्रक्रिया में गड़बड़ी ( ps, nice, ...), और विभिन्न अन्य प्रणाली उपकरण ( fdisk, mount, syslogd, ...)। बिजीबॉक्स अत्यंत विन्यास योग्य है: आप अपने एप्लिकेशन के लिए सही आकार / कार्यक्षमता समझौता प्राप्त करने के लिए, कौन से उपकरण चाहते हैं और यहां तक ​​कि व्यक्तिगत सुविधाओं का भी संकलन समय पर चयन कर सकते हैं। इसके अलावा sh, न्यूनतम है कि तुम सच है के बिना कुछ भी नहीं कर सकते mount, umountऔर halt, लेकिन यह भी नहीं करने के लिए असामान्य होगा cat, cp, mv, rm,mkdir, rmdir, ps, syncऔर कुछ और। बिजीबॉक्स एक एकल बाइनरी नामक busyboxएक उपयोगिता के लिए एक प्रतीकात्मक लिंक के साथ स्थापित करता है ।

एक सामान्य यूनिक्स प्रणाली पर पहली प्रक्रिया को कहा जाता है init। इसका काम अन्य सेवाओं को शुरू करना है। बिजीबॉक्स में एक init सिस्टम होता है। initबाइनरी के अलावा (आमतौर पर स्थित /sbin), आपको इसकी कॉन्फ़िगरेशन फ़ाइलों की आवश्यकता होगी (आमतौर पर कहा जाता है /etc/inittab- कुछ आधुनिक इनिट प्रतिस्थापन उस फ़ाइल के साथ दूर करते हैं लेकिन आप उन्हें एक छोटे एम्बेडेड सिस्टम पर नहीं पाएंगे) जो इंगित करते हैं कि क्या सेवाएं शुरू करनी हैं और कब। बिजीबॉक्स के लिए, /etc/inittabवैकल्पिक है; यदि यह गायब है, तो आपको कंसोल पर एक रूट शेल मिलता है और स्क्रिप्ट /etc/init.d/rcS(डिफ़ॉल्ट स्थान) को बूट समय पर निष्पादित किया जाता है।

यह सब आप की जरूरत है, निश्चित रूप से उन कार्यक्रमों से परे है जो आपके डिवाइस को कुछ उपयोगी बनाते हैं। उदाहरण के लिए, मेरे होम राउटर पर ओपेनवर्ट वैरिएंट चलाने पर , केवल प्रोग्राम्स बिजीबॉक्स, nvram(एनवीआरएएम में सेटिंग्स को पढ़ने और बदलने के लिए), और नेटवर्किंग यूटिलिटीज हैं।

जब तक आपके सभी निष्पादनों को सांख्यिकीय रूप से जोड़ा नहीं जाता है, आपको डायनेमिक लोडर ( ld.so, जिसे libc की पसंद और प्रोसेसर आर्किटेक्चर पर निर्भर करता है) के आधार पर और सभी डायनामिक लाइब्रेरी ( /lib/lib*.so, शायद इनमें से कुछ में /usr/lib) की आवश्यकता होती है। इन निष्पादन योग्य।

निर्देशिका संरचना

फ़ाइल-सिस्टम अनुक्रम स्टैंडर्ड Linux सिस्टम के आम निर्देशिका संरचना का वर्णन है। यह डेस्कटॉप और सर्वर इंस्टॉलेशन के लिए तैयार किया गया है: इसमें से बहुत कुछ एक एम्बेडेड सिस्टम पर छोड़ा जा सकता है। यहाँ एक न्यूनतम है।

  • /bin: निष्पादन योग्य कार्यक्रम ( /usr/binइसके बजाय कुछ हो सकते हैं )।
  • /dev: डिवाइस नोड्स (नीचे देखें)
  • /etc: विन्यास फाइल
  • /lib: डायनामिक लोडर (जब तक सभी निष्पादक सांख्यिकीय रूप से जुड़े नहीं हैं) सहित साझा पुस्तकालय
  • /proc: proc फाइल सिस्टम के लिए आरोह बिंदु
  • /sbin: निष्पादन योग्य कार्यक्रम। के साथ अंतर /binयह है कि /sbinउन कार्यक्रमों के लिए है जो केवल सिस्टम प्रशासक के लिए उपयोगी हैं, लेकिन यह अंतर एम्बेडेड उपकरणों पर सार्थक नहीं है। आप /sbinएक प्रतीकात्मक लिंक बना सकते हैं /bin
  • /mnt: रखरखाव के दौरान एक स्क्रैच माउंट बिंदु के रूप में रीड-ओनली रूट फाइल सिस्टम पर काम करना आसान है
  • /sys: Sysfs फाइल सिस्टम के लिए आरोह बिंदु
  • /tmp: अस्थायी फ़ाइलों के लिए स्थान (अक्सर एक tmpfsमाउंट)
  • /usr: उपनिर्देशिकाएँ शामिल हैं bin, libऔर sbin/usrअतिरिक्त फ़ाइलों के लिए मौजूद हैं जो रूट फाइल सिस्टम पर नहीं हैं। यदि आपके पास ऐसा नहीं है, तो आप /usrरूट डायरेक्टरी का प्रतीकात्मक लिंक बना सकते हैं ।

डिवाइस फ़ाइलें

यहाँ कुछ विशिष्ट प्रविष्टियाँ न्यूनतम हैं /dev:

  • console
  • full (इसे लिखना हमेशा रिपोर्ट करता है "डिवाइस पर कोई स्थान नहीं बचा है")
  • log(एक सॉकेट जो प्रोग्राम लॉग प्रविष्टियों को भेजने के लिए उपयोग करता है), यदि आपके पास एक syslogdडेमॉन है (जैसे कि बिजीबॉक्स के) इसे पढ़ने से
  • null (हमेशा खाली रहने वाली फ़ाइल की तरह काम करता है)
  • ptmxऔर एक ptsनिर्देशिका , यदि आप छद्म टर्मिनलों का उपयोग करना चाहते हैं (यानी कंसोल के अलावा कोई भी टर्मिनल) - जैसे कि यदि डिवाइस नेटवर्क है और आप टेलनेट या ssh में करना चाहते हैं
  • random (यादृच्छिक बाइट्स लौटाता है, जोखिम अवरुद्ध)
  • tty (हमेशा कार्यक्रम के टर्मिनल को नामित करता है)
  • urandom (बेतरतीब बाइट्स लौटाता है, कभी ब्लॉक नहीं करता लेकिन हौसले से बूट डिवाइस पर गैर-यादृच्छिक हो सकता है)
  • zero (नल बाइट्स का एक अनंत क्रम होता है)

इसके अलावा आपको अपने हार्डवेयर के लिए प्रविष्टियों की आवश्यकता होगी (नेटवर्क इंटरफेस को छोड़कर, इनमें प्रविष्टियां नहीं मिलती हैं /dev): सीरियल पोर्ट, स्टोरेज, आदि।

एम्बेडेड उपकरणों के लिए, आप सामान्य रूप से सीधे रूट फाइल सिस्टम पर डिवाइस प्रविष्टियां बनाएंगे। हाई-एंड सिस्टम में एक स्क्रिप्ट होती है जिसे प्रविष्टियां MAKEDEVबनाने के लिए कहा जाता है /dev, लेकिन एक एम्बेडेड सिस्टम पर स्क्रिप्ट को अक्सर छवि में नहीं बांधा जाता है। यदि कुछ हार्डवेयर को हॉटप्लग किया जा सकता है (जैसे यदि डिवाइस में USB होस्ट पोर्ट है), तो udev/dev द्वारा प्रबंधित किया जाना चाहिए (आपके पास अभी भी रूट फाइल सिस्टम पर न्यूनतम सेट हो सकता है)।

बूट-टाइम क्रियाएं

रूट फाइल सिस्टम से परे, आपको सामान्य ऑपरेशन के लिए कुछ और माउंट करने की आवश्यकता है:

  • procfs पर /proc(काफी अपरिहार्य)
  • sysfs पर /sys(काफी अपरिहार्य)
  • tmpfsफ़ाइल सिस्टम पर /tmp(रूट फ़ाइलों में हो सकता है या केवल पढ़ने के लिए हो सकता है) जो रूट फाइल सिस्टम पर बजाय रैम में होगा अस्थायी फ़ाइलों को बनाने के लिए अनुमति देने के लिए)
  • /devयदि गतिशील हो तो tmpfs, devfs या devtmpfs (ऊपर "डिवाइस फ़ाइलों में देखें")
  • devpts पर /dev/ptsआप [छद्म टर्मिनलों उपयोग करना चाहते हैं (के बारे में टिप्पणी को देखने के ptsऊपर)

आप एक /etc/fstabफ़ाइल और कॉल कर सकते हैं mount -a, या mountमैन्युअल रूप से चला सकते हैं ।

यदि आपके पास लॉग लिखने के लिए कोई जगह है, तो एक syslog डेमॉन (और साथ ही klogdकर्नेल लॉग्स के लिए भी शुरू करें syslogd)।

इसके बाद, डिवाइस एप्लिकेशन-विशिष्ट सेवाओं को शुरू करने के लिए तैयार है।

रूट फाइलसिस्टम कैसे बनाया जाए

यह एक लंबी और विविधतापूर्ण कहानी है, इसलिए मैं यहां जो कुछ भी करूंगा वह कुछ संकेत देता है।

रूट फाइलसिस्टम को RAM में रखा जा सकता है (ROM या फ़्लैश में (आमतौर पर संपीड़ित) छवि से लोड), या डिस्क-आधारित फाइल सिस्टम (ROM या फ़्लैश में संग्रहीत) पर, या नेटवर्क से लोड किया जाता है (अक्सर TFTP पर ) यदि लागू हो । यदि रूट फाइलसिस्टम रैम में है, तो इसे इनट्रामेफ्स बनाएं - एक रैम फाइलसिस्टम जिसकी सामग्री बूट समय पर बनाई गई है।

एम्बेडेड सिस्टम के लिए रूट इमेज असेंबल करने के लिए कई चौखटे मौजूद हैं। बिजीबॉक्स एफएक्यू में कुछ संकेत हैं । बिल्डरोट एक लोकप्रिय है, जो आपको लिनक्स कर्नेल और बिजीबॉक्स के समान सेटअप के साथ पूरी रूट छवि बनाने की अनुमति देता है। OpenEmbedded एक और ऐसा ढांचा है।

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

लिनक्स बनाम लिनक्स कर्नेल पर एक नोट

लिनक्स कर्नेल में बेक किया जाने वाला एकमात्र व्यवहार वह पहला प्रोग्राम है जो बूट समय पर लॉन्च किया जाता है। (मैं यहाँ initrd और initramfs सूक्ष्मता में नहीं जाऊँगा ।) इस कार्यक्रम, जिसे पारंपरिक रूप से init कहा जाता है , की प्रक्रिया ID 1 है और इसमें कुछ विशेषाधिकार ( KIL संकेतों के लिए प्रतिरक्षा ) और जिम्मेदारियाँ ( अनाथ अनाथ ) हैं। आप लिनक्स कर्नेल के साथ एक सिस्टम चला सकते हैं और जो कुछ भी आप चाहते हैं उसे पहली प्रक्रिया के रूप में शुरू कर सकते हैं, लेकिन तब आपके पास लिनक्स कर्नेल के आधार पर एक ऑपरेटिंग सिस्टम होता है, न कि सामान्य रूप से जिसे "लिनक्स" कहा जाता है -  लिनक्स , सामान्य अर्थ में शब्द का, एक यूनिक्स की तरह ऑपरेटिंग सिस्टम है जिसका कर्नेल लिनक्स कर्नेल है। उदाहरण के लिए, एंड्रॉइड एक ऑपरेटिंग सिस्टम है जो यूनिक्स जैसा नहीं है लेकिन लिनक्स कर्नेल पर आधारित है।


बहुत बढ़िया जवाब। मैंने केवल बी / सी शीर्षक में लिनक्स में बूटिंग का उल्लेख किया है, जो कि संभवतः खोजा जाएगा, ताकि लिनक्स बनाम लिनक्स कर्नेल के बारे में बहुत अच्छा जोड़ा जा सके, जिसके लिए अधिक व्यापक ज्ञान होना चाहिए।
एमडीमोहोर313

@BigHomie याद रखें, फ्री सॉफ्टवेयर फाउंडेशन चाहता है कि हम सभी इसे GNU / Linux कहें, क्योंकि अधिकांश (सभी?) "लिनक्स डिस्ट्रोस" सॉफ्टवेयर GNU है, भले ही कर्नेल लिनक्स (इसलिए GNU / Linux) है।
बेनजीवेब

मेह, किसी को भी इसके लिए समय नहीं मिला। तब मेरे डिस्ट्रो को बिजीबॉक्स / लिनक्स कहा जाना चाहिए ?? मुझे पता है कि मैं जानता हूं, यह आप इसके स्टॉलवर्थ नहीं हैं, बस
वेंटिंग

1
@BenjiWiebe या GNU / X11 / Apache / Linux / TeX / Perl / Python / FreeCiv । आरएमएस के अलावा, हर कोई इसे "लिनक्स" कहता है।
गिल्स एसओ- बुराई को रोकें '29

@ गिलेस, डेबियन के अलावा, मुझे लगता है। :)
एक CVn 21

5

आप सभी की जरूरत है एक सांख्यिकीय रूप से जुड़ा निष्पादन योग्य है, अलगाव में फाइलसिस्टम पर रखा गया है। आपको किसी अन्य फाइल की आवश्यकता नहीं है। यह निष्पादन योग्य प्रक्रिया है। यह बिजीबॉक्स हो सकता है। यह आपको एक शेल और अन्य उपयोगिताओं की मेजबानी देता है, सभी अपने आप में। आप रूट फाइल सिस्टम को रीड-राइट, माउंट / नोड्स बनाने, वास्तविक इनिट को निष्पादित करने आदि के लिए मैन्युअल रूप से व्यस्त बॉक्स में कमांड निष्पादित करके पूरी तरह से कार्य प्रणाली पर जा सकते हैं।


हां, मुझे पता था कि बिजीबॉक्स कॉमिन था। ' चलो देखते हैं अगर कुछ और दिखाता है।
एमडीएमओआरओ 313

4

यदि आपको किसी शेल यूटिलिटीज की जरूरत नहीं है, तो एक mkshस्टेटिकली लिंक्ड बाइनरी (जैसे klibc के खिलाफ - लिनक्स / i386 पर 130K) करेगा। आप एक की जरूरत है /linuxrcया /initया /sbin/initस्क्रिप्ट है कि बस कॉल mksh -l -T!/dev/tty1एक पाश में:

#!/bin/mksh
while true; do
    /bin/mksh -l -T!/dev/tty1
done

-T!$ttyविकल्प के लिए एक हाल ही में करने के लिए है mkshकि यह बताता दिया टर्मिनल पर एक नया खोल अंडे और इसके लिए प्रतीक्षा करने के लिए। (इससे पहले, केवल -T-एक प्रोग्राम को डिमोनेट करना और -T$ttyएक टर्मिनल पर स्पॉन करना था, लेकिन इसके लिए इंतजार न करें। यह इतना अच्छा नहीं था।) -lविकल्प केवल इसे एक लॉगिन शेल (जो पढ़ता है /etc/profile, ~/.profileऔर ~/.mkshrc) चलाने के लिए कहता है ।

यह मानता है कि आपका टर्मिनल /dev/tty1स्थानापन्न है। (अधिक जादू के साथ, टर्मिनल स्वचालित रूप से पता लगाया जा सकता है। /dev/consoleआपको पूर्ण नौकरी नियंत्रण नहीं देगा।)

इसके लिए आपको कुछ फ़ाइलों की आवश्यकता है /dev:

  • / Dev / कंसोल
  • / Dev / बातिल
  • / Dev / tty
  • / Dev / TTY1

कर्नेल विकल्प के साथ बूटिंग devtmpfs.mount=1एक भरे की आवश्यकता को समाप्त करता है /dev, बस इसे एक खाली निर्देशिका (माउंटपॉइंट के रूप में उपयोग के लिए उपयुक्त) होने दें।

आप सामान्य रूप से कुछ उपयोगिताओं (klibc, बिजीबॉक्स, बीस्टीबॉक्स, टॉयबॉक्स या टूलबॉक्स से) चाहते हैं, लेकिन वे वास्तव में आवश्यक नहीं हैं।

आप एक ~/.mkshrcफ़ाइल जोड़ना चाह सकते हैं , जिसमें $ PS1 और कुछ मूल शेल उपनाम और फ़ंक्शन सेट हों।

मैंने एक बार mksh (और इसके सैंपल mkshrc फाइल) और klibc- बर्तनों का उपयोग करके लिनक्स / m68k के लिए 171K (371K असम्पीडित) initrd बनाया। (यह पहले था -T, शेल में जोड़ा गया था, हालांकि, इसलिए इसने लॉगिन शेल को /dev/tty2बदले में दिया और कंसोल को एक संदेश दिया जो कि उपयोगकर्ता को टर्मिनलों को स्विच करने के लिए कह रहा है।) यह ठीक काम करता है।

यह वास्तव में नंगे न्यूनतम सेटअप है। अन्य उत्तर कुछ और विशेष रुप से प्रदर्शित प्रणालियों के लिए उत्कृष्ट सलाह प्रदान करते हैं। यह एक वास्तविक विशेष मामला है।

डिस्क्लेमर: मैं mksh डेवलपर हूं।


यह एक शानदार उत्तर है, साझा करने के लिए धन्यवाद और इसके लिए भी धन्यवाद mksh
जोशुआआरएल

2

मिनिमल इनिट हेलो वर्ल्ड प्रोग्राम स्टेप-बाय-स्टेप

यहाँ छवि विवरण दर्ज करें

किसी भी निर्भरता के बिना एक हैलो दुनिया संकलित करें जो एक अनंत लूप में समाप्त होती है। init.S:

.global _start
_start:
    mov $1, %rax
    mov $1, %rdi
    mov $message, %rsi
    mov $message_len, %rdx
    syscall
    jmp .
    message: .ascii "FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n"
    .equ message_len, . - message

हम उपयोग नहीं कर सकते हैं sys_exit, या अन्यथा कर्नेल पैनिक्स।

फिर:

mkdir d
as --64 -o init.o init.S
ld -o init d/init.o
cd d
find . | cpio -o -H newc | gzip > ../rootfs.cpio.gz
ROOTFS_PATH="$(pwd)/../rootfs.cpio.gz"

यह हमारे हैलो दुनिया के साथ एक फाइल सिस्टम बनाता है /init, जो कि उपयोगकर्ता का पहला प्रोग्राम है जिसे कर्नेल चलाएगा। हम और भी फाइल जोड़ सकते थे d/और /initजब कर्नेल चलता है तो वे प्रोग्राम से पहुँच सकते हैं ।

फिर cdलिनक्स कर्नेल ट्री में, बिल्ड हमेशा की तरह है, और इसे QEMU में चलाएं:

git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
cd linux
git checkout v4.9
make mrproper
make defconfig
make -j"$(nproc)"
qemu-system-x86_64 -kernel arch/x86/boot/bzImage -initrd "$ROOTFS_PATH"

और आपको एक लाइन देखनी चाहिए:

FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR

एमुलेटर स्क्रीन पर! ध्यान दें कि यह अंतिम पंक्ति नहीं है, इसलिए आपको थोड़ा और ऊपर देखना होगा।

यदि आप उन्हें सांख्यिकीय रूप से लिंक करते हैं, तो आप C कार्यक्रमों का उपयोग भी कर सकते हैं:

#include <stdio.h>
#include <unistd.h>

int main() {
    printf("FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR FOOBAR\n");
    sleep(0xFFFFFFFF);
    return 0;
}

साथ में:

gcc -static init.c -o init

आप USB पर वास्तविक हार्डवेयर पर चल सकते हैं /dev/sdXऔर:

make isoimage FDINITRD="$ROOTFS_PATH"
sudo dd if=arch/x86/boot/image.iso of=/dev/sdX

इस विषय पर महान स्रोत: http://landley.net/writing/rootfs-howto.html यह भी बताता है कि कैसे उपयोग करें gen_initramfs_list.sh, जो कि प्रक्रिया को स्वचालित करने में मदद करने के लिए लिनक्स कर्नेल स्रोत पेड़ से एक स्क्रिप्ट है।

अगला चरण: सेटअप व्यस्त बॉक्स ताकि आप सिस्टम के साथ बातचीत कर सकें: https://github.com/cirosantilli/runlinux

उबंटू 16.10, QEMU 2.6.1 पर परीक्षण किया गया।

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