Kernel Linux

Gestionarea modulelor kernel Linux

Gestionarea modulelor kernel Linux

Înțelegerea nucleului Linux

Nucleul Linux este nucleul sistemului de operare Linux. Acesta conține componentele principale pentru a aborda hardware-ul și permite atât comunicarea, cât și interacțiunea dintre utilizator și hardware. Kernel-ul Linux nu este un sistem monolitic, ci destul de flexibil, iar nucleul este extins prin așa-numitele module kernel.

Ce este un modul kernel?

În general, un modul de nucleu este o „bucată de cod care poate fi încărcată și descărcată în nucleu la cerere. Acestea extind funcționalitatea nucleului fără a fi nevoie să reporniți sistemul ”[1]. Acest lucru duce la o flexibilitate foarte mare în timpul funcționării.

În plus, „un modul de nucleu poate fi configurat ca fiind încorporat sau încărcabil. Pentru a încărca sau elimina dinamic un modul, acesta trebuie să fie configurat ca un modul care poate fi încărcat în configurația nucleului ”[1]. Acest lucru se face în fișierul sursă al nucleului / usr / src / linux /.config [2]. Modulele încorporate sunt marcate cu „y” și modulele încărcabile cu „m”. De exemplu, listarea 1 demonstrează acest lucru pentru modulul SCSI:

Listarea 1: Declarație de utilizare a modulului SCSI

CONFIG_SCSI = y # modul încorporat
CONFIG_SCSI = m # modul de încărcare
# CONFIG_SCSI # variabila nu este setată

Nu recomandăm editarea directă a fișierului de configurare, ci să folosiți fie comanda „make config”, „make menuconfig”, fie „make xconfig” pentru a defini utilizarea modulului corespunzător din kernel-ul Linux.

Comenzi de modul

Sistemul Linux vine cu o serie de comenzi diferite pentru a gestiona modulele kernel. Aceasta include listarea modulelor încărcate în prezent în nucleul Linux, afișarea informațiilor despre modul, precum și încărcarea și descărcarea modulelor kernelului. Mai jos vom explica aceste comenzi în detaliu.

Pentru nucleele Linux actuale, următoarele comenzi sunt furnizate de pachetul kmod [3]. Toate comenzile sunt legături simbolice către kmod.

Lista a încărcat în prezent module cu lsmod

Începem cu comanda lsmod. lsmod prescurtează „listă module” și afișează toate modulele încărcate în prezent în kernel-ul Linux, formatând frumos conținutul fișierului / proc / modules. Listarea 2 prezintă ieșirea sa care constă din trei coloane: numele modulului, dimensiunea utilizată în memorie și alte module kernel care folosesc acesta specific.

Listarea 2: Utilizarea lsmod

$ lsmod
Dimensiune modul utilizată de
ctr 12927 2
ccm 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq
..
$

Găsiți module disponibile pentru nucleul dvs. curent

S-ar putea să fie disponibile module de nucleu pe care nu le cunoașteți încă. Sunt stocate în directorul / lib / modules. Cu ajutorul find, combinat cu comanda uname, puteți imprima o listă a acestor module. „Uname -r” tipărește doar versiunea kernel-ului Linux care rulează în prezent. Listarea 3 demonstrează acest lucru pentru un 3 mai vechi.16.0-7 Linux
și afișează module pentru IPv6 și IRDA.

Listarea 3: Afișarea modulelor disponibile (selecție)

$ find / lib / modules / $ (uname -r) -name '*.ko '
/ lib / modules / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_vti.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / ipv6 / xfrm6_tunnel.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_tunnel.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / ipv6 / ip6_gre.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irnet / irnet.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irlan / irlan.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irda.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / ircomm / ircomm.ko
/ lib / modules / 3.16.0-7-amd64 / kernel / net / irda / ircomm / ircomm-tty.ko
..
$

Afișați informații despre modul utilizând modinfo

Comanda modinfo vă spune mai multe despre modulul kernel solicitat („informații despre modul”). Ca parametru, modinfo necesită fie calea completă a modulului, fie pur și simplu numele modulului. Listarea 4 demonstrează acest lucru pentru modulul kernel IrDA care se ocupă de stiva de protocol Infrared Direct Access.

Listarea 4: Afișați informații despre modul

$ / sbin / modinfo irda
nume de fișier: / lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irda.ko
alias: net-pf-23
licență: GPL
descriere: Linux IrDA Protocol Stack
autor: Dag Brattli & Jean Tourrilhes
depinde: crc-ccitt
vermagic: 3.16.0-7-amd64 SMP mod_unload modversions
$

Ieșirea conține diferite câmpuri de informații, cum ar fi calea completă pentru modulul kernel, numele aliasului său, licența software, descrierea modulului, autorii, precum și internele kernelului. Câmpul „depinde” arată de ce alte module kernel depinde.

Câmpurile de informații diferă de la modul la modul. Pentru a limita ieșirea la un câmp de informații specific, modinfo acceptă parametrul „-F” (prescurtare pentru „-câmp”) urmat de numele câmpului. În Listarea 5, ieșirea este limitată la informațiile de licență puse la dispoziție folosind câmpul de licență.

Listarea 5: Afișați numai un câmp specific.

$ / sbin / modinfo -F licență irda
GPL
$

În nucleele Linux mai noi, este disponibilă o caracteristică de securitate utilă. Aceasta acoperă modulele kernel semnate criptografic. Așa cum s-a explicat pe site-ul web al proiectului kernel Linux [4], „acest lucru permite o securitate crescută a kernelului prin interzicerea încărcării de module sau module nesemnate
semnat cu o cheie invalidă. Semnarea modulului crește securitatea, îngreunând încărcarea unui modul rău intenționat în kernel. Verificarea semnăturii modulului este realizată de kernel, astfel încât să nu fie necesar să existe „biți de spațiu utilizatori de încredere.”Figura de mai jos arată acest lucru pentru
modulul parport_pc.

Afișați configurația modulului utilizând modprobe

Fiecare modul de nucleu vine cu o configurație specifică. Comanda modprobe urmată de opțiunea „-c” (prescurtare pentru „-showconfig”) listează configurația modulului. În combinație cu grep, această ieșire este limitată la un simbol specific. Listarea 6 demonstrează acest lucru pentru opțiunile IPv6.

Listarea 6: Afișați configurația modulului

$ / sbin / modprobe -c | grep ipv6
alias 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_enable 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
$

Afișați dependențele modulului

Kernel-ul Linux este proiectat să fie modular, iar funcționalitatea este distribuită pe mai multe module. Acest lucru duce la mai multe dependențe de module care pot fi afișate din nou folosind modprobe. Listarea 7 folosește opțiunea „-show-depend” pentru a lista dependențele pentru modulul i915.

Listarea 7: Afișați dependențele modulului

$ / sbin / modprobe --show-depend i915
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / i2c / i2c-core.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / i2c / algos / i2c-algo-bit.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / thermal / thermal_sys.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / gpu / drm / drm.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / gpu / drm / drm_kms_helper.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / acpi / video.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / acpi / button.ko
insmod / lib / modules / 3.16.0-7-amd64 / kernel / drivers / gpu / drm / i915 / i915.ko
$

Pentru a afișa dependențele ca un copac similar cu comanda „copac” sau „lsblk”, proiectul modtree [5] vă poate ajuta (a se vedea figura de mai jos pentru arborele modulului i915). Deși este disponibil gratuit pe GitHub, necesită unele adaptări pentru a respecta regulile pentru software-ul gratuit și pentru a deveni parte a unei distribuții Linux ca pachet.

Se încarcă module

Încărcarea unui modul într-un nucleu care rulează se poate face prin două comenzi - insmod („insert module”) și modprobe. Rețineți că există o ușoară, dar importantă diferență între aceste două: insmod nu rezolvă dependențele modulului, dar modprobe este mai inteligent și face asta.

Listarea 8 arată cum se introduce modulul kernel IrDA. Vă rugăm să rețineți că insmode funcționează cu calea completă a modulului, în timp ce modprobe este mulțumit de numele modulului și îl caută singur în arborele modulului pentru kernel-ul Linux curent.

Listarea 8: Introducerea unui modul de nucleu

# insmod / lib / modules / 3.16.0-7-amd64 / kernel / net / irda / irda.ko
..
# modprobe irda

Descărcarea modulelor

Ultimul pas se referă la descărcarea modulelor dintr-un nucleu care rulează. Din nou, există două comenzi disponibile pentru această sarcină - modprobe și rmmod („elimină modulul”). Ambele comenzi așteaptă numele modulului ca parametru. Listarea 9 arată acest lucru pentru eliminarea modulului IrDA din nucleul Linux care rulează.

Listarea 9: Eliminarea unui modul de nucleu

# rmmod irda
..
# modprobe -r irda
..

Concluzie

Gestionarea modulelor kernel-ului Linux nu este o mare magie. Doar câteva comenzi de învățat și tu ești stăpânul bucătăriei.

Mulțumesc

Autorul dorește să mulțumească lui Axel Beckert (ETH Zürich) și Saif du Plessis (Hothead Studio Cape Town) pentru ajutorul acordat în timpul pregătirii articolului.

Linkuri și referințe

  • [1] Modulul kernel, wiki Arch Linux, https: // wiki.archlinux.org / index.php / Kernel_module
  • [2] Configurare kernel, https: // tldp.org / HOWTO / SCSI-2.4-HOWTO / kconfig.html
  • [3] kmod, https: // git.nucleu.org / pub / scm / utils / kernel / kmod / kmod.git
  • [4] Facilitatea de semnare a modulului kernel, https: // www.nucleu.org / doc / html / v4.15 / administrator-ghid / modul-semnare.html
  • [5] modtree, https: // github.com / falconindy / modtree
SuperTuxKart for Linux
SuperTuxKart is a great title designed to bring you the Mario Kart experience free of charge on your Linux system. It is pretty challenging and fun to...
Battle for Wesnoth Tutorial
The Battle for Wesnoth is one of the most popular open source strategy games that you can play at this time. Not only has this game been in developmen...
0 A.D. Tutorial
Out of the many strategy games out there, 0 A.D. manages to stand out as a comprehensive title and a very deep, tactical game despite being open sourc...