कैसे (नुस्खा) केवल एक कर्नेल मॉड्यूल बनाने के लिए?


35

मेरे पास लिनक्स कर्नेल मॉड्यूल में एक बग है जो उबंटू (क्रैश) के लिए स्टॉक उबंटू 14.04 कर्नेल का कारण बनता है।

इसलिए मैं कुछ अतिरिक्त डिबग आउटपुट जोड़ने के लिए केवल उस कर्नेल मॉड्यूल के स्रोत को संपादित / पैच करना चाहता हूं । प्रश्न में कर्नेल मॉड्यूल बूट करने के लिए आवश्यक नहीं है। इस कारण से मुझे किसी भी initrd छवियों को अपडेट करने की कोई आवश्यकता नहीं है।mvsas

मैंने बहुत सी जानकारी पढ़ ली है (जैसा कि नीचे दिखाया गया है) और सेटअप और निर्माण प्रक्रिया भ्रम की स्थिति का पता लगाएं। मुझे दो व्यंजनों की आवश्यकता है:

  1. सेटअप वातावरण को एक बार सेटअप / कॉन्फ़िगर करने के लिए
  2. इस कर्नेल मॉड्यूल ( .cऔर .h) के किसी भी स्रोत फ़ाइल को संपादित करने और एक नए कर्नेल मॉड्यूल में संपादित करने के बाद ( .ko)

उपयोग किए गए स्रोत निम्न हैं:



शायद यह लेख भी मदद करेगा: stackoverflow.com/questions/8744087/…
ओलेग कोकोरिन

जवाबों:


33

कस्टम मॉड्यूल बनाने की विधि को तीन खंडों में विभाजित करने की आवश्यकता हो सकती है।

एक बार सेटअप करें

$ cd ~
$ apt-get source linux-source-3.13.0 

मैं mvsas विशिष्ट ड्राइवर स्रोत फ़ाइलों की प्रतिलिपि बनाने के लिए बहुत आलसी हूं; बस उन सभी को अपनी वर्तमान कार्यशील निर्देशिका में कॉपी करें। यदि अनुपस्थित स्रोत URI केapt-get बारे में त्रुटि संदेश आता है, तो नीचे # 4 नोट देखें।

$ cd linux-3.13.0
$ make oldconfig
$ make prepare
$ make scripts

यह कर्नेल मॉड्यूल के निर्माण के लिए आवश्यक कुछ फाइलें तैयार करेगा।

प्रत्येक कर्नेल संस्करण

$ apt-get install linux-headers-$(uname -r)

यह हेडर और उबंटू कर्नेल कॉन्फ़िगरेशन फ़ाइल को उस कर्नेल संस्करण के लिए / lib / मॉड्यूल में स्थापित करेगा।

$ cd ~/linux-3.13.0
$ cp -v /usr/src/linux-headers-$(uname -r)/Module.symvers .

इनसोड या मोडप्रो के साथ मॉड्यूल को लोड करने पर संदेश " मॉड्यूल_लेआउट के लिए कोई प्रतीक संस्करण " को रोकने के लिए नहीं

$ mv -v /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko /lib/modules/$(uname -r)/kernel/drivers/scsi/mvsas/mvsas.ko.backup

यह सुनिश्चित करने के लिए मूल (उबंटू बिल्ड) कर्नेल मॉड्यूल का नाम बदलेगा कि कस्टम पैच लोड होगा।

प्रत्येक संपादित करें

$ cd ~/linux-3.13.0/drivers/scsi/mvsas
$ nano mv_sas.h
$ nano mv_sas.c

ये संपादन के लिए हैं।

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules

यह .koआपके स्टॉक उबंटू वितरण से कर्नेल कॉन्फ़िगरेशन का उपयोग करके कर्नेल मॉड्यूल फ़ाइल को संकलित और निर्मित करेगा जैसा कि इसमें संग्रहीत किया गया है /lib/modules/$(uname -r)/

$ make -C /lib/modules/$(uname -r)/build M=$(pwd) modules_install

/lib/modules/$(uname -r)/extra/यदि आप वितरण कर्नेल मॉड्यूल फ़ाइल का नाम नहीं बदला, तो यह वितरण मॉड्यूल को ओवरराइट नहीं करने पर कर्नेल मॉड्यूल स्थापित करेगा । इस mvasas केस में यह डिपो भी चलेगा ।

$ lsmod | grep mvsas

यदि यह किसी भी आउटपुट में परिणामित होता है, तो mvsas मॉड्यूल को modprobe -r mvsasपहले ( ) के साथ लोड करने की आवश्यकता होती है ।

$ sudo modprobe -v mvsas

यह नया कर्नेल मॉड्यूल लोड करना चाहिए।

यह सत्यापित करने के लिए आउटपुट की जाँच करें कि /lib/modules/.../extra/mvsas.koलोड किया जा रहा है।

Modprobe त्रुटि: सम्मिलित नहीं कर सका

कुछ मामलों में आपको modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg)वर्बोज़ मोडप्रोब आउटपुट में कुछ समय का अनुभव हो सकता है जो आप देखते हैं कि insmodकर्नेल डिफ़ॉल्ट स्थान से मॉड्यूल को लोड करने की कोशिश कर रहा है। उदाहरण के लिए:

# insmod /lib/modules/3.17.0-031700rc7-generic/kernel/drivers/scsi/pm8001/pm80xx.ko
modprobe: ERROR: could not insert 'pm80xx': Unknown symbol in module, or unknown parameter (see dmesg)

उस मामले में आपको मैन्युअल रूप से चलाने की आवश्यकता है और मॉड्यूल को फिर से लोड करने का प्रयास करें:

# depmod
# sudo modprobe -v mvsas

टिप्पणियाँ

  1. यह मामला हो सकता है कि परिणामी .koमॉड्यूल फाइलें उबंटू द्वारा वितरित मूल मॉड्यूल फाइलों की तुलना में आकार में बहुत अधिक (उदाहरण के लिए 20 गुना) हैं; उस स्थिति में make prepareचरण ने लिनक्स डेवलपर्स डिबगिंग कर्नेल कॉन्फ़िगरेशन फ़ाइल बनाई हो सकती है और आप स्रोत निर्देशिका से निर्माण कर रहे हैं। आपका -Cपरम अपेक्षा के अनुरूप कार्य नहीं कर सकता है।
  2. मैं जैसे अन्य आदेशों के साथ गाइड देखा है make modules_prepareऔर make M=scripts/modलेकिन मुझे नहीं लगता कि इन इस मामले के लिए जरूरी हैं।
  3. आप की जगह लिनक्स डेवलपर्स डिबग config उपयोग कर सकते हैं -C /lib/modules/$(uname -r)/buildके साथ-C /usr/src/linux-headers-$(uname -r)
  4. डिफ़ॉल्ट सेटअप में, apt-get source linux-sourcesत्रुटि वापस करेगा E: You must put some 'source' URIs in your sources.list। इस समस्या को ठीक करने के लिए आप पहली पंक्ति /etc/apt/sources.listको अनइंस्टॉल करके (अग्रणी को हटाकर #) फ़ाइल को संशोधित कर सकते हैं deb-src। Ubuntu 17.10 के लिए उदाहरण deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted:। चलाएँ sudo apt-get update, और फिर कमांड आपके लिए स्रोत वितरित करेगा। यह प्रश्न भी देखें कि ऐसा करने के लिए GUI विधि कहां वर्णित है।

मुझे त्रुटि मिली: / बिन / श: भुजा-कोई नहीं-लिनक्स -नगुआबी-जीसीसी: नहीं मिला
डॉजकी

$(uname-r)जाहिरा तौर पर गलत है ... आपको कॉल करने की आवश्यकता है shell:$(shell uname -r)
अल्बस डंबलडोर

2
@AlbusDumbledore मैं उन मामलों को$(shell uname -r) भी देखता हूं जहां काम नहीं करता है$(uname -r)स्पष्ट रूप से गलत क्यों है ?
प्रो बैकअप

मुझे भी कॉल करना था echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confताकि depmodनई अपडेट की गई फ़ाइल को देखें .../extra
मार्टिन पेका

1
मॉड्यूल साइनिंग एरर का क्या करें, इससे कैसे बचें? `` `INSTALL /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko main.c: 158: - SSL त्रुटि: 02001002: सिस्टम लाइब्रेरी: Fopen: ऐसी कोई फ़ाइल या निर्देशिका नहीं: bss_file.c: 175 - SSL त्रुटि: 2006D080: BIO दिनचर्या: BIO_new_file: ऐसी कोई फ़ाइल नहीं: bss_file.c: 178 साइन-फ़ाइल: certs / signature_key.pem: ऐसी कोई फ़ाइल या निर्देशिका ``
Envek
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.