Saya memiliki modul kernel Linux yang saya kompilasi secara dinamis. Bagaimana ini ditambahkan ke startup? Ada banyak .ko
file di /lib/modules
. Bagaimana prioritas ditetapkan untuk memuat modul-modul ini?
sumber
Saya memiliki modul kernel Linux yang saya kompilasi secara dinamis. Bagaimana ini ditambahkan ke startup? Ada banyak .ko
file di /lib/modules
. Bagaimana prioritas ditetapkan untuk memuat modul-modul ini?
Mereka tidak dimuat secara otomatis pada saat start-up atau waktu lainnya, meskipun banyak dari mereka akhirnya dimuat saat boot. Ada tiga mekanisme berbeda yang dengannya hal ini terjadi:
Permintaan Userspace: Yang mencakup segalanya, dari layanan init hingga udev ke baris perintah. Init atau udev mungkin merupakan cara yang paling mudah jika Anda ingin memuat modul tertentu saat boot.
Perangkat hotplugged: Ketika Anda menghubungkan sesuatu ke, misalnya, USB atau PCI, kernel mendeteksi ini dan meminta modul yang sesuai berdasarkan bagaimana perangkat mengidentifikasi dirinya.
Diperlukan protokol atau implementasi lain : Ketika kernel perlu melakukan sesuatu, seperti membaca sistem file, dan menemukannya tidak memiliki pengetahuan untuk melakukannya, itu akan meminta modul.
Perhatikan bahwa untuk dua yang terakhir saya menggunakan frase "request a module" - ini karena kernel benar-benar dimuat melalui daemon userspace, kmod
yang dijalankan /sbin/modprobe
. Menurut Wolfgang Mauerer di Linux Kernel Architecture , hanya ada ~ 100 titik berbeda di kernel 2.6 di mana ia memanggil request_module()
fungsi internal .
modprobe
menggunakan database MODULE_ALIAS yang diinstal. Ini ditentukan dalam kode sumber modul secara eksplisit, atau berasal dari itu MODULE_DEVICE_TABLE, yang merupakan daftar ID perangkat OEM yang layanan modul.
Banyak sistem diatur untuk menggunakan initrd atau initramfs . Ini adalah gambar sistem file yang dimuat oleh bootloader dan tersedia untuk kernel sebelum me-mount partisi root. Ini memungkinkan driver yang diperlukan untuk me-mount partisi root (driver disk, driver sistem file, device mapper atau driver volume logis, ...) dikompilasi sebagai modul dan diambil dari initrd / initramfs.
Skrip startup pada initrd ( /linuxrc
) atau initramfs ( /init
) biasanya memuat beberapa modul dan mencari sistem file root. Setiap distribusi memiliki pengaturannya sendiri. Ubuntu menggunakan initramfs yang dirakit dari komponen-komponen dalam initramfs-tools
paket dan dibuat ulang untuk setiap kernel berdasarkan driver yang diperlukan untuk me-mount sistem file root.
Setelah sistem file root di-mount, selama boot sistem, modul yang terdaftar di /etc/modules
(Debian, ...) atau /etc/modules.conf
(Red Hat, Arch, ...) dimuat. File ini biasanya mendaftar beberapa modul jika ada. Sebagian besar modul dimuat sesuai permintaan.
Ketika kernel mendeteksi beberapa perangkat keras yang kekurangan driver, atau komponen tertentu lainnya seperti protokol jaringan atau algoritma kriptografi, ia memanggil /sbin/modprobe
untuk memuat modul. Untuk driver perangkat keras, kernel menyampaikan nama-nama yang menyandikan PCI id, USB id, atau peruntukan sistematis perangkat keras lainnya. Ada tabel /lib/modules/$VERSION/modules.alias
yang memetakan sebutan sistematis ini untuk nama modul. Tabel ini dihasilkan oleh depmod
dan dibaca oleh modprobe
.
Jika Anda memiliki modul kernel tambahan yang Anda kompilasi secara manual untuk perangkat perangkat keras, masukkan /lib/modules/$VERSION/local
(buat local
subdirektori jika tidak ada) dan jalankan depmod -a
untuk membuat ulang basis data alias. Jika modul adalah untuk beberapa fitur yang tidak biasa yang tidak dapat dideteksi oleh kernel secara otomatis, masukkan ke dalamnya /lib/modules/$VERSION/local
, jalankan depmod -a
untuk menganalisis dependensinya, dan tambahkan nama modul ke /etc/modules
.
/var/lib/modules
atau/lib/modules/*/local
, juga tidak dapat menemukan penyebutan ini di Google atau didepmod
halaman manual. Tampak dalam CentOS 6.4, 7.4 dan Ubuntu 19.04./lib/modules/…
. Cukup buatlocal
subdirektori (depmod
lintasi/lib/module/$VERSION
secara rekursif).