|
Starten und Stoppen des Systems
Wie schon anfangs gesagt, sind Start (Bootstrap) und Stop (Shutdown)des Systems bei UNIX wesentlich komplexer, als bei einfachen Betriebssystemen.Es gibt - abhängig von den jeweiligen Aufgaben - mehrere "Run-levels"des Systems; hier nur eine Auswahl:
0 | Power-Down: Ausschalten des Rechners | 1 | Administrativer Level: z. B. Einrichten neu eingebauter Platten oderandere Hardware-Initialisierungen. Oft auch "s" oder "S" (Singleuser = Einzelbenutzer-Modus). | 2 | Multiuser-Modus ohne Netzwerkanbindung |
3 | Multiuser-Modus mit Netzwerkanbindung (Normal-Level) |
4 | Frei für benutzerdefinierten Modus |
5 | Firmware-Modus: z. B. Diagnose und Wartung; oft nur mit spezieller Floppy zu starten |
6 | Shutdown und Reboot: Wechsel zu Level 0 und dann sofortiges Hochlaufen |
Die Zuordnung der Level kann auch von der oben angeführten abweichen.
Der Wechsel des Levels wird durch spezielle Kommandos erreicht, z. B. shutdown,
telinit, (re)boot oder halt. So ist beispielsweise auch ein Bootstrap von
einem bestimmten Datenträger (Floppy, CD-ROM, ...) möglich.
Beispiel: Reboot des Systems nach 2 Minuten (Solaris):
shutdown -g120 -i6 -y Shutdown sendet eine Nachricht an alle eingeloggten
Benutzer, bevor der eigentliche Prozess beginnt. Egal, ob der Reboot-Vorgang
durch shutdown oder durch Einschalten des Rechners ausgelöst wurde,
sind die Systemaktivitäten im Prinzip immer gleich:
- Testen der Dateisysteme (Platten)
- Montieren (mount) der Platten (Info aus /etc/fstab bzw. /etc/vfstab).
- Säuberungsaktionen (z.B. Löschen von temporären Dateien,
Aufheben von eventuell beim Shutdown gesetzten Sperren, etc.
- Starten der Systemprozesse (Scheduler, init, getty, cron, Printer-Daemon,
Mail, Accounting, etc.
- Start der Netzwerk-Programme, montieren von Remote-Platten (NFS)
- User-Login freigeben
Diese doch relativ komplexen Aktionen werden wieder über spezielle
Shell-Scripts gesteuert. Bei BSD-Unix war der Aufbau dieser Scripts relativ
einfach. Die Datei /etc/rc enthält alle beim Systemstart auszuführenden
Kommandos. Innerhalb von rc werden eventuell weitere rc-Dateien aufgerufen, z. B.:
/etc/rc.local | Start lokaler Software |
/etc/rc.net | Start der Netzwerksoftware |
/etc/rc.single | Start im Single-User-Modus |
Später wurde das System
dahingehend erweitert, daß es für jeden Runlevel eine eigene
rc-Datei gab (rc0, rc1, rc2, usw.). Ab System V ist das System der rc-Dateien
vereinheitlicht worden. Für jeden Runlevel exisitiert ein Verzeichnis
unter /etc, wobei der Name der
Verzeichnisse einheitlich /etc/rcx.d ist (x steht für den
Runlevel, es gibt also rc0.d, rcs.d, rc2.d, usw.). Im Verzeichnis /etc/init.d
(manchmal auch /sbin/init.d) sind alle Programme (oder Shell-Scripts) gespeichert,
die beim System-Boot aufgerufen werden könnten. In den Verzeichnissen
rcx.d sind nun nur noch Links auf diese Programme enthalten. Alle Links folgen
ebenfalls einer festen Namenskonvention:
- der erste Buchstabe ist entweder ein "S" oder ein "K"
- danach folgt einezweistellige Zahl
- zum Schluß folgt der Name des Programms in /etc/init.d
Die so entstandenen rc-Scripts werden in lexikalischer Reihenfolge aufgerufen
und zwar zuerst die K-Dateien, dann die S-Dateien. Die Zahl im Namen legt
also die Reihenfolge innerhalb der K- oder S-Gruppe fest. Die K-Dateien
dienen zum Löschen (Kill) von Prozessen, die S-Dateien zum Starten
von Prozessen. Angenommen, es existieren folgende Dateien in /etc/rc.d:
- K30tcp
- S20sysetup
- S85lp
- K40nfs
- S40nfs
- S75cron.
Dann ist die Aufruf-Reihenfolge:
K30tcp K40nfs S20sysetup S30tcp S40nfs S75cron S85lp
Dabei sind K-und S-Dateien mit ansonsten gleichem Namen lediglich
Hinweise darauf, dasselbe Programm aufzurufen. So wird z. B. bei den Dateien
K30tcp und S30tcp das Programm oder Script /etc/init.d/tcp einmal mit dem
Parameter "stop" und einmal mit dem Parameter "start" aufgerufen. Man kann
also durch Anlegen von Links das Hochfahren des Systems sehr gezielt steuern.
Das entsprechende rc-Script wird dann auch sehr einfach, es läßt
sich folgendermaßen skizzieren:
#!/bin/sh
# Wenn Directory /etc/rc2.d vorhanden ist
if [ -d /etc/rc2.d] ; then
# K-Files bearbeiten
for f in /etc/rc2.d/K* ; do
if [ -s $f ]; then
/bin/sh $f stop
fi
done
# S-Files bearbeiten
for f in /etc/rc2.d/S*; do
if [ -s $f ] ; then
/bin/sh $f start
fi
done
fi
Ein von der rc-Datei aufgerufenens Script in /etc/init.d könnte
dann z. B. so aussehen:
#!/bin/sh
case $1 in
'start')
# aufgerufen als "Kxxcron"
# Lockfilelöschen
rm -f /var/spool/cron/FIFO
if [ -x /etc/cron ] ; then
/etc/cron
fi
;;
'stop')
# aufgerufen als "Sxxcron"
pid=`/bin/ps -e | grep 'cron$' | sed -e 's/^ *//' -e 's/ .*//'`
if [ "$pid" != "" ] ; then
/bin/kill -9 $pid
fi
;;
esac
|
|
|