Apakah modul driver dimuat dan diturunkan secara otomatis?

15

Di Ubuntu 14.04, saya menemukan bahwa ketika saya tidak mencolokkan adaptor nirkabel eksternal saya, modulnya rt2800usbmasih ditampilkan di lsmod.

  1. kapan memuat modul driver secara otomatis terjadi? Apakah ketika perangkat terhubung ke komputer, atau ketika OS boot?

  2. kapan modul driver diturunkan secara otomatis terjadi? Apakah ketika perangkat terputus ke komputer, atau ketika OS dimatikan?

Tim
sumber

Jawaban:

13

Ketika kernel mendeteksi perangkat baru, itu menjalankan program modprobedan memberikannya nama yang mengidentifikasi perangkat. Sebagian besar perangkat diidentifikasi melalui nomor terdaftar untuk vendor dan model, misalnya PCI atau pengidentifikasi USB . The modprobeProgram berkonsultasi tabel modul alias untuk mencari nama file yang berisi driver perangkat tertentu. Prinsip serupa berlaku untuk driver untuk hal-hal yang bukan perangkat perangkat keras, seperti sistem file dan algoritma kriptografi. Untuk detail lebih lanjut, lihat Debian tidak mendeteksi kartu PCI seri setelah reboot/lib/modules/VERSION/modules.alias

Setelah modprobe mengidentifikasi file modul mana ( .ko) berisi driver yang diminta, ia memuat file modul ke dalam kernel: kode modul dimuat secara dinamis ke dalam kernel. Jika modul berhasil dimuat, maka akan muncul di daftar dari lsmod.

Pemuatan otomatis modul terjadi ketika kernel mendeteksi perangkat keras hotpluggable baru, misalnya ketika Anda menghubungkan perangkat USB. Sistem operasi juga melakukan enumerasi semua perangkat keras yang ada pada sistem lebih awal selama startup, untuk memuat driver untuk periferal yang hadir pada saat boot.

Dimungkinkan juga untuk secara manual meminta pemuatan modul dengan perintah modprobeatau insmod. Sebagian besar distribusi menyertakan skrip startup yang memuat modul yang terdaftar di /etc/modules. Cara lain untuk memuat modul adalah jika mereka merupakan ketergantungan modul: jika modul A tergantung pada modul B, maka modprobe Amuat B sebelum memuat A.

Setelah modul dimuat, modul itu tetap dimuat hingga dibongkar secara eksplisit, bahkan jika semua perangkat yang menggunakan driver itu telah diputus. Dahulu kala, ada mekanisme untuk secara otomatis membongkar modul yang tidak digunakan, tetapi sudah dihapus, jika saya ingat dengan benar, ketika udev datang ke tempat kejadian. Saya menduga bahwa pembongkaran modul otomatis bukanlah fitur yang umum karena sistem yang cenderung membutuhkannya kebanyakan adalah PC desktop yang memiliki banyak memori (pada skala kode driver).

Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih. Saya belum dimodifikasi /etc/modules. rt2800usbdalam output dari lsmod, dan apakah itu berarti bahwa saya menghubungkan perangkatnya ke komputer saya sebelum mem-boot?
Tim
1
@Tim. Jika modul dimuat, dan Anda tidak memuatnya secara eksplisit, dan itu tidak tercantum /etc/modules, maka ya, mungkin alasan modul dimuat adalah karena perangkat ada di beberapa titik.
Gilles 'SO- stop being evil'
5

Modul dimuat ketika sistem melakukan booting melalui Disk RAM Awal alias initrd . Bagian Dasar Pemikiran menyatakan:

Banyak distribusi Linux mengirimkan gambar kernel Linux generik tunggal - yang dibuat oleh pengembang distribusi untuk mem-boot berbagai perangkat keras. Driver perangkat untuk citra kernel generik ini dimasukkan sebagai modul kernel yang dapat dimuat karena mengkompilasi banyak driver secara statis menjadi satu kernel menyebabkan citra kernel menjadi jauh lebih besar, mungkin terlalu besar untuk melakukan booting pada komputer dengan memori terbatas. Ini kemudian menimbulkan masalah dalam mendeteksi dan memuat modul yang diperlukan untuk me-mount sistem file root pada saat boot, atau dalam hal ini, menyimpulkan di mana atau apa sistem file root.

Ubuntu seperti banyak distribusi lainnya, memilih untuk memuat setiap driver perangkat ke initrd ini, terlepas dari apakah driver diperlukan atau tidak, dan juga terlepas dari apakah perangkat hadir pada sistem atau tidak. Seperti yang ditunjukkan Giles, semuanya dimuat ke dalam RAM, dan kemudian modul yang digunakan terdeteksi pada saat startup, dan yang tidak digunakan dihapus dari RAM. Dengan menggunakan pendekatan ini memastikan bahwa Ubuntu akan selalu dimulai pada sistem apa pun terlepas dari pengaturan. Ubuntu meniru kernel monolitik menggunakan konstruksi mikrokernel. Lihat Alasan Ini Berhasil


  1. Modul rt2800usbakan selalu dimuat saat bootup karena modul itu termasuk dalam initramf yang disebut Gilles. Initramf adalah penerus initrd, oleh karena itu initramfs akan selalu ditunjukkan oleh lsmod. Perhatikan bahwa Anda dapat memasukkan modul yang baru dikompilasi ke dalam kernel dengan menggunakan modprobediikuti dengan nama modul.

Sebagai tes reboot sistem Anda dengan adaptor nirkabel Anda dicabut. Jika semuanya berjalan dengan baik, modul tidak akan terdaftar dalam lsmodoutput karena selama bootup, proses deteksi dimulai oleh initramfs dan init sstem tidak menemukan perangkat selama probing, dan modul telah dihapus dari RAM.

  1. Untuk menghapus modul saat sistem sedang berjalan, Anda dapat menggunakan perintah seperti rmmod, atau modprobe -rdiikuti dengan nama modul. Pada boot berikutnya modul akan dimuat ulang. Lihat di atas. Dalam sebagian besar kasus, modul tidak dilepas secara dinamis, karena ini akan menonaktifkan hotplugging, yaitu begitu modul dilepas, perangkat yang menggunakannya tidak dapat dideteksi lagi saat dipasang kembali.

Untuk menghapus modul dari lsmod, Anda harus menghapusnya dari gambar initramfs yang dibuat dengan mengkompilasi ulang kernel tanpa modul yang dipilih dan kemudian membangun kembali gambar. Melakukan hal ini menonaktifkan semua deteksi modul tersebut.

eyoung100
sumber
3
Anda bingung memuat file ke dalam RAM sebagai bagian dari disk RAM dan memuat (yaitu menghubungkan secara dinamis) modul ke dalam kernel yang sedang berjalan. Modul dimuat sementara ke dalam memori - bukan ke dalam kernel - dari initrd (secara teknis merupakan initramf saat ini), tetapi kemudian dihapus dari memori setelah root sebenarnya dipasang. Modul hanya dimuat ke dalam kernel ketika perangkat yang menggunakannya terdeteksi (dengan beberapa pengecualian).
Gilles 'SO- stop being evil'
Sementara saya setuju di sini, dia berbicara tentang membongkar dan memuat satu modul yang tidak dapat dilakukan kecuali dia memilih untuk mengkonfigurasi ulang RAM RAM Ubuntu, yang tidak direkomendasikan karena Ubuntu memilih untuk memuat semua modul ke dalam RAM setiap pembaruan kernel. Semua modul dimuat setiap kali, tidak semua digunakan.
eyoung100
2
Tidak, pertanyaannya adalah tentang memuat dan menurunkan modul ke dalam kernel. Baik jawaban awal Anda maupun jawaban revisi Anda tidak membahasnya. Initramfs tidak relevan (atau paling tidak relevan secara periferal) dengan pertanyaan ini.
Gilles 'SO- berhenti bersikap jahat'
@Gilles Apakah ini lebih baik ??
eyoung100
1
@ eyoung100, saya setuju dengan Gilles. Diskusi initramfs tidak relevan dengan pertanyaan. Modul umumnya dimuat dengan menghitung perangkat di /sysdan memuat driver untuk perangkat yang sebenarnya ditemukan dalam sistem. Ini terjadi apakah perangkat hadir saat boot atau hot dicolokkan nanti. udevlebih banyak berkaitan dengan itu daripada initramfs / initrd lakukan, dan apakah semua, sebagian besar, atau hanya beberapa modul disalin ke initramfs (opsi konfigurasi dalam /etc/initramfs-tools/initramfs.conf) tidak terlalu relevan.
Celada