This is guix.de.info, produced by makeinfo version 6.7 from
guix.de.texi.

Copyright © 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021
Ludovic Courtès
Copyright © 2013, 2014, 2016 Andreas Enge
Copyright © 2013 Nikita Karetnikov
Copyright © 2014, 2015, 2016 Alex Kost
Copyright © 2015, 2016 Mathieu Lirzin
Copyright © 2014 Pierre-Antoine Rault
Copyright © 2015 Taylan Ulrich Bayırlı/Kammer
Copyright © 2015, 2016, 2017, 2019, 2020, 2021 Leo Famulari
Copyright © 2015, 2016, 2017, 2018, 2019, 2020 Ricardo Wurmus
Copyright © 2016 Ben Woodcroft
Copyright © 2016, 2017, 2018, 2021 Chris Marusich
Copyright © 2016, 2017, 2018, 2019, 2020, 2021 Efraim Flashner
Copyright © 2016 John Darrington
Copyright © 2016, 2017 Nikita Gillmann
Copyright © 2016, 2017, 2018, 2019, 2020 Jan Nieuwenhuizen
Copyright © 2016, 2017, 2018, 2019, 2020 Julien Lepiller
Copyright © 2016 Alex ter Weele
Copyright © 2016, 2017, 2018, 2019, 2020, 2021 Christopher Baines
Copyright © 2017, 2018, 2019 Clément Lassieur
Copyright © 2017, 2018, 2020, 2021 Mathieu Othacehe
Copyright © 2017 Federico Beffa
Copyright © 2017, 2018 Carlo Zancanaro
Copyright © 2017 Thomas Danckaert
Copyright © 2017 humanitiesNerd
Copyright © 2017, 2021 Christopher Lemmer Webber
Copyright © 2017, 2018, 2019, 2020 Marius Bakke
Copyright © 2017, 2019, 2020 Hartmut Goebel
Copyright © 2017, 2019, 2020, 2021 Maxim Cournoyer
Copyright © 2017, 2018, 2019, 2020, 2021 Tobias Geerinckx-Rice
Copyright © 2017 George Clemmer
Copyright © 2017 Andy Wingo
Copyright © 2017, 2018, 2019, 2020 Arun Isaac
Copyright © 2017 nee
Copyright © 2018 Rutger Helling
Copyright © 2018, 2021 Oleg Pykhalov
Copyright © 2018 Mike Gerwitz
Copyright © 2018 Pierre-Antoine Rouby
Copyright © 2018, 2019 Gábor Boskovits
Copyright © 2018, 2019, 2020 Florian Pelz
Copyright © 2018 Laura Lazzati
Copyright © 2018 Alex Vong
Copyright © 2019 Josh Holland
Copyright © 2019, 2020 Diego Nicola Barbato
Copyright © 2019 Ivan Petkov
Copyright © 2019 Jakob L. Kreuze
Copyright © 2019 Kyle Andrews
Copyright © 2019 Alex Griffin
Copyright © 2019, 2020 Guillaume Le Vaillant
Copyright © 2020 Leo Prikler
Copyright © 2019, 2020 Simon Tournier
Copyright © 2020 Wiktor Żelazny
Copyright © 2020 Damien Cassou
Copyright © 2020 Jakub Kądziołka
Copyright © 2020 Jack Hill
Copyright © 2020 Naga Malleswari
Copyright © 2020 Brice Waegeneire
Copyright © 2020 R Veera Kumar
Copyright © 2020 Pierre Langlois
Copyright © 2020 pinoaffe
Copyright © 2020 André Batista
Copyright © 2020, 2021 Alexandru-Sergiu Marton
Copyright © 2020 raingloom
Copyright © 2020 Daniel Brooks
Copyright © 2020 John Soo
Copyright © 2020 Jonathan Brielmaier
Copyright © 2020 Edgar Vincent
Copyright © 2021 Maxime Devos

   Es ist Ihnen gestattet, dieses Dokument zu vervielfältigen,
weiterzugeben und/oder zu verändern, unter den Bedingungen der GNU Free
Documentation License, entweder gemäß Version 1.3 der Lizenz oder (nach
Ihrer Option) einer späteren Version, die von der Free Software
Foundation veröffentlicht wurde, ohne unveränderliche Abschnitte, ohne
vorderen Umschlagtext und ohne hinteren Umschlagtext. Eine Kopie der
Lizenz finden Sie im Abschnitt mit dem Titel „GNU Free Documentation
License“.
INFO-DIR-SECTION Systemadministration
START-INFO-DIR-ENTRY
* Guix: (guix.de).           Installierte Software und Systemkonfigurationen
                               verwalten.
* guix package: (guix.de)guix package aufrufen.  Pakete installieren,
                                                   entfernen und
                                                   aktualisieren.
* guix gc: (guix.de)guix gc aufrufen.  Unbenutzten Plattenspeicher wieder
                                         freigeben.
* guix pull: (guix.de)guix pull aufrufen.  Die Liste verfügbarer Pakete
                                             aktualisieren.
* guix system: (guix.de)guix system aufrufen.  Die
                                                 Betriebssystemkonfiguration
                                                 verwalten.
* guix deploy: (guix.de)guix deploy aufrufen.  Betriebssystemkonfigurationen
                                                 entfernter Rechner verwalten.
END-INFO-DIR-ENTRY

INFO-DIR-SECTION Softwareentwicklung
START-INFO-DIR-ENTRY
* guix environment: (guix.de)guix environment aufrufen.  Umgebungen für
                                                           Entwickler
                                                           erstellen
* guix build: (guix.de)guix build aufrufen.  Erstellen von Paketen.
* guix pack: (guix.de)guix pack aufrufen.  Bündel aus Binärdateien
                                             erstellen.
END-INFO-DIR-ENTRY


File: guix.de.info,  Node: Aufruf von guix challenge,  Next: Aufruf von guix copy,  Prev: Aufruf von guix publish,  Up: Zubehör

9.11 ‘guix challenge’ aufrufen
==============================

Entsprechen die von diesem Server gelieferten Binärdateien tatsächlich
dem Quellcode, aus dem sie angeblich erzeugt wurden? Ist ein
Paketerstellungsprozess deterministisch? Diese Fragen versucht ‘guix
challenge’ zu beantworten.

   Die erste Frage ist offensichtlich wichtig: Bevor man einen
Substitutserver benutzt (siehe *note Substitute::), _verifiziert_ man
besser, dass er die richtigen Binärdateien liefert, d.h. man _fechtet
sie an_. Die letzte Frage macht die erste möglich: Wenn
Paketerstellungen deterministisch sind, müssten voneinander unabhängige
Erstellungen genau dasselbe Ergebnis liefern, Bit für Bit; wenn ein
Server mit einer anderen Binärdatei als der lokal erstellten Binärdatei
antwortet, ist diese entweder beschädigt oder bösartig.

   Wir wissen, dass die in ‘/gnu/store’-Dateinamen auftauchende
Hash-Prüfsumme der Hash aller Eingaben des Prozesses ist, mit dem die
Datei oder das Verzeichnis erstellt wurde — Compiler, Bibliotheken,
Erstellungsskripts und so weiter (siehe *note Einführung::). Wenn wir
von deterministischen Erstellungen ausgehen, sollte ein Store-Dateiname
also auf genau eine Erstellungsausgabe abgebildet werden. Mit ‘guix
challenge’ prüft man, ob es tatsächlich eine eindeutige Abbildung gibt,
indem die Erstellungsausgaben mehrerer unabhängiger Erstellungen jedes
angegebenen Store-Objekts verglichen werden.

   Die Ausgabe des Befehls sieht so aus:

     $ guix challenge --substitute-urls="https://ci.guix.gnu.org https://guix.example.org"
     Liste der Substitute von „https://ci.guix.gnu.org“ wird aktualisiert … 100.0%
     Liste der Substitute von „https://guix.example.org“ wird aktualisiert … 100.0%
     Inhalt von /gnu/store/…-openssl-1.0.2d verschieden:
       lokale Prüfsumme: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
       https://ci.guix.gnu.org/nar/…-openssl-1.0.2d: 0725l22r5jnzazaacncwsvp9kgf42266ayyp814v7djxs7nk963q
       https://guix.example.org/nar/…-openssl-1.0.2d: 1zy4fmaaqcnjrzzajkdn3f5gmjk754b43qkq47llbyak9z0qjyim
       Diese Dateien unterscheiden sich:
         /lib/libcrypto.so.1.1
         /lib/libssl.so.1.1

     Inhalt von /gnu/store/…-git-2.5.0 verschieden:
       lokale Prüfsumme: 00p3bmryhjxrhpn2gxs2fy0a15lnip05l97205pgbk5ra395hyha
       https://ci.guix.gnu.org/nar/…-git-2.5.0: 069nb85bv4d4a6slrwjdy8v1cn4cwspm3kdbmyb81d6zckj3nq9f
       https://guix.example.org/nar/…-git-2.5.0: 0mdqa9w1p6cmli6976v4wi0sw9r4p5prkj7lzfd1877wk11c9c73
       Diese Datei unterscheidet sich:
         /libexec/git-core/git-fsck

     Inhalt von /gnu/store/…-pius-2.1.1 verschieden:
       lokale Prüfsumme: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax
       https://ci.guix.gnu.org/nar/…-pius-2.1.1: 0k4v3m9z1zp8xzzizb7d8kjj72f9172xv078sq4wl73vnq9ig3ax
       https://guix.example.org/nar/…-pius-2.1.1: 1cy25x1a4fzq5rk0pmvc8xhwyffnqz95h2bpvqsz2mpvlbccy0gs
       Diese Datei unterscheidet sich:
         /share/man/man1/pius.1.gz

     …

     6,406 Store-Objekte wurden analysiert:
       — 4,749 (74.1%) waren identisch
       — 525 (8.2%) unterscheiden sich
       — 1,132 (17.7%) blieben ergebnislos

In diesem Beispiel wird mit ‘guix challenge’ zuerst die Menge lokal
erstellter Ableitungen im Store ermittelt — im Gegensatz zu von einem
Substitserver heruntergeladenen Store-Objekten — und dann werden alle
Substitutserver angefragt. Diejenigen Store-Objekte, bei denen der
Server ein anderes Ergebnis berechnet hat als die lokale Erstellung,
werden gemeldet.

   Nehmen wir zum Beispiel an, ‘guix.example.org’ gibt uns immer eine
verschiedene Antwort, aber ‘ci.guix.gnu.org’ stimmt mit lokalen
Erstellungen überein, _außer_ im Fall von Git. Das könnte ein Hinweis
sein, dass der Erstellungsprozess von Git nichtdeterministisch ist; das
bedeutet, seine Ausgabe variiert abhängig von verschiedenen Umständen,
die Guix nicht vollends kontrollieren kann, obwohl es Pakete in
isolierten Umgebungen erstellt (siehe *note Funktionalitäten::). Zu den
häufigsten Quellen von Nichtdeterminismus gehören das Einsetzen von
Zeitstempeln innerhalb der Erstellungsgebnisse, das Einsetzen von
Zufallszahlen und von Auflistungen eines Verzeichnisinhalts sortiert
nach der Inode-Nummer. Siehe <https://reproducible-builds.org/docs/> für
mehr Informationen.

   Um herauszufinden, was mit dieser Git-Binärdatei nicht stimmt, ist es
am leichtesten, einfach diesen Befehl auszuführen:

     guix challenge git \
       --diff=diffoscope \
       --substitute-urls="https://ci.guix.gnu.org https://guix.example.org"

   Dadurch wird ‘diffoscope’ automatisch aufgerufen, um detaillierte
Informationen über sich unterscheidende Dateien anzuzeigen.

   Alternativ können wir so etwas machen (siehe *note Aufruf von guix
archive::):

     $ wget -q -O - https://ci.guix.gnu.org/nar/lzip/…-git-2.5.0 \
        | lzip -d | guix archive -x /tmp/git
     $ diff -ur --no-dereference /gnu/store/…-git.2.5.0 /tmp/git

   Dieser Befehl zeigt die Unterschiede zwischen den Dateien, die sich
aus der lokalen Erstellung ergeben, und den Dateien, die sich aus der
Erstellung auf ‘ci.guix.gnu.org’ ergeben (siehe *note Dateien
vergleichen und zusammenführen: (diffutils)Overview.). Der Befehl ‘diff’
funktioniert großartig für Textdateien. Wenn sich Binärdateien
unterscheiden, ist Diffoscope (https://diffoscope.org/) die bessere
Wahl: Es ist ein hilfreiches Werkzeug, das Unterschiede in allen Arten
von Dateien visualisiert.

   Sobald Sie mit dieser Arbeit fertig sind, können Sie erkennen, ob die
Unterschiede aufgrund eines nichtdeterministischen Erstellungsprozesses
oder wegen einem bösartigen Server zustande kommen. Wir geben uns Mühe,
Quellen von Nichtdeterminismus in Paketen zu entfernen, damit Substitute
leichter verifiziert werden können, aber natürlich ist an diesem Prozess
nicht nur Guix, sondern ein großer Teil der Freie-Software-Gemeinschaft
beteiligt. In der Zwischenzeit ist ‘guix challenge’ eines der Werkzeuge,
die das Problem anzugehen helfen.

   Wenn Sie ein Paket für Guix schreiben, ermutigen wir Sie, zu
überprüfen, ob ‘ci.guix.gnu.org’ und andere Substitutserver dasselbe
Erstellungsergebnis bekommen, das Sie bekommen haben. Das geht so:

     $ guix challenge PAKET

Dabei wird mit PAKET eine Paketspezifikation wie ‘guile@2.0’ oder
‘glibc:debug’ bezeichnet.

   Die allgemeine Syntax lautet:

     guix challenge OPTIONEN [PAKETE…]

   Wird ein Unterschied zwischen der Hash-Prüfsumme des lokal erstellten
Objekts und dem vom Server gelieferten Substitut festgestellt, oder
zwischen den Substituten von unterschiedlichen Servern, dann wird der
Befehl dies wie im obigen Beispiel anzeigen und mit dem Exit-Code 2
terminieren (andere Exit-Codes außer null stehen für andere Arten von
Fehlern).

   Die eine, wichtige Befehlszeilenoption ist:

‘--substitute-urls=URLS’
     Die URLS als durch Leerraumzeichen getrennte Liste von
     Substitut-Quell-URLs benutzen. mit denen verglichen wird.

‘--diff=MODUS’
     Wenn sich Dateien unterscheiden, diese Unterschiede entsprechend
     dem MODUS anzeigen. Dieser kann einer der folgenden sein:

     ‘simple’ (die Vorgabe)
          Zeige die Liste sich unterscheidender Dateien.

     ‘diffoscope’
     BEFEHL
          Diffoscope (https://diffoscope.org/) aufrufen und ihm zwei
          Verzeichnisse mit verschiedenem Inhalt übergeben.

          Wenn der BEFEHL ein absoluter Dateiname ist, wird der BEFEHL
          anstelle von Diffoscope ausgeführt.

     ‘none’
          Keine näheren Details zu Unterschieden anzeigen.

     Solange kein ‘--diff=none’ angegeben wird, werden durch ‘guix
     challenge’ also Store-Objekte von den festgelegten Substitutservern
     heruntergeladen, damit diese verglichen werden können.

‘--verbose’
‘-v’
     Details auch zu Übereinstimmungen (deren Inhalt identisch ist)
     ausgeben, zusätzlich zu Informationen über Unterschiede.


File: guix.de.info,  Node: Aufruf von guix copy,  Next: Aufruf von guix container,  Prev: Aufruf von guix challenge,  Up: Zubehör

9.12 ‘guix copy’ aufrufen
=========================

Der Befehl ‘guix copy’ kopiert Objekte aus dem Store einer Maschine in
den Store einer anderen Maschine mittels einer Secure-Shell-Verbindung
(kurz SSH-Verbindung)(1). Zum Beispiel kopiert der folgende Befehl das
Paket ‘coreutils’, das Profil des Benutzers und all deren Abhängigkeiten
auf den anderen RECHNER, dazu meldet sich Guix als BENUTZER an:

     guix copy --to=BENUTZER@RECHNER \
               coreutils $(readlink -f ~/.guix-profile)

   Wenn manche der zu kopierenden Objekte schon auf dem anderen RECHNER
vorliegen, werden sie tatsächlich _nicht_ übertragen.

   Der folgende Befehl bezieht ‘libreoffice’ und ‘gimp’ von dem RECHNER,
vorausgesetzt sie sind dort verfügbar:

     guix copy --from=HOST libreoffice gimp

   Die SSH-Verbindung wird mit dem Guile-SSH-Client hergestellt, der mit
OpenSSH kompatibel ist: Er berücksichtigt ‘~/.ssh/known_hosts’ und
‘~/.ssh/config’ und verwendet den SSH-Agenten zur Authentifizierung.

   Der Schlüssel, mit dem gesendete Objekte signiert sind, muss von der
entfernten Maschine akzeptiert werden. Ebenso muss der Schlüssel, mit
dem die Objekte signiert sind, die Sie von der entfernten Maschine
empfangen, in Ihrer Datei ‘/etc/guix/acl’ eingetragen sein, damit Ihr
Daemon sie akzeptiert. Siehe *note Aufruf von guix archive:: für mehr
Informationen über die Authentifizierung von Store-Objekten.

   Die allgemeine Syntax lautet:

     guix copy [--to=SPEZIFIKATION|--from=SPEZIFIKATION] OBJEKTE…

   Sie müssen immer eine der folgenden Befehlszeilenoptionen angeben:

‘--to=SPEZIFIKATION’
‘--from=SPEZIFIKATION’
     Gibt den Rechner (den „Host“) an, an den oder von dem gesendet bzw.
     empfangen wird. Die SPEZIFIKATION muss eine SSH-Spezifikation sein
     wie ‘example.org’, ‘charlie@example.org’ oder
     ‘charlie@example.org:2222’.

   Die OBJEKTE können entweder Paketnamen wie ‘gimp’ oder Store-Objekte
wie ‘/gnu/store/…-idutils-4.6’ sein.

   Wenn ein zu sendendes Paket mit Namen angegeben wird, wird es erst
erstellt, falls es nicht im Store vorliegt, außer ‘--dry-run’ wurde
angegeben wurde. Alle gemeinsamen Erstellungsoptionen werden unterstützt
(siehe *note Gemeinsame Erstellungsoptionen::).

   ---------- Footnotes ----------

   (1) Dieser Befehl steht nur dann zur Verfügung, wenn Guile-SSH
gefunden werden kann. Siehe *note Voraussetzungen:: für Details.


File: guix.de.info,  Node: Aufruf von guix container,  Next: Aufruf von guix weather,  Prev: Aufruf von guix copy,  Up: Zubehör

9.13 ‘guix container’ aufrufen
==============================

     Anmerkung: Dieses Werkzeug ist noch experimentell, Stand Version
     1.3.0. Die Schnittstelle wird sich in Zukunft grundlegend
     verändern.

   Der Zweck von ‘guix container’ ist, in einer isolierten Umgebung
(gemeinhin als „Container“ bezeichnet) laufende Prozesse zu
manipulieren, die typischerweise durch die Befehle ‘guix environment’
(siehe *note Aufruf von guix environment::) und ‘guix system container’
(siehe *note Aufruf von guix system::) erzeugt werden.

   Die allgemeine Syntax lautet:

     guix container AKTION OPTIONEN…

   Mit AKTION wird die Operation angegeben, die in der isolierten
Umgebung durchgeführt werden soll, und mit OPTIONEN werden die
kontextabhängigen Argumente an die Aktion angegeben.

   Folgende Aktionen sind verfügbar:

‘exec’
     Führt einen Befehl im Kontext der laufenden isolierten Umgebung
     aus.

     Die Syntax ist:

          guix container exec PID PROGRAMM ARGUMENTE…

     PID gibt die Prozess-ID der laufenden isolierten Umgebung an. Als
     PROGRAMM muss eine ausführbare Datei im Wurzeldateisystem der
     isolierten Umgebung angegeben werden. Die ARGUMENTE sind die
     zusätzlichen Befehlszeilenoptionen, die an das PROGRAMM übergeben
     werden.

     Der folgende Befehl startet eine interaktive Anmelde-Shell
     innerhalb einer isolierten Guix-Systemumgebung, gestartet durch
     ‘guix system container’, dessen Prozess-ID 9001 ist:

          guix container exec 9001 /run/current-system/profile/bin/bash --login

     Beachten Sie, dass die PID nicht der Elternprozess der isolierten
     Umgebung sein darf, sondern PID 1 in der isolierten Umgebung oder
     einer seiner Kindprozesse sein muss.


File: guix.de.info,  Node: Aufruf von guix weather,  Next: Aufruf von guix processes,  Prev: Aufruf von guix container,  Up: Zubehör

9.14 ‘guix weather’ aufrufen
============================

Manchmal werden Sie schlecht gelaunt sein, weil es zu wenige Substitute
gibt und die Pakete bei Ihnen selbst erstellt werden müssen (siehe *note
Substitute::). Der Befehl ‘guix weather’ zeigt einen Bericht über die
Verfügbarkeit von Substituten auf den angegebenen Servern an, damit Sie
sich eine Vorstellung davon machen können, wie es heute um Ihre Laune
bestellt sein wird. Manchmal bekommt man als Nutzer so hilfreiche
Informationen, aber in erster Linie nützt der Befehl den Leuten, die
‘guix publish’ benutzen (siehe *note Aufruf von guix publish::).

   Hier ist ein Beispiel für einen Aufruf davon:

     $ guix weather --substitute-urls=https://guix.example.org
     5.872 Paketableitungen für x86_64-linux berechnen …
     Nach 6.128 Store-Objekten von https://guix.example.org suchen …
     updating list of substitutes from 'https://guix.example.org'... 100.0%
     https://guix.example.org
       43,4% Substitute verfügbar (2.658 von 6.128)
       7.032,5 MiB an Nars (komprimiert)
       19.824,2 MiB auf der Platte (unkomprimiert)
       0,030 Sekunden pro Anfrage (182,9 Sekunden insgesamt)
       33,5 Anfragen pro Sekunde

       9,8% (342 von 3.470) der fehlenden Objekte sind in der Warteschlange
       Mindestens 867 Erstellungen in der Warteschlange
           x86_64-linux: 518 (59,7%)
           i686-linux: 221 (25,5%)
           aarch64-linux: 128 (14,8%)
       Erstellungsgeschwindigkeit: 23,41 Erstellungen pro Stunde
           x86_64-linux: 11,16 Erstellungen pro Stunde
           i686-linux: 6,03 Erstellungen pro Stunde
           aarch64-linux: 6,41 Erstellungen pro Stunde

   Wie Sie sehen können, wird der Anteil unter allen Paketen angezeigt,
für die auf dem Server Substitute verfügbar sind — unabhängig davon, ob
Substitute aktiviert sind, und unabhängig davon, ob der Signierschlüssel
des Servers autorisiert ist. Es wird auch über die Größe der
komprimierten Archive (die „Nars“) berichtet, die vom Server angeboten
werden, sowie über die Größe, die die zugehörigen Store-Objekte im Store
belegen würden (unter der Annahme, dass Deduplizierung abgeschaltet ist)
und über den Durchsatz des Servers. Der zweite Teil sind Statistiken zur
Kontinuierlichen Integration (englisch „Continuous Integration“, kurz
CI), wenn der Server dies unterstützt. Des Weiteren kann ‘guix weather’,
wenn es mit der Befehlszeilenoption ‘--coverage’ aufgerufen wird,
„wichtige“ Paketsubstitute, die auf dem Server fehlen, auflisten (siehe
unten).

   Dazu werden mit ‘guix weather’ Anfragen über HTTP(S) zu Metadaten
(“Narinfos”) für alle relevanten Store-Objekte gestellt. Wie ‘guix
challenge’ werden die Signaturen auf den Substituten ignoriert, was
harmlos ist, weil der Befehl nur Statistiken sammelt und keine
Substitute installieren kann.

   Die allgemeine Syntax lautet:

     guix weather OPTIONEN… [PAKETE…]

   Wenn keine PAKETE angegeben werden, prüft ‘guix weather’ für _alle_
Pakete bzw. für die Pakete mit ‘--manifest’ angegebenen Manifest, ob
Substitute zur Verfügung stehen. Ansonsten wird es nur für die
angegebenen Pakete geprüft. Es ist auch möglich, die Suche mit
‘--system’ auf bestimmte Systemtypen einzuschränken. Der Rückgabewert
von ‘guix weather’ ist _nicht_ null, wenn weniger als 100% Substitute
verfügbar sind.

   Die verfügbaren Befehlszeilenoptionen folgen.

‘--substitute-urls=URLS’
     URLS ist eine leerzeichengetrennte Liste anzufragender
     Substitutserver-URLs. Wird diese Befehlszeilenoption weggelassen,
     wird die vorgegebene Menge an Substitutservern angefragt.

‘--system=SYSTEM’
‘-s SYSTEM’
     Substitute für das SYSTEM anfragen — z.B. für ‘aarch64-linux’.
     Diese Befehlszeilenoption kann mehrmals angegeben werden, wodurch
     ‘guix weather’ die Substitute für mehrere Systemtypen anfragt.

‘--manifest=DATEI’
     Anstatt die Substitute für alle Pakete anzufragen, werden nur die
     in der DATEI angegebenen Pakete erfragt. Die DATEI muss ein
     “Manifest” enthalten, wie bei der Befehlszeilenoption ‘-m’ von
     ‘guix package’ (siehe *note Aufruf von guix package::).

     Wenn diese Befehlszeilenoption mehrmals wiederholt angegeben wird,
     werden die Manifeste aneinandergehängt.

‘--coverage[=ANZAHL]’
‘-c [ANZAHL]’
     Einen Bericht über die Substitutabdeckung für Pakete ausgeben, d.h.
     Pakete mit mindestens ANZAHL-vielen Abhängigen (voreingestellt
     mindestens null) anzeigen, für die keine Substitute verfügbar sind.
     Die abhängigen Pakete werden selbst nicht aufgeführt: Wenn B von A
     abhängt und Substitute für A fehlen, wird nur A aufgeführt, obwohl
     dann in der Regel auch die Substitute für B fehlen. Das Ergebnis
     sieht so aus:

          $ guix weather --substitute-urls=https://ci.guix.gnu.org -c 10
          8.983 Paketableitungen für x86_64-linux berechnen …
          Nach 9.343 Store-Objekten von https://ci.guix.gnu.org suchen …
          Liste der Substitute von „https://ci.guix.gnu.org“ wird aktualisiert … 100.0%
          https://ci.guix.gnu.org
            64.7% Substitute verfügbar (6.047 von 9.343)
          …
          2502 Pakete fehlen auf „ci.guix.gnu.org“ für „x86_64-linux“, darunter sind:
              58  kcoreaddons@5.49.0      /gnu/store/…-kcoreaddons-5.49.0
              46  qgpgme@1.11.1           /gnu/store/…-qgpgme-1.11.1
              37  perl-http-cookiejar@0.008  /gnu/store/…-perl-http-cookiejar-0.008
              …

     Was man hier in diesem Beispiel sehen kann, ist, dass es für
     ‘kcoreaddons’ und vermutlich die 58 Pakete, die davon abhängen, auf
     ‘ci.guix.gnu.org’ keine Substitute gibt; Gleiches gilt für ‘qgpgme’
     und die 46 Pakete, die davon abhängen.

     Wenn Sie ein Guix-Entwickler sind oder sich um diese
     Erstellungsfarm kümmern, wollen Sie sich diese Pakete vielleicht
     genauer anschauen. Es kann sein, dass sie schlicht nie erfolgreich
     erstellt werden können.

‘--display-missing’
     Eine Liste derjenigen Store-Objekte anzeigen, für die _keine_
     Substitute verfügbar sind.


File: guix.de.info,  Node: Aufruf von guix processes,  Prev: Aufruf von guix weather,  Up: Zubehör

9.15 ‘guix processes’ aufrufen
==============================

Der Befehl ‘guix processes’ kann sich für Entwickler und
Systemadministratoren als nützlich erweisen, besonders auf Maschinen mit
mehreren Nutzern und auf Erstellungsfarmen. Damit werden die aktuellen
Sitzungen (also Verbindungen zum Daemon) sowie Informationen über die
beteiligten Prozesse aufgelistet(1). Hier ist ein Beispiel für die davon
gelieferten Informationen:

     $ sudo guix processes
     SessionPID: 19002
     ClientPID: 19090
     ClientCommand: guix environment --ad-hoc python

     SessionPID: 19402
     ClientPID: 19367
     ClientCommand: guix publish -u guix-publish -p 3000 -C 9 …

     SessionPID: 19444
     ClientPID: 19419
     ClientCommand: cuirass --cache-directory /var/cache/cuirass …
     LockHeld: /gnu/store/…-perl-ipc-cmd-0.96.lock
     LockHeld: /gnu/store/…-python-six-bootstrap-1.11.0.lock
     LockHeld: /gnu/store/…-libjpeg-turbo-2.0.0.lock
     ChildPID: 20495
     ChildCommand: guix offload x86_64-linux 7200 1 28800
     ChildPID: 27733
     ChildCommand: guix offload x86_64-linux 7200 1 28800
     ChildPID: 27793
     ChildCommand: guix offload x86_64-linux 7200 1 28800

   In diesem Beispiel sehen wir, dass ‘guix-daemon’ drei Clients hat:
‘guix environment’, ‘guix publish’ und das Werkzeug Cuirass zur
Kontinuierlichen Integration. Deren Prozesskennung (PID) ist jeweils im
‘ClientPID’-Feld zu sehen. Das Feld ‘SessionPID’ zeigt die PID des
‘guix-daemon’-Unterprozesses dieser bestimmten Sitzung.

   Das Feld ‘LockHeld’ zeigt an, welche Store-Objekte derzeit durch die
Sitzung gesperrt sind, d.h. welche Store-Objekte zurzeit erstellt oder
substituiert werden (das ‘LockHeld’-Feld wird nicht angezeigt, wenn
‘guix processes’ nicht als Administratornutzer root ausgeführt wird).
Letztlich sehen wir an den Feldern ‘ChildPID’ und ‘ChildCommand’ oben,
dass diese drei Erstellungen hier ausgelagert (englisch „offloaded“)
werden (siehe *note Auslagern des Daemons einrichten::).

   Die Ausgabe ist im Recutils-Format, damit wir den praktischen
‘recsel’-Befehl benutzen können, um uns interessierende Sitzungen
auszuwählen (siehe *note (recutils)Selection Expressions::). Zum
Beispiel zeigt dieser Befehl die Befehlszeile und PID des Clients an,
der die Erstellung des Perl-Pakets ausgelöst hat:

     $ sudo guix processes | \
         recsel -p ClientPID,ClientCommand -e 'LockHeld ~ "perl"'
     ClientPID: 19419
     ClientCommand: cuirass --cache-directory /var/cache/cuirass …

   Weitere Befehlszeilenoptionen folgen.

‘--format=FORMAT’
‘-f FORMAT’
     Die Ausgabe im angegebenen FORMAT generieren, was eines der
     Folgenden sein muss:

     ‘recutils’
          Diese Option entspricht der Vorgabe. Sitzungen werden als
          „Session“-Datensätze im recutils-Format ausgegeben; dabei
          steht jeweils ein Feld ‘ChildProcess’ für jeden Kindprozess.

     ‘normalized’
          Normalisiert die ausgegebenen Datensätze nach Typ (als „Record
          Sets“, siehe *note (recutils)Record Sets::). Dadurch, dass die
          Datensatztypen in der Ausgabe stehen, wird eine Verknüpfung
          („Join“) zwischen den Datensatztypen möglich. Im folgenden
          Beispiel würde die PID jedes Kindprozesses (mit Typ
          ‘ChildProcess’) mit der PID der ihn erzeugt habenden Sitzung
          (Typ ‘Session’) angezeigt, vorausgesetzt die Sitzung wurde mit
          ‘guix build’ gestartet.

               $ guix processes --format=normalized | \
                   recsel \
                   -j Session \
                   -t ChildProcess \
                   -p Session.PID,PID \
                   -e 'Session.ClientCommand ~ "guix build"'
               PID: 4435
               Session_PID: 4278

               PID: 4554
               Session_PID: 4278

               PID: 4646
               Session_PID: 4278

   ---------- Footnotes ----------

   (1) Entfernte Sitzungen, wenn ‘guix-daemon’ mit ‘--listen’ unter
Angabe eines TCP-Endpunkts gestartet wurde, werden _nicht_ aufgelistet.


File: guix.de.info,  Node: Systemkonfiguration,  Next: Dokumentation,  Prev: Zubehör,  Up: Top

10 Systemkonfiguration
**********************

Guix System unterstützt einen Mechanismus zur konsistenten Konfiguration
des gesamten Systems. Damit meinen wir, dass alle Aspekte der globalen
Systemkonfiguration an einem Ort stehen, d.h. die zur Verfügung
gestellten Systemdienste, die Zeitzone und Einstellungen zur Locale
(also die Anpassung an regionale Gepflogenheiten und Sprachen) sowie
Benutzerkonten. Sie alle werden an derselben Stelle deklariert. So eine
“Systemkonfiguration” kann “instanziiert”, also umgesetzt, werden.

   Einer der Vorteile, die ganze Systemkonfiguration unter die Kontrolle
von Guix zu stellen, ist, dass so transaktionelle Systemaktualisierungen
möglich werden und dass diese rückgängig gemacht werden können, wenn das
aktualisierte System nicht richtig funktioniert (siehe *note
Funktionalitäten::). Ein anderer Vorteil ist, dass dieselbe
Systemkonfiguration leicht auf einer anderen Maschine oder zu einem
späteren Zeitpunkt benutzt werden kann, ohne dazu eine weitere Schicht
administrativer Werkzeuge über den systemeigenen Werkzeugen einsetzen zu
müssen.

   In diesem Abschnitt wird dieser Mechanismus beschrieben. Zunächst
betrachten wir ihn aus der Perspektive eines Administrators. Dabei wird
erklärt, wie das System konfiguriert und instanziiert werden kann. Dann
folgt eine Demonstration, wie der Mechanismus erweitert werden kann,
etwa um neue Systemdienste zu unterstützen.

* Menu:

* Das Konfigurationssystem nutzen::  Ihr GNU-System anpassen.
* „operating-system“-Referenz::  Details der
                                       Betriebssystem-Deklarationen.
* Dateisysteme::             Die Dateisystemeinbindungen konfigurieren.
* Zugeordnete Geräte::      Näheres zu blockorientierten Speichermedien.
* Benutzerkonten::           Benutzerkonten festlegen.
* Tastaturbelegung::         Wie das System Tastendrücke interpretiert.
* Locales::                  Sprache und kulturelle Konventionen.
* Dienste::                  Systemdienste festlegen.
* Setuid-Programme::         Mit Administratorrechten startende Programme.
* X.509-Zertifikate::        HTTPS-Server authentifizieren.
* Name Service Switch::      Den Name Service Switch von libc konfigurieren.
* Initiale RAM-Disk::        Linux-libre hochfahren.
* Bootloader-Konfiguration::  Den Bootloader konfigurieren.
* Aufruf von guix system::   Instanziierung einer Systemkonfiguration.
* Aufruf von guix deploy::   Eine Systemkonfiguration auf einen entfernten
                               Rechner aufspielen.
* Guix in einer VM starten::  Wie man „Guix System“ in einer virtuellen
                                Maschine startet.
* Dienste definieren::       Neue Dienstdefinitionen hinzufügen.


File: guix.de.info,  Node: Das Konfigurationssystem nutzen,  Next: „operating-system“-Referenz,  Up: Systemkonfiguration

10.1 Das Konfigurationssystem nutzen
====================================

Das Betriebssystem können Sie konfigurieren, indem Sie eine
‘operating-system’-Deklaration in einer Datei speichern, die Sie dann
dem Befehl ‘guix system’ übergeben (siehe *note Aufruf von guix
system::). Eine einfache Konfiguration mit den vorgegebenen
Systemdiensten und dem vorgegebenen Linux-Libre als Kernel und mit einer
initialen RAM-Disk und einem Bootloader sieht so aus:

     ;; This is an operating system configuration template
     ;; for a "bare bones" setup, with no X11 display server.

     (use-modules (gnu))
     (use-service-modules networking ssh)
     (use-package-modules screen ssh)

     (operating-system
       (host-name "komputilo")
       (timezone "Europe/Berlin")
       (locale "en_US.utf8")

       ;; Boot in "legacy" BIOS mode, assuming /dev/sdX is the
       ;; target hard disk, and "my-root" is the label of the target
       ;; root file system.
       (bootloader (bootloader-configuration
                     (bootloader grub-bootloader)
                     (target "/dev/sdX")))
       (file-systems (cons (file-system
                             (device (file-system-label "my-root"))
                             (mount-point "/")
                             (type "ext4"))
                           %base-file-systems))

       ;; This is where user accounts are specified.  The "root"
       ;; account is implicit, and is initially created with the
       ;; empty password.
       (users (cons (user-account
                     (name "alice")
                     (comment "Bob's sister")
                     (group "users")

                     ;; Adding the account to the "wheel" group
                     ;; makes it a sudoer.  Adding it to "audio"
                     ;; and "video" allows the user to play sound
                     ;; and access the webcam.
                     (supplementary-groups '("wheel"
                                             "audio" "video")))
                    %base-user-accounts))

       ;; Globally-installed packages.
       (packages (cons screen %base-packages))

       ;; Add services to the baseline: a DHCP client and
       ;; an SSH server.
       (services (append (list (service dhcp-client-service-type)
                               (service openssh-service-type
                                        (openssh-configuration
                                         (openssh openssh-sans-x)
                                         (port-number 2222))))
                         %base-services)))

   Dieses Beispiel sollte selbsterklärend sein. Manche der Felder oben,
wie etwa ‘host-name’ und ‘bootloader’, müssen angegeben werden. Andere
sind optional, wie etwa ‘packages’ und ‘services’, sind optional; werden
sie nicht angegeben, nehmen sie einen Vorgabewert an.

   Im Folgenden werden die Effekte von einigen der wichtigsten Feldern
erläutert (siehe *note „operating-system“-Referenz:: für Details zu
allen verfügbaren Feldern), dann wird beschrieben, wie man das
Betriebssystem mit ‘guix system’ “instanziieren” kann.

Bootloader
----------

Das ‘bootloader’-Feld beschreibt, mit welcher Methode Ihr System
„gebootet“ werden soll. Maschinen, die auf Intel-Prozessoren basieren,
können im alten „Legacy“-BIOS-Modus gebootet werden, wie es im obigen
Beispiel der Fall wäre. Neuere Maschinen benutzen stattdessen das
“Unified Extensible Firmware Interface” (UEFI) zum Booten. In diesem
Fall sollte das ‘bootloader’-Feld in etwa so aussehen:

     (bootloader-configuration
       (bootloader grub-efi-bootloader)
       (target "/boot/efi"))

   Siehe den Abschnitt *note Bootloader-Konfiguration:: für weitere
Informationen zu den verfügbaren Konfigurationsoptionen.

global sichtbare Pakete
-----------------------

Im Feld ‘packages’ werden Pakete aufgeführt, die auf dem System für alle
Benutzerkonten global sichtbar sein sollen, d.h. in der
‘PATH’-Umgebungsvariablen jedes Nutzers, zusätzlich zu den nutzereigenen
Profilen (siehe *note Aufruf von guix package::). Die Variable
‘%base-packages’ bietet alle Werkzeuge, die man für grundlegende Nutzer-
und Administratortätigkeiten erwarten würde, einschließlich der GNU Core
Utilities, der GNU Networking Utilities, des leichtgewichtigen
Texteditors GNU Zile, ‘find’, ‘grep’ und so weiter. Obiges Beispiel fügt
zu diesen noch das Programm GNU Screen hinzu, welches aus dem Modul
‘(gnu packages screen)’ genommen wird (siehe *note Paketmodule::). Die
Syntax ‘(list package output)’ kann benutzt werden, um eine bestimmte
Ausgabe eines Pakets auszuwählen:

     (use-modules (gnu packages))
     (use-modules (gnu packages dns))

     (operating-system
       ;; …
       (packages (cons (list bind "utils")
                       %base-packages)))

   Sich auf Pakete anhand ihres Variablennamens zu beziehen, wie oben
bei ‘bind’, hat den Vorteil, dass der Name eindeutig ist; Tippfehler
werden direkt als „unbound variables“ gemeldet. Der Nachteil ist, dass
man wissen muss, in welchem Modul ein Paket definiert wird, um die Zeile
mit ‘use-package-modules’ entsprechend zu ergänzen. Um dies zu
vermeiden, kann man auch die Prozedur ‘specification->package’ aus dem
Modul ‘(gnu packages)’ aufrufen, welche das einem angegebenen Namen oder
Name-Versions-Paar zu Grunde liegende Paket liefert:

     (use-modules (gnu packages))

     (operating-system
       ;; …
       (packages (append (map specification->package
                              '("tcpdump" "htop" "gnupg@2.0"))
                         %base-packages)))

Systemdienste
-------------

Das Feld ‘services’ listet “Systemdienste” auf, die zur Verfügung stehen
sollen, wenn das System startet (siehe *note Dienste::). Die
‘operating-system’-Deklaration oben legt fest, dass wir neben den
grundlegenden Basis-Diensten auch wollen, dass der
OpenSSH-Secure-Shell-Daemon auf Port 2222 lauscht (siehe *note
‘openssh-service-type’: Netzwerkdienste.). Intern sorgt der
‘openssh-service-type’ dafür, dass ‘sshd’ mit den richtigen
Befehlszeilenoptionen aufgerufen wird, je nach Systemkonfiguration
werden auch für dessen Betrieb nötige Konfigurationsdateien erstellt
(siehe *note Dienste definieren::).

   Gelegentlich werden Sie die Basis-Dienste nicht einfach so, wie sie
sind, benutzen, sondern anpassen wollen. Benutzen Sie ‘modify-services’
(siehe *note ‘modify-services’: Service-Referenz.), um die Liste der
Basis-Dienste zu modifizieren.

   Wenn Sie zum Beispiel ‘guix-daemon’ und Mingetty (das Programm, womit
Sie sich auf der Konsole anmelden) in der ‘%base-services’-Liste
modifizieren möchten (siehe *note ‘%base-services’: Basisdienste.),
schreiben Sie das Folgende in Ihre Betriebssystemdeklaration:

     (define %my-services
       ;; Meine ganz eigene Liste von Diensten.
       (modify-services %base-services
         (guix-service-type config =>
                            (guix-configuration
                             (inherit config)
                             ;; Substitute von example.org herunterladen.
                             (substitute-urls
                               (list "https://example.org/guix"
                                     "https://ci.guix.gnu.org"))))
         (mingetty-service-type config =>
                                (mingetty-configuration
                                 (inherit config)
                                 ;; Automatisch als "gast" anmelden.
                                 (auto-login "gast")))))

     (operating-system
       ;; …
       (services %my-services))

   Dadurch ändert sich die Konfiguration — d.h. die Dienst-Parameter —
der ‘guix-service-type’-Instanz und die aller
‘mingetty-service-type’-Instanzen in der ‘%base-services’-Liste. Das
funktioniert so: Zunächst arrangieren wir, dass die ursprüngliche
Konfiguration an den Bezeichner ‘config’ im RUMPF gebunden wird, dann
schreiben wir den RUMPF, damit er zur gewünschten Konfiguration
ausgewertet wird. Beachten Sie insbesondere, wie wir mit ‘inherit’ eine
neue Konfiguration erzeugen, die dieselben Werte wie die alte
Konfiguration hat, aber mit ein paar Modifikationen.

   Die Konfiguration für typische Nutzung auf Heim- und Arbeitsrechnern,
mit einer verschlüsselten Partition für das Wurzeldateisystem, einem
X11-Anzeigeserver, GNOME und Xfce (Benutzer können im Anmeldebildschirm
auswählen, welche dieser Arbeitsumgebungen sie möchten, indem sie die
Taste ‘F1’ drücken), Netzwerkverwaltung, Verwaltungswerkzeugen für den
Energieverbrauch, und Weiteres, würde so aussehen:

     ;; This is an operating system configuration template
     ;; for a "desktop" setup with GNOME and Xfce where the
     ;; root partition is encrypted with LUKS.

     (use-modules (gnu) (gnu system nss))
     (use-service-modules desktop xorg)
     (use-package-modules certs gnome)

     (operating-system
       (host-name "antelope")
       (timezone "Europe/Paris")
       (locale "en_US.utf8")

       ;; Choose US English keyboard layout.  The "altgr-intl"
       ;; variant provides dead keys for accented characters.
       (keyboard-layout (keyboard-layout "us" "altgr-intl"))

       ;; Use the UEFI variant of GRUB with the EFI System
       ;; Partition mounted on /boot/efi.
       (bootloader (bootloader-configuration
                     (bootloader grub-efi-bootloader)
                     (target "/boot/efi")
                     (keyboard-layout keyboard-layout)))

       ;; Specify a mapped device for the encrypted root partition.
       ;; The UUID is that returned by 'cryptsetup luksUUID'.
       (mapped-devices
        (list (mapped-device
               (source (uuid "12345678-1234-1234-1234-123456789abc"))
               (target "my-root")
               (type luks-device-mapping))))

       (file-systems (append
                      (list (file-system
                              (device (file-system-label "my-root"))
                              (mount-point "/")
                              (type "ext4")
                              (dependencies mapped-devices))
                            (file-system
                              (device (uuid "1234-ABCD" 'fat))
                              (mount-point "/boot/efi")
                              (type "vfat")))
                      %base-file-systems))

       ;; Create user `bob' with `alice' as its initial password.
       (users (cons (user-account
                     (name "bob")
                     (comment "Alice's brother")
                     (password (crypt "alice" "$6$abc"))
                     (group "users")
                     (supplementary-groups '("wheel" "netdev"
                                             "audio" "video")))
                    %base-user-accounts))

       ;; This is where we specify system-wide packages.
       (packages (append (list
                          ;; for HTTPS access
                          nss-certs
                          ;; for user mounts
                          gvfs)
                         %base-packages))

       ;; Add GNOME and Xfce---we can choose at the log-in screen
       ;; by clicking the gear.  Use the "desktop" services, which
       ;; include the X11 log-in service, networking with
       ;; NetworkManager, and more.
       (services (append (list (service gnome-desktop-service-type)
                               (service xfce-desktop-service-type)
                               (set-xorg-configuration
                                (xorg-configuration
                                 (keyboard-layout keyboard-layout))))
                         %desktop-services))

       ;; Allow resolution of '.local' host names with mDNS.
       (name-service-switch %mdns-host-lookup-nss))

   Ein grafisches System mit einer Auswahl an leichtgewichtigen
Fenster-Managern statt voll ausgestatteten Arbeitsumgebungen würde so
aussehen:

     ;; This is an operating system configuration template
     ;; for a "desktop" setup without full-blown desktop
     ;; environments.

     (use-modules (gnu) (gnu system nss))
     (use-service-modules desktop)
     (use-package-modules bootloaders certs emacs emacs-xyz ratpoison suckless wm
                          xorg)

     (operating-system
       (host-name "antelope")
       (timezone "Europe/Paris")
       (locale "en_US.utf8")

       ;; Use the UEFI variant of GRUB with the EFI System
       ;; Partition mounted on /boot/efi.
       (bootloader (bootloader-configuration
                     (bootloader grub-efi-bootloader)
                     (target "/boot/efi")))

       ;; Assume the target root file system is labelled "my-root",
       ;; and the EFI System Partition has UUID 1234-ABCD.
       (file-systems (append
                      (list (file-system
                              (device (file-system-label "my-root"))
                              (mount-point "/")
                              (type "ext4"))
                            (file-system
                              (device (uuid "1234-ABCD" 'fat))
                              (mount-point "/boot/efi")
                              (type "vfat")))
                      %base-file-systems))

       (users (cons (user-account
                     (name "alice")
                     (comment "Bob's sister")
                     (group "users")
                     (supplementary-groups '("wheel" "netdev"
                                             "audio" "video")))
                    %base-user-accounts))

       ;; Add a bunch of window managers; we can choose one at
       ;; the log-in screen with F1.
       (packages (append (list
                          ;; window managers
                          ratpoison i3-wm i3status dmenu
                          emacs emacs-exwm emacs-desktop-environment
                          ;; terminal emulator
                          xterm
                          ;; for HTTPS access
                          nss-certs)
                         %base-packages))

       ;; Use the "desktop" services, which include the X11
       ;; log-in service, networking with NetworkManager, and more.
       (services %desktop-services)

       ;; Allow resolution of '.local' host names with mDNS.
       (name-service-switch %mdns-host-lookup-nss))

   Dieses Beispiel bezieht sich auf das Dateisystem hinter ‘/boot/efi’
über dessen UUID, ‘1234-ABCD’. Schreiben Sie statt dieser UUID die
richtige UUID für Ihr System, wie sie der Befehl ‘blkid’ liefert.

   Im Abschnitt *note Desktop-Dienste:: finden Sie eine genaue Liste der
unter ‘%desktop-services’ angebotenen Dienste. Der Abschnitt *note
X.509-Zertifikate:: hat Hintergrundinformationen über das
‘nss-certs’-Paket, das hier benutzt wird.

   Beachten Sie, dass ‘%desktop-services’ nur eine Liste von die Dienste
repräsentierenden service-Objekten ist. Wenn Sie Dienste daraus
entfernen möchten, können Sie dazu die Prozeduren zum Filtern von Listen
benutzen (siehe *note (guile)SRFI-1 Filtering and Partitioning::).
Beispielsweise liefert der folgende Ausdruck eine Liste mit allen
Diensten von ‘%desktop-services’ außer dem Avahi-Dienst.

     (remove (lambda (service)
               (eq? (service-kind service) avahi-service-type))
             %desktop-services)

   Alternativ können Sie das Makro ‘modify-services’ benutzen:

     (modify-services %desktop-services
       (delete avahi-service-type))

Das System instanziieren
------------------------

Angenommen, Sie haben die ‘operating-system’-Deklaration in einer Datei
‘my-system-config.scm’ gespeichert, dann instanziiert der Befehl ‘guix
system reconfigure my-system-config.scm’ diese Konfiguration und macht
sie zum voreingestellten GRUB-Boot-Eintrag (siehe *note Aufruf von guix
system::).

   Der normale Weg, die Systemkonfiguration nachträglich zu ändern, ist,
die Datei zu aktualisieren und ‘guix system reconfigure’ erneut
auszuführen. Man sollte nie die Dateien in ‘/etc’ bearbeiten oder den
Systemzustand mit Befehlen wie ‘useradd’ oder ‘grub-install’ verändern.
Tatsächlich müssen Sie das ausdrücklich vermeiden, sonst verfällt nicht
nur Ihre Garantie, sondern Sie können Ihr System auch nicht mehr auf
eine alte Version des Systems zurücksetzen, falls das jemals notwendig
wird.

   Zurücksetzen bezieht sich hierbei darauf, dass jedes Mal, wenn Sie
‘guix system reconfigure’ ausführen, eine neue “Generation” des Systems
erzeugt wird — ohne vorherige Generationen zu verändern. Alte
Systemgenerationen bekommen einen Eintrag im Boot-Menü des Bootloaders,
womit Sie alte Generationen beim Starten des Rechners auswählen können,
wenn mit der neuesten Generation etwas nicht stimmt. Eine beruhigende
Vorstellung, oder? Der Befehl ‘guix system list-generations’ führt die
auf der Platte verfügbaren Systemgenerationen auf. Es ist auch möglich,
das System mit den Befehlen ‘guix system roll-back’ und ‘guix system
switch-generation’ zurückzusetzen.

   Obwohl der Befehl ‘guix system reconfigure’ vorherige Generationen
nicht verändern wird, müssen Sie Acht geben, dass wenn die momentan
aktuelle Generation nicht die neueste ist (z.B. nach einem Aufruf von
‘guix system roll-back’), weil ‘guix system reconfigure’ alle neueren
Generationen überschreibt (siehe *note Aufruf von guix system::).

Die Programmierschnittstelle
----------------------------

Auf der Ebene von Scheme wird der Großteil der
‘operating-system’-Deklaration mit der folgenden monadischen Prozedur
instanziiert (siehe *note Die Store-Monade::):

 -- Monadische Prozedur: operating-system-derivation os
     Liefert eine Ableitung, mit der ein ‘operating-system’-Objekt OS
     erstellt wird (siehe *note Ableitungen::).

     Die Ausgabe der Ableitung ist ein einzelnes Verzeichnis mit
     Verweisen auf alle Pakete, Konfigurationsdateien und andere
     unterstützenden Dateien, die nötig sind, um OS zu instanziieren.

   Diese Prozedur wird vom Modul ‘(gnu system)’ angeboten. Zusammen mit
‘(gnu services)’ (siehe *note Dienste::) deckt dieses Modul den Kern von
„Guix System“ ab. Schauen Sie es sich mal an!


File: guix.de.info,  Node: „operating-system“-Referenz,  Next: Dateisysteme,  Prev: Das Konfigurationssystem nutzen,  Up: Systemkonfiguration

10.2 ‘operating-system’-Referenz
================================

Dieser Abschnitt fasst alle Optionen zusammen, die für
‘operating-system’-Deklarationen zur Verfügung stehen (siehe *note Das
Konfigurationssystem nutzen::).

 -- Datentyp: operating-system
     Der die Betriebssystemkonfiguration repräsentierende Datentyp.
     Damit meinen wir die globale Konfiguration des Systems und nicht
     die, die sich nur auf einzelne Nutzer bezieht (siehe *note Das
     Konfigurationssystem nutzen::).

     ‘kernel’ (Vorgabe: ‘linux-libre’)
          Das Paket für den zu nutzenden Betriebssystem-Kernel als
          „package“-Objekt(1).

     ‘hurd’ (Vorgabe: ‘#f’)
          Das Paketobjekt derjenigen Hurd, die der Kernel starten soll.
          Wenn dieses Feld gesetzt ist, wird ein GNU/Hurd-Betriebssystem
          erzeugt. In diesem Fall muss als ‘kernel’ das ‘gnumach’-Paket
          (das ist der Microkernel, auf dem Hurd läuft) ausgewählt sein.

               Warnung: Diese Funktionalität ist experimentell und wird
               nur für Disk-Images unterstützt.

     ‘kernel-loadable-modules’ (Vorgabe: ’())
          Eine Liste von Objekten (normalerweise Pakete), aus denen
          Kernel-Module geladen werden können, zum Beispiel ‘(list
          ddcci-driver-linux)’.

     ‘kernel-arguments’ (Vorgabe: ‘%default-kernel-arguments’)
          Eine Liste aus Zeichenketten oder G-Ausdrücken, die für
          zusätzliche Argumente an den Kernel stehen, die ihm auf seiner
          Befehlszeile übergeben werden — wie z.B. ‘("console=ttyS0")’.

     ‘bootloader’
          Das Konfigurationsobjekt für den Bootloader, mit dem das
          System gestartet wird. Siehe *note Bootloader-Konfiguration::.

     ‘label’
          Diese Bezeichnung (eine Zeichenkette) wird für den Menüeintrag
          im Bootloader verwendet. Die Vorgabe ist eine Bezeichnung, die
          den Namen des Kernels und seine Version enthält.

     ‘keyboard-layout’ (Vorgabe: ‘#f’)
          Dieses Feld gibt an, welche Tastaturbelegung auf der Konsole
          benutzt werden soll. Es kann entweder auf ‘#f’ gesetzt sein,
          damit die voreingestellte Tastaturbelegung benutzt wird (in
          der Regel ist diese „US English“), oder ein
          ‘<keyboard-layout>’-Verbundsobjekt sein. Siehe *note
          Tastaturbelegung:: für weitere Informationen.

          Diese Tastaturbelegung wird benutzt, sobald der Kernel
          gebootet wurde. Diese Tastaturbelegung wird zum Beispiel auch
          verwendet, wenn Sie eine Passphrase eintippen, falls sich Ihr
          Wurzeldateisystem auf einem mit ‘luks-device-mapping’
          zugeordneten Gerät befindet (siehe *note Zugeordnete
          Geräte::).

               Anmerkung: Damit wird _nicht_ angegeben, welche
               Tastaturbelegung der Bootloader benutzt, und auch nicht,
               welche der grafische Anzeigeserver verwendet. Siehe *note
               Bootloader-Konfiguration:: für Informationen darüber, wie
               Sie die Tastaturbelegung des Bootloaders angeben können.
               Siehe *note X Window:: für Informationen darüber, wie Sie
               die Tastaturbelegung angeben können, die das
               X-Fenstersystem verwendet.

     ‘initrd-modules’ (Vorgabe: ‘%base-initrd-modules’)
          Die Liste der Linux-Kernel-Module, die in der initialen
          RAM-Disk zur Verfügung stehen sollen. Siehe *note Initiale
          RAM-Disk::.

     ‘initrd’ (Vorgabe: ‘base-initrd’)
          Eine Prozedur, die eine initiale RAM-Disk für den Linux-Kernel
          liefert. Dieses Feld gibt es, damit auch sehr systemnahe
          Anpassungen vorgenommen werden können, aber für die normale
          Nutzung sollten Sie es kaum brauchen. Siehe *note Initiale
          RAM-Disk::.

     ‘firmware’ (Vorgabe: ‘%base-firmware’)
          Eine Liste der Firmware-Pakete, die vom Betriebssystem-Kernel
          geladen werden können.

          Vorgegeben ist, dass für Atheros- und Broadcom-basierte
          WLAN-Geräte nötige Firmware geladen werden kann (genauer
          jeweils die Linux-libre-Module ‘ath9k’ und ‘b43-open’). Siehe
          den Abschnitt *note Hardware-Überlegungen:: für mehr
          Informationen zu unterstützter Hardware.

     ‘host-name’
          Der Rechnername.

     ‘hosts-file’
          Ein dateiartiges Objekt (siehe *note dateiartige Objekte:
          G-Ausdrücke.), das für ‘/etc/hosts’ benutzt werden soll (siehe
          *note (libc)Host Names::). Der Vorgabewert ist eine Datei mit
          Einträgen für ‘localhost’ und HOST-NAME.

     ‘mapped-devices’ (Vorgabe: ‘'()’)
          Eine Liste zugeordneter Geräte („mapped devices“). Siehe *note
          Zugeordnete Geräte::.

     ‘file-systems’
          Eine Liste von Dateisystemen. Siehe *note Dateisysteme::.

     ‘swap-devices’ (Vorgabe: ‘'()’)
          Eine Liste von UUIDs, Dateisystembezeichnungen oder
          Zeichenketten, die als Swap-Speicher zu nutzende Geräte bzw.
          Dateien identifizieren (siehe *note (libc)Memory Concepts::).
          Hier sind einige Beispiele:

          ‘(list (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb"))’
               Die Swap-Partition mit der angegebenen UUID verwenden.
               Sie können die UUID einer Linux-Swap-Partition erfahren,
               indem Sie ‘swaplabel GERÄT’ ausführen, wobei GERÄT der
               Dateiname unter ‘/dev’ für die Partition ist.

          ‘(list (file-system-label "swap"))’
               Die Swap-Partition mit der Bezeichnung ‘swap’ verwenden.
               Auch hier können Sie mittels ‘swaplabel’-Befehls die
               Bezeichnung einer Linux-Swap-Partition einsehen und
               ändern.

          ‘(list "/swapfile")’
               Die Datei ‘/swapfile’ als Swap-Speicher benutzen.

          ‘(list "/dev/sda3" "/dev/sdb2")’
               Die Partitionen ‘/dev/sda3’ und ‘/dev/sdb2’ als
               Swap-Speicher benutzen. Wir raten davon ab und empfehlen,
               auf die Swap-Geräte stattdessen wie oben gezeigt über
               UUIDs oder über Bezeichnungen zu verweisen.

          Es ist möglich, eine Swap-Datei auf einem Dateisystem eines
          zugeordneten Geräts anzugeben, sofern auch die Gerätezuordnung
          und das Dateisystem mit angegeben werden. Siehe *note
          Zugeordnete Geräte:: und *note Dateisysteme::.

     ‘users’ (Vorgabe: ‘%base-user-accounts’)
     ‘groups’ (Vorgabe: ‘%base-groups’)
          Liste der Benutzerkonten und Benutzergruppen. Siehe *note
          Benutzerkonten::.

          Wenn in der ‘users’-Liste kein Benutzerkonto mit der
          UID-Kennung 0 aufgeführt wird, wird automatisch für den
          Administrator ein „root“-Benutzerkonto mit UID-Kennung 0
          hinzugefügt.

     ‘skeletons’ (Vorgabe: ‘(default-skeletons)’)
          Eine Liste von Tupeln aus je einem Ziel-Dateinamen und einem
          dateiähnlichen Objekt (siehe *note dateiartige Objekte:
          G-Ausdrücke.). Diese Objekte werden als Skeleton-Dateien im
          Persönlichen Verzeichnis („Home“-Verzeichnis) jedes neuen
          Benutzerkontos angelegt.

          Ein gültiger Wert könnte zum Beispiel so aussehen:

               `((".bashrc" ,(plain-file "bashrc" "echo Hallo\n"))
                 (".guile" ,(plain-file "guile"
                                        "(use-modules (ice-9 readline))
                                         (activate-readline)")))

     ‘issue’ (Vorgabe: ‘%default-issue’)
          Eine Zeichenkette, die als Inhalt der Datei ‘/etc/issue’
          verwendet werden soll, der jedes Mal angezeigt wird, wenn sich
          ein Nutzer auf einer Textkonsole anmeldet.

     ‘packages’ (Vorgabe: ‘%base-packages’)
          Eine Liste von Paketen, die ins globale Profil installiert
          werden sollen, welches unter ‘/run/current-system/profile’ zu
          finden ist. Jedes Element ist entweder eine Paketvariable oder
          ein Tupel aus einem Paket und dessen gewünschter Ausgabe. Hier
          ist ein Beispiel:

               (cons* git                     ; die Standardausgabe "out"
                      (list git "send-email") ; eine andere Ausgabe von git
                      %base-packages)         ; die normale Paketmenge

          Die vorgegebene Paketmenge umfasst zum Kern des Systems
          gehörende Werkzeuge („core utilities“). Es ist empfehlenswert,
          nicht zum Kern gehörende Werkzeuge („non-core“) stattdessen in
          Nutzerprofile zu installieren (siehe *note Aufruf von guix
          package::).

     ‘timezone’
          Eine Zeichenkette, die die Zeitzone bezeichnet, wie z.B.
          ‘"Europe/Berlin"’.

          Mit dem Befehl ‘tzselect’ können Sie herausfinden, welche
          Zeichenkette der Zeitzone Ihrer Region entspricht. Wenn Sie
          eine ungültige Zeichenkette angeben, schlägt ‘guix system’
          fehl.

     ‘locale’ (Vorgabe: ‘"en_US.utf8"’)
          Der Name der als Voreinstellung zu verwendenden Locale (siehe
          *note (libc)Locale Names::). Siehe *note Locales:: für weitere
          Informationen.

     ‘locale-definitions’ (Vorgabe: ‘%default-locale-definitions’)
          Die Liste der Locale-Definitionen, die kompiliert werden
          sollen und dann im laufenden System benutzt werden können.
          Siehe *note Locales::.

     ‘locale-libcs’ (Vorgabe: ‘(list GLIBC)’)
          Die Liste der GNU-libc-Pakete, deren Locale-Daten und
          -Werkzeuge zum Erzeugen der Locale-Definitionen verwendet
          werden sollen. Siehe *note Locales:: für eine Erläuterung der
          Kompatibilitätsauswirkungen, deretwegen man diese Option
          benutzen wollen könnte.

     ‘name-service-switch’ (Vorgabe: ‘%default-nss’)
          Die Konfiguration des Name Service Switch (NSS) der libc — ein
          ‘<name-service-switch>’-Objekt. Siehe *note Name Service
          Switch:: für Details.

     ‘services’ (Vorgabe: ‘%base-services’)
          Eine Liste von „service“-Objekten, die die Systemdienste
          repräsentieren. Siehe *note Dienste::.

     ‘essential-services’ (Vorgabe: …)
          Die Liste „essenzieller Dienste“ — d.h. Dinge wie Instanzen
          von ‘system-service-type’ und ‘host-name-service-type’ (siehe
          *note Service-Referenz::), die aus der
          Betriebssystemdefinition an sich abgeleitet werden. Als
          normaler Benutzer sollten Sie dieses Feld _niemals_ ändern
          müssen.

     ‘pam-services’ (Vorgabe: ‘(base-pam-services)’)
          Dienste für “Pluggable Authentication Modules” (PAM) von
          Linux.

     ‘setuid-programs’ (Vorgabe: ‘%setuid-programs’)
          Eine Liste von Zeichenketten liefernden G-Ausdrücken, die
          setuid-Programme bezeichnen. Siehe *note Setuid-Programme::.

     ‘sudoers-file’ (Vorgabe: ‘%sudoers-specification’)
          Der Inhalt der Datei ‘/etc/sudoers’ als ein dateiähnliches
          Objekt (siehe *note ‘local-file’ und ‘plain-file’:
          G-Ausdrücke.).

          Diese Datei gibt an, welche Nutzer den Befehl ‘sudo’ benutzen
          dürfen, was sie damit tun und welche Berechtigungen sie so
          erhalten können. Die Vorgabe ist, dass nur der
          Administratornutzer ‘root’ und Mitglieder der Benutzergruppe
          ‘wheel’ den ‘sudo’-Befehl verwenden dürfen.

      -- Scheme-Syntax: this-operating-system
          Wenn dies im _lexikalischen Geltungsbereich_ der Definition
          eines Feldes im Betriebssystem steht, bezieht sich dieser
          Bezeichner auf das Betriebssystem, das gerade definiert wird.

          Das folgende Beispiel zeigt, wie man auf das Betriebssystem,
          das gerade definiert wird, verweist, während man die
          Definition des ‘label’-Felds schreibt:

               (use-modules (gnu) (guix))

               (operating-system
                 ;; …
                 (label (package-full-name
                         (operating-system-kernel this-operating-system))))

          Es ist ein Fehler, außerhalb einer Betriebssystemdefinition
          auf ‘this-operating-system’ zu verweisen.

   ---------- Footnotes ----------

   (1) Derzeit wird nur der Kernel Linux-libre vollständig unterstützt.
Die Nutzung von GNU mach mit GNU Hurd ist experimentell und steht nur
zur Erstellung eines Disk-Image für virtuelle Maschinen bereit.


File: guix.de.info,  Node: Dateisysteme,  Next: Zugeordnete Geräte,  Prev: „operating-system“-Referenz,  Up: Systemkonfiguration

10.3 Dateisysteme
=================

Die Liste der Dateisysteme, die eingebunden werden sollen, steht im
‘file-systems’-Feld der Betriebssystemdeklaration (siehe *note Das
Konfigurationssystem nutzen::). Jedes Dateisystem wird mit der
‘file-system’-Form deklariert, etwa so:

     (file-system
       (mount-point "/home")
       (device "/dev/sda3")
       (type "ext4"))

   Wie immer müssen manche Felder angegeben werden — die, die im
Beispiel oben stehen —, während andere optional sind. Die Felder werden
nun beschrieben.

 -- Datentyp: file-system
     Objekte dieses Typs repräsentieren einzubindende Dateisysteme. Sie
     weisen folgende Komponenten auf:

     ‘type’
          Eine Zeichenkette, die den Typ des Dateisystems spezifiziert,
          z.B. ‘"ext4"’.

     ‘mount-point’
          Der Einhängepunkt, d.h. der Pfad, an dem das Dateisystem
          eingebunden werden soll.

     ‘device’
          Hiermit wird die „Quelle“ des Dateisystems bezeichnet. Sie
          kann eines von drei Dingen sein: die Bezeichnung („Labels“)
          eines Dateisystems, die UUID-Kennung des Dateisystems oder der
          Name eines ‘/dev’-Knotens. Mit Bezeichnungen und UUIDs können
          Sie Dateisysteme benennen, ohne den Gerätenamen
          festzuschreiben(1).

          Dateisystem-Bezeichnungen („Labels“) werden mit der Prozedur
          ‘file-system-label’ erzeugt und UUID-Kennungen werden mit
          ‘uuid’ erzeugt, während Knoten in ‘/dev’ mit ihrem Pfad als
          einfache Zeichenketten aufgeführt werden. Hier ist ein
          Beispiel, wie wir ein Dateisystem anhand seiner Bezeichnung
          aufführen, wie sie vom Befehl ‘e2label’ angezeigt wird:

               (file-system
                 (mount-point "/home")
                 (type "ext4")
                 (device (file-system-label "my-home")))

          UUID-Kennungen werden mit der ‘uuid’-Form von ihrer
          Darstellung als Zeichenkette (wie sie vom Befehl ‘tune2fs -l’
          angezeigt wird) konvertiert(2) wie hier:

               (file-system
                 (mount-point "/home")
                 (type "ext4")
                 (device (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")))

          Wenn die Quelle eines Dateisystems ein zugeordnetes Gerät
          (siehe *note Zugeordnete Geräte::) ist, _muss_ sich das
          ‘device’-Feld auf den zugeordneten Gerätenamen beziehen — z.B.
          ‘"/dev/mapper/root-partition"’. Das ist nötig, damit das
          System weiß, dass das Einbinden des Dateisystems davon
          abhängt, die entsprechende Gerätezuordnung hergestellt zu
          haben.

     ‘flags’ (Vorgabe: ‘'()’)
          Eine Liste von Symbolen, die Einbinde-Flags („mount flags“)
          bezeichnen. Erkannt werden unter anderem ‘read-only’,
          ‘bind-mount’, ‘no-dev’ (Zugang zu besonderen Dateien
          verweigern), ‘no-suid’ (setuid- und setgid-Bits ignorieren),
          ‘no-atime’ (Dateizugriffs-Zeitstempel _nicht_ aktualisieren),
          ‘strict-atime’ (Dateizugriffs-Zeitstempel immer
          aktualisieren), ‘lazy-time’ (Zeitstempel nur auf
          zwischengespeicherten Datei-Inodes im Arbeitsspeicher
          aktualisieren) und ‘no-exec’ (Programmausführungen
          verweigern). Siehe *note (libc)Mount-Unmount-Remount:: für
          mehr Informationen zu diesen Einbinde-Optionen.

     ‘options’ (Vorgabe: ‘#f’)
          Entweder ‘#f’ oder eine Zeichenkette mit Einbinde-Optionen
          („mount options“), die an den Dateisystemtreiber übergeben
          werden. Siehe *note (libc)Mount-Unmount-Remount:: für Details;
          führen Sie ‘man 8 mount’ aus, um die Einbinde-Optionen
          verschiedener Dateisysteme zu sehen. Beachten Sie, dass die
          Prozeduren ‘file-system-options->alist’ und
          ‘alist->file-system-options’ aus ‘(gnu system file-systems)’
          benutzt werden können, um als assoziative Liste dargestellte
          Dateisystemoptionen in eine Darstellung als Zeichenkette
          umzuwandeln und umgekehrt.

     ‘mount?’ (Vorgabe: ‘#t’)
          Dieser Wert zeigt an, ob das Dateisystem automatisch
          eingebunden werden soll, wenn das System gestartet wird. Ist
          der Wert ‘#f’, dann erhält das Dateisystem nur einen Eintrag
          in der Datei ‘/etc/fstab’ (welche vom ‘mount’-Befehl zum
          Einbinden gelesen wird), es wird aber nicht automatisch
          eingebunden.

     ‘needed-for-boot?’ (Vorgabe: ‘#f’)
          Dieser boolesche Wert gibt an, ob das Dateisystem zum
          Hochfahren des Systems notwendig ist. In diesem Fall wird das
          Dateisystem eingebunden, wenn die initiale RAM-Disk (initrd)
          geladen wird. Für zum Beispiel das Wurzeldateisystem ist dies
          ohnehin immer der Fall.

     ‘check?’ (Vorgabe: ‘#t’)
          Dieser boolesche Wert sagt aus, ob das Dateisystem vor dem
          Einbinden auf Fehler hin geprüft werden soll.

     ‘create-mount-point?’ (Vorgabe: ‘#f’)
          Steht dies auf wahr, wird der Einhängepunkt vor dem Einbinden
          erstellt, wenn er noch nicht existiert.

     ‘mount-may-fail?’ (Vorgabe: ‘#f’)
          Wenn dies auf wahr steht, bedeutet es, dass das Einbinden
          dieses Dateisystems scheitern kann, dies aber nicht als Fehler
          aufgefasst werden soll. Das braucht man in besonderen Fällen,
          zum Beispiel wird es für ‘efivarfs’ benutzt, einem
          Dateisystem, das nur auf EFI-/UEFI-Systemen eingebunden werden
          kann.

     ‘dependencies’ (Vorgabe: ‘'()’)
          Dies ist eine Liste von ‘<file-system>’- oder
          ‘<mapped-device>’-Objekten, die Dateisysteme repräsentieren,
          die vor diesem Dateisystem eingebunden oder zugeordnet werden
          müssen (und nach diesem ausgehängt oder geschlossen werden
          müssen).

          Betrachten Sie zum Beispiel eine Hierarchie von Einbindungen:
          ‘/sys/fs/cgroup’ ist eine Abhängigkeit von
          ‘/sys/fs/cgroup/cpu’ und ‘/sys/fs/cgroup/memory’.

          Ein weiteres Beispiel ist ein Dateisystem, was von einem
          zugeordneten Gerät abhängt, zum Beispiel zur Verschlüsselung
          einer Partition (siehe *note Zugeordnete Geräte::).

 -- Scheme-Prozedur: file-system-label ZEICHENKETTE
     Diese Prozedur kapselt die ZEICHENKETTE in einer opaken
     Dateisystembezeichnung:

          (file-system-label "home")
          ⇒ #<file-system-label "home">

     Mit Dateisystembezeichnungen werden Dateisysteme anhand ihrer
     Bezeichnung („Label“) statt ihres Gerätenamens („Device Name“)
     identifiziert. Siehe die Beispiele oben.

   Das Modul ‘(gnu system file-systems)’ exportiert die folgenden
nützlichen Variablen.

 -- Scheme-Variable: %base-file-systems
     Hiermit werden essenzielle Dateisysteme bezeichnet, die für normale
     Systeme unverzichtbar sind, wie zum Beispiel
     ‘%pseudo-terminal-file-system’ und ‘%immutable-store’ (siehe
     unten). Betriebssystemdeklaration sollten auf jeden Fall mindestens
     diese enthalten.

 -- Scheme-Variable: %pseudo-terminal-file-system
     Das als ‘/dev/pts’ einzubindende Dateisystem. Es unterstützt über
     ‘openpty’ und ähnliche Funktionen erstellte “Pseudo-Terminals”
     (siehe *note (libc)Pseudo-Terminals::). Pseudo-Terminals werden von
     Terminal-Emulatoren wie ‘xterm’ benutzt.

 -- Scheme-Variable: %shared-memory-file-system
     Dieses Dateisystem wird als ‘/dev/shm’ eingebunden, um Speicher
     zwischen Prozessen teilen zu können (siehe *note ‘shm_open’:
     (libc)Memory-mapped I/O.).

 -- Scheme-Variable: %immutable-store
     Dieses Dateisystem vollzieht einen „bind mount“ des ‘/gnu/store’,
     um ihn für alle Nutzer einschließlich des Administratornutzers
     ‘root’ nur lesbar zu machen, d.h. Schreibrechte zu entziehen.
     Dadurch kann als ‘root’ ausgeführte Software, oder der
     Systemadministrator, nicht aus Versehen den Store modifizieren.

     Der Daemon kann weiterhin in den Store schreiben, indem er ihn
     selbst mit Schreibrechten in seinem eigenen „Namensraum“ einbindet.

 -- Scheme-Variable: %binary-format-file-system
     Das ‘binfmt_misc’-Dateisystem, durch das beliebige Dateitypen als
     ausführbare Dateien auf der Anwendungsebene (dem User Space)
     zugänglich gemacht werden können. Es setzt voraus, dass das
     Kernel-Modul ‘binfmt.ko’ geladen wurde.

 -- Scheme-Variable: %fuse-control-file-system
     Das ‘fusectl’-Dateisystem, womit „unprivilegierte“ Nutzer ohne
     besondere Berechtigungen im User Space FUSE-Dateisysteme einbinden
     und aushängen können. Dazu muss das Kernel-Modul ‘fuse.ko’ geladen
     sein.

   Das Modul ‘(gnu system uuid)’ stellt Werkzeug zur Verfügung, um mit
eindeutigen Identifikatoren für Dateisysteme umzugehen (sogenannten
„Unique Identifiers“, UUIDs).

 -- Scheme-Prozedur: uuid ZEICHENKETTE [TYP]
     Liefert eine eindeutige UUID (Unique Identifier) als opakes Objekt
     des angegebenen TYPs (ein Symbol), indem die ZEICHENKETTE
     verarbeitet wird:

          (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")
          ⇒ #<<uuid> type: dce bv: …>

          (uuid "1234-ABCD" 'fat)
          ⇒ #<<uuid> type: fat bv: …>

     Als TYP kann entweder ‘dce’, ‘iso9660’, ‘fat’, ‘ntfs’ oder eines
     der üblichen Synonyme dafür angegeben werden.

     UUIDs bieten eine andere Möglichkeit, sich in der
     Betriebssystemkonfiguration ohne Mehrdeutigkeiten auf eines der
     Dateisysteme zu beziehen. Siehe die Beispiele oben.

* Menu:

* Btrfs-Dateisystem::

   ---------- Footnotes ----------

   (1) Beachten Sie: Obwohl es verführerisch ist, mit
‘/dev/disk/by-uuid’ und ähnlichen Gerätenamen dasselbe Resultat bekommen
zu wollen, raten wir davon ab: Diese speziellen Geräte werden erst vom
udev-Daemon erzeugt und sind, wenn die Geräte eingebunden werden,
vielleicht noch nicht verfügbar.

   (2) Die ‘uuid’-Form nimmt 16-Byte-UUIDs entgegen, wie sie in RFC 4122
(https://tools.ietf.org/html/rfc4122) definiert sind. Diese Form der
UUID wird unter anderem von der ext2-Familie von Dateisystemen
verwendet, sie unterscheidet sich jedoch zum Beispiel von den „UUID“
genannten Kennungen, wie man sie bei FAT-Dateisystemen findet.


File: guix.de.info,  Node: Btrfs-Dateisystem,  Up: Dateisysteme

10.3.1 Btrfs-Dateisystem
------------------------

Das Btrfs-Dateisystem bietet besondere Funktionalitäten, wie z.B.
Unterlaufwerke („Subvolumes“), die eine detailliertere Erklärung
verdienen. Im folgenden Abschnitt wird versucht, grundlegende sowie
komplexe Anwendungsmöglichkeiten eines Btrfs-Dateisystem für Guix System
abzudecken.

   Im einfachsten Fall kann ein Btrfs-Dateisystem durch einen Ausdruck
wie hier beschrieben werden:

     (file-system
       (mount-point "/home")
       (type "btrfs")
       (device (file-system-label "my-home")))

   Nun folgt ein komplexeres Beispiel, bei dem ein Btrfs-Unterlaufwerk
namens ‘rootfs’ benutzt wird. Dessen Eltern-Btrfs-Dateisystem wird mit
‘my-btrfs-pool’ bezeichnet und befindet sich auf einem verschlüsselten
Gerät (daher die Abhängigkeit von ‘mapped-devices’):

     (file-system
       (device (file-system-label "my-btrfs-pool"))
       (mount-point "/")
       (type "btrfs")
       (options "subvol=rootfs")
       (dependencies mapped-devices))

   Manche Bootloader, wie zum Beispiel GRUB, binden von einer
Btrfs-Partition zuerst beim frühen Boot („early boot“) nur die oberste
Ebene ein und verlassen sich darauf, dass ihre Konfiguration den
korrekten Pfad samt Unterlaufwerk innerhalb dieser obersten Ebene
enthält. Auf diese Weise arbeitende Bootloader erzeugen ihre
Konfiguration normalerweise auf einem laufenden System, auf dem die
Btrfs-Partitionen bereits eingebunden sind und die Informationen über
die Unterlaufwerke zur Verfügung stehen. Zum Beispiel liest
‘grub-mkconfig’, der bei GRUB mitgelieferte Befehl zur Erzeugung von
Konfigurationsdateien, aus ‘/proc/self/mountinfo’, um festzustellen, was
auf oberster Ebene der Pfad zum Unterlaufwerk ist.

   Guix System hingegen erzeugt eine Bootloader-Konfiguration mit der
Betriebssystemkonfiguration als einzige Eingabe. Daher muss der Name des
Unterlaufwerks, auf dem sich ‘/gnu/store’ befindet (falls Sie eines
benutzen) aus derselben Betriebssystemkonfiguration kommen. Um das
besser zu veranschaulichen, betrachten Sie ein Unterlaufwerk namens
„rootfs“, das die Daten des Wurzeldateisystems speichert. In einer
solchen Situation würde der GRUB-Bootloader nur die oberste Ebene der
Wurzel-Btrfs-Partition sehen, z.B.:

     /                   (oberste Ebene)
     ├── rootfs          (Unterlaufwerk als Verzeichnis)
         ├── gnu         (normales Verzeichnis)
             ├── store   (normales Verzeichnis)
     […]

   Deswegen muss der Name des Unterlaufwerks dem ‘/gnu/store’-Pfad des
Kernels, der initrd und jeder anderen Datei vorangestellt werden, die
die GRUB-Konfiguration referenziert und während des frühen Boots
gefunden werden können muss.

   Das nächste Beispiel zeigt eine verschachtelte Hierarchie aus
Unterlaufwerken und Verzeichnissen:

     /                   (oberste Ebene)
     ├── rootfs          (Unterlaufwerk)
         ├── gnu         (normales Verzeichnis)
             ├── store   (Unterlaufwerk)
     […]

   Dieses Szenario würde ohne Einbinden des „store“-Unterlaufwerks
funktionieren. „rootfs“ genügt, weil der Name des Unterlaufwerks dem
dafür vorgesehenen Einhängepunkt in der Dateisystemhierarchie
entspricht. Alternativ könnte man das „store“-Unterlaufwerk durch
Festlegen der ‘subvol’-Option auf entweder ‘/rootfs/gnu/store’ oder
‘rootfs/gnu/store’ verwenden.

   Abschließend folgt ein ausgeklügelteres Beispiel verschachtelter
Unterlaufwerke:

     /                           (oberste Ebene)
     ├── root-snapshots          (Unterlaufwerk)
         ├── root-current        (Unterlaufwerk)
             ├── guix-store      (Unterlaufwerk)
     […]

   Hier stimmt das „guix-store“-Unterlaufwerk nicht mit dem vorgesehenen
Einhängepunkt überein, daher muss es eingebunden werden. Das
Unterlaufwerk muss vollständig spezifiziert werden, indem sein Dateiname
an die ‘subvol’-Option übergeben wird. Eine Möglichkeit wäre, das
„guix-store“-Unterlaufwerk als ‘/gnu/store’ über eine solche
Dateisystemdeklaration einzubinden:

     (file-system
       (device (file-system-label "btrfs-pool-1"))
       (mount-point "/gnu/store")
       (type "btrfs")
       (options "subvol=root-snapshots/root-current/guix-store,\
     compress-force=zstd,space_cache=v2"))


File: guix.de.info,  Node: Zugeordnete Geräte,  Next: Benutzerkonten,  Prev: Dateisysteme,  Up: Systemkonfiguration

10.4 Zugeordnete Geräte
=======================

Der Linux-Kernel unterstützt das Konzept der “Gerätezuordnung”: Ein
blockorientiertes Gerät wie eine Festplattenpartition kann einem neuen
Gerät “zugeordnet” werden, gewöhnlich unter ‘/dev/mapper/’, wobei das
neue Gerät durchlaufende Daten zusätzlicher Verarbeitung unterzogen
werden(1). Ein typisches Beispiel ist eine Gerätezuordnung zur
Verschlüsselung: Jeder Schreibzugriff auf das zugeordnete Gerät wird
transparent verschlüsselt und jeder Lesezugriff ebenso entschlüsselt.
Guix erweitert dieses Konzept, indem es darunter jedes Gerät und jede
Menge von Geräten versteht, die auf irgendeine Weise “umgewandelt” wird,
um ein neues Gerät zu bilden; zum Beispiel entstehen auch RAID-Geräte
aus einem “Verbund” mehrerer anderer Geräte, wie etwa Festplatten oder
Partition zu einem einzelnen Gerät, das sich wie eine Partition verhält.

   Zugeordnete Geräte werden mittels einer ‘mapped-device’-Form
deklariert, die wie folgt definiert ist; Beispiele folgen weiter unten.

 -- Datentyp: mapped-device
     Objekte dieses Typs repräsentieren Gerätezuordnungen, die gemacht
     werden, wenn das System hochfährt.

     ‘source’
          Es handelt sich entweder um eine Zeichenkette, die den Namen
          eines zuzuordnenden blockorientierten Geräts angibt, wie
          ‘"/dev/sda3"’, oder um eine Liste solcher Zeichenketten,
          sofern mehrere Geräts zu einem neuen Gerät verbunden werden.
          Im Fall von LVM ist es eine Zeichenkette, die den Namen der
          zuzuordnenden Datenträgergruppe (Volume Group) angibt.

     ‘target’
          Diese Zeichenkette gibt den Namen des neuen zugeordneten
          Geräts an. Bei Kernel-Zuordnern, wie verschlüsselten Geräten
          vom Typ ‘luks-device-mapping’, wird durch Angabe von
          ‘"my-partition"’ ein Gerät ‘"/dev/mapper/my-partition"’
          erzeugt. Bei RAID-Geräten vom Typ ‘raid-device-mapping’ muss
          der Gerätename als voller Pfad wie zum Beispiel ‘"/dev/md0"’
          angegeben werden. Logische Datenträger von LVM („LVM logical
          volumes“) vom Typ ‘lvm-device-mapping’ müssen angegeben werden
          als ‘"DATENTRÄGERGRUPPENNAME-LOGISCHERDATENTRÄGERNAME"’.

     ‘targets’
          Diese Liste von Zeichenketten gibt die Namen der neuen
          zugeordneten Geräte an, wenn es mehrere davon gibt. Das Format
          ist mit TARGET identisch.

     ‘type’
          Dies muss ein ‘mapped-device-kind’-Objekt sein, das angibt,
          wie die Quelle SOURCE dem Ziel TARGET zugeordnet wird.

 -- Scheme-Variable: luks-device-mapping
     Hiermit wird ein blockorientiertes Gerät mit LUKS verschlüsselt,
     mit Hilfe des Befehls ‘cryptsetup’ aus dem gleichnamigen Paket.
     Dazu wird das Linux-Kernel-Modul ‘dm-crypt’ vorausgesetzt.

 -- Scheme-Variable: raid-device-mapping
     Dies definiert ein RAID-Gerät, das mit dem Befehl ‘mdadm’ aus dem
     gleichnamigen Paket als Verbund zusammengestellt wird. Es setzt
     voraus, dass das Linux-Kernel-Modul für das entsprechende
     RAID-Level geladen ist, z.B. ‘raid456’ für RAID-4, RAID-5 oder
     RAID-6, oder ‘raid10’ für RAID-10.

 -- Scheme-Variable: lvm-device-mapping
     Hiermit wird ein oder mehrere logische Datenträger („Logical
     Volumes“) für den Logical Volume Manager (LVM)
     (https://www.sourceware.org/lvm2/) für Linux definiert. Die
     Datenträgergruppe („Volume Group“) wird durch den Befehl ‘vgchange’
     aus dem ‘lvm2’-Paket aktiviert.

   Das folgende Beispiel gibt eine Zuordnung von ‘/dev/sda3’ auf
‘/dev/mapper/home’ mit LUKS an — dem Linux Unified Key Setup
(https://gitlab.com/cryptsetup/cryptsetup), einem Standardmechanismus
zur Plattenverschlüsselung. Das Gerät ‘/dev/mapper/home’ kann dann als
‘device’ einer ‘file-system’-Deklaration benutzt werden (siehe *note
Dateisysteme::).

     (mapped-device
       (source "/dev/sda3")
       (target "home")
       (type luks-device-mapping))

   Um nicht davon abhängig zu sein, wie Ihre Geräte nummeriert werden,
können Sie auch die LUKS-UUID (“unique identifier”, d.h. den eindeutigen
Bezeichner) des Quellgeräts auf der Befehlszeile ermitteln:

     cryptsetup luksUUID /dev/sda3

   und wie folgt benutzen:

     (mapped-device
       (source (uuid "cb67fc72-0d54-4c88-9d4b-b225f30b0f44"))
       (target "home")
       (type luks-device-mapping))

   Es ist auch wünschenswert, Swap-Speicher zu verschlüsseln, da in den
Swap-Speicher sensible Daten ausgelagert werden können. Eine Möglichkeit
ist, eine Swap-Datei auf einem mit LUKS-Verschlüsselung zugeordneten
Dateisystem zu verwenden. Dann wird die Swap-Datei verschlüsselt, weil
das ganze Gerät verschlüsselt wird. Ein Beispiel finden Sie im Abschnitt
*note Disk Partitioning: Vor der Installation.

   Ein RAID-Gerät als Verbund der Partitionen ‘/dev/sda1’ und
‘/dev/sdb1’ kann wie folgt deklariert werden:

     (mapped-device
       (source (list "/dev/sda1" "/dev/sdb1"))
       (target "/dev/md0")
       (type raid-device-mapping))

   Das Gerät ‘/dev/md0’ kann als ‘device’ in einer
‘file-system’-Deklaration dienen (siehe *note Dateisysteme::). Beachten
Sie, dass das RAID-Level dabei nicht angegeben werden muss; es wird
während der initialen Erstellung und Formatierung des RAID-Geräts
festgelegt und später automatisch bestimmt.

   Logische Datenträger von LVM namens „alpha“ und „beta“ aus der
Datenträgergruppe (Volume Group) „vg0“ können wie folgt deklariert
werden:

     (mapped-device
       (source "vg0")
       (targets (list "vg0-alpha" "vg0-beta"))
       (type lvm-device-mapping))

   Die Geräte ‘/dev/mapper/vg0-alpha’ und ‘/dev/mapper/vg0-beta’ können
dann im ‘device’-Feld einer ‘file-system’-Deklaration verwendet werden
(siehe *note Dateisysteme::).

   ---------- Footnotes ----------

   (1) Beachten Sie, dass mit GNU Hurd kein Unterschied zwischen dem
Konzept eines „zugeordneten Geräts“ und dem eines Dateisystems besteht:
Dort werden bei beiden Ein- und Ausgabeoperationen auf eine Datei in
Operationen auf dessen Hintergrundspeicher _übersetzt_. Hurd
implementiert zugeordnete Geräte genau wie Dateisysteme mit dem
generischen “Übersetzer”-Mechanismus (siehe *note (hurd)Translators::).


File: guix.de.info,  Node: Benutzerkonten,  Next: Tastaturbelegung,  Prev: Zugeordnete Geräte,  Up: Systemkonfiguration

10.5 Benutzerkonten
===================

Benutzerkonten und Gruppen werden allein durch die
‘operating-system’-Deklaration des Betriebssystems verwaltet. Sie werden
mit den ‘user-account’- und ‘user-group’-Formen angegeben:

     (user-account
       (name "alice")
       (group "users")
       (supplementary-groups '("wheel"   ;zur sudo-Nutzung usw. berechtigen
                               "audio"   ;Soundkarte
                               "video"   ;Videogeräte wie Webcams
                               "cdrom")) ;die gute alte CD-ROM
       (comment "Bobs Schwester"))

   Hier sehen Sie ein Benutzerkonto, das eine andere Shell und ein
geändertes Persönliches Verzeichnis benutzt (die Vorgabe wäre
‘"/home/bob"’):

     (user-account
       (name "bob")
       (group "users")
       (comment "Alices Bruder")
       (shell (file-append zsh "/bin/zsh"))
       (home-directory "/home/robert"))

   Beim Hochfahren oder nach Abschluss von ‘guix system reconfigure’
stellt das System sicher, dass nur die in der
‘operating-system’-Deklaration angegebenen Benutzerkonten und Gruppen
existieren, mit genau den angegebenen Eigenschaften. Daher gehen durch
direkten Aufruf von Befehlen wie ‘useradd’ erwirkte Erstellungen oder
Modifikationen von Konten oder Gruppen verloren, sobald rekonfiguriert
oder neugestartet wird. So wird sichergestellt, dass das System genau so
funktioniert, wie es deklariert wurde.

 -- Datentyp: user-account
     Objekte dieses Typs repräsentieren Benutzerkonten. Darin können
     folgende Komponenten aufgeführt werden:

     ‘name’
          Der Name des Benutzerkontos.

     ‘group’
          Dies ist der Name (als Zeichenkette) oder die Bezeichnung (als
          Zahl) der Benutzergruppe, zu der dieses Konto gehört.

     ‘supplementary-groups’ (Vorgabe: ‘'()’)
          Dies kann optional als Liste von Gruppennamen angegeben
          werden, zu denen dieses Konto auch gehört.

     ‘uid’ (Vorgabe: ‘#f’)
          Dies ist entweder der Benutzeridentifikator dieses Kontos
          (seine „User ID“) als Zahl oder ‘#f’. Bei Letzterem wird vom
          System automatisch eine Zahl gewählt, wenn das Benutzerkonto
          erstellt wird.

     ‘comment’ (Vorgabe: ‘""’)
          Ein Kommentar zu dem Konto, wie etwa der vollständige Name des
          Kontoinhabers.

     ‘home-directory’
          Der Name des Persönlichen Verzeichnisses („Home“-Verzeichnis)
          für dieses Konto.

     ‘create-home-directory?’ (Vorgabe: ‘#t’)
          Zeigt an, ob das Persönliche Verzeichnis für das Konto
          automatisch erstellt werden soll, falls es noch nicht
          existiert.

     ‘shell’ (Vorgabe: Bash)
          Ein G-Ausdruck, der den Dateinamen des Programms angibt, das
          dem Benutzer als Shell dienen soll (siehe *note
          G-Ausdrücke::). Auf die Programmdatei der Bash-Shell würden
          Sie zum Beispiel so verweisen:

               (file-append bash "/bin/bash")

          … und so auf die Programmdatei von Zsh:

               (file-append zsh "/bin/zsh")

     ‘system?’ (Vorgabe: ‘#f’)
          Dieser boolesche Wert zeigt an, ob das Konto ein
          „System“-Benutzerkonto ist. Systemkonten werden manchmal
          anders behandelt, zum Beispiel werden sie auf grafischen
          Anmeldebildschirmen nicht aufgeführt.

     ‘password’ (Vorgabe: ‘#f’)
          Normalerweise lassen Sie dieses Feld auf ‘#f’ und
          initialisieren Benutzerpasswörter als ‘root’ mit dem
          ‘passwd’-Befehl. Die Benutzer lässt man ihr eigenes Passwort
          dann mit ‘passwd’ ändern. Mit ‘passwd’ festgelegte Passwörter
          bleiben natürlich beim Neustarten und beim Rekonfigurieren
          erhalten.

          Wenn Sie aber _doch_ ein anfängliches Passwort für ein Konto
          voreinstellen möchten, muss dieses Feld hier das
          verschlüsselte Passwort als Zeichenkette enthalten. Sie können
          dazu die Prozedur ‘crypt’ benutzen.

               (user-account
                 (name "charlie")
                 (group "users")

                 ;; Ein mit SHA-512 gehashtes initiales Passwort.
                 (password (crypt "InitialPassword!" "$6$abc")))

               Anmerkung: Der Hash dieses initialen Passworts wird in
               einer Datei im ‘/gnu/store’ abgelegt, auf die alle
               Benutzer Lesezugriff haben, daher ist Vorsicht geboten,
               wenn Sie diese Methode verwenden.

          Siehe *note (libc)Passphrase Storage:: für weitere
          Informationen über Passwortverschlüsselung und *note
          (guile)Encryption:: für Informationen über die Prozedur
          ‘crypt’ in Guile.

   Benutzergruppen-Deklarationen sind noch einfacher aufgebaut:

     (user-group (name "students"))

 -- Datentyp: user-group
     Dieser Typ gibt, nun ja, eine Benutzergruppe an. Es gibt darin nur
     ein paar Felder:

     ‘name’
          Der Name der Gruppe.

     ‘id’ (Vorgabe: ‘#f’)
          Der Gruppenbezeichner (eine Zahl). Wird er als ‘#f’ angegeben,
          wird automatisch eine neue Zahl reserviert, wenn die Gruppe
          erstellt wird.

     ‘system?’ (Vorgabe: ‘#f’)
          Dieser boolesche Wert gibt an, ob es sich um eine
          „System“-Gruppe handelt. Systemgruppen sind solche mit einer
          kleinen Zahl als Bezeichner.

     ‘password’ (Vorgabe: ‘#f’)
          Wie, Benutzergruppen können ein Passwort haben? Nun ja,
          anscheinend schon. Wenn es nicht auf ‘#f’ steht, gibt dieses
          Feld das Passwort der Gruppe an.

   Um Ihnen das Leben zu erleichtern, gibt es eine Variable, worin alle
grundlegenden Benutzergruppen aufgeführt sind, die man erwarten könnte:

 -- Scheme-Variable: %base-groups
     Die Liste von Basis-Benutzergruppen, von denen Benutzer und/oder
     Pakete erwarten könnten, dass sie auf dem System existieren. Dazu
     gehören Gruppen wie „root“, „wheel“ und „users“, sowie Gruppen, um
     den Zugriff auf bestimmte Geräte einzuschränken, wie „audio“,
     „disk“ und „cdrom“.

 -- Scheme-Variable: %base-user-accounts
     Diese Liste enthält Basis-Systembenutzerkonten, von denen Programme
     erwarten können, dass sie auf einem GNU/Linux-System existieren,
     wie das Konto „nobody“.

     Beachten Sie, dass das Konto „root“ für den Administratornutzer
     nicht dazugehört. Es ist ein Sonderfall und wird automatisch
     erzeugt, egal ob es spezifiziert wurde oder nicht.


File: guix.de.info,  Node: Tastaturbelegung,  Next: Locales,  Prev: Benutzerkonten,  Up: Systemkonfiguration

10.6 Tastaturbelegung
=====================

Um anzugeben, was jede Taste auf Ihrer Tastatur tut, müssen Sie angeben,
welche “Tastaturbelegung” das Betriebssystem benutzen soll. Wenn nichts
angegeben wird, ist die „US English“-QWERTY-Tastaturbelegung für
PC-Tastaturen mit 105 Tasten voreingestellt. Allerdings bevorzugen
Deutsch sprechende Nutzer meistens die deutsche QWERTZ-Tastaturbelegung,
Französisch sprechende haben lieber die AZERTY-Belegung und so weiter;
Hacker wollen vielleicht Dvorak oder Bépo als Tastaturbelegung benutzen
oder sogar eigene Anpassungen bei manchen Tasten vornehmen. Dieser
Abschnitt erklärt, wie das geht.

   Die Informationen über Ihre Tastaturbelegung werden an drei Stellen
gebraucht:

   • Der _Bootloader_ muss auslesen können, welche Tastaturbelegung Sie
     benutzen möchten (siehe *note ‘keyboard-layout’:
     Bootloader-Konfiguration.). Das ist praktisch, wenn Sie zum
     Beispiel die Passphrase Ihrer verschlüsselten Wurzelpartition mit
     der richtigen Tastaturbelegung eintippen wollen.

   • Der _Kernel des Betriebssystems_, Linux, braucht die Information,
     damit die Konsole richtig eingestellt ist (siehe *note
     ‘keyboard-layout’: „operating-system“-Referenz.).

   • Der _grafische Anzeigeserver_, meistens ist das Xorg, hat auch
     seine eigene Konfiguration der Tastaturbelegung (siehe *note
     ‘keyboard-layout’: X Window.).

   Mit Guix können Sie alle drei Komponenten separat konfigurieren, aber
zum Glück können Sie damit auch dieselbe Konfiguration der
Tastaturbelegung für alle drei benutzen.

   Tastaturbelegungen werden durch Verbundsobjekte repräsentiert, die
mit der Prozedur ‘keyboard-layout’ aus dem Modul ‘(gnu system keyboard)’
angelegt werden. Entsprechend der „X-Keyboard“-Erweiterung (XKB) verfügt
jede Tastaturbelegung über vier Attribute: einen Namen (oft ist das ein
Sprachkürzel wie „fi“ für Finnisch oder „jp“ für Japanisch), ein
optionaler Variantenname, ein optionaler Tastaturmodellname und eine
möglicherweise leere Liste zusätzlicher Optionen. In den meisten Fällen
interessiert Sie nur der Name der Tastaturbelegung.

 -- Scheme-Prozedur: keyboard-layout NAME [VARIANTE] [#:model]
          [#:options '()] Liefert eine neue Tastaturbelegung mit dem
     angegebenen NAMEn in der VARIANTE.

     Der NAME muss eine Zeichenkette wie ‘"fr"’ sein und die VARIANTE
     eine Zeichenkette wie ‘"bepo"’ oder ‘"nodeadkeys"’. Siehe das Paket
     ‘xkeyboard-config’ für Informationen, welche Optionen gültig sind.

   Hier sind ein paar Beispiele:

     ;; Die deutsche QWERTZ-Belegung. Hierbei nehmen wir
     ;; ein Standard-"pc105"-Tastaturmodell an.
     (keyboard-layout "de")

     ;; Die Bépo-Variante der französischen Belegung.
     (keyboard-layout "fr" "bepo")

     ;; Die katalanische Tastaturbelegung.
     (keyboard-layout "es" "cat")

     ;; Arabische Tastaturbelegung. "Alt-Umschalt" wechselt auf US-Amerikanisch.
     (keyboard-layout "ar,us" #:options '("grp:alt_shift_toggle"))

     ;; Die lateinamerikanisch-spanische Tastaturbelegung. Des Weiteren
     ;; wird die Feststelltaste (auf Englisch "Caps Lock") als eine
     ;; weitere Steuerungstaste (auf Englisch "Ctrl") festgelegt und
     ;; die Menütaste soll als eine "Compose"-Taste herhalten, mit der
     ;; Buchstaben mit Diakritika geschrieben werden können.
     (keyboard-layout "latam"
                      #:options '("ctrl:nocaps" "compose:menu"))

     ;; Die russische Tastaturbelegung für eine ThinkPad-Tastatur.
     (keyboard-layout "ru" #:model "thinkpad")

     ;; Die Tastaturbelegung "US international", d.h. die US-Belegung
     ;; mit Tottasten zur Eingabe von Buchstaben mit Diakritika. Hier
     ;; wird die Belegung für eine Apple-MacBook-Tastatur gewählt.
     (keyboard-layout "us" "intl" #:model "macbook78")

   Im Verzeichnis ‘share/X11/xkb’ des ‘xkeyboard-config’-Pakets finden
Sie eine vollständige Liste der unterstützten Tastaturbelegungen,
Varianten und Modelle.

   Sagen wir, Sie würden gerne die türkische Tastaturbelegung für Ihr
gesamtes System — Bootloader, Konsole und Xorg — verwenden. Dann würde
Ihre Systemkonfiguration so aussehen:

     ;; Die türkische Tastaturbelegung für Bootloader, Konsole und Xorg
     ;; benutzen.

     (operating-system
       ;; …
       (keyboard-layout (keyboard-layout "tr"))  ;für die Konsole
       (bootloader (bootloader-configuration
                     (bootloader grub-efi-bootloader)
                     (target "/boot/efi")
                     (keyboard-layout keyboard-layout))) ;für GRUB
       (services (cons (set-xorg-configuration
                         (xorg-configuration             ;für Xorg
                           (keyboard-layout keyboard-layout)))
                       %desktop-services)))

   Im obigen Beispiel beziehen wir uns für GRUB und Xorg einfach auf das
‘keyboard-layout’-Feld, was wir darüber definiert haben, wir könnten
aber auch eine andere Tastaturbelegung angeben. Die Prozedur
‘set-xorg-configuration’ kommuniziert an die grafische Anmeldeverwaltung
(d.h. nach Vorgabe an GDM), welche Xorg-Konfiguration verwendet werden
soll.

   Wir haben uns bisher damit auseinandergesetzt, wie die
_Voreinstellung_ für die Tastaturbelegung ausgewählt werden kann, die
das System annimmt, wenn es startet, aber zur Laufzeit kann sie geändert
werden:

   • Wenn Sie GNOME benutzen, können Sie in den Einstellungen dazu einen
     Eintrag „Region und Sprache“ finden, in dem Sie eine oder mehrere
     Tastaturbelegungen auswählen können.

   • Unter Xorg können Sie den Befehl ‘setxkbmap’ (aus dem gleichnamigen
     Paket) zum Anpassen der momentan aktiven Tastaturbelegung benutzen.
     Zum Beispiel würden Sie so die Belegung auf US Dvorak wechseln:

          setxkbmap us dvorak

   • Mit dem Befehl ‘loadkeys’ ändern Sie die für die Linux-Konsole
     geltende Tastaturbelegung. Allerdings ist zu beachten, dass
     ‘loadkeys’ _nicht_ die Kategorisierung der Tastaturbelegungen von
     XKB benutzt. Der Befehl, um die französische Bépo-Belegung zu
     laden, wäre folgender:

          loadkeys fr-bepo


File: guix.de.info,  Node: Locales,  Next: Dienste,  Prev: Tastaturbelegung,  Up: Systemkonfiguration

10.7 Locales
============

Eine “Locale” legt die kulturellen Konventionen einer bestimmten Sprache
und Region auf der Welt fest (siehe *note (libc)Locales::). Jede Locale
hat einen Namen, der typischerweise von der Form
‘SPRACHE_GEBIET.KODIERUNG’ — z.B. benennt ‘fr_LU.utf8’ die Locale für
französische Sprache mit den kulturellen Konventionen aus Luxemburg
unter Verwendung der UTF-8-Kodierung.

   Normalerweise werden Sie eine standardmäßig zu verwendende Locale für
die Maschine vorgeben wollen, indem Sie das ‘locale’-Feld der
‘operating-system’-Deklaration verwenden (siehe *note ‘locale’:
„operating-system“-Referenz.).

   Die ausgewählte Locale wird automatisch zu den dem System bekannten
“Locale-Definitionen” hinzugefügt, falls nötig, und ihre Kodierung wird
aus dem Namen hergeleitet — z.B. wird angenommen, dass ‘bo_CN.utf8’ als
Kodierung ‘UTF-8’ verwendet. Zusätzliche Locale-Definitionen können im
Feld ‘locale-definitions’ vom ‘operating-system’ festgelegt werden — das
ist zum Beispiel dann nützlich, wenn die Kodierung nicht aus dem
Locale-Namen hergeleitet werden konnte. Die vorgegebene Menge an
Locale-Definitionen enthält manche weit verbreiteten Locales, aber um
Platz zu sparen, nicht alle verfügbaren Locales.

   Um zum Beispiel die nordfriesische Locale für Deutschland
hinzuzufügen, könnte der Wert des Feldes wie folgt aussehen:

     (cons (locale-definition
             (name "fy_DE.utf8") (source "fy_DE"))
           %default-locale-definitions)

   Um Platz zu sparen, könnte man auch wollen, dass ‘locale-definitions’
nur die tatsächlich benutzen Locales aufführt, wie etwa:

     (list (locale-definition
             (name "ja_JP.eucjp") (source "ja_JP")
             (charset "EUC-JP")))

   Die kompilierten Locale-Definitionen sind unter
‘/run/current-system/locale/X.Y’ verfügbar, wobei ‘X.Y’ die Version von
libc bezeichnet. Dies entspricht dem Pfad, an dem eine von Guix
ausgelieferte GNU libc standardmäßig nach Locale-Daten sucht. Er kann
überschrieben werden durch die Umgebungsvariable ‘LOCPATH’ (siehe *note
‘LOCPATH’ und Locale-Pakete: locales-and-locpath.).

   Die ‘locale-definition’-Form wird vom Modul ‘(gnu system locale)’ zur
Verfügung gestellt. Details folgen unten.

 -- Datentyp: locale-definition
     Dies ist der Datentyp einer Locale-Definition.

     ‘name’
          Der Name der Locale. Siehe *note (libc)Locale Names:: für mehr
          Informationen zu Locale-Namen.

     ‘source’
          Der Name der Quelle der Locale. Typischerweise ist das der
          Teil ‘SPRACHE_GEBIET’ des Locale-Namens.

     ‘charset’ (Vorgabe: ‘"UTF-8"’)
          Der „Zeichensatz“ oder das „Code set“, d.h. die Kodierung
          dieser Locale, wie die IANA sie definiert
          (https://www.iana.org/assignments/character-sets).

 -- Scheme-Variable: %default-locale-definitions
     Eine Liste häufig benutzter UTF-8-Locales, die als Vorgabewert des
     ‘locale-definitions’-Feldes in ‘operating-system’-Deklarationen
     benutzt wird.

     Diese Locale-Definitionen benutzen das “normalisierte Codeset” für
     den Teil des Namens, der nach dem Punkt steht (siehe *note
     normalisiertes Codeset: (libc)Using gettextized software.). Zum
     Beispiel ist ‘uk_UA.utf8’ enthalten, dagegen ist etwa ‘uk_UA.UTF-8’
     darin _nicht_ enthalten.

10.7.1 Kompatibilität der Locale-Daten
--------------------------------------

‘operating-system’-Deklarationen verfügen über ein ‘locale-libcs’-Feld,
um die GNU libc-Pakete anzugeben, die zum Kompilieren von
Locale-Deklarationen verwendet werden sollen (siehe *note
„operating-system“-Referenz::). „Was interessiert mich das?“, könnten
Sie fragen. Naja, leider ist das binäre Format der Locale-Daten von
einer libc-Version auf die nächste manchmal nicht miteinander
kompatibel.

   Zum Beispiel kann ein an die libc-Version 2.21 gebundenes Programm
keine mit libc 2.22 erzeugten Locale-Daten lesen; schlimmer noch, das
Programm _terminiert_ statt einfach die inkompatiblen Locale-Daten zu
ignorieren(1). Ähnlich kann ein an libc 2.22 gebundenes Programm die
meisten, aber nicht alle, Locale-Daten von libc 2.21 lesen (Daten zu
‘LC_COLLATE’ sind aber zum Beispiel inkompatibel); somit schlagen
Aufrufe von ‘setlocale’ vielleicht fehl, aber das Programm läuft weiter.

   Das „Problem“ mit Guix ist, dass Nutzer viel Freiheit genießen: Sie
können wählen, ob und wann sie die Software in ihren Profilen
aktualisieren und benutzen vielleicht eine andere libc-Version als sie
der Systemadministrator benutzt hat, um die systemweiten Locale-Daten zu
erstellen.

   Glücklicherweise können „unprivilegierte“ Nutzer ohne zusätzliche
Berechtigungen dann zumindest ihre eigenen Locale-Daten installieren und
‘GUIX_LOCPATH’ entsprechend definieren (siehe *note ‘GUIX_LOCPATH’ und
Locale-Pakete: locales-and-locpath.).

   Trotzdem ist es am besten, wenn die systemweiten Locale-Daten unter
‘/run/current-system/locale’ für alle libc-Versionen erstellt werden,
die auf dem System noch benutzt werden, damit alle Programme auf sie
zugreifen können — was auf einem Mehrbenutzersystem ganz besonders
wichtig ist. Dazu kann der Administrator des Systems mehrere libc-Pakete
im ‘locale-libcs’-Feld vom ‘operating-system’ angeben:

     (use-package-modules base)

     (operating-system
       ;; …
       (locale-libcs (list glibc-2.21 (canonical-package glibc))))

   Mit diesem Beispiel ergäbe sich ein System, was Locale-Definitionen
sowohl für libc 2.21 als auch die aktuelle Version von libc in
‘/run/current-system/locale’ hat.

   ---------- Footnotes ----------

   (1) Versionen 2.23 von GNU libc und neuere werden inkompatible
Locale-Daten nur mehr überspringen, was schon einmal eine Verbesserung
ist.


File: guix.de.info,  Node: Dienste,  Next: Setuid-Programme,  Prev: Locales,  Up: Systemkonfiguration

10.8 Dienste
============

Ein wichtiger Bestandteil des Schreibens einer
‘operating-system’-Deklaration ist das Auflisten der “Systemdienste” und
ihrer Konfiguration (siehe *note Das Konfigurationssystem nutzen::).
Systemdienste sind typischerweise im Hintergrund laufende
Daemon-Programme, die beim Hochfahren des Systems gestartet werden, oder
andere Aktionen, die zu dieser Zeit durchgeführt werden müssen — wie das
Konfigurieren des Netzwerkzugangs.

   Guix hat eine weit gefasste Definition, was ein „Dienst“ ist (siehe
*note Dienstkompositionen::), aber viele Dienste sind solche, die von
GNU Shepherd verwaltet werden (siehe *note Shepherd-Dienste::). Auf
einem laufenden System kann der ‘herd’-Befehl benutzt werden, um
verfügbare Dienste aufzulisten, ihren Status anzuzeigen, sie zu starten
und zu stoppen oder andere angebotene Operationen durchzuführen (siehe
*note (shepherd)Jump Start::). Zum Beispiel:

     # herd status

   Dieser Befehl, durchgeführt als ‘root’, listet die momentan
definierten Dienste auf. Der Befehl ‘herd doc’ fasst kurz zusammen, was
ein gegebener Dienst ist und welche Aktionen mit ihm assoziiert sind:

     # herd doc nscd
     Run libc's name service cache daemon (nscd).

     # herd doc nscd action invalidate
     invalidate: Invalidate the given cache--e.g., 'hosts' for host name lookups.

   Die Unterbefehle ‘start’, ‘stop’ und ‘restart’ haben die Wirkung, die
man erwarten würde. Zum Beispiel kann mit folgenden Befehlen der
nscd-Dienst angehalten und der Xorg-Anzeigeserver neu gestartet werden:

     # herd stop nscd
     Service nscd has been stopped.
     # herd restart xorg-server
     Service xorg-server has been stopped.
     Service xorg-server has been started.

   Die folgenden Abschnitte dokumentieren die verfügbaren Dienste, die
in einer ‘operating-system’-Deklaration benutzt werden können,
angefangen mit den Diensten im Kern des Systems („core services“)

* Menu:

* Basisdienste::             Essenzielle Systemdienste.
* Geplante Auftragsausführung::  Der mcron-Dienst.
* Log-Rotation::             Der rottlog-Dienst.
* Netzwerkdienste::          Netzwerkeinrichtung, SSH-Daemon etc.
* Unbeaufsichtigte Aktualisierungen::  Automatische Systemaktualisierungen.
* X Window::                 Grafische Anzeige.
* Druckdienste::             Unterstützung für lokale und entfernte
                               Drucker.
* Desktop-Dienste::          D-Bus- und Desktop-Dienste.
* Tondienste::               Dienste für ALSA und Pulseaudio.
* Datenbankdienste::         SQL-Datenbanken, Schlüssel-Wert-Speicher etc.
* Mail-Dienste::             IMAP, POP3, SMTP und so weiter.
* Kurznachrichtendienste::   Dienste für Kurznachrichten.
* Telefondienste::           Telefoniedienste.
* Dateientauschdienste::     File Sharing.
* Systemüberwachungsdienste::  Dienste zur Systemüberwachung.
* Kerberos-Dienste::         Kerberos-Dienste.
* LDAP-Dienste::             LDAP-Dienste.
* Web-Dienste::              Web-Server.
* Zertifikatsdienste::       TLS-Zertifikate via Let’s Encrypt.
* DNS-Dienste::              DNS-Daemons.
* VPN-Dienste::              VPN-Daemons.
* Network File System::      Dienste mit Bezug zum Netzwerkdateisystem.
* Kontinuierliche Integration::  Cuirass- und Laminar-Dienste.
* Dienste zur Stromverbrauchsverwaltung::  Den Akku schonen.
* Audio-Dienste::            Der MPD.
* Virtualisierungsdienste::  Dienste für virtuelle Maschinen.
* Versionskontrolldienste::  Entfernten Zugang zu Git-Repositorys bieten.
* Spieldienste::             Spielserver.
* PAM-Einbindedienst::       Dienst, um Datenträger beim Anmelden
                               einzubinden.
* Guix-Dienste::             Dienste, die speziell mit Guix zu tun haben.
* Linux-Dienste::            Dienste nur für Systeme mit Linux-Kernel.
* Hurd-Dienste::             Dienste, die nur Hurd-Systeme betreffen.
* Verschiedene Dienste::     Andere Dienste.


File: guix.de.info,  Node: Basisdienste,  Next: Geplante Auftragsausführung,  Up: Dienste

10.8.1 Basisdienste
-------------------

Das Modul ‘(gnu services base)’ stellt Definitionen für Basis-Dienste
zur Verfügung, von denen man erwartet, dass das System sie anbietet. Im
Folgenden sind die von diesem Modul exportierten Dienste aufgeführt.

 -- Scheme-Variable: %base-services
     Diese Variable enthält eine Liste von Basis-Diensten, die man auf
     einem System vorzufinden erwartet (siehe *note Diensttypen und
     Dienste:: für weitere Informationen zu Dienstobjekten): ein
     Anmeldungsdienst (mingetty) auf jeder Konsole (jedem „tty“),
     syslogd, den Name Service Cache Daemon (nscd) von libc, die
     udev-Geräteverwaltung und weitere.

     Dies ist der Vorgabewert für das ‘services’-Feld für die Dienste
     von ‘operating-system’-Deklarationen. Normalerweise werden Sie,
     wenn Sie ein Betriebssystem anpassen, Dienste an die
     ‘%base-services’-Liste anhängen, wie hier gezeigt:

          (append (list (service avahi-service-type)
                        (service openssh-service-type))
                  %base-services)

 -- Scheme-Variable: special-files-service-type
     Dieser Dienst richtet „besondere Dateien“ wie ‘/bin/sh’ ein; eine
     Instanz des Dienstes ist Teil der ‘%base-services’.

     Der mit ‘special-files-service-type’-Diensten assoziierte Wert muss
     eine Liste von Tupeln sein, deren erstes Element eine „besondere
     Datei“ und deren zweites Element deren Zielpfad ist. Der
     Vorgabewert ist:

          `(("/bin/sh" ,(file-append bash "/bin/sh")))

     Wenn Sie zum Beispiel auch ‘/usr/bin/env’ zu Ihrem System
     hinzufügen möchten, können Sie den Wert ändern auf:

          `(("/bin/sh" ,(file-append bash "/bin/sh"))
            ("/usr/bin/env" ,(file-append coreutils "/bin/env")))

     Da dieser Dienst Teil der ‘%base-services’ ist, können Sie
     ‘modify-services’ benutzen, um die Liste besonderer Dateien
     abzuändern (siehe *note ‘modify-services’: Service-Referenz.). Die
     leichte Alternative, um eine besondere Datei hinzuzufügen, ist über
     die Prozedur ‘extra-special-file’ (siehe unten).

 -- Scheme-Prozedur: extra-special-file DATEI ZIEL
     Das ZIEL als „besondere Datei“ DATEI verwenden.

     Beispielsweise können Sie die folgenden Zeilen in das
     ‘services’-Feld Ihrer Betriebssystemdeklaration einfügen für eine
     symbolische Verknüpfung ‘/usr/bin/env’:

          (extra-special-file "/usr/bin/env"
                              (file-append coreutils "/bin/env"))

 -- Scheme-Prozedur: host-name-service NAME
     Liefert einen Dienst, der den Rechnernamen (den „Host“-Namen des
     Rechners) als NAME festlegt.

 -- Scheme-Variable: console-font-service-type
     Installiert die angegebenen Schriftarten auf den festgelegten TTYs
     (auf dem Linux-Kernel werden Schriftarten für jede virtuelle
     Konsole einzeln festgelegt). Als Wert nimmt dieser Dienst eine
     Liste von Paaren aus TTY und Schriftart. Als Schriftart kann der
     Name einer vom ‘kbd’-Paket zur Verfügung gestellten Schriftart oder
     ein beliebiges gültiges Argument für ‘setfont’ dienen. Ein
     Beispiel:

          `(("tty1" . "LatGrkCyr-8x16")
            ("tty2" . ,(file-append
                          font-tamzen
                          "/share/kbd/consolefonts/TamzenForPowerline10x20.psf"))
            ("tty3" . ,(file-append
                          font-terminus
                          "/share/consolefonts/ter-132n"))) ; für HiDPI

 -- Scheme-Prozedur: login-service KONFIGURATION
     Liefert einen Dienst, der die Benutzeranmeldung möglich macht. Dazu
     verwendet er die angegebene KONFIGURATION, ein
     ‘<login-configuration>’-Objekt, das unter anderem die beim Anmelden
     angezeigte Mitteilung des Tages („Message of the Day“) festlegt.

 -- Datentyp: login-configuration
     Dies ist der Datentyp, der die Anmeldekonfiguration repräsentiert.

     ‘motd’
          Ein dateiartiges Objekt, das die „Message of the Day“ enthält.

     ‘allow-empty-passwords?’ (Vorgabe: ‘#t’)
          Leere Passwörter standardmäßig zulassen, damit sich neue
          Anwender anmelden können, direkt nachdem das Benutzerkonto
          „root“ für den Administrator angelegt wurde.

 -- Scheme-Prozedur: mingetty-service KONFIGURATION
     Liefert einen Dienst, der mingetty nach den Vorgaben der
     KONFIGURATION ausführt, einem ‘<mingetty-configuration>’-Objekt,
     das unter anderem die Konsole (das „tty“) festlegt, auf der
     mingetty laufen soll.

 -- Datentyp: mingetty-configuration
     Dieser Datentyp repräsentiert die Konfiguration von Mingetty, der
     vorgegebenen Implementierung zur Anmeldung auf einer virtuellen
     Konsole.

     ‘tty’
          Der Name der Konsole, auf der diese Mingetty-Instanz läuft —
          z.B. ‘"tty1"’.

     ‘auto-login’ (Vorgabe: ‘#f’)
          Steht dieses Feld auf wahr, muss es eine Zeichenkette sein,
          die den Benutzernamen angibt, als der man vom System
          automatisch angemeldet wird. Ist es ‘#f’, so muss zur
          Anmeldung ein Benutzername und ein Passwort eingegeben werden.

     ‘login-program’ (Vorgabe: ‘#f’)
          Dies muss entweder ‘#f’ sein, dann wird das voreingestellte
          Anmeldeprogramm benutzt (‘login’ aus dem Shadow-Werkzeugsatz)
          oder der Name des Anmeldeprogramms als G-Ausdruck.

     ‘login-pause?’ (Vorgabe: ‘#f’)
          Ist es auf ‘#t’ gesetzt, sorgt es in Verbindung mit AUTO-LOGIN
          dafür, dass der Benutzer eine Taste drücken muss, ehe eine
          Anmelde-Shell gestartet wird.

     ‘clear-on-logout?’ (Vorgabe: ‘#t’)
          Ist dies auf ‘#t’ gesetzt, wird der Bildschirm nach der
          Abmeldung _nicht_ gelöscht.

     ‘mingetty’ (Vorgabe: MINGETTY)
          Welches Mingetty-Paket benutzt werden soll.

 -- Scheme-Prozedur: agetty-service KONFIGURATION
     Liefert einen Dienst, um agetty entsprechend der KONFIGURATION
     auszuführen, welche ein ‘<agetty-configuration>’-Objekt sein muss,
     das unter anderem festlegt, auf welchem tty es laufen soll.

 -- Datentyp: agetty-configuration
     Dies ist der Datentyp, der die Konfiguration von agetty
     repräsentiert, was Anmeldungen auf einer virtuellen oder seriellen
     Konsole implementiert. Siehe die Handbuchseite ‘agetty(8)’ für mehr
     Informationen.

     ‘tty’
          Der Name der Konsole, auf der diese Instanz von agetty läuft,
          als Zeichenkette — z.B. ‘"ttyS0"’. Dieses Argument ist
          optional, sein Vorgabewert ist eine vernünftige Wahl unter den
          seriellen Schnittstellen, auf deren Benutzung der Linux-Kernel
          eingestellt ist.

          Hierzu wird, wenn in der Kernel-Befehlszeile ein Wert für eine
          Option namens ‘agetty.tty’ festgelegt wurde, der Gerätename
          daraus für agetty extrahiert und benutzt.

          Andernfalls wird agetty, falls auf der Kernel-Befehlszeile
          eine Option ‘console’ mit einem tty vorkommt, den daraus
          extrahierten Gerätenamen der seriellen Schnittstelle benutzen.

          In beiden Fällen wird agetty nichts an den anderen
          Einstellungen für serielle Geräte verändern (Baud-Rate etc.),
          in der Hoffnung, dass Linux sie auf die korrekten Werte
          festgelegt hat.

     ‘baud-rate’ (Vorgabe: ‘#f’)
          Eine Zeichenkette, die aus einer kommagetrennten Liste von
          einer oder mehreren Baud-Raten besteht, absteigend sortiert.

     ‘term’ (Vorgabe: ‘#f’)
          Eine Zeichenkette, die den Wert enthält, der für die
          Umgebungsvariable ‘TERM’ benutzt werden soll.

     ‘eight-bits?’ (Vorgabe: ‘#f’)
          Steht dies auf ‘#t’, wird angenommen, dass das tty
          8-Bit-korrekt ist, so dass die Paritätserkennung abgeschaltet
          wird.

     ‘auto-login’ (Vorgabe: ‘#f’)
          Wird hier ein Anmeldename als eine Zeichenkette übergeben,
          wird der angegebene Nutzer automatisch angemeldet, ohne nach
          einem Anmeldenamen oder Passwort zu fragen.

     ‘no-reset?’ (Vorgabe: ‘#f’)
          Steht dies auf ‘#t’, werden die Cflags des Terminals (d.h.
          dessen Steuermodi) nicht zurückgesetzt.

     ‘host’ (Vorgabe: ‘#f’)
          Dies akzeptiert eine Zeichenkette mit dem einzutragenden
          Anmeldungs-Rechnernamen („login_host“), der in die Datei
          ‘/var/run/utmpx’ geschrieben wird.

     ‘remote?’ (Vorgabe: ‘#f’)
          Ist dies auf ‘#t’ gesetzt, wird in Verbindung mit HOST eine
          Befehlszeilenoption ‘-r’ für einen falschen Rechnernamen
          („Fakehost“) in der Befehlszeile des mit LOGIN-PROGRAM
          angegebenen Anmeldeprogramms übergeben.

     ‘flow-control?’ (Vorgabe: ‘#f’)
          Ist dies auf ‘#t’ gesetzt, wird Hardware-Flusssteuerung
          (RTS/CTS) aktiviert.

     ‘no-issue?’ (Vorgabe: ‘#f’)
          Ist dies auf ‘#t’ gesetzt, wird der Inhalt der Datei
          ‘/etc/issue’ _nicht_ angezeigt, bevor die Anmeldeaufforderung
          zu sehen ist.

     ‘init-string’ (Vorgabe: ‘#f’)
          Dies akzeptiert eine Zeichenkette, die zum tty oder zum Modem
          zuerst vor allem anderen gesendet wird. Es kann benutzt
          werden, um ein Modem zu initialisieren.

     ‘no-clear?’ (Vorgabe: ‘#f’)
          Ist dies auf ‘#t’ gesetzt, wird agetty den Bildschirm _nicht_
          löschen, bevor es die Anmeldeaufforderung anzeigt.

     ‘login-program’ (Vorgabe: (file-append shadow "/bin/login"))
          Hier muss entweder ein G-Ausdruck mit dem Namen eines
          Anmeldeprogramms übergeben werden, oder dieses Feld wird nicht
          gesetzt, so dass als Vorgabewert das Programm ‘login’ aus dem
          Shadow-Werkzeugsatz verwendet wird.

     ‘local-line’ (Vorgabe: ‘#f’)
          Steuert den Leitungsschalter CLOCAL. Hierfür wird eines von
          drei Symbolen als Argument akzeptiert, ‘'auto’, ‘'always’ oder
          ‘'never’. Für ‘#f’ wählt agetty als Vorgabewert ‘'auto’.

     ‘extract-baud?’ (Vorgabe: ‘#f’)
          Ist dies auf ‘#t’ gesetzt, so wird agetty angewiesen, die
          Baud-Rate aus den Statusmeldungen mancher Arten von Modem
          abzulesen.

     ‘skip-login?’ (Vorgabe: ‘#f’)
          Ist dies auf ‘#t’ gesetzt, wird der Benutzer nicht
          aufgefordert, einen Anmeldenamen einzugeben. Dies kann
          zusammen mit dem LOGIN-PROGRAM-Feld benutzt werden, um nicht
          standardkonforme Anmeldesysteme zu benutzen.

     ‘no-newline?’ (Vorgabe: ‘#f’)
          Ist dies auf ‘#t’ gesetzt, wird _kein_ Zeilenumbruch
          ausgegeben, bevor die Datei ‘/etc/issue’ ausgegeben wird.

     ‘login-options’ (Vorgabe: ‘#f’)
          Dieses Feld akzeptiert eine Zeichenkette mit den
          Befehlszeilenoptionen für das Anmeldeprogramm. Beachten Sie,
          dass bei einem selbst gewählten LOGIN-PROGRAM ein böswilliger
          Nutzer versuchen könnte, als Anmeldenamen etwas mit
          eingebetteten Befehlszeilenoptionen anzugeben, die vom
          Anmeldeprogramm interpretiert werden könnten.

     ‘login-pause’ (Vorgabe: ‘#f’)
          Ist dies auf ‘#t’ gesetzt, wird auf das Drücken einer
          beliebigen Taste gewartet, bevor die Anmeldeaufforderung
          angezeigt wird. Hiermit kann in Verbindung mit AUTO-LOGIN
          weniger Speicher verbraucht werden, indem man Shells erst
          erzeugt, wenn sie benötigt werden.

     ‘chroot’ (Vorgabe: ‘#f’)
          Wechselt die Wurzel des Dateisystems auf das angegebene
          Verzeichnis. Dieses Feld akzeptiert einen Verzeichnispfad als
          Zeichenkette.

     ‘hangup?’ (Vorgabe: ‘#f’)
          Mit dem Linux-Systemaufruf ‘vhangup’ auf dem angegebenen
          Terminal virtuell auflegen.

     ‘keep-baud?’ (Vorgabe: ‘#f’)
          Ist dies auf ‘#t’ gesetzt, wird versucht, die bestehende
          Baud-Rate beizubehalten. Die Baud-Raten aus dem Feld BAUD-RATE
          werden benutzt, wenn agetty ein <BREAK>-Zeichen empfängt.

     ‘timeout’ (Vorgabe: ‘#f’)
          Ist dies auf einen ganzzahligen Wert gesetzt, wird terminiert,
          falls kein Benutzername innerhalb von TIMEOUT Sekunden
          eingelesen werden konnte.

     ‘detect-case?’ (Vorgabe: ‘#f’)
          Ist dies auf ‘#t’ gesetzt, wird Unterstützung für die
          Erkennung von Terminals aktiviert, die nur Großschreibung
          beherrschen. Mit dieser Einstellung wird, wenn ein Anmeldename
          nur aus Großbuchstaben besteht, dieser als Anzeichen dafür
          aufgefasst, dass das Terminal nur Großbuchstaben beherrscht,
          und einige Umwandlungen von Groß- in Kleinbuchstaben
          aktiviert. Beachten Sie, dass dabei _keine_ Unicode-Zeichen
          unterstützt werden.

     ‘wait-cr?’ (Vorgabe: ‘#f’)
          Wenn dies auf ‘#t’ gesetzt ist, wird gewartet, bis der
          Benutzer oder das Modem einen Wagenrücklauf („Carriage
          Return“) oder einen Zeilenvorschub („Linefeed“) absendet, ehe
          ‘/etc/issue’ oder eine Anmeldeaufforderung angezeigt wird.
          Dies wird typischerweise zusammen mit dem Feld INIT-STRING
          benutzt.

     ‘no-hints?’ (Vorgabe: ‘#f’)
          Ist es auf ‘#t’ gesetzt, werden _keine_ Hinweise zu den
          Feststelltasten Num-Taste, Umschaltsperre („Caps Lock“) und
          Rollen-Taste („Scroll Lock“) angezeigt.

     ‘no-hostname?’ (Vorgabe: ‘#f’)
          Das vorgegebene Verhalten ist, den Rechnernamen auszugeben.
          Ist dieses Feld auf ‘#t’ gesetzt, wird überhaupt kein
          Rechnername angezeigt.

     ‘long-hostname?’ (Vorgabe: ‘#f’)
          Das vorgegebene Verhalten ist, den Rechnernamen nur bis zu
          seinem ersten Punkt anzuzeigen. Ist dieses Feld auf ‘#t’
          gesetzt, wird der vollständige Rechnername (der „Fully
          Qualified Hostname“), wie ihn ‘gethostname’ oder ‘getaddrinfo’
          liefern, angezeigt.

     ‘erase-characters’ (Vorgabe: ‘#f’)
          Dieses Feld akzeptiert eine Zeichenkette aus Zeichen, die auch
          als Rücktaste (zum Löschen) interpretiert werden sollen, wenn
          der Benutzer seinen Anmeldenamen eintippt.

     ‘kill-characters’ (Vorgabe: ‘#f’)
          Dieses Feld akzeptiert eine Zeichenkette aus Zeichen, deren
          Eingabe als „ignoriere alle vorherigen Zeichen“ interpretiert
          werden soll (auch „Kill“-Zeichen genannt), wenn der Benutzer
          seinen Anmeldenamen eintippt.

     ‘chdir’ (Vorgabe: ‘#f’)
          Dieses Feld akzeptiert eine Zeichenkette, die einen
          Verzeichnispfad angibt, zu dem vor der Anmeldung gewechselt
          wird.

     ‘delay’ (Vorgabe: ‘#f’)
          Dieses Feld akzeptiert eine ganze Zahl mit der Anzahl
          Sekunden, die gewartet werden soll, bis ein tty geöffnet und
          die Anmeldeaufforderung angezeigt wird.

     ‘nice’ (Vorgabe: ‘#f’)
          Dieses Feld akzeptiert eine ganze Zahl mit dem „nice“-Wert,
          mit dem das Anmeldeprogramm ausgeführt werden soll.

     ‘extra-options’ (Vorgabe: ‘'()’)
          Dieses Feld ist ein „Notausstieg“, mit dem Nutzer beliebige
          Befehlszeilenoptionen direkt an ‘agetty’ übergeben können.
          Diese müssen hier als eine Liste von Zeichenketten angegeben
          werden.

 -- Scheme-Prozedur: kmscon-service-type KONFIGURATION
     Liefert einen Dienst, um kmscon
     (https://www.freedesktop.org/wiki/Software/kmscon) entsprechend der
     KONFIGURATION auszuführen. Diese ist ein
     ‘<kmscon-configuration>’-Objekt, das unter anderem angibt, auf
     welchem tty es ausgeführt werden soll.

 -- Datentyp: kmscon-configuration
     Dieser Datentyp repräsentiert die Konfiguration von Kmscon, die das
     Anmelden auf virtuellen Konsolen ermöglicht.

     ‘virtual-terminal’
          Der Name der Konsole, auf der diese Kmscon läuft — z.B.
          ‘"tty1"’.

     ‘login-program’ (Vorgabe: ‘#~(string-append #$shadow "/bin/login")’)
          Ein G-Ausdruck, der den Namen des Anmeldeprogramms angibt. Als
          Vorgabe wird das Anmeldeprogramm ‘login’ aus dem
          Shadow-Werkzeugsatz verwendet.

     ‘login-arguments’ (Vorgabe: ‘'("-p")’)
          Eine Liste der Argumente, die an ‘login’ übergeben werden
          sollen.

     ‘auto-login’ (Vorgabe: ‘#f’)
          Wird hier ein Anmeldename als eine Zeichenkette übergeben,
          wird der angegebene Nutzer automatisch angemeldet, ohne nach
          einem Anmeldenamen oder Passwort zu fragen.

     ‘hardware-acceleration?’ (Vorgabe: #f)
          Ob Hardware-Beschleunigung verwendet werden soll.

     ‘font-engine’ (Vorgabe: ‘"pango"’)
          Welcher Schriftartentreiber in Kmscon benutzt wird.

     ‘font-size’ (Vorgabe: ‘12’)
          Welche Schriftgröße in Kmscon benutzt wird.

     ‘kmscon’ (Vorgabe: KMSCON)
          Das Kmscon-Paket, das benutzt werden soll.

 -- Scheme-Prozedur: nscd-service [KONFIGURATION] [#:glibc glibc]
          [#:name-services '()] Liefert einen Dienst, der den Name
          Service Cache
     Daemon (nscd) von libc mit der angegebenen KONFIGURATION ausführt —
     diese muss ein ‘<nscd-configuration>’-Objekt sein. Siehe *note Name
     Service Switch:: für ein Beispiel.

     Der Einfachheit halber bietet der Shepherd-Dienst für nscd die
     folgenden Aktionen an:

     ‘invalidate’
          Dies macht den angegebenen Zwischenspeicher ungültig. Wenn Sie
          zum Beispiel:

               herd invalidate nscd hosts

          ausführen, wird der Zwischenspeicher für die Auflösung von
          Rechnernamen (von „Host“-Namen) des nscd ungültig.

     ‘statistics’
          Wenn Sie ‘herd statistics nscd’ ausführen, werden Ihnen
          Informationen angezeigt, welche Ihnen Informationen über den
          nscd-Zustand und die Zwischenspeicher angezeigt.

 -- Scheme-Variable: %nscd-default-configuration
     Dies ist der vorgegebene Wert für die ‘<nscd-configuration>’ (siehe
     unten), die ‘nscd-service’ benutzt. Die Konfiguration benutzt die
     Zwischenspeicher, die in ‘%nscd-default-caches’ definiert sind;
     siehe unten.

 -- Datentyp: nscd-configuration
     Dieser Datentyp repräsentiert die Konfiguration des Name Service
     Caching Daemon (kurz „nscd“).

     ‘name-services’ (Vorgabe: ‘'()’)
          Liste von Paketen, die “Namensdienste” bezeichnen, die für den
          nscd sichtbar sein müssen, z.B. ‘(list NSS-MDNS)’.

     ‘glibc’ (Vorgabe: GLIBC)
          Ein Paket-Objekt, das die GNU-C-Bibliothek angibt, woraus der
          ‘nscd’-Befehl genommen werden soll.

     ‘log-file’ (Vorgabe: ‘"/var/log/nscd.log"’)
          Name der nscd-Protokolldatei. Hierhin werden Ausgaben zur
          Fehlersuche geschrieben, falls ‘debug-level’ echt positiv ist.

     ‘debug-level’ (Vorgabe: ‘0’)
          Eine ganze Zahl, die den Detailgrad der Ausgabe zur
          Fehlersuche angibt. Größere Zahlen bewirken eine
          ausführlichere Ausgabe.

     ‘caches’ (Vorgabe: ‘%nscd-default-caches’)
          Liste der ‘<nscd-cache>’-Objekte, die repräsentieren, was
          alles zwischengespeichert werden soll; siehe unten.

 -- Datentyp: nscd-cache
     Ein Datentyp, der eine Zwischenspeicher-Datenbank von nscd mitsamt
     ihren Parametern definiert.

     ‘Datenbank’
          Dies ist ein Symbol, was den Namen der Datenbank
          repräsentiert, die zwischengespeichert werden soll. Gültige
          Werte sind ‘passwd’, ‘group’, ‘hosts’ und ‘services’, womit
          jeweils die entsprechende NSS-Datenbank bezeichnet wird (siehe
          *note (libc)NSS Basics::).

     ‘positive-time-to-live’
     ‘negative-time-to-live’ (Vorgabe: ‘20’)
          Eine Zahl, die für die Anzahl an Sekunden steht, die ein
          erfolgreiches (positives) oder erfolgloses (negatives)
          Nachschlageresultat im Zwischenspeicher verbleibt.

     ‘check-files?’ (Vorgabe: ‘#t’)
          Ob auf Änderungen an den der DATABASE entsprechenden Dateien
          reagiert werden soll.

          Wenn DATABASE zum Beispiel ‘hosts’ ist, wird, wenn dieses Feld
          gesetzt ist, nscd Änderungen an ‘/etc/hosts’ beobachten und
          berücksichtigen.

     ‘persistent?’ (Vorgabe: ‘#t’)
          Ob der Zwischenspeicher dauerhaft auf der Platte gespeichert
          werden soll.

     ‘shared?’ (Vorgabe: ‘#t’)
          Ob der Zwischenspeicher zwischen den Nutzern geteilt werden
          soll.

     ‘max-database-size’ (Vorgabe: 32 MiB)
          Die Maximalgröße des Datenbank-Zwischenspeichers in Bytes.

 -- Scheme-Variable: %nscd-default-caches
     Liste von ‘<nscd-cache>’-Objekten, die von der vorgegebenen
     ‘nscd-configuration’ benutzt werden (siehe oben).

     Damit wird dauerhaftes und aggressives Zwischenspeichern beim
     Nachschlagen von Dienst- und Rechnernamen („Host“-Namen) aktiviert.
     Letzteres verbessert die Leistungsfähigkeit beim Nachschlagen von
     Rechnernamen, sorgt für mehr Widerstandsfähigkeit gegenüber
     unverlässlichen Namens-Servern und bietet außerdem einen besseren
     Datenschutz — oftmals befindet sich das Ergebnis einer Anfrage nach
     einem Rechnernamen bereits im lokalen Zwischenspeicher und externe
     Namens-Server müssen nicht miteinbezogen werden.

 -- Datentyp: syslog-configuration
     Dieser Datentyp repräsentiert die Konfiguration des syslog-Daemons.

     ‘syslogd’ (Vorgabe: ‘#~(string-append #$inetutils "/libexec/syslogd")’)
          Welcher Syslog-Daemon benutzt werden soll.

     ‘config-file’ (Vorgabe: ‘%default-syslog.conf’)
          Die zu benutzende syslog-Konfigurationsdatei.

 -- Scheme-Prozedur: syslog-service KONFIGURATION
     Liefert einen Dienst, der einen syslog-Daemon entsprechend der
     KONFIGURATION ausführt.

     Siehe *note (inetutils)syslogd invocation:: für weitere
     Informationen über die Syntax der Konfiguration.

 -- Scheme-Variable: guix-service-type
     Dies ist der Typ für den Dienst, der den Erstellungs-Daemon
     ‘guix-daemon’ ausführt (siehe *note Aufruf des guix-daemon::). Als
     Wert muss ein ‘guix-configuration’-Verbundsobjekt verwendet werden,
     wie unten beschrieben.

 -- Datentyp: guix-configuration
     Dieser Datentyp repräsentiert die Konfiguration des
     Erstellungs-Daemons von Guix. Siehe *note Aufruf des guix-daemon::
     für weitere Informationen.

     ‘guix’ (Vorgabe: GUIX)
          Das zu verwendende Guix-Paket.

     ‘build-group’ (Vorgabe: ‘"guixbuild"’)
          Der Name der Gruppe, zu der die Erstellungs-Benutzerkonten
          gehören.

     ‘build-accounts’ (Vorgabe: ‘10’)
          Die Anzahl zu erzeugender Erstellungs-Benutzerkonten.

     ‘authorize-key?’ (Vorgabe: ‘#t’)
          Ob die unter ‘authorized-keys’ aufgelisteten
          Substitutschlüssel autorisiert werden sollen — vorgegeben ist,
          den von ‘ci.guix.gnu.org’ zu autorisieren (siehe *note
          Substitute::).

          Wenn ‘authorize-key?’ wahr ist, kann ‘/etc/guix/acl’ durch
          einen Aufruf von ‘guix archive --authorize’ _nicht_ verändert
          werden. Sie müssen stattdessen die ‘guix-configuration’ wie
          gewünscht anpassen und das System rekonfigurieren. Dadurch
          wird sichergestellt, dass die
          Betriebssystemkonfigurationsdatei eigenständig ist.

               Anmerkung: Wenn Sie ein System mit auf wahr gesetztem
               ‘authorize-key?’ starten oder dahin rekonfigurieren, wird
               eine Sicherungskopie der bestehenden ‘/etc/guix/acl’ als
               ‘/etc/guix/acl.bak’ angelegt, wenn festgestellt wurde,
               dass jemand die Datei von Hand verändert hatte. Das
               passiert, um die Migration von früheren Versionen zu
               erleichtern, als eine direkte Modifikation der Datei
               ‘/etc/guix/acl’, „in place“, noch möglich war.

     ‘authorized-keys’ (Vorgabe: ‘%default-authorized-guix-keys’)
          Die Liste der Dateien mit autorisierten Schlüsseln, d.h. eine
          Liste von Zeichenketten als G-Ausdrücke (siehe *note Aufruf
          von guix archive::). Der vorgegebene Inhalt ist der Schlüssel
          von ‘ci.guix.gnu.org’ (siehe *note Substitute::). Siehe im
          Folgenden ‘substitute-urls’ für ein Beispiel, wie Sie sie
          ändern können.

     ‘use-substitutes?’ (Vorgabe: ‘#t’)
          Ob Substitute benutzt werden sollen.

     ‘substitute-urls’ (Vorgabe: ‘%default-substitute-urls’)
          Die Liste der URLs, auf denen nach Substituten gesucht wird,
          wenn nicht anders angegeben.

          Wenn Sie zum Beispiel gerne Substitute von ‘guix.example.org’
          zusätzlich zu ‘ci.guix.gnu.org’ laden würden, müssen Sie zwei
          Dinge tun: Erstens ‘guix.example.org’ zu den ‘substitute-urls’
          hinzufügen und zweitens dessen Signierschlüssel autorisieren,
          nachdem Sie ihn hinreichend geprüft haben (siehe *note
          Substitut-Server autorisieren::). Mit der Konfiguration unten
          wird das erledigt:

               (guix-configuration
                 (substitute-urls
                  (append (list "https://guix.example.org")
                          %default-substitute-urls))
                 (authorized-keys
                  (append (list (local-file "./guix.example.org-key.pub"))
                          %default-authorized-guix-keys)))

          In diesem Beispiel wird angenommen, dass die Datei
          ‘./guix.example.org-key.pub’ den öffentlichen Schlüssel
          enthält, mit dem auf ‘guix.example.org’ Substitute signiert
          werden.

     ‘max-silent-time’ (Vorgabe: ‘0’)
     ‘timeout’ (Vorgabe: ‘0’)
          Die Anzahl an Sekunden, die jeweils nichts in die Ausgabe
          geschrieben werden darf bzw. die es insgesamt dauern darf, bis
          ein Erstellungsprozess abgebrochen wird. Beim Wert null wird
          nie abgebrochen.

     ‘log-compression’ (Vorgabe: ‘'bzip2’)
          Die für Erstellungsprotokolle zu benutzende
          Kompressionsmethode — entweder ‘gzip’, ‘bzip2’ oder ‘none’.

     ‘discover?’ (Vorgabe: ‘#f’)
          Ob im lokalen Netzwerk laufende Substitutserver mit mDNS und
          DNS-SD ermittelt werden sollen oder nicht.

     ‘extra-options’ (Vorgabe: ‘'()’)
          Eine Liste zusätzlicher Befehlszeilenoptionen zu
          ‘guix-daemon’.

     ‘log-file’ (Vorgabe: ‘"/var/log/guix-daemon.log"’)
          Die Datei, in die die Standardausgabe und die
          Standardfehlerausgabe von ‘guix-daemon’ geschrieben werden.

     ‘http-proxy’ (Vorgabe: ‘#f’)
          Die URL des für das Herunterladen von Ableitungen mit fester
          Ausgabe und von Substituten zu verwendenden HTTP- und
          HTTPS-Proxys.

          Sie können den für den Daemon benutzten Proxy auch zur
          Laufzeit ändern, indem Sie die ‘set-http-proxy’-Aktion
          aufrufen, wodurch er neu gestartet wird.

               herd set-http-proxy guix-daemon http://localhost:8118

          Um die Proxy-Einstellungen zu löschen, führen Sie dies aus:

               herd set-http-proxy guix-daemon

     ‘tmpdir’ (Vorgabe: ‘#f’)
          Ein Verzeichnispfad, der angibt, wo ‘guix-daemon’ seine
          Erstellungen durchführt.

 -- Scheme-Prozedur: udev-service [#:udev EUDEV #:rules ‘'()’]
     Führt UDEV aus, was zur Laufzeit Gerätedateien ins Verzeichnis
     ‘/dev’ einfügt. udev-Regeln können über die RULES-Variable als eine
     Liste von Dateien übergeben werden. Die Prozeduren ‘udev-rule’,
     ‘udev-rules-service’ und ‘file->udev-rule’ aus ‘(gnu services
     base)’ vereinfachen die Erstellung einer solchen Regeldatei.

     Der Befehl ‘herd rules udev’ liefert, wenn er als
     Administratornutzer „root“ ausgeführt wird, Namen und Verzeichnis
     von allen aktiven udev-Regeln.

 -- Scheme-Prozedur: udev-rule [DATEINAME INHALT]
     Liefert eine udev-Regeldatei mit dem angegebenen DATEINAMEn, in der
     die vom Literal INHALT definierten Regeln stehen.

     Im folgenden Beispiel wird eine Regel für ein USB-Gerät definiert
     und in der Datei ‘90-usb-ding.rules’ gespeichert. Mit der Regel
     wird ein Skript ausgeführt, sobald ein USB-Gerät mit der
     angegebenen Produktkennung erkannt wird.

          (define %beispiel-udev-rule
            (udev-rule
              "90-usb-ding.rules"
              (string-append "ACTION==\"add\", SUBSYSTEM==\"usb\", "
                             "ATTR{product}==\"Beispiel\", "
                             "RUN+=\"/pfad/zum/skript\"")))

 -- Scheme-Prozedur: udev-rules-service [NAME REGELN] [#:groups GRUPPEN]
          Liefert einen Dienst, der den Dienst vom Typ
     ‘udev-service-type’ um die REGELN erweitert und den Dienst vom Typ
     ‘account-service-type’ um die GRUPPEN in Form von
     Systembenutzergruppen. Dazu wird ein Diensttyp ‘NAME-udev-rules’
     für den einmaligen Gebrauch erzeugt, den der zurückgelieferte
     Dienst instanziiert.

     Hier zeigen wir, wie damit ‘udev-service-type’ um die vorher
     definierte Regel ‘%example-udev-rule’ erweitert werden kann.

          (operating-system
           ;; …
           (services
             (cons (udev-rules-service 'usb-ding %example-udev-rule)
                   %desktop-services)))

 -- Scheme-Prozedur: file->udev-rule [DATEINAME DATEI]
     Liefert eine udev-Datei mit dem angegebenen DATEINAMEn, in der alle
     in der DATEI, einem dateiartigen Objekt, definierten Regeln stehen.

     Folgendes Beispiel stellt dar, wie wir eine bestehende Regeldatei
     verwenden können.

          (use-modules (guix download)     ;für url-fetch
                       (guix packages)     ;für origin
                       …)

          (define %android-udev-rules
            (file->udev-rule
              "51-android-udev.rules"
              (let ((version "20170910"))
                (origin
                 (method url-fetch)
                 (uri (string-append "https://raw.githubusercontent.com/M0Rf30/"
                                     "android-udev-rules/" version "/51-android.rules"))
                 (sha256
                  (base32 "0lmmagpyb6xsq6zcr2w1cyx9qmjqmajkvrdbhjx32gqf1d9is003"))))))

   Zusätzlich können Guix-Paketdefinitionen unter den RULES aufgeführt
werden, um die udev-Regeln um diejenigen Definitionen zu ergänzen, die
im Unterverzeichnis ‘lib/udev/rules.d’ des jeweiligen Pakets aufgeführt
sind. Statt des bisherigen Beispiels zu FILE->UDEV-RULE hätten wir also
auch das Paket ANDROID-UDEV-RULES benutzen können, das in Guix im Modul
‘(gnu packages android)’ vorhanden ist.

   Das folgende Beispiel zeit, wie dieses Paket ‘android-udev-rules’
benutzt werden kann, damit das „Android-Tool“ ‘adb’ Geräte erkennen
kann, ohne dafür Administratorrechte vorauszusetzen. Man sieht hier
auch, wie die Benutzergruppe ‘adbusers’ erstellt werden kann, die
existieren muss, damit die im Paket ‘android-udev-rules’ definierten
Regeln richtig funktionieren. Um so eine Benutzergruppe zu erzeugen,
müssen wir sie sowohl unter den ‘supplementary-groups’ unserer
‘user-account’-Deklaration aufführen, als auch sie im ‘groups’-Feld der
‘udev-rules-service’-Prozedur aufführen.

     (use-modules (gnu packages android)  ;für android-udev-rules
                  (gnu system shadow)     ;für user-group
                  …)

     (operating-system
       ;; …
       (users (cons (user-account
                     ;; …
                     (supplementary-groups
                      '("adbusers"   ;für adb
                        "wheel" "netdev" "audio" "video")))))
       ;; …
       (services
         (cons (udev-rules-service 'android android-udev-rules
                                   #:groups '("adbusers"))
               %desktop-services)))

 -- Scheme-Variable: urandom-seed-service-type
     Etwas Entropie in der Datei ‘%random-seed-file’ aufsparen, die als
     Startwert (als sogenannter „Seed“) für ‘/dev/urandom’ dienen kann,
     nachdem das System neu gestartet wurde. Es wird auch versucht,
     ‘/dev/urandom’ beim Hochfahren mit Werten aus ‘/dev/hwrng’ zu
     starten, falls ‘/dev/hwrng’ existiert und lesbar ist.

 -- Scheme-Variable: %random-seed-file
     Der Name der Datei, in der einige zufällige Bytes vom
     URANDOM-SEED-SERVICE abgespeichert werden, um sie nach einem
     Neustart von dort als Startwert für ‘/dev/urandom’ auslesen zu
     können. Als Vorgabe wird ‘/var/lib/random-seed’ verwendet.

 -- Scheme-Variable: gpm-service-type
     Dieser Typ wird für den Dienst verwendet, der GPM ausführt, den
     “General-Purpose Mouse Daemon”, welcher zur Linux-Konsole
     Mausunterstützung hinzufügt. GPM ermöglicht es seinen Benutzern,
     auch in der Konsole die Maus zu benutzen und damit etwa Text
     auszuwählen, zu kopieren und einzufügen.

     Der Wert für Dienste dieses Typs muss eine ‘gpm-configuration’ sein
     (siehe unten). Dieser Dienst gehört _nicht_ zu den
     ‘%base-services’.

 -- Datentyp: gpm-configuration
     Repräsentiert die Konfiguration von GPM.

     ‘options’ (Vorgabe: ‘%default-gpm-options’)
          Befehlszeilenoptionen, die an ‘gpm’ übergeben werden. Die
          vorgegebenen Optionen weisen ‘gpm’ an, auf Maus-Ereignisse auf
          der Datei ‘/dev/input/mice’ zu lauschen. Siehe *note
          (gpm)Command Line:: für weitere Informationen.

     ‘gpm’ (Vorgabe: ‘gpm’)
          Das GPM-Paket, was benutzt werden soll.

 -- Scheme-Variable: guix-publish-service-type
     Dies ist der Diensttyp für ‘guix publish’ (siehe *note Aufruf von
     guix publish::). Sein Wert muss ein
     ‘guix-publish-configuration’-Objekt sein, wie im Folgenden
     beschrieben.

     Hierbei wird angenommen, dass ‘/etc/guix’ bereits ein mit ‘guix
     archive --generate-key’ erzeugtes Schlüsselpaar zum Signieren
     enthält (siehe *note Aufruf von guix archive::). Falls nicht, wird
     der Dienst beim Starten fehlschlagen.

 -- Datentyp: guix-publish-configuration
     Der Datentyp, der die Konfiguration des „‘guix publish’“-Dienstes
     repräsentiert.

     ‘guix’ (Vorgabe: ‘guix’)
          Das zu verwendende Guix-Paket.

     ‘port’ (Vorgabe: ‘80’)
          Der TCP-Port, auf dem auf Verbindungen gelauscht werden soll.

     ‘host’ (Vorgabe: ‘"localhost"’)
          Unter welcher Rechneradresse (welchem „Host“, also welcher
          Netzwerkschnittstelle) auf Verbindungen gelauscht wird.
          Benutzen Sie ‘"0.0.0.0"’, wenn auf allen verfügbaren
          Netzwerkschnittstellen gelauscht werden soll.

     ‘advertise?’ (Vorgabe: ‘#f’)
          Steht dies auf wahr, wird anderen Rechnern im lokalen Netzwerk
          über das Protokoll DNS-SD unter Verwendung von Avahi
          mitgeteilt, dass dieser Dienst zur Verfügung steht.

          Dadurch können in der Nähe befindliche Guix-Maschinen mit
          eingeschalteter Ermittlung (siehe oben die
          ‘guix-configuration’) diese Instanz von ‘guix publish’
          entdecken und Substitute darüber beziehen.

     ‘compression’ (Vorgabe: ‘'(("gzip" 3) ("zstd" 3))’)
          Dies ist eine Liste von Tupeln aus Kompressionsmethode und
          -stufe, die zur Kompression von Substituten benutzt werden. Um
          zum Beispiel alle Substitute mit _beiden_, sowohl lzip auf
          Stufe 7 und gzip auf Stufe 9, zu komprimieren, schreiben Sie:

               '(("lzip" 7) ("gzip" 9))

          Auf Stufe 9 ist das Kompressionsverhältnis am besten, auf
          Kosten von hoher Prozessorauslastung, während auf Stufe 1 eine
          schnelle Kompression erreicht wird. Siehe *note Aufruf von
          guix publish:: für weitere Informationen zu den verfügbaren
          Kompressionsmethoden und ihren jeweiligen Vor- und Nachteilen.

          Wird eine leere Liste angegeben, wird Kompression
          abgeschaltet.

     ‘nar-path’ (Vorgabe: ‘"nar"’)
          Der URL-Pfad, unter dem „Nars“ zum Herunterladen angeboten
          werden. Siehe *note ‘--nar-path’: Aufruf von guix publish. für
          Details.

     ‘cache’ (Vorgabe: ‘#f’)
          Wenn dies ‘#f’ ist, werden Archive nicht zwischengespeichert,
          sondern erst bei einer Anfrage erzeugt. Andernfalls sollte
          dies der Name eines Verzeichnisses sein — z.B.
          ‘"/var/cache/guix/publish"’ —, in das ‘guix publish’ fertige
          Archive und Metadaten zwischenspeichern soll. Siehe *note
          ‘--cache’: Aufruf von guix publish. für weitere Informationen
          über die jeweiligen Vor- und Nachteile.

     ‘workers’ (Vorgabe: ‘#f’)
          Ist dies eine ganze Zahl, gibt es die Anzahl der
          Worker-Threads an, die zum Zwischenspeichern benutzt werden;
          ist es ‘#f’, werden so viele benutzt, wie es Prozessoren gibt.
          Siehe *note ‘--workers’: Aufruf von guix publish. für mehr
          Informationen.

     ‘cache-bypass-threshold’ (Vorgabe: 10 MiB)
          Wenn ‘cache’ wahr ist, ist dies die Maximalgröße in Bytes, die
          ein Store-Objekt haben darf, damit ‘guix publish’ den
          Zwischenspeicher umgehen darf, falls eine Suche darin mit
          negativem Ergebnis ausfällt („Cache Miss“). Siehe *note
          ‘--cache-bypass-threshold’: Aufruf von guix publish. für
          weitere Informationen.

     ‘ttl’ (Vorgabe: ‘#f’)
          Wenn dies eine ganze Zahl ist, bezeichnet sie die
          “Time-to-live” als die Anzahl der Sekunden, die
          heruntergeladene veröffentlichte Archive zwischengespeichert
          werden dürfen. Siehe *note ‘--ttl’: Aufruf von guix publish.
          für mehr Informationen.

 -- Scheme-Prozedur: rngd-service [#:rng-tools RNG-TOOLS] [#:device
          "/dev/hwrng"] Liefert einen Dienst, der das
     ‘rngd’-Programm aus den RNG-TOOLS benutzt, um das mit DEVICE
     bezeichnete Gerät zum Entropie-Pool des Kernels hinzuzufügen.
     Dieser Dienst wird fehlschlagen, falls das mit DEVICE bezeichnete
     Gerät nicht existiert.

 -- Scheme-Prozedur: pam-limits-service [#:limits ‘'()’]

     Liefert einen Dienst, der eine Konfigurationsdatei für das
     ‘pam_limits’-Modul
     (http://linux-pam.org/Linux-PAM-html/sag-pam_limits.html)
     installiert. Diese Prozedur nimmt optional eine Liste von
     ‘pam-limits-entry’-Werten entgegen, die benutzt werden können, um
     ‘ulimit’-Limits und ‘nice’-Prioritäten für Benutzersitzungen
     festzulegen.

     Die folgenden Limit-Definitionen setzen zwei harte und weiche
     Limits für alle Anmeldesitzungen für Benutzer in der
     ‘realtime’-Gruppe.

          (pam-limits-service
           (list
            (pam-limits-entry "@realtime" 'both 'rtprio 99)
            (pam-limits-entry "@realtime" 'both 'memlock 'unlimited)))

     Der erste Eintrag erhöht die maximale Echtzeit-Priorität für
     unprivilegierte Prozesse ohne zusätzliche Berechtigungen; der
     zweite Eintrag hebt jegliche Einschränkungen des maximalen
     Adressbereichs auf, der im Speicher reserviert werden darf. Diese
     Einstellungen werden in dieser Form oft für Echtzeit-Audio-Systeme
     verwendet.

     Ein weiteres nützliches Beispiel stellt das Erhöhen der Begrenzung
     dar, wie viele geöffnete Dateideskriptoren auf einmal benutzt
     werden können:

          (pam-limits-service
           (list
            (pam-limits-entry "*" 'both 'nofile 100000)))

     Im Beispiel oben steht das Sternchen dafür, dass die Beschränkung
     für alle Benutzer gelten soll. Es ist wichtig, dass Sie darauf
     achten, dass der Wert _nicht_ größer als der Höchstwert des Systems
     ist, der in der Datei ‘/proc/sys/fs/file-max’ zu finden ist, denn
     sonst könnten sich Benutzer _nicht_ mehr anmelden. Weitere
     Informationen über Schranken im Pluggable Authentication Module
     (PAM) bekommen Sie, wenn Sie die Handbuchseite im ‘linux-pam’-Paket
     lesen.


File: guix.de.info,  Node: Geplante Auftragsausführung,  Next: Log-Rotation,  Prev: Basisdienste,  Up: Dienste

10.8.2 Geplante Auftragsausführung
----------------------------------

Das Modul ‘(gnu services mcron)’ enthält eine Schnittstelle zu
GNU mcron, einem Daemon, der gemäß einem vorher festgelegten Zeitplan
Aufträge (sogenannte „Jobs“) ausführt (siehe *note (mcron)Top::).
GNU mcron ist ähnlich zum traditionellen ‘cron’-Daemon aus Unix; der
größte Unterschied ist, dass mcron in Guile Scheme implementiert ist,
wodurch einem viel Flexibilität bei der Spezifikation von Aufträgen und
ihren Aktionen offen steht.

   Das folgende Beispiel definiert ein Betriebssystem, das täglich die
Befehle ‘updatedb’ (siehe *note (find)Invoking updatedb::) und ‘guix gc’
(siehe *note Aufruf von guix gc::) ausführt sowie den Befehl ‘mkid’ im
Namen eines „unprivilegierten“ Nutzers ohne besondere Berechtigungen
laufen lässt (siehe *note (idutils)mkid invocation::). Zum Anlegen von
Auftragsdefinitionen benutzt es G-Ausdrücke, die dann an mcron übergeben
werden (siehe *note G-Ausdrücke::).

     (use-modules (guix) (gnu) (gnu services mcron))
     (use-package-modules base idutils)

     (define updatedb-job
       ;; 'updatedb' jeden Tag um 3 Uhr morgens ausführen. Hier schreiben wir
       ;; die vom Auftrag durchzuführende Aktion als eine Scheme-Prozedur.
       #~(job '(next-hour '(3))
              (lambda ()
                (execl (string-append #$findutils "/bin/updatedb")
                       "updatedb"
                       "--prunepaths=/tmp /var/tmp /gnu/store"))))

     (define garbage-collector-job
       ;; Jeden Tag 5 Minuten nach Mitternacht Müll sammeln gehen.
       ;; Die Aktions des Auftrags ist ein Shell-Befehl.
       #~(job "5 0 * * *"            ;Vixie-cron-Syntax
              "guix gc -F 1G"))

     (define idutils-job
       ;; Die Index-Datenbank des Benutzers "charlie" um 12:15 Uhr und
       ;; 19:15 Uhr aktualisieren. Dies wird aus seinem Persönlichen
       ;; Ordner heraus ausgeführt.
       #~(job '(next-minute-from (next-hour '(12 19)) '(15))
              (string-append #$idutils "/bin/mkid src")
              #:user "charlie"))

     (operating-system
       ;; …

       ;; In den %BASE-SERVICES kommt bereits eine Instanz des
       ;; 'mcron-service-type' vor. Wir erweitern sie um weitere
       ;; Aufträge mit einem 'simple-service'.
       (services (cons (simple-service 'my-cron-jobs
                                        mcron-service-type
                                        (list garbage-collector-job
                                              updatedb-job
                                              idutils-job))
                       %base-services)))

   Wenn Sie einen komplexeren Auftrag mit Scheme-Code auf oberster Ebene
festlegen möchten, um zum Beispiel eine ‘use-modules’-Form einzuführen,
können Sie Ihren Code in ein separates Programm verschieben, indem Sie
die Prozedur ‘program-file’ aus dem Modul ‘(guix gexp)’ benutzen (siehe
*note G-Ausdrücke::). Das folgende Beispiel veranschaulicht dies.

     (define %batterie-alarm-auftrag
       ;; Piepsen, wenn die Akkuladung in Prozent unter %MIN-NIVEAU fällt.
       #~(job
          '(next-minute (range 0 60 1))
          #$(program-file
             "batterie-alarm.scm"
             (with-imported-modules (source-module-closure
                                     '((guix build utils)))
               #~(begin
                   (use-modules (guix build utils)
                                (ice-9 popen)
                                (ice-9 regex)
                                (ice-9 textual-ports)
                                (srfi srfi-2))
                   (define %min-niveau 20)
                   (setenv "LC_ALL" "C")     ;Ausgabe auf Englisch
                   (and-let* ((input-pipe (open-pipe*
                                           OPEN_READ
                                           #$(file-append acpi "/bin/acpi")))
                              (ausgabe (get-string-all input-pipe))
                              (m (string-match "Discharging, ([0-9]+)%" ausgabe))
                              (niveau (string->number (match:substring m 1)))
                              ((< niveau %min-niveau)))
                     (format #t "Warnung: Batterieladung nur noch (~a%)~%" niveau)
                     (invoke #$(file-append beep "/bin/beep") "-r5")))))))

   Siehe *note mcron-Auftragsspezifikationen: (mcron)Guile Syntax. für
weitere Informationen zu mcron-Auftragsspezifikationen. Nun folgt die
Referenz des mcron-Dienstes.

   Wenn das System läuft, können Sie mit der Aktion ‘schedule’ des
Dienstes visualisieren lassen, welche mcron-Aufträge als Nächstes
ausgeführt werden:

     # herd schedule mcron

Das vorangehende Beispiel listet die nächsten fünf Aufgaben auf, die
ausgeführt werden, aber Sie können auch angeben, wie viele Aufgaben
angezeigt werden sollen:

     # herd schedule mcron 10

 -- Scheme-Variable: mcron-service-type
     Dies ist der Diensttyp des ‘mcron’-Dienstes. Als Wert verwendet er
     ein ‘mcron-configuration’-Objekt.

     Dieser Diensttyp kann als Ziel einer Diensterweiterung verwendet
     werden, die ihn mit zusätzlichen Auftragsspezifikationen versorgt
     (siehe *note Dienstkompositionen::). Mit anderen Worten ist es
     möglich, Dienste zu definieren, die weitere mcron-Aufträge
     ausführen lassen.

 -- Datentyp: mcron-configuration
     Datentyp, der die Konfiguration von mcron repräsentiert.

     ‘mcron’ (Vorgabe: MCRON)
          Welches mcron-Paket benutzt werden soll.

     ‘jobs’
          Dies muss eine Liste von G-Ausdrücken sein (siehe *note
          G-Ausdrücke::), die jeweils einer mcron-Auftragsspezifikation
          (der Spezifikation eines „Jobs“) entsprechen (siehe *note
          mcron-Auftragsspezifikationen: (mcron)Syntax.).


File: guix.de.info,  Node: Log-Rotation,  Next: Netzwerkdienste,  Prev: Geplante Auftragsausführung,  Up: Dienste

10.8.3 Log-Rotation
-------------------

Protokolldateien wie die in ‘/var/log’ neigen dazu, bis ins Unendliche
zu wachsen, deshalb ist es eine gute Idee, sie von Zeit zu Zeit zu
“rotieren” — d.h. ihren Inhalt in separaten Dateien zu archivieren,
welche optional auch komprimiert werden. Das Modul ‘(gnu services
admin)’ stellt eine Schnittstelle zu GNU Rot[t]log bereit, einem
Werkzeug, um Protokolldateien („Log“-Dateien) zu rotieren (siehe *note
(rottlog)Top::).

   Dieser Dienst ist Teil der ‘%base-services’ und daher standardmäßig
mit seinen Vorgabeeinstellungen für übliche Log-Dateien aktiv. Das
Beispiel unten zeigt, wie Sie ihn um eine weitere “rotation” erweitern
können, wenn dies nötig wird (normalerweise kümmern sich darum schon die
Dienste, die die Log-Dateien erzeugen):

     (use-modules (guix) (gnu))
     (use-service-modules admin)

     (define my-log-files
       ;; Log-Dateien, die ich rotieren lassen will.
       '("/var/log/irgendein.log" "/var/log/noch-ein.log"))

     (operating-system
       ;; …
       (services (cons (simple-service 'meinen-kram-rotieren
                                       rottlog-service-type
                                       (list (log-rotation
                                              (frequency 'daily)
                                              (files my-log-files))))
                       %base-services)))

 -- Scheme-Variable: rottlog-service-type
     Dies ist der Typ des Rottlog-Dienstes, dessen Wert ein
     ‘rottlog-configuration’-Objekt ist.

     Andere Dienste können diesen Dienst um neue ‘log-rotation’-Objekte
     erweitern (siehe unten), wodurch die Auswahl an zu rotierenden
     Dateien ausgeweitet wird.

     Dieser Diensttyp kann mcron-Aufträge definieren (siehe *note
     Geplante Auftragsausführung::), die den rottlog-Dienst ausführen.

 -- Datentyp: rottlog-configuration
     Datentyp, der die Konfiguration von rottlog repräsentiert.

     ‘rottlog’ (Vorgabe: ‘rottlog’)
          Das Rottlog-Paket, das verwendet werden soll.

     ‘rc-file’ (Vorgabe: ‘(file-append rottlog "/etc/rc")’)
          Die zu benutzende Rottlog-Konfigurationsdatei (siehe *note
          (rottlog)Mandatory RC Variables::).

     ‘rotations’ (Vorgabe: ‘%default-rotations’)
          Eine Liste von ‘log-rotation’-Objekten, wie wir sie weiter
          unten definieren.

     ‘jobs’
          Dies ist eine Liste von G-Ausdrücken. Jeder G-Ausdruck darin
          entspricht einer mcron-Auftragsspezifikation (siehe *note
          Geplante Auftragsausführung::).

 -- Datentyp: log-rotation
     Datentyp, der die Rotation einer Gruppe von Protokolldateien
     repräsentiert.

     Um ein Beispiel aus dem Rottlog-Handbuch (siehe *note
     (rottlog)Period Related File Examples::) aufzugreifen: Eine
     Log-Rotation kann auf folgende Art definiert werden:

          (log-rotation
            (frequency 'daily) ;täglich
            (files '("/var/log/apache/*"))
            (options '("storedir apache-archives"
                       "rotate 6"
                       "notifempty"
                       "nocompress")))

     Die Liste der Felder ist folgendermaßen aufgebaut:

     ‘frequency’ (Vorgabe: ‘'weekly’)
          Die Häufigkeit der Log-Rotation, dargestellt als
          englischsprachiges Symbol.

     ‘files’
          Die Liste der Dateien oder Glob-Muster für Dateien, die
          rotiert werden sollen.

     ‘options’ (Vorgabe: ‘'()’)
          Die Liste der Rottlog-Optionen für diese Rotation (siehe *note
          (rottlog)Configuration parameters::).

     ‘post-rotate’ (Vorgabe: ‘#f’)
          Entweder ‘#f’ oder ein G-Ausdruck, der nach Abschluss der
          Rotation einmal ausgeführt wird.

 -- Scheme-Variable: %default-rotations
     Gibt wöchentliche Rotationen der ‘%rotated-files’ und von
     ‘/var/log/guix-daemon.log’ an.

 -- Scheme-Variable: %rotated-files
     Die Liste der von Syslog verwalteten Dateien, die rotiert werden
     sollen. Vorgegeben ist ‘'("/var/log/messages" "/var/log/secure"
     "/var/log/debug" "/var/log/maillog")’.


File: guix.de.info,  Node: Netzwerkdienste,  Next: Unbeaufsichtigte Aktualisierungen,  Prev: Log-Rotation,  Up: Dienste

10.8.4 Netzwerkdienste
----------------------

Das Modul ‘(gnu services networking)’ bietet Dienste zum Konfigurieren
des Netzwerks an.

 -- Scheme-Variable: dhcp-client-service-type
     Dies ist der Diensttyp für den Dienst, der DHCP ausführt, einen
     Client für das „Dynamic Host Configuration Protocol“ (DHCP), der
     auf allen Netzwerkschnittstellen außer „loopback“ läuft. Sein Wert
     ist das zu verwendende DHCP-Client-Paket; vorgegeben ist
     ‘isc-dhcp’.

 -- Scheme-Prozedur: dhcpd-service-type
     Dieser Diensttyp definiert einen Dienst, der einen DHCP-Daemon
     ausführt. Um einen Dienst zu diesem Typ anzugeben, müssen Sie eine
     ‘<dhcpd-configuration>’ bereitstellen. Zum Beispiel so:

          (service dhcpd-service-type
                   (dhcpd-configuration
                    (config-file (local-file "my-dhcpd.conf"))
                    (interfaces '("enp0s25"))))

 -- Datentyp: dhcpd-configuration
     ‘package’ (Vorgabe: ‘isc-dhcp’)
          Das Paket, das den DHCP-Daemon zur Verfügung stellt. Von
          diesem Paket wird erwartet, dass es den Daemon unter dem Pfad
          ‘sbin/dhcpd’ relativ zum Verzeichnis der Paketausgabe
          bereitstellt. Das vorgegebene Paket ist der DHCP-Server vom
          ISC (https://www.isc.org/products/DHCP).
     ‘config-file’ (Vorgabe: ‘#f’)
          Die Konfigurationsdatei, die benutzt werden soll. Sie _muss_
          angegeben werden und wird an ‘dhcpd’ mittels seiner
          Befehlszeilenoption ‘-cf’ übergeben. Ein beliebiges
          „dateiartiges“ Objekt kann dafür angegeben werden (siehe *note
          dateiartige Objekte: G-Ausdrücke.). Siehe ‘man dhcpd.conf’ für
          Details, welcher Syntax die Konfigurationsdatei genügen muss.
     ‘version’ (Vorgabe: ‘"4"’)
          Die DHCP-Version, die benutzt werden soll. Der ISC-DHCP-Server
          unterstützt die Werte „4“, „6“ und „4o6“. Das Feld entspricht
          den Befehlszeilenoptionen ‘-4’, ‘-6’ und ‘-4o6’ von ‘dhcpd’.
          Siehe ‘man dhcpd’ für Details.
     ‘run-directory’ (Vorgabe: ‘"/run/dhcpd"’)
          Das zu benutzende Laufzeit-Verzeichnis („run“-Verzeichnis).
          Wenn der Dienst aktiviert wird, wird dieses Verzeichnis
          erzeugt, wenn es noch nicht existiert.
     ‘pid-file’ (Vorgabe: ‘"/run/dhcpd/dhcpd.pid"’)
          Die zu benutzende PID-Datei. Dieses Feld entspricht der
          Befehlszeilenoption ‘-pf’ von ‘dhcpd’. Siehe ‘man dhcpd’ für
          Details.
     ‘interfaces’ (Vorgabe: ‘'()’)
          Die Namen der Netzwerkschnittstelle, auf der dhcpd auf
          Broadcast-Nachrichten lauscht. Wenn diese Liste nicht leer
          ist, werden ihre Elemente (diese müssen Zeichenketten sein) an
          den ‘dhcpd’-Aufruf beim Starten des Daemons angehängt. Es ist
          unter Umständen _nicht_ nötig, hier Schnittstellen
          ausdrücklich anzugeben; siehe ‘man dhcpd’ für Details.

 -- Scheme-Variable: static-networking-service-type
     Dies ist der Typ für statisch konfigurierte Netzwerkschnittstellen.

 -- Scheme-Prozedur: static-networking-service SCHNITTSTELLE IP
          [#:netmask #f] [#:gateway #f] [#:name-servers ‘'()’]
           [#:requirement
     ‘'(udev)’] Liefert einen Dienst, der die SCHNITTSTELLE auf dieser
     IP-Adresse startet. Wenn NETMASK wahr ist, wird es als
     Netzwerkmaske benutzt. Wenn GATEWAY wahr ist, muss es eine
     Zeichenkette sein, die den voreingestellten Netzwerk-Zugang
     („Netzwerk-Gateway“) angibt. Als REQUIREMENT („Anforderung“) können
     Abhängigkeiten von anderen Diensten deklariert werden, die vor dem
     Konfigurieren der Schnittstelle gestartet sein müssen.

     Diese Prozedur kann mehrmals aufgerufen werden, einmal pro
     Netzwerkschnittstelle, die Sie möchten. Intern funktioniert sie,
     indem sie ‘static-networking-service-type’ mit zusätzlichen
     Netzwerkschnittstellen erweitert, um die sich der Dienst kümmern
     soll.

     Zum Beispiel:

          (static-networking-service "eno1" "192.168.1.82"
                                     #:gateway "192.168.1.2"
                                     #:name-servers '("192.168.1.2"))

 -- Scheme-Prozedur: wicd-service [#:wicd WICD]
     Liefert einen Dienst, der Wicd (https://launchpad.net/wicd)
     ausführt, einen Netzwerkverwaltungsdaemon, um ein einfacheres
     Einrichten kabelgebundener und drahtloser Netzwerkanbindungen zu
     ermöglichen.

     Dieser Dienst fügt das WICD-Paket zum globalen Profil hinzu und
     stellt dadurch mehrere Befehle zur Verfügung, um mit dem Daemon zu
     interagieren und Netzwerke einzurichten: ‘wicd-client’, eine
     grafische Benutzeroberfläche, und die Benutzungsschnittstellen
     ‘wicd-cli’ und ‘wicd-curses’.

 -- Scheme-Variable: modem-manager-service-type
     Dies ist der Diensttyp für den ModemManager-Dienst
     (https://wiki.gnome.org/Projects/ModemManager). Der Wert dieses
     Diensttyps ist ein ‘modem-manager-configuration’-Verbundsobjekt.

     Dieser Dienst gehört zu den ‘%desktop-services’ (siehe *note
     Desktop-Dienste::).

 -- Datentyp: modem-manager-configuration
     Repräsentiert die Konfiguration vom ModemManager.

     ‘modem-manager’ (Vorgabe: ‘modem-manager’)
          Das ModemManager-Paket, was benutzt werden soll.

 -- Scheme-Variable: usb-modeswitch-service-type
     Dies ist der Diensttyp für den USB_ModeSwitch-Dienst
     (https://www.draisberghof.de/usb_modeswitch/). Der Wert dieses
     Diensttyps ist ein ‘usb-modeswitch-configuration’-Verbundsobjekt.

     Wenn sie eingesteckt werden, geben sich manche USB-Modems (und
     andere USB-Geräte) zunächst als Nur-Lese-Speichermedien und nicht
     als Modem aus. Sie müssen erst einem Moduswechsel („Modeswitching“)
     unterzogen werden, bevor sie benutzt werden können. Der
     USB_ModeSwitch-Diensttyp installiert udev-Regeln, um bei diesen
     Geräten automatisch ein Modeswitching durchzuführen, wenn sie
     eingesteckt werden.

     Dieser Dienst gehört zu den ‘%desktop-services’ (siehe *note
     Desktop-Dienste::).

 -- Datentyp: usb-modeswitch-configuration
     Der Datentyp, der die Konfiguration von USB_ModeSwitch
     repräsentiert.

     ‘usb-modeswitch’ (Vorgabe: ‘usb-modeswitch’)
          Das USB_ModeSwitch-Paket, das die Programmdateien für das
          Modeswitching enthält.

     ‘usb-modeswitch-data’ (Vorgabe: ‘usb-modeswitch-data’)
          Das Paket, in dem die Gerätedaten und die udev-Regeldatei
          stehen, die USB_ModeSwitch benutzt.

     ‘config-file’ (Vorgabe: ‘#~(string-append #$usb-modeswitch:dispatcher "/etc/usb_modeswitch.conf")’)
          Welche Konfigurationsdatei das USB_ModeSwitch-Aufrufprogramm
          („Dispatcher“) benutzt. Nach Vorgabe wird die mit
          USB_ModeSwitch ausgelieferte Konfigurationsdatei benutzt, die
          neben anderen Voreinstellungen die Protokollierung nach
          ‘/var/log’ abschaltet. Wenn ‘#f’ festgelegt wird, wird keine
          Konfigurationsdatei benutzt.

 -- Scheme-Variable: network-manager-service-type
     Dies ist der Diensttyp für den NetworkManager-Dienst
     (https://wiki.gnome.org/Projects/NetworkManager). Der Wert dieses
     Diensttyps ist ein ‘network-manager-configuration’-Verbundsobjekt.

     Dieser Dienst gehört zu den ‘%desktop-services’ (siehe *note
     Desktop-Dienste::).

 -- Datentyp: network-manager-configuration
     Datentyp, der die Konfiguration von NetworkManager repräsentiert.

     ‘network-manager’ (Vorgabe: ‘network-manager’)
          Das zu verwendende NetworkManager-Paket.

     ‘dns’ (Vorgabe: ‘"default"’)
          Der Verarbeitungsmodus für DNS-Anfragen. Er hat Einfluss
          darauf, wie NetworkManager mit der Konfigurationsdatei
          ‘resolv.conf’ verfährt.

          ‘default’
               NetworkManager aktualisiert ‘resolv.conf’, damit sie die
               Nameserver enthält, die von zurzeit aktiven Verbindungen
               benutzt werden.

          ‘dnsmasq’
               NetworkManager führt ‘dnsmasq’ als lokal
               zwischenspeichernden Nameserver aus und aktualisiert
               ‘resolv.conf’ so, dass es auf den lokalen Nameserver
               verweist. Falls Sie mit einem VPN verbunden sind, wird
               dafür eine getrennte DNS-Auflösung verwendet
               („Conditional Forwarding“).

               Mit dieser Einstellung können Sie Ihre Netzwerkverbindung
               teilen. Wenn Sie sie zum Beispiel mit einem anderen
               Laptop über ein Ethernet-Kabel teilen möchten, können Sie
               ‘nm-connection-editor’ öffnen und die Methode der
               Ethernet-Verbindung für IPv4 und IPv6 auf „Gemeinsam mit
               anderen Rechnern“ stellen und daraufhin die Verbindung
               neu herstellen (oder Ihren Rechner neu starten).

               Sie können so auch eine Verbindung vom Wirts- zum
               Gastsystem in virtuellen Maschinen mit QEMU (siehe *note
               Guix in einer VM installieren::) herstellen, d.h. eine
               „Host-to-Guest Connection“). Mit einer solchen
               Wirt-nach-Gast-Verbindung können Sie z.B. von einem
               Webbrowser auf Ihrem Wirtssystem auf einen Web-Server
               zugreifen, der auf der VM läuft (siehe *note
               Web-Dienste::). Sie können sich damit auch über SSH mit
               der virtuellen Maschine verbinden (siehe *note
               ‘openssh-service-type’: Netzwerkdienste.). Um eine
               Wirt-nach-Gast-Verbindung einzurichten, führen Sie einmal
               diesen Befehl aus:

                    nmcli connection add type tun \
                     connection.interface-name tap0 \
                     tun.mode tap tun.owner $(id -u) \
                     ipv4.method shared \
                     ipv4.addresses 172.28.112.1/24

               Danach geben Sie bei jedem Start Ihrer virtuellen
               QEMU-Maschine (siehe *note Guix in einer VM starten::)
               die Befehlszeilenoption ‘-nic
               tap,ifname=tap0,script=no,downscript=no’ an
               ‘qemu-system-…’ mit.

          ‘none’
               NetworkManager verändert ‘resolv.conf’ nicht.

     ‘vpn-plugins’ (Vorgabe: ‘'()’)
          Dies ist die Liste der verfügbaren Plugins für virtuelle
          private Netzwerke (VPN). Zum Beispiel kann das Paket
          ‘network-manager-openvpn’ angegeben werden, womit
          NetworkManager virtuelle private Netzwerke mit OpenVPN
          verwalten kann.

 -- Scheme-Variable: connman-service-type
     Mit diesem Diensttyp wird Connman (https://01.org/connman)
     ausgeführt, ein Programm zum Verwalten von Netzwerkverbindungen.

     Sein Wert muss ein ‘connman-configuration’-Verbundsobjekt wie im
     folgenden Beispiel sein:

          (service connman-service-type
                   (connman-configuration
                     (disable-vpn? #t)))

     Weiter unten werden Details der ‘connman-configuration’ erklärt.

 -- Datentyp: connman-configuration
     Datentyp, der die Konfiguration von Connman repräsentiert.

     ‘connman’ (Vorgabe: CONNMAN)
          Das zu verwendende Connman-Paket.

     ‘disable-vpn?’ (Vorgabe: ‘#f’)
          Falls dies auf wahr gesetzt ist, wird Connmans VPN-Plugin
          deaktiviert.

 -- Scheme-Variable: wpa-supplicant-service-type
     Dies ist der Diensttyp, um WPA Supplicant
     (https://w1.fi/wpa_supplicant/) auszuführen. Dabei handelt es sich
     um einen Authentisierungsdaemon, der notwendig ist, um sich
     gegenüber verschlüsselten WLAN- oder Ethernet-Netzwerken zu
     authentisieren.

 -- Datentyp: wpa-supplicant-configuration
     Repräsentiert die Konfiguration des WPA-Supplikanten.

     Sie hat folgende Parameter:

     ‘wpa-supplicant’ (Vorgabe: ‘wpa-supplicant’)
          Das WPA-Supplicant-Paket, was benutzt werden soll.

     ‘requirement’ (Vorgabe: ‘'(user-processes loopback syslogd)’
          Die Liste der Dienste, die vor dem WPA-Supplikanten bereits
          gestartet sein sollen.

     ‘dbus?’ (Vorgabe: ‘#t’)
          Ob auf Anfragen auf D-Bus gelauscht werden soll.

     ‘pid-file’ (Vorgabe: ‘"/var/run/wpa_supplicant.pid"’)
          Wo die PID-Datei abgelegt wird.

     ‘interface’ (Vorgabe: ‘#f’)
          Wenn dieses Feld gesetzt ist, muss es den Namen einer
          Netzwerkschnittstelle angeben, die von WPA Supplicant
          verwaltet werden soll.

     ‘config-file’ (Vorgabe: ‘#f’)
          Optionale Konfigurationsdatei.

     ‘extra-options’ (Vorgabe: ‘'()’)
          Liste zusätzlicher Befehlszeilenoptionen, die an den Daemon
          übergeben werden.

 -- Scheme-Variable: hostapd-service-type
     Dies ist der Diensttyp für den hostapd-Daemon
     (https://w1.fi/hostapd/), mit dem ein WLAN-Zugangspunkt (ein
     „Access Point“ gemäß IEEE 802.11) und Authentifizierungsserver
     eingerichtet werden kann. Sein zugewiesener Wert muss eine
     ‘hostapd-configuration’ sein wie im folgenden Beispiel:

          ;; Mit wlan1 den Zugangspunkt für "Mein Netzwerk" betreiben.
          (service hostapd-service-type
                   (hostapd-configuration
                    (interface "wlan1")
                    (ssid "Mein Netzwerk")
                    (channel 12)))

 -- Datentyp: hostapd-configuration
     Dieser Datentyp repräsentiert die Konfiguration des
     hostapd-Dienstes. Er hat folgende Felder:

     ‘package’ (Vorgabe: ‘hostapd’)
          Das zu benutzende hostapd-Paket.

     ‘interface’ (Vorgabe: ‘"wlan0"’)
          Die Netzwerkschnittstelle, auf der der WLAN-Zugangspunkt
          betrieben wird.

     ‘ssid’
          Die SSID (“Service Set Identifier”), eine das Netzwerk
          identifizierende Zeichenkette.

     ‘broadcast-ssid?’ (Vorgabe: ‘#t’)
          Ob diese SSID allgemein sichtbar sein soll.

     ‘channel’ (Vorlage: ‘1’)
          Der zu verwendende WLAN-Kanal.

     ‘driver’ (Vorgabe: ‘"nl80211"’)
          Über welchen Schnittstellentyp der Treiber angesprochen wird.
          ‘"nl80211"’ wird von allen Linux-mac80211-Treibern benutzt.
          Schreiben Sie ‘"none"’, wenn hostapd für einen eigenständigen
          RADIUS-Server erstellt wird, der keine Draht- oder
          Drahtlosverbindung steuert.

     ‘extra-settings’ (Vorgabe: ‘""’)
          Weitere Einstellungen, die wie sie sind an die
          Konfigurationsdatei von hostapd angehängt werden. Siehe
          <https://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf> für
          eine Referenz der Konfigurationsdatei.

 -- Scheme-Variable: simulated-wifi-service-type
     Dies ist der Diensttyp für einen Dienst, um ein WLAN-Netzwerk zu
     simulieren. Das kann auf virtuellen Maschinen zu Testzwecken
     eingesetzt werden. Der Dienst lädt das ‘mac80211_hwsim’-Modul
     (https://www.kernel.org/doc/html/latest/networking/mac80211_hwsim/mac80211_hwsim.html)
     in den Linux-Kernel und startet hostapd, um ein
     Pseudo-WLAN-Netzwerk vorzutäuschen, das nach Vorgabe als ‘wlan0’
     sichtbar ist.

     Der Wert des Dienstes ist ein
     ‘hostapd-configuration’-Verbundsobjekt.

 -- Scheme-Variable: iptables-service-type
     Mit diesem Diensttyp wird eine iptables-Konfiguration eingerichtet.
     iptables ist ein Rahmen für Netzwerkpaketfilter, der vom
     Linux-Kernel unterstützt wird. Der Dienst unterstützt die
     Konfiguration von iptables für sowohl IPv4 als auch IPv6. Eine
     einfache Beispielkonfiguration, die alle eingehenden Verbindungen
     verweigert, die nicht an den SSH-Port 22 gehen, können Sie hier
     sehen:

          (service iptables-service-type
                   (iptables-configuration
                    (ipv4-rules (plain-file "iptables.rules" "*filter
          :INPUT ACCEPT
          :FORWARD ACCEPT
          :OUTPUT ACCEPT
          -A INPUT -p tcp --dport 22 -j ACCEPT
          -A INPUT -j REJECT --reject-with icmp-port-unreachable
          COMMIT
          "))
                    (ipv6-rules (plain-file "ip6tables.rules" "*filter
          :INPUT ACCEPT
          :FORWARD ACCEPT
          :OUTPUT ACCEPT
          -A INPUT -p tcp --dport 22 -j ACCEPT
          -A INPUT -j REJECT --reject-with icmp6-port-unreachable
          COMMIT
          "))))

 -- Datentyp: iptables-configuration
     Repräsentiert die iptables-Konfiguration.

     ‘iptables’ (Vorgabe: ‘iptables’)
          Das zu benutzende iptables-Paket, das ‘iptables-restore’ und
          ‘ip6tables-restore’ zur Verfügung stellt.
     ‘ipv4-rules’ (Vorgabe: ‘%iptables-accept-all-rules’)
          Die zu benutzenden iptables-Regeln. Diese werden an
          ‘iptables-restore’ übergeben. Als Regeln kann jedes
          „dateiartige“ Objekt angegeben werden (siehe *note dateiartige
          Objekte: G-Ausdrücke.).
     ‘ipv6-rules’ (Vorgabe: ‘%iptables-accept-all-rules’)
          Die zu benutzenden ip6tables-Regeln. Diese werden an
          ‘ip6tables-restore’ übergeben. Als Regeln kann jedes
          „dateiartige“ Objekt angegeben werden (siehe *note dateiartige
          Objekte: G-Ausdrücke.).

 -- Scheme-Variable: nftables-service-type
     Dieser Dienst richtet eine Konfiguration von nftables ein. nftables
     ist als Projekt ein Teil von Netfilter mit dem Ziel, den
     bestehenden Aufbau aus iptables, ip6tables, arptables und ebtables
     zu ersetzen. Es stellt einen neuen Rahmen für Netzwerkpaketfilter
     bereit sowie ein neues Werkzeug ‘nft’ auf Anwendungsebene und eine
     Kompatibilitätsschicht für iptables. Dieser Dienst wird zusammen
     mit ‘%default-nftables-ruleset’ ausgeliefert, einem vorgegebenen
     Satz von Regeln, der alle eingehenden Verbindungen außer auf dem
     SSH-Port 22 ablehnt. Um ihn zu benutzen, schreiben Sie einfach:

          (service nftables-service-type)

 -- Datentyp: nftables-configuration
     Datentyp, der die nftables-Konfiguration repräsentiert.

     ‘package’ (Vorgabe: ‘nftables’)
          Das nftables-Paket, das ‘nft’ zur Verfügung stellt.
     ‘ruleset’ (Vorgabe: ‘%default-nftables-ruleset’)
          Die zu benutzenden nftables-Regeln. Als Regeln kann jedes
          „dateiartige“ Objekt angegeben werden (siehe *note dateiartige
          Objekte: G-Ausdrücke.).

 -- Scheme-Variable: ntp-service-type
     Dies ist der Typ des Dienstes, der den ‘ntpd’-Daemon für das
     Network Time Protocol (https://www.ntp.org), kurz NTP, ausführt.
     Mit diesem Daemon wird die Systemuhr mit der Uhr auf den
     angegebenen NTP-Servern synchronisiert.

     Der Wert dieses Dienstes ist ein ‘ntpd-configuration’-Objekt, wie
     im Folgenden beschrieben.

 -- Datentyp: ntp-configuration
     Der Datentyp für die Dienstkonfiguration des NTP-Dienstes.

     ‘servers’ (Vorgabe: ‘%ntp-servers’)
          Dies ist die Liste der Server
          (‘<ntp-server>’-Verbundsobjekte), mit denen ‘ntpd’
          synchronisiert wird. Siehe die Definition des
          ‘ntp-server’-Datentyps weiter unten.

     ‘allow-large-adjustment?’ (Vorgabe: ‘#t’)
          Hiermit wird festgelegt, ob ‘ntpd’ die Uhr beim ersten
          Umstellen um mehr als 1.000 Sekunden ändern darf.

     ‘ntp’ (Vorgabe: ‘ntp’)
          Das NTP-Paket, was benutzt werden soll.

 -- Scheme-Variable: %ntp-servers
     Liste der Rechnernamen („Host“-Namen), die als vorgegebene
     NTP-Server benutzt werden. Dabei handelt es sich um die Server des
     NTP Pool Project (https://www.ntppool.org/en/).

 -- Datentyp: ntp-server
     Der Datentyp, der die Konfiguration eines NTP-Servers
     repräsentiert.

     ‘type’ (Vorgabe: ‘'server’)
          Die Art des NTP-Servers als Symbol, entweder ‘'pool’,
          ‘'server’, ‘'peer’, ‘'broadcast’ oder ‘'manycastclient’.

     ‘address’
          Die Adresse des Servers als Zeichenkette.

     ‘options’
          NTPD-Optionen, die für diesen bestimmten Server gelten sollen,
          angegeben als Liste von Optionsnamen und/oder Tupeln aus je
          Optionsname und -wert. Im folgenden Beispiel wird ein Server
          definiert, der die Optionen ‘iburst’ und ‘prefer’ sowie
          ‘version’ 3 und eine ‘maxpoll’-Zeit von 16 Sekunden benutzen
          soll.

               (ntp-server
                (type 'server)
                (address "ein.ntp.server.org")
                (options `(iburst (version 3) (maxpoll 16) prefer))))

 -- Scheme-Prozedur: openntpd-service-type
     Hiermit wird ‘ntpd’, der Network-Time-Protocol-Daemon (NTP-Daemon),
     ausgeführt, in seiner OpenNTPD-Implementierung
     (http://www.openntpd.org). Der Daemon sorgt dafür, dass die
     Systemuhr mit den Uhren der eingestellten Server synchron bleibt.

          (service
           openntpd-service-type
           (openntpd-configuration
            (listen-on '("127.0.0.1" "::1"))
            (sensor '("udcf0 correction 70000"))
            (constraint-from '("www.gnu.org"))
            (constraints-from '("https://www.google.com/"))))


 -- Scheme-Variable: %openntpd-servers
     Diese Variable bezeichnet eine Liste von Serveradressen, die in
     ‘%ntp-servers’ definiert sind.

 -- Datentyp: openntpd-configuration
     ‘openntpd’ (Vorgabe: ‘(file-append openntpd "/sbin/ntpd")’)
          Das openntpd-Programm, das benutzt werden soll.
     ‘listen-on’ (Vorgabe: ‘'("127.0.0.1" "::1")’)
          Eine Liste von lokalen IP-Adressen oder Rechnernamen
          („Host“-Namen), auf denen der ntpd-Daemon lauschen soll.
     ‘query-from’ (Vorgabe: ‘'()’)
          Eine Liste von lokalen IP-Adressen, die der ntpd-Daemon für
          ausgehende Anfragen benutzen soll.
     ‘sensor’ (Vorgabe: ‘'()’)
          Hiermit geben Sie eine Liste von Zeitdifferenz-Sensorgeräten
          an, die ntpd benutzen soll. ‘ntpd’ wird auf jeden Sensor
          lauschen, der auch tatsächlich existiert, und solche, die
          nicht existieren, ignorieren. Siehe die Dokumentation beim
          Anbieter (https://man.openbsd.org/ntpd.conf) für weitere
          Informationen.
     ‘server’ (Vorgabe: ‘'()’)
          Hiermit geben Sie eine Liste von IP-Adressen oder Rechnernamen
          von NTP-Servern an, mit denen synchronisiert werden soll.
     ‘servers’ (Vorgabe: ‘%openntp-servers’)
          Hiermit geben Sie eine Liste von IP-Adressen oder Rechnernamen
          von NTP-Pools an, mit denen synchronisiert werden soll.
     ‘constraint-from’ (Vorgabe: ‘'()’)
          ‘ntpd’ kann so eingestellt werden, dass es das Datum aus der
          „Date“-Kopfzeile bei mit TLS übermittelten Anfragen an
          HTTPS-Server, denen vertraut wird, ausliest. Diese
          Zeitinformation wird nicht für Genauigkeit benutzt, sondern um
          mit authentifizierten Informationen die Auswirkungen eines
          Man-in-the-Middle-Angriffs auf unauthentifizierte
          NTP-Kommunikation einzuschränken. Geben Sie hierzu eine Liste
          von URLs, IP-Adressen oder Rechnernamen („Host“-Namen) von
          HTTPS-Servern an, um eine solche Beschränkung („Constraint“)
          einzurichten.
     ‘constraints-from’ (Vorgabe: ‘'()’)
          Wie bei ‘constraint-from’ geben Sie auch hier eine Liste von
          URLs, IP-Adressen oder Rechnernamen von HTTPS-Servern an, um
          eine Beschränkung einzurichten. Falls der Rechnername zu
          mehreren IP-Adressen aufgelöst wird, berechnet ‘ntpd’ den
          Median von allen als Beschränkung.

 -- Scheme-Variable: inetd-service-type
     Dieser Dienst führt den ‘inetd’-Daemon aus (siehe *note
     (inetutils)inetd invocation::). ‘inetd’ lauscht auf Verbindungen
     mit Internet-Sockets und startet bei Bedarf das entsprechende
     Server-Programm, sobald eine Verbindung mit einem dieser Sockets
     hergestellt wird.

     Der Wert dieses Dienstes ist ein ‘inetd-configuration’-Objekt. Im
     folgenden Beispiel wird der ‘inetd’-Daemon konfiguriert, um den
     eingebauten ‘echo’-Dienst sowie einen SMTP-Dienst anzubieten, wobei
     letzterer SMTP-Kommunikation über SSH an einen Server ‘smtp-server’
     über einen vom ‘rechnername’n bezeichneten Zugang („Gateway“)
     weiterleitet:

          (service
           inetd-service-type
           (inetd-configuration
            (entries (list
                      (inetd-entry
                       (name "echo")
                       (socket-type 'stream)
                       (protocol "tcp")
                       (wait? #f)
                       (user "root"))
                      (inetd-entry
                       (node "127.0.0.1")
                       (name "smtp")
                       (socket-type 'stream)
                       (protocol "tcp")
                       (wait? #f)
                       (user "root")
                       (program (file-append openssh "/bin/ssh"))
                       (arguments
                        '("ssh" "-qT" "-i" "/pfad/zum/ssh_schlüssel"
                          "-W" "smtp-server:25" "benutzer@rechnername")))))))

     Siehe unten für mehr Details über ‘inetd-configuration’.

 -- Datentyp: inetd-configuration
     Datentyp, der die Konfiguration von ‘inetd’ repräsentiert.

     ‘program’ (Vorgabe: ‘(file-append inetutils "/libexec/inetd")’)
          Das ‘inetd’-Programm, das benutzt werden soll.

     ‘entries’ (Vorgabe: ‘'()’)
          Eine Liste von ‘inetd’-Diensteinträgen. Jeder Eintrag sollte
          von einem ‘inetd-entry’-Konstruktor erzeugt werden.

 -- Datentyp: inetd-entry
     Datentyp, der einen Eintrag in der ‘inetd’-Konfiguration
     repräsentiert. Jeder Eintrag entspricht einem Socket, auf dem
     ‘inetd’ auf Anfragen lauscht.

     ‘node’ (Vorgabe: ‘#f’)
          Optional sollte hier als Zeichenkette eine kommagetrennte
          Liste lokaler Adressen angegeben werden, die ‘inetd’ benutzen
          soll, wenn er stellvertretend für den angegebenen Dienst
          lauscht. Siehe *note (inetutils)Configuration file:: für eine
          vollständige Beschreibung aller Optionen.
     ‘name’
          Eine Zeichenkette. Dieser Name muss einem Eintrag in
          ‘/etc/services’ entsprechen.
     ‘socket-type’
          Entweder ‘'stream’, ‘'dgram’, ‘'raw’, ‘'rdm’ oder
          ‘'seqpacket’.
     ‘protocol’
          Eine Zeichenkette, die einem Eintrag in ‘/etc/protocols’
          entsprechen muss.
     ‘wait?’ (Vorgabe: ‘#t’)
          Ob ‘inetd’ warten soll, bis der Server beendet ist, bevor es
          wieder auf neue Anfragen an den Dienst lauscht.
     ‘user’
          Eine Zeichenkette mit dem Benutzernamen (und optional dem
          Gruppennamen) des Benutzers, als der dieser Server ausgeführt
          werden soll. Der Gruppenname kann als Suffix angegeben werden,
          getrennt durch einen Doppelpunkt oder Punkt, d.h.
          ‘"benutzer"’, ‘"benutzer:gruppe"’ oder ‘"benutzer.gruppe"’.
     ‘program’ (Vorgabe: ‘"internal"’)
          Das Serverprogramm, das die Anfragen bedienen soll, oder
          ‘"internal"’, wenn ‘inetd’ einen eingebauten Dienst verwenden
          soll.
     ‘arguments’ (Vorgabe: ‘'()’)
          Eine Liste von Zeichenketten oder dateiartigen Objekten, die
          dem Serverprogramm als Argumente übergeben werden, angefangen
          mit dem nullten Argument, d.h. dem Namen selbigen
          Serverprogramms. Bei in ‘inetd’ eingebauten Diensten muss
          dieser Eintrag auf ‘'()’ oder ‘'("internal")’ gesetzt sein.

     Siehe *note (inetutils)Configuration file:: für eine mehr ins
     Detail gehende Erörterung jedes Konfigurationsfeldes.

 -- Scheme-Variable: tor-service-type
     Dies ist der Diensttyp für den Dienst, der den Tor-Daemon
     (https://torproject.org) für anonyme Netzwerkrouten ausführt. Der
     Dienst benutzt für seine Konfiguration ein
     ‘<tor-configuration>’-Verbundsobjekt. Vorgegeben ist, dass der
     Tor-Daemon als „unprivilegierter“ Nutzer ‘tor’ ausgeführt wird,
     einem Mitglied der ‘tor’-Benutzergruppe ohne besondere
     Berechtigungen.

 -- Datentyp: tor-configuration
     ‘tor’ (Vorgabe: ‘tor’)
          Das Paket, das den Tor-Daemon zur Verfügung stellt. Von diesem
          Paket wird erwartet, dass es den Daemon unter dem Pfad
          ‘bin/tor’ relativ zum Ausgabeverzeichnis verfügbar macht. Das
          vorgegebene Paket ist die Implementierung des Tor-Projekts
          (https://www.torproject.org).

     ‘config-file’ (Vorgabe: ‘(plain-file "empty" "")’)
          Die Konfigurationsdatei, die benutzt werden soll. Sie wird an
          eine vorgegebene Konfigurationsdatei angehängt und die sich
          daraus ergebende Konfigurationsdatei wird dann an ‘tor’ über
          dessen Befehlszeilenoption ‘-f’ übergeben. Hier kann jedes
          „dateiartige“ Objekt (siehe *note dateiartige Objekte:
          G-Ausdrücke.) angegeben werden. Siehe ‘man tor’ für Details
          zur Syntax der Konfigurationsdatei.

     ‘hidden-services’ (Vorgabe: ‘'()’)
          Die Liste der zu benutzenden „versteckten Dienste“ als
          ‘<hidden-service>’-Verbundsobjekte. Für jeden versteckten
          Dienst, den Sie in dieser Liste eintragen, werden automatisch
          entsprechende Einstellungen zur vorgefertigten
          Konfigurationsdatei hinzugefügt. Sie können
          ‘<hidden-service>’-Verbundsobjekte bequem mit der unten
          beschriebenen Prozedur ‘tor-hidden-service’ erzeugen lassen.

     ‘socks-socket-type’ (Vorgabe: ‘'tcp’)
          Welche Art von Socket Tor für seinen SOCKS-Socket in der
          Voreinstellung benutzen soll. Dafür muss entweder ‘'tcp’ oder
          ‘'unix’ angegeben werden. Für ‘'tcp’ wird Tor nach
          Voreinstellung auf dem TCP-Port 9050 auf der
          loopback-Schnittstelle (d.h. localhost) lauschen. Für ‘'unix’
          wird Tor auf dem UNIX-Socket ‘/var/run/tor/socks-sock’
          lauschen, auf den Mitglieder der ‘tor’-Benutzergruppe
          Schreibberechtigung erhalten.

          Wenn Sie detailliertere Anpassungen am SOCKS-Socket vornehmen
          wollen, belassen Sie ‘socks-socket-type’ bei seinem
          vorgegebenen Wert ‘'tcp’ und benutzen Sie ‘config-file’, um
          diese Voreinstellung mit Ihrer eigenen ‘SocksPort’-Option zu
          überspielen.

     ‘control-socket?’ (Vorgabe: ‘#f’)
          Ob ein „Steuerungs-Socket“ bereitgestellt werden soll, über
          den Tor angesteuert werden kann, um zum Beispiel Onion-Dienste
          zur Laufzeit zu instanziieren. Wird hier ‘#t’ angegeben, nimmt
          Tor Steuerungsbefehle auf dem Unix-Socket
          ‘/var/run/tor/control-sock’ entgegen, auf den Mitglieder der
          ‘tor’-Benutzergruppe Schreibzugriff bekommen.

 -- Scheme-Prozedur: tor-hidden-service NAME ZUORDNUNG
     Hiermit wird ein neuer “versteckter Dienst” von Tor mit diesem
     NAMEn definiert, der die ZUORDNUNG herstellt. Die ZUORDNUNG ist
     eine Liste von Port-/Rechner-Tupeln wie hier:

           '((22 "127.0.0.1:22")
             (80 "127.0.0.1:8080"))

     In diesem Beispiel wird Port 22 des versteckten Dienstes an den ihm
     zugeordneten lokalen Port 22 weitergeleitet und Port 80 wird an den
     lokalen Port 8080 weitergeleitet.

     Dadurch wird ein Verzeichnis ‘/var/lib/tor/hidden-services/NAME’
     erstellt, worin sich in der Datei ‘hostname’ der
     ‘.onion’-Rechnername („Host“-Name) des versteckten Dienstes
     befindet.

     Siehe die Dokumentation des Tor-Projekts
     (https://www.torproject.org/docs/tor-hidden-service.html.en) für
     weitere Informationen.

   Das Modul ‘(gnu services rsync)’ bietet die folgenden Dienste an:

   Sie könnten einen rsync-Daemon einsetzen wollen, um Dateien verfügbar
zu machen, damit jeder (oder nur Sie) bestehende Dateien herunterladen
oder neue Dateien hochladen kann.

 -- Scheme-Variable: rsync-service-type
     Dies ist der Diensttyp für den rsync-Daemon
     (https://rsync.samba.org), er benutzt ein
     ‘rsync-configuration’-Verbundsobjekt wie in diesem Beispiel:

          (service rsync-service-type)

     Siehe unten für Details zur ‘rsync-configuration’.

 -- Datentyp: rsync-configuration
     Datentyp, der die Konfiguration für den ‘rsync-service’
     repräsentiert.

     ‘package’ (Vorgabe: RSYNC)
          Zu benutzendes ‘rsync’-Paket.

     ‘port-number’ (Vorgabe: ‘873’)
          Der TCP-Port, auf dem ‘rsync’ auf eingehende Verbindungen
          lauscht. Wenn die Portnummer kleiner als ‘1024’ ist, muss
          ‘rsync’ als Administratornutzer ‘root’ und auch mit dieser
          Benutzergruppe gestartet werden.

     ‘pid-file’ (Vorgabe: ‘"/var/run/rsyncd/rsyncd.pid"’)
          Der Name der Datei, in die ‘rsync’ seine PID schreibt.

     ‘lock-file’ (Vorgabe: ‘"/var/run/rsyncd/rsyncd.lock"’)
          Der Name der Datei, die ‘rsync’ als seine Sperrdatei
          verwendet.

     ‘log-file’ (Vorgabe: ‘"/var/log/rsyncd.log"’)
          Der Name der Datei, in die ‘rsync’ seine Protokolle schreibt.

     ‘use-chroot?’ (Vorgabe: #T)
          Ob chroot auf das über ‘rsync’ geteilte Verzeichnis angewandt
          werden soll.

     ‘share-path’ (Vorgabe: ‘/srv/rsync’)
          Der Ort des Verzeichnisses, das ‘rsync’ teilt, d.h. seine
          „Shared Directory“.

     ‘share-comment’ (Vorgabe: ‘"Rsync share"’)
          Kommentar zum von ‘rsync’ geteilten Verzeichnis.

     ‘read-only?’ (Vorgabe: #F)
          Bestimmt die Lese- und Schreibberechtigungen für das
          gemeinsame Verzeichnis.

     ‘timeout’ (Vorgabe: ‘300’)
          Ein-/Ausgabe-Zeitbeschränkung in Sekunden.

     ‘user’ (Vorgabe: "ROOT")
          Das Benutzerkonto, dem der ‘rsync’-Prozess gehören soll.

     ‘group’ (Vorgabe: "ROOT")
          Die Benutzergruppe des ‘rsync’-Prozesses.

     ‘uid’ (Vorgabe: "RSYNCD")
          Der Benutzername oder der Benutzeridentifikator (d.h. die
          „User-ID“), mit dem Dateiübertragungen zum und vom Modul
          stattfinden sollen, wenn der Daemon als Administratornutzer
          ‘root’ läuft.

     ‘gid’ (Vorgabe: "RSYNCD")
          Benutzergruppenname oder Gruppenidentifikator („Group-ID“),
          mit dem auf das Modul zugegriffen wird.

   Das Modul ‘(gnu services syncthing)’ bietet die folgenden Dienste an:

   Sie könnten einen syncthing-Daemon benutzen wollen, wenn Sie Dateien
auf zwei oder mehr Rechnern haben und diese in Echtzeit synchronisieren
wollen, geschützt vor neugierigen Blicken.

 -- Scheme-Variable: syncthing-service-type
     Dies ist der Diensttyp für den syncthing-Daemon
     (https://syncthing.net/), er benutzt ein
     ‘syncthing-configuration’-Verbundsobjekt wie in diesem Beispiel:

          (service syncthing-service-type
                   (syncthing-configuration (user "alice")))

     Siehe unten für Details zur ‘syncthing-configuration’.

      -- Datentyp: syncthing-configuration
          Datentyp, der die Konfiguration für den
          ‘syncthing-service-type’ repräsentiert.

          ‘syncthing’ (Vorgabe: SYNCTHING)
               Zu benutzendes ‘syncthing’-Paket.

          ‘arguments’ (Vorgabe: ’())
               Liste der Befehlszeilenoptionen, die an das
               ‘syncthing’-Programm übergeben werden.

          ‘logflags’ (Vorgabe: 0)
               Die Summe aus den Protokollierungsoptionen, siehe die
               Dokumentation von Syncthing zu logflags
               (https://docs.syncthing.net/users/syncthing.html#cmdoption-logflags).

          ‘user’ (Vorgabe: #F)
               Das Benutzerkonto, mit dem der Syncthing-Dienst
               ausgeführt wird. Es wird vorausgesetzt, dass der
               angegebene Benutzer existiert.

          ‘group’ (Vorgabe: "USERS")
               Die Gruppe, mit der der Syncthing-Dienst ausgeführt wird.
               Es wird vorausgesetzt, dass die angegebene Gruppe
               existiert.

          ‘home’ (Vorgabe: #F)
               Das gemeinsame Verzeichnis für sowohl Konfiguration als
               auch Daten. In der Vorgabeeinstellung würde das in
               ‘$HOME’ gespeicherte Verzeichnis das
               Konfigurationsverzeichnis des mit ‘user’ festgelegten
               Syncthing-Nutzers.

   Des Weiteren bietet das Modul ‘(gnu services ssh)’ die folgenden
Dienste an.

 -- Scheme-Prozedur: lsh-service [#:host-key "/etc/lsh/host-key"]
          [#:daemonic? #t] [#:interfaces '()] [#:port-number 22]
          [#:allow-empty-passwords? #f] [#:root-login? #f]
           [#:syslog-output? #t]
     [#:x11-forwarding? #t]  [#:tcp/ip-forwarding? #t]
     [#:password-authentication? #t]  [#:public-key-authentication? #t]
     [#:initialize? #t] Das ‘lshd’-Programm auf dem LSH-Paket so
     ausführen, dass es auf dem Port mit Portnummer PORT-NUMBER lauscht.
     HOST-KEY muss eine Datei angeben, die den Wirtsschlüssel enthält,
     die nur für den Administratornutzer lesbar sein darf.

     Wenn DAEMONIC? wahr ist, entkoppelt sich ‘lshd’ vom Terminal, auf
     dem er läuft, und schickt seine Protokolle an syslogd, außer
     SYSLOG-OUTPUT? ist auf falsch gesetzt. Selbstverständlich hängt der
     lsh-service dann auch von der Existenz eines syslogd-Dienstes ab.
     Wenn PID-FILE? wahr ist, schreibt ‘lshd’ seine PID in die Datei
     namens PID-FILE.

     Wenn INITIALIZE? wahr ist, wird der Startwert zur Verschlüsselung
     ebenso wie der Wirtsschlüssel bei der Dienstaktivierung erstellt,
     falls sie noch nicht existieren. Das kann lange dauern und
     Anwenderinteraktion kann dabei erforderlich sein.

     Wenn INITIALIZE? falsch ist, bleibt es dem Nutzer überlassen, den
     Zufallsgenerator zu initialisieren (siehe *note
     (lsh)lsh-make-seed::) und ein Schlüsselpaar zu erzeugen, dessen
     privater Schlüssel in der mit HOST-KEY angegebenen Datei steht
     (siehe *note (lsh)lshd basics::).

     Wenn INTERFACES leer ist, lauscht lshd an allen
     Netzwerkschnittstellen auf Verbindungen, andernfalls muss
     INTERFACES eine Liste von Rechnernamen („Host“-Namen) oder Adressen
     bezeichnen.

     ALLOW-EMPTY-PASSWORDS? gibt an, ob Anmeldungen mit leeren
     Passwörtern akzeptiert werden sollen, und ROOT-LOGIN? gibt an, ob
     Anmeldungen als Administratornutzer „root“ akzeptiert werden
     sollen.

     Die anderen Felder sollten selbsterklärend sein.

 -- Scheme-Variable: openssh-service-type
     Dies ist der Diensttyp für den OpenSSH-Secure-Shell-Daemon
     (http://www.openssh.org), ‘sshd’. Sein Wert muss ein
     ‘openssh-configuration’-Verbundsobjekt wie in diesem Beispiel sein:

          (service openssh-service-type
                   (openssh-configuration
                     (x11-forwarding? #t)
                     (permit-root-login 'without-password)
                     (authorized-keys
                       `(("alice" ,(local-file "alice.pub"))
                         ("bob" ,(local-file "bob.pub"))))))

     Siehe unten für Details zur ‘openssh-configuration’.

     Dieser Dienst kann mit weiteren autorisierten Schlüsseln erweitert
     werden, wie in diesem Beispiel:

          (service-extension openssh-service-type
                             (const `(("charlie"
                                       ,(local-file "charlie.pub")))))

 -- Datentyp: openssh-configuration
     Dies ist der Verbundstyp für die Konfiguration von OpenSSHs ‘sshd’.

     ‘openssh’ (Vorgabe: OPENSSH)
          Das zu benutzende OpenSSH-Paket.

     ‘pid-file’ (Vorgabe: ‘"/var/run/sshd.pid"’)
          Der Name der Datei, in die ‘sshd’ seine PID schreibt.

     ‘port-number’ (Vorgabe: ‘22’)
          Der TCP-Port, auf dem ‘sshd’ auf eingehende Verbindungen
          lauscht.

     ‘permit-root-login’ (Vorgabe: ‘#f’)
          Dieses Feld bestimmt, ob und wann Anmeldungen als
          Administratornutzer „root“ erlaubt sind. Wenn es ‘#f’ ist,
          sind Anmeldungen als Administrator gesperrt, bei ‘#t’ sind sie
          erlaubt. Wird hier das Symbol ‘'without-password’ angegeben,
          dann sind Anmeldungen als Administrator erlaubt, aber nur,
          wenn keine passwortbasierte Authentifizierung verwendet wird.

     ‘allow-empty-passwords?’ (Vorgabe: ‘#f’)
          Wenn dies auf wahr gesetzt ist, können sich Nutzer, deren
          Passwort leer ist, anmelden. Ist es falsch, können sie es
          nicht.

     ‘password-authentication?’ (Vorgabe: ‘#t’)
          Wenn dies wahr ist, können sich Benutzer mit ihrem Passwort
          anmelden. Wenn es falsch ist, müssen sie andere
          Authentisierungsmethoden benutzen.

     ‘public-key-authentication?’ (Vorgabe: ‘#t’)
          Wenn dies wahr ist, können Benutzer zur Anmeldung mit ihrem
          öffentlichen Schlüssel authentifiziert werden. Wenn es falsch
          ist, müssen sie andere Authentisierungsmethoden benutzen.

          Autorisierte öffentliche Schlüssel werden in
          ‘~/.ssh/authorized_keys’ gespeichert. Dies wird nur für
          Protokollversion 2 benutzt.

     ‘x11-forwarding?’ (Vorgabe: ‘#f’)
          Wenn dies auf wahr gesetzt ist, ist das Weiterleiten von
          Verbindungen an grafische X11-Clients erlaubt — mit anderen
          Worten funktionieren dann die ‘ssh’-Befehlszeilenoptionen ‘-X’
          und ‘-Y’.

     ‘allow-agent-forwarding?’ (Vorgabe: ‘#t’)
          Ob Weiterleitung an den SSH-Agenten zugelassen werden soll.

     ‘allow-tcp-forwarding?’ (Vorgabe: ‘#t’)
          Ob Weiterleitung von TCP-Kommunikation zugelassen werden soll.

     ‘gateway-ports?’ (Vorgabe: ‘#f’)
          Ob Ports als Zugang für eingehende Verbindungen
          („Gateway-Ports“) weitergeleitet werden dürfen.

     ‘challenge-response-authentication?’ (Vorgabe: ‘#f’)
          Gibt an, ob „Challenge-Response“-Authentifizierung zugelassen
          wird (z.B. über PAM).

     ‘use-pam?’ (Vorgabe: ‘#t’)
          Aktiviert die Pluggable-Authentication-Module-Schnittstelle.
          Wenn es auf ‘#t’ gesetzt ist, wird dadurch PAM-Authentisierung
          über ‘challenge-response-authentication?’ und
          ‘password-authentication?’ aktiviert, zusätzlich zur
          Verarbeitung von PAM-Konten und Sitzungsmodulen für alle
          Authentisierungsarten.

          Weil PAM-Challenge-Response-Authentisierung oft für dieselben
          Zwecke wie Passwortauthentisierung eingesetzt wird, sollten
          Sie entweder ‘challenge-response-authentication?’ oder
          ‘password-authentication?’ deaktivieren.

     ‘print-last-log?’ (Vorgabe: ‘#t’)
          Hiermit wird angegeben, ob ‘sshd’ Datum und Uhrzeit der
          letzten Anmeldung anzeigen soll, wenn sich ein Benutzer
          interaktiv anmeldet.

     ‘subsystems’ (Vorgabe: ‘'(("sftp" "internal-sftp"))’)
          Hiermit werden externe Subsysteme konfiguriert (z.B. ein
          Dateiübertragungsdaemon).

          Diese werden als Liste von zweielementigen Listen angegeben,
          von denen jede den Namen des Subsystems und einen Befehl (mit
          optionalen Befehlszeilenargumenten) benennt, der bei einer
          Anfrage an das Subsystem ausgeführt werden soll.

          Der Befehl ‘internal-sftp’ implementiert einen SFTP-Server im
          selben Prozess. Alternativ kann man den ‘sftp-server’-Befehl
          angeben:
               (service openssh-service-type
                        (openssh-configuration
                         (subsystems
                          `(("sftp" ,(file-append openssh "/libexec/sftp-server"))))))

     ‘accepted-environment’ (Vorgabe: ‘'()’)
          Eine Liste von Zeichenketten, die die Umgebungsvariablen
          benennen, die exportiert werden dürfen.

          Jede Zeichenkette wird zu einer eigenen Zeile in der
          Konfigurationsdatei. Siehe die Option ‘AcceptEnv’ in ‘man
          sshd_config’.

          Mit diesem Beispiel können SSH-Clients die Umgebungsvariable
          ‘COLORTERM’ exportieren. Sie wird von Terminal-Emulatoren
          gesetzt, die Farben unterstützen. Sie können Sie in der
          Ressourcendatei Ihrer Shell benutzen, um Farben in der
          Eingabeaufforderung und in Befehlen zu aktivieren, wenn diese
          Variable gesetzt ist.

               (service openssh-service-type
                        (openssh-configuration
                          (accepted-environment '("COLORTERM"))))

     ‘authorized-keys’ (Vorgabe: ‘'()’)
          Dies ist die Liste der autorisierten Schlüssel. Jedes Element
          der Liste ist ein Benutzername gefolgt von einem oder mehr
          dateiartigen Objekten, die öffentliche SSH-Schlüssel
          repräsentieren. Zum Beispiel werden mit

               (openssh-configuration
                 (authorized-keys
                   `(("rekado" ,(local-file "rekado.pub"))
                     ("chris" ,(local-file "chris.pub"))
                     ("root" ,(local-file "rekado.pub") ,(local-file "chris.pub")))))

          die angegebenen öffentlichen Schlüssel für die Benutzerkonten
          ‘rekado’, ‘chris’ und ‘root’ registriert.

          Weitere autorisierte Schlüssel können als ‘service-extension’
          hinzugefügt werden.

          Beachten Sie, dass das hier neben ‘~/.ssh/authorized_keys’
          _ohne_ sich zu stören benutzt werden kann.

     ‘log-level’ (Vorgabe: ‘'info’)
          Dieses Symbol gibt die Stufe der Protokollierung an: ‘quiet’
          (schweigsam), ‘fatal’, ‘error’, ‘info’, ‘verbose’
          (ausführlich), ‘debug’ (Fehlersuche) etc. Siehe die
          Handbuchseite für ‘sshd_config’ für die vollständige Liste der
          Stufenbezeichnungen.

     ‘extra-content’ (Vorgabe: ‘""’)
          Dieses Feld kann benutzt werden, um beliebigen Text an die
          Konfigurationsdatei anzuhängen. Es ist besonders bei
          ausgeklügelten Konfigurationen nützlich, die anders nicht
          ausgedrückt werden können. Zum Beispiel würden mit dieser
          Konfiguration Anmeldungen als Administratornutzer „root“
          grundsätzlich untersagt, lediglich für eine bestimmte
          IP-Adresse wären sie zugelassen:

               (openssh-configuration
                 (extra-content "\
               Match Address 192.168.0.1
                 PermitRootLogin yes"))

 -- Scheme-Prozedur: dropbear-service [KONFIGURATION]
     Den Dropbear-SSH-Daemon
     (https://matt.ucc.asn.au/dropbear/dropbear.html) mit der
     angegebenen KONFIGURATION ausführen, einem
     ‘<dropbear-configuration>’-Objekt.

     Wenn Sie zum Beispiel einen Dropbear-Dienst angeben möchten, der
     auf Port 1234 lauscht, dann fügen Sie diesen Aufruf ins
     ‘services’-Feld des Betriebssystems ein:

          (dropbear-service (dropbear-configuration
                              (port-number 1234)))

 -- Datentyp: dropbear-configuration
     Dieser Datentyp repräsentiert die Konfiguration eines
     Dropbear-SSH-Daemons.

     ‘dropbear’ (Vorgabe: DROPBEAR)
          Das zu benutzende Dropbear-Paket.

     ‘port-number’ (Vorgabe: 22)
          Die Portnummer des TCP-Ports, auf dem der Daemon auf
          eingehende Verbindungen wartet.

     ‘syslog-output?’ (Vorgabe: ‘#t’)
          Ob eine Ausgabe für Syslog aktiviert sein soll.

     ‘pid-file’ (Vorgabe: ‘"/var/run/dropbear.pid"’)
          Der Dateiname der PID-Datei des Daemons.

     ‘root-login?’ (Vorgabe: ‘#f’)
          Ob Anmeldungen als Administratornutzer ‘root’ möglich sein
          sollen.

     ‘allow-empty-passwords?’ (Vorgabe: ‘#f’)
          Ob leere Passwörter zugelassen sein sollen.

     ‘password-authentication?’ (Vorgabe: ‘#t’)
          Ob passwortbasierte Authentisierung zugelassen sein soll.

 -- Scheme-Variable: autossh-service-type
     Dies ist der Diensttyp für das AutoSSH-Programm
     (https://www.harding.motd.ca/autossh), das eine Kopie von ‘ssh’
     ausführt und diese überwacht. Bei Bedarf wird sie neugestartet, für
     den Fall, dass sie abstürzt oder keine Kommunikation mehr
     verarbeitet. AutoSSH kann von Hand aus der Befehlszeile heraus
     aufgerufen werden, indem man Argumente an die Binärdatei ‘autossh’
     aus dem Paket ‘autossh’ übergibt, aber es kann auch als ein
     Guix-Dienst ausgeführt werden. Letzteres wird hier beschrieben.

     AutoSSH kann benutzt werden, um an den lokalen Rechner gerichtete
     Kommunikation an eine entfernte Maschine über einen SSH-Tunnel
     weiterzuleiten. Dabei gilt die ‘~/.ssh/config’-Datei des AutoSSH
     ausführenden Benutzers.

     Um zum Beispiel einen Dienst anzugeben, der autossh mit dem
     Benutzerkonto ‘pino’ ausführt und alle lokalen Verbindungen auf
     Port ‘8081’ an ‘entfernt:8081’ über einen SSH-Tunnel
     durchzureichen, fügen Sie folgenden Aufruf in das ‘services’-Feld
     des Betriebssystems ein:

          (service autossh-service-type
                   (autossh-configuration
                    (user "pino")
                    (ssh-options (list "-T" "-N" "-L" "8081:localhost:8081" "entfernt.net"))))

 -- Datentyp: autossh-configuration
     Dieser Datentyp repräsentiert die Konfiguration des
     AutoSSH-Dienstes.

     ‘user’ (Vorgabe: ‘"autossh"’)
          Das Benutzerkonto, mit dem der AutoSSH-Dienst ausgeführt wird.
          Es wird vorausgesetzt, dass der angegebene Benutzer existiert.

     ‘poll’ (Vorgabe: ‘600’)
          Gibt an, wie oft die Verbindung geprüft wird („Poll Time“), in
          Sekunden.

     ‘first-poll’ (Vorgabe: ‘#f’)
          Gibt an, wie viele Sekunden AutoSSH vor der ersten
          Verbindungsprüfung abwartet. Nach dieser ersten Prüfung werden
          weitere Prüfungen mit der in ‘poll’ angegebenen Regelmäßigkeit
          durchgeführt. Wenn dies auf ‘#f’ gesetzt ist, erfährt die
          erste Verbindungsprüfung keine Sonderbehandlung, sondern
          benutzt die gleichen Zeitabstände, die auch mit ‘poll’
          festgelegt wurden.

     ‘gate-time’ (Vorgabe: ‘30’)
          Gibt an, wie viele Sekunden lang eine SSH-Verbindung aktiv
          sein muss, bis sie als erfolgreich angesehen wird.

     ‘log-level’ (Vorgabe: ‘1’)
          Die Protokollierungsstufe. Sie entspricht den bei Syslog
          verwendeten Stufen, d.h. ‘0’ verschweigt die meisten Ausgaben,
          während ‘7’ die gesprächigste Stufe ist.

     ‘max-start’ (Vorgabe: ‘#f’)
          Wie oft SSH (neu) gestartet werden darf, bevor AutoSSH aufgibt
          und sich beendet. Steht dies auf ‘#f’, gibt es keine
          Begrenzung und AutoSSH kann endlos neu starten.

     ‘message’ (Vorgabe: ‘""’)
          Welche Nachricht beim Prüfen von Verbindungen an die
          zurückkommende Echo-Nachricht angehängt werden soll.

     ‘port’ (Vorgabe: ‘"0"’)
          Welche Ports zum Überprüfen der Verbindung benutzt werden.
          Steht dies auf ‘"0"’, werden keine Überprüfungen durchgeführt.
          Steht es auf ‘"N"’ für eine positive ganze Zahl N, werden die
          Ports N und N+1 zum Überwachen der Verbindung eingesetzt,
          wobei auf Port N Daten dafür gesendet werden und Port ‘n+1’
          deren Echo empfangen soll. Steht es auf ‘"N:M"’ für positive
          ganze Zahlen N und M, werden Ports N und M zur Überprüfung
          eingesetzt, wozu Port N zum Senden der Prüfdaten eingesetzt
          wird und Port M das Echo empfängt.

     ‘ssh-options’ (Vorgabe: ‘'()’)
          Die Liste der Befehlszeilenargumente, die an ‘ssh’
          weitergegeben werden sollen, wenn es ausgeführt wird. Die
          Befehlszeilenoptionen ‘-f’ und ‘-M’ sind AutoSSH vorbehalten;
          sie anzugeben, führt zu undefiniertem Verhalten.

 -- Scheme-Variable: webssh-service-type
     Dies ist der Diensttyp für das Programm <WebSSH
     (https://webssh.huashengdun.org/)>, das einen webbasierten
     SSH-Client ausführt. WebSSH kann von Hand aus der Befehlszeile
     heraus aufgerufen werden, indem man Argumente an die Binärdatei
     ‘wssh’ aus dem Paket ‘webssh’ übergibt, aber es kann auch als ein
     Guix-Dienst ausgeführt werden. Letzteres wird hier beschrieben.

     Um zum Beispiel einen Dienst anzugeben, der WebSSH an der
     Loopback-Schnittstelle auf Port ‘8888’ ausführt, wobei die
     Richtlinie ist, dass Verbindungen abgelehnt werden außer zu einer
     Liste von erlaubten Rechnern, und eine auf HTTPS-Verbindungen
     lauschende NGINX als inversen Proxy dafür fungieren zu lassen,
     fügen Sie folgende Aufrufe in das ‘services’-Feld des
     Betriebssystems ein:

          (service webssh-service-type
            (webssh-configuration (address "127.0.0.1")
                                  (port 8888)
                                  (policy 'reject)
                                  (known-hosts '("localhost ecdsa-sha2-nistp256 AAAA…"
                                                 "127.0.0.1 ecdsa-sha2-nistp256 AAAA…"))))

          (service nginx-service-type
                   (nginx-configuration
                    (server-blocks
                     (list
                      (nginx-server-configuration
                       (inherit %webssh-configuration-nginx)
                       (server-name '("webssh.example.com"))
                       (listen '("443 ssl"))
                       (ssl-certificate (letsencrypt-certificate "webssh.example.com"))
                       (ssl-certificate-key (letsencrypt-key "webssh.example.com"))
                       (locations
                        (cons (nginx-location-configuration
                               (uri "/.well-known")
                               (body '("root /var/www;")))
                              (nginx-server-configuration-locations %webssh-configuration-nginx))))))))

 -- Datentyp: webssh-configuration
     Repräsentiert die Konfiguration für den Dienst ‘webssh-service’.

     ‘package’ (Vorgabe: ‘webssh’)
          Zu benutzendes ‘webssh’-Paket.

     ‘user-name’ (Vorgabe: ‘"webssh"’)
          Der Benutzername oder der Benutzeridentifikator (d.h. die
          „User-ID“), mit dem Dateiübertragungen zum und vom Modul
          stattfinden sollen.

     ‘group-name’ (Vorgabe: ‘"webssh"’)
          Benutzergruppenname oder Gruppenidentifikator („Group-ID“),
          mit dem auf das Modul zugegriffen wird.

     ‘address’ (Vorgabe: ‘#f’)
          Die IP-Adresse, auf der ‘webssh’ auf eingehende Verbindungen
          lauscht.

     ‘port’ (Vorgabe: ‘8888’)
          Der TCP-Port, auf dem ‘webssh’ auf eingehende Verbindungen
          lauscht.

     ‘policy’ (Vorgabe: ‘#f’)
          Die Verbindungsrichtlinie ‘reject’ setzt voraus, dass erlaubte
          Rechner in KNOWN-HOSTS eingetragen werden.

     ‘known-hosts’ (Vorgabe: ‘'()’)
          Eine Liste der Rechner, die für eine SSH-Verbindung aus
          ‘webssh’ zugelassen sind.

     ‘log-file’ (Vorgabe: ‘"/var/log/webssh.log"’)
          Der Name der Datei, in die ‘webssh’ seine Protokolle schreibt.

     ‘log-level’ (Vorgabe: ‘#f’)
          Das Protokollierungsniveau.

 -- Scheme-Variable: %facebook-host-aliases
     Diese Variable enthält eine Zeichenkette, die Sie für ‘/etc/hosts’
     benutzen können (siehe *note (libc)Host Names::). Jede Zeile
     enthält einen Eintrag, der einen bekannten Servernamen des
     Facebook-Online-Dienstes — z.B. ‘www.facebook.com’ — an den lokalen
     Rechner umleitet — also an ‘127.0.0.1’ oder dessen IPv6-Gegenstück
     ‘::1’.

     Normalerweise wird diese Variable im Feld ‘hosts-file’ einer
     ‘operating-system’-Betriebssystemdeklaration benutzt (siehe *note
     ‘/etc/hosts’: „operating-system“-Referenz.):

          (use-modules (gnu) (guix))

          (operating-system
            (host-name "mymachine")
            ;; …
            (hosts-file
              ;; Eine /etc/hosts-Datei, mit der "localhost" und
              ;; "mymachine" als Alias-Namen eingerichtet werden
              ;; und für die Facebook-Servernamen stattdessen
              ;; Alias-Namen benutzt werden.
              (plain-file "hosts"
                          (string-append (local-host-aliases host-name)
                                         %facebook-host-aliases))))

     Dieser Mechanismus kann verhindern, dass lokal laufende Programme,
     wie z.B. Web-Browser, auf Facebook zugreifen.

   Das Modul ‘(gnu services avahi)’ stellt die folgende Definition zur
Verfügung.

 -- Scheme-Variable: avahi-service-type
     Dieser Dienst führt den ‘avahi-daemon’ aus, einen systemweiten
     mDNS-/DNS-SD-Anbieter, mit dem im lokalen Netzwerk befindliche
     Geräte erkannt werden können („Service Discovery“) und Rechnernamen
     selbstständig aufgelöst werden können („Zero-Configuration“) (siehe
     <https://avahi.org/>). Sein Wert muss ein
     ‘avahi-configuration’-Verbundsobjekt sein — siehe unten.

     Dieser Dienst erweitert den Name Service Cache Daemon (nscd), damit
     er ‘.local’-Rechnernamen mit nss-mdns
     (https://0pointer.de/lennart/projects/nss-mdns/) auflösen kann.
     Siehe *note Name Service Switch:: für Informationen zur Auflösung
     von Rechnernamen.

     Des Weiteren wird das AVAHI-Paket zum Systemprofil hinzugefügt,
     damit Befehle wie ‘avahi-browse’ einfach benutzt werden können.

 -- Datentyp: avahi-configuration
     Dieser Datentyp repräsentiert die Konfiguration von Avahi.

     ‘host-name’ (Vorgabe: ‘#f’)
          Wenn dies auf etwas anderes als ‘#f’ gesetzt ist, wird es
          anderen als Rechnername für diese Maschine mitgeteilt,
          andernfalls wird der tatsächliche Rechnername anderen
          mitgeteilt.

     ‘publish?’ (Vorgabe: ‘#t’)
          Wenn es auf wahr gesetzt ist, dürfen Rechnernamen und
          Avahi-Dienste über das Netzwerk mitgeteilt werden (als
          Broadcast).

     ‘publish-workstation?’ (Vorgabe: ‘#t’)
          Wenn es auf wahr gesetzt ist, teilt ‘avahi-daemon’ den
          Rechnernamen dieser Maschine und die IP-Adresse über mDNS auf
          dem lokalen Netzwerk öffentlich mit. Um die auf Ihrem lokalen
          Netzwerk mitgeteilten Rechnernamen zu sehen, können Sie das
          hier ausführen:

               avahi-browse _workstation._tcp

     ‘wide-area?’ (Vorgabe: ‘#f’)
          Wenn dies auf wahr gesetzt ist, ist DNS-SD über „Unicast DNS“
          aktiviert.

     ‘ipv4?’ (Vorgabe: ‘#t’)
     ‘ipv6?’ (Vorgabe: ‘#t’)
          Mit diesen Feldern wird festgelegt, ob IPv4-/IPv6-Sockets
          verwendet werden.

     ‘domains-to-browse’ (Vorgabe: ‘'()’)
          Dies ist eine Liste von Domänen, die durchsucht werden.

 -- Scheme-Variable: openvswitch-service-type
     Dies ist der Diensttyp des Open-vSwitch-Dienstes
     (https://www.openvswitch.org), der als Wert ein
     ‘openvswitch-configuration’-Objekt hat.

 -- Datentyp: openvswitch-configuration
     Der Datentyp, der die Konfiguration von Open vSwitch repräsentiert,
     einem auf mehreren Schichten arbeitenden („multilayer“) virtuellen
     Switch, der für massenhafte Netzwerkautomatisierung durch
     programmatische Erweiterungen eingesetzt werden kann.

     ‘package’ (Vorgabe: OPENVSWITCH)
          Das Paketobjekt vom Open vSwitch.

 -- Scheme-Variable: pagekite-service-type
     Dies ist der Diensttyp für den PageKite-Dienst
     (https://memcached.org/), einem Angebot zur getunnelten
     Netzwerkumleitung, womit bloß auf localhost lauschende Server
     öffentlich erreichbar gemacht werden können. Mit PageKite werden
     die Server für andere erreichbar, selbst wenn Ihre Maschine nur
     über eine restriktive Firewall oder eine Netzwerkadressübersetzung
     („Network Address Translation“, NAT) ohne Portweiterleitung mit dem
     Internet verbunden ist. Der Wert dieses Dienstes ist ein
     ‘pagekite-configuration’-Verbundsobjekt.

     Hier ist ein Beispiel, wodurch die lokal laufenden HTTP- und
     SSH-Daemons zugänglich gemacht werden:

          (service pagekite-service-type
                   (pagekite-configuration
                     (kites '("http:@kitename:localhost:80:@kitesecret"
                              "raw/22:@kitename:localhost:22:@kitesecret"))
                     (extra-file "/etc/pagekite.rc")))

 -- Datentyp: pagekite-configuration
     Der Datentyp, der die Konfiguration von PageKite repräsentiert.

     ‘package’ (Vorgabe: PAGEKITE)
          Paketobjekt von PageKite.

     ‘kitename’ (Vorgabe: ‘#f’)
          PageKite-Name, um sich gegenüber dem Vordergrundserver zu
          authentisieren.

     ‘kitesecret’ (Vorgabe: ‘#f’)
          Das gemeinsame Geheimnis, das eine Authentisierung gegenüber
          dem Vordergrundserver ermöglicht. Wahrscheinlich sollten Sie
          es besser als Teil von ‘extra-file’ angeben.

     ‘frontend’ (Vorgabe: ‘#f’)
          Eine Verbindung zum angegebenen PageKite-Vordergrundserver
          herstellen statt zu dem Dienst von pagekite.net.

     ‘kites’ (Vorgabe: ‘'("http:@kitename:localhost:80:@kitesecret")’)
          Die Liste der zu benutzenden „Kites“ für Dienste. Nach Vorgabe
          wird der HTTP-Server auf Port 80 nach außen hin zugänglich
          gemacht. Dienste sind im Format
          ‘protokoll:kitename:rechnername:port:geheimnis’ anzugeben.

     ‘extra-file’ (Vorgabe: ‘#f’)
          Eine Konfigurationsdatei, die zusätzlich eingelesen werden
          soll. Es wird erwartet, dass Sie diese manuell erstellen.
          Benutzen Sie sie, wenn Sie zusätzliche Optionen angeben
          möchten und um gemeinsame Geheimnisse abseits von Guix’
          Zuständigkeitsbereich zu verwalten.

 -- Scheme-Variable: yggdrasil-service-type
     Der Diensttyp, um eine Verbindung mit dem Yggdrasil-Netzwerk
     (https://yggdrasil-network.github.io/) herzustellen, einer frühen
     Implementierungsstufe eines völlig Ende-zu-Ende-verschlüsselten
     IPv6-Netzwerks.

          Die Wegfindung im Yggdrasil-Netzwerk verläuft unabhängig vom
          Namen der Netzwerkknoten („Name-independent Routing“) und
          verwendet kryptografisch erzeugte Adressen. Durch die
          statische Adressierung können Sie dieselbe Adresse so lange
          weiterbenutzen, wie Sie möchten, selbst wenn Sie sich an einem
          anderen Ort befinden als vorher, und Sie können auch, wann
          immer Sie möchten, eine neue Adresse erzeugen (durch Erzeugung
          neuer Schlüssel). Siehe
          <https://yggdrasil-network.github.io/2018/07/28/addressing.html>

     Übergeben Sie einen Wert vom Typ ‘yggdrasil-configuration’, um ihn
     eine Verbindung zu öffentlichen und/oder lokalen
     Netzwerkteilnehmern („Peers“) herstellen zu lassen.

     Hier ist ein Beispiel für die Nutzung mit öffentlichen Peers und
     einer statischen Adresse. Die statischen Schlüssel zum Signieren
     und Verschlüsseln werden in ‘/etc/yggdrasil-private.conf’ definiert
     (dies ist die Vorgabe für ‘config-file’).

          ;; Teil des operating-system in der Betriebssystemdeklaration
          (service yggdrasil-service-type
                        (yggdrasil-configuration
                         (autoconf? #f) ;nur öffentliche Peers benutzen
                         (json-config
                         ;; nehmen Sie eine von
                         ;; https://github.com/yggdrasil-network/public-peers
                          '((peers . #("tcp://1.2.3.4:1337"))))
                         ;; /etc/yggdrasil-private.conf ist der Vorgabewert von config-file
                         ))
          # Beispielinhalt für /etc/yggdrasil-private.conf
          {
            # Ihr öffentlicher Schlüssel zur Kodierung. Ihre Peers können Sie um
            # den Schlüssel bitten, um ihn in deren Konfiguration der
            # AllowedEncryptionPublicKeys einzutragen.
            EncryptionPublicKey: 378dc5…

            # Ihr privater Kodierungsschlüssel. Geben Sie ihn NICHT weiter!
            EncryptionPrivateKey: 0777…

            # Ihr öffentlicher Signierschlüssel. Es gibt normalerweise keinen
            # Grund, ihn anderen Leuten mitzuteilen.
            SigningPublicKey: e1664…

            # Ihr privater Signierschlüssel. Geben Sie ihn NICHT weiter!
            SigningPrivateKey: 0589d…
          }

 -- Datentyp: yggdrasil-configuration
     Repräsentiert die Konfiguration von Yggdrasil.

     ‘package’ (Vorgabe: ‘yggdrasil’)
          Paketobjekt von Yggdrasil.

     ‘json-config’ (Vorgabe: ‘'()’)
          Der Inhalt von ‘/etc/yggdrasil.conf’. Er wird mit
          ‘/etc/yggdrasil-private.conf’ zusammengelegt. Beachten Sie,
          dass diese Einstellungen im Guix-Store gespeichert werden, auf
          den alle Nutzer Zugriff haben. *Speichern Sie dort nicht Ihre
          privaten Schlüssel*. Siehe die Ausgabe von ‘yggdrasil
          -genconf’ für eine kurze Übersicht über gültige Schlüssel und
          ihre Vorgabewerte.

     ‘autoconf?’ (Vorgabe: ‘#f’)
          Ob der automatische Modus benutzt werden soll. Ihn zu
          aktivieren, bedeutet, dass Yggdrasil eine dynamische
          IP-Adresse benutzt und sich mit IPv6-Nachbarn verbindet.

     ‘log-level’ (Vorgabe: ‘'info’)
          Wie detailliert die Protokolle sein sollen. Schreiben Sie
          ‘'debug’ für einen höheren Detailgrad.

     ‘log-to’ (Vorgabe: ‘'stdout’)
          Wohin Protokolle geschickt werden. Die Vorgabe ist, dass der
          Dienst ein Protokoll seiner Standardausgabe in
          ‘/var/log/yggdrasil.log’ schreibt. Die Alternative ist
          ‘'syslog’, wodurch die Ausgabe an den laufenden syslog-Dienst
          geschickt wird.

     ‘config-file’ (Vorgabe: ‘"/etc/yggdrasil-private.conf"’)
          Wo die HJSON-Datei liegt, aus der sensible Daten geladen
          werden. Hier sollten private Schlüssel gespeichert werden,
          wodurch nicht nach jedem Neustart eine zufällige Adresse
          benutzt wird. Verwenden Sie ‘#f’ zum Deaktivieren. In dieser
          Datei festgelegte Optionen haben Vorrang vor ‘json-config’.
          Tragen Sie anfangs die Ausgabe von ‘yggdrasil -genconf’ ein.
          Um eine statische Adresse zu benutzen, löschen Sie alles außer
          den folgenden Optionen:

             • ‘EncryptionPublicKey’
             • ‘EncryptionPrivateKey’
             • ‘SigningPublicKey’
             • ‘SigningPrivateKey’

 -- Scheme-Variable: ipfs-service-type
     Der Diensttyp, um sich mit dem IPFS-Netzwerk (https://ipfs.io) zu
     verbinden, einem weltweiten, versionierten, von einem
     Netzwerkteilnehmer zum anderen („peer-to-peer“) verteilten
     Dateisystem. Geben Sie ein ‘ipfs-configuration’-Verbundsobjekt an,
     um die für den Netzwerkzugang (Gateway) und die
     Anwendungsschnittstelle (API) verwendeten Ports zu ändern.

     Hier ist eine Beispielkonfiguration, um nicht standardmäßige Ports
     einzusetzen:

          (service ipfs-service-type
                   (ipfs-configuration
                    (gateway "/ip4/127.0.0.1/tcp/8880")
                    (api "/ip4/127.0.0.1/tcp/8881")))

 -- Datentyp: ipfs-configuration
     Repräsentiert die Konfiguration des IPFS.

     ‘package’ (Vorgabe: ‘go-ipfs’)
          Paketobjekt von IPFS.

     ‘gateway’ (Vorgabe: ‘"/ip4/127.0.0.1/tcp/8082"’)
          Die Adresse des Netzwerkzugangs im Format einer Multiadresse
          („multiaddress“).

     ‘api’ (Vorgabe: ‘"/ip4/127.0.0.1/tcp/5001"’)
          Die Adresse des API-Endpunkts im Format einer Multiadresse
          („multiaddress“).

 -- Scheme-Variable: keepalived-service-type
     Dies ist der Diensttyp für die Software Keepalived
     (https://www.keepalived.org/) für virtuelle Router, ‘keepalived’.
     Sein Wert muss ein ‘keepalived-configuration’-Verbundsobjekt sein,
     wie in diesem Beispiel für die Maschine erster Wahl (Master):

          (service keepalived-service-type
                   (keepalived-configuration
                     (config-file (local-file "keepalived-master.conf"))))

     Dabei enthält ‘keepalived-master.conf’:

          vrrp_instance meine-gruppe {
            state MASTER
            interface enp9s0
            virtual_router_id 100
            priority 100
            unicast_peer { 10.0.0.2 }
            virtual_ipaddress {
              10.0.0.4/24
            }
          }

     Für die Ersatzmaschine (Backup):

          (service keepalived-service-type
                   (keepalived-configuration
                    (config-file (local-file "keepalived-backup.conf"))))

     Dort enthält ‘keepalived-backup.conf’:

          vrrp_instance meine-gruppe {
            state BACKUP
            interface enp9s0
            virtual_router_id 100
            priority 99
            unicast_peer { 10.0.0.3 }
            virtual_ipaddress {
              10.0.0.4/24
            }
          }


File: guix.de.info,  Node: Unbeaufsichtigte Aktualisierungen,  Next: X Window,  Prev: Netzwerkdienste,  Up: Dienste

10.8.5 Unbeaufsichtigte Aktualisierungen
----------------------------------------

Guix stellt einen Dienst zum Durchführen _unbeaufsichtigter
Aktualisierungen_ zur Verfügung: Das System rekonfiguriert sich selbst
in regelmäßigen Abständen mit der neuesten Version von Guix. Guix System
verfügt über mehrere Eigenschaften, durch die unbeaufsichtigtes
Aktualisieren zu einer sicheren Angelegenheit wird:

   • Aktualisierungen sind transaktionell: Entweder ist die
     Aktualisierung erfolgreich oder sie schlägt fehl, aber Sie können
     sich nicht in einem Systemzustand „dazwischen“ wiederfinden.
   • Ein Protokoll über die Aktualisierungen liegt vor — Sie können es
     mit ‘guix system list-generations’ einsehen — und Rücksetzungen auf
     vorherige Generationen sind möglich, für den Fall, dass das System
     nach der Aktualisierung nicht mehr funktioniert oder sich nicht wie
     gewollt verhält.
   • Der Code für Kanäle wird authentifiziert, wodurch Sie sich sicher
     sein können, dass Sie nur unverfälschten Code ausführen (siehe
     *note Kanäle::).
   • ‘guix system reconfigure’ verweigert ein Herabstufen auf alte
     Versionen; das macht “Herabstufungsangriffe” („Downgrade Attacks“)
     unmöglich.

   Um unbeaufsichtigte Aktualisierungen einzurichten, fügen Sie eine
Instanz des Diensttyps ‘unattended-upgrade-service-type’ wie im
folgenden Beispiel zur Liste Ihrer Betriebssystemdienste hinzu:

     (service unattended-upgrade-service-type)

   Durch die Vorgabeeinstellungen hat dies wöchentliche Aktualisierungen
zur Folge, jeden Sonntag um Mitternacht. Sie müssen keine
Betriebssystemkonfigurationsdatei angeben:
‘/run/current-system/configuration.scm’ wird benutzt, wodurch immer Ihre
letzte Konfiguration weiter verwendet wird — siehe den *note
provenance-service-type:: für mehr Informationen über diese Datei.

   Mehrere Dinge können konfiguriert werden, insbesondere die
Zeitabstände zwischen Aktualisierungen und die Dienste (also die
Daemons), die nach Abschluss neu gestartet werden sollen. Wenn die
Aktualisierung erfolgreich ist, dann stellt das System sicher, dass
Systemgenerationen mit einem Alter größer als ein festgelegter
Schwellwert gelöscht werden, wie bei ‘guix system delete-generations’.
Siehe die folgende Referenz der Konfigurationsmöglichkeiten für Näheres.

   Um sicherzugehen, dass unbeaufsichtigte Aktualisierungen auch
tatsächlich durchgeführt werden, können Sie ‘guix system describe’
ausführen. Um Fehlschläge zu untersuchen, schauen Sie in die
Protokolldatei für unbeaufsichtigte Aktualisierungen (siehe unten).

 -- Scheme-Variable: unattended-upgrade-service-type
     Dies ist der Diensttyp für unbeaufsichtigte Aktualisierungen. Damit
     wird ein mcron-Auftrag eingerichtet (siehe *note Geplante
     Auftragsausführung::), der ‘guix system reconfigure’ mit der
     neuesten Version der angegebenen Kanäle ausführt.

     Sein Wert muss ein
     ‘unattended-upgrade-configuration’-Verbundsobjekt sein (siehe
     unten).

 -- Datentyp: unattended-upgrade-configuration
     Dieser Datentyp repräsentiert die Konfiguration des Dienstes für
     unbeaufsichtigte Aktualisierungen. Folgende Felder stehen zur
     Verfügung:

     ‘schedule’ (Vorgabe: ‘"30 01 * * 0"’)
          Dies ist der Aktualisierungsplan, ausgedrückt als ein
          G-Ausdruck mit einem mcron-Auftragsplan (siehe *note
          mcron-Auftragsspezifikationen: (mcron)Guile Syntax.).

     ‘channels’ (Vorgabe: ‘#~%default-channels’)
          Dieser G-Ausdruck gibt an, welche Kanäle für die
          Aktualisierung benutzt werden sollen (siehe *note Kanäle::).
          Nach Vorgabe wird die Spitze des offiziellen ‘guix’-Kanals
          benutzt.

     ‘operating-system-file’ (Vorgabe: ‘"/run/current-system/configuration.scm"’)
          Dieses Feld gibt an, welche Betriebssystemkonfigurationsdatei
          verwendet werden soll. Nach Vorgabe wird die
          Konfigurationsdatei der aktuellen Konfiguration
          wiederverwendet.

          Es gibt jedoch Fälle, wo es nicht ausreicht, auf
          ‘/run/current-system/configuration.scm’ zu verweisen, zum
          Beispiel weil sich diese mit ‘local-file’ oder Ähnlichem auf
          weitere Dateien wie öffentliche SSH-Schlüssel, andere
          Konfigurationsdateien usw. bezieht. Dann empfehlen wir, etwas
          wie hier zu schreiben:

               (unattended-upgrade-configuration
                 (operating-system-file
                   (file-append (local-file "." "config-dir" #:recursive? #t)
                                "/config.scm")))

          Das bewirkt, dass das ganze aktuelle Verzeichnis in den Store
          importiert wird und Bezug auf die ‘config.scm’ darin genommen
          wird. So funktioniert die Nutzung von ‘local-file’ in
          ‘config.scm’ wie erwartet. Siehe *note G-Ausdrücke:: für
          Informationen zu ‘local-file’ und ‘file-append’.

     ‘services-to-restart’ (Vorgabe: ‘'(mcron)’)
          Dieses Feld gibt die Shepherd-Dienste an, die nach Abschluss
          der Aktualisierung neu gestartet werden sollen.

          Die Dienste werden direkt nach Abschluss neu gestartet, so wie
          es ‘herd restart’ tun würde. Dadurch wird sichergestellt, dass
          die neueste Version läuft — bedenken Sie, dass ‘guix system
          reconfigure’ nach Vorgabe nur diejenigen Dienste neu startet,
          die zurzeit nicht laufen, was einem konservativen Verhalten
          entspricht: Störungen werden minimiert, aber veraltete Dienste
          laufen weiter.

          Führen Sie ‘herd status’ aus, um herauszufinden, welche
          Dienste Sie neu starten lassen können. Siehe *note Dienste::
          für allgemeine Informationen über Dienste. Oft würde man
          Dienste wie unter anderem ‘ntpd’ und ‘ssh-daemon’ neu starten
          lassen.

          Nach Vorgabe wird nur der ‘mcron’-Dienst neu gestartet.
          Dadurch wird beim nächsten Mal sicherlich die neueste Version
          des Auftrags für unbeaufsichtigte Aktualisierungen benutzt.

     ‘system-expiration’ (Vorgabe: ‘(* 3 30 24 3600)’)
          Nach wie vielen Sekunden Systemgenerationen auslaufen.
          Systemgenerationen, die dieses Alter überschritten haben,
          werden über ‘guix system delete-generations’ gelöscht, nachdem
          eine Aktualisierung abgeschlossen wurde.

               Anmerkung: Der Dienst für unbeaufsichtigte
               Aktualisierungen lässt jedoch den Müllsammler nicht
               laufen. Sie möchten wahrscheinlich Ihren eigenen
               mcron-Auftrag einrichten, der regelmäßig ‘guix gc’
               ausführt.

     ‘maximum-duration’ (Vorgabe: ‘3600’)
          Wie viele Sekunden eine Aktualisierung höchstens dauern darf.
          Nach dieser Zeit wird die Aktualisierung abgebrochen.

          Diese Begrenzung dient vor allem dazu, zu verhindern, dass
          „die ganze Welt“ neu erstellt oder neu heruntergeladen wird.

     ‘log-file’ (Vorgabe: ‘"/var/log/unattended-upgrade.log"’)
          Die Datei, in die über unbeaufsichtigte Aktualisierungen
          Protokoll geführt wird.


File: guix.de.info,  Node: X Window,  Next: Druckdienste,  Prev: Unbeaufsichtigte Aktualisierungen,  Up: Dienste

10.8.6 X Window
---------------

Unterstützung für das grafische Anzeigesystem X Window — insbesondere
Xorg — wird vom Modul ‘(gnu services xorg)’ zur Verfügung gestellt.
Beachten Sie, dass es _keine_ ‘xorg-service’-Prozedur gibt, sondern der
X-Server durch eine Software zur “Anmeldeverwaltung” gestartet wird (ein
„Login Manager“). Vorgegeben ist, dass zur Anzeigenverwaltung der GNOME
Display Manager (GDM) benutzt wird.

   GDM ermöglicht es seinen Nutzern natürlich auch, sich bei anderen
Fensterverwaltungssystemen und Arbeitsumgebungen als GNOME anzumelden.
Wer GNOME benutzt, kann Funktionalitäten wie eine automatische
Bildschirmsperre nur verwenden, wenn die Anmeldung über GDM läuft.

   Um X11 zu benutzen, müssen Sie ein Programme zur “Fensterverwaltung”
(„Window-Manager“) oder mehrere davon installieren — zum Beispiel die
Pakete ‘windowmaker’ oder ‘openbox’ —, vorzugsweise indem Sie sie in das
‘packages’-Feld Ihrer Betriebssystemdefinition eintragen (siehe *note
global sichtbare Pakete: „operating-system“-Referenz.).

 -- Scheme-Variable: gdm-service-type
     Dies ist der Diensttyp für den GNOME Desktop Manager
     (https://wiki.gnome.org/Projects/GDM/), GDM, ein Programm zur
     Verwaltung grafischer Anzeigeserver, das grafische
     Benutzeranmeldungen durchführt. Sein Wert muss eine
     ‘gdm-configuration’ sein (siehe unten).

     GDM liest die in den ‘.desktop’-Dateien in
     ‘/run/current-system/profile/share/xsessions’ befindlichen
     “Sitzungstypen” ein und stellt diese seinen Nutzern zur Auswahl auf
     dem Anmeldebildschirm. Pakete wie ‘gnome’, ‘xfce’ und ‘i3’ stellen
     ‘.desktop’-Dateien bereit; wenn diese Pakete zu den systemweit
     verfügbaren Paketen hinzugefügt werden, werden diese automatisch
     auf dem Anmeldebildschirm angezeigt.

     Des Weiteren werden ‘~/.xsession’-Dateien berücksichtigt. Wenn es
     vorhanden ist, muss ‘~/.xsession’ eine ausführbare Datei sein, die
     ein Programm zur Fensterverwaltung und/oder andere X-Clients
     startet.

 -- Datentyp: gdm-configuration
     ‘auto-login?’ (Vorgabe: ‘#f’)
     ‘default-user’ (Vorgabe: ‘#f’)
          Wenn ‘auto-login?’ falsch ist, zeigt GDM einen
          Anmeldebildschirm an.

          Wenn ‘auto-login?’ wahr ist, meldet GDM automatisch den in
          ‘default-user’ angegebenen voreingestellten Benutzer an.

     ‘debug?’ (Vorgabe: ‘#f’)
          Wenn es wahr ist, schreibt GDM Informationen zur Fehlersuche
          in sein Protokoll.

     ‘gnome-shell-assets’ (Vorgabe: …)
          Liste der GNOME-Shell-„Assets“, die GDM benötigt, d.h.
          Symbolthema, Schriftarten etc.

     ‘xorg-configuration’ (Vorgabe: ‘(xorg-configuration)’)
          Xorg-Server für grafische Oberflächen konfigurieren.

     ‘xsession’ (Vorgabe: ‘(xinitrc)’)
          Das Skript, das vor dem Starten einer X-Sitzung ausgeführt
          werden soll.

     ‘dbus-daemon’ (Vorgabe: ‘dbus-daemon-wrapper’)
          Der Dateiname der ausführbaren Datei des
          ‘dbus-daemon’-Programms.

     ‘gdm’ (Vorgabe: ‘gdm’)
          Das GDM-Paket, was benutzt werden soll.

 -- Scheme-Variable: slim-service-type
     Dies ist der Diensttyp für die schlanke grafische
     Anmeldungsverwaltung SLiM für X11.

     Wie GDM liest SLiM die in ‘.desktop’-Dateien beschriebenen
     Sitzungstypen aus und ermöglicht es Nutzern, eine Sitzung darunter
     im Anmeldebildschirm durch Drücken von ‘F1’ auszuwählen. Auch
     ‘~/.xsession’-Dateien können benutzt werden.

     Anders als GDM wird durch SLiM die Benutzersitzung nicht auf einem
     anderen virtuellen Terminal gestartet, nachdem man sich anmeldet.
     Die Folge davon ist, dass man nur eine einzige grafische Sitzung
     starten kann. Wenn Sie mehrere, gleichzeitig laufende grafische
     Sitzungen starten können möchten, müssen Sie mehrere SLiM-Dienste
     zu ihren Systemdiensten hinzufügen. Das folgende Beispiel zeigt,
     wie Sie den vorgegebenen GDM-Dienst durch zwei SLiM-Dienste auf
     tty7 und tty8 ersetzen.

          (use-modules (gnu services)
                       (gnu services desktop)
                       (gnu services xorg)
                       (srfi srfi-1))  ;für 'remove'

          (operating-system
            ;; …
            (services (cons* (service slim-service-type (slim-configuration
                                                         (display ":0")
                                                         (vt "vt7")))
                             (service slim-service-type (slim-configuration
                                                         (display ":1")
                                                         (vt "vt8")))
                             (modify-services %desktop-services
                               (delete gdm-service-type)))))

 -- Datentyp: slim-configuration
     Datentyp, der die Konfiguration des ‘slim-service-type’
     repräsentiert.

     ‘allow-empty-passwords?’ (Vorgabe: ‘#t’)
          Ob Anmeldungen mit leeren Passwörtern möglich sein sollen.

     ‘auto-login?’ (Vorgabe: ‘#f’)
     ‘default-user’ (Vorgabe: ‘""’)
          Wenn ‘auto-login?’ falsch ist, zeigt SLiM einen
          Anmeldebildschirm an.

          Wenn ‘auto-login?’ wahr ist, meldet SLiM automatisch den in
          ‘default-user’ angegebenen voreingestellten Benutzer an.

     ‘theme’ (Vorgabe: ‘%default-slim-theme’)
     ‘theme-name’ (Vorgabe: ‘%default-slim-theme-name’)
          Das grafische Thema, was benutzt werden soll, mit seinem
          Namen.

     ‘auto-login-session’ (Vorgabe: ‘#f’)
          Wenn es wahr ist, muss es den Namen der ausführbaren Datei
          angeben, die als voreingestellte Sitzung gestartet werden soll
          — z.B. ‘(file-append windowmaker "/bin/windowmaker")’.

          Wenn es falsch ist, wird eine von einer der ‘.desktop’-Dateien
          in ‘/run/current-system/profile’ und ‘~/.guix-profile’
          beschriebenen Sitzungen benutzt.

               Anmerkung: Sie müssen mindestens ein
               Fensterverwaltungsprogramm in das Systemprofil oder Ihr
               Benutzerprofil installieren, ansonsten können Sie sich,
               sofern ‘auto-login-session’ falsch ist, nicht anmelden.

     ‘xorg-configuration’ (Vorgabe: ‘(xorg-configuration)’)
          Xorg-Server für grafische Oberflächen konfigurieren.

     ‘display’ (Vorgabe: ‘":0"’)
          Die Anzeige, auf welcher der Xorg-Server für grafische
          Oberflächen gestartet werden soll.

     ‘vt’ (Vorgabe: ‘"vt7"’)
          Das virtuelle Terminal, auf dem der Xorg-Server für grafische
          Oberflächen gestartet werden soll.

     ‘xauth’ (Vorgabe: ‘xauth’)
          Das XAuth-Paket, das benutzt werden soll.

     ‘shepherd’ (Vorgabe: ‘shepherd’)
          Das Shepherd-Paket, das benutzt wird, wenn ‘halt’ und ‘reboot’
          aufgerufen werden.

     ‘sessreg’ (Vorgabe: ‘sessreg’)
          Das sessreg-Paket, das zum Registrieren der Sitzung benutzt
          werden soll.

     ‘slim’ (Vorgabe: ‘slim’)
          Das zu benutzende SLiM-Paket.

 -- Scheme-Variable: %default-theme
 -- Scheme-Variable: %default-theme-name
     Das vorgegebene Thema für das Aussehen von SLiM mit seinem Namen.

 -- Datentyp: sddm-configuration
     Dieser Datentyp repräsentiert die Konfiguration des SDDM-Dienstes.

     ‘display-server’ (Vorgabe: "x11")
          Einen Anzeigeserver auswählen, der für den Anmeldebildschirm
          verwendet werden soll. Zulässige Werte sind ‘"x11"’ oder
          ‘"wayland"’.

     ‘numlock’ (Vorgabe: "on")
          Gültige Werte sind ‘"on"’, ‘"off"’ oder ‘"none"’.

     ‘halt-command’ (Vorgabe: ‘#~(string-apppend #$shepherd "/sbin/halt")’)
          Der Befehl, der zum Anhalten des Systems ausgeführt wird.

     ‘reboot-command’ (Vorgabe: ‘#~(string-append #$shepherd "/sbin/reboot")’)
          Der Befehl, der zum Neustarten des Systems ausgeführt wird.

     ‘theme’ (Vorgabe: "maldives")
          Welches Thema für das Aussehen benutzt werden soll. Mit SDDM
          mitgelieferte Themen sind ‘"elarun"’, ‘"maldives"’ und
          ‘"maya"’.

     ‘themes-directory’ (Vorgabe: "/run/current-system/profile/share/sddm/themes")
          Verzeichnis, wo Themen gefunden werden können.

     ‘faces-directory’ (Vorgabe: "/run/current-system/profile/share/sddm/faces")
          Verzeichnis, wo Avatarbilder gefunden werden können.<

     ‘default-path’ (Vorgabe: "/run/current-system/profile/bin")
          Welcher PATH voreingestellt sein soll.

     ‘minimum-uid’ (Vorgabe: 1000)
          Der kleinste Benutzeridentifikator (UID), mit dem Benutzer in
          SDDM angezeigt werden und sich anmelden können.

     ‘maximum-uid’ (Vorgabe: 2000)
          Der größte Benutzeridentifikator (UID), mit dem Benutzer in
          SDDM angezeigt werden.<

     ‘remember-last-user?’ (Vorgabe: #t)
          Den zuletzt ausgewählten Benutzer voreinstellen.

     ‘remember-last-session?’ (Vorgabe: #t)
          Die zuletzt ausgewählte Sitzung voreinstellen.

     ‘hide-users’ (Vorgabe: "")
          Benutzernamen, die in SDDM _nicht_ sichtbar sein sollen.

     ‘hide-shells’ (Vorgabe: ‘#~(string-append #$shadow "/sbin/nologin")’)
          Benutzerkonten, für die als Shell eine davon eingestellt ist,
          wird SDDM _nicht_ anzeigen.

     ‘session-command’ (Vorgabe: ‘#~(string-append #$sddm "/share/sddm/scripts/wayland-session")’)
          Das Skript, das vor dem Starten einer Wayland-Sitzung
          ausgeführt werden soll.

     ‘sessions-directory’ (Vorgabe: "/run/current-system/profile/share/wayland-sessions")
          Verzeichnis, das nach .desktop-Dateien zum Starten von
          Wayland-Sitzungen durchsucht wird.

     ‘xorg-configuration’ (Vorgabe: ‘(xorg-configuration)’)
          Xorg-Server für grafische Oberflächen konfigurieren.

     ‘xauth-path’ (Vorgabe: ‘#~(string-append #$xauth "/bin/xauth")’)
          Pfad von xauth.

     ‘xephyr-path’ (Vorgabe: ‘#~(string-append #$xorg-server "/bin/Xephyr")’)
          Pfad von Xephyr.

     ‘xdisplay-start’ (Vorgabe: ‘#~(string-append #$sddm "/share/sddm/scripts/Xsetup")’)
          Skript, das nach dem Starten vom Xorg-Server ausgeführt wird.

     ‘xdisplay-stop’ (Vorgabe: ‘#~(string-append #$sddm "/share/sddm/scripts/Xstop")’)
          Skript, das vor dem Stoppen vom Xorg-Server ausgeführt wird.

     ‘xsession-command’ (Vorgabe: ‘xinitrc’)
          Das Skript, das vor dem Starten einer X-Sitzung ausgeführt
          werden soll.

     ‘xsessions-directory’ (Vorgabe: "/run/current-system/profile/share/xsessions")
          Verzeichnis, das nach .desktop-Dateien zum Starten von
          X-Sitzungen durchsucht wird.<

     ‘minimum-vt’ (Vorgabe: 7)
          Das kleinste virtuelle Terminal, das benutzt werden darf.

     ‘auto-login-user’ (Vorgabe: "")
          Benutzer, der bei automatischer Anmeldung angemeldet wird.

     ‘auto-login-session’ (Vorgabe: "")
          Desktop-Datei für die automatische Anmeldung.

     ‘relogin?’ (Vorgabe: #f)
          Ob nach dem Abmelden neu angemeldet werden soll.

 -- Scheme-Variable: sddm-service-type
     Dies ist der Typ des Dienstes, mit dem der SDDM-Anzeigeserver
     (https://github.com/sddm/sddm) gestartet wird. Sein Wert muss ein
     ‘sddm-configuration’-Verbundsobjekt sein (siehe unten).

     Hier ist ein Beispiel für seine Verwendung:

          (service sddm-service-type
                   (sddm-configuration
                     (auto-login-user "alice")
                     (auto-login-session "xfce.desktop")))

 -- Datentyp: sddm-configuration
     Dieser Datentyp repräsentiert die Konfiguration der
     SDDM-Anmeldeverwaltung. Die verfügbaren Felder sind:

     ‘sddm’ (Vorgabe: ‘sddm’)
          Das SDDM-Paket, was benutzt werden soll.

     ‘display-server’ (Vorgabe: ‘"x11"’)
          Hier muss entweder ‘"x11"’ oder ‘"wayland"’ angegeben werden.

     ‘auto-login-user’ (Vorgabe: ‘""’)
          Wenn es nicht leer ist, enthält dieses Feld das Benutzerkonto,
          mit dem man automatisch angemeldet wird.

     ‘auto-login-session’ (Vorgabe: ‘""’)
          Wenn es nicht leer ist, gibt dieses Feld den Namen der
          ‘.desktop’-Datei an, die bei automatischer Anmeldung für die
          Sitzung verwendet wird.

 -- Datentyp: xorg-configuration
     Dieser Datentyp repräsentiert die Konfiguration des grafischen
     Anzeigeservers Xorg. Beachten Sie, dass es keinen Xorg-Dienst gibt,
     sondern der X-Server von einer „Anzeigenverwaltung“ wie GDM, SDDM
     oder SLiM gestartet wird. Deswegen wird aus der Konfiguration
     dieser Anzeigenverwaltungen ein ‘xorg-configuration’-Verbundsobjekt
     konstruiert.

     ‘modules’ (Vorgabe: ‘%default-xorg-modules’)
          Dies ist eine Liste von “Modulpaketen”, die vom Xorg-Server
          geladen werden — z.B. ‘xf86-video-vesa’, ‘xf86-input-keyboard’
          und so weiter.

     ‘fonts’ (Vorgabe: ‘%default-xorg-fonts’)
          Dies ist eine Liste von Verzeichnissen mit Schriftarten, die
          zum Schriftartensuchpfad („Font Path“) des Servers hinzugefügt
          werden.

     ‘drivers’ (Vorgabe: ‘'()’)
          Dies muss entweder die leere Liste sein — in diesem Fall wird
          durch Xorg automatisch ein Grafiktreiber ausgewählt — oder
          eine Liste von Treibernamen, die in dieser Reihenfolge
          durchprobiert werden — z.B. ‘("modesetting" "vesa")’.

     ‘resolutions’ (Vorgabe: ‘'()’)
          Wenn ‘resolutions’ die leere Liste ist, wird automatisch durch
          Xorg eine passende Bildschirmauflösung gewählt. Andernfalls
          muss hier eine Liste von Bildschirmauflösungen angegeben
          werden — z.B. ‘((1024 768) (640 480))’.

     ‘keyboard-layout’ (Vorgabe: ‘#f’)
          Wenn es auf ‘#f’ gesetzt ist, benutzt Xorg die voreingestellte
          Tastaturbelegung, also normalerweise US English („QWERTY“) für
          eine PC-Tastatur mit 105 Tasten.

          Andernfalls muss hier ein ‘keyboard-layout’-Objekt stehen, das
          angibt, welche Tastaturbelegung aktiv sein soll, während Xorg
          läuft. Siehe *note Tastaturbelegung:: für mehr Informationen,
          wie die Tastaturbelegung angegeben werden kann.

     ‘extra-config’ (Vorgabe: ‘'()’)
          Dies ist eine Liste von Zeichenketten oder Objekten, die an
          die Konfigurationsdatei angehängt werden. Mit ihnen wird
          zusätzlicher Text wortwörtlich zur Konfigurationsdatei
          hinzugefügt.

     ‘server’ (Vorgabe: ‘xorg-server’)
          Dieses Paket stellt den Xorg-Server zur Verfügung.

     ‘server-arguments’ (Vorgabe: ‘%default-xorg-server-arguments’)
          Dies ist die Liste der Befehlszeilenargumente, die an den
          X-Server übergeben werden. Die Vorgabe ist ‘-nolisten tcp’.

 -- Scheme-Prozedur: set-xorg-configuration KONFIGURATION
          [LOGIN-MANAGER-SERVICE-TYPE] Benennt, welche KONFIGURATION die
     Anmeldeverwaltung (vom Typ LOGIN-MANAGER-SERVICE-TYPE) benutzen
     soll, als ein ‘<xorg-configuration>’-Verbundsobjekt.

     Da die Xorg-Konfiguration in die Konfiguration der
     Anmeldeverwaltung eingebettet ist — z.B. in einer
     ‘gdm-configuration’ —, bietet diese Prozedur eine Kurzschreibweise
     zum Ändern der Xorg-Konfiguration.

 -- Scheme-Prozedur: xorg-start-command [KONFIGURATION]
     Hier wird ein ‘startx’-Skript geliefert, in welchem die Module,
     Schriftarten usw. verfügbar sind, die in der KONFIGURATION
     angegeben wurden. Das Ergebnis soll anstelle von ‘startx’ benutzt
     werden.

     Normalerweise wird der X-Server von der Anmeldeverwaltung
     gestartet.

 -- Scheme-Prozedur: screen-locker-service PAKET [PROGRAMM]
     Das PAKET zur Menge der setuid-Programme hinzufügen, worin sich ein
     Programm zum Sperren des Bildschirms oder ein Bildschirmschoner
     befinden muss, der mit dem Befehl PROGRAMM gestartet wird, und
     einen PAM-Eintrag dafür hinzufügen. Zum Beispiel macht

          (screen-locker-service xlockmore "xlock")

     das gute alte XlockMore benutzbar.


File: guix.de.info,  Node: Druckdienste,  Next: Desktop-Dienste,  Prev: X Window,  Up: Dienste

10.8.7 Druckdienste
-------------------

Das Modul ‘(gnu services cups)’ stellt eine Guix-Dienstdefinition für
den CUPS-Druckdienst zur Verfügung. Wenn Sie Druckerunterstützung zu
einem Guix-System hinzufügen möchten, dann fügen Sie einen
‘cups-service’-Dienst in die Betriebssystemdefinition ein.

 -- Scheme-Variable: cups-service-type
     Der Diensttyp für den CUPS-Druckserver. Als Wert muss eine gültige
     CUPS-Konfiguration angegeben werden (siehe unten). Um die
     Voreinstellungen zu verwenden, schreiben Sie einfach nur:
          (service cups-service-type)

   Mit der CUPS-Konfiguration stellen Sie die grundlegenden Merkmale
Ihrer CUPS-Installation ein: Auf welcher Schnittstelle sie lauscht, wie
mit einem fehlgeschlagenen Druckauftrag umzugehen ist, wie viel in
Protokolle geschrieben werden soll und so weiter. Um einen Drucker
hinzuzufügen, müssen Sie jedoch die URL <http://localhost:631> besuchen
oder ein Werkzeug wie die Druckereinstellungsdienste von GNOME benutzen.
Die Vorgabe ist, dass beim Konfigurieren eines CUPS-Dienstes ein
selbstsigniertes Zertifikat erzeugt wird, um sichere Verbindungen mit
dem Druckserver zu ermöglichen.

   Nehmen wir an, Sie wollen die Weboberfläche von CUPS aktivieren und
Unterstützung für Epson-Drucker über das
‘epson-inkjet-printer-escpr’-Paket und für HP-Drucker über das
‘hplip-minimal’-Paket aktivieren. Sie können das auf diese Weise gleich
machen (dazu müssen Sie vorher angeben, dass das Modul ‘(gnu packages
cups)’ benutzt werden soll):

     (service cups-service-type
              (cups-configuration
                (web-interface? #t)
                (extensions
                  (list cups-filters epson-inkjet-printer-escpr hplip-minimal))))

   Anmerkung: Wenn Sie die Qt5-basierte grafische Benutzeroberfläche
benutzen möchten, die dem hplip-Paket beiliegt, sollten Sie das
‘hplip’-Paket installieren, entweder in die Konfigurationsdatei Ihres
Betriebssystems oder für Ihr Benutzerkonto.

   Im Folgenden sehen Sie die verfügbaren Konfigurationsparameter. Vor
jeder Parameterdefinition wird ihr Typ angegeben, zum Beispiel steht
‘Zeichenketten-Liste foo’ für einen Parameter ‘foo’, der als Liste von
Zeichenketten angegeben werden muss. Sie können die Konfiguration aber
auch in einer einzigen Zeichenkette angeben, wenn Sie eine alte
‘cupsd.conf’-Datei von einem anderen System weiterbenutzen möchten;
siehe das Abschnittsende für mehr Details.

   Die verfügbaren ‘cups-configuration’-Felder sind:

 -- ‘cups-configuration’-Parameter: „package“ cups
     Das CUPS-Paket.

 -- ‘cups-configuration’-Parameter: „package“-Liste extensions (Vorgabe:
          ‘(list brlaser cups-filters epson-inkjet-printer-escpr
          foomatic-filters hplip-minimal splix)’)
     Treiber und andere Erweiterungen für das CUPS-Paket.

 -- ‘cups-configuration’-Parameter: „files-configuration“
          files-configuration
     Konfiguration, wo Protokolle abgelegt werden sollen, welche
     Verzeichnisse für Druckspoolerwarteschlangen benutzt werden sollen
     und ähnliche Berechtigungen erfordernde Konfigurationsparameter.

     Verfügbare Felder einer ‘files-configuration’ sind:

      -- ‘files-configuration’-Parameter: Protokollpfad access-log
          Hiermit wird der Dateiname des Zugriffsprotokolls („Access
          Log“) festgelegt. Wenn ein leerer Name angegeben wird, wird
          kein Protokoll erzeugt. Der Wert ‘stderr’ lässt
          Protokolleinträge in die Standardfehlerdatei schreiben, wenn
          das Druckplanungsprogramm im Vordergrund läuft, oder an den
          Systemprotokolldaemon (also Syslog), wenn es im Hintergrund
          läuft. Der Wert ‘syslog’ bewirkt, dass Protokolleinträge an
          den Systemprotokolldaemon geschickt werden. Der Servername
          darf in Dateinamen als die Zeichenkette ‘%s’ angegeben werden,
          so kann etwa ‘/var/log/cups/%s-access_log’ angegeben werden.

          Die Vorgabe ist ‘"/var/log/cups/access_log"’.

      -- ‘files-configuration’-Parameter: Dateiname cache-dir
          Wo CUPS zwischengespeicherte Daten ablegen soll.

          Die Vorgabe ist ‘"/var/cache/cups"’.

      -- ‘files-configuration’-Parameter: Zeichenkette config-file-perm
          Gibt die Berechtigungen für alle Konfigurationsdateien an, die
          das Planungsprogramm schreibt.

          Beachten Sie, dass auf die Berechtigungen der Datei
          printers.conf eine Maske gelegt wird, wodurch Zugriffe nur
          durch das planende Benutzerkonto erlaubt werden (in der Regel
          der Administratornutzer „root“). Der Grund dafür ist, dass
          Druckergeräte-URIs manchmal sensible Authentisierungsdaten
          enthalten, die nicht allgemein auf dem System bekannt sein
          sollten. Es gibt keine Möglichkeit, diese Sicherheitsmaßnahme
          abzuschalten.

          Die Vorgabe ist ‘"0640"’.

      -- ‘files-configuration’-Parameter: Protokollpfad error-log
          Hiermit wird der Dateiname des Fehlerprotokolls („Error Log“)
          festgelegt. Wenn ein leerer Name angegeben wird, wird kein
          Fehlerprotokoll erzeugt. Der Wert ‘stderr’ lässt
          Protokolleinträge in die Standardfehlerdatei schreiben, wenn
          das Planungsprogramm im Vordergrund läuft, oder an den
          Systemprotokolldaemon (also Syslog), wenn es im Hintergrund
          läuft. Der Wert ‘syslog’ bewirkt, dass Protokolleinträge an
          den Systemprotokolldaemon geschickt werden. Der Servername
          darf in Dateinamen als die Zeichenkette ‘%s’ angegeben werden,
          so kann etwa ‘/var/log/cups/%s-error_log’ angegeben werden.

          Die Vorgabe ist ‘"/var/log/cups/error_log"’.

      -- ‘files-configuration’-Parameter: Zeichenkette fatal-errors
          Gibt an, bei welchen Fehlern das Druckplanungsprogramm
          terminieren soll. Die Zeichenketten für die Arten sind:

          ‘none’
               Keine Fehler führen zur Beendigung.

          ‘all’
               Jeder der im Folgenden aufgeführten Fehler terminiert den
               Druckplaner.

          ‘browse’
               Fehler bei der Suche während der Initialisierung
               terminieren den Druckplaner, zum Beispiel wenn keine
               Verbindung zum DNS-SD-Daemon aufgebaut werden kann.

          ‘config’
               Syntaxfehler in der Konfigurationsdatei terminieren den
               Druckplaner.

          ‘listen’
               Fehler beim Lauschen oder Portfehler (entsprechend der
               Direktiven „Listen“ oder „Port“) terminieren den
               Druckplaner; ausgenommen sind Fehler bei IPv6 auf
               Loopback- oder ‘any’-Adressen.

          ‘log’
               Fehler beim Erzeugen von Protokolldateien terminieren den
               Druckplaner.

          ‘permissions’
               Falsche Zugriffsberechtigungen auf zum Starten benötigten
               Dateien terminieren den Druckplaner, zum Beispiel wenn
               auf gemeinsame TLS-Zertifikats- und Schlüsseldateien von
               allen lesend zugegriffen werden kann.

          Die Vorgabe ist ‘"all -browse"’.

      -- ‘files-configuration’-Parameter: Boolescher-Ausdruck
               file-device?
          Gibt an, welches Pseudogerät für neue Druckerwarteschlangen
          benutzt werden kann. Die URI <file:///dev/null> wird immer
          zugelassen.

          Vorgegeben ist ‘#f’.

      -- ‘files-configuration’-Parameter: Zeichenkette group
          Gibt Namen oder Identifikator der Benutzergruppe an, die zum
          Ausführen von externen Programmen verwendet wird.

          Die Vorgabe ist ‘"lp"’.

      -- ‘files-configuration’-Parameter: Zeichenkette log-file-perm
          Gibt die Berechtigungen für alle Protokolldateien an, die das
          Planungsprogramm schreibt.

          Die Vorgabe ist ‘"0644"’.

      -- ‘files-configuration’-Parameter: log-location page-log
          Hiermit wird der Dateiname des Seitenprotokolls („Page Log“)
          festgelegt. Wenn ein leerer Name angegeben wird, wird kein
          Seitenprotokoll erzeugt. Der Wert ‘stderr’ lässt
          Protokolleinträge in die Standardfehlerdatei schreiben, wenn
          das Planungsprogramm im Vordergrund läuft, oder an den
          Systemprotokolldaemon (also Syslog), wenn es im Hintergrund
          läuft. Der Wert ‘syslog’ bewirkt, dass Protokolleinträge an
          den Systemprotokolldaemon geschickt werden. Der Servername
          darf in Dateinamen als die Zeichenkette ‘%s’ angegeben werden,
          so kann etwa ‘/var/log/cups/%s-page_log’ angegeben werden.

          Die Vorgabe ist ‘"/var/log/cups/page_log"’.

      -- ‘files-configuration’-Parameter: Zeichenkette remote-root
          Gibt den Benutzernamen an, der für unauthentifizierte Zugriffe
          durch Clients verwendet wird, die sich als der
          Administratornutzer „root“ anmelden. Vorgegeben ist ‘remroot’.

          Die Vorgabe ist ‘"remroot"’.

      -- ‘files-configuration’-Parameter: Dateiname request-root
          Gibt das Verzeichnis an, in dem Druckaufträge und andere Daten
          zu HTTP-Anfragen abgelegt werden.

          Die Vorgabe ist ‘"/var/spool/cups"’.

      -- ‘files-configuration’-Parameter: Isolierung sandboxing
          Gibt die Stufe der Sicherheitsisolierung („Sandboxing“) an,
          die auf Druckfilter, Hintergrundsysteme (Backends) und andere
          Kindprozesse des Planungsprogramms angewandt wird; entweder
          ‘relaxed’ („locker“) oder ‘strict’ („strikt“). Diese Direktive
          wird zurzeit nur auf macOS benutzt/unterstützt.

          Die Vorgabe ist ‘strict’.

      -- ‘files-configuration’-Parameter: Dateiname server-keychain
          Gibt an, wo TLS-Zertifikate und private Schlüssel gespeichert
          sind. CUPS wird in diesem Verzeichnis öffentliche und private
          Schlüssel suchen: ‘.crt’-Dateien für PEM-kodierte Zertifikate
          und zugehörige ‘.key’-Dateien für PEM-kodierte private
          Schlüssel.

          Die Vorgabe ist ‘"/etc/cups/ssl"’.

      -- ‘files-configuration’-Parameter: Dateiname server-root
          Gibt das Verzeichnis an, das die Serverkonfigurationsdateien
          enthält.

          Die Vorgabe ist ‘"/etc/cups"’.

      -- ‘files-configuration’-Parameter: Boolescher-Ausdruck
               sync-on-close?
          Gibt an, ob das Planungsprogramm fsync(2) aufrufen soll,
          nachdem es in Konfigurations- oder Zustandsdateien geschrieben
          hat.

          Vorgegeben ist ‘#f’.

      -- ‘files-configuration’-Parameter:
               Leerzeichengetrennte-Zeichenketten-Liste system-group
          Gibt die Benutzergruppe(n) an, die als die ‘@SYSTEM’-Gruppen
          für die Authentisierung benutzt werden können.

      -- ‘files-configuration’-Parameter: Dateiname temp-dir
          Gibt das Verzeichnis an, in das temporäre Dateien gespeichert
          werden.

          Die Vorgabe ist ‘"/var/spool/cups/tmp"’.

      -- ‘files-configuration’-Parameter: Zeichenkette user
          Gibt den Benutzernamen oder -identifikator an, mit dessen
          Benutzerkonto externe Programme ausgeführt werden.

          Die Vorgabe ist ‘"lp"’.

      -- ‘files-configuration’-Parameter: Zeichenkette set-env
          Legt die angegebene Umgebungsvariable auf einen Wert (englisch
          „Value“) fest, die an Kindprozesse übergeben wird.

          Die Vorgabe ist ‘"variable value"’.

 -- ‘cups-configuration’-Parameter: Zugriffsprotokollstufe
          access-log-level
     Gibt an, mit welcher Detailstufe das Protokoll in der
     AccessLog-Datei geführt wird. Bei der Stufe ‘config’ wird
     protokolliert, wenn Drucker und Klassen hinzugefügt, entfernt oder
     verändert werden, und wenn auf Konfigurationsdateien zugegriffen
     oder sie aktualisiert werden. Bei der Stufe ‘actions’ wird
     protokolliert, wenn Druckaufträge eingereicht, gehalten,
     freigegeben, geändert oder abgebrochen werden sowie alles, was bei
     ‘config’ Protokollierung auslöst. Bei der Stufe ‘all’ wird jede
     Anfrage protokolliert.

     Die Vorgabe ist ‘actions’.

 -- ‘cups-configuration’-Parameter: Boolescher-Ausdruck auto-purge-jobs?
     Gibt an, ob Daten über den Auftragsverlauf automatisch gelöscht
     werden sollen, wenn Sie nicht mehr zur Berechnung von
     Druckkontingenten benötigt werden.

     Vorgegeben ist ‘#f’.

 -- ‘cups-configuration’-Parameter: Kommagetrennte-Zeichenketten-Liste
          browse-dns-sd-sub-types
     Gibt eine Liste von DNS-SD-Subtypen an, die anderen für jeden
     geteilten Drucker mitgeteilt werden sollen. Zum Beispiel wird bei
     ‘"_cups" "_print"’ den Netzwerk-Clients mitgeteilt, dass sowohl
     Teilen zwischen CUPS als auch IPP Everywhere unterstützt werden.

     Die Vorgabe ist ‘"_cups"’.

 -- ‘cups-configuration’-Parameter: Protokolle-zur-lokalen-Suche
          browse-local-protocols
     Gibt an, welche Protokolle zum lokalen Teilen („Freigeben“) von
     Druckern benutzt werden sollen.

     Die Vorgabe ist ‘dnssd’.

 -- ‘cups-configuration’-Parameter: Boolescher-Ausdruck browse-web-if?
     Gibt an, ob die Weboberfläche von CUPS anderen mitgeteilt wird.

     Vorgegeben ist ‘#f’.

 -- ‘cups-configuration’-Parameter: Boolescher-Ausdruck browsing?
     Gibt an, ob geteilte Drucker bei Druckersuchen mitgeteilt werden.

     Vorgegeben ist ‘#f’.

 -- ‘cups-configuration’-Parameter: Zeichenkette classification
     Gibt die Geheimhaltungsstufe des Servers an. Jeder gültige
     Deckblattname („Banner“-Name) kann benutzt werden, einschließlich
     ‘"classified"’, ‘"confidential"’, ‘"secret"’, ‘"topsecret"’ und
     ‘"unclassified"’. Wird kein Deckblatt angegeben, werden Funktionen
     für sicheres Drucken abgeschaltet.

     Die Vorgabe ist ‘""’.

 -- ‘cups-configuration’-Parameter: Boolescher-Ausdruck
          classify-override?
     Gibt an, ob Nutzer bei einzelnen Druckaufträgen eine andere als die
     voreingestellte Geheimhaltungsstufe (für das Deckblatt) vorgeben
     können, indem sie die Option ‘job-sheets’ einstellen.

     Vorgegeben ist ‘#f’.

 -- ‘cups-configuration’-Parameter: Voreingestelle-Authentifizierungsart
          default-auth-type
     Gibt an, wie man nach Voreinstellung authentifiziert wird.

     Die Vorgabe ist ‘Basic’.

 -- ‘cups-configuration’-Parameter: Voreingestellte-Verschlüsselung
          default-encryption
     Gibt an, ob für authentifizierte Anfragen Verschlüsselung benutzt
     wird.

     Die Vorgabe ist ‘Required’.

 -- ‘cups-configuration’-Parameter: Zeichenkette default-language
     Gibt an, welche Sprache für Text und Weboberfläche voreingestellt
     benutzt werden soll.

     Die Vorgabe ist ‘"en"’.

 -- ‘cups-configuration’-Parameter: Zeichenkette default-paper-size
     Gibt das voreingestellte Papierformat für neue Druckwarteschlangen
     an. Bei ‘"Auto"’ wird eine der Locale entsprechende Voreinstellung
     gewählt, während bei ‘"None"’ kein Papierformat voreingestellt ist.
     Verfügbare Formatbezeichnungen sind typischerweise ‘"Letter"’ oder
     ‘"A4"’.

     Die Vorgabe ist ‘"Auto"’.

 -- ‘cups-configuration’-Parameter: Zeichenkette default-policy
     Gibt die voreingestellte Zugriffsrichtlinie an, die benutzt werden
     soll.

     Die Vorgabe ist ‘"default"’.

 -- ‘cups-configuration’-Parameter: Boolescher-Ausdruck default-shared?
     Gibt an, ob lokale Drucker nach Voreinstellung geteilt werden
     sollen.

     Die Vorgabe ist ‘#t’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          dirty-clean-interval
     Gibt an, mit welcher Verzögerung Konfigurations- und
     Zustandsdateien aktualisiert werden sollen. Der Wert 0 lässt die
     Aktualisierung so bald wie möglich stattfinden, in der Regel nach
     ein paar Millisekunden.

     Die Vorgabe ist ‘30’.

 -- ‘cups-configuration’-Parameter: Fehlerrichtlinie error-policy
     Gibt an, wie beim Auftreten eines Fehlers verfahren werden soll.
     Mögliche Werte sind ‘abort-job’, wodurch der fehlgeschlagene
     Druckauftrag verworfen wird, ‘retry-job’, wodurch der Druckauftrag
     später erneut versucht wird, ‘retry-current-job’, wodurch der
     fehlgeschlagene Druckauftrag sofort erneut versucht wird, und
     ‘stop-printer’, wodurch der Drucker angehalten wird.

     Die Vorgabe ist ‘stop-printer’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          filter-limit
     Gibt die Maximalkosten von Filtern an, die nebenläufig ausgeführt
     werden, wodurch Probleme durch Platten-, Arbeitsspeicher- und
     Prozessorressourcennutzung minimiert werden können. Eine
     Beschränkung von 0 deaktiviert die Filterbeschränkung. Ein
     durchschnittlicher Druck mit einem Nicht-PostScript-Drucker
     erfordert eine Filterbeschränkung von mindestens ungefähr 200. Ein
     PostScript-Drucker erfordert eine halb so hohe Filterbeschränkung
     (100). Wird die Beschränkung unterhalb dieser Schwellwerte
     angesetzt, kann das Planungsprogramm effektiv nur noch einen
     einzelnen Druckauftrag gleichzeitig abarbeiten.

     Die Vorgabe ist ‘0’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl filter-nice
     Gibt die Planungspriorität von Filtern an, die zum Drucken eines
     Druckauftrags ausgeführt werden. Der nice-Wert kann zwischen 0, der
     höchsten Priorität, und 19, der niedrigsten Priorität, liegen.

     Die Vorgabe ist ‘0’.

 -- ‘cups-configuration’-Parameter: Rechnernamensauflösungen
          host-name-lookups
     Gibt an, ob inverse Namensauflösungen („Reverse Lookups“) bei sich
     verbindenden Clients durchgeführt werden sollen. Die Einstellung
     ‘double’ lässt ‘cupsd’ verifizieren, dass der anhand der Adresse
     aufgelöste Rechnername zu einer der für den Rechnernamen
     zurückgelieferten Adressen passt. „Double“-Namensauflösungen
     verhindern auch, dass sich Clients mit unregistrierten Adressen mit
     Ihrem Server verbinden können. Setzen Sie diese Option nur dann auf
     ‘#t’ oder ‘double’, wenn es unbedingt notwendig ist.

     Vorgegeben ist ‘#f’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          job-kill-delay
     Gibt die Anzahl an Sekunden an, wie lange vor dem Abwürgen der mit
     einem abgebrochenen oder gehaltenen Druckauftrag assoziierten
     Filter- und Hintergrundprozesse (dem „Backend“) gewartet wird.

     Die Vorgabe ist ‘30’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          job-retry-interval
     Gibt das Zeitintervall zwischen erneuten Versuchen von
     Druckaufträgen in Sekunden an. Dies wird in der Regel für
     Fax-Warteschlangen benutzt, kann aber auch für normale
     Druckwarteschlangen benutzt werden, deren Fehlerrichtlinie
     ‘retry-job’ oder ‘retry-current-job’ ist.

     Die Vorgabe ist ‘30’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          job-retry-limit
     Gibt die Anzahl an, wie oft ein Druckauftrag erneut versucht wird.
     Dies wird in der Regel für Fax-Warteschlangen benutzt, kann aber
     auch für normale Druckwarteschlangen benutzt werden, deren
     Fehlerrichtlinie ‘retry-job’ oder ‘retry-current-job’ ist.

     Die Vorgabe ist ‘5’.

 -- ‘cups-configuration’-Parameter: Boolescher-Ausdruck keep-alive?
     Gibt an, ob HTTP-„keep-alive“ für Verbindungen unterstützt wird.

     Die Vorgabe ist ‘#t’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          keep-alive-timeout
     Gibt an, wie lange eine Clientverbindung ohne Aktivität offen
     bleibt, in Sekunden.

     Die Vorgabe ist ‘30’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          limit-request-body
     Gibt die Maximalgröße von zu druckenden Dateien, IPP-Anfragen und
     HTML-Formulardaten an. Eine Beschränkung von 0 deaktiviert die
     Beschränkung.

     Die Vorgabe ist ‘0’.

 -- ‘cups-configuration’-Parameter: Mehrzeilige-Zeichenketten-Liste
          listen
     Lauscht auf den angegebenen Schnittstellen auf Verbindungen.
     Gültige Werte haben die Form ADRESSE:PORT, wobei die ADRESSE
     entweder eine von eckigen Klammern umschlossene IPv6-Adresse, eine
     IPv4-Adresse oder ‘*’ ist; letztere steht für alle Adressen. Werte
     können auch Dateinamen lokaler UNIX-Sockets sein. Die
     Listen-Direktive ähnelt der Port-Direktive, macht es aber möglich,
     den Zugriff für bestimmte Schnittstellen oder Netzwerke
     einzuschränken.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          listen-back-log
     Gibt die Anzahl ausstehender Verbindungen an, die möglich sein
     soll. Normalerweise betrifft dies nur sehr ausgelastete Server, die
     die MaxClients-Beschränkung erreicht haben. Es kann aber auch eine
     Rolle spielen, wenn versucht wird, gleichzeitig sehr viele
     Verbindungen herzustellen. Wenn die Beschränkung erreicht wird,
     sperrt das Betriebssystem den Aufbau weiterer Verbindungen, bis das
     Druckplanungsprogramm die ausstehenden akzeptieren konnte.

     Die Vorgabe ist ‘128’.

 -- ‘cups-configuration’-Parameter: „location-access-controls“-Liste
          location-access-controls
     Gibt eine Liste zusätzlicher Zugriffssteuerungen („Access
     Controls“) an.

     Verfügbare ‘location-access-controls’-Felder sind:

      -- ‘location-access-controls’-Parameter: Dateiname path
          Gibt den URI-Pfad an, für den die Zugriffssteuerung gilt.

      -- ‘location-access-controls’-Parameter: Zugriffssteuerungs-Liste
               access-controls
          Zugriffssteuerungen für jeden Zugriff auf diesen Pfad, im
          selben Format wie die ‘access-controls’ bei
          ‘operation-access-control’.

          Die Vorgabe ist ‘()’.

      -- ‘location-access-controls’-Parameter:
               „method-access-controls“-Liste method-access-controls
          Zugriffssteuerungen für methodenspezifische Zugriffe auf
          diesen Pfad.

          Die Vorgabe ist ‘()’.

          Verfügbare ‘method-access-controls’-Felder sind:

           -- ‘method-access-controls’-Parameter: Boolescher-Ausdruck
                    reverse?
               Falls dies ‘#t’ ist, gelten die Zugriffssteuerungen für
               alle Methoden außer den aufgelisteten Methoden.
               Andernfalls gelten sie nur für die aufgelisteten
               Methoden.

               Vorgegeben ist ‘#f’.

           -- ‘method-access-controls’-Parameter: Methoden-Liste methods
               Methoden, für die diese Zugriffssteuerung gilt.

               Die Vorgabe ist ‘()’.

           -- ‘method-access-controls’-Parameter:
                    Zugriffssteuerungs-Liste access-controls
               Zugriffssteuerungsdirektiven als eine Liste von
               Zeichenketten. Jede Zeichenkette steht für eine Direktive
               wie z.B. ‘"Order allow,deny"’.

               Die Vorgabe ist ‘()’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          log-debug-history
     Gibt die Anzahl der Nachrichten zur Fehlersuche an, die für
     Protokolle vorgehalten werden, wenn ein Fehler in einem
     Druckauftrag auftritt. Nachrichten zur Fehlersuche werden
     unabhängig von der LogLevel-Einstellung protokolliert.

     Die Vorgabe ist ‘100’.

 -- ‘cups-configuration’-Parameter: Protokollstufe log-level
     Gibt die Stufe der Protokollierung in die ErrorLog-Datei an. Der
     Wert ‘none’ stoppt alle Protokollierung, während ‘debug2’ alles
     protokollieren lässt.

     Die Vorgabe ist ‘info’.

 -- ‘cups-configuration’-Parameter: Protokollzeitformat log-time-format
     Gibt das Format von Datum und Uhrzeit in Protokolldateien an. Der
     Wert ‘standard’ lässt ganze Sekunden ins Protokoll schreiben,
     während bei ‘usecs’ Mikrosekunden protokolliert werden.

     Die Vorgabe ist ‘standard’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl max-clients
     Gibt die Maximalzahl gleichzeitig bedienter Clients an, die vom
     Planer zugelassen werden.

     Die Vorgabe ist ‘100’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          max-clients-per-host
     Gibt die Maximalzahl gleichzeitiger Clients von derselben Adresse
     an, die zugelassen werden.

     Die Vorgabe ist ‘100’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl max-copies
     Gibt die Maximalzahl der Kopien an, die ein Nutzer vom selben
     Druckauftrag ausdrucken lassen kann.

     Die Vorgabe ist ‘9999’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          max-hold-time
     Gibt die maximale Zeitdauer an, die ein Druckauftrag im
     Haltezustand ‘indefinite’ bleiben darf, bevor er abgebrochen wird.
     Ein Wert von 0 deaktiviert ein Abbrechen gehaltener Druckaufträge.

     Die Vorgabe ist ‘0’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl max-jobs
     Gibt die Maximalzahl gleichzeitiger Druckaufträge an, die noch
     zugelassen wird. Wenn Sie es auf 0 setzen, wird die Anzahl
     Druckaufträge _nicht_ beschränkt.

     Die Vorgabe ist ‘500’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          max-jobs-per-printer
     Gibt die Maximalzahl gleichzeitiger Druckaufträge an, die pro
     Drucker zugelassen werden. Ein Wert von 0 lässt bis zu
     MaxJobs-viele Druckaufträge pro Drucker zu.

     Die Vorgabe ist ‘0’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          max-jobs-per-user
     Gibt die Maximalzahl gleichzeitiger Druckaufträge an, die pro
     Benutzer zugelassen werden. Ein Wert von 0 lässt bis zu
     MaxJobs-viele Druckaufträge pro Benutzer zu.

     Die Vorgabe ist ‘0’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          max-job-time
     Gibt die maximale Anzahl an, wie oft das Drucken eines
     Druckauftrags versucht werden kann, bis er abgebrochen wird, in
     Sekunden. Wenn Sie es auf 0 setzen, wird das Abbrechen
     „feststeckender“ Druckaufträge deaktiviert.

     Die Vorgabe ist ‘10800’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          max-log-size
     Gibt die Maximalgröße der Protokolldateien an, bevor sie rotiert
     werden, in Bytes. Beim Wert 0 wird Protokollrotation deaktiviert.

     Die Vorgabe ist ‘1048576’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          multiple-operation-timeout
     Gibt die maximale Zeitdauer an, wie lange es zwischen Dateien in
     einem Druckauftrag mit mehreren Dateien dauern darf, in Sekunden.

     Die Vorgabe ist ‘300’.

 -- ‘cups-configuration’-Parameter: Zeichenkette page-log-format
     Gibt das Format der Zeilen im PageLog-Seitenprotokoll an. Folgen,
     die mit Prozentzeichen (‘%’) beginnen, werden durch die jeweils
     zugehörigen Informationen ersetzt, während alle anderen Zeichen
     wortwörtlich übernommen werden. Die folgenden Prozentfolgen werden
     erkannt:

     ‘%%’
          ein einzelnes Prozentzeichen einfügen

     ‘%{name}’
          den Wert des angegebenen IPP-Attributs einfügen

     ‘%C’
          die Anzahl der Kopien der aktuellen Seite einfügen

     ‘%P’
          die aktuelle Seitenzahl einfügen

     ‘%T’
          das aktuelle Datum und Uhrzeit im allgemeinen Protokollformat
          einfügen

     ‘%j’
          den Druckauftragsidentifikator („Job-ID“) einfügen

     ‘%p’
          den Druckernamen einfügen

     ‘%u’
          den Benutzernamen einfügen

     Wird die leere Zeichenkette als Wert angegeben, wird
     Seitenprotokollierung abgeschaltet. Die Zeichenkette ‘%p %u %j %T
     %P %C %{job-billing} %{job-originating-host-name} %{job-name}
     %{media} %{sides}’ erzeugt ein Seitenprotokoll mit den üblichen
     Elementen.

     Die Vorgabe ist ‘""’.

 -- ‘cups-configuration’-Parameter: Umgebungsvariable
          environment-variables
     Übergibt die angegebene(n) Umgebungsvariable(n) an Kindprozesse,
     als Liste von Zeichenketten.

     Die Vorgabe ist ‘()’.

 -- ‘cups-configuration’-Parameter: „policy-configuration“-Liste
          policies
     Gibt die benannten Zugriffssteuerungsrichtlinien an.

     Verfügbare ‘policy-configuration’-Felder sind:

      -- ‘policy-configuration’-Parameter: Zeichenkette name
          Der Name der Richtlinie.

      -- ‘policy-configuration’-Parameter: Zeichenkette
               job-private-access
          Gibt eine Zugriffsliste der privaten Werte eines Druckauftrags
          an. ‘@ACL’ wird auf die Werte von requesting-user-name-allowed
          oder requesting-user-name-denied des Druckers abgebildet.
          ‘@OWNER’ wird auf den Besitzer des Druckauftrags abgebildet.
          ‘@SYSTEM’ wird auf die Gruppen abgebildet, die im
          ‘system-group’-Feld der ‘files-config’-Konfiguration
          aufgelistet sind, aus der die Datei ‘cups-files.conf(5)’
          erzeugt wird. Zu den anderen möglichen Elementen der
          Zugriffsliste gehören Namen bestimmer Benutzerkonten und
          ‘@BENUTZERGRUPPE’, was für Mitglieder einer bestimmten
          Benutzergruppe steht. Die Zugriffsliste kann auch einfach als
          ‘all’ oder ‘default’ festgelegt werden.

          Die Vorgabe ist ‘"@OWNER @SYSTEM"’.

      -- ‘policy-configuration’-Parameter: Zeichenkette
               job-private-values
          Gibt die Liste der Druckauftragswerte an, die geschützt werden
          sollten, oder ‘all’, ‘default’ oder ‘none’.

          Die Vorgabe ist ‘"job-name job-originating-host-name
          job-originating-user-name phone"’.

      -- ‘policy-configuration’-Parameter: Zeichenkette
               subscription-private-access
          Gibt eine Zugriffsliste für die privaten Werte eines
          Abonnements an. ‘@ACL’ wird auf die Werte von
          requesting-user-name-allowed oder requesting-user-name-denied
          des Druckers abgebildet. ‘@OWNER’ wird auf den Besitzer des
          Druckauftrags abgebildet. ‘@SYSTEM’ wird auf die Gruppen
          abgebildet, die im ‘system-group’-Feld der
          ‘files-config’-Konfiguration aufgelistet sind, aus der die
          Datei ‘cups-files.conf(5)’ erzeugt wird. Zu den anderen
          möglichen Elementen der Zugriffsliste gehören Namen bestimmer
          Benutzerkonten und ‘@BENUTZERGRUPPE’, was für Mitglieder einer
          bestimmten Benutzergruppe steht. Die Zugriffsliste kann auch
          einfach als ‘all’ oder ‘default’ festgelegt werden.

          Die Vorgabe ist ‘"@OWNER @SYSTEM"’.

      -- ‘policy-configuration’-Parameter: Zeichenkette
               subscription-private-values
          Gibt die Liste der Druckauftragswerte an, die geschützt werden
          sollten, oder ‘all’, ‘default’ oder ‘none’.

          Die Vorgabe ist ‘"notify-events notify-pull-method
          notify-recipient-uri notify-subscriber-user-name
          notify-user-data"’.

      -- ‘policy-configuration’-Parameter:
               „operation-access-controls“-Liste access-controls
          Zugriffssteuerung durch IPP-Betrieb.

          Die Vorgabe ist ‘()’.

 -- ‘cups-configuration’-Parameter:
          Boolescher-Ausdruck-oder-Nichtnegative-ganze-Zahl
          preserve-job-files
     Gibt an, ob die Dateien eines Druckauftrags (Dokumente) erhalten
     bleiben, nachdem ein Druckauftrag ausgedruckt wurde. Wenn eine Zahl
     angegeben wird, bleiben die Dateien des Druckauftrags für die
     angegebene Zahl von Sekunden nach dem Drucken erhalten. Ein
     boolescher Wert bestimmt ansonsten, ob sie auf unbestimmte Zeit
     erhalten bleiben.

     Die Vorgabe ist ‘86400’.

 -- ‘cups-configuration’-Parameter:
          Boolescher-Ausdruck-oder-Nichtnegative-ganze-Zahl
          preserve-job-history
     Gibt an, ob der Druckauftragsverlauf nach dem Drucken eines
     Druckauftrags erhalten bleibt. Wenn eine Zahl angegeben wird,
     bleibt der Druckauftragsverlauf für die angegebene Zahl von
     Sekunden nach dem Drucken erhalten. Bei ‘#t’ bleibt der
     Druckauftragsverlauf so lange erhalten, bis die
     MaxJobs-Beschränkung erreicht wurde.

     Die Vorgabe ist ‘#t’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl
          reload-timeout
     Gibt an, wie lange vor dem Neustart des Planungsprogramms auf den
     Abschluss eines Druckauftrages gewartet wird.

     Die Vorgabe ist ‘30’.

 -- ‘cups-configuration’-Parameter: Zeichenkette rip-cache
     Gibt die maximale Menge an genutztem Arbeitsspeicher für das
     Konvertieren von Dokumenten in eine Rastergrafik (eine „Bitmap“)
     für einen Drucker an.

     Die Vorgabe ist ‘"128m"’.

 -- ‘cups-configuration’-Parameter: Zeichenkette server-admin
     Gibt die E-Mail-Adresse des Serveradministrators an.

     Die Vorgabe ist ‘"root@localhost.localdomain"’.

 -- ‘cups-configuration’-Parameter: Rechnernamens-Liste-oder-*
          server-alias
     Die ServerAlias-Direktive wird zur Prüfung der HTTP-Host-Kopfzeile
     benutzt, wenn sich Clients mit dem Planungsprogramm über externe
     Schnittstellen verbinden. Wenn der besondere Name ‘*’ benutzt wird,
     könnte Ihr System möglicherweise bekannten browserbasierten
     DNS-Rebinding-Angriffen ausgesetzt werden, selbst wenn auf die
     Angebote nur über eine Firewall zugegriffen wird. Wenn alternative
     Namen nicht automatisch erkannt werden, empfehlen wir, jeden
     alternativen Namen in der ServerAlias-Direktive aufzulisten, statt
     ‘*’ zu benutzen.

     Die Vorgabe ist ‘*’.

 -- ‘cups-configuration’-Parameter: Zeichenkette server-name
     Gibt den vollständigen Rechnernamen („Fully-Qualified Host Name“)
     des Servers an.

     Die Vorgabe ist ‘"localhost"’.

 -- ‘cups-configuration’-Parameter: Server-Tokens server-tokens
     Gibt an, welche Informationen in der Server-Kopfzeile von
     HTTP-Antworten vorkommen. ‘None’ deaktiviert die Server-Kopfzeile.
     ‘ProductOnly’ liefert ‘CUPS’. ‘Major’ liefert ‘CUPS 2’. ‘Minor’
     liefert ‘CUPS 2.0’. ‘Minimal’ liefert ‘CUPS 2.0.0’. ‘OS’ liefert
     ‘CUPS 2.0.0 (UNAME)’, wobei UNAME die Ausgabe des Befehls ‘uname’
     ist. ‘Full’ liefert ‘CUPS 2.0.0 (UNAME) IPP/2.0’.

     Die Vorgabe ist ‘Minimal’.

 -- ‘cups-configuration’-Parameter: Mehrzeilige-Zeichenketten-Liste
          ssl-listen
     Lauscht auf den angegebenen Schnittstellen auf verschlüsselte
     Verbindungen. Gültige Werte haben die Form ADRESSE:PORT, wobei die
     ADRESSE entweder eine von eckigen Klammern umschlossene
     IPv6-Adresse, eine IPv4-Adresse oder ‘*’ ist; letztere steht für
     alle Adressen.

     Die Vorgabe ist ‘()’.

 -- ‘cups-configuration’-Parameter: SSL-Optionen ssl-options
     Legt Verschlüsselungsoptionen fest. Nach Vorgabe unterstützt CUPS
     nur Verschlüsselung mit TLS v1.0 oder höher mit bekannten, sicheren
     „Cipher Suites“. Es ist weniger sicher, Optionen mit ‘Allow’
     („erlauben“) zu verwenden, und es erhöht die Sicherheit, Optionen
     mit ‘Deny’ („verweigern“) zu benutzen. Die Option ‘AllowRC4’
     aktiviert die 128-Bit-RC4-Cipher-Suites, die manche alten Clients
     brauchen. Die Option ‘AllowSSL3’ aktiviert SSL v3.0, das manche
     alte Clients brauchen, die TLS v1.0 nicht implementieren. Die
     Option ‘DenyCBC’ deaktiviert alle CBC-Cipher-Suites. Die Option
     ‘DenyTLS1.0’ deaktiviert Unterstützung für TLS v1.0 — dadurch wird
     TLS v1.1 zur kleinsten noch unterstützten Protokollversion.

     Die Vorgabe ist ‘()’.

 -- ‘cups-configuration’-Parameter: Boolescher-Ausdruck
          strict-conformance?
     Gibt an, ob das Druckplanungsprogramm von Clients fordert, dass sie
     sich strikt an die IPP-Spezifikationen halten.

     Vorgegeben ist ‘#f’.

 -- ‘cups-configuration’-Parameter: Nichtnegative-ganze-Zahl timeout
     Gibt die Zeitbeschränkung für HTTP-Anfragen an, in Sekunden.

     Die Vorgabe ist ‘300’.

 -- ‘cups-configuration’-Parameter: Boolescher-Ausdruck web-interface?
     Gibt an, ob die Weboberfläche zur Verfügung gestellt wird.

     Vorgegeben ist ‘#f’.

   Mittlerweile denken Sie wahrscheinlich: „Ich bitte dich,
Guix-Handbuch, ich mag dich, aber kannst du jetzt bitte mit den
Konfigurationsoptionen aufhören?“ Damit hätten Sie recht. Allerdings
sollte ein weitere Punkt noch erwähnt werden: Vielleicht haben Sie eine
bestehende ‘cupsd.conf’, die Sie verwenden möchten. In diesem Fall
können Sie eine ‘opaque-cups-configuration’ als die Konfiguration eines
‘cups-service-type’ übergeben.

   Verfügbare ‘opaque-cups-configuration’-Felder sind:

 -- ‘opaque-cups-configuration’-Parameter: „package“ cups
     Das CUPS-Paket.

 -- ‘opaque-cups-configuration’-Parameter: Zeichenkette cupsd.conf
     Der Inhalt der Datei ‘cupsd.conf’ als eine Zeichenkette.

 -- ‘opaque-cups-configuration’-Parameter: Zeichenkette cups-files.conf
     Der Inhalt der Datei ‘cups-files.conf’ als eine Zeichenkette.

   Wenn Ihre ‘cupsd.conf’ und ‘cups-files.conf’ zum Beispiel in
Zeichenketten mit dem entsprechenden Namen definiert sind, könnten Sie
auf diese Weise einen CUPS-Dienst instanziieren:

     (service cups-service-type
              (opaque-cups-configuration
                (cupsd.conf cupsd.conf)
                (cups-files.conf cups-files.conf)))

