SysV-Init
Upstart
Systemd
Busybox
Runit
Minit
RunLevel editieren
sonstiges
nach dem abarbeiten der etwigen Boot-Scripte aus der Initrd RamDisk startet der Kernel als ersten Prozess mit der ID1 die SysV-Init oder Upstart.
Dienstscripte werden unter /etc/init.d gespeichert.
Systeminitialisierungsdatei von SysV-Init ist die /etc/inittab, hier wird der Default Runlevel festgelegt.
Runlevel Verzeichnisse sind unter /etc/rcX.d zu finden (X je nach Runlevel, 0 - 6, oder S). Die Links unter /etc/rcX.d Verzeichnis werden in nummerische Reihenfolge abgearbeitet.
S<Nummer><Scriptname> Start-Script wird beim Eintreten des Runlevels ausgeführt
K<Nummer><Scriptname> Stop-Script wird beim Verlassen des Runlevels ausgeführt
Init startet alle Daemon als Hintergrund-Prozesse, da es sonst für die weitere Ausführung warten müsste bis der gestartete Prozess beendet ist. Zur Prozessüberwachung wird meist durch den Init-Script eines Daemons unter /var/run/ eine xxx.pid Datei angelegt, mit der ProzessID.
0=System halt
S=Single User
1=Single User Textmodus
2=Frei
3=Multi User Textmodus
4=Frei
5=Multi User X11
6=Reboot
Befehl | Beschreibung |
---|---|
init 3 | Runlevel wechsel in Runlevel 3 |
Seit Ubuntu 6.10 ist Upstart fester Bestandteil von Ubuntu.
Upstart arbeitet Eventbasiert mit Jobs, die unter /etc/event.d hinterlegt sind. Eine Reihenfolge in der die Jobs abgearbeitet werden, gibt es nicht. Jeder Job gibt an, für welchen Event er zuständig ist, trift der Event zu, werden alle zugehörigen Jobs parallel gestartet. Die Prozesse die durch Upstart gestartet werden laufen im Vordergrund.
Upstart merkt sich den Status aller Jobs die in /etc/event.d aufgeführt sind, läuft ein Job ist dieser mit running gelistet, wird ein Event beendet, wird dieser auf waiting gesetzt und Upstart beendet auch den Job der mit exec ausgefüht wurde.
Als erstes wird das Event startup (Systemprozess) erzeugt, jeder Start oder jedes Beenden eines Jobs erzeigt vier weitere Events, starting Jobname, started Jobname, stopping Jobname und stopped Jobname.
Das Event startup wird durch die Job-Datei /etc/event.d/rcS erzeugt.
#/etc/event.d/rcS start on startup stop on runlevel exec /etc/init.d/rcS
Befehl | Beschreibung |
---|---|
start on | benennet Event |
stop on | benennet Event |
exec ... | Daemon der durch den Job ausgeführt wird |
respawn | startet ein Prozess neu, wenn dieser sich beendet |
respawn limit 10 100 | Limit für den Neustart eines Prozesses setzen, max. 10 Versuche innerhalb 100 Sekunden |
pre-start | Befehl vor dem Start ausführen |
post-start | Befehl nach dem Start ausführen |
pre-stop | Befehl vor dem Stop ausführen |
post-stop | Befehl nach dem Stop ausführen |
initctl start Jobname | Job starten |
initctl stop Jobname | Job stoppen |
initctl list | Status aller Jobs anzeigen |
initctl status Jobname | Status eines Jobs anzeigen |
service --status-all | alle Dienste anzeigen |
service <Dienst> start | Dienst starten |
service <Dienst> restart | Dienst neustarten |
service <Dienst> stop | Dienst stoppen |
update-rc.d <Dienst> defaults | Dienst beim Systemstart starten |
update-rc.d <Dienst> remove | Systemstart des Dienstes deaktivieren |
echo "manual" | sudo tee /etc/init/jobname.override | Systemstart des Dienstes deaktivieren |
rm /etc/init/jobname.override | durch löschen der Datei <dienstname>.override wird der Dienst beim Start wieder geladen |
Beispiel mit respawn
start on event2 stop on event1 respawn respawn 10 120 exec /Path/Prozess
Beispiel mit pre-start
exec /sbin/sulogin console owner pre-start script echo "Type 'exit' when finished." end script
Prozesse die mit post-start und post-stop ausgeführt werden, werden von Upstart parallel mit dem durch exec ausgeführten Befehl gestartet.
Systemd wird bei Fedora ab Version 15, OpenSuse 12.1 und Mandriva 2011 genutzt, Arch Linux, Gentoo und Debian soll es bald Bestandteil werden.
Heise Artikel Teil1, Heise Artikel Teil 2, Systemd-Journal
Befehl | Beschreibung |
---|---|
allgemeine Informationen | |
systemctl list-unit-files | Dienste Dateien |
systemctl list-units | Alle Dienste auflisten |
systemctl list-sockets | Sockets auflisten |
systemctl list-dependencies <Service/Target> | Abhängigkeiten auflisten |
systemd-cgls | Baumansicht der Prozesse |
systemctl --type=target | Target anzeigen, /etc/systemd/system und /lib/systemd/system wobei die Targets unter /etc Vorrang haben |
systemctl --type=service | alle Services anzeigen, Spalte SUB zeigt den Status des Services, exited = ohne Fehler beendet, running = Service wird ausgeführt |
systemd-analyze | kurze Zusammenfassung zum SystemStart |
systemd-analyze plot > ergebnis.svg | Systemstart analysieren, Analysedatei kann mit Browser angezeigt werden |
systemd-analyze blame | Startzeit der Dienste, sortiert |
Dienste managen | |
systemctl start <Service> | Dienst starten |
systemctl stop <Service> | Dienst stoppen |
systemctl reload <Service> | Dienst Konfiguration neu laden |
systemctl restart <Service> | Dienst neustarten |
systemctl status <Service> | Dienste Status anzeigen |
systemctl show <Service> | Dienste Status anzeigen |
systemctl is-active <Service> | Dienste Status anzeigen aktiv/inaktiv |
systemctl --failed | Dienst die in einen Fehler gelaufen sind |
Systemstart konfigurieren | |
systemctl enable <Service> | Dienst zum Systemstart ausführen aktivieren |
systemctl disable <Service> | Dienst zum Systemstart ausführen deaktivieren |
systemctl is-enable <Service> | zeigt, ob der Dienst zum Systemstart aktiviert wurde |
systemctl get-default | vergleicht derzeitige Konfiguration mit der Standardkonfiguration und zeigt Unterschiede auf, z.B. ob ein Service mit systemctl disable deaktiviert wurde |
systemctl set-default <Service/Target> | stellt Standardeinstellung des Service/Target wieder her |
Systemstatus ändern | |
systemctl reboot | System neustarten |
systemctl halt | System herunterfahren |
systemctl poweroff | System in den Energiesparmodus setzen |
sonstiges | |
systemctl edit <ServiceUnit> | Konfigurationsdatei bearbeiten |
systemctl daemon-reload | Konfigurationsdatei neu einlesen |
systemctl --force poweroff | System herunterfahren |
systemctl kill <Service> | Dienst wird sofort beendet |
Systemd LOG | |
journalctl -xe | Log ausgeben, bis ans Ende springen (-e) |
journalctl -f -u apache2 | Log permanent überwachen (-f) und nach Meldungen von Apache2 filtern (-u) |
journalctl -o verbose -n | Metadaten anzeigen |
journalctl -p err | Log nach Priorität filtern, im Beispiel Error, mögliche Priorität "emerg" (0), "alert" (1), "crit" (2), "err" (3), "warning" (4), "notice" (5), "info" (6), "debug" (7) |
nach der Aktualisierung der Systembibliotheken das Init-System neu starten ohne den Rechner neustarten zu müssen
systemctl daemon-reexec
Journald wird dabei nicht mit neu gestartet, dies erreicht man wie folgt
systemctl restart systemd-journald
es gibt keine Runlevel, alles was zum starten gebraucht wird, steht in /etc/inittab.
- aus den Quellen übersetzen
make defconfig make menuconfig
- in das Verzeichnis /usr/src/busybox installieren
make CONFIG_PREFIX=/usr/src/busybox install
die Unterordner bin, sbin, usr/bin, usr/sbin werden automatisch angelegt. Manuell muß das Verzeichnis lib angelegt werden, drin die Dateien libc.so.6, libm.so.6 und ld-linux.so.2 aus dem Build-System hineinkopieren.
- anzeigen der notwendigen Liberys
ldd busybox
für ein LiveSystem das aus dem RAM läuft, benötigt man noch die Verzeichnisse dev, etc, lib/modules, proc, sys und tmp. Nach lib/modules werden die Module des Kernels kopiert. Unter etc benötigt man die Dateien fstab mit den Mounteinträgen für Proc und SysFS, sowie passwd und group und inittab
# /etc/fstab none /dev/pts devpts defaults 0 0 proc /proc proc defaults 0 0 none /sys sysfs noauto 0 0
# /etc/inittab # convenience shells tty1::askfirst:-/bin/sh tty2::askfirst:-/bin/sh tty3::askfirst:-/bin/sh # Stuff to do before rebooting ::ctrlaltdel:/sbin/reboot > /dev/null 2>&1 # re-exec init on receipt of SIGHUP/SIGUSR1 ::restart:/sbin/init
- Busybox InitScript /init
#!/bin/busybox sh mount /proc mount /sys mount /dev/pts # Load all kernel modules VER=$(uname -r) for m in $(cat /lib/modules/$VER/modules.*map|cut -d" " -f1|sort -u); do modprobe $m done export TERM_TYPE=pts exec /bin/busybox init
- alle statischen Geräte anlegen
MAKEDEV generic-i386
- BusyBox InitialRamDisk erstellen
find . | cpio -o-H newc | gzip > /boot/busyboxinit.img
- Grub Menü erweitern
# /boot/grub/menu.lst title BusyBox MiniTux root (hd0,1) kernel /boot/vmlinuz initrd /boot/busyboxinit.img
ein Verzeichnis iso/isolinux erstellen und den CD Bootloader isolinux.bin mit der Datei isolinux.cfg in dieses Verzeichnis kopieren.
# isolinux/isolinux.cfg DEFAULT BusyBox LABEL BusyBox KERNEL /boot/vmlinux APPEND initrd=/boot/busyboxinit.img
die Path-Angaben entspricht dem Wurzelverzeichnis der CD.
- ISO Image erstellen
genisoimage -b isolinux/isolinux.bin -no-emul-boot -boot-info-table -o busybox.iso iso
Optionen | Erklärung |
---|---|
-b | Path zum CD Bootloader |
-no-emul-boot | keine Festplattenemulation |
-boot-info-table | Tabelle mit CD-Index integrieren |
-o | Name des CDImages |
- eine InitialRamDisk der NetbootCD entpacken
zcat /media/cdrom/install.386/initrd.gz | cpio -idm
Dateien udevd und udevadm aus dem Verzeichnis sbin und ld-linux.so.2 und libc.so.6 aus lib, Verzeichnis /etc/udev und lib/udev.
Programme insmod und modprobe aus sbin und /etc/modprobe.d und /etc/hotplug.d übernehmen, damit man eine automatische Hardwareerkennung hat.
Unter /dev benötigt man nur noch die statischen Einträge für null und console, alle anderen können gelöscht werden, diese werden bei Bedarf durch udev erzeugt.
alle Scripte die nur einmal gebraucht werden, sind in /etc/runit/1 für den Start und /etc/runit/2 für den Shutdown des Systems.
In Verzeichnissen im Ordner /etc/sv liegen Scripte für Dienste, die beim Start/Stop parallel ausgeführt werden, SymLinks liegen in /var/service.
runsv überwacht laufende Programme und startet diese neu falls sie beendet werden.
Runinit Tools svn für manuellen start|stop|status der Dienste
sv start dienst sv status dienst sv stop dienst
startet Runit Dienste
#/etc/inittab SV:123456:respawn:/sbin/runsvdir-start
FIFOs /etc/minit/in und /etc/minit/out werden verwendet, in /etc/minit werden die Dienste definiert.
Unterstützt von: Fedora, Mandiva, per Wrapper-Script SuSE, ...
Befehl | Beschreibung |
---|---|
chkconfig --list | RunLeveleinstellungen aller Dienste anzeigen |
chkconfig --list <Dienst> | RunLevel eines Dienstes anzeigen |
chkconfig --add <Dienst> | Standard RunLevel für einen Dienst einrichten |
chkconfig --del <Dienst> | Standard RunLevel für einen Dienst entfernen |
chkconfig --level 3 <Dienst> on | nur einen bestimmten RunLevel ändern (nicht bei SuSE) |
chkconfig --level 34 <Dienst> on | mehrere RunLevel ändern (nicht bei SuSE) |
chkconfig <Dienst> on|off|Runlevel | bei SuSE ein Wrapper-Script für insserv verwendet |
Variablen im Init-Script der Dienste
# chkconfig: 345 55 25 # description: Apache
Parameter | Beschreibung |
---|---|
chkconfig: | Runlevel Nummer (RC 345), Start-Priorität (S55), Stop-Priorität (K25) |
description: | Beschreibung |
processname: | Name des Prozesses |
config: | Konfigurationsdatei |
pidfile: | Name PID Datei |
Unterstützt von: SuSE, ...
/etc/insserv.conf | Konfigurationsdatei SuSE |
/etc/insserv.conf.d/ | Konfigurations-Verzeichnis |
Variablen im Init-Script der Dienste
### BEGIN INIT INFO # Provides: sshd # Required-Start: $network $remote_fs # Required-Stop: $network $remote_fs # Default-Start: 3 5 # Default-Stop: 0 1 2 6 # Description: Start the sshd daemon ### END INIT INFO
Parameter | Beschreibung |
---|---|
Provides: | Name des Dienstes |
Required-Start: | Abhänigkeiten Start |
Required-Stop: | Abhänigkeiten Stop |
Default-Start: | Runlevel in denen der Dienst gestartet wird |
Default-Stop: | Runlevel in denen der Dienst beendet wird |
Description: | Beschreibung |
Befehl | Beschreibung |
---|---|
insserv <Dienst> | RunLevel Links anlegen |
insserv -r <Dienst> | RunLevel Links entfernen |
insserv <Dienst>,start=4 | Standard RunLevel Links anlegen und zusätzlich einen Link im RC4 Ordner |
insserv -d <Dienst> | setzt aud default zurück |
Unterstützt von: Debian, ubuntu, ...
Befehl | Beschreibung |
---|---|
update-rc.d <Dienst> defaults | RunLevel Links anlegen |
update-rc.d -f <Dienst> remove | RunLevel Links entfernen |
Unterstützt von: Debian, ubuntu, ...
Unterstützt von: Debian, ubuntu, ...
Befehl | Beschreibung |
---|---|
sysv-rc-conf --list | RunLevel anzeigen |
sysv-rc-conf <Dienst> on | RunLevel Links anlegen |
sysv-rc-conf <Dienst> off | RunLevel Links entfernen |
sysv-rc-conf --level 35 <Dienst> off | einzelne RunLevel bearbeiten |