Apa urutan memuat modul kernel linux saat startup? Bagaimana prioritas ditetapkan kepada mereka?

9

Saya memiliki modul kernel Linux yang saya kompilasi secara dinamis. Bagaimana ini ditambahkan ke startup? Ada banyak .kofile di /lib/modules. Bagaimana prioritas ditetapkan untuk memuat modul-modul ini?

Ganeshredcobra
sumber

Jawaban:

11

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, kmodyang 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 .

modprobemenggunakan 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.

goldilocks
sumber
3

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-toolspaket 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/modprobeuntuk 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.aliasyang memetakan sebutan sistematis ini untuk nama modul. Tabel ini dihasilkan oleh depmoddan dibaca oleh modprobe.

Jika Anda memiliki modul kernel tambahan yang Anda kompilasi secara manual untuk perangkat perangkat keras, masukkan /lib/modules/$VERSION/local(buat localsubdirektori jika tidak ada) dan jalankan depmod -auntuk 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 -auntuk menganalisis dependensinya, dan tambahkan nama modul ke /etc/modules.

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya tidak dapat menemukan /var/lib/modulesatau /lib/modules/*/local, juga tidak dapat menemukan penyebutan ini di Google atau di depmodhalaman manual. Tampak dalam CentOS 6.4, 7.4 dan Ubuntu 19.04.
itsadok
@itsadok saya cukup yakin saya bermaksud menulis /lib/modules/…. Cukup buat localsubdirektori ( depmodlintasi /lib/module/$VERSIONsecara rekursif).
Gilles 'SO- stop being evil'