

	\documentclass[a4paper,11pt]{article}
	\usepackage{ngerman}
	\usepackage[latin1]{inputenc}
	\setlength\parskip{\medskipamount}
	\setlength\parindent{0pt}
	\begin{document}

	
 % Der_Linux-Kernel
 % Copyright Erwin Dogs
 % Lizenz: GFDL
 % 
 % $Name: $
 % $Revision: 1.3.2.11 $
 % $Source: /cvsroot/selflinux/tutorial/userbasics/konzepte_basic/kernel/kernel,v $
 % SelfLinux-0.7.2
 %
 % Diese Datei ist Teil von SelfLinux http://www.selflinux.de
 %
 %%% $Id: kernel,v 1.3.2.11 2003/02/08 15:31:54 std Exp $

	\title{Der Linux-Kernel}


	
	    \author{Erwin Dogs}
	    %\url{mailto:edogs@t-online.de}
    

	\maketitle

	
	
	%\ref{../index.tex}
	
		%\ref{ueberblick.tex}
		Überblick über Linux
	\ref{Der_Linux-Kernel}

    \par{Layout}
    Matthias Hagedorn
	    %\url{mailto:herbert-kw@t-online.de}
    
    	\par{Lizenz}
	GFDL
 
	\tableofcontents{}

        
	\section{Der Kernel} \label{d12e51}
        

   

   
  \par
  
Der Betriebssystemkern (Kernel) erledigt in einem Betriebssystem die
grundlegendsten Aufgaben. Dazu gehören: Verwaltung von Prozessen,
Verwaltung des Dateisystems, Steuerung von Hardwareressourcen,
Speicherverwaltung. Der Kernel ist somit das Herz des Betriebssystems.
Unter Linux beinhaltet der Kernel auch Gerätetreiber, die das System
braucht (als Runtime-Module oder fest eingebaut). Nichts funktioniert ohne
einen Kernel, und genau das ist es, was Linux zu Linux macht, denn wenn
wir von Linux sprechen, meinen wir eigentlich den Kernel in der aktuellen
stabilen {\bf Version 2.4.x}.
   

   
  \par
  
Aber ein Kernel allein macht noch kein Betriebssystem aus, sondern muß
auch irgendwie vom Benutzer angesprochen werden können, damit es überhaupt
Arbeit gibt, die er verrichten kann.
   

   
  \par
  
Der Kernel liegt als Datei ({\bf bzImage}) auf einem Datenträger
vor, und muss für den Start in den Hauptspeicher eingelesen werden.
   

   
  \par
  
Dazu gibt es verschiedene Methoden, welche sich dadurch unterscheiden, wo
die Kerneldatei liegt. Wir kennen 3 verschiedene Orte, an denen ein
bootfähiger Kernel residieren kann:
   

   \newcounter{d6e76} 
                  \begin{list}{\arabic{d6e76}}
                  {\usecounter{d6e76}}
        
    
	\item 
Internet  \linebreak  \linebreak 
    
    
	\item 
Intranet  \linebreak  \linebreak 
    
    
	\item 
Localhost - Diskette, Festplatte, CD-ROM, EPROM, EEPROM o.ä.
    
   \end{list}

   
  \par
  
Betrachtet wird hier die Variante Diskette, welche fast zwingend neben der
Betriebsboot-Möglichkeit am {\bf localhost} vorhanden sein sollte.
   

   
  \par
  
Praxisübung:
   

   
Suchen Sie die Kerneldatei, mit der Ihre Distribution den Rechner zum
Booten gebracht hat. Kopieren Die diese Datei im {\bf raw-Modus}
auf eine roh (ohne Erstellung eines Filesystems) formatierte 3,5''-Diskette:
   

   
     \begin{tt} \begin{scriptsize} root@linux / \# 
dd if=KERNELFILE of=/dev/fd0u1440
     \end{scriptsize} \end{tt} \linebreak 
   

   
  \par
  
Zur Erprobung booten Sie Ihren Rechner mit dieser Diskette. Dazu ist
die Bootreihenfolge im BIOS möglicherweise wie folgt umzustellen:
   

   
{\bf A: CDROM: C:}
   

   
  \par
  
Dieser Bootvorgang wird zu mit grosser Wahrscheinlichkeit fehlschlagen,
und das ist gut so. Der Kernel der Distribution hat die Root-Partition
in sich gespeichert; diese stimmt in den seltensten Fällen mit der
tatsächlichen Root-Partition überein. Abhilfe schafft eine Behandlung der
Diskette mit dem Befehl {\bf rdev}.
   

   
  \par
  
Falls das Booten nicht fehlgeschlagen ist, weil die Root-Partition stimmt,
ist es lohnenswert, einmal mit {\bf rdev} eine falsche
Root-Partition in den Kernel zu schreiben, um einen fehlerhaften Bootvorgang
(Kernel bleibt stehen) beobachten (und später erkennen) zu können.
   

   
  \par
  
Ein auf dem eigenen Rechner selbst compilierter Kernel hat die richtige
Root-Partition in sich gespeichert.
   
  \section{Init} \label{d12e140}
        

   

   
  \par
  
Als {\bf Kommunikationsschnittstelle} zwischen dem Kernel
und dem Benutzer fungiert der {\bf init}-Prozess.
   

   
  \par
  
{\bf init} gibt Aufgaben an den Kernel weiter und empfängt
Anweisungen vom Kernel (etwa ''init starte bitte Programm xy als Prozess yz'').
Das ist die Aufgabe von {\bf init}. Außerdem überwacht 
{\bf init}, dass einige bestimmte Programme, die das System 
zum Arbeiten benötigt, immer laufen und startet diese neu, wenn diese Prozesse 
einmal beendet werden.
   

   
  \par
  
Beim Systemstart und -herunterfahren startet bzw. stoppt 
{\bf init} die benötigten Programme.
   

   
  \par
  
Die Informationen, die der {\bf init}-Prozess braucht, 
um zu wissen, welche Programme gestartet werden müssen, findet er in der 
Regel im Verzeichnis {\bf /etc/init.d}.In diesem Verzeichnis 
liegen die Startskripte für die meisten Dienste. Diese Skripte enthalten 
Anweisungen, wie welche Programme gestartet und auch gestoppt werden. Nun 
wird in sogennannten {\bf Runlevels} festgelegt, welche Sammlung 
von Diensten in einem bestimmten Systemmodus gestartet wird. Dazu liegen 
in den entsprechenden Runlevelverzeichnissen (i.d.R {\bf /etc/rc(s,0-6).d}) 
Links auf die Skripte in {\bf /etc/init.d}. Diese Links
können zum Starten als Sxx-Skript (S=''start'') oder zum Stoppen als
{\bf KxxSkript} (K=''kill'') aufgerufen werden. XX steht für 
eine Zahl, z.B. {\bf S02checkfs}. Mit dieser kann die Priorität 
und damit Reihenfolge des Aufrufs festgelegt werden.
   

   
  \par
  
Die Information, in welches Runlevel das System standardmäßig startet, in
welchem Verzeichnis die Links liegen und auch noch einige andere, finden
sich in der Konfigurationsdatei {\bf /etc/inittab}.
   

   
  \par
  
Aber nicht nur beim Systemstart, sondern auch im laufenden Betrieb
verrichtet {\bf init} ständig seine Arbeit. Dazu muß es eine 
Umgebung geben, in der der Benutzer Befehle an das System geben kann. Dies 
ist unter Linux die Shell.
   
  \section{Shell} \label{d12e211}
        

   

   
  \par
  
Die {\bf Shell} ist die Schnittstelle zwischen Benutzer und System. 
In ihr gibt der Benutzer Befehle an das System, und die {\bf Shell}
führt diesen Befehl aus, indem sie init veranlasst, das ausführbare Programm,
das hinter diesem Befehl steht, zu starten. Die Standardshell unter
Linux ist die {\bf bash} (Bourne Again Shell), die modernste und
mächtigste aller Shells. Prinzipiell jedoch kann jede Unix-Shell
(z.B. Bourne-Shell, C-Shell, Korn-Shell...) unter Linux verwendet
werden.
   

    
kernel2.png
     

   
  \par
  
Der Weg eines Befehls, den ein User eingibt, wird schematisch im
Schaubild oben dargestellt:
   

   
{\bf User-\verb+>+Shell-\verb+>+init-\verb+>+Kernel-\verb+>+Hardware-\verb+>+Kernel-\verb+>+init-\verb+>+Shell-\verb+>+User}
   

  \section{Erzeugen eines eigenen Kernels} \label{d12e252}
        

   

   \subsection{Voraussetzungen} \label{d12e259}
        

    


    
  \par
  
Voraussetzungen: Um einen eigenen Kernel zu übersetzen, brauchen
Sie einen C-Compiler, der die Quelltexte ins Binärformat übersetzt.
Ob der C-Compiler installiert ist, erfahren Sie mit dem folgenden
Befehl:
    

    
      \begin{tt} \begin{scriptsize} root@linux / \# 
gcc --version
      \end{scriptsize} \end{tt} \linebreak 
    

    
  \par
  
oder
    

    
      \begin{tt} \begin{scriptsize} root@linux / \# 
cc --version
      \end{scriptsize} \end{tt} \linebreak 
    


    
  \par
  
Nach Eingabe dieses Befehls sollte die Versionsnummer auf dem Schirm
erscheinen.
    
   

   \subsection{Holen der Kernel-Quellen} \label{d12e288}
        

    

    
  \par
  
Nun brauchen Sie noch die aktuellen Kernel-Quellen. Die Quellen des
unveränderten Original-Kernels finden Sie auf
    

    
  \par
  
http://www.kernel.org
    

    
  \par
  
Schauen Sie auch auf der Downloadseite ihres Distributors, der oft
eigene (angepaßte) Versionen des Kernels im {\bf RPM}- 
oder {\bf DEB}-Format bereitstellt.
    


    
  \par
  
Die Quelltexte des Kernels sollten Sie nach {\bf /usr/src/linux
} entpacken (bei der Installation eines Paketes wird das oft 
bereits erledigt).
    

    
  \par
  
Wechseln Sie in das {\bf /usr/src} Verzeichnis mit
 {\bf cd /usr/src}, um zu schauen, ob dieses Verzeichnis 
existiert. Wenn ja, kanns auch schon losgehen.
    

    
  \par
  
Wenn Sie die aktuelle Version des Originalkernels von
http://www.kernel.org
heruntergeladen haben, kopieren Sie die Datei 
{\bf linux-2.x.xx.tar.bz2} in das Verzeichnis 
{\bf /usr/src} und entpacken Sie das Archiv mit dem 
folgenden Befehl:
    

    
      \begin{tt} \begin{scriptsize} root@linux /usr/src/ \# 
tar xvfj linux-2.x.xx.tar.bz2
      \end{scriptsize} \end{tt} \linebreak 
    

    
  \par
  
Nach dem Entpacken ist das Verzeichnis {\bf /usr/src/linux}
entstanden.
    
   

   \subsection{Hinweis zur Versionsnummer des Kernels} \label{d12e353}
        

    


    
  \par
  
Es werden im Grunde zwei Arten von Kernels unterschieden. Das sind
zum einen die {\bf stabilen Kernel}, zum anderen die 
{\bf Entwicklerkernel}, an denen aktuell gearbeitet wird, 
und die nicht stabil genug für die Benutzung sind.  Diese unterscheiden 
sich anhand der Versionsnummer. Eine gerade Zahl an der zweiten Stelle der 
Versionsnummer kennzeichnet den stabilen Kernelzweig, eine ungerade den 
aktuellen Entwickler-Kernel. Also sind etwa 2.0, 2.2 und 2.4 {\bf stabile 
Kernel}. Die Versionen 2.1, 2.3 und 2.5 dagegen sind 
{\bf Entwicklerkernel}.
    

    
  \par
  
Version 2.5 wird irgendwann mit den Änderungen und Erweiterung eingefroren,
das heißt, es werden keine neuen Features hinzugefügt und getestet. Wenn
die Testphase abgeschlossen ist, wird der Kernel als stabil gekennzeichnet
und erhält die Versionsnummer 2.6 (oder möglicherweise auch 3.0).
    

    
  \par
  
Die Zahl, die darauf folgt, ist der Patchlevel des Kernels. Mit jedem
Patchlevel sind Korrekturen in den stabilen Kernel eingeflossen und geben
somit Auskunft über die Aktualität des Kernels. 
    
   

   \subsection{Konfiguration des Kernels} \label{d12e382}
        

    

    
  \par
  
Sie haben im wesentlichen drei Möglichkeiten, einen neuen Kernel zu
konfigurieren.
    

    \begin{list}{*}{}
     
	\item  
{\bf make config} ist die spartanischste von allen: innerhalb des
Konsolenfensters werden dem Benutzer Fragen gestellt, die er einzeln
beantworten muss. Da dies mit der Zeit sehr umfangreich und unübersichtlich
geworden ist, ist diese Methode nicht zu empfehlen.
     

     
	\item 
{\bf make menuconfig} stellt ein grafisches Menü in einer 
Konsole bereit. In diesem Menü kann man Konfigurationsoptionen auswählen. 
Meistens werden die Möglichkeiten [X] [ ] [M] (aktiviert, deaktiviert und 
als Kernelmodul kompiliert) angeboten. Um diesen Weg zu nutzen, benötigt 
Ihr System die ncurses-Bibliothek, die jedoch von den meisten Distributionen 
von ganz allein installiert wird.
     

     
	\item 
{\bf make xconfig} bietet ebenfalls ein Auswahlmenü an, aber unter
der XWindow-Oberfläche. Hierzu müssen Sie Tcl/Tk installiert haben.
     
    \end{list}

    
make menuconfig in Aktion
     
 
    
  \par
  
Schauen Sie sich zunächst genau die Auswahloptionen an und
vergleichen Sie, welche Hardware Sie in ihrem Computer haben
(eventuell schauen Sie auch einmal in die Ausgaben von {\bf lspci} 
und {\bf dmesg}). Schauen Sie ggf. auf der Homepage des Herstellers 
nach, ob Sie eine Dokumentation zu Ihrer Hardware finden. 
    

    
  \par
  
Nachdem Sie die Auswahlentscheidungen getroffen haben, können Sie
Ihre Konfiguration speichern. Die Konfiguration wird dann in die
Datei
    

    
  \par
  
{\bf /usr/src/linux/.config}
    

    
  \par
  
geschrieben.
    
   

   \subsection{Übersetzung des Kernels} \label{d12e444}
        

    

    
  \par
  
Nach der Konfiguration erfolgt die Übersetzung mit den Befehlen:
    

    
      \begin{tt} \begin{scriptsize} root@linux / \# 
make dep
      \end{scriptsize} \end{tt} \linebreak 

      \begin{tt} \begin{scriptsize} root@linux / \# 
make clean
      \end{scriptsize} \end{tt} \linebreak 

      \begin{tt} \begin{scriptsize} root@linux / \# 
make bzImage
      \end{scriptsize} \end{tt} \linebreak 

      \begin{tt} \begin{scriptsize} root@linux / \# 
make modules
      \end{scriptsize} \end{tt} \linebreak 

      \begin{tt} \begin{scriptsize} root@linux / \# 
make modules\_install
      \end{scriptsize} \end{tt} \linebreak 
    

   

   \subsection{Installation des Kernels} \label{d12e473}
        

    

    
  \par
  
Nach dem Kompilieren (die Kompilierungszeit ist abhängig von Ihrer
Rechnerleistung und kann mehrere Stunden oder auch nur einige
Minuten dauern) kopieren Sie den Kernel in Ihre Boot-Partition bzw. Ihr
{\bf /boot}-Verzeichnis. Sichern Sie bitte vorher den 
funktionierenden Kernel!
Eine Befehlsfolge könnte etwa wie folgt aussehen:
    

    
      \begin{tt} \begin{scriptsize} root@linux / \# 
cd /usr/src/linux
      \end{scriptsize} \end{tt} \linebreak 

      \begin{tt} \begin{scriptsize} root@linux / \# 
cp /boot/vmlinuz /boot/vmlinuz.old
      \end{scriptsize} \end{tt} \linebreak 

      \begin{tt} \begin{scriptsize} root@linux / \# 
cp /usr/src/linux/arch/i386/boot/bzImage /boot/vmlinuz
      \end{scriptsize} \end{tt} \linebreak 

      \begin{tt} \begin{scriptsize} root@linux / \# 
cp /boot/System.map /boot/System.map.old
      \end{scriptsize} \end{tt} \linebreak 

      \begin{tt} \begin{scriptsize} root@linux / \# 
cp System.map /boot
      \end{scriptsize} \end{tt} \linebreak 
    

    
  \par
  
Um den neuen Kernel booten zu können, müssen Sie dem Bootloader noch
mitteilen, wo er den neuen Kernel findet.
    

    
  \par
  
Öffnen Sie die Datei {\bf /etc/lilo.conf} mit einem Texteditor
und fügen Sie Einträge der Form
    
    
    \begin{tabular}{|l|}
                  \hline
                  \begin{tt} 
        
/etc/lilo.conf
     \end{tt} \\ 
                  \hline
                  \begin{minipage}{130mm} 
                  \begin{scriptsize} 
                  \begin{verbatim} 
        
...
# Neuer Kernel:
image = /boot/vmlinuz
label = kernel_new

# Backup-Kernel:
image = /boot/vmlinuz.old
label = kernel_old
...
     
     \end{verbatim} 
                  \end{scriptsize} 
                  \end{minipage} \\
                  \hline
                  \end{tabular}
 
    
  \par
  
hinzu. 
    

    
  \par
  
Nun führen Sie noch als {\bf root /sbin/lilo} aus.
    
   

   \subsection{Starten des neuen Kernel} \label{d12e532}
        

    

    
  \par
  
Nun können Sie ihren neuen Kernel booten. Geben Sie dazu als root
    

    
      \begin{tt} \begin{scriptsize} root@linux / \# 
reboot
      \end{scriptsize} \end{tt} \linebreak 
    

    
  \par
  
oder
    

    
      \begin{tt} \begin{scriptsize} root@linux / \# 
shutdown -r now
      \end{scriptsize} \end{tt} \linebreak 
    

    
  \par
  
ein.
    

    
  \par
  
Beim Erscheinen des Bootmenüs wählen Sie den Eintrag mit dem neuen
Kernel aus. Damit bootet der Computer mit Ihrem neuen Kernel.
    

    
  \par
  
Sollte der Computer aus irgendwelchen Gründen nicht booten, so
schauen Sie sich die Fehlermeldungen genau an, sie geben Aufschluß
über die Ursachen. Resetten Sie in diesem Fall Ihren Computer und booten
Sie ihn erneut mit dem alten Kernel. Sie finden die Fehlermeldungen, falls
sie nicht ohnehin auf der Konsole ausgegeben wurden, in der Datei
{\bf /var/log/messages}.
    

    
  \par
  
Weitere Infos zum Erstellen eines eigenen Kernels (in englischer Sprache)
finden Sie auch hier:
    

    
  \par
  

http://www.tldp.org/HOWTO/Kernel-HOWTO.html
    
   
  
	\ref{inhalt.tex}


	\end{document}
	
