लिनक्स कर्नेल मेकफाइल में "ओल्डकोन्फिग" क्या करता है?


82

क्या कोई भी समझा सकता है कि लिनक्स कर्नेल मेकफाइल में "ओल्डकोन्फिग" लक्ष्य क्या करता है? मैं इसे कुछ बिल्ड डॉक्यूमेंटेशन में संदर्भित देखता हूं लेकिन कभी नहीं समझाया कि यह वास्तव में क्या करता है।

जवाबों:


127

यह मौजूदा .configफ़ाइल को पढ़ता है और उपयोगकर्ता को वर्तमान कर्नेल स्रोत में विकल्पों के लिए संकेत देता है जो फ़ाइल में नहीं पाए जाते हैं। मौजूदा कॉन्फ़िगरेशन लेते समय और इसे एक नए कर्नेल में ले जाने पर यह उपयोगी है।


नमस्ते, मैंने यू-बूट कोड के साथ परीक्षण किया (यह कोन्कफिग का उपयोग भी करता है)। मैंने 'मेनुकोनफिग बनाने' का इस्तेमाल किया और इसे आर्म आर्किटेक्चर में सेट किया (और एक नई .config फाइल को स्थापित किया गया। डिफ़ॉल्ट आर्किटेक्चर सैंडबॉक्स है।)। तब मैंने 'मेनुकोनफिग बना' और पाया कि आर्म आर्किटेक्चर अभी भी चुना गया था। इसलिए अगर .config है, तो '। Menuconfig' को उस .config फ़ाइल से शुरू होता है। तो क्या लक्ष्य 'मेनुकोनफिग' और 'ओल्डकोन्फिग' समान रूप से प्रभावी हैं?
किम

मुझे लगता है कि menuconfig और oldconfig सभी .config से शुरू होते हैं। केवल ओल्डकॉन्फिग मानता है .config पुराने कर्नेल से है और वर्तमान कर्नेल में नए कॉन्फ़िगरेशन चर में भरता है।
चान किम

25

आपके चलने से पहले make oldconfig, आपको एक कर्नेल कॉन्फ़िगरेशन फ़ाइल को नए कर्नेल की रूट निर्देशिका में कॉपी करने की आवश्यकता है।

आप किसी पुराने सिस्टम पर पुराने कर्नेल कॉन्फ़िगरेशन फ़ाइल की एक प्रति पा सकते हैं /boot/config-3.11.0। वैकल्पिक रूप से, कर्नेल स्रोत कोड में कॉन्फ़िगर किया गया हैlinux-3.11.0/arch/x86/configs/{i386_defconfig / x86_64_defconfig}

यदि आपका कर्नेल स्रोत यहां स्थित है /usr/src/linux:

cd /usr/src/linux
cp /boot/config-3.9.6-gentoo .config
make oldconfig

3
रूट के रूप में कर्नेल का निर्माण न करें! देखें youtube.com/watch?v=fMeH7wqOwXA#t=15m44s
ted

24

सारांश

जैसा कि इग्नासियो द्वारा बताया गया है , .configकर्नेल स्रोत को अपडेट करने के बाद आपके लिए यह अपडेट होता है , जैसे कि git pull

यह आपके मौजूदा विकल्पों को रखने की कोशिश करता है।

उसके लिए एक स्क्रिप्ट का होना मददगार है क्योंकि:

  • नए विकल्प जोड़े जा सकते हैं, या पुराने हटा दिए गए हैं

  • कर्नेल के कॉन्फिग कॉन्फ़िगरेशन प्रारूप में विकल्प हैं:

    • एक दूसरे के माध्यम से select
    • दूसरे के माध्यम से निर्भर करते हैं depends

    वे विकल्प संबंध मैनुअल कॉन्फिगर रिज़ॉल्यूशन को और अधिक कठिन बनाते हैं।

आइए संशोधित करें .config मैन्युअल रूप से यह समझने के लिए कि यह कॉन्फ़िगरेशन कैसे हल करता है

पहले एक डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ उत्पन्न करें:

make defconfig

अब .configकर्नेल अद्यतन का अनुकरण करने और चलाने के लिए उत्पन्न फ़ाइल को मैन्युअल रूप से संपादित करें :

make oldconfig

क्या होता है देखने के लिए। कुछ निष्कर्ष:

  1. प्रकार की लाइनें:

    # CONFIG_XXX is not set
    

    केवल टिप्पणियां नहीं हैं, लेकिन वास्तव में संकेत मिलता है कि पैरामीटर सेट नहीं है।

    उदाहरण के लिए, यदि हम लाइन हटाते हैं:

    # CONFIG_DEBUG_INFO is not set
    

    और भागो make oldconfig, यह हमसे पूछेगा:

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
    

    जब यह खत्म हो जाता है, तो .configफ़ाइल को अपडेट किया जाएगा।

    यदि आप लाइन के किसी भी वर्ण को बदलते हैं, उदाहरण के लिए # CONFIG_DEBUG_INFO, यह गिनती नहीं करता है।

  2. प्रकार की लाइनें:

    # CONFIG_XXX is not set
    

    हमेशा एक संपत्ति की उपेक्षा के लिए उपयोग किया जाता है, हालांकि:

    CONFIG_XXX=n
    

    यह भी नकार के रूप में समझा जाता है।

    उदाहरण के लिए, यदि आप हटाते हैं # CONFIG_DEBUG_INFO is not setऔर उत्तर देते हैं:

    Compile the kernel with debug info (DEBUG_INFO) [N/y/?] (NEW)
    

    साथ N, तो आउटपुट फ़ाइल में शामिल हैं:

    # CONFIG_DEBUG_INFO is not set
    

    और नहीं:

    CONFIG_DEBUG_INFO=n
    

    इसके अलावा, अगर हम मैन्युअल रूप से लाइन को संशोधित करते हैं:

    CONFIG_DEBUG_INFO=n
    

    और चला make oldconfig, तो लाइन को संशोधित किया गया:

    # CONFIG_DEBUG_INFO is not set
    

    oldconfigहमसे पूछे बिना ।

  3. जिन लोगों की निर्भरता पूरी नहीं होती है, वे कन्फ्यूज नहीं होते हैं .config। बाकी सब करते हैं।

    उदाहरण के लिए, सेट करें:

    CONFIG_DEBUG_INFO=y
    

    और भागो make oldconfig। : यह अब के लिए हमें पूछना होगा DEBUG_INFO_REDUCED, DEBUG_INFO_SPLITआदि कॉन्फ़िगरेशन।

    उन गुणों पर दिखाई नहीं दिया defconfig

    यदि हम lib/Kconfig.debugदेखते हैं कि वे कहाँ परिभाषित हैं, तो हम देखते हैं कि वे इस पर निर्भर हैं DEBUG_INFO:

    config DEBUG_INFO_REDUCED
        bool "Reduce debugging information"
        depends on DEBUG_INFO
    

    इसलिए जब DEBUG_INFOछुट्टी हुई, तो वे बिल्कुल नहीं दिखे।

  4. जो हो जाता है selectedकॉन्फ़िगर द्वारा चालू गए उपयोगकर्ता से पूछे बिना स्वचालित रूप से सेट हो जाते हैं।

    उदाहरण के लिए, यदि CONFIG_X86=yऔर हम लाइन हटाते हैं:

    CONFIG_ARCH_MIGHT_HAVE_PC_PARPORT=y
    

    और भागो make oldconfig, लाइन हमें बिना पूछे, उलट जाती हैDEBUG_INFO

    ऐसा इसलिए होता है क्योंकि arch/x86/Kconfig इसमें शामिल हैं:

    config X86
        def_bool y
        [...]
        select ARCH_MIGHT_HAVE_PC_PARPORT
    

    और उस विकल्प का चयन करें जो सत्य है। इसे भी देखें: /unix/117521/select-vs-depends-in-kernel-kconfig

  5. जिन कंस्ट्रक्ट्स की कमी पूरी नहीं हुई है, उनसे पूछा गया।

    उदाहरण के लिए, defconfigसेट किया था:

    CONFIG_64BIT=y
    CONFIG_RCU_FANOUT=64
    

    यदि हम संपादित करें:

    CONFIG_64BIT=n
    

    और भागो make oldconfig, यह हमसे पूछेगा:

    Tree-based hierarchical RCU fanout value (RCU_FANOUT) [32] (NEW)
    

    इसका कारण यह है है RCU_FANOUTपर परिभाषित किया गया है init/Kconfigके रूप में:

    config RCU_FANOUT
        int "Tree-based hierarchical RCU fanout value"
        range 2 64 if 64BIT
        range 2 32 if !64BIT
    

    इसलिए, बिना 64BIT, अधिकतम मूल्य है 32, लेकिन हमने इसे 64निर्धारित किया था .config, जो इसे असंगत बना देगा।

बोनस

make olddefconfigअंतःक्रियात्मक रूप से पूछे बिना उनके डिफ़ॉल्ट मान के लिए हर विकल्प सेट करता है। यह makeसुनिश्चित करने के लिए स्वचालित रूप से चलाया जाता है कि .configआपके द्वारा इसे मैन्युअल रूप से संशोधित किए जाने की स्थिति में यह सुसंगत है। इसे भी देखें: /server/116299/automatically-answer-defaults-when-doing-make-oldconfig-on-a-kernel-tree

make alldefconfigकी तरह है make olddefconfig, लेकिन यह भी विलय करने के लिए एक विन्यास टुकड़ा स्वीकार करता है। इस लक्ष्य का उपयोग merge_config.shस्क्रिप्ट द्वारा किया जाता है : https://stackoverflow.com/a/39440863/895245

और यदि आप .configसंशोधन को स्वचालित करना चाहते हैं , तो यह बहुत आसान नहीं है: आप लिनक्स कर्नेल में सुविधाओं को गैर-संवादात्मक रूप से कैसे चालू करते हैं ।config फ़ाइल?


5

नए / परिवर्तित / हटाए गए विकल्पों के साथ एक पुराने कॉन्फ़िगरेशन को अपडेट करता है।


2

इस पेज से :

ओल्डकॉन्फिग को .config लेता है और इसे Kconfig फ़ाइलों के नियमों के माध्यम से चलाता है और .config का निर्माण करता है जो Kconfig के नियमों के अनुरूप होता है। यदि CONFIG मान हैं जो गायब हैं, तो मेक-अप पुरानी प्रविष्टि उनसे मांगेगी।

यदि .config, Kconfig में पाए गए नियमों के साथ पहले से ही सम्‍मिलित है, तो पुराने रूप से बनाना अनिवार्य रूप से no-op है।

यदि आप ओल्डकंफिग बनाने के लिए दौड़ रहे थे, और फिर दूसरी बार ओल्डकंफिग बनायें, तो दूसरी बार कोई अतिरिक्त बदलाव नहीं होगा।


1

यह अत्याचार है। एक सामान्य गोपनीय फ़ाइल को शामिल करने के बजाय, वे आपको एक बार उत्पन्न करने के लिए 9000 बार हिट करते हैं।


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