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 mvsas
dan 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:
- untuk mengatur / mengkonfigurasi lingkungan build sekali
- langkah-langkah yang harus dilakukan setelah mengedit file sumber apa pun dari modul kernel ini (
.c
dan.h
) dan mengubah hasil edit itu menjadi modul kernel baru (.ko
)
Sumber yang telah digunakan adalah:
- membangun satu modul kernel - pencarian Google
- http://www.linuxquestions.org/questions/linux-kernel-70/rebuilding-a-single-kernel-module-595116/
- https://stackoverflow.com/questions/8744087/how-to-recompile-just-a-single-kernel-module
- http://www.pixelbeat.org/docs/rebuild_kernel_module.html
- Bagaimana cara membangun modul kernel tunggal di-pohon?
- http://ubuntuforums.org/showthread.php?t=1153067
- http://ubuntuforums.org/showthread.php?t=2112166
- http://ubuntuforums.org/showthread.php?t=1115593
- membangun satu modul kernel ubuntu - pencarian Google
- 'make + single + kernel + module' - Tanyakan Ubuntu
- 'make + kernel + module' - Tanyakan Ubuntu
- Makefile saya menghasilkan: Tidak ada aturan untuk membuat target `arch / x86 / tools / relocs.c ', diperlukan
- '"Format modul tidak valid"' - Tanyakan Ubuntu
- Instalasi driver: kompilasi kode sumber untuk kernel yang lebih baru
- Modprobe: 'Format nodul tidak valid', namun berfungsi setelah insmod
- "Versi dump simbol" "tidak ada" - pencarian Google
- https://stackoverflow.com/questions/9425523/should-i-care-that-the-symbol-version-dump-is-missing-how-do-i-get-one
- https://askubuntu.com/questions/369051/where-can-i-find-the-corresponding-module-symvers-and-config-files-for-ubutunu
- "tidak ada versi simbol untuk module_layout" ketika mencoba memuat usbhid.ko
- Tautan rusak di dalam folder file header Linux
- 'make modules_install' - Tanyakan Ubuntu
- 'modules_install' - Tanyakan Ubuntu
- Direktori build kosong di kernel yang dikompilasi khusus
- https://askubuntu.com/questions/444345/not-able-to-see-pr-info-output
- https://askubuntu.com/questions/472496/in-which-directory-are-the-kernel-source-files-and-how-can-i-recompile-it
- Bagaimana saya bisa mengkompilasi dan menginstal file libata-eh.c yang ditambal itu?
- 'modules_install + depmod' - Tanyakan Ubuntu
- modules_install depmod - pencarian Google
- "make modules_install" - pencarian Google
- http://www.csee.umbc.edu/courses/undergrad/CMSC421/fall02/burt/projects/howto_build_kernel.html
- https://unix.stackexchange.com/questions/20864/what-happens-in-each-step-of-the-linux-kernel-building-process
- https://wiki.ubuntu.com/KernelCustomBuild
- http://www.cyberciti.biz/tips/build-linux-kernel-module-against-installed-kernel-source-tree.html
- http://www.linuxforums.org/forum/kernel/170617-solved-make-modules_install-different-path.html
- "siapkan" - pencarian Google
- "make prep" "skrip / kconfig / conf --silentoldconfig Kconfig" - pencarian Google
- http://ubuntuforums.org/showthread.php?t=1963515
- versi ubuntu "siapkan" - pencarian Google
- https://stackoverflow.com/questions/8276245/how-to-compile-a-kernel-module-against-a-new-source
- https://help.ubuntu.com/community/Kernel/Compile
- Bagaimana cara saya mengkompilasi modul kernel?
- Bagaimana cara menambahkan driver khusus ke kernel saya?
- https://askubuntu.com/questions/426549/compile-and-loading-kernel-module-without-compiling-the-kernel
Jawaban:
Resep untuk membuat modul khusus mungkin perlu dibagi menjadi tiga bagian.
Atur sekali
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 URI sumber yang hilang, lihat catatan # 4 di bagian bawah.Ini akan menyiapkan beberapa file yang diperlukan untuk membangun modul kernel.
Setiap versi kernel
Ini akan menginstal header dan file konfigurasi kernel Ubuntu untuk versi kernel di / lib / modules.
Ini untuk mencegah pesan " tidak ada versi simbol untuk module_layout " saat memuat modul dengan insmod atau modprobe.
Ini akan mengganti nama modul kernel asli (Ubuntu build) untuk memastikan bahwa yang ditambal kustom akan dimuat.
Setiap hasil edit
Ini untuk suntingan.
Ini akan mengkompilasi dan membangun
.ko
file modul kernel menggunakan konfigurasi kernel dari distribusi Ubuntu Anda yang tersimpan/lib/modules/$(uname -r)/
.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 .Jika ini menghasilkan output apa pun, modul mvsas perlu dibongkar dengan (
modprobe -r mvsas
) terlebih dahulu.Ini akan memuat modul kernel baru.
Periksa output untuk memverifikasi yang
/lib/modules/.../extra/mvsas.ko
sedang 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 lihatinsmod
sedang mencoba memuat modul dari lokasi default kernel. Sebagai contoh:Dalam hal ini Anda perlu menjalankan depmod secara manual dan mencoba memuat modul lagi:
Catatan
.ko
file modul yang dihasilkan jauh (misalnya 20 kali) lebih besar daripada file modul asli yang didistribusikan oleh Ubuntu; dalam hal inimake prepare
langkah tersebut dapat membuat pengembang Linux men-debug file konfigurasi kernel dan Anda membangun dari direktori sumber.-C
Param Anda mungkin tidak berfungsi seperti yang diharapkan.make modules_prepare
danmake M=scripts/mod
tetapi saya tidak berpikir ini diperlukan untuk kasus ini.-C /lib/modules/$(uname -r)/build
dengan-C /usr/src/linux-headers-$(uname -r)
apt-get source linux-sources
akan mengembalikan kesalahanE: You must put some 'source' URIs in your sources.list
. Untuk memperbaiki masalah ini, Anda dapat memodifikasi file/etc/apt/sources.list
dengan membatalkan komentar (menghapus yang memimpin#
dari)deb-src
baris pertama . Contoh untuk Ubuntu 17.10:deb-src http://ie.archive.ubuntu.com/ubuntu/ artful main restricted
. jalankansudo apt-get update
, dan kemudian perintah akan mengirimkan sumber untuk Anda. Lihat juga pertanyaan ini di mana metode GUI untuk melakukan ini dijelaskan juga.sumber
$(uname-r)
rupanya salah ... Anda perlu memanggilshell
built-in:$(shell uname -r)
$(shell uname -r)
tidak berfungsi . Kenapa$(uname -r)
kelihatannya begitu salah?echo "search extra built-in" | sudo tee /etc/depmod.d/00-extra.conf
agardepmod
melihat file yang baru diperbarui.../extra
.