শুধুমাত্র একটি কার্নেল মডিউল তৈরির জন্য কীভাবে (রেসিপি)?


35

আমার একটি লিনাক্স কার্নেল মডিউলটিতে একটি বাগ রয়েছে যা উবুন্টু 14.04 কার্নেলকে ওফস (ক্র্যাশ) করে।

এজন্য আমি কিছু অতিরিক্ত ডিবাগ আউটপুট যুক্ত করতে কেবল সেই একক কার্নেল মডিউলটির উত্স সম্পাদনা / প্যাচ করতে চাই । প্রশ্নে থাকা কার্নেল মডিউলটি বুট করার জন্য প্রয়োজনীয় নয়। যে কারণে আমি কোনও আরআরডি চিত্র আপডেট করার প্রয়োজন দেখছি না।mvsas

আমি প্রচুর তথ্য পড়েছি (নীচে দেখানো হয়েছে) এবং সেটআপ খুঁজে পেয়েছি এবং প্রক্রিয়া বিভ্রান্তি তৈরি করেছি। আমার দুটি রেসিপি দরকার:

  1. বিল্ড পরিবেশ একবারে সেটআপ / কনফিগার করতে
  2. এই কার্নেল মডিউলের কোনও উত্স ফাইল ( .cএবং .h) সম্পাদনা করার পরে সেই সম্পাদনাটিকে নতুন কার্নেল মডিউল ( .ko) রূপান্তর করার পরে পদক্ষেপগুলি

যে উত্সগুলি ব্যবহার করা হয়েছে তা হ'ল:



সম্ভবত এই নিবন্ধটিও সহায়তা করবে: stackoverflow.com/questions/8744087/…
ওলেগ কোকরিন

উত্তর:


33

একটি কাস্টম মডিউল তৈরির রেসিপিটি তিনটি বিভাগে বিভক্ত হতে পারে।

একবার সেটআপ করুন

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

আমি mvsas নির্দিষ্ট ড্রাইভার উত্স ফাইলগুলি অনুলিপি করতে খুব অলস; কেবলমাত্র সেগুলি আপনার বর্তমান কার্যক্ষম ডিরেক্টরিতে অনুলিপি করুন। যদি অনুপস্থিত উত্স ইউআরআই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/আপনি ডিস্ট্রিবিউশন কার্নেল মডিউল ফাইলটির নাম পরিবর্তন না করে এমন ক্ষেত্রে বিতরণ মডিউলটি ওভাররাইট না করে এটি কার্নেল মডিউলটি ইনস্টল করবে । এই এমভিএস ক্ষেত্রে এটি ডিপোডও চলবে

$ lsmod | grep 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. আপনি প্রতিস্থাপন লিনাক্স ডেভেলপারদের ডিবাগ কনফিগ ব্যবহার করতে পারেন -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। উবুন্টু 17,10 জন্য উদাহরণ: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted। চালান sudo apt-get update, এবং তারপরে কমান্ডটি আপনার জন্য উত্স সরবরাহ করবে। আরও দেখুন এই প্রশ্নের যেখানে এই কাজ করার জন্য একটি GUI পদ্ধতি খুব বর্ণনা করা হয়েছে।

আমি ত্রুটি পেয়েছি: / বিন / শ: আর্ম-নন-লিনাক্স -gnueabi-gcc: পাওয়া যায় নি
ডাঃ জ্যাকি

$(uname-r)আপাতদৃষ্টিতে ভুল ... আপনাকে shellবিল্ট- $(shell uname -r)
ইনটি

2
@ অ্যালবস ডাম্বলডোর আমি এমন মামলাগুলিও$(shell uname -r) দেখতে পাই যেখানে কাজ হয় না$(uname -r)এত আপাত ভুল কেন ?
প্রো ব্যাকআপ

আমাকেও কল করতে হয়েছিল echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confযাতে depmodনতুন আপডেট হওয়া ফাইলটি এতে দেখে .../extra
মার্টিন পেক্কা

1
মডিউল স্বাক্ষর ত্রুটিটি দিয়ে কী করবেন, কীভাবে এড়ানো যায়? ST `` ইনস্টল করুন / home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko at মূল.c: 158: - এসএসএল ত্রুটি: 02001002: সিস্টেম লাইব্রেরি: ফপেন: এই জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই: bss_file.c: 175 - এসএসএল ত্রুটি: 2006D080: BIO রুটিনগুলি: BIO_new_file: এ জাতীয় কোনও ফাইল নেই: bss_file.c: 178 সাইন-ফাইল: সার্টিটস / সাইনিং_কি.পিএম: এ জাতীয় কোনও ফাইল বা ডিরেক্টরি নেই `` `
এনভেভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.