Kernel und Module
Der Kernel ist der Hauptbestandteil jedes Linux Systems. Er dient als Schnittstelle zwischen Hard und Software, ist zuständig für den Zugriff auf Festplatten, Netzwerkkarten sowie Speicherverwaltung, Prozessverwaltung u.v.m.
Der Kernel ist größenteils Modular aufgebaut, enthält jedoch auch einen statischen Teil. Beim Systemstart wird der Basiskernel geladen, der alle Grundlegenden Funktionen bereitstellt. Einzelne Module können auch wärend der Laufzeit des Systems geladen und entladen werden.
Durch den Modularen Aufbau des Kernels lassen sich Module laden und entladen, ohne das System jedesmal neu starten zu müssen. Dies hat den Vorteil, dass bei geänderter Hardware das entsprechende Modul (nach)geladen werden kann, und nicht der ganze Kernel neu kompiliert werden muss. Die Moduldateien sind durch den Compiler erstellte ausführbare Dateien mit den Erweiterungen [*.o] für Objekt und [*.ko] für Kernelobjekt. Wurde der Quellcode des Kernels heruntergeladen befindet er sich im Verzeichnis „/usr/src/“.
Kernelverzeichnisse
/usr/src
Im Verzeichnis „/usr/src“ befinden sich die Kernelquellen. Hier wird ein Verzeichnis mit der Versionsnummer des Kernels angelegt und ein Softlink erstellt, dass die Kernelquellen unter „/usr/src/linux“ zu erreichen sind. Es gibt distributionsabhängige Abweichungen, auch bei der Verwendung mehrerer Kernel.
root@home:/usr/src# ls linux linux-headers-2.6.32-5-686 linux-headers-2.6.32-5-common linux-kbuild-2.6.32 linux-source-2.6.32.tar.bz2 modules virtualbox-ose-3.2.10 virtualbox-ose-modules-2.6.32-5-686_3.2.10-dfsg-1+2.6.32-41_i386.deb
/boot
Der Statische Teil des Kernels befindet sich im „/boot“ Verzeichnis. Je nach Distribution zeigt ein Softlink auf den tatsächlichen Namen des Kernels.
root@home:/boot# ls -A1 insgesamt 12264 config-2.6.32-5-686 grub initrd.img-2.6.32-5-686 lost+found System.map-2.6.32-5-686 vmlinuz-2.6.32-5-686
/lib/modules
Die Datei „modules.dep“ enthält die Abhängigkeiten der Module zu anderen Modulen.
root@home:/lib/modules/2.6.32-5-686# ls insgesamt 2580 lrwxrwxrwx 1 root root 35 4. Okt 08:47 build -> /usr/src/linux-headers-2.6.32-5-686 lrwxrwxrwx 1 root root 35 30. Mär 2012 build.save -> /usr/src/linux-headers-2.6.32-5-686 drwxr-xr-x 10 root root 4096 4. Jan 2012 kernel -rw-r--r-- 1 root root 606047 4. Okt 08:47 modules.alias -rw-r--r-- 1 root root 586182 4. Okt 08:47 modules.alias.bin -rw-r--r-- 1 root root 300088 4. Okt 08:47 modules.dep -rw-r--r-- 1 root root 421876 4. Okt 08:47 modules.dep.bin -rw-r--r-- 1 root root 52 4. Okt 08:47 modules.devname -rw-r--r-- 1 root root 99289 23. Sep 15:40 modules.order -rw-r--r-- 1 root root 131 4. Okt 08:47 modules.softdep -rw-r--r-- 1 root root 248240 4. Okt 08:47 modules.symbols -rw-r--r-- 1 root root 319582 4. Okt 08:47 modules.symbols.bin lrwxrwxrwx 1 root root 38 4. Jan 2012 source -> /usr/src/linux-headers-2.6.32-5-common drwxr-xr-x 3 root root 4096 4. Jan 2012 updates
root@home:/lib/modules/2.6.32-5-686/kernel# ls -A1 insgesamt 32 arch crypto drivers fs lib mm net sound
In diesem Verzeichnis befinden sich Unterverzeichnisse der Module für Verschiedene Kategorien.
root@home:/lib/modules/2.6.32-5-686/kernel/drivers/usb/storage# ls -A1 insgesamt 220 .... usb-storage.ko ....
Hier ein Treibermodul für die USB-Schnittstelle.
/proc/sys/kernel
Der Kernel legt seine Konfigurationsinformationen zur Laufzeit im Verzeichnis „/proc/sys/kernel“ ab.
root@home:/proc/sys/kernel# ls -A1 insgesamt 0 ... acct acpi_video_flags auto_msgmni blk_iopoll bootloader_type bootloader_version ... domainname ftrace_dump_on_oops hostname sysrq tainted threads-max timer_migration unknown_nmi_panic version
root@home:/proc/sys/kernel# cat version #1 SMP Sun Sep 23 09:49:36 UTC 2012
Kernelversion
Die Kernelversionsnummer und Patchlevel lässt sich mit dem Kommando „uname“ ermitteln. Die Kernelversionsnummer findet man auch im Verzeichnis „/lib/modules“.
hans@home:~$ l /lib/modules insgesamt 4 2.6.32-5-686
uname
Mit dem Kommando „uname“ können Systeminformationen z.B über die Kernelversion, den Netzwerknamen des Systems ausgeben werden.
Syntax:
- uname [optionen]
Optionen:
- -r ⇒ Kernelversionsnummer anzeigen.
- -a ⇒ alle Informationen ausgebem.
- -s ⇒ Kernelnamen anzeigen.
- -n ⇒ Hostname anzeigen.
- -v ⇒ Kernelversion mit Instalationszeit ausgeben.
- -m ⇒ Maschinen-Hardware Namen ausgeben.
- -p ⇒ Typ des Prozessors oder unbekannt anzeigen.
- -i ⇒ Hardwareplattform oder unbekannt ausgeben.
- -o ⇒ Namen des Betriebssystems ausgeben.
- –help ⇒ Kurze Hilfe ausgeben und beenden.
- –version ⇒ Versionsinformation anzeigen und beenden.
user@home:~$ uname
Linux
„uname“ ohne Optionen gibt den Kernelnamen aus. (gleich mit uname -s).
user@home:~# uname -a Linux home 2.6.26-2-686 #1 SMP Thu Sep 16 19:35:51 UTC 2010 i686 GNU/Linux
Zeigt alle Kernel Informationen.
hans@home:~$ uname -r 2.6.32-5-686
Zeigt die aktuelle Kernelversionsnummer.
Bedeutung der Kernelversionsnummer am Beispiel 2.6.32-5-686.
- 2. → Major Release. Wird nur dann erhöht, wenn große umfassende Neuerungen am Kernel vorgenommen wurden.
- 6. → Minor Release. Eine gerade Zahl kennzeichnet einen Stabilen Kernel(stable), eine ungerade Zahl einen Entwicklerkernel (unstable/testing).
- 32. → Patch Level. Bei Erhöhung wurden kleinere Änderungen und Bugfixes vorgenommen.
- ab 5 → Beliebig, je nach Distibution.
Kernelmodule
Einige Kernelmodule werden sofort beim Systemstart benötigt z.B. die Module für das Dateisystem, sobald Module nicht zum Bestandteil des Kernels gehören, müssen sie in der „init-RAM-Disk“ Datei durch Grub oder Lilo übergeben werden. Kernelmodule (Hardwaretreiber) können wärend der Laufzeit des Systems mit den unten gezeigten Kommandos geladen, entladen oder angezeigt werden. Alle Module befinden sich im Verzeichnis „/lib/modules/<kernelversion>“. Verschiedene Module wie z.B. USB oder PCMCIA werden von Scripte des Init-V Prozesses direkt durch „modprobe“ Anweisungen geladen, welche durch das Kommando „grep modprobe /etc/init.d/*“ einen Überblick über die Module, die auf diese Weise geladen werden geben.
lsmod
Zeigt den Status von geladenen Modulen im Linux Kernel aus der Datei „/proc/modules“ auf und gibt eine übersichtliche Liste aus.
root@home:~# lsmod Module Size Used by xt_state 927 3 ipt_LOG 3570 74 xt_tcpudp 1743 144 iptable_nat 3551 0 nf_nat 10568 1 iptable_nat nf_conntrack_ipv4 7597 6 iptable_nat,nf_nat nf_conntrack 38075 4 xt_state,iptable_nat,nf_nat,nf_conntrack_ipv4 nf_defrag_ipv4 779 1 nf_conntrack_ipv4 iptable_filter 1790 1 ip_tables 7706 2 iptable_nat,iptable_filter x_tables 8327 5 xt_state,ipt_LOG,xt_tcpudp,iptable_nat,ip_tables powernow_k8 9832 0 cpufreq_conservative 4018 0 cpufreq_userspace 1480 0 ...
modinfo
Zeigt detailierte informationen über ein Kernelmodul, dabei muss sich das Modul nicht im Kernel befinden. Bei diesem Befehl sind „root“ Rechte erforderlich.
Syntax:
- modinfo [optionen] [-F Feld] [-k kernel] [pfad/zum/modulname]
Optionen:
- -0 ⇒ (null) gibt Modulinformationen in einer Zeile aus.
- -F [Feld] ⇒ gibt nur ein bestimmtes Feld aus, dies kann für die nutzung mit Shell Scripten nützlich sein. Häufige Feldnamen sind: filename, alias, licence, version, description, author usw.
- -k [kernel] ⇒ gibt Inforationen über Module eines anderen Kernels als dem laufenden aus.
- -a ⇒ gibt nur Infos über den Autor und mailadresse aus.
- -d ⇒ gibt die Programmbeschreibung aus.
- -l ⇒ gibt die Lizenz aus.
- -p ⇒ zeigt zu übergebende Parameter, wenn möglich.
- -n ⇒ gibt den Dateinamen mit Pfad aus.
Beispiele:
root@home: # modinfo bluetooth filename: /lib/modules/2.6.32-5-686/kernel/net/bluetooth/bluetooth.ko alias: net-pf-31 license: GPL version: 2.15 description: Bluetooth Core ver 2.15 author: Marcel Holtmann <marcel@holtmann.org> srcversion: 9FD5BF98FC88505DC637909 depends: rfkill vermagic: 2.6.32-5-686 SMP mod_unload modversions 686
root@home: # modinfo -F filename bluetooth /lib/modules/2.6.32-5-686/kernel/net/bluetooth/bluetooth.ko
root@home: # modinfo -l bluetooth GPL
insmod
Mit „insmod“ lassen sich Module in laufenden Kernel integrieren, hierbei ist eine komlette Pfadangabe des Moduls nötig. Bei „insmod“ werden zwar Abhängigkeiten geprüft, jedoch nicht automatisch aufgelöst. Bei weiteren Abhängigkeiten wird eine Fehlermeldung ausgegeben, ist das Modul erfolgreich in den Arbeitsspeicher geladen und vom Kernel verwendet, wird keine Meldung ausgegeben.
Syntax:
- insmod [pfad/dateiname] [modul-optionen]
Beispiel:
insmod /lib/modules/2.6.32-5-686/kernel/drivers/pci/pci-stub.ko
rmmod
Mit „rmmod“ können Module aus dem Arbeitsspeicher entladen werden. Da „rmmod“ die Datei „/proc/modules“ einliest, ist hier keine Pfadangabe nötig. Das Kommando gibt keine Erfolgsmeldungen aus, sollte das zu entladene Modul jedoch von einem anderen Modul oder Programm in Abhängigkeit stehen wird eine Fehlermeldung ausgegeben.
Syntax:
- rmmod [optionen] [modulname]
Optionen:
- -v ⇒ verbose (geschwätzig).
- -a ⇒ entfernt alle zur Zeit nicht benötigten Module aus dem Arbeitsspeicher.
- -f ⇒ Modul entladen erzwingen. Vorsicht!.
- -w ⇒ isoliert ein laufendes Modul solange, bis es nicht mehr benötigt wird und entlädt es dann.
- -s ⇒ Fehler werden an syslog gesendet.
- -V ⇒ Programmversion anzeigen.
Beispiel:
root@home:/lib/modules/2.6.32-5-686/kernel# rmmod pcspkr.ko
modprobe
Mit „modprobe“ können Module zur Laufzeit in den Kernel angezeigt, geladen und entfernt werden, dabei erkennt „modprobe“ alle Abhängigkeiten und löst diese auf, fehlende Module werden automatisch geladen. Pfadangaben sind nicht nötig da „modprobe“ den Befehl „uname -r“ benutzt um das Verzeichnis der Module des laufenden Kernels zu finden.
Mit „modprobe“ ist es auch möglich, alle Module eines Typs aufeinmal zu laden. Beim entfernen von mehreren Modulen können diese durch leerzeichen getrennt angegeben werden.
Syntax:
- modprobe [optionen] [modulname] [modulparameter]
Optionen:
- -a ⇒ fügt dem Kernel alle benötigten Module hinzu (einschließlich aller Abhängigkeiten).
- -r ⇒ entlädt modul.
- -b ⇒ liest die blacklist.conf ein und lädt auch module aus der Blacklist.
- -d [pfad/zu/modul] ⇒ Verzeichnis zum Modul.
- -t ⇒ Type des Moduls.
- -f ⇒ erzwingt das Entladen eines Moduls.
- -v ⇒ verbose Mode (geschwätzig).
- -l ⇒ listet alle ladbaren Module im Platzhalter auf (kann mit wildcards verwendet werden), z.B. usb*.
- -n ⇒ simuliert das modprobe kommando, mit -v kombiniert zeigt es gleich mögliche Probleme an.
- -q ⇒ modprobe gibt keine Fehlermeldungen aus.
- -s ⇒ schreibt Fehlermeldungen ins syslog.
- -lt fs ⇒ Dateisystemmodule ausgeben.
- -C ⇒ überschreibt das Standardkonfigurationsverzeichnis /etc/modprobe.d oder /etc/modprobe.conf.
- -V ⇒ Programmversion ausgeben.
Beispiele:
modprobe -at net
Lädt alle vorhandenen Module für Netzwerkkarten. Auch hier wird nur im Fehlerfall eine Meldung ausgegeben.
modprobe -r pcspkr
Entlädt das Modul pcskkr.
root@home:/etc/modprobe.d# modprobe -l sound* kernel/sound/soundcore.ko
Zeigt alle Soundmodule an, die in den laufenden Kernel integriert werden können. Ohne Argumente werden alle Module gelistet, die in den Kernel integriert werden können.
root@home:# modprobe -lt fs kernel/fs/nfs_common/nfs_acl.ko kernel/fs/quota/quota_v1.ko kernel/fs/quota/quota_v2.ko kernel/fs/quota/quota_tree.ko kernel/fs/binfmt_aout.ko kernel/fs/binfmt_misc.ko kernel/fs/mbcache.ko kernel/fs/configfs/configfs.ko kernel/fs/dlm/dlm.ko kernel/fs/fscache/fscache.ko kernel/fs/reiserfs/reiserfs.ko kernel/fs/ext3/ext3.ko kernel/fs/ext2/ext2.ko ....
Zeigt alle Dateisystemmodule.
blacklist.conf
Will man ein Modul daran hindern automatisch geladen zu werden, kann man das Modul in der Datei „/etc/modprobe.d/blacklist.conf“ (Debian ) eintragen.
.... #blacklist nouveau blacklist nouveau options nouveau modset=0 # blacklist PCSpeaker blacklist pcspkr ....
Auszug aus der Datei „blacklist.conf“. Hier werden die freien nvidia Grafik Treiber und Pcspeaker Module beim Systemstart am laden gehindert.
Module über Init laden
Will man über das „Init-V-Script“ manuell Kernelmodule beim Systemstart laden, gibt es Distributionsabhängig verschiedene Methoden.
Bei Debian Systeme sorgt das „Init-V-Script“ „/etc/init.d/module-init-tools“ dafür, dass alle in der Datei „/etc/modules“ zeilenweise gelisteten Module geladen werden. Dabei kann hier das gewünschte Modul eingetragen werden.
# /etc/modules: kernel modules to load at boot time. # # This file contains the names of kernel modules that should be loaded # at boot time, one per line. Lines beginning with "#" are ignored. # Parameters can be specified after the module name. loop ndiswrapper
Bei Red Hat oder SuSE Systeme gibt man „modprobe <modulname>“ in das dafür vorgesehene Init-V-Script ein.
- „/etc/rc.d/rc.local“ ⇒ Red Hat.
- „/etc/init.d/boot.local“ ⇒ SuSE.
Ubuntu stellt auch nicht GPL konforme Modulpakete wie z.B. für Nvidia, Ati, Broadcom u.v.m. mit dem Paket „linux-restricted-modules“ mit dem Binärcode der Hersteller zur Verfügung. Diese Module werden in „/lib/linux-restricted-modules“ installiert. Hierbei ruft das Init-V-Script „linux-restricted-modules-common“ beim Systemstart das Script „lrm-manager“ auf, das in „/lib/modules/<kernelversion>/generic“ ein temporäres Dateisystem einbindet, in das die nicht GPL konformen Module kopiert werden und danach „depmod“ für das Verzeichnis ausführt.
Wenn man einzelne Module aus dem Paket nicht nutzen will, gibt man die Modulnamen in der Variable „DISABLED_MODULES“ der Datei „/etc/default/linux-restricted-modules-common“ ein.
Modulabhängigkeiten
Die meisten Module sind von anderen Modulen abhängig. Diese Abhängigkeiten sind in der Datei „/lib/modules/<kernelversion>/modules.dep“ gelistet.
Ist diese Datei z.B. nach einbinden neuer Module unvollständig, kann man diese mit dem Kommando „depmod“ aktualisieren. Dabei werden von den Modulen definierten Parameter ausgewertet. Es werden auch einige [*.map] Dateien erstellt die den Zusammenhang zwischen der Hardware und den Modulen herstellt.
modules.dep
Die Datei „/lib/modules/2.6.32-5-686/modules.dep“ ist eine Modulkonfigurationsdatei und zeigt die Abhängigkeiten der Module auf.
Auszug aus der Datei modules.dep:
... updates/dkms/nvidia.ko: kernel/drivers/i2c/i2c-core.ko ...
Das Modul nvidia.ko hängt ab vom Modul i2c-core.ko.
depmod
Ist ein Programm zum generieren der „modules.dep“ Datei. Ohne Optionen gestartet, generiert „depmod“ eine neue „modules.dep“ Datei, in dem Infos über Abhängigkeiten aller Module ermittelt werden.
Syntax:
- depmod [optionen]
Optionen:
- -a ⇒ Standardoption. Alle Module werden verarbeitet.
- -A ⇒ Schnelldurchlauf.
- -b [verzeichnis] ⇒ weicht das Modulverzeichnis von „/lib/modules/Kernelversion“ ab, kann her ein Verzeichnis angegeben werden.
- -C [verzeichnis|datei] ⇒ Überschreibt die Standardkonfigurationsdatei „/etc/depmod.conf“ oder das „/etc/depmod.d/“ Verzeichnis.
- -n ⇒ Trockenlauf und Ausgabe nach stdout.
- -h ⇒ Hilfe anzeigen.
- -v ⇒ Verbose Mode.
- -V ⇒ Programmversion.
Modulkonfigurationsdateien
Dass bei der Aktivierung das richtige Modul geladen wird, berücksichtigt der Kernel die Einstellungen in den Modul Konfigurationsdateien, „modules.dep“ und „modules*.map“ Dateien.
Weitere Konfigurationsdateien für Kernelmodule befinden sich bis Kernel 2.4.x in „/etc/modules.conf“, bei neueren Kerneln kommt „/etc/modprobe.conf“ zum Einsatz. Die Datei „modprobe.conf.local“ wird dabei von Konfigurationsfontends nicht modifiziert, deshalb eignet sie sich lediglich zur manuellen Konfiguration.
In diesen Dateien können z.B. für ein Hardwaregerät spezielle IRQ oder DMA Kanäle zugewiesen werden, zudem können auch Aliase zu den Gerätenamen vergeben werden um den Gerätemodulen gewissse Parameter zuzuweisen.
Beispiel:
options 3c420 io=0x300 irq=10 alias eth0 3c420
Bei Debian gibt es keine „modprobe.conf“, hier liegen sämtliche Konfigurationsdateien verteilt im Verzeichnis „/etc/modprobe.d/*“.
root@home:/etc/modprobe.d# ls -A1 ... aliases.conf alsa-base-blacklist.conf alsa-base.conf nvidia-kernel-common.conf ...
Kernel History
Kernelversionen:
Cloud