Init/Systeme: Unterschied zwischen den Versionen

Aus Foxwiki
Die Seite wurde neu angelegt: „== Init-Systeme == Beim Starten eines Rechners geschehen viele Dinge. Für viele ist bekannt, dass zuerst das sogenannte [http://de.wikipedia.org/wiki/BIOS BI…“
 
K Dirkwagner verschob die Seite Init-Systeme nach Init/Systeme
 
(25 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
== Init-Systeme ==
'''Init-Systeme'''


Beim Starten eines Rechners geschehen viele Dinge. Für viele ist bekannt, dass zuerst das sogenannte [http://de.wikipedia.org/wiki/BIOS BIOS] gestartet wird. Auf neueren Systemen kommt hingegen [http://de.wikipedia.org/wiki/UEFI UEFI] zum Einsatz.
== Beschreibung ==
Beim Starten eines Rechners geschehen viele Dinge
; BIOS
* Für viele ist bekannt, dass zuerst das sogenannte [http://de.wikipedia.org/wiki/BIOS BIOS] gestartet wird
* Auf neueren Systemen kommt hingegen [http://de.wikipedia.org/wiki/UEFI UEFI] zum Einsatz
* Beide sind zum Erkennen der installierten Hardware notwendig


Beide sind zum Erkennen der installierten Hardware notwendig. Nach diesem Schritt wird der [http://wiki.ubuntuusers.de/Bootloader Bootloader] gestartet, in der Regel ist [http://wiki.ubuntuusers.de/GRUB_2 GRUB 2] in Gebrauch.  
; Bootloader
Nach diesem Schritt wird der [http://wiki.ubuntuusers.de/Bootloader Bootloader] gestartet, in der Regel ist [http://wiki.ubuntuusers.de/GRUB_2 GRUB 2] in Gebrauch
* Dieser kümmert sich darum den Linux-[http://wiki.ubuntuusers.de/Kernel Kernel] und die [http://de.wikipedia.org/wiki/initrd Initial Ramdisk:] zu laden


Dieser kümmert sich darum den Linux-[http://wiki.ubuntuusers.de/Kernel Kernel] und die [http://de.wikipedia.org/wiki/initrd Initial Ramdisk:] zu laden. Nachdem auch dieser Vorgang abgeschlossen ist, folgt der Start des ersten „richtigen“ Prozesses auf einem Unix-System: Das [http://de.wikipedia.org/wiki/Init Init]-System.
; Kernel


Aufgabe dieses Init-Systems ist es, das System für den Benutzer in einen brauchbaren und definierten Zustand zu überführen:  
; Init
 
Nachdem auch dieser Vorgang abgeschlossen ist, folgt der Start des ersten „richtigen“ Prozesses auf einem Unix-System: Das [http://de.wikipedia.org/wiki/Init Init]-System
Ohne dieses würde man nur auf einer Shell sitzen, bei welcher die Übersetzung, Uhrzeit, Netzwerk oder viele andere Sachen fehlen würde.
* Aufgabe dieses Init-Systems ist es, das System für den Benutzer in einen brauchbaren und definierten Zustand zu überführen:
 
* Ohne dieses würde man nur auf einer Shell sitzen, bei welcher die Übersetzung, Uhrzeit, Netzwerk oder viele andere Sachen fehlen würde
Auch ein Mehrbenutzerbetrieb wäre – mangels gestarteter Dienste hierzu – nicht möglich.
* Auch ein Mehrbenutzerbetrieb wäre – mangels gestarteter Dienste hierzu – nicht möglich
 
* Um diesen definierten Zustand zu erreichen, folgt dieses Init-System bestimmten Regeln, welche beim gängigen [http://de.wikipedia.org/wiki/SysVinit SysVinit] in Shellskripte niedergeschrieben sind
Um diesen definierten Zustand zu erreichen, folgt dieses Init-System bestimmten Regeln, welche beim gängigen [http://de.wikipedia.org/wiki/SysVinit SysVinit] in Shellskripte niedergeschrieben sind.
* Dazu kommen noch einige Konfigurationsdateien der vielen Dienste, welche man heute auf einem modernen System vorfindet
 
Dazu kommen noch einige Konfigurationsdateien der vielen Dienste, welche man heute auf einem modernen System vorfindet.


=== Entwicklung ===
=== Entwicklung ===
 
Im Laufe der Entwicklung hin zu modernen Unix-Systemen wurde vieles an grundlegender Software immer wieder modernisiert, dazu gehört auch das Init-System, welches für das Starten von Prozessen verantwortlich ist
Im Laufe der Entwicklung hin zu modernen Unix-Systemen wurde vieles an grundlegender Software immer wieder modernisiert, dazu gehört auch das Init-System, welches für das Starten von Prozessen verantwortlich ist.


==== SysVinit ====
==== SysVinit ====
 
* SysVinit ist ein sehr altes System zum Starten von Diensten, denn als Grundlage dient ein Design von 1983
SysVinit ist ein sehr altes System zum Starten von Diensten, denn als Grundlage dient ein Design von 1983. Daher gibt es weder Abhängigkeiten, noch Events und so wird dieses System modernen Desktops und Notebooks nicht mehr gerecht.
* Daher gibt es weder Abhängigkeiten, noch Events und so wird dieses System modernen Desktops und Notebooks nicht mehr gerecht
 
* Dienste werden hier strikt der Reihe nach gestartet, unabhängig davon, ob diese parallel gestartet werden könnten
Dienste werden hier strikt der Reihe nach gestartet, unabhängig davon, ob diese parallel gestartet werden könnten.
* SysVinit setzt auf viele Skripte, welche in weiten Teilen ähnliche oder sogar gleiche Aufgaben erledigen
 
* Häufig benutzte Funktionen wurden aber mit der Zeit auf gemeinsam genutzte Skripte (Includes) ausgelagert, um zumindest im Ansatz dem [http://de.wikipedia.org/wiki/Don’t_repeat_yourself DRY-Prinzip] zu entsprechen
SysVinit setzt auf viele Skripte, welche in weiten Teilen ähnliche oder sogar gleiche Aufgaben erledigen. Häufig benutzte Funktionen wurden aber mit der Zeit auf gemeinsam genutzte Skripte (Includes) ausgelagert, um zumindest im Ansatz dem [http://de.wikipedia.org/wiki/Don’t_repeat_yourself DRY-Prinzip] zu entsprechen.
* Die Skripte können je nach Distribution an unterschiedlichen Orten, zum Beispiel <tt>/etc/rc.d</tt> oder <tt>/etc/init.d</tt>, liegen, und auch die Aktivierung und Deaktivierung von Diensten kann abhängig von der Distribution unterschiedlich erfolgen – zum Beispiel durch symbolische Links in <tt>/etc/rcX.d</tt> oder einem Eintrag in der <tt>/etc/rc.conf</tt>
 
* Für SysVinit ist es ''nicht zuverlässig'' möglich, Dienste sauber zu beenden
Die Skripte können je nach Distribution an unterschiedlichen Orten, zum Beispiel <tt>/etc/rc.d</tt> oder <tt>/etc/init.d</tt>, liegen, und auch die Aktivierung und Deaktivierung von Diensten kann abhängig von der Distribution unterschiedlich erfolgen – zum Beispiel durch symbolische Links in <tt>/etc/rcX.d</tt> oder einem Eintrag in der <tt>/etc/rc.conf</tt>.
* In der Regel wird das Skript entweder einen Prozess anhand seiner gespeicherten Prozess-ID beenden oder aber mit [http://wiki.ubuntuusers.de/killall killall] alle in Frage kommenden Prozesse beenden
 
* Ausnahme hiervon sind Dienste, welche eine eigene Logik zum Beenden haben
Für SysVinit ist es ''nicht zuverlässig'' möglich, Dienste sauber zu beenden. In der Regel wird das Skript entweder einen Prozess anhand seiner gespeicherten Prozess-ID beenden oder aber mit [http://wiki.ubuntuusers.de/killall killall] alle in Frage kommenden Prozesse beenden.
* Ein bekannter Dienst welcher sich beispielsweise nicht sauber beenden lässt, wäre NRPE, der für Monitoring über [http://de.wikipedia.org/wiki/Nagios Nagios] oder [http://de.wikipedia.org/wiki/Icinga Icinga] benötigt wird
 
Ausnahme hiervon sind Dienste, welche eine eigene Logik zum Beenden haben. Ein bekannter Dienst welcher sich beispielsweise nicht sauber beenden lässt, wäre NRPE, der für Monitoring über [http://de.wikipedia.org/wiki/Nagios Nagios] oder [http://de.wikipedia.org/wiki/Icinga Icinga] benötigt wird.


==== Upstart ====
==== Upstart ====
 
Upstart ist eine relativ neue Entwicklung eines Init-Systems
Upstart ist eine relativ neue Entwicklung eines Init-Systems. Im Gegensatz zu dem nachfolgend beschriebenen systemd, welches mit Abhängigkeiten arbeitet, wird hier alles über [http://de.wikipedia.org/wiki/Ereignis_%28Programmierung%29 Events] geregelt.
* Im Gegensatz zu dem nachfolgend beschriebenen systemd, welches mit Abhängigkeiten arbeitet, wird hier alles über [http://de.wikipedia.org/wiki/Ereignis_%28Programmierung%29 Events] geregelt
 
* Upstart ist der erste Schritt zur Vereinfachung der Init-Skripte, welche nun unter <tt>/etc/init</tt> liegen
Upstart ist der erste Schritt zur Vereinfachung der Init-Skripte, welche nun unter <tt>/etc/init</tt> liegen. Ein weiterer Unterschied ist, dass zum Deaktivieren eines Services die Events im Init-Skript deaktiviert werden müssen (bis Version 1.3). systemd arbeitet hier wie auch schon SysVinit mit [http://wiki.ubuntuusers.de/ln#Symbolische-Verknuepfungen Symbolischen Verknüpfungen].
* Ein weiterer Unterschied ist, dass zum Deaktivieren eines Services die Events im Init-Skript deaktiviert werden müssen (bis Version 1.3)
 
* systemd arbeitet hier wie auch schon SysVinit mit [http://wiki.ubuntuusers.de/ln#Symbolische-Verknuepfungen Symbolischen Verknüpfungen]
Upstart greift bei weitem nicht so tief in ein vorhandenes System ein. Unter anderem wird auch nicht verlangt Konfigurationen über bestimmte, vorgegebene, Konfigurationsdateien zu erledigen. Die Dokumentation wurde vor allem in den letzten Versionen stark ausgebaut. Dies war früher ein häufiger Kritikpunkt.
* Upstart greift bei weitem nicht so tief in ein vorhandenes System ein
 
* Unter anderem wird auch nicht verlangt Konfigurationen über bestimmte, vorgegebene, Konfigurationsdateien zu erledigen
Upstart wurde neben Ubuntu auch eine Zeit lang von anderen Distributionen wie zum Beispiel [https://fedoraproject.org/de/ Fedora] verwendet. Viele Entwickler sind aber nicht bereit an Upstart mitzuentwickeln, da Canonical hierzu eine [http://www.canonical.com/contributors Beitragszustimmung] verlangt.
* Die Dokumentation wurde vor allem in den letzten Versionen stark ausgebaut
* Dies war früher ein häufiger Kritikpunkt
* Upstart wurde neben Ubuntu auch eine Zeit lang von anderen Distributionen wie zum Beispiel [https://fedoraproject.org/de/ Fedora] verwendet
* Viele Entwickler sind aber nicht bereit an Upstart mitzuentwickeln, da Canonical hierzu eine [http://www.canonical.com/contributors Beitragszustimmung] verlangt


==== OpenRC ====
==== OpenRC ====
 
Neben systemd, SysVinit und Upstart gibt es auch noch [http://en.wikipedia.org/wiki/OpenRC OpenRC], welches häufig bei [http://de.wikipedia.org/wiki/Gentoo Gentoo]-Systemen verwendet wird
Neben systemd, SysVinit und Upstart gibt es auch noch [http://en.wikipedia.org/wiki/OpenRC OpenRC], welches häufig bei [http://de.wikipedia.org/wiki/Gentoo Gentoo]-Systemen verwendet wird. OpenRC wird in diesem Artikel der Einfachheit halber nicht weiter beschrieben.
* OpenRC wird in diesem Artikel der Einfachheit halber nicht weiter beschrieben


=== Anwendung ===
=== Anwendung ===
==== Gängige Aktionen ====
==== Gängige Aktionen ====
Auf Links wie zum Beispiel ''start'' oder ''stop'', welche die Distributionen oft verwenden, haben wir verzichtet
Auf Links wie zum Beispiel ''start'' oder ''stop'', welche die Distributionen oft verwenden, haben wir verzichtet
 
{| class="wikitable sortable"
 
|-
{| style="border-spacing:0;margin:auto;width:17.501cm;"
|- style="border:0.05pt solid #000000;padding:0.15cm;"
| colspan="4" | '''Aktionen im Vergleich '''
| colspan="4" | '''Aktionen im Vergleich '''
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | '''Aktion '''
| | '''Aktion '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | '''SysVinit '''
| | '''SysVinit '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | '''upstart '''
| | '''upstart '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.15cm;" | '''systemd '''
| | '''systemd '''
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | '''Dienst starten '''
| | '''Dienst starten '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | /etc/init.d/dienstname start  
| | /etc/init.d/dienstname start
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | initctl start dienstname  
| | initctl start dienstname
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.15cm;" | systemctl start dienstname.service  
| | systemctl start dienstname.service
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | '''Dienst aktivieren '''
| | '''Dienst aktivieren '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | Symlink in rcX.d  
| | Symlink in rcX.d
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | Manipulation Job oder Override File  
| | Manipulation Job oder Override File
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.15cm;" | systemctl enable dienstname.service  
| | systemctl enable dienstname.service
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | '''Dienst neustarten '''
| | '''Dienst neustarten '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | /etc/init.d/dienstname restart  
| | /etc/init.d/dienstname restart
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | initctl restart dienstname  
| | initctl restart dienstname
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.15cm;" | systemctl restart dienstname.service  
| | systemctl restart dienstname.service
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | '''Dienst ändern '''
| | '''Dienst ändern '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | Modifikation des Init-Skripts  
| | Modifikation des Init-Skripts
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | Modifikation Job oder Override File  
| | Modifikation Job oder Override File
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.15cm;" | Überschreiben des Distributorskripts in /etc  
| | Überschreiben des Distributorskripts in /etc
|-
|-
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | '''Runlevel ändern '''
| | '''Runlevel ändern '''
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | telinit runlevel  
| | telinit runlevel
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:none;padding:0.15cm;" | telinit runlevel  
| | telinit runlevel
| style="border-top:none;border-bottom:0.05pt solid #000000;border-left:0.05pt solid #000000;border-right:0.05pt solid #000000;padding:0.15cm;" | systemctl isolate runlevel.target  
| | systemctl isolate runlevel.target
|-
|-
|}
|}
Auf den ersten Blick sind so kaum Vorteile ersichtlich, sehen wir uns dies aber mal etwas genauer an: # SysVinit erfordert in ''jedem'' Skript eine bestimmte, aber unterschiedliche Logik zum Starten, Neustarten und Beenden des Dienstes
 
Auf den ersten Blick sind so kaum Vorteile ersichtlich, sehen wir uns dies aber mal etwas genauer an:
# SysVinit erfordert in ''jedem'' Skript eine bestimmte, aber unterschiedliche Logik zum Starten, Neustarten und Beenden des Dienstes
# Upstart erfodert zum Aktivieren/Deaktivieren eine Modifikation des Jobs
# Upstart erfodert zum Aktivieren/Deaktivieren eine Modifikation des Jobs
# Upstart erfordert zum Verändern eine Modifikation des Skriptes, welches der Distributor mitliefert. Etwas das normalerweise nur in Ausnahmefällen gemacht werden sollte! Ab Version 1.3 gibt es hierzu auch die Möglichkeit der sogenannten „Override Files“.
# Upstart erfordert zum Verändern eine Modifikation des Skriptes, welches der Distributor mitliefert. Etwas das normalerweise nur in Ausnahmefällen gemacht werden sollte! Ab Version 1.3 gibt es hierzu auch die Möglichkeit der sogenannten „Override Files“
# Weder SysVinit noch Upstart bieten eine zuverlässige Möglichkeit, um unabhängig von der aktuellen Position definiert ein bestimmtes Runlevel zu erreichen.
# Weder SysVinit noch Upstart bieten eine zuverlässige Möglichkeit, um unabhängig von der aktuellen Position definiert ein bestimmtes Runlevel zu erreichen
 
 


=== Vergleich ===
=== Vergleich ===
Hierzu einen Dienst bei allen drei Systemen im Vergleich


Hierzu einen Dienst bei allen drei Systemen im Vergleich. Ausgewählt wurde hierzu [http://wiki.ubuntuusers.de/cron cron], der auf den meisten Systemen zu finden ist.
Ausgewählt wurde hierzu [http://wiki.ubuntuusers.de/cron cron], der auf den meisten Systemen zu finden ist


==== SysVinit ====
==== SysVinit ====
  #!/bin/sh
  #!/bin/sh
  # Start/stop the cron daemon.
  # Start/stop the cron daemon
  #
  #
  ### BEGIN INIT INFO
  ### BEGIN INIT INFO
Zeile 113: Zeile 115:
  # Default-Stop:      0 1 6
  # Default-Stop:      0 1 6
  # Short-Description: Regular background program processing daemon
  # Short-Description: Regular background program processing daemon
  # Description:      cron is a standard UNIX program that runs user-specified  
  # Description:      cron is a standard UNIX program that runs user-specified
  #                    programs at periodic scheduled times. vixie cron adds a  
  #                    programs at periodic scheduled times. vixie cron adds a
  #                    number of features to the basic UNIX cron, including better
  #                    number of features to the basic UNIX cron, including better
  #                    security and more powerful configuration options.
  #                    security and more powerful configuration options
  ### END INIT INFO
  ### END INIT INFO
 
  test -f /usr/sbin/cron || exit 0
  test -f /usr/sbin/cron || exit 0
 
  #LSBNAMES='-l'  # Uncomment for LSB name support in /etc/cron.d/
  #LSBNAMES='-l'  # Uncomment for LSB name support in /etc/cron.d/
 
  . /lib/lsb/init-functions
  . /lib/lsb/init-functions
 
  case "$1" in
  case "$1" in
  start)  log_daemon_msg "Starting periodic command scheduler" "crond"
  start)  log_daemon_msg "Starting periodic command scheduler" "crond"
Zeile 134: Zeile 136:
         log_end_msg $?
         log_end_msg $?
         ;;
         ;;
  restart) log_daemon_msg "Restarting periodic command scheduler" "crond"  
  restart) log_daemon_msg "Restarting periodic command scheduler" "crond"
         start-stop-daemon --stop --retry 5 --quiet --pidfile /var/run/crond.pid --name cron
         start-stop-daemon --stop --retry 5 --quiet --pidfile /var/run/crond.pid --name cron
         start-stop-daemon --start --quiet --pidfile /var/run/crond.pid --name cron --startas /usr/sbin/cron -- $LSBNAMES
         start-stop-daemon --start --quiet --pidfile /var/run/crond.pid --name cron --startas /usr/sbin/cron -- $LSBNAMES
Zeile 154: Zeile 156:
  # cron is a standard UNIX program that runs user-specified programs at
  # cron is a standard UNIX program that runs user-specified programs at
  # periodic scheduled times
  # periodic scheduled times
 
  description    "regular background program processing daemon"  
  description    "regular background program processing daemon"
 
  start on runlevel [2345]
  start on runlevel [2345]
  stop on runlevel [!2345]  
  stop on runlevel [!2345]
 
  expect fork
  expect fork
  respawn
  respawn
 
  exec cron
  exec cron


Zeile 168: Zeile 170:
  [Unit]
  [Unit]
   Description=Periodic Command Scheduler
   Description=Periodic Command Scheduler
 
 
  [Service]
  [Service]
   ExecStart=/usr/sbin/crond -n
   ExecStart=/usr/sbin/crond -n
   ExecReload=/bin/kill -HUP $MAINPID
   ExecReload=/bin/kill -HUP $MAINPID
   Restart=always
   Restart=always
 
 
  [Install]
  [Install]
   WantedBy=multi-user.target  
   WantedBy=multi-user.target
Grundlegend machen alle drei Varianten das Gleiche. Jedoch ist es bei SysVinit nicht ganz so einfach zu sehen, was genau passiert. Cron ist in diesem Fall ein sehr einfaches Beispiel, Dienste wie zum Beispiel [http://wiki.ubuntuusers.de/postfix postfix] haben wesentlich komplexere Init-Skripte, wohingegen die Komplexität von upstart Jobs oder systemd Units nur unwesentlich zunimmt.


Der upstart-Job wäre, wenn er in /etc/init liegt, schon direkt aktiviert und würde beim Starten des Systems abgearbeitet werden. SysVinit und systemd erfordern hierzu Links in <tt>/etc/rcX.d</tt> (Debian/Ubuntu) beziehungsweise <tt>/etc/systemd/system</tt>.  
=== Zusammenfassung ===
* Grundlegend machen alle drei Varianten das Gleiche
* Jedoch ist es bei SysVinit nicht ganz so einfach zu sehen, was genau passiert
* Cron ist in diesem Fall ein sehr einfaches Beispiel, Dienste wie zum Beispiel [http://wiki.ubuntuusers.de/postfix postfix] haben wesentlich komplexere Init-Skripte, wohingegen die Komplexität von upstart Jobs oder systemd Units nur unwesentlich zunimmt
* Der upstart-Job wäre, wenn er in /etc/init liegt, schon direkt aktiviert und würde beim Starten des Systems abgearbeitet werden
* SysVinit und systemd erfordern hierzu Links in <tt>/etc/rcX.d</tt> (Debian/Ubuntu) beziehungsweise <tt>/etc/systemd/system</tt>
* Zur Verwaltung dieser Links gibt es auf einem Debian oder Ubuntu System das Tool update-rc.d
* Für systemd gibt es <tt>systemctl enable dienst.service</tt>, welches sich um das Anlegen des Links kümmert
* Im systemd-Unit wurde hier übrigens definiert, dass cron.service zum Target multi-user.target gehört, das entspricht einem Mehrbenutzerrunlevel im normalen SysVinit ohne grafische Oberfläche
* Wer jetzt glaubt im grafischen Modus (mit [http://wiki.ubuntuusers.de/GDM GDM], [http://wiki.ubuntuusers.de/KDM KDM], ...) keinen cron haben zu können, irrt:
** Targets können von anderen Targets abhängen und so definiert beispielsweise graphical.target – welches bei den meisten Distributionen der Standard ist – dass doch bitte zuerst multi-user.target gestartet werden möchte
* Die ''WantedBy'' Definition ist übrigens nur ein Vorschlag für systemctl
* Es ist jederzeit möglich durch eigene Symlinks unterhalb von /etc/systemd/system/ das Verhalten und die Reihenfolge zu modifizieren
* Unabhängig davon werden jedoch andere Abhängigkeiten der einzelnen Units beachtet
* Dies führt zum Beispiel immer dazu, dass Avahi gestartet wird, wenn ein Dienst diesen benötigt, unabhängig davon, in welchem Target der Dienst gestartet wird


Zur Verwaltung dieser Links gibt es auf einem Debian oder Ubuntu System das Tool update-rc.d. Für systemd gibt es <tt>systemctl enable dienst.service</tt>, welches sich um das Anlegen des Links kümmert. Im systemd-Unit wurde hier übrigens definiert, dass cron.service zum Target multi-user.target gehört, das entspricht einem Mehrbenutzerrunlevel im normalen SysVinit ohne grafische Oberfläche.
<noinclude>


Wer jetzt glaubt im grafischen Modus (mit [http://wiki.ubuntuusers.de/GDM GDM], [http://wiki.ubuntuusers.de/KDM KDM], ...) keinen cron haben zu können, irrt: Targets können von anderen Targets abhängen und so definiert beispielsweise graphical.target – welches bei den meisten Distributionen der Standard ist – dass doch bitte zuerst multi-user.target gestartet werden möchte.
== Anhang ==
=== Siehe auch ===
{{Special:PrefixIndex/{{BASEPAGENAME}}}}
==== Links ====
===== Weblinks =====


Die ''WantedBy'' Definition ist übrigens nur ein Vorschlag für systemctl.
[[Kategorie:Linux/Dienst]]
[[Kategorie:Linux/Systemstart]]
[[Kategorie:systemd]]


Es ist jederzeit möglich durch eigene Symlinks unterhalb von /etc/systemd/system/ das Verhalten und die Reihenfolge zu modifizieren. Unabhängig davon werden jedoch andere Abhängigkeiten der einzelnen Units beachtet.


Dies führt zum Beispiel immer dazu, dass Avahi gestartet wird, wenn ein Dienst diesen benötigt, unabhängig davon, in welchem Target der Dienst gestartet wird.
</noinclude>

Aktuelle Version vom 24. November 2024, 14:55 Uhr

Init-Systeme

Beschreibung

Beim Starten eines Rechners geschehen viele Dinge

BIOS
  • Für viele ist bekannt, dass zuerst das sogenannte BIOS gestartet wird
  • Auf neueren Systemen kommt hingegen UEFI zum Einsatz
  • Beide sind zum Erkennen der installierten Hardware notwendig
Bootloader

Nach diesem Schritt wird der Bootloader gestartet, in der Regel ist GRUB 2 in Gebrauch

Kernel
Init

Nachdem auch dieser Vorgang abgeschlossen ist, folgt der Start des ersten „richtigen“ Prozesses auf einem Unix-System: Das Init-System

  • Aufgabe dieses Init-Systems ist es, das System für den Benutzer in einen brauchbaren und definierten Zustand zu überführen:
  • Ohne dieses würde man nur auf einer Shell sitzen, bei welcher die Übersetzung, Uhrzeit, Netzwerk oder viele andere Sachen fehlen würde
  • Auch ein Mehrbenutzerbetrieb wäre – mangels gestarteter Dienste hierzu – nicht möglich
  • Um diesen definierten Zustand zu erreichen, folgt dieses Init-System bestimmten Regeln, welche beim gängigen SysVinit in Shellskripte niedergeschrieben sind
  • Dazu kommen noch einige Konfigurationsdateien der vielen Dienste, welche man heute auf einem modernen System vorfindet

Entwicklung

Im Laufe der Entwicklung hin zu modernen Unix-Systemen wurde vieles an grundlegender Software immer wieder modernisiert, dazu gehört auch das Init-System, welches für das Starten von Prozessen verantwortlich ist

SysVinit

  • SysVinit ist ein sehr altes System zum Starten von Diensten, denn als Grundlage dient ein Design von 1983
  • Daher gibt es weder Abhängigkeiten, noch Events und so wird dieses System modernen Desktops und Notebooks nicht mehr gerecht
  • Dienste werden hier strikt der Reihe nach gestartet, unabhängig davon, ob diese parallel gestartet werden könnten
  • SysVinit setzt auf viele Skripte, welche in weiten Teilen ähnliche oder sogar gleiche Aufgaben erledigen
  • Häufig benutzte Funktionen wurden aber mit der Zeit auf gemeinsam genutzte Skripte (Includes) ausgelagert, um zumindest im Ansatz dem DRY-Prinzip zu entsprechen
  • Die Skripte können je nach Distribution an unterschiedlichen Orten, zum Beispiel /etc/rc.d oder /etc/init.d, liegen, und auch die Aktivierung und Deaktivierung von Diensten kann abhängig von der Distribution unterschiedlich erfolgen – zum Beispiel durch symbolische Links in /etc/rcX.d oder einem Eintrag in der /etc/rc.conf
  • Für SysVinit ist es nicht zuverlässig möglich, Dienste sauber zu beenden
  • In der Regel wird das Skript entweder einen Prozess anhand seiner gespeicherten Prozess-ID beenden oder aber mit killall alle in Frage kommenden Prozesse beenden
  • Ausnahme hiervon sind Dienste, welche eine eigene Logik zum Beenden haben
  • Ein bekannter Dienst welcher sich beispielsweise nicht sauber beenden lässt, wäre NRPE, der für Monitoring über Nagios oder Icinga benötigt wird

Upstart

Upstart ist eine relativ neue Entwicklung eines Init-Systems

  • Im Gegensatz zu dem nachfolgend beschriebenen systemd, welches mit Abhängigkeiten arbeitet, wird hier alles über Events geregelt
  • Upstart ist der erste Schritt zur Vereinfachung der Init-Skripte, welche nun unter /etc/init liegen
  • Ein weiterer Unterschied ist, dass zum Deaktivieren eines Services die Events im Init-Skript deaktiviert werden müssen (bis Version 1.3)
  • systemd arbeitet hier wie auch schon SysVinit mit Symbolischen Verknüpfungen
  • Upstart greift bei weitem nicht so tief in ein vorhandenes System ein
  • Unter anderem wird auch nicht verlangt Konfigurationen über bestimmte, vorgegebene, Konfigurationsdateien zu erledigen
  • Die Dokumentation wurde vor allem in den letzten Versionen stark ausgebaut
  • Dies war früher ein häufiger Kritikpunkt
  • Upstart wurde neben Ubuntu auch eine Zeit lang von anderen Distributionen wie zum Beispiel Fedora verwendet
  • Viele Entwickler sind aber nicht bereit an Upstart mitzuentwickeln, da Canonical hierzu eine Beitragszustimmung verlangt

OpenRC

Neben systemd, SysVinit und Upstart gibt es auch noch OpenRC, welches häufig bei Gentoo-Systemen verwendet wird

  • OpenRC wird in diesem Artikel der Einfachheit halber nicht weiter beschrieben

Anwendung

Gängige Aktionen

Auf Links wie zum Beispiel start oder stop, welche die Distributionen oft verwenden, haben wir verzichtet

Aktionen im Vergleich
Aktion SysVinit upstart systemd
Dienst starten /etc/init.d/dienstname start initctl start dienstname systemctl start dienstname.service
Dienst aktivieren Symlink in rcX.d Manipulation Job oder Override File systemctl enable dienstname.service
Dienst neustarten /etc/init.d/dienstname restart initctl restart dienstname systemctl restart dienstname.service
Dienst ändern Modifikation des Init-Skripts Modifikation Job oder Override File Überschreiben des Distributorskripts in /etc
Runlevel ändern telinit runlevel telinit runlevel systemctl isolate runlevel.target

Auf den ersten Blick sind so kaum Vorteile ersichtlich, sehen wir uns dies aber mal etwas genauer an:

  1. SysVinit erfordert in jedem Skript eine bestimmte, aber unterschiedliche Logik zum Starten, Neustarten und Beenden des Dienstes
  2. Upstart erfodert zum Aktivieren/Deaktivieren eine Modifikation des Jobs
  3. Upstart erfordert zum Verändern eine Modifikation des Skriptes, welches der Distributor mitliefert. Etwas das normalerweise nur in Ausnahmefällen gemacht werden sollte! Ab Version 1.3 gibt es hierzu auch die Möglichkeit der sogenannten „Override Files“
  4. Weder SysVinit noch Upstart bieten eine zuverlässige Möglichkeit, um unabhängig von der aktuellen Position definiert ein bestimmtes Runlevel zu erreichen

Vergleich

Hierzu einen Dienst bei allen drei Systemen im Vergleich

Ausgewählt wurde hierzu cron, der auf den meisten Systemen zu finden ist

SysVinit

#!/bin/sh
# Start/stop the cron daemon
#
### BEGIN INIT INFO
# Provides:          cron
# Required-Start:    $syslog $time
# Required-Stop:     $syslog $time
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Regular background program processing daemon
# Description:       cron is a standard UNIX program that runs user-specified
#                    programs at periodic scheduled times. vixie cron adds a
#                    number of features to the basic UNIX cron, including better
#                    security and more powerful configuration options
### END INIT INFO
test -f /usr/sbin/cron || exit 0
#LSBNAMES='-l'  # Uncomment for LSB name support in /etc/cron.d/
. /lib/lsb/init-functions
case "$1" in
start)  log_daemon_msg "Starting periodic command scheduler" "crond"
        start-stop-daemon --start --quiet --pidfile /var/run/crond.pid --name cron --startas /usr/sbin/cron -- $LSBNAMES
        log_end_msg $?
        ;;
stop)   log_daemon_msg "Stopping periodic command scheduler" "crond"
        start-stop-daemon --stop --quiet --pidfile /var/run/crond.pid --name cron
        log_end_msg $?
        ;;
restart) log_daemon_msg "Restarting periodic command scheduler" "crond"
        start-stop-daemon --stop --retry 5 --quiet --pidfile /var/run/crond.pid --name cron
        start-stop-daemon --start --quiet --pidfile /var/run/crond.pid --name cron --startas /usr/sbin/cron -- $LSBNAMES
        log_end_msg $?
        ;;
reload|force-reload) log_daemon_msg "Reloading configuration files for periodic command scheduler" "crond"
        # cron reloads automatically
        log_end_msg 0
        ;;
*)      log_action_msg "Usage: /etc/init.d/cron {start|stop|restart|reload|force-reload}"
        exit 2
        ;;
esac
exit 0

Upstart

# cron - regular background program processing daemon
#
# cron is a standard UNIX program that runs user-specified programs at
# periodic scheduled times
description     "regular background program processing daemon"
start on runlevel [2345]
stop on runlevel [!2345]
expect fork
respawn
exec cron

systemd

[Unit]
 Description=Periodic Command Scheduler
[Service]
 ExecStart=/usr/sbin/crond -n
 ExecReload=/bin/kill -HUP $MAINPID
 Restart=always
[Install]
 WantedBy=multi-user.target

Zusammenfassung

  • Grundlegend machen alle drei Varianten das Gleiche
  • Jedoch ist es bei SysVinit nicht ganz so einfach zu sehen, was genau passiert
  • Cron ist in diesem Fall ein sehr einfaches Beispiel, Dienste wie zum Beispiel postfix haben wesentlich komplexere Init-Skripte, wohingegen die Komplexität von upstart Jobs oder systemd Units nur unwesentlich zunimmt
  • Der upstart-Job wäre, wenn er in /etc/init liegt, schon direkt aktiviert und würde beim Starten des Systems abgearbeitet werden
  • SysVinit und systemd erfordern hierzu Links in /etc/rcX.d (Debian/Ubuntu) beziehungsweise /etc/systemd/system
  • Zur Verwaltung dieser Links gibt es auf einem Debian oder Ubuntu System das Tool update-rc.d
  • Für systemd gibt es systemctl enable dienst.service, welches sich um das Anlegen des Links kümmert
  • Im systemd-Unit wurde hier übrigens definiert, dass cron.service zum Target multi-user.target gehört, das entspricht einem Mehrbenutzerrunlevel im normalen SysVinit ohne grafische Oberfläche
  • Wer jetzt glaubt im grafischen Modus (mit GDM, KDM, ...) keinen cron haben zu können, irrt:
    • Targets können von anderen Targets abhängen und so definiert beispielsweise graphical.target – welches bei den meisten Distributionen der Standard ist – dass doch bitte zuerst multi-user.target gestartet werden möchte
  • Die WantedBy Definition ist übrigens nur ein Vorschlag für systemctl
  • Es ist jederzeit möglich durch eigene Symlinks unterhalb von /etc/systemd/system/ das Verhalten und die Reihenfolge zu modifizieren
  • Unabhängig davon werden jedoch andere Abhängigkeiten der einzelnen Units beachtet
  • Dies führt zum Beispiel immer dazu, dass Avahi gestartet wird, wenn ein Dienst diesen benötigt, unabhängig davon, in welchem Target der Dienst gestartet wird


Anhang

Siehe auch

Links

Weblinks