Pertanyaan Bagaimana (resep) untuk membangun hanya satu modul kernel?


Saya memiliki bug dalam modul kernel Linux yang menyebabkan kernel Ubuntu 14.04 menjadi oops (crash).

Itu sebabnya saya mau sunting/tambalan sumber hanya itu modul kernel tunggal untuk menambahkan beberapa output debug tambahan. Modul kernel yang dimaksud adalah mvsas dan tidak perlu boot. Oleh karena itu saya tidak melihat perlunya memperbarui gambar initrd apa pun.

Saya telah membaca banyak informasi (seperti yang ditunjukkan di bawah) dan menemukan konfigurasi dan membangun proses kebingungan. Saya butuh dua resep:

  1. untuk menyiapkan / mengkonfigurasi lingkungan pembangunan satu kali
  2. langkah-langkah yang harus dilakukan setelah mengedit file sumber apa pun dari modul kernel ini (.c dan .h) dan mengubah pengeditan itu menjadi modul kernel baru (.ko)

Sumber-sumber yang telah digunakan adalah:


24
2017-08-24 11:50


asal


Kemungkinan duplikat dari Bagaimana cara saya membangun modul kernel dalam-pohon? - Ciro Santilli 新疆改造中心 六四事件 法轮功
mungkin artikel ini akan membantu juga: stackoverflow.com/questions/8744087/… - Oleg Kokorin


Jawaban:


Resep untuk membuat modul khusus mungkin perlu dibagi menjadi tiga bagian.

Siapkan sekali

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

Saya terlalu malas untuk menyalin file sumber driver khusus mvsas; cukup salin semuanya ke direktori kerja Anda saat ini. Jika apt-get menghasilkan pesan kesalahan tentang sumber URI yang hilang kemudian lihat catatan # 4 di bagian bawah.

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

Ini akan menyiapkan beberapa file yang diperlukan untuk membangun modul kernel.

Setiap versi kernel

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

Ini akan menginstal header dan file konfigurasi kernel Ubuntu untuk versi kernel di / lib / modules.

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

Ini untuk mencegah pesan "tidak ada versi simbol untuk module_layout"saat memuat modul dengan insmod atau modprobe.

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

Ini akan mengganti nama modul kernel asli (Ubuntu build) untuk memastikan bahwa custom yang ditambal akan dimuat.

Setiap edit

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

Ini untuk pengeditan.

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

Ini akan mengkompilasi dan membangun modul kernel .ko file menggunakan konfigurasi kernel dari distribusi Ubuntu Anda tersimpan di dalamnya /lib/modules/$(uname -r)/.

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

Ini akan menginstal modul kernel di /lib/modules/$(uname -r)/extra/, tidak menimpa modul distribusi jika Anda tidak mengganti nama file modul distribusi kernel. Dalam kasus mvsas ini juga akan berjalan depmod.

$ lsmod | grep mvsas

Jika ini menghasilkan output apa pun, modul mvsas perlu membongkar (modprobe -r mvsas) pertama.

$ sudo modprobe -v mvsas

Ini harus memuat modul kernel baru.

Periksa output untuk memverifikasi itu /lib/modules/.../extra/mvsas.ko sedang dimuat.

Kesalahan modprobe: tidak dapat disisipkan

Dalam beberapa kasus, Anda mungkin mengalami modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg) sementara di output modprobe verbose Anda melihat itu insmod sedang mencoba memuat modul dari lokasi default kernel. Sebagai contoh:

# 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)

Dalam hal ini Anda perlu menjalankan secara manual depmod dan coba muat modul lagi:

# depmod
# sudo modprobe -v mvsas

Catatan

  1. Itu mungkin kasus yang dihasilkan .ko file modul banyak (misalnya 20 kali) lebih besar ukurannya daripada file modul asli sebagaimana didistribusikan oleh Ubuntu; dalam hal ini make prepare Langkah ini dapat menciptakan pengembang Linux untuk men-debug file konfigurasi kernel dan Anda sedang membangun dari direktori sumber. Anda -C param mungkin tidak berfungsi seperti yang diharapkan.
  2. Saya telah melihat panduan dengan perintah lain seperti make modules_prepare dan make M=scripts/mod tapi saya rasa ini tidak diperlukan untuk kasus ini.
  3. Anda dapat menggunakan konfigurasi debug pengembang Linux dengan mengganti -C /lib/modules/$(uname -r)/build dengan -C /usr/src/linux-headers-$(uname -r)
  4. Di pengaturan default, apt-get source linux-sources akan mengembalikan kesalahan E: You must put some 'source' URIs in your sources.list. Untuk memperbaiki masalah ini Anda dapat memodifikasi file /etc/apt/sources.list dengan tidak berkomentar (menghapus awalan # dari yang pertama deb-src garis. Contoh untuk Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted. menjalankan sudo apt-get update, dan kemudian perintah akan mengirimkan sumber untuk Anda. Lihat juga pertanyaan ini di mana metode GUI untuk melakukan hal ini dijelaskan juga.

24
2017-08-24 11:50



Saya mendapat kesalahan: / bin / sh: arm-none-linux -gnueabi-gcc: tidak ditemukan - Mr.Hyde
$(uname-r) ternyata salah ... Anda perlu memanggil shell built-in: $(shell uname -r) - Albus Dumbledore
@AlbusDarmore Saya juga melihat kasus di mana $(shell uname -r) tidak berfungsi. Kenapa $(uname -r) kelihatannya salah? - Pro Backup
Saya juga harus menelepon echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.conf maka depmod melihat file yang baru diperbarui di .../extra. - Martin Pecka
Apa yang harus dilakukan dengan kesalahan penandatanganan modul, bagaimana cara menghindarinya? `` `INSTALL /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko Pada main.c: 158: - Kesalahan SSL: 02001002: pustaka sistem: fopen: Tidak ada file atau direktori seperti itu: bss_file.c: 175 - Kesalahan SSL: 2006D080: BIO rutinitas: BIO_new_file: tidak ada file seperti itu: bss_file.c: 178 file-tanda: certs / signing_key.pem: Tidak ada file atau direktori semacam itu `` ` - Envek