# Kapitel 1 Einführung

Willkommen bei meinem System V init Editor, eher bekannt (und im folgenden auch so benannt) als KSysV. Dieser Abschnitt führt ein paar Konzepte ein und beschreibt, was Sie mit KSysV tun können.

Die folgende Erläuterung ist "geliehen" von `tksysv` (einer Inspirationsquelle für KSysV):

# 1.1 Eine kurze Beschreibung von System V init

Die "System V init" entwickelt sich rasch zum Standard für die Kontrolle von Programmstarts beim Hochfahren des Systems in der Linux-Welt. Und zwar deshalb, weil sie leichter zu benutzen, mächtiger und zugleich flexibler ist als die traditionelle BSD-init.

Ich werde hier nicht weiter auf geschichtliche Aspekte eingehen (v.a. weil ich darüber selbst nichts weiß :-).

Die init-Binärdatei liegt unter `/sbin` und nicht unter `/etc`. Dies ist deshalb wichtig, weil vielleicht jemand versuchen könnte, eine Maschine auf System V init umzustellen ohne eine Neuinstallation und Neuformatierung vorzunehmen. Der Linuxkernel sieht zuerst unter `/etc` nach einer init-Datei. Deshalb müssen Sie sichergehen, daß die alte init von dort entfernt wurde, falls es dort eine gab.

Die SysV init unterscheidet sich auch dadurch von der BSD init, daß sich die Konfigurationsdateien in einem Unterverzeichnis von `/etc` befinden statt direkt in `/etc`. Dieses Verzeichnis heißt `rc.d`. Dort finden Sie `rc.sysinit` und folgende weitere Verzeichnisse:

      init.d/
     rc0.d/
     rc1.d/
     rc2.d/
     rc3.d/
     rc4.d/
     rc5.d/
     rc6.d/

`init.d` enthält eine ganze Menge Skripte. Grundsätzlich benötigen Sie ein Skript für jeden Systemdienst, den Sie beim Hochfahren des Systems bzw. beim Wechsel auf ein anderes Runlevel starten möchten. Systemdienste beinhalten solche Dinge wie Netzwerk, NFS, sendmail, httpd usw. Systemdienste beinhalten dagegen nicht solche Sachen wie "setserial", das nur einmal läuft und dann geschlossen wird. Solche Dinge gehören nach `rc.local`.

`rc.local` sollte seinerseits unter `/etc/rc.d` liegen, wenn Sie eins brauchen. Die meisten Systeme besitzen eines, auch wenn es eigentlich nicht viel Verwendung dafür gibt. Sie können ebenfalls ein `rc.serial` in `/etc/rc.d` anlegen, wenn Sie beim Hochfahren etwas ausführen lassen wollen, was mit dem seriellen Anschluß zu tun hat.

Der Ablauf ist folgender:

- der Kernel sucht an verschiedenen Stellen nach init und startet die erste, die er findet;

- init startet `/etc/rc.d/rc.sysinit`;

- `rc.sysinit` tut eine Menge notwendiger Dinge und startet dann `rc.serial` (wenn es existiert);

- init startet `rc.local`;

- init startet alle Skripte für das voreingestellte Runlevel.

Das standardmäßige Runlevel ist in `/etc/inittab` eingetragen. Sie sollten im Anfangsbereich eine Zeile wie die folgende sehen:

     id:3:initdefault:

An diesem Punkt können Sie einen Blick in die zweite Spalte werfen und wahrscheinlich feststellen, daß das voreingestellte Runlevel 3 ist. Wenn Sie das ändern möchten, dann können Sie `/etc/inittab` von Hand bearbeiten und die "3" ändern. Seien Sie sehr vorsichtig, wenn Sie an der inittab herumändern. Falls Sie doch etwas durcheinandergebracht haben, dann kommen Sie zur Reparatur wieder heran, indem Sie das System neu starten und folgendes ausführen:

     LILO boot: linux single

Dies sollte Ihnen ermöglichen, in den Einzelnutzer-Modus zu kommen und die Reparatur vorzunehmen.

Aber wie startet es nun all die richtigen Skripte? Wenn Sie '`ls -l`' eingeben in `rc3.d`, dann sehen Sie wahrscheinlich etwas wie das Folgende:

     lrwxrwxrwx 1 root root 13 13:11 S10network -> ../init.d/network
     lrwxrwxrwx 1 root root 16 13:11 S30syslog -> ../init.d/syslog
     lrwxrwxrwx 1 root root 14 13:32 S40cron -> ../init.d/cron
     lrwxrwxrwx 1 root root 14 13:11 S50inet -> ../init.d/inet
     lrwxrwxrwx 1 root root 13 13:11 S60nfs -> ../init.d/nfs
     lrwxrwxrwx 1 root root 15 13:11 S70nfsfs -> ../init.d/nfsfs
     lrwxrwxrwx 1 root root 18 13:11 S75keytable -> ../init.d/keytable
     lrwxrwxrwx 1 root root 23 13:11 S80sendmail -> ../init.d/sendmail.init
     lrwxrwxrwx 1 root root 18 13:11 S90lpd -> ../init.d/lpd.init
     lrwxrwxrwx 1 root root 11 13:11 S99local -> ../rc.local

Wie Sie feststellen werden, gibt es keine wirklichen "Dateien" in diesem Verzeichnis. Alles hier sind Verknüpfungen zu Skripten im init.d-Verzeichnis. Die Verknüpfungen haben auch ein "S" und eine Nummer am Anfang. Das "S" besagt, daß dieses bestimmte Skript gestartet werden soll, so wie umgekehrt ein "K" den Stop bedeuten würde. Die Nummer dient einfach der Anordnung.Tatsächlich startet init alle Systemdienste in der Reihenfolge, in der sie erscheinen. Sie können die Nummern also doppelt vergeben, aber es wird Sie nur selbst durcheinander bringen. Sie benötigen bloß irgendeine zweistellige Zahl, zusammen mit einem großgeschriebenen "S" oder "K", um einen Systemdienst zu starten oder anzuhalten.

Wie startet und stoppt init eigentlich Systemdienste? Ganz einfach: Jedes der Skripte ist so geschrieben, daß es ein Argument wie "Start" und "Stop" akzeptiert. Sie können diese Skripte tatsächlich von Hand auf der Kommandozeile folgendermaßen starten:

     /etc/rc.d/init.d/httpd.init stop

Dies würde den httpd-Server anhalten. Init liest einfach den Namen, und wenn der ein "K" bei sich hat, dann ruft sie das Skript mit einem "Stop"-Argument auf. "Wenn er ein "S" mit sich führt, dann läßt init das Skript mit einem "Start"-Argument laufen.

## 1.1.1 Warum all diese Runlevel?

Manche Leute wünschen sich eine einfache Art, Maschinen für viele Zwecke einzurichten. Ich könnte z.B. ein "server"-Runlevel haben, das nur httpd, sendmail, networking u. dgl. laufen läßt. Darüber hinaus könnte ich auch noch ein "Benutzer"-Runlevel haben, das z.B. xdm startet.