Memahami kernel Linux
Kernel Linux adalah teras sistem operasi Linux. Ia mengandungi komponen utama untuk menangani perkakasan dan memungkinkan komunikasi dan interaksi antara pengguna dan perkakasan. Kernel Linux bukan sistem monolitik tetapi cukup fleksibel, dan kernel diperluas oleh modul kernel yang disebut.
Apa itu modul kernel?
Secara umum, modul kernel adalah "potongan kode yang dapat dimuat dan dimuat ke dalam kernel berdasarkan permintaan. Mereka memperluas fungsi kernel tanpa perlu menghidupkan semula sistem ”[1]. Ini menyebabkan fleksibiliti yang sangat besar semasa operasi.
Selanjutnya, "modul kernel dapat dikonfigurasi sebagai built-in atau loadable. Untuk memuat atau mengeluarkan modul secara dinamis, modul harus dikonfigurasi sebagai modul yang dapat dimuat dalam konfigurasi kernel ”[1]. Ini dilakukan dalam fail sumber kernel / usr / src / linux /.konfigurasi [2]. Modul terbina dalam ditandai dengan "y" dan modul yang boleh dimuat dengan "m". Sebagai contoh, senarai 1 menunjukkan ini untuk modul SCSI:
Penyenaraian 1: Deklarasi penggunaan modul SCSI
CONFIG_SCSI = y # modul terbina dalamCONFIG_SCSI = m # modul yang boleh dimuat
Pembolehubah # CONFIG_SCSI # tidak ditetapkan
Kami tidak mengesyorkan mengedit file konfigurasi secara langsung, tetapi menggunakan perintah "make config", "make menuconfig", atau "make xconfig" untuk menentukan penggunaan modul yang sesuai dalam kernel Linux.
Perintah modul
Sistem Linux dilengkapi dengan sejumlah perintah yang berbeza untuk menangani modul kernel. Ini termasuk menyenaraikan modul yang saat ini dimuat ke kernel Linux, memaparkan maklumat modul, serta memuat dan memunggah modul kernel. Di bawah ini kami akan menerangkan arahan ini dengan lebih terperinci.
Untuk kernel Linux semasa, arahan berikut disediakan oleh pakej kmod [3]. Semua arahan adalah pautan simbolik ke kmod.
Senarai yang dimuatkan modul dengan lsmod
Kita mulakan dengan arahan lsmod. lsmod menyingkat "senarai modul" dan memaparkan semua modul yang sedang dimuat ke kernel Linux dengan memformat isi fail / proc / modul dengan baik. Penyenaraian 2 menunjukkan outputnya yang terdiri dari tiga lajur: nama modul, ukuran yang digunakan dalam memori, dan modul kernel lain yang menggunakan yang khusus.
Penyenaraian 2: Menggunakan lsmod
$ lsmodSaiz Modul Digunakan oleh
ctr 12927 2
ccm 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq
…
$
Cari modul yang tersedia untuk kernel anda sekarang
Mungkin terdapat modul kernel yang belum anda ketahui. Mereka disimpan dalam direktori / lib / modul. Dengan bantuan mencari, digabungkan dengan perintah yang tidak disebutkan namanya, anda dapat mencetak senarai modul ini. "Uname -r" hanya mencetak versi kernel Linux yang sedang berjalan. Penyenaraian 3 menunjukkan ini untuk 3 yang lebih tua.16.0-7 Linux
kernel, dan menunjukkan modul untuk IPv6 dan IRDA.
Penyenaraian 3: Memaparkan modul yang tersedia (pilihan)
$ cari / lib / modul / $ (uname -r) -name '*.ko '/ lib / modul / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_vti.ko
/ lib / modul / 3.16.0-7-amd64 / kernel / net / ipv6 / xfrm6_tunnel.ko
/ lib / modul / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_tunnel.ko
/ lib / modul / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_gre.ko
/ lib / modul / 3.16.0-7-amd64 / kernel / net / irda / irnet / irnet.ko
/ lib / modul / 3.16.0-7-amd64 / kernel / net / irda / irlan / irlan.ko
/ lib / modul / 3.16.0-7-amd64 / kernel / bersih / irda / irda.ko
/ lib / modul / 3.16.0-7-amd64 / kernel / net / irda / ircomm / ircomm.ko
/ lib / modul / 3.16.0-7-amd64 / kernel / net / irda / ircomm / ircomm-tty.ko
…
$
Paparkan maklumat modul menggunakan modinfo
Modinfo arahan memberitahu anda lebih banyak mengenai modul kernel yang diminta ("maklumat modul"). Sebagai parameter, modinfo memerlukan jalan modul penuh atau hanya nama modul. Penyenaraian 4 menunjukkan ini untuk modul kernel IrDA yang berurusan dengan tumpukan protokol Akses Langsung Inframerah.
Penyenaraian 4: Paparkan maklumat modul
$ / sbin / modinfo irdanama fail: / lib / modul / 3.16.0-7-amd64 / kernel / bersih / irda / irda.ko
alias: net-pf-23
lesen: GPL
keterangan: Tumpukan Protokol IrDA Linux
pengarang: Dag Brattli
bergantung: crc-ccitt
vermagik: 3.16.0-7-amd64 SMP mod_unload modversions
$
Hasilnya mengandungi bidang maklumat yang berbeza seperti jalur penuh untuk modul kernel, nama aliasnya, lesen perisian, perihalan modul, pengarang, dan juga inti kernel. Medan "bergantung" menunjukkan modul kernel lain yang bergantung kepadanya.
Bidang maklumat berbeza dari modul ke modul. Untuk membatasi output ke bidang informasi tertentu, modinfo menerima parameter "-F" (singkatan dari "-field") diikuti dengan nama bidang. Dalam Penyenaraian 5, keluarannya terbatas pada maklumat lesen yang tersedia menggunakan bidang lesen.
Penyenaraian 5: Paparkan bidang tertentu sahaja.
$ / sbin / modinfo -F irda lesenGPL
$
Dalam kernel Linux yang lebih baru, terdapat ciri keselamatan yang berguna. Ini merangkumi modul kernel yang ditandatangani secara kriptografi. Seperti yang dijelaskan di laman web projek kernel Linux [4], “ini memungkinkan peningkatan keamanan kernel dengan tidak membenarkan pemuatan modul atau modul yang tidak ditandatangani
ditandatangani dengan kunci yang tidak sah. Penandatanganan modul meningkatkan keselamatan dengan menjadikannya lebih sukar untuk memuatkan modul jahat ke kernel. Pemeriksaan tandatangan modul dilakukan oleh kernel sehingga tidak perlu memiliki bit pengguna yang dipercayai."Gambar di bawah menunjukkan ini untuk
modul parport_pc.
Tunjukkan konfigurasi modul menggunakan modprobe
Setiap modul kernel dilengkapi dengan konfigurasi tertentu. Modprobe arahan diikuti dengan pilihan "-c" (singkatan dari "-showconfig") menyenaraikan konfigurasi modul. Dalam kombinasi dengan grep, output ini terhad kepada simbol tertentu. Penyenaraian 6 menunjukkan ini untuk pilihan IPv6.
Penyenaraian 6: Tunjukkan konfigurasi modul
$ / sbin / modprobe -c | grep ipv6alias net_pf_10_proto_0_type_6 dccp_ipv6
alias net_pf_10_proto_33_type_6 dccp_ipv6
alias nf_conntrack_10 nf_conntrack_ipv6
alias nf_nat_10 nf_nat_ipv6
alias nft_afinfo_10 nf_tables_ipv6
alias nft_chain_10_nat nft_chain_nat_ipv6
alias nft_chain_10_route nft_chain_route_ipv6
alias nft_expr_10_reject nft_reject_ipv6
simbol alias: nf_defrag_ipv6_dayakan nf_defrag_ipv6
simbol alias: nf_nat_icmpv6_reply_translation nf_nat_ipv6
simbol alias: nft_af_ipv6 nf_tables_ipv6
simbol alias: nft_reject_ipv6_eval nft_reject_ipv6
$
Tunjukkan kebergantungan modul
Kernel Linux dirancang untuk menjadi modular, dan fungsi diedarkan ke sejumlah modul. Ini membawa kepada beberapa kebergantungan modul yang dapat ditampilkan menggunakan modprobe sekali lagi. Penyenaraian 7 menggunakan pilihan "-show-tergantung" untuk menyenaraikan kebergantungan untuk modul i915.
Penyenaraian 7: Tunjukkan kebergantungan modul
$ / sbin / modprobe --show-tergantung i915insmod / lib / modul / 3.16.0-7-amd64 / kernel / pemacu / i2c / i2c-core.ko
insmod / lib / modul / 3.16.0-7-amd64 / kernel / pemacu / i2c / algos / i2c-algo-bit.ko
insmod / lib / modul / 3.16.0-7-amd64 / kernel / pemacu / termal / termal_sys.ko
insmod / lib / modul / 3.16.0-7-amd64 / kernel / pemacu / gpu / drm / drm.ko
insmod / lib / modul / 3.16.0-7-amd64 / kernel / pemacu / gpu / drm / drm_kms_helper.ko
insmod / lib / modul / 3.16.0-7-amd64 / kernel / pemacu / acpi / video.ko
insmod / lib / modul / 3.16.0-7-amd64 / kernel / pemacu / acpi / butang.ko
insmod / lib / modul / 3.16.0-7-amd64 / kernel / pemacu / gpu / drm / i915 / i915.ko
$
Untuk menampilkan kebergantungan sebagai pohon yang serupa dengan perintah "pohon" atau "lsblk", projek modtree [5] dapat membantu (lihat gambar di bawah untuk pohon modul i915). Walaupun tersedia secara percuma di GitHub, ia memerlukan beberapa penyesuaian untuk mematuhi peraturan untuk perisian percuma dan menjadi sebahagian daripada distribusi Linux sebagai pakej.
Memuatkan modul
Memuat modul ke kernel yang berjalan dapat dilakukan dengan dua perintah - insmod ("insert module") dan modprobe. Ketahuilah bahawa terdapat sedikit perbezaan tetapi penting antara keduanya: insmod tidak menyelesaikan kebergantungan modul, tetapi modprobe lebih pintar dan melakukan itu.
Penyenaraian 8 menunjukkan cara memasukkan modul kernel IrDA. Harap maklum bahawa insmode berfungsi dengan jalur modul penuh, sedangkan modprobe gembira dengan nama modul dan melihatnya sendiri di pohon modul untuk kernel Linux semasa.
Penyenaraian 8: Memasukkan modul kernel
# insmod / lib / modul / 3.16.0-7-amd64 / kernel / bersih / irda / irda.ko…
# modprobe irda
Memunggah modul
Langkah terakhir berkaitan dengan memunggah modul dari kernel yang sedang berjalan. Sekali lagi, terdapat dua arahan yang tersedia untuk tugas ini - modprobe dan rmmod ("remove module"). Kedua-dua arahan mengharapkan nama modul sebagai parameter. Penyenaraian 9 menunjukkan ini untuk mengeluarkan modul IrDA dari kernel Linux yang sedang berjalan.
Penyenaraian 9: Membuang modul kernel
# rmmod irda…
# modprobe -r irda
…
Kesimpulannya
Mengendalikan modul kernel Linux bukanlah satu keajaiban. Hanya beberapa arahan untuk belajar, dan anda adalah ketua dapur.
Terima kasih
Penulis ingin mengucapkan terima kasih kepada Axel Beckert (ETH Zürich) dan Saif du Plessis (Hothead Studio Cape Town) atas bantuan mereka semasa menyiapkan artikel.
Pautan dan Rujukan
- [1] Modul Kernel, Arch Linux wiki, https: // wiki.archlinux.org / indeks.php / Kernel_module
- [2] Konfigurasi Kernel, https: // tldp.org / HOWTO / SCSI-2.4-HOWTO / kconfig.html
- [3] kmod, https: // git.kernel.org / pub / scm / perkakas / kernel / kmod / kmod.git
- [4] Kemudahan menandatangani modul Kernel, https: // www.kernel.org / doc / html / v4.15 / panduan pentadbir / modul-menandatangani.html
- [5] modtree, https: // github.com / falconindy / modtree