Verwalten von Linux -Kernelmodulen

Verwalten von Linux -Kernelmodulen

Den Linux -Kernel verstehen

Der Linux -Kernel ist der Kern des Linux -Betriebssystems. Es enthält die Hauptkomponenten, um die Hardware anzusprechen, und ermöglicht sowohl die Kommunikation als auch die Interaktion zwischen dem Benutzer und der Hardware. Der Linux-Kernel ist kein monolithisches System, sondern ziemlich flexibel, und der Kernel wird von sogenannten Kernelmodulen verlängert.

Was ist ein Kernelmodul??

Im Allgemeinen ist ein Kernelmodul ein „Code, der auf Nachfrage in den Kernel geladen und entladen werden kann. Sie erweitern die Funktionalität des Kernels, ohne das System neu zu starten “[1]. Dies führt zu sehr großer Flexibilität während des Betriebs.

Darüber hinaus kann ein Kernelmodul als integriert oder ladbar konfiguriert werden. Um ein Modul dynamisch zu laden oder zu entfernen, muss es in der Kernelkonfiguration als ladbares Modul konfiguriert werden “[1]. Dies geschieht in der Kernel -Quelldatei/usr/src/linux/.Konfiguration [2]. Eingebaute Module sind mit „y“ und ladbaren Modulen mit „M“ markiert. Beispielsweise zeigt die Auflistung 1 für das SCSI -Modul:

Listing 1: SCSI -Modulverbrauchserklärung

Config_scsi = y # integriertes Modul
Config_scsi = m # ladbares Modul
# Config_scsi # variable ist nicht festgelegt

Wir empfehlen keine direkt.

Modulbefehle

Das Linux -System verfügt über eine Reihe verschiedener Befehle, um Kernelmodule zu verarbeiten. Dies beinhaltet die Auflistung der derzeit in den Linux -Kernel geladenen Module, das Anzeigen von Modulinformationen sowie das Laden und Entladen von Kernelmodulen. Im Folgenden werden wir diese Befehle genauer erläutern.

Für die aktuellen Linux -Kernel werden die folgenden Befehle vom KMOD -Paket bereitgestellt [3]. Alle Befehle sind symbolische Links zu KMOD.

Die derzeit geladene Liste mit LSMOD -Modulen

Wir beginnen mit dem Befehl LSMOD. LSMOD -Abkürzungen „Listenmodule“ und zeigt alle Module an, die derzeit in den Linux -Kernel geladen werden, indem der Inhalt der Datei /Proc /Module gut formatiert wird. Listing 2 zeigt die Ausgabe, die aus drei Spalten besteht: Modulname, die im Speicher verwendete Größe und andere Kernelmodule, die dieses spezifische verwenden.

Listing 2: Verwenden von LSMOD

$ lsmod
Modulgröße verwendet von
CTR 12927 2
CCM 17534 2
snd_hrimer 12604 1
SND_SEQ 57112 1
SND_SEQ_DEVICE 13132 1 SND_SEQ

$

Finden Sie verfügbare Module für Ihren aktuellen Kernel

Es könnte Kernel -Module zur Verfügung stehen, von denen Sie noch nicht bekannt sind. Sie werden im Verzeichnis /lib /module gespeichert. Mit Hilfe von Find, kombiniert mit dem Befehl uname, können Sie eine Liste dieser Module drucken. "Uname -r" druckt nur die Version des aktuell ausgeführten Linux -Kernels. Listing 3 zeigt dies für einen älteren 3.16.0-7 Linux
Kernel und zeigt Module für IPv6 und IRDA an.

Listing 3: Anzeigen der verfügbaren Module (Auswahl)

$ find/lib/module/$ (uname -r) -name '*.ko '
/lib/module/3.16.0-7-AMD64/Kernel/net/ipv6/ip6_vti.ko
/lib/module/3.16.0-7-AMD64/Kernel/net/ipv6/xfrm6_tunnel.ko
/lib/module/3.16.0-7-AMD64/Kernel/net/ipv6/ip6_tunnel.ko
/lib/module/3.16.0-7-AMD64/Kernel/net/ipv6/ip6_gre.ko
/lib/module/3.16.0-7-AMD64/Kernel/net/irda/iRnet/IRNet.ko
/lib/module/3.16.0-7-AMD64/Kernel/net/irda/irlan/irlan.ko
/lib/module/3.16.0-7-AMD64/Kernel/net/irda/irda.ko
/lib/module/3.16.0-7-AMD64/Kernel/net/iRDA/IRCOMM/IRCOMM.ko
/lib/module/3.16.0-7-AMD64/Kernel/net/iRDA/IRCOMM/IRCOMM-TTY.ko

$

Modulinformationen mit ModInfo anzeigen

Das Befehlsmodinfo erzählt Ihnen mehr über das angeforderte Kernel -Modul („Modulinformationen“). Als Parameter benötigt ModInfo entweder den vollständigen Modulpfad oder einfach den Modulnamen. Listing 4 zeigt dies für das IRDA -Kernel -Modul, das sich mit dem Infrarot Direct Access Protocol Stack befasst.

Listing 4: Modulinformationen anzeigen

$ /sbin /modinfo irda
Dateiname:/lib/module/3.16.0-7-AMD64/Kernel/net/irda/irda.ko
Alias: Net-PF-23
Lizenz: GPL
Beschreibung: Der Linux IRDA -Protokollstapel
Autor: Dag Brattli & Jean Tourrilhes
Kommt darauf an: CRC-CCITT
Vermagisch: 3.16.0-7-AMD64 SMP Mod_unload Modversions
$

Die Ausgabe enthält verschiedene Informationsfelder wie den vollständigen Pfad für das Kernel -Modul, seinen Alias ​​-Namen, die Softwarelizenz, die Beschreibung des Moduls, die Autoren sowie Kernel -Interna. Das Feld „hängt davon ab“ ab.

Die Informationsfelder unterscheiden sich von Modul zu Modul. Um die Ausgabe auf ein bestimmtes Informationsfeld zu beschränken, akzeptiert ModInfo den Parameter „-F“ (kurz für „-Field“), gefolgt vom Feldnamen. In Listing 5 ist die Ausgabe auf die Lizenzinformationen beschränkt, die über das Lizenzfeld verfügbar sind.

Listing 5: Zeigen Sie nur ein bestimmtes Feld an.

$ /sbin /modinfo -f lizenz irda
Gpl
$

In neueren Linux -Kerneln ist eine nützliche Sicherheitsfunktion verfügbar. Dies deckt kryptografisch signierte Kernelmodule ab. Wie auf der Linux Kernel Project -Website [4] erläutert, „ermöglicht dies eine erhöhte Kernelsicherheit, indem die Belastung unsignierter Module oder Module nicht zugewiesen wird
mit einem ungültigen Schlüssel signiert. Die Unterzeichnung des Moduls erhöht die Sicherheit, indem es schwieriger wird, ein bösartiges Modul in den Kernel zu laden. Die Signaturüberprüfung des Moduls erfolgt vom Kernel, damit es nicht erforderlich ist, „vertrauenswürdige Userspace -Bits zu haben.”Die Abbildung unten zeigt dies für die
Parport_PC -Modul.

Modulkonfiguration mit ModProbe anzeigen

Jedes Kernel -Modul verfügt über eine bestimmte Konfiguration. Der Befehl modProbe gefolgt von der Option "-c" (kurz für "-showconfig") listet die Modulkonfiguration auf. In Kombination mit Grep ist dieser Ausgang auf ein bestimmtes Symbol beschränkt. Das Listing 6 zeigt dies für IPv6 -Optionen.

Listing 6: Modulkonfiguration anzeigen

$ /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
Alias ​​Symbol: NF_DEFRAG_IPV6_ENABLE NF_DEFRAG_IPV6
Alias ​​Symbol: NF_NAT_ICMPV6_REPLY_TRANSLATION NF_NAT_IPV6
Alias ​​Symbol: nft_af_ipv6 nf_tables_ipv6
alias Symbol: nft_reject_ipv6_eval nft_reject_ipv6
$

Modulabhängigkeiten anzeigen

Der Linux -Kernel ist modular ausgelegt, und die Funktionalität wird über eine Reihe von Modulen verteilt. Dies führt zu mehreren Modulabhängigkeiten, die erneut mit ModProbe angezeigt werden können. Listing 7 verwendet die Option "-Show-Abhängigkeit", um die Abhängigkeiten für das i915-Modul aufzulisten.

Listing 7: Modulabhängigkeiten anzeigen

$ /sbin /modprobe-abhängig i915
INSMOD/lib/module/3.16.0-7-AMD64/Kernel/Treiber/I2C/I2C-CORE.ko
INSMOD/lib/module/3.16.0-7-AMD64/Kernel/Treiber/I2C/Algos/I2C-Algo-Bit.ko
INSMOD/lib/module/3.16.0-7-AMD64/Kernel/Treiber/Thermal/Thermal_Sys.ko
INSMOD/lib/module/3.16.0-7-AMD64/Kernel/Treiber/GPU/DRM/DRM.ko
INSMOD/lib/module/3.16.0-7-AMD64/Kernel/Treiber/GPU/DRM/DRM_KMS_HELPER.ko
INSMOD/lib/module/3.16.0-7-AMD64/Kernel/Treiber/ACPI/Video.ko
INSMOD/lib/module/3.16.0-7-AMD64/Kernel/Treiber/ACPI/Taste.ko
INSMOD/lib/module/3.16.0-7-AMD64/Kernel/Treiber/GPU/DRM/I915/I915.ko
$

Um die Abhängigkeiten als einen Baum anzuzeigen, der dem Befehl „Baum“ oder „LSBLK“ ähnelt, kann das Modtree -Projekt [5] helfen (siehe Abbildung unten für den i915 -Modulbaum). Obwohl es auf Github frei verfügbar ist, sind einige Anpassungen erforderlich, um die Regeln für kostenlose Software einzuhalten und Teil einer Linux -Verteilung als Paket zu werden.

Lademodule

Das Laden eines Moduls in einen laufenden Kernel kann durch zwei Befehle durchgeführt werden - INSMOD („Modul einfügen“) und ModProbe. Beachten Sie, dass es einen leichten, aber wichtigen Unterschied zwischen diesen beiden gibt: InsMod löst die Modulabhängigkeiten nicht auf, aber Modprobe ist klüger und tut das.

Listing 8 zeigt, wie das Irda -Kernelmodul einfügt. Bitte beachten Sie, dass INSMODE mit dem vollständigen Modulpfad arbeitet, während Modprobe mit dem Namen des Moduls zufrieden ist und sich im Modulbaum für den aktuellen Linux -Kernel selbst ansieht.

Listing 8: Einfügen eines Kernel -Moduls

# Insmod/lib/module/3.16.0-7-AMD64/Kernel/net/irda/irda.ko

# MODPROBE IRDA

Entladen Module

Der letzte Schritt befasst sich mit dem Entladen von Modulen aus einem laufenden Kernel. Auch hier stehen für diese Aufgabe zwei Befehle zur Verfügung - Modprobe und RMMOD („Modul entfernen“). Beide Befehle erwarten den Modulnamen als Parameter. Listing 9 zeigt dies zum Entfernen des IRDA -Moduls aus dem laufenden Linux -Kernel.

Listing 9: Entfernen eines Kernelmoduls

# rmmod irda

# Modprobe -r Irda

Abschluss

Umgang mit Linux -Kernelmodulen ist keine große Magie. Nur ein paar Befehle zum Lernen, und Sie sind der Meister der Küche.

Danke

Der Autor bedankt sich bei Axel Beckert (Eth Zürich) und Saif du Plessis (Hotad Studio Cape Town) für ihre Hilfe, während der Artikel vorbereitet wird.

Links und Referenzen

  • [1] Kernel -Modul, Arch Linux Wiki, https: // wiki.Archlinux.org/index.PHP/KERNEL_MODULE
  • [2] Kernelkonfiguration, https: // tldp.org/howto/scsi-2.4-howto/kconfig.html
  • [3] KMOD, https: // git.Kernel.org/pub/scm/utils/kernel/kmod/kmod.Git
  • [4] Kernel Modul Signing Facility, https: // www.Kernel.org/doc/html/v4.15/Admin-Guide/Modulsignierung.html
  • [5] Modtree, https: // github.com/falconindy/modtree