लिनक्स सिस्टम कैसे बनाएं जो एक भी एप्लिकेशन चलाता है?


17

मैं एक लिनक्स एप्लिकेशन चलाने की कोशिश कर रहा हूं और सभी जो मैं चलाना चाहता हूं वह बूट का एक एप्लिकेशन है। मुझे नेटवर्किंग की आवश्यकता है और यह सब (कोई प्रदर्शन, परिधीय, आदि) नहीं है। मैं चाहता हूं कि कोई अन्य एप्लिकेशन न चलें ताकि जो एप्लिकेशन मैं चला रहा हूं उसमें 100% सीपीयू हो। क्या यह संभव है?


यह 100% सीपीयू को नहीं देख पाएगा क्योंकि आपका ओएस अभी भी कुछ संसाधनों की आवश्यकता है।
n0pe

@MaxMackie जाहिर है, लेकिन मैं ओएस को केवल एप्लिकेशन (उदाहरण के लिए नेटवर्किंग उद्देश्यों के लिए) की ओर से लेना चाहूंगा।
dschatz

1
आपको पता चलता है कि यहां तक ​​कि एक डेस्कटॉप वातावरण लोड होने के बावजूद, लेकिन वहां बेकार बैठकर, यह किसी भी सीपीयू समय का सही उपयोग नहीं कर रहा है? और जो राम इसका उपयोग कर रहा है वह अन्य अनुप्रयोगों की मांग होने पर उसकी अदला-बदली करने के अधीन है।
psusi

@dschatz यदि आप अपने प्रश्न में अधिक विवरण शामिल करते हैं तो यह मदद करेगा। जैसे आप हमें इस बारे में बताना चाहते हैं कि आप किस एप्लिकेशन को चलाना चाहते हैं, आप कैसा प्रदर्शन करना चाहते हैं और किस तरह के हार्डवेयर का उपयोग कर रहे हैं।
एनएन

यदि संभव हो तो, मैं जानना चाहूंगा कि आप ऐसा क्यों चाहते हैं। जो मैं समझता हूं, आप अपने ऐप को चलाने के लिए ओएस (कंसोल शामिल) से सब कुछ निकालना चाहते हैं । प्रदर्शन लाभ मामूली होगा, तो उस काम के होने का क्या मतलब है?
21

जवाबों:


13

न्यूनतम initrd CPIO हैलो विश्व कार्यक्रम चरण-दर-चरण

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

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

अगला चरण: सेटअप व्यस्त बॉक्स ताकि आप सिस्टम के साथ बातचीत कर सकें: /unix/2692/what-is-the-smallest-possible-linux-implementation/203902##902

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


3

आप init=/path/to/myappअपने बूटलोडर में परिभाषित पैरामीटर के साथ कर्नेल शुरू कर सकते हैं ।


2
यह एक नहीं बल्कि चरम समाधान है। उपयोगकर्ता अनुप्रयोग के साथ स्टार्टअप स्क्रिप्ट को प्रतिस्थापित करने से एप्लिकेशन बिना नेटवर्किंग के चल रहा होगा, बिना रूट किए गए रूटफ़ुट (कोई sysfs या proc या tmpfs) के अलावा किसी भी फाइल सिस्टम के बिना, और संभवतः कुछ डिवाइस नोड्स नहीं बनाए जाएंगे।
चूरा

2
@ साडस्ट: पूरी तरह से सहमत हैं। लेकिन यह सवाल भी थोड़ा चरम था ... :-)
माइकल Šrajer 17

2

ऐसा लगता है कि आप एक कियोस्क स्थापित करने की कोशिश कर रहे हैं । इंटरनेट के चारों ओर अधिकांश मार्गदर्शिकाएँ फ़ायरफ़ॉक्स जैसे वेब ब्राउज़र पर ध्यान केंद्रित करती हैं, जो एकल अनुप्रयोग चलाता है। विचारों के लिए इस गाइड पर एक नज़र डालें ।


2
हम्म, मैं वास्तव में नेटवर्किंग के साथ एक एकल एप्लिकेशन चलाने की कोशिश कर रहा हूं। मैं किसी भी X और जितने संभव हो उतने कम एप्लिकेशन नहीं चला रहा हूं। मैं यह नहीं देखता कि यह सभी अनावश्यक डेमन को चलाने से कैसे रोकता है।
dschatz

हालांकि आवेदन एक्स के बिना चल सकता है?
जर्नीमैन गीक

2

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

एक बार कर्नेल बूट हो जाने के बाद, एक इनिशियलाइज़ेशन या स्टार्टअप स्क्रिप्ट चलाई जाती है। लिनक्स रनलेवल और इनिट प्रक्रिया पर पढ़ें । उपयोग में विभिन्न स्टार्टअप योजनाएं हैं, इसलिए विशिष्ट होना संभव नहीं है। लेकिन लिनक्स आपको ठीक से कॉन्फ़िगर करने की अनुमति देगा कि आपकी स्थिति के लिए कौन से एप्लिकेशन और डेमॉन निष्पादित करेंगे। रूट पर एक स्टार्टअप फ़ाइल के अलावा, जिन फ़ाइलों को संशोधित करने की आवश्यकता है , वे / etc , और विशेष रूप से /etc/init.d में हैं

BTW जब तक आप सुपरप्रोग्रामर के कुछ मानव जाति नहीं हैं या इससे पहले कि आप एक दूरस्थ GDB सर्वर चला रहे हों, आपको अपने एप्लिकेशन के लिए डिबग कंसोल (या तो पीसी कंसोल या एक सीरियल पोर्ट) के कुछ विशेषण की आवश्यकता होने वाली है। यह आपको seg faults, बस त्रुटियों और अभिकथन विफलताओं के बारे में सूचित करने की अनुमति देगा। इसलिए "नेटवर्किंग" के अलावा "परिधीय" के कुछ प्रकार के होने पर योजना बनाएं।


1

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

साथ ही यह एप्लिकेशन पर भी निर्भर करेगा कि उसे नेटवर्क के अलावा किन सेवाओं की आवश्यकता है।

मुझे लगता है कि यदि आप अधिक विशिष्ट जानकारी प्रदान कर सकते हैं तो आपको अधिक विस्तृत प्रतिक्रिया मिलेगी।

जैसे किस तरह का ऐप आदि।


मेरा एप्लिकेशन कुछ mulithreaded वर्कलोड (अंकगणित संचालन) को चलाने के लिए pthread लाइब्रेरी का उपयोग करता है और इसे tcp / ip से इनपुट के आधार पर अलग-अलग गणना करने के निर्देश दिए जा सकते हैं। TinyCore Linux को देखते हुए, यह एक पूर्ण डेस्कटॉप वातावरण में बूट करता है, जो मुझे नहीं चाहिए।
dschatz

टाइनीकोर का एक छोटा भाई है जिसे माइक्रोकोर कहा जाता है। कोई GUI नहीं, इसे देखें।
n0pe

1
@MaxMackie मैं वास्तव में टीसीपी / आईपी स्टैक के बाहर मशीन पर कोई इंटरफ़ेस नहीं चाहता हूं। एप्लिकेशन को पोर्ट पर ब्लॉक किया जा सकता है और उस पोर्ट पर भेजे गए tcp पैकेट के माध्यम से नियंत्रित किया जा सकता है।
dschatz

1
मैं थोड़ी सी सेवाओं के साथ एक वातावरण की सिफारिश करूंगा (इस linuxhelp.blogspot.com/2006/04/… ) की जाँच करें और शायद ही आपके आवेदन के अलावा कुछ भी हो और यह निर्भरता स्थापित हो।
n0pe

1
@dschatz अच्छी तरह से, फिर आपको कर्नेल को हैक करने की जरूरत है, बाकी सब को हटा दें और उसमें अपना ऐप संकलित करें। और कोई बात नहीं। बस अपने app..lol।
बकेन

1

यदि आप वास्तव में लिनक्स कर्नेल, नेटवर्किंग और आपके आवेदन के अलावा कुछ नहीं चाहते हैं, तो ऐसा करने का एकमात्र तरीका यह है:

  • आपको अपने एप्लिकेशन को कर्नेल मॉड्यूल बनाने की आवश्यकता होगी - सुनिश्चित करें कि यह डीबग किया गया है और अच्छी तरह से परीक्षण किया गया है। इस कर्नेल मॉड्यूल को आमतौर पर यूजरस्पेस के माध्यम से किए गए कामों को शुरू करना होगा जैसे कि सेट इंटरफ़ेस आईपी पते और वह सभी अच्छी चीजें।
  • आपको make menuconfigअपने स्वयं के कस्टम कर्नेल को डाउनलोड और कॉन्फ़िगर करना होगा ( उन सभी विशेषताओं को हटाना होगा जो सिस्टम और नेटवर्किंग चलाने से संबंधित नहीं हैं। आप ब्लॉक लेयर को निष्क्रिय करना चाहेंगे, मुझे नहीं पता कि यह हाल की गुठली के माध्यम से कैसे करना है make menuconfig
  • फिर आपको अपने मॉड्यूल को कर्नेल में शामिल करने की आवश्यकता होती है इसलिए इसे कर्नेल के भाग के रूप में शामिल किया जाता है न कि लोड करने योग्य मॉड्यूल के रूप में। आप उपर्युक्त चरण में लोड करने योग्य मॉड्यूल को निष्क्रिय करने की संभावना रखेंगे। यदि आप एक कर्नेल मॉड्यूल बनाने के लिए पर्याप्त C / C ++ जानते हैं तो यह आपके लिए आसान होना चाहिए।
  • आपको कर्नेल के किसी भी हिस्से को संशोधित करने की आवश्यकता है, जो कि initऐसा करने में विफल रहता है, या 1 अतिरिक्त उपयोगकर्ता-स्थान प्रक्रिया के साथ रहने के लिए तैयार नहीं है।

मुझे पता है कि कर्नेल मॉड्यूल के लिए प्रक्रियाएं बनाना संभव है - एक साधारण ps auxएक विशिष्ट सिस्टम पर कई दिखाएगा (वे सभी कोष्ठक में हैं)। आप शायद अपने मॉड्यूल को कर्नेल प्रक्रिया बनाना चाहते हैं। आपके अलावा सभी कर्नेल-निर्मित प्रक्रियाओं से छुटकारा पाने के लिए, आपको थ्रेड्स [ kthreadd], पावर मैनेजमेंट [ pm], इवेंट लेयर [ events], और अन्य को अक्षम करना होगा ।


यदि आप कर्नेल + 1 उपयोगकर्ता अंतरिक्ष प्रक्रिया का अधिक व्यावहारिक सेटअप चाहते हैं, तो यह संभव है।

लिनक्स में कर्नेल कमांड लाइन विकल्प होता है, जिसे init=यह कहा जाता है कि जब यह लोड हो रहा हो तो कर्नेल शुरू हो जाएगा। कार्यक्रम रूट डिवाइस पर होना चाहिए जो कि root=initrd (आपके बूटलोडर द्वारा लोड) के साथ या निर्दिष्ट किया गया हो।

यदि यह प्रोग्राम बाहर निकलता है, तो लिनक्स घबरा जाएगा, इसलिए सुनिश्चित करें कि यह कभी भी बाहर न निकले।

लिनक्स के कई आधुनिक वितरणों में इसकी स्थापना है, इसलिए initinitrd में एक प्रोग्राम कुछ अतिरिक्त उपयोगकर्ता-स्पेस इनिशियलाइज़ेशन करता है, शुरू होने से पहले /sbin/initया /sbin/systemd। आप क्या अपने distro यहाँ करता है (डेबियन के लिए जानकारी है पता लगाने के लिए होगा यहाँ ) और जहां अंतिम "handoff" कार्यक्रम निर्दिष्ट कर सकते हैं लगता है, और वहाँ से आप यह बताने के बजाय अपने आवेदन शुरू करने के लिए कर सकते हैं initया systemd

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

आपके पास 2 प्रक्रियाएँ ( systemdऔर आपके प्रोग्राम) चलेंगी लेकिन यदि आपका प्रोग्राम बाहर निकलता है या क्रैश होता है तो सिस्टम घबराएगा नहीं।

केवल डेबियन की एक हल्की स्थापना पर भी विचार करें - एक "नेटस्टाइन" इंस्टॉलेशन में कर्नेल, शेल, और कुछ सेवाओं के अलावा बहुत कुछ नहीं होता है - या OpenWRT / LEDE पर विचार करें - इसमें डिफ़ॉल्ट रूप से चलने वाले लुसी के लिए एक वेबसर्वर है। कुछ अन्य सेवाएं लेकिन आसानी से अक्षम हो जाती हैं।

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