Startup
Wie geht die Diskstation in Betrieb (Startup)
Hier entsteht (noch lang nicht fertig) eine Seite über die Vorgänge mit der die Diskstation in Betrieb geht. Auf der Suche nach einem seltsamen Fehler in einem Startup-Script kam das Thema auf wie diese Scripte bei der Diskstation eigentlich ineinander greifen. Das läuft teilweise deutlich anders als man es vom Desktop-PC gewöhnt ist und ist IMHO eine eigene Seite in diesem Wiki wert.
Bootlader und Kernel
Der Bootlader ist ein Stück Code das in der Regel im Flash-Speicher des Systems liegt und nach dem Hardware-Reset vom Prozessor direkt angesprungen wird. Die Synology Diskstations verwenden einen PPCBoot-Bootlader. In den meisten Fällen in der Version 2.0.0 aber teilweise leider mit reduziertem Funktionsumfang. So wurde bei Geräten ab 2007 der saveenv
-Befehl abgestellt. Hauptaufgabe des Bootladers ist es den Kern des Betriebssystems zu laden und zu starten. Wer sich in die Thematik einlesen und ggf. seine Diskstation mal so richtig ummodeln möchte (VORSICHT Extrem-MOD) dem sei NetBSD auf Synology empfohlen.
Der Kern des Betriebssystems packt sich erst mal selbst aus falls er komprimiert vorliegt und fängt dann an den Speicher und alle andere Hardware zu initialisieren. Dieser Vorgang ist sehr umfangreich und komplex [1] aber für den Anwender einer Diskstation eigentlich nur in einem Punkt wirklich von Interesse. Der Kern startet nachdem er alle nötigen Initialisierungen an sich selbst durchgeführt hat genau einen Prozess --- den init
-Prozess.
Init
Dieser Prozess hat immer die Prozess-ID 1 und heißt /sbin/init
. Alle weiteren Prozesse (Applikationen oder Dämonen für Dienste o.Ä.) sind direkt oder indirekt Tochterprozesse von init
. Auf einem Desktop würde init
die Datei /etc/init.conf
bzw. Dateien im Verzeichnis /etc/init
lesen um zu erfahren welche weiteren Prozesse meist über Scripte zu starten sind. Ein Blick in /etc
zeigt dass es dort zwar ein Verzeichnis init.d
aber kein init
gibt. Auf der Diskstation wird der restliche Startvorgang vom /etc/rc
-Script übernommen.
/etc/rc die Mutter aller Startup-Scripte
Es initialisiert die Umgebungsvariablen HOME
und PATH
und sourced (siehe shell source Kommando) /etc/rc.subr
. Sourcen bedeute hier dass der Inhalt des anderen Scripts ausgeführt wird als stünde er direkt in dem aufrufenden Script (vgl. C #include). Auf diese Art kann man die doch nicht ganz so übersichtlichen Scripte besser strukturieren und Teile die ggf. in mehreren Scripten verwendbar sind zusammenfassen. In diesem Fall definiert /etc/rc.subr
ein paar Subroutinen die später in den weiteren Startup-Scripten verwendet werden können.
Da die Diskstation nicht im übichen Sinn über Run-Level verfügt aber man trotzdem etwas Ordnung halten muss wird in der Datei /tmp/boot_seq.tmp
eine Nummer als Startsequenz gehalten.
Sequenz 1: /etc/rc
Sequenz 1 markiert den Start von /etc/rc
auch wenn der genau genommen schon war. Die Root-Partition wird neu eingehängt (remount) damit Schreibzugriffe möglich werden.
noch zu schreiben
Sequenz 2: Check Filesystems
noch zu schreiben
Sequenz 3: Start Services
noch zu schreiben
Hier wird /etc/rc.local
aufgerufen.
/etc/rc.subr Hilfsfunktionen
Das Script führt selbst nichts aus sondern definiert wie der Name schon vermuten lässt ein paar Subroutinen die später in den weiteren Startup-Scripten verwendet werden können.
IfErrorThenExit()
Die Funktion wird mit drei Parametern aufgerufen IfErrorThenExit ErrorStage ErrorNum ErrorFile
mit den Vorgabewerten IfErrorThenExit "Unknown" "1" "/tmp/installer.error"
. Ist die Fehlernummer größer 0 so wird der Fehlername zusammen mit der Nummer in eine Datei geschrieben und mit der Fehlernummer als Rückgabewert abgebrochen. Ruf man die Funktion also mit leeren Parameter auf schreibt sie Unknown:1
in die Datei /tmp/installer.error
und führt eine exit 1
aus.
CleanPartition()
noch zu schreiben
CreatePartition()
Partition erzeugen. noch zu schreiben
MkSwapRaid()
Liest aus /etc.defaults/synoinfo.conf
den Wert für maxdisks
und probiert dann für bis zu
8 oder maximal maxdisks
Festplatten (/dev/sda
bis /dev/sdh
) ob sie existieren. Danach wird mdadm mit der Liste der gefundenen Platten aufgerufen um das RAID-Device /dev/md1
zu erzeugen. Dieses Device wird anschließend mit mkswap
als Speicher zur Auslagerung verwendet.
/etc/rc.local
noch zu schreiben