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.