कस्टम लिनक्स डिस्ट्रो कैसे बनाएं जो सिर्फ एक प्रोग्राम चलाता है और कुछ नहीं?


12

मैं अपने स्वयं के "कस्टम" लिनक्स डिस्ट्रो बनाने के बारे में कैसे जा सकता हूं जो सिर्फ एक कार्यक्रम चलाएगा, एक्सएमबीसीसीयू के रूप में बिल्कुल उसी तरह ।


U & L पर आपका स्वागत है, कृपया एक निर्देशित यात्रा करें और समय निकालें कि आप एक प्रश्न पूछें कि आप क्या करना चाहते हैं? क्योंकि आवेदन की परिभाषा बहुत अस्पष्ट है और इसका मतलब कुछ भी नहीं है, क्योंकि मेरी सलाह का उपयोग करना होगा, busyboxलेकिन यह वह नहीं है जो आप चाहते हैं। तो कृपया, अपनी आवश्यकता को व्यक्त करने के लिए आवश्यक समय निकालें और हम आपकी मदद करने में सक्षम हो सकते हैं। इसमें किसी भी प्रासंगिक तत्व को जोड़ने के लिए अपने प्रश्न को संपादित करने में संकोच न करें ।
कीवी

1
मेरे लिए बहुत स्पष्ट लगता है ...
Goldilocks

@ TAFKA'goldilocks 'अच्छी तरह से नहीं, क्योंकि मुझे यकीन है कि आप अभी भी एक टर्मिनल या XBMCubuntu पर कुछ इसी तरह का उपयोग कर सकते हैं, जबकि ऐसा लगता है कि केवल एक ऐप ग्राफिक रूप से चल रहा है, लेकिन एक ऐप नहीं चल रहा है। मैंने केवल कर्नेल और बिजीबॉक्स के साथ स्क्रैच से एक छोटा सा डिस्ट्रो बनाया है, उस स्थिति में, भले ही कर्नेल द्वारा लॉन्च की जाने वाली सेवाएं हैं, आप कह सकते हैं कि बिजीबॉक्स आपका एकमात्र ऐप है।
कीवी

@ कीवी यह एक अच्छा जवाब है तो (एलएफएस से बेहतर)। ध्यान रखें: 1) यह प्रश्न उन अन्य लोगों के लिए उपयोगी हो सकता है जिनका सामान्य उद्देश्य समान है, इसलिए उत्तरों की एक सीमा अच्छी है, 2) जबकि यहां संभावित समाधानों की एक सीमा है - अर्थात TIMTOWTDI - और कुछ हो सकते हैं दूसरों की तुलना में कुछ अधिक विशिष्ट लक्ष्य के लिए बेहतर, मुझे पूरा यकीन है कि वे सभी काम करेंगे और समाधान पर निर्णय लेने का एक महत्वपूर्ण पहलू व्यक्तिपरक होगा (उदाहरण के लिए, ओपी के पूर्व ज्ञान और अनुभव के कारण, कार्य का उद्देश्य प्रकृति नहीं ) ।
गोल्डीलॉक्स

जवाबों:


6

मैं एलएफएस के साथ खिलवाड़ करना शुरू नहीं करूंगा, जो कि कुछ गहरे जंगल की ओर जाने वाला एक उद्यान मार्ग है।

एक डिस्ट्रो से शुरू करें जहां आपका शुरुआती इंस्टाल पर बहुत अधिक नियंत्रण है, जैसे आर्क, या उबंटू सर्वर जैसे हेडलेस संस्करण। इस बात का स्थान अंतरिक्ष को बचाने के लिए इतना नहीं है जितना कि इनिट कॉन्फ़िगरेशन की जटिलता का परिसीमन करना; एक हेडलेस डिस्ट्रो से शुरू होकर, यदि आप जिस एप्लिकेशन को चलाना चाहते हैं, उसे GUI की आवश्यकता होती है, तो आप एक GUI लॉगिन (aka। प्रदर्शन प्रबंधक या DM) के साथ समाप्त होने के बिना इसके लिए क्या आवश्यक है, जोड़ सकते हैं, init और एक फुलब्लैक डेस्कटॉप द्वारा शुरू किया गया। इसके साथ जाने का माहौल।

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

  • डेबियन क्लासिक यूनिक्स SysV स्टाइल इनिट पर भिन्नता का उपयोग करता है । के रूप में jessieरिलीज, डेबियन भी करने के लिए बंद कर गया है systemd( https://wiki.debian.org/systemd )

  • उबंटू और डेरिवेटिव्स अपस्टार्ट का उपयोग करते हैं ।

  • फेडोरा, आर्क और डेरिवेटिव्स सिस्टमड का उपयोग करते हैं

यदि आप इनमें से किसी के बारे में अभी तक कुछ नहीं जानते हैं, तो उनमें से कोई भी विशेष रूप से दूसरों की तुलना में उपयोग करने के लिए कठिन नहीं है। यदि आप बाद के दो में से एक के साथ जाते हैं, तो वे SysV के साथ पिछड़े संगतता के लिए कुछ तंत्र प्रदान करते हैं, लेकिन इसके साथ परेशान मत करो , यह कोई सरल नहीं है। 1

यहां मुद्दा यह है कि बूट में क्या किया जाता है, इसे कम से कम करें, और इस तरह आप एक ऐसी प्रणाली बना सकते हैं, जो आपके द्वारा फ़ोकस किए जाने वाले एप्लिकेशन का समर्थन करने के लिए कम से कम सॉफ़्टवेयर चलाएगा - यह अनिवार्य रूप से एक सर्वर कैसे सेट किया जाता है? BTW, इसलिए यह एक सामान्य कार्य है (ध्यान दें कि आपके पास वास्तव में "सिर्फ एक" उपयोगकर्तालैंड प्रक्रिया नहीं चल सकती है, कम से कम उपयोगी नहीं है)।

यदि आप जिस एप्लिकेशन को चलाना चाहते हैं, वह एक GUI प्रोग्राम है (इसका एक अच्छा उदाहरण कि आप शाब्दिक रूप से सिर्फ एक एप्लिकेशन क्यों नहीं चला सकते, क्योंकि GUI ऐप्स के लिए X सर्वर की आवश्यकता होती है), तो आप ~/.xinitrcऐसा दिख सकते हैं ;

#!/bin/sh

myprogram

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

1. बिंदु को थोड़ा दबाने के लिए: जब आप इस पर शोध कर रहे होते हैं, तो आप उन लोगों से सिस्टमड और अपस्टार्ट के बारे में कुछ पकड़ सकते हैं जो पहले SysV के दावे से परिचित थे, जैसे, कि वे बहुत जटिल हैं। हालांकि, वास्तव में वे SysV से अधिक जटिल नहीं हैं (IMO प्रणाली का उपयोग करना सरल है, वास्तव में), लेकिन अधिकांश कुत्ते अपनी पुरानी चाल को पसंद करते हैं, इसलिए बोलने के लिए। यह पकड़ अब मरना शुरू हो गई है दोनों सिस्टम कुछ समय से उपयोग में हैं।


1
आप इसके बिना नहीं initकर सकते हैं लेकिन निश्चित रूप से आप बिना कर सकते हैं upstart, systemd,या sysv. initसिर्फ कुछ निष्पादन योग्य फ़ाइल है जिसका नाम initहै आपकी कर्नेल, जब यह आरोह लेती है तो initramfs.ज्यादातर मामलों में ये अन्य तीन भी नहीं होते हैं, initलेकिन वे वास्तव में execएड होते हैं, init,जो आमतौर पर हैbusybox.
mikeserv

@mikeserv बिल्कुल (और मैंने स्पष्ट रूप से उल्लेख किया है कि ये केवल तीन विकल्प नहीं हैं)। यह भी ध्यान दें कि मैंने जानबूझकर बाहर रखा है busyboxक्योंकि यह एक अलग उत्तर में अलग उपचार के योग्य है, लेकिन मेरे द्वारा नहीं।
गोल्डीलॉक्स

तुम पर कितना अनुग्रह है! लेकिन कोई रास्ता नहीं।
मोकेसर

यह जानना दिलचस्प होगा कि क्या यह दृष्टिकोण वास्तव में व्यवहार में काम करता है। किसी ने वास्तव में यह कोशिश की?
फहीम मीठा

@FaheemMitha यदि आप मतलब है कि मैं यहाँ क्या सिफारिश कर रहा हूँ (init विन्यास को अनुकूलित करें), निश्चित रूप से यह करता है - कि यह सिस्टम पहले से ही कैसे काम करता है, तो आप बस एक छीन लिया गया और सरलीकृत संस्करण तैयार करेंगे (मुझे यकीन है कि यह है) XBMCbutu क्या है)। यदि आपका मतलब है, कुछ अधिक विशिष्ट निष्पादन योग्य एला बिजीबॉक्स के साथ init की जगह, यह शायद अधिक परेशानी की बात है जब तक कि आप इसे इस तरह से नहीं करना चाहिए - बिजीबॉक्स का मुख्य उद्देश्य छोटे एम्बेडेड वातावरण (जैसे, केवल कुछ ही) में उपयोग के लिए है राम की एमबी)।
गोल्डीलॉक्स

18

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

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

किसी भी निर्भरता के बिना एक हैलो दुनिया संकलित करें जो एक अनंत लूप में समाप्त होती है। 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

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

फिर:

mkdir d
as --64 -o init.o init.S # assemble
ld -o d/init init.o      # link
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

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

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

अगला कदम

अगली चीज़ जो आप करना चाहते हैं, वह है बिजीबॉक्स सेटअप करना ।

बिजीबॉक्स बुनियादी POSIX-y CLI उपयोगिताओं को लागू करता है, जिसमें एक POSIX-y शेल भी शामिल है, जिसे आप अंतःक्रियात्मक रूप से सिस्टम के साथ अधिक आसानी से प्रयोग करने की अनुमति देते हैं।

व्यक्तिगत रूप से, इस बिंदु पर मैं सिर्फ बिल्डरोट पर भरोसा करना पसंद करता हूं , जो स्क्रिप्ट का एक अद्भुत सेट है जो स्रोत से सब कुछ बनाने और रूट फाइलसिस्टम बनाने को स्वचालित बनाता है।

मैंने इसके लिए एक अत्यधिक विस्तृत और स्वचालित सहायक अपलोड किया है: https://github.com/cirosantilli/linux-kernel-module-cheat


4
यह संभवतः यहां सबसे अधिक रेखांकित उत्तर है: डी। बहुत बढ़िया!
एमएस मुँह

1
@msouth थोड़ा कम अब तो :-)
Ciro Santilli 病毒 less less a 事件 at

1

यदि आप प्रोग्रामिंग में कम हैं और आप इसे स्क्रैच से बनाना चाहते हैं तो आप LFS के साथ जा सकते हैं यानी स्क्रैच http://www.linuxfromscratch.org/ से लिनक्स

यदि आप ubutnu को अनुकूलित करना चाहते हैं, तो आप ubunt- बिल्डर का उपयोग कर सकते हैं और यदि आप इसे rpm बेस पर चाहते हैं, तो आप SUsE-Studio का उपयोग कर सकते हैं, Suse स्टूडियो आपको कस्टम स्यूस लिनक्स बनाने की अनुमति देगा

चियर्स


1

यह आपके "एक कार्यक्रम" की आवश्यकता के बारे में अधिक है।

आप अभी भी समझ सकते हैं कि एलएफएस (उर्फ " स्क्रैच से लिनक्स ") का निर्माण करके चीजों को एक साथ कैसे रखा जाए । फिर आप अपने कार्यक्रम के लिए आवश्यक चीजें जोड़ेंगे या पूर्ण वितरण के लिए जाएंगे क्योंकि LFS पर Gnome या KDE जैसी भारी उप-प्रणाली का निर्माण एक वास्तविक दर्द-गधा हो सकता है।

बेशक पिछड़ जाना पहली बार में आसान हो सकता है, लेकिन चीजों को पूरी तरह से दूर करना परेशानी भरा हो सकता है: इसे वीएम में करें और हर कदम पर इस वीएम की नकल करें।

(मेरे 2 सेंट)

संपादित करें :

CentOS या Ubuntu जैसे पूर्ण वितरण से शुरू होने के बजाय SecurityBeast द्वारा बताया गया है , आप वितरण उपकरणों के निर्माण पर भी नज़र डाल सकते हैं:


1

आपको यह पूछने की ज़रूरत है कि आपके "एक कार्यक्रम" की क्या ज़रूरत है और आपके पास क्या संसाधन हैं।

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

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

यदि आपको केवल एक गैर-मॉड्यूलर कर्नेल प्रदान करने की आवश्यकता है और कुछ और नहीं तो कर्नेल पर अपना स्वयं का द्विआधारी सीधा चलने से काम हो सकता है और सबसे हल्का समाधान हो सकता है।

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