मैं अपने स्वयं के "कस्टम" लिनक्स डिस्ट्रो बनाने के बारे में कैसे जा सकता हूं जो सिर्फ एक कार्यक्रम चलाएगा, एक्सएमबीसीसीयू के रूप में बिल्कुल उसी तरह ।
मैं अपने स्वयं के "कस्टम" लिनक्स डिस्ट्रो बनाने के बारे में कैसे जा सकता हूं जो सिर्फ एक कार्यक्रम चलाएगा, एक्सएमबीसीसीयू के रूप में बिल्कुल उसी तरह ।
जवाबों:
मैं एलएफएस के साथ खिलवाड़ करना शुरू नहीं करूंगा, जो कि कुछ गहरे जंगल की ओर जाने वाला एक उद्यान मार्ग है।
एक डिस्ट्रो से शुरू करें जहां आपका शुरुआती इंस्टाल पर बहुत अधिक नियंत्रण है, जैसे आर्क, या उबंटू सर्वर जैसे हेडलेस संस्करण। इस बात का स्थान अंतरिक्ष को बचाने के लिए इतना नहीं है जितना कि इनिट कॉन्फ़िगरेशन की जटिलता का परिसीमन करना; एक हेडलेस डिस्ट्रो से शुरू होकर, यदि आप जिस एप्लिकेशन को चलाना चाहते हैं, उसे 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 प्रणाली का उपयोग करना सरल है, वास्तव में), लेकिन अधिकांश कुत्ते अपनी पुरानी चाल को पसंद करते हैं, इसलिए बोलने के लिए। यह पकड़ अब मरना शुरू हो गई है दोनों सिस्टम कुछ समय से उपयोग में हैं।
init
कर सकते हैं लेकिन निश्चित रूप से आप बिना कर सकते हैं upstart, systemd,
या sysv. init
सिर्फ कुछ निष्पादन योग्य फ़ाइल है जिसका नाम init
है आपकी कर्नेल, जब यह आरोह लेती है तो initramfs.
ज्यादातर मामलों में ये अन्य तीन भी नहीं होते हैं, init
लेकिन वे वास्तव में exec
एड होते हैं, init,
जो आमतौर पर हैbusybox.
busybox
क्योंकि यह एक अलग उत्तर में अलग उपचार के योग्य है, लेकिन मेरे द्वारा नहीं।
मिनिमल इनिट हेलो वर्ल्ड प्रोग्राम स्टेप-बाय-स्टेप
किसी भी निर्भरता के बिना एक हैलो दुनिया संकलित करें जो एक अनंत लूप में समाप्त होती है। 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
यदि आप प्रोग्रामिंग में कम हैं और आप इसे स्क्रैच से बनाना चाहते हैं तो आप LFS के साथ जा सकते हैं यानी स्क्रैच http://www.linuxfromscratch.org/ से लिनक्स
यदि आप ubutnu को अनुकूलित करना चाहते हैं, तो आप ubunt- बिल्डर का उपयोग कर सकते हैं और यदि आप इसे rpm बेस पर चाहते हैं, तो आप SUsE-Studio का उपयोग कर सकते हैं, Suse स्टूडियो आपको कस्टम स्यूस लिनक्स बनाने की अनुमति देगा
चियर्स
यह आपके "एक कार्यक्रम" की आवश्यकता के बारे में अधिक है।
आप अभी भी समझ सकते हैं कि एलएफएस (उर्फ " स्क्रैच से लिनक्स ") का निर्माण करके चीजों को एक साथ कैसे रखा जाए । फिर आप अपने कार्यक्रम के लिए आवश्यक चीजें जोड़ेंगे या पूर्ण वितरण के लिए जाएंगे क्योंकि LFS पर Gnome या KDE जैसी भारी उप-प्रणाली का निर्माण एक वास्तविक दर्द-गधा हो सकता है।
बेशक पिछड़ जाना पहली बार में आसान हो सकता है, लेकिन चीजों को पूरी तरह से दूर करना परेशानी भरा हो सकता है: इसे वीएम में करें और हर कदम पर इस वीएम की नकल करें।
(मेरे 2 सेंट)
संपादित करें :
CentOS या Ubuntu जैसे पूर्ण वितरण से शुरू होने के बजाय SecurityBeast द्वारा बताया गया है , आप वितरण उपकरणों के निर्माण पर भी नज़र डाल सकते हैं:
आपको यह पूछने की ज़रूरत है कि आपके "एक कार्यक्रम" की क्या ज़रूरत है और आपके पास क्या संसाधन हैं।
यदि इसे पुस्तकालयों और समर्थन बायनेरिज़ के विस्तृत चयन की आवश्यकता है, तो आप एक "नियमित" लिनक्स डिस्ट्रो (डेबियन या समान) का उपयोग करके सबसे अच्छा हो सकते हैं और बस बूट प्रक्रिया के साथ खिलवाड़ कर सकते हैं।
यदि इसे समर्थन सामग्री के संकरे चयन की आवश्यकता है, लेकिन फिर भी विभिन्न कर्नेल मॉड्यूल या यूजरलैंड सपोर्ट बिट्स का उपयोग करते हुए विभिन्न प्रकार के हार्डवेयर के लिए नेटवर्किंग या समर्थन जैसे सामान की आवश्यकता होती है और आप डिस्क को नियमित डिस्ट्रो के ओवरहेड नहीं चाहते हैं, तो मैं आपको देखने का सुझाव दूंगा एम्बेडेड डिस्ट्रोस (बिल्डरोट या समान) या शायद खरोंच दृष्टिकोण से एक लिनक्स (हालांकि यह एक रखरखाव सिरदर्द हो सकता है)
यदि आपको केवल एक गैर-मॉड्यूलर कर्नेल प्रदान करने की आवश्यकता है और कुछ और नहीं तो कर्नेल पर अपना स्वयं का द्विआधारी सीधा चलने से काम हो सकता है और सबसे हल्का समाधान हो सकता है।
busybox
लेकिन यह वह नहीं है जो आप चाहते हैं। तो कृपया, अपनी आवश्यकता को व्यक्त करने के लिए आवश्यक समय निकालें और हम आपकी मदद करने में सक्षम हो सकते हैं। इसमें किसी भी प्रासंगिक तत्व को जोड़ने के लिए अपने प्रश्न को संपादित करने में संकोच न करें ।