GNU/Linux >> Belajar Linux >  >> Linux

Cara memuat atau membongkar modul kernel Linux

Artikel ini dikutip dari bab 15 Linux in Action, diterbitkan oleh Manning.

Linux mengelola periferal perangkat keras menggunakan modul kernel. Begini cara kerjanya.

Kernel Linux yang sedang berjalan adalah salah satu hal yang tidak ingin Anda kecewakan. Bagaimanapun, kernel adalah perangkat lunak yang menggerakkan semua yang dilakukan komputer Anda. Mempertimbangkan berapa banyak detail yang harus dikelola secara bersamaan pada sistem langsung, lebih baik membiarkan kernel melakukan tugasnya dengan gangguan sesedikit mungkin. Tetapi jika tidak mungkin membuat perubahan kecil pada lingkungan komputasi tanpa me-reboot seluruh sistem, maka mencolokkan webcam atau printer baru dapat menyebabkan gangguan yang menyakitkan pada alur kerja Anda. Harus mem-boot ulang setiap kali Anda menambahkan perangkat agar sistem mengenalinya bukanlah hal yang efisien.

Untuk menciptakan keseimbangan yang efektif antara keunggulan stabilitas dan kegunaan yang berlawanan, Linux mengisolasi kernel, tetapi memungkinkan Anda menambahkan fungsionalitas spesifik dengan cepat melalui modul kernel yang dapat dimuat (LKM). Seperti yang ditunjukkan pada gambar di bawah, Anda dapat menganggap modul sebagai bagian dari perangkat lunak yang memberi tahu kernel di mana menemukan perangkat dan apa yang harus dilakukan dengannya. Pada gilirannya, kernel membuat perangkat tersedia bagi pengguna dan memproses serta mengawasi operasinya.

Tidak ada yang menghentikan Anda dari menulis modul Anda sendiri untuk mendukung perangkat persis seperti yang Anda inginkan, tetapi mengapa repot-repot? Pustaka modul Linux sudah sangat kuat sehingga biasanya tidak perlu menggulung sendiri. Dan sebagian besar waktu, Linux akan secara otomatis memuat modul perangkat baru tanpa Anda sadari.

Namun, ada kalanya, untuk beberapa alasan, itu tidak terjadi dengan sendirinya. (Anda tidak ingin meninggalkan manajer perekrutan dengan tidak sabar menunggu wajah Anda yang tersenyum untuk bergabung dalam wawancara kerja konferensi video terlalu lama.) Untuk membantu, Anda perlu memahami lebih banyak tentang modul kernel dan, khususnya , cara menemukan modul aktual yang akan menjalankan periferal Anda dan kemudian cara mengaktifkannya secara manual.

Menemukan modul kernel

Menurut konvensi yang diterima, modul adalah file dengan ekstensi .ko (objek kernel) yang berada di bawah /lib/modules/ direktori. Namun, sebelum Anda menavigasi ke bawah ke file-file itu, Anda mungkin harus membuat pilihan. Karena Anda diberi opsi pada saat boot untuk memuat satu dari daftar rilis, perangkat lunak khusus yang diperlukan untuk mendukung pilihan Anda (termasuk modul kernel) harus ada di suatu tempat. Nah, /lib/modules / adalah salah satunya. Dan di sanalah Anda akan menemukan direktori yang berisi modul untuk setiap rilis kernel Linux yang tersedia; misalnya:

$ ls /lib/modules
4.4.0-101-generic
4.4.0-103-generic
4.4.0-104-generic

Dalam kasus saya, kernel yang aktif adalah versi dengan nomor rilis tertinggi (4.4.0-104-generic), tetapi tidak ada jaminan bahwa itu akan sama untuk Anda (kernel sering diperbarui). Jika Anda akan melakukan beberapa pekerjaan dengan modul yang ingin Anda gunakan pada sistem langsung, Anda harus memastikan bahwa Anda memiliki hierarki direktori yang tepat.

Lebih banyak sumber daya Linux

  • Lembar contekan perintah Linux
  • Lembar contekan perintah Linux tingkat lanjut
  • Kursus online gratis:Ikhtisar Teknis RHEL
  • Lembar contekan jaringan Linux
  • Lembar contekan SELinux
  • Lembar contekan perintah umum Linux
  • Apa itu container Linux?
  • Artikel Linux terbaru kami

Kabar baik:ada trik yang bisa diandalkan. Daripada mengidentifikasi direktori dengan nama dan berharap Anda akan mendapatkan yang benar, gunakan variabel sistem yang selalu menunjuk ke nama kernel yang aktif. Anda dapat memanggil variabel itu menggunakan uname -r (-r menentukan nomor rilis kernel dari dalam informasi sistem yang biasanya ditampilkan):

$ uname -r
4.4.0-104-generic

Dengan informasi itu, Anda dapat memasukkan uname ke dalam referensi sistem file Anda menggunakan proses yang dikenal sebagai substitusi perintah . Untuk menavigasi ke direktori yang benar, misalnya, Anda akan menambahkannya ke /lib/modules . Untuk memberi tahu Linux bahwa "uname" bukan lokasi sistem file, sertakan uname bagian dalam backticks, seperti ini:

$ ls /lib/modules/`uname -r`
build   modules.alias        modules.dep      modules.softdep
initrd  modules.alias.bin    modules.dep.bin  modules.symbols
kernel  modules.builtin      modules.devname  modules.symbols.bin
misc    modules.builtin.bin  modules.order    vdso

Anda akan menemukan sebagian besar modul diatur dalam subdirektori di bawah kernel/ direktori. Luangkan waktu beberapa menit untuk menelusuri direktori tersebut untuk mendapatkan gambaran tentang bagaimana segala sesuatunya diatur dan apa yang tersedia. Nama file biasanya memberi Anda ide bagus tentang apa yang Anda lihat.

$ ls /lib/modules/`uname -r`/kernel
arch  crypto  drivers  fs  kernel  lib  mm
net  sound  ubuntu  virt  zfs

Itulah salah satu cara untuk menemukan modul kernel; sebenarnya, ini adalah cara cepat dan kotor untuk melakukannya. Tapi itu bukan satu-satunya cara. Jika Anda ingin mendapatkan set lengkap, Anda dapat membuat daftar semua modul yang dimuat saat ini, bersama dengan beberapa informasi dasar, dengan menggunakan lsmod . Kolom pertama dari keluaran yang terpotong ini (akan terlalu banyak untuk dicantumkan di sini) adalah nama modul, diikuti dengan ukuran dan nomor file, lalu nama modul lain yang menjadi tumpuan masing-masing:

$ lsmod
[...]
vboxdrv          454656  3 vboxnetadp,vboxnetflt,vboxpci
rt2x00usb        24576  1 rt2800usb
rt2800lib        94208  1 rt2800usb
[...]

Berapa banyak yang terlalu banyak? Baiklah, mari kita jalankan lsmod sekali lagi, tapi kali ini menyalurkan output ke wc -l untuk mendapatkan hitungan baris:

$ lsmod | wc -l
113

Itu adalah modul yang dimuat. Berapa banyak yang tersedia secara total? Menjalankan modprobe -c dan menghitung garis akan memberi kita angka itu:

$ modprobe -c | wc -l
33350

Ada 33.350 modul yang tersedia!?! Sepertinya seseorang telah bekerja keras selama bertahun-tahun untuk menyediakan perangkat lunak untuk menjalankan perangkat fisik kami.

Lebih banyak sumber daya Linux

  • Lembar contekan perintah Linux
  • Lembar contekan perintah Linux tingkat lanjut
  • Kursus online gratis:Ikhtisar Teknis RHEL
  • Lembar contekan jaringan Linux
  • Lembar contekan SELinux
  • Lembar contekan perintah umum Linux
  • Apa itu container Linux?
  • Artikel Linux terbaru kami

Catatan:Pada beberapa sistem, Anda mungkin menemukan modul khusus yang direferensikan dengan entri uniknya di /etc/modules file atau sebagai file konfigurasi yang disimpan ke /etc/modules-load.d/ . Kemungkinannya adalah bahwa modul-modul seperti itu adalah produk dari proyek-proyek pembangunan lokal, mungkin melibatkan eksperimen-eksperimen mutakhir. Bagaimanapun, ada baiknya untuk mengetahui apa yang sedang Anda lihat.

Begitulah cara Anda menemukan modul. Tugas Anda selanjutnya adalah mencari cara untuk memuat modul yang tidak aktif secara manual jika, karena alasan tertentu, itu tidak terjadi dengan sendirinya.

Memuat modul kernel secara manual

Sebelum Anda dapat memuat modul kernel, logika menentukan bahwa Anda harus mengonfirmasi bahwa modul itu ada. Dan sebelum Anda bisa melakukannya, Anda harus tahu apa namanya. Mendapatkan bagian itu terkadang membutuhkan keajaiban dan keberuntungan yang seimbang dan bantuan dari kerja keras penulis dokumentasi online.

Saya akan mengilustrasikan prosesnya dengan menjelaskan masalah yang saya alami beberapa waktu lalu. Suatu hari, untuk alasan yang masih luput dari perhatian saya, antarmuka WiFi di laptop berhenti bekerja. Seperti itu. Mungkin pembaruan perangkat lunak menjatuhkannya. Siapa tahu? Saya menjalankan lshw -c network dan disuguhi informasi yang sangat aneh ini:

network UNCLAIMED
    AR9485 Wireless Network Adapter

Linux mengenali antarmuka (Atheros AR9485) tetapi mencantumkannya sebagai tidak diklaim. Yah, seperti yang mereka katakan, "Ketika keadaan menjadi sulit, carilah yang sulit di internet." Saya menjalankan pencarian untuk modul atheros ar9 linux dan, setelah memilah-milah halaman dan halaman hasil lima dan bahkan 10 tahun yang menasihati saya untuk menulis modul saya sendiri atau menyerah, saya akhirnya menemukan bahwa (dengan Ubuntu 16.04, setidaknya) ada modul yang berfungsi. Namanya ath9k.

Ya! Pertarungan sama bagusnya dengan yang dimenangkan! Menambahkan modul ke kernel jauh lebih mudah daripada kedengarannya. Untuk memeriksa ulang apakah itu tersedia, Anda dapat menjalankan find terhadap pohon direktori modul, tentukan -type f untuk memberi tahu Linux bahwa Anda sedang mencari file, lalu tambahkan string ath9k bersama dengan tanda bintang glob untuk menyertakan semua nama file yang dimulai dengan string Anda:

$ find /lib/modules/$(uname -r) -type f -name ath9k*
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_common.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_htc.ko
/lib/modules/4.4.0-97-generic/kernel/drivers/net/wireless/ath/ath9k/ath9k_hw.ko

Tinggal satu langkah lagi, muat modul:

# modprobe ath9k

Itu dia. Tidak ada reboot. Tidak perlu repot.

Berikut ini satu contoh lagi untuk menunjukkan kepada Anda cara bekerja dengan modul aktif yang telah rusak. Ada saat ketika menggunakan webcam Logitech saya dengan perangkat lunak tertentu akan membuat kamera tidak dapat diakses oleh program lain hingga sistem boot berikutnya. Terkadang saya perlu membuka kamera di aplikasi yang berbeda tetapi tidak punya waktu untuk mematikan dan memulai kembali. (Saya menjalankan banyak aplikasi, dan menyiapkan semuanya setelah booting membutuhkan waktu.)

Karena modul ini mungkin aktif, menggunakan lsmod untuk mencari kata video harus memberi saya petunjuk tentang nama modul yang relevan. Faktanya, ini lebih baik daripada petunjuk:Satu-satunya modul yang dijelaskan dengan kata video adalah uvcvideo (seperti yang Anda lihat berikut ini):

$ lsmod | grep video
uvcvideo               90112  0
videobuf2_vmalloc      16384  1 uvcvideo
videobuf2_v4l2         28672  1 uvcvideo
videobuf2_core         36864  2 uvcvideo,videobuf2_v4l2
videodev              176128  4 uvcvideo,v4l2_common,videobuf2_core,videobuf2_v4l2
media                  24576  2 uvcvideo,videodev

Mungkin ada sesuatu yang bisa saya kendalikan yang menyebabkan kecelakaan itu, dan saya kira saya bisa menggali lebih dalam untuk melihat apakah saya bisa memperbaikinya dengan cara yang benar. Tapi Anda tahu bagaimana itu; terkadang Anda tidak peduli dengan teorinya dan hanya ingin perangkat Anda berfungsi. Jadi saya menggunakan rmmod untuk mematikan modul uvcvideo dan modprobe untuk memulainya kembali dengan baik dan segar:

# rmmod uvcvideo
# modprobe uvcvideo

Sekali lagi:tidak ada reboot. Tidak ada noda darah yang membandel.


Linux
  1. Cara memutakhirkan Kernel di Desktop Linux

  2. Cara memeriksa versi Kernel di Linux

  3. Linux – Bagaimana Cara Menentukan Modul Yang Menodai Kernel?

  1. Linux – Bagaimana Cara Memuat Ulang Modul Kernel dengan Benar?

  2. Cara Membuat, Mengkompilasi, Memuat Modul Kernel yang Dapat Dimuat LKM Linux

  3. Cara Menulis Modul Kernel Linux Anda Sendiri dengan Contoh Sederhana

  1. Linux – Kernel Tercemar Di Linux?

  2. Cara memuat Modul SELinux Untuk Oracleasm

  3. Bagaimana cara memberikan nilai ke modul kernel Linux bawaan saat boot?