Baptiste Daroussin, Mitglied des FreeBSD Core Teams und Autor des Paketmanagers pkg, entwickelt mit rcd einen neuen Systemmanager fĂŒr FreeBSD. Der Systemmanager rcd wird vom init-Prozess anstelle von /etc/rc aufgerufen, liest die Konfigurationsdateien der Dienste (/etc/rcd.d/*.ucl), erstellt einen AbhĂ€ngigkeitsbaum und startet die Dienste, wenn möglich, parallel zueinander. AnschlieĂend ĂŒberwacht er deren Betrieb und startet sie bei Bedarf neu.
Die Verwaltung des Hintergrundprozesses und Service-Operationen können durch die direkte Ăbergabe von Befehlen an einen UNIX-Socket oder mithilfe des Kommandozeilenwerkzeugs rctl erfolgen. Unit-Dateien mit Service-Parametern werden im UCL-Format definiert, das an die Konfigurationsdateien von nginx und bind erinnert und Elemente aus JSON fĂŒr eine vereinfachte automatisierte Verarbeitung ĂŒbernimmt. Es besteht die Möglichkeit, Vorlagen fĂŒr typische Unit-Dateien zu erstellen und integrierte Handler in Lua zu schreiben. Beispiel einer Unit-Datei zum Starten von nginx: name = «nginx»; description = «Nginx HTTP Server»; type = «simple»; command = «/usr/local/sbin/nginx»; command_args = «-g âdaemon off;'»; provides = [«nginx», «http»]; requires = [«NETWORKING», «sshd»]; restart { policy = «always»; max_retries = 10; delay = 2000; backoff = «linear»; } process { user = «www»; group = «www»; cpuset = «0-3»; } rctl { memoryuse = { action = «deny»; amount = «2g»; }; pcpu = { action = «throttle»; amount = «80»; }; }
Anstelle der Arbeit mit PID-Dateien wird die AktivitĂ€t laufender Prozesse mithilfe von Deskriptoren ĂŒberwacht, die vom Systemaufruf pdfork() zurĂŒckgegeben werden. UnterstĂŒtzt wird auĂerdem die Aktivierung von Diensten nur bei Zugriff auf einen Netzwerk-Socket sowie der Schutz wichtiger Dienste vor einem erzwungenen Beenden bei Speichermangel im System. DarĂŒber hinaus kann die Version des Hintergrundprozesses rcd im laufenden Betrieb aktualisiert werden, ohne dass dabei der Status verloren geht.
Zur Begrenzung der einem Dienst verfĂŒgbaren Ressourcen wird rctl eingesetzt, und fĂŒr eine vollstĂ€ndige Isolation der Dienste wird deren AusfĂŒhrung in jail-Umgebungen unterstĂŒtzt. Zudem lĂ€sst sich der Zugriff auf den steuernden UNIX-Socket einzelnen Diensten gezielt zuweisen. Der Wechsel in den Ruhemodus wird ebenfalls unterstĂŒtzt.
Der Systemmanager ist vollstĂ€ndig abwĂ€rtskompatibel zum bestehenden rc.d-System fĂŒr den sequentiellen Start von Diensten und kann ohne Ănderungen an vorhandenen rc.d-Skripten und Konfigurationsdateien eingesetzt werden. Es genĂŒgt, rcd auf einem laufenden System zu installieren, und nach dem Neustart funktioniert weiterhin alles wie bisher â mit dem Unterschied, dass sich die Bootzeit durch den parallelisierten Start der Dienste verkĂŒrzt. Diese KompatibilitĂ€t erleichtert die Migration von Systemen auf rcd und ermöglicht es, vorhandene rc.d-Skripte schrittweise in das Format von Unit-Dateien zu ĂŒberfĂŒhren.
Zur KompatibilitĂ€t mit rc.d wird ein spezieller Unit-Typ namens âlegacyâ unterstĂŒtzt. Rcd scannt den Inhalt von /etc/rc.d/ und /usr/local/etc/rc.d/, analysiert die Header PROVIDE/REQUIRE/BEFORE/KEYWORD in den Skripten, liest die Einstellungen aus rc.conf und ermittelt den Startstatus der Skripte. AnschlieĂend wird jedes Skript als virtuelle Legacy-Unit verarbeitet. Wird der Befehl rcctl zur Verwaltung solcher virtuellen Units verwendet, werden die Operationen in das alte Format ĂŒbersetzt. So fĂŒhrt beispielsweise ârcctl reload sshdâ zur AusfĂŒhrung von â/etc/rc.d/sshd reloadâ.
Quelle: opennet.ru
