Linux Kernel

Verwalten von Linux-Kernel-Modulen

Verwalten von Linux-Kernel-Modulen

Den Linux-Kernel verstehen

Der Linux-Kernel ist der Kern des Linux-Betriebssystems. Es enthält die Hauptkomponenten zur Adressierung der Hardware und ermöglicht sowohl die Kommunikation als auch die Interaktion zwischen Benutzer und Hardware. Der Linux-Kernel ist kein monolithisches System, sondern recht flexibel, und der Kernel wird um sogenannte Kernel-Module erweitert.

Was ist ein Kernel-Modul??

Im Allgemeinen ist ein Kernelmodul ein „Codestück, das bei Bedarf in den Kernel geladen und entladen werden kann“. Sie erweitern die Funktionalität des Kernels, ohne dass das System neu gestartet werden muss“ [1]. Dies führt zu einer sehr großen Flexibilität im Betrieb.

Außerdem „kann ein Kernel-Modul als eingebaut oder ladbar konfiguriert werden“. Um ein Modul dynamisch zu laden oder zu entfernen, muss es in der Kernel-Konfiguration als ladbares Modul konfiguriert werden“ [1]. Dies geschieht in der Kernel-Quelldatei /usr/src/linux/.Konfiguration [2]. Einbaumodule sind mit „y“ und ladbare Module mit „m“ gekennzeichnet. Beispielhaft demonstriert Listing 1 dies für das SCSI-Modul:

Listing 1: Erklärung zur Verwendung des SCSI-Moduls

CONFIG_SCSI=y # eingebautes Modul
CONFIG_SCSI=m # ladbares Modul
# CONFIG_SCSI # Variable ist nicht gesetzt

Wir empfehlen, die Konfigurationsdatei nicht direkt zu bearbeiten, sondern entweder den Befehl „make config“, „make menuconfig“ oder „make xconfig“ zu verwenden, um die Verwendung des entsprechenden Moduls im Linux-Kernel zu definieren.

Modulbefehle

Das Linux-System enthält eine Reihe verschiedener Befehle zum Umgang mit Kernelmodulen. Dazu gehört das Auflisten der aktuell in den Linux-Kernel geladenen Module, das Anzeigen von Modulinformationen sowie das Laden und Entladen von Kernelmodulen. Im Folgenden werden wir diese Befehle genauer erklären.

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

Die Liste der aktuell geladenen Module mit lsmod

Wir beginnen mit dem lsmod-Befehl. lsmod kürzt „List Modules“ ab und zeigt alle Module an, die derzeit in den Linux-Kernel geladen sind, indem der Inhalt der Datei /proc/modules schön formatiert wird. Listing 2 zeigt seine Ausgabe, die aus drei Spalten besteht: Modulname, die im Speicher verwendete Größe und andere Kernel-Module, die diese spezielle verwenden.

Listing 2: Verwenden von lsmod

$ lsmod
Modulgröße verwendet von
Strg 12927 2
ccm 17534 2
snd_hrtimer 12604 1
snd_seq 57112 1
snd_seq_device 13132 1 snd_seq

$

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

Möglicherweise sind Kernelmodule verfügbar, die Sie noch nicht kennen. Sie werden im Verzeichnis /lib/modules gespeichert. Mit Hilfe von find, kombiniert mit dem uname-Befehl, können Sie eine Liste dieser Module ausdrucken. „uname -r“ gibt nur die Version des aktuell laufenden Linux-Kernels aus. Listing 3 zeigt dies für eine ältere 3.16.0-7 Linux
Kernel und zeigt Module für IPv6 und IRDA.

Listing 3: Verfügbare Module anzeigen (Auswahl)

$ 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

$

Modulinformationen mit modinfo anzeigen

Der Befehl modinfo sagt Ihnen mehr über das angeforderte Kernelmodul („Modulinformationen“). Als Parameter benötigt modinfo entweder den vollständigen Modulpfad oder einfach den Modulnamen. Listing 4 demonstriert dies für das IrDA-Kernelmodul, das sich mit dem Infrared Direct Access Protocol Stack befasst.

Listing 4: Modulinformationen anzeigen

$ /sbin/modinfo irda
Dateiname: /lib/modules/3.16.0-7-amd64/kernel/net/irda/irda.ko
Alias: net-pf-23
Lizenz: GPL
Beschreibung: Der Linux IrDA Protocol Stack
Autor: Dag Brattli & Jean Tourrilhes
hängt davon ab: crc-ccitt
vermagisch: 3.16.0-7-amd64 SMP mod_unload Modversionen
$

Die Ausgabe enthält verschiedene Informationsfelder wie den vollständigen Pfad für das Kernelmodul, seinen Aliasnamen, Softwarelizenz, Modulbeschreibung, Autoren sowie Kernelinterna. Das Feld „abhängig“ zeigt an, von welchen anderen Kernelmodulen es abhängt depends.

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 beschränkt sich die Ausgabe auf die über das Lizenzfeld zur Verfügung gestellten Lizenzinformationen.

Listing 5: Nur ein bestimmtes Feld anzeigen.

$ /sbin/modinfo -F Lizenz irda
GPL
$

In neueren Linux-Kernels ist eine nützliche Sicherheitsfunktion verfügbar. Dies umfasst kryptographisch signierte Kernel-Module. Wie auf der Linux-Kernel-Projekt-Website [4] erläutert, „ermöglicht dies eine erhöhte Kernel-Sicherheit, indem das Laden von unsignierten Modulen oder Modulen nicht zugelassen wird“
mit einem ungültigen Schlüssel signiert. Modulsignierung erhöht die Sicherheit, indem es das Laden eines bösartigen Moduls in den Kernel erschwert. Die Modulsignaturprüfung wird vom Kernel durchgeführt, sodass keine „vertrauenswürdigen Userspace-Bits“ erforderlich sind.” Die folgende Abbildung zeigt dies für die for
parport_pc-Modul.

Modulkonfiguration mit modprobe anzeigen

Jedes Kernelmodul kommt mit einer bestimmten Konfiguration. Der Befehl modprobe gefolgt von der Option „-c“ (kurz für „-showconfig“) listet die Modulkonfiguration auf. In Kombination mit grep ist diese Ausgabe auf ein bestimmtes Symbol beschränkt. 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 aufgebaut und die Funktionalität ist auf mehrere Module verteilt. Dies führt zu mehreren Modulabhängigkeiten, die mit modprobe wieder angezeigt werden können. Listing 7 verwendet die Option „-show-depends“, um die Abhängigkeiten für das i915-Modul aufzulisten.

Listing 7: Modulabhängigkeiten anzeigen

$ /sbin/modprobe --show-depends 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
$

Um die Abhängigkeiten als Baum ähnlich dem „tree“- oder „lsblk“-Befehl darzustellen, kann das modtree-Projekt [5] helfen (siehe Abbildung unten für den i915-Modulbaum). Obwohl es auf GitHub frei verfügbar ist, bedarf es einiger Anpassungen, um die Regeln für freie Software einzuhalten und als Paket Teil einer Linux-Distribution zu werden.

Lademodule

Das Laden eines Moduls in einen laufenden Kernel kann mit zwei Befehlen erfolgen – insmod („Modul einfügen“) und modprobe. Beachten Sie, dass es einen kleinen, aber wichtigen Unterschied zwischen diesen beiden gibt: insmod löst keine Modulabhängigkeiten auf, aber modprobe ist klüger und tut das.

Listing 8 zeigt, wie das IrDA-Kernelmodul eingefügt wird. Bitte beachten Sie, dass insmode mit dem vollständigen Modulpfad arbeitet, während modprobe mit dem Namen des Moduls zufrieden ist und selbst im Modulbaum nach dem aktuellen Linux-Kernel sucht.

Listing 8: Einfügen eines Kernelmoduls

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

# modprobe irda

Entlademodule

Der letzte Schritt befasst sich mit dem Entladen von Modulen aus einem laufenden Kernel. Auch für diese Aufgabe stehen 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: Kernelmodul entfernen

# rmmod irda

# modprobe -r irda

Fazit

Der Umgang mit Linux-Kernel-Modulen ist keine große Magie. Nur ein paar Befehle zu lernen, und Sie sind der Meister der Küche.

Vielen Dank

Der Autor bedankt sich bei Axel Beckert (ETH Zürich) und Saif du Plessis (Hothead Studio Cape Town) für ihre Hilfe bei der Erstellung des Artikels.

Links und Referenzen

  • [1] Kernel-Modul, Arch Linux-Wiki, https://wiki.archlinux.Organisation/Index.php/Kernel_module
  • [2] Kernel-Konfiguration, https://tldp.org/HOWTO/SCSI-2.4-HOWTO/kconfig.html
  • [3] kmod, https://git.Kernel.org/pub/scm/utils/kernel/kmod/kmod.git
  • [4] Kernelmodul-Signierfunktion, https://www.Kernel.org/doc/html/v4.15/Admin-Guide/Modul-Signieren.html
  • [5] Modtree, https://github.com/falconindy/modtree
So steigern Sie die FPS unter Linux?
FPS steht für Bilder pro Sekunde. Die Aufgabe von FPS besteht darin, die Bildrate bei Videowiedergaben oder Spielleistungen zu messen. In einfachen Wo...
Top Oculus App Lab-Spiele
Wenn Sie Besitzer eines Oculus-Headsets sind, müssen Sie über Sideloading informiert sein. Sideloading ist der Prozess der Installation von Inhalten, ...
Top 10 Spiele zum Spielen auf Ubuntu
Die Windows-Plattform war eine der dominierenden Plattformen für Spiele aufgrund des großen Prozentsatzes von Spielen, die heute entwickelt werden, um...