क्या कोई भी समझा सकता है कि लिनक्स कर्नेल मेकफाइल में "ओल्डकोन्फिग" लक्ष्य क्या करता है? मैं इसे कुछ बिल्ड डॉक्यूमेंटेशन में संदर्भित देखता हूं लेकिन कभी नहीं समझाया कि यह वास्तव में क्या करता है।
क्या कोई भी समझा सकता है कि लिनक्स कर्नेल मेकफाइल में "ओल्डकोन्फिग" लक्ष्य क्या करता है? मैं इसे कुछ बिल्ड डॉक्यूमेंटेशन में संदर्भित देखता हूं लेकिन कभी नहीं समझाया कि यह वास्तव में क्या करता है।
जवाबों:
यह मौजूदा .configफ़ाइल को पढ़ता है और उपयोगकर्ता को वर्तमान कर्नेल स्रोत में विकल्पों के लिए संकेत देता है जो फ़ाइल में नहीं पाए जाते हैं। मौजूदा कॉन्फ़िगरेशन लेते समय और इसे एक नए कर्नेल में ले जाने पर यह उपयोगी है।
आपके चलने से पहले 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
सारांश
जैसा कि इग्नासियो द्वारा बताया गया है , .configकर्नेल स्रोत को अपडेट करने के बाद आपके लिए यह अपडेट होता है , जैसे कि git pull।
यह आपके मौजूदा विकल्पों को रखने की कोशिश करता है।
उसके लिए एक स्क्रिप्ट का होना मददगार है क्योंकि:
नए विकल्प जोड़े जा सकते हैं, या पुराने हटा दिए गए हैं
कर्नेल के कॉन्फिग कॉन्फ़िगरेशन प्रारूप में विकल्प हैं:
selectdependsवे विकल्प संबंध मैनुअल कॉन्फिगर रिज़ॉल्यूशन को और अधिक कठिन बनाते हैं।
आइए संशोधित करें .config मैन्युअल रूप से यह समझने के लिए कि यह कॉन्फ़िगरेशन कैसे हल करता है
पहले एक डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ उत्पन्न करें:
make defconfig
अब .configकर्नेल अद्यतन का अनुकरण करने और चलाने के लिए उत्पन्न फ़ाइल को मैन्युअल रूप से संपादित करें :
make oldconfig
क्या होता है देखने के लिए। कुछ निष्कर्ष:
प्रकार की लाइनें:
# 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, यह गिनती नहीं करता है।
प्रकार की लाइनें:
# 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हमसे पूछे बिना ।
जिन लोगों की निर्भरता पूरी नहीं होती है, वे कन्फ्यूज नहीं होते हैं .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छुट्टी हुई, तो वे बिल्कुल नहीं दिखे।
जो हो जाता है 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
जिन कंस्ट्रक्ट्स की कमी पूरी नहीं हुई है, उनसे पूछा गया।
उदाहरण के लिए, 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 फ़ाइल?
इस पेज से :
ओल्डकॉन्फिग को .config लेता है और इसे Kconfig फ़ाइलों के नियमों के माध्यम से चलाता है और .config का निर्माण करता है जो Kconfig के नियमों के अनुरूप होता है। यदि CONFIG मान हैं जो गायब हैं, तो मेक-अप पुरानी प्रविष्टि उनसे मांगेगी।
यदि .config, Kconfig में पाए गए नियमों के साथ पहले से ही सम्मिलित है, तो पुराने रूप से बनाना अनिवार्य रूप से no-op है।
यदि आप ओल्डकंफिग बनाने के लिए दौड़ रहे थे, और फिर दूसरी बार ओल्डकंफिग बनायें, तो दूसरी बार कोई अतिरिक्त बदलाव नहीं होगा।