Baptiste Daroussin, lid van het FreeBSD Core Team en auteur van de pakketbeheerder pkg, ontwikkelt een nieuwe systeembeheerder voor FreeBSD ā rcd. De systeembeheerder rcd wordt aangeroepen door het init-proces in plaats van /etc/rc, leest configuratiebestanden van services (/etc/rcd.d/*.ucl), bouwt een afhankelijkheidsstructuur en start de services waar mogelijk parallel. Vervolgens houdt hij toezicht op de werking van de services en start ze opnieuw op indien nodig.
Beheer van achtergrondprocessen en handelingen met services kan worden uitgevoerd via directe commando-overdracht naar een UNIX-socket of met behulp van de commandoregeltool rctl. Unit-bestanden met serviceparameters zijn opgesteld in het UCL-formaat, wat lijkt op het configuratieformaat van nginx en bind, met elementen voor vereenvoudigde geautomatiseerde verwerking, overgenomen uit JSON. Er is de mogelijkheid om templates voor standaard unit-bestanden te maken en ingebouwde handlers te schrijven in de programmeertaal Lua. Voorbeeld van een unit-bestand voor het starten van 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"; }; }
In plaats van te werken met PID-bestanden, wordt de activiteit van draaiende processen gevolgd met behulp van descriptoren die worden teruggegeven door de systeemaanroep pdfork(). Er is ondersteuning voor het activeren van services alleen bij toegang tot de netwerksocket en de mogelijkheid om belangrijke services te beschermen tegen gedwongen beƫindiging in geval van geheugen tekort in het systeem. Het is mogelijk om de achtergrondprocess versie van rcd real-time bij te werken zonder verlies van status.
Voor het beperken van de beschikbare bronnen aan de service wordt rctl gebruikt, en voor volledige isolatie van services is het mogelijk om ze in jail-omgevingen te starten. Toegang tot de beheerserver UNIX-socket kan worden ingesteld gekoppeld aan specifieke services. Er is ondersteuning voor de slaapstand.
De systeembeheerder is volledig terugwaarts compatibel met het bestaande systeem voor het sequentieel opstarten van services, rc.d, en kan werken zonder wijzigingen aan de huidige rc.d-scripts en configuratiebestanden. Het is voldoende om rcd op een werkende systeem te installeren en na een herstart zal alles blijven functioneren zoals voorheen, met uitzondering van de verkorte opstarttijd door het parallel opstarten van services. Deze compatibiliteit vergemakkelijkt de migratie van systemen naar rcd en maakt het mogelijk om geleidelijk de bestaande rc.d-scripts om te zetten naar unit-bestanden.
Voor compatibiliteit met rc.d wordt een speciaal type unit "legacy" ondersteund. Rcd scant de inhoud van /etc/rc.d/ en /usr/local/etc/rc.d/, analyseert de headers PROVIDE/REQUIRE/BEFORE/KEYWORD in de scripts, leest de instellingen uit rc.conf en bepaalt de opstartstatus van de scripts, waarna elk script wordt behandeld als een virtuele legacy unit. Bij het gebruik van het commando rcctl om met dergelijke virtuele units te werken, worden de bewerkingen vertaald naar het oude formaat; bijvoorbeeld, het uitvoeren van "rcctl reload sshd" zal leiden tot " /etc/rc.d/sshd reload".
Bron: opennet.ru
