Nächste: , Vorige: , Nach oben: Dienste definieren   [Inhalt][Index]


12.18.2 Diensttypen und Dienste

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:

  1. Ein Name, der nur dazu da ist, dass man leichter die Abläufe verstehen und Fehler suchen kann.
  2. Eine Liste von Diensterweiterungen („service extensions“). Jede Erweiterung gibt den Ziel-Diensttyp an sowie eine Prozedur, die für gegebene Parameter für den Dienst eine Liste von Objekten zurückliefert, um den Dienst dieses Typs zu erweitern.

    Jeder Diensttyp benutzt mindestens eine Diensterweiterung. Die einzige Ausnahme ist der boot service type, der die Grundlage aller Dienste ist.

  3. Optional kann ein Vorgabewert für Instanzen dieses Typs angegeben werden.

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:

(service guix-service-type)

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]