2012-01-05 3 views
38

आमतौर पर कर्नेल स्रोत /usr/src/linux-2.6.x/ में संग्रहीत किया जाता है। यदि मैं मॉड्यूल के स्रोत को संशोधित करता हूं तो पूरे कर्नेल को पुन: संकलित करने से बचने के लिए, मैं केवल उस मॉड्यूल को कैसे पुन: संकलित कर सकता हूं?केवल एक कर्नेल मॉड्यूल को पुन: संकलित करने के लिए कैसे?

उत्तर

52

स्विच अपने स्रोत पेड़ की जड़ निर्देशिका के लिए और निम्नलिखित कमांड चलाएँ:

$ make modules SUBDIRS=drivers/the_module_directory 

और संकलित मॉड्यूल स्थापित करने के लिए:

$ make modules_install SUBDIRS=drivers/the_module_directory 

नोट: lunakid उल्लेख के रूप में, बाद के आदेश पहले मॉड्यूल का निर्माण कर सकता है, इसलिए सावधान रहें।

+0

से बस अपने मॉड्यूल का पुनर्निर्माण करें (बस सुनिश्चित करें कि आप इसे मेरे विपरीत पेड़ की जड़ में चलाते हैं।)) –

+0

@ लुनकीड अच्छा बिंदु;) हालांकि यह स्पष्ट होना चाहिए कि 'सब्बिर्स' सीडब्ल्यूडी के सापेक्ष है : पी –

+0

यह निश्चित रूप से स्पष्ट है, लेकिन फिर भी मुझे अंत में वाकॉम ड्राइवर डीआईआर में बैठे पाया। :) बस मेरे कदम नहीं देखा। साथ ही, क्या आप कृपया अपने उत्तर में जोड़ सकते हैं कि यह ** स्थापित ** भी हो सकता है, वैसे ही, 'modules_install SUBDIRS = ...' डाल दें। यह लगभग निश्चित रूप से अगला कदम है, और यह तुरंत तुच्छ नहीं हो सकता है (भले ही ऐसा लगता है, उदाहरण के बाद मैंने इसे व्यर्थ में कुछ मिनट बिताए ... :))। Thx, चीयर्स! –

7

आप पैरामीटर के रूप में मॉड्यूल नाम या मॉड्यूल निर्देशिका के पथ को पारित कर सकते हैं।

make path/to/the/module/itself.ko 
make path/to/the/module/directory/ 
+1

मेकअप पथ///मॉड्यूल के लिए/itself.ko बहुत अधिक समय मेकअप मॉड्यूल subdirs = निर्देशिका/पथ की तुलना में (3 minuts बनाम 5 सेकंड) लेता है। दरअसल, केवल पथ/से/निर्देशिका बनाने के लिए काम नहीं लगता है, यह हमेशा "कुछ भी करने के लिए नहीं" कहता है, लेकिन मैंने कोड को संशोधित किया –

5

कर्नेल संस्करणों 3.xx और 4.xx प्रक्रिया को और अधिक जटिल हो जाता है (लेकिन एक उम्मीद नहीं है, इसलिए रखने के पढ़ने) के बाद से:

  1. make distclean यदि आपके पास नहीं है बस एक नया स्रोत क्लोन किया गया लेकिन
  2. मॉड्यूल स्रोत के लिए कहीं नया फ़ोल्डर बनाएं (उदाहरण: अतिरिक्त) और केवल स्रोत कॉपी करें इस नए फ़ोल्डर में बनाने के लिए आवश्यक मॉड्यूल से संबंधित फ़ाइलों (कर्नेल स्रोत या कहीं और से)
  3. प्रतिलिपि /boot/config-``uname -r फ़ाइल (उदाहरण: /boot/config-4.8.0-46-generic) कर्नेल स्रोत फ़ोल्डर में फ़ाइल .config और make oldconfig चलाएं। मॉड्यूल कर्नेल स्रोत के अंतर्गत आता है, तो सत्यापित करें अगर यह make menuconfig फोन करके सक्षम किया गया है, मॉड्यूल के लिए खोज और पत्र 'एम' को लागू करने के यदि आवश्यक हो तो द्वारा
  4. गिरी स्रोत जड़ Makefile सही संस्करण घटकों मिलान के साथ बदल दिया है वर्तमान में चल रहे एक (अगर यह सटीक मेल खाता है आप make kernelversion साथ सत्यापित कर सकते हैं uname -r एक)
  5. वहाँ make scripts
  6. make prepare और make modules_prepare साथ भी पहले स्क्रिप्ट का निर्माण करने के लिए एक मजबूत सुझाव दिया गया वास्तविक मॉड्यूल से पहले निष्पादित किया जाना है
  7. बनाएं में: ( /usr/src/linux-headers-3.13.0-117-generic/Module.symvers उदाहरण)
  8. Module.symvers कर्नेल संस्करण /usr/src/linux-headers-``uname -r``/Module.symvers चल वाली संबंधित फ़ोल्डर लक्ष्य प्रणाली हेडर से नकल किया जाना है मॉड्यूल संकलन के लिए तैयार किए गए नए बनाए गए मॉड्यूल स्रोत फाइल फ़ोल्डर (उदाहरण में अतिरिक्त)।
  9. निम्न पंक्ति मॉड्यूल स्रोत संकलन फ़ोल्डर होने के अंदर नए Makefile बनाएँ: obj-y += <module_source_file_name>.o या यदि स्रोत कोड जटिल है, here
  10. से मार्गदर्शन का उपयोग उसके बाद ही यह सही समय make -C <kernel source path> M=the_module_directory साथ मॉड्यूल का निर्माण करने की है (उदाहरण: make -C . M=extra/)
  11. उपयोग आदेश modprobe --dump-modversion <module_name>.koModule.symvers में मॉड्यूल एपीआई और संबंधित मानों निर्यात के बीच सीआरसी मैच सत्यापित करने के लिए
  12. सत्यापित करें कि kernel.release फ़ाइल सामग्री वर्तमान चल रहे संस्करण के शीर्षकों से बिल्कुल मेल खाता है। यदि आप अंत में + खोज लेंगे, तो इसका मतलब है कि आप गिट क्लोन किए गए स्रोत को संकलित कर रहे हैं और आपके प्रयोगात्मक संशोधनों ने अंत में + जोड़कर स्थानीय सिस्टम स्ट्रिंग को समझौता करने के लिए सिस्टम बनाया है।
  13. अगर केवल +kernel.release संग्रहीत मूल्य की पूंछ में पाया गया है और यह लक्ष्य चल रहा कर्नेल का सही नाम के साथ एक बेमेल है,

समाधान निम्नलिखित किया जाएगा:

अपने सभी परिवर्तन बल रिलीज टैग git tag -a <tag version> -f कमांड के साथ अपने संशोधनों को ऊपर शिफ्ट करने के लिए प्रतिबद्ध हैं। फिर चरण 8

संबंधित मुद्दे