एक कर्नेल स्रोत पेड़ में क्या होता है? क्या यह लिनक्स कर्नेल हेडर से संबंधित है?


25

किताबों में, मैं आम तौर पर लिनक्स स्रोत ट्री के लिए संदर्भ पढ़ /usr/src/linuxउपनिर्देशिका के सामान्य सेट के साथ ( arch, block, crypto, ...)।

मैं उम्मीद कर रहा था कि इस पेड़ में कर्नेल बनाने वाली बाइनरी फाइलें शामिल होंगी। मेरे सिस्टम में (Ubuntu 10.04) ...

  1. मेरे पास अलग-अलग कर्नेल के लिए (स्वचालित सॉफ़्टवेयर डाउनलोड का उपयोग करके, मैन्युअल रूप से इंस्टॉल नहीं किया गया है), मैं इस स्थान पर प्रत्येक कर्नेल के लिए दो उप-निर्देशिकाएं निम्नानुसार ढूंढता हूं:

    /usr/src/linux-headers-2.6.32-22
    /usr/src/linux-headers-2.6.32-22-generic
    
  2. उप निर्देशिकाओं में मुझे बाइनरी फ़ाइलों की उम्मीद थी, दूसरों के बीच। हालाँकि, मैंने पेड़ की एक उचित मात्रा की जाँच की, और यहाँ से अंतिम उप-निर्देशिका को हमेशा ऐसा लगता है Makefile(जब इसे पढ़ते हुए, यह आमतौर पर एक कॉन्फ़िगरेशन फ़ाइल की तरह अधिक लगता है तो एक इंस्टॉल फ़ाइल), और कभी-कभी कुछ अलग-अलग अन्य फाइलें (अधिकतर Kconfig)।

मेरा सवाल भोला हो सकता है, लेकिन मैं थोड़ा भ्रमित हूं। क्या (2) मुझे कर्नेल सोर्स ट्री में देखने की उम्मीद करनी चाहिए; और मेरे पास 'हेडर' का स्पष्ट संदर्भ क्यों है? मुझे linux-generic-headersकुछ अन्य सॉफ़्टवेयर के लिए कुछ समय पहले स्थापित करने की आवश्यकता थी और यदि यह संबंधित हो सकता है तो मैं अनिश्चित हूं। मुझे लगता है कि मेकफाइल्स (जैसे, / चालक उप-निर्देशिका में मॉड्यूल स्थापित करने के लिए) का अच्छा कारण है, लेकिन (बहुत अधिक) केवल मेकफाइल्स?

जवाबों:


30

वितरण kernel-headerपैकेज होते हैं, जैसा कि उनके नाम का अर्थ है, केवल कर्नेल हेडर फाइलें (प्लस आवश्यक प्लंबिंग) जो कि कर्नेल मॉड्यूल जैसे सॉफ़्टवेयर बनाने के लिए आवश्यक हैं।

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

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

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

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

स्थापित कर्नेल मॉड्यूल की उप-निर्देशिकाओं में रहते हैं:

/lib/modules/`uname -r`/

इसलिए मेरे सिस्टम पर उदाहरण के लिए, वे वर्तमान में हैं

/lib/modules/3.1.4-gentoo/

पूर्ण कर्नेल स्रोत कोड : उबंटू पर, यदि आप चाहते हैं कि पूर्ण कर्नेल स्रोत स्वयं कर्नेल का निर्माण करें, तो आपको यहां दिए गए निर्देशों का पालन ​​करना चाहिए ।

आप एक स्रोत टारबॉल को भी डाउनलोड कर सकते हैं kernel.orgऔर इसे कहीं से अनपैक कर सकते हैं ( यदि आप इस टारबॉल का उपयोग करते हैं, तो अपने व्यक्तिगत सामान और RPM द्वारा प्रबंधित सामान अलग रखें) उबंटू-स्थापित फ़ाइलों को अधिलेखित करें।

/usr/src/linuxकर्नेल स्रोतों को रखने के लिए एक पारंपरिक स्थान है, लेकिन कुछ भी आपको कर्नेल स्रोतों को कहीं और रखने से रोकता है। यह पथ भी अक्सर एक निर्देशिका के लिए एक प्रतीकात्मक लिंक है। उदाहरण के लिए मेरे पास मेरी मशीन है:

 $ ls -l /usr/src/linux
lrwxrwxrwx 1 root root 18 Dec  7 17:03 /usr/src/linux -> linux-3.1.4-gentoo

सीलिंक वहाँ निर्माण अनुप्रयोगों को सरल बनाने के लिए है जो कर्नेल स्रोत पर निर्भर करते हैं। आप उस पथ को अपने रनिंग (या लक्ष्य) कर्नेल से लिंक करते हैं ताकि आपको एक मॉड्यूल आउट-ऑफ-ट्री का निर्माण करते समय सटीक संस्करण या पथ जानकारी निर्दिष्ट न करनी पड़े। स्रोत-आधारित वितरण के लिए कम से कम एक गुच्छा मदद करता है।


इस विस्तृत और पूर्ण उत्तर के लिए आपका बहुत-बहुत धन्यवाद। यह थोड़ी देर के लिए मुझे गुस्सा दिला रहा था। यदि मैं अपने स्वागत में अधिक नहीं हूँ, और यदि आप समय पाते हैं, तो कृपया मुझे जोड़ सकते हैं, निम्नलिखित: (ए) मैंने ऊपर पढ़ा है कि मेरे मामले में (स्व-स्थापित कर्नेल नहीं), उप का कुछ (एक) निर्देशिकाओं में (सी) कर्नेल सी और असेंबलर स्रोत कोड हो सकता है। यह कहां होगा - एक पूरी सूची नहीं, जैसा कि शायद मेरे ब्राउज़िंग में 20 - 30 उप-निर्देशिकाओं में, मैं कभी एक भर में नहीं आया? मैंने kernel.org से कर्नेल सोर्स फाइल्स डाउनलोड की हैं; मुझे सिर्फ अपने सिस्टम को बेहतर समझने का मतलब है। (b) ...
१or

... तो जहाँ (उदारतापूर्वक) कर्नेल बायनेरी स्थित हैं, जब आप अपने आप को कर्नेल स्थापित नहीं करते हैं, जैसा कि मेरे मामले में है? (c) आप "हेडर पैकेज" का उल्लेख करते हैं, जिसे मैंने 'linux-generic-headers' के रूप में लिया था। क्या मैं उन पैकेजों से पेड़ देख रहा हूँ? यदि हाँ, तो क्या वे जहां भी स्रोत वृक्ष स्थापित करने से पहले थे, उन्हें स्थानांतरित कर देते हैं? बहुत धन्यवाद फिर से।
ग्नोमेटोरियल

(यदि आप उत्तर देते हैं, तो 'answer'not टिप्पणी का उपयोग करें ताकि मैं कम से कम आपकी मदद के लिए आपको फिर से
उकसा सकूं

थोड़ा विस्तार किया। हेडर पैकेज हेडर के लिए हैं। पूर्ण स्रोत पैकेज पूर्ण स्रोत कोड प्रदान करते हैं। बाइनरी पैकेज केवल बायनेरिज़ प्रदान करते हैं।
मैट

5
linux-sourceअपस्ट्रीम स्रोत शामिल है, apt-get source linux-image-$(uname -r)उबंटू के पैच के साथ कर्नेल के लिए स्रोत प्राप्त करता है।
लीकेनस्टीन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.