วิธี (สูตร) ​​ในการสร้างเพียงหนึ่งโมดูลเคอร์เนล?


34

ฉันมีข้อผิดพลาดในโมดูลเคอร์เนลลินุกซ์ที่ทำให้หุ้นอูบุนตู 14.04 เคอร์เนลเพื่อโอ๊ะโอ (ผิดพลาด)

นั่นคือเหตุผลที่ฉันต้องการแก้ไข / แก้ไขแหล่งที่มาของโมดูลเคอร์เนลตัวเดียวเท่านั้นเพื่อเพิ่มเอาต์พุตการดีบักพิเศษบางอย่าง โมดูลเคอร์เนลที่เป็นปัญหาคือmvsasและไม่จำเป็นต้องบูต ด้วยเหตุนี้ฉันจึงไม่เห็นความจำเป็นในการอัปเดตภาพเริ่มต้น

ฉันได้อ่านข้อมูลจำนวนมาก (ดังแสดงด้านล่าง) และค้นหาการตั้งค่าและสร้างความสับสนในกระบวนการ ฉันต้องการสองสูตร:

  1. เพื่อตั้งค่า / กำหนดค่าสภาพแวดล้อมการสร้างหนึ่งครั้ง
  2. ขั้นตอนที่ต้องทำหลังจากแก้ไขไฟล์ต้นฉบับของโมดูลเคอร์เนลนี้ ( .cและ.h) และแปลงแปลงนั้นเป็นโมดูลเคอร์เนลใหม่ ( .ko)

แหล่งที่มาที่ใช้คือ:



บางทีบทความนี้จะช่วยด้วยเช่นกัน: stackoverflow.com/questions/8744087/…
Oleg Kokorin

คำตอบ:


32

สูตรการสร้างโมดูลที่กำหนดเองอาจต้องแบ่งออกเป็นสามส่วน

ติดตั้งครั้งเดียว

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

ฉันขี้เกียจเกินไปที่จะคัดลอกไฟล์แหล่งไดรเวอร์เฉพาะ mvsas; เพียงแค่คัดลอกทั้งหมดไปยังไดเรกทอรีการทำงานปัจจุบันของคุณ หากapt-getผลลัพธ์ในข้อความแสดงข้อผิดพลาดเกี่ยวกับURI ที่ขาดหายไปให้ดูหมายเหตุ # 4 ที่ด้านล่าง

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

สิ่งนี้จะเตรียมไฟล์บางไฟล์ที่จำเป็นในการสร้างโมดูลเคอร์เนล

เคอร์เนลแต่ละเวอร์ชัน

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

สิ่งนี้จะติดตั้งส่วนหัวและไฟล์กำหนดค่าเคอร์เนล Ubuntu สำหรับเคอร์เนลเวอร์ชันนั้นใน / lib / modules

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

สิ่งนี้เพื่อป้องกันข้อความ " ไม่มีสัญลักษณ์เวอร์ชันสำหรับ module_layout " เมื่อโหลดโมดูลด้วย insmod หรือ modprobe

$ 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ไฟล์โดยใช้การตั้งค่า kernel /lib/modules/$(uname -r)/จากสต็อกกระจายอูบุนตูของคุณเป็นที่เก็บไว้ใน

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

สิ่งนี้จะติดตั้งโมดูลเคอร์เนล/lib/modules/$(uname -r)/extra/ไม่ใช่เขียนทับโมดูลการแจกจ่ายในกรณีที่คุณไม่ได้เปลี่ยนชื่อไฟล์โมดูลเคอร์เนลการกระจาย ในกรณี mvsas นี้ก็ยังจะทำงานdepmod

$ 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)ในขณะที่ออก verbose modprobe คุณเห็นว่า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ด้วยตนเองและลองโหลดโมดูลอีกครั้ง:

# depmod
# sudo modprobe -v mvsas

หมายเหตุ

  1. อาจเป็นไปได้ว่า.koไฟล์โมดูลที่ได้นั้นมีขนาดใหญ่กว่า (เช่น 20 เท่า) ที่มีขนาดใหญ่กว่าไฟล์โมดูลดั้งเดิมที่จัดทำโดย Ubuntu; ในกรณีนั้นmake prepareขั้นตอนอาจสร้างนักพัฒนา Linux ในการดีบักไฟล์กำหนดค่าเคอร์เนลและคุณกำลังสร้างจากไดเรกทอรีต้นทาง -Cพารามิเตอร์ของคุณอาจไม่ทำงานตามที่คาดไว้
  2. ฉันเคยเห็นมัคคุเทศก์พร้อมคำสั่งอื่น ๆ เช่นmake modules_prepareและmake M=scripts/modฉันไม่คิดว่าสิ่งเหล่านี้จำเป็นสำหรับกรณีนี้
  3. คุณสามารถใช้ debug config ของนักพัฒนา Linux ได้โดยแทนที่-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 deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted17.10: เรียกใช้sudo apt-get updateแล้วคำสั่งจะส่งมอบแหล่งที่มาให้คุณ ดูคำถามนี้ที่อธิบายวิธีการทำ GUI ด้วยเช่นกัน

ฉันได้รับข้อผิดพลาด: / bin / sh: arm-none-linux -gnueabi-gcc: ไม่พบ
Dr.jacky

$(uname-r)เห็นได้ชัดว่าไม่ถูกต้อง ... คุณจำเป็นต้องเรียกใช้shellบิวด์อิน:$(shell uname -r)
อัลบัสดัมเบิลดอร์

2
@AlbusDumbledore ฉันยังเห็นกรณีที่$(shell uname -r)ไม่ได้ทำงาน ทำไม$(uname -r)ดูเหมือนผิดปกติ
สำรองข้อมูล Pro

ผมต้องยังเรียกร้องecho "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confเพื่อให้เห็นไฟล์ปรับปรุงใหม่ในdepmod .../extra
Martin Pecka

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 / registration_key.pem: ไม่มีไฟล์หรือไดเรกทอรีดังกล่าว ``
Envek
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.