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/“.
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
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
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.
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
Mit dem Kommando „uname“ können Systeminformationen z.B über die Kernelversion, den Netzwerknamen des Systems ausgeben werden.
Syntax:
Optionen:
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.
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.
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 ...
Zeigt detailierte informationen über ein Kernelmodul, dabei muss sich das Modul nicht im Kernel befinden. Bei diesem Befehl sind „root“ Rechte erforderlich.
Syntax:
Optionen:
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
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:
Beispiel:
insmod /lib/modules/2.6.32-5-686/kernel/drivers/pci/pci-stub.ko
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:
Optionen:
Beispiel:
root@home:/lib/modules/2.6.32-5-686/kernel# rmmod pcspkr.ko
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:
Optionen:
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.
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.
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.
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.
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.
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:
Optionen:
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 ...
Kernelversionen: