Startup

Aus

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