Bagaimana (resep) membangun hanya satu modul kernel?

35

Saya memiliki bug dalam modul kernel Linux yang menyebabkan stok Ubuntu 14.04 kernel oops (macet).

Itu sebabnya saya ingin mengedit / menambal sumber hanya dari modul kernel tunggal untuk menambahkan beberapa output debug tambahan. Modul kernel yang dimaksud adalah mvsasdan tidak perlu untuk boot. Untuk alasan itu saya tidak melihat ada kebutuhan untuk memperbarui gambar initrd.

Saya telah membaca banyak informasi (seperti yang ditunjukkan di bawah ini) dan menemukan proses setup dan kebingungan. Saya perlu dua resep:

  1. untuk mengatur / mengkonfigurasi lingkungan build sekali
  2. langkah-langkah yang harus dilakukan setelah mengedit file sumber apa pun dari modul kernel ini ( .cdan .h) dan mengubah hasil edit itu menjadi modul kernel baru ( .ko)

Sumber yang telah digunakan adalah:

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

Jawaban:

33

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

Atur 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-getmenghasilkan pesan kesalahan tentang URI sumber yang hilang, 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 yang ditambal kustom akan dimuat.

Setiap hasil edit

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

Ini untuk suntingan.

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

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

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

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

$ lsmod | grep mvsas

Jika ini menghasilkan output apa pun, modul mvsas perlu dibongkar dengan ( modprobe -r mvsas) terlebih dahulu.

$ sudo modprobe -v mvsas

Ini akan memuat modul kernel baru.

Periksa output untuk memverifikasi yang /lib/modules/.../extra/mvsas.kosedang dimuat.

Kesalahan modprobe: tidak bisa disisipkan

Dalam beberapa kasus, Anda mungkin mengalami beberapa modprobe: ERROR: could not insert 'xyz': Unknown symbol in module, or unknown parameter (see dmesg)saat di keluaran modprobe verbose yang Anda lihat insmodsedang 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 depmod secara manual dan mencoba memuat modul lagi:

# depmod
# sudo modprobe -v mvsas

Catatan

  1. Ini mungkin merupakan kasus bahwa .kofile modul yang dihasilkan jauh (misalnya 20 kali) lebih besar daripada file modul asli yang didistribusikan oleh Ubuntu; dalam hal ini make preparelangkah tersebut dapat membuat pengembang Linux men-debug file konfigurasi kernel dan Anda membangun dari direktori sumber. -CParam Anda mungkin tidak berfungsi seperti yang diharapkan.
  2. Saya telah melihat panduan dengan perintah lain seperti make modules_preparedan make M=scripts/modtetapi saya tidak berpikir ini diperlukan untuk kasus ini.
  3. Anda dapat menggunakan konfigurasi debug pengembang Linux dengan menggantinya -C /lib/modules/$(uname -r)/builddengan-C /usr/src/linux-headers-$(uname -r)
  4. Dalam pengaturan default, apt-get source linux-sourcesakan mengembalikan kesalahan E: You must put some 'source' URIs in your sources.list. Untuk memperbaiki masalah ini, Anda dapat memodifikasi file /etc/apt/sources.listdengan membatalkan komentar (menghapus yang memimpin #dari) deb-srcbaris pertama . Contoh untuk Ubuntu 17.10: deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted. jalankan sudo apt-get update, dan kemudian perintah akan mengirimkan sumber untuk Anda. Lihat juga pertanyaan ini di mana metode GUI untuk melakukan ini dijelaskan juga.
Pro Backup
sumber
Saya mendapat kesalahan: / bin / sh: arm-none-linux -gnueabi-gcc: tidak ditemukan
Dr.jacky
$(uname-r)rupanya salah ... Anda perlu memanggil shellbuilt-in:$(shell uname -r)
Albus Dumbledore
2
@AlbusDumbledore Saya juga melihat kasus di mana $(shell uname -r)tidak berfungsi . Kenapa $(uname -r)kelihatannya begitu salah?
Pro Backup
Saya juga harus menelepon echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.confagar depmodmelihat file yang baru diperbarui .../extra.
Martin Pecka
1
Apa yang harus dilakukan dengan kesalahan penandatanganan modul, bagaimana cara menghindarinya? `` `INSTALL /home/envek/linux-4.10.0/drivers/hwmon/dell-smm-hwmon.ko Di main.c: 158: - Kesalahan SSL: 02001002: perpustakaan sistem: fopen: Tidak ada file atau direktori: bss_file.c: 175 - Kesalahan SSL: 2006D080: Rutinitas BIO: BIO_new_file: tidak ada file seperti itu: bss_file.c: 178 file-file: certs / signed_key.pem: Tidak ada file atau direktori seperti itu ``
Envek