Nächste: Service-Referenz, Vorige: Dienstkompositionen, Nach oben: Dienste definieren [Inhalt][Index]
Ein Diensttyp („service type“) ist ein Knoten im oben beschriebenen
ungerichteten azyklischen Graphen (DAG). Fangen wir an mit einem einfachen
Beispiel: dem Diensttyp für den Guix-Erstellungsdaemon (siehe Aufruf von guix-daemon
):
(define guix-service-type
(service-type
(name 'guix)
(extensions
(list (service-extension shepherd-root-service-type guix-shepherd-service)
(service-extension account-service-type guix-accounts)
(service-extension activation-service-type guix-activation)))
(default-value (guix-configuration))))
Damit sind drei Dinge definiert:
Jeder Diensttyp benutzt mindestens eine Diensterweiterung. Die einzige Ausnahme ist der boot service type, der die Grundlage aller Dienste ist.
In diesem Beispiel werden durch guix-service-type
drei Dienste
erweitert:
shepherd-root-service-type
Die Prozedur guix-shepherd-service
definiert, wie der Shepherd-Dienst
erweitert wird, und zwar liefert sie ein <shepherd-service>
-Objekt,
womit definiert wird, wie der guix-daemon
gestartet und gestoppt
werden kann (siehe Shepherd-Dienste).
account-service-type
Diese Erweiterung des Dienstes wird durch guix-accounts
berechnet,
eine Prozedur, die eine Liste von user-group
- und
user-account
-Objekten liefert, die die Erstellungsbenutzerkonten
repräsentieren (siehe Aufruf von guix-daemon
).
activation-service-type
Hier ist guix-activation
eine Prozedur, die einen G-Ausdruck
liefert. Dieser ist ein Code-Schnipsel, das zur „Aktivierungszeit“
ausgeführt werden soll – z.B. wenn der Dienst hochgefahren wird.
Ein Dienst dieses Typs wird dann so instanziiert:
(service guix-service-type
(guix-configuration
(build-accounts 5)
(extra-options '("--gc-keep-derivations"))))
Das zweite Argument an die service
-Form ist ein Wert, der die
Parameter dieser bestimmten Dienstinstanz repräsentiert. Siehe
guix-configuration
für Informationen
über den guix-configuration
-Datentyp. Wird kein Wert angegeben, wird
die Vorgabe verwendet, die im guix-service-type
angegeben wurde:
guix-service-type
ist ziemlich einfach, weil es andere Dienste
erweitert, aber selbst nicht erweitert werden kann.
Der Diensttyp eines erweiterbaren Dienstes sieht ungefähr so aus:
(define udev-service-type
(service-type (name 'udev)
(extensions
(list (service-extension shepherd-root-service-type
udev-shepherd-service)))
(compose concatenate) ;Liste der Regeln zusammenfügen
(extend (lambda (config rules) ;Konfiguration und Regeln
(match config
(($ <udev-configuration> udev initial-rules)
(udev-configuration
(udev udev) ;zu benutzendes udev-Paket
(rules (append initial-rules rules)))))))))
Dies ist der Diensttyp für den
Geräteverwaltungsdaemon
eudev. Verglichen mit dem vorherigen Beispiel sehen wir neben einer
Erweiterung des shepherd-root-service-type
auch zwei neue Felder.
compose
Die Prozedur, um die Liste der jeweiligen Erweiterungen für den Dienst dieses Typs zu einem Objekt zusammenzustellen (zu „komponieren“, englisch compose).
Dienste können den udev-Dienst erweitern, indem sie eine Liste von Regeln („Rules“) an ihn übergeben; wir komponieren mehrere solche Erweiterungen, indem wir die Listen einfach zusammenfügen.
extend
Diese Prozedur definiert, wie der Wert des Dienstes um die Komposition mit Erweiterungen erweitert („extended“) werden kann.
Udev-Erweiterungen werden zu einer einzigen Liste von Regeln komponiert,
aber der Wert des udev-Dienstes ist ein
<udev-configuration>
-Verbundsobjekt. Deshalb erweitern wir diesen
Verbund, indem wir die Liste der von Erweiterungen beigetragenen Regeln an
die im Verbund gespeicherte Liste der Regeln anhängen.
description
Diese Zeichenkette gibt einen Überblick über den Systemtyp. Die Zeichenkette
darf mit Texinfo ausgezeichnet werden (siehe Overview in GNU
Texinfo). Der Befehl guix system search
durchsucht diese
Zeichenketten und zeigt sie an (siehe guix system
aufrufen).
Es kann nur eine Instanz eines erweiterbaren Diensttyps wie
udev-service-type
geben. Wenn es mehrere gäbe, wäre es mehrdeutig,
welcher Dienst durch die service-extension
erweitert werden soll.
Sind Sie noch da? Der nächste Abschnitt gibt Ihnen eine Referenz der Programmierschnittstelle für Dienste.
Nächste: Service-Referenz, Vorige: Dienstkompositionen, Nach oben: Dienste definieren [Inhalt][Index]