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/“.


Kernelquellcodes kann man sich auf der Seite kernel.org herunterladen.






/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



Die Module des Kernels befinden sich im Verzeichnis „/lib/modules“. Hier wird für jeden Installierten Kernel ein Verzeichnis „/lib/modules/<kernelversionsnummer>“ angelegt.




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






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.






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.

FIXME

....
#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.




Hierbei ist zu beachten, dass das Modul, je nach Distribution erst am Ende des Init-V-Prozesses geladen wird.




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.




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.


Die „modules.dep“ Datei muss nicht von Hand bearbeitet werden, da man über das Kommando „depmod“ die Abhängigkeiten aller Module ermitteln kann.





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.






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 Red Hat Systemen enthält die Konfigurationsdatei „modprobe.conf“ nur wenig rechnerspezifische Einstellungen, die Liste mit Standardeinstellungen befindet sich in „/etc/modprobe.d/modprobe.conf.dist“.




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
...






Kernelversionen:

Anzeigen

Ausblenden

Version Datum Größe in kB Features
0.01 17.09.1991 230 erste Entwicklerversion von Linus Torvalds auf Floppy-Disk und 386 Prozessor. Mit bash
0.02 05.10.1991 - erste Offizielle Version.
0.12 1992 - Newsgroup alt.os.linux gegründet.
1.0 13.03.1994 1259 Netzwerkfähig. GUI Xfee86 Project Grafische Oberfläche X-Window System. Torvalds veröffentlicht Kernel unter GPL (General Public Licence).
1.1.0 06.04.1994 1256 Entwicklerversion.
1.1.95 02.03.1995 2301 Entwicklerversion.
1.2.0 07.03.1995 2301 Portierung auf Alpha, MIPS und SPARC Prozessorarchitekturen.
1.3.0 12.06.1995 2558 Entwicklerversion. Erste Unterstützung für Mehrprozessorsysteme.
2.0.0 09.06.1996 5844 Unterstützung für symetrische Mehrprozessorsysteme.
2.20 26.01.1999 13080 Unterstützung für IPv6 Netzwerkprotokoll. Portierung auf Platformen UltraSparc u. PA-RISK.
2.3.0 11.05.1999 13804 Entwicklerversion.
2.4.0 04.01.2001 24379 Unterstützung von Energieverwaltung ACPI und USB. Netfilter Firewall. Plug and Play, Dateisysteme ReiserFS u. DevFS, 32 Bit User u. Group IDs. Unterstützung für 64 GB Hauptspeicher für Intel. Unterstützung für IBM S/390 und Intel IA64.
2.5.0 23.11.2001 29405 Entwicklerversion.
2.6.0 18.12.2003 41614 Neues Versionsschema. Hyper Threading. 64 Bit Power PC. 64 Bit AMD. Alsa Sound System. SATA Support. Bluetooth Support.
2.6.20 04.02.2007 54548 Unterstützt KVM.
2.6.30 10.06.2009 75768 Unterstützt USB 3.0
2.6.34 16.05.2010 86520 Grafiktreiber für neuere AMD Radeon-GPUs. Neue Dateisysteme LogFS u. Ceph. Änderungen an Btrfs, ext4, NILFS2, SquashFS und XFS. Umbau von Nouveau-Treiber.
2.6.35 01.08.2010 88301 Defragmentierbarer Arbeitsspeicher. Turbo-Core Funktion von AMD Prozessoren. H264 Decodierfunktionen.
2.6.36 20.10.2010 88707 Sicherheitsframework AppAmor. LIRC. Verbesserte Energieverwaltung.
2.6.39 19.05.2011 95994 Optimierungswerkzeug IPset.
3.0 22.07.2011 96676 Neues Kernel-Versionsschema. Neue Treiber für Netzwerkgeräte. DVB-T2.
3.2 04.01.2012 - Qualcom-Hexagon Prozessor Architektur.
3.3 18.03.2012 - Unterstützung für Android.
3.4 20.05.2012 - Unterstützung der Stromspartechnik RC6.
3.5 21.06.2012 - Econect wurde entfernt u. alter Standard Token-Ring unterstützung.





Cloud