\input texinfo
@c ===========================================================================
@c
@c This file was generated with po4a. Translate the source file.
@c
@c ===========================================================================

@c -*-texinfo-*-

@c %**start of header
@setfilename guix.de.info
@documentencoding UTF-8
@documentlanguage de
@frenchspacing on
@settitle Referenzhandbuch zu GNU Guix
@c %**end of header

@include version-de.texi

@c Identifier of the OpenPGP key used to sign tarballs and such.
@set OPENPGP-SIGNING-KEY-ID 3CE464558A84FDC69DB40CFB090B11993D9AEBB5
@set OPENPGP-SIGNING-KEY-URL https://sv.gnu.org/people/viewgpg.php?user_id=15145

@c Base URL for downloads.
@set BASE-URL https://ftpmirror.gnu.org/gnu/guix

@c The official substitute server used by default.
@set SUBSTITUTE-SERVER-1 bordeaux.guix.gnu.org
@set SUBSTITUTE-SERVER-2 ci.guix.gnu.org
@set SUBSTITUTE-URLS https://@value{SUBSTITUTE-SERVER-1} https://@value{SUBSTITUTE-SERVER-2}

@copying
Copyright @copyright{} 2012--2025 Ludovic Courtès@* Copyright @copyright{}
2013, 2014, 2016, 2024 Andreas Enge@* Copyright @copyright{} 2013 Nikita
Karetnikov@* Copyright @copyright{} 2014, 2015, 2016 Alex Kost@* Copyright
@copyright{} 2015, 2016 Mathieu Lirzin@* Copyright @copyright{} 2014
Pierre-Antoine Rault@* Copyright @copyright{} 2015 Taylan Ulrich
Bayırlı/Kammer@* Copyright @copyright{} 2015, 2016, 2017, 2019, 2020, 2021,
2023, 2025 Leo Famulari@* Copyright @copyright{} 2015, 2016, 2017, 2018,
2019, 2020, 2021, 2022, 2023 Ricardo Wurmus@* Copyright @copyright{} 2016
Ben Woodcroft@* Copyright @copyright{} 2016, 2017, 2018, 2021 Chris
Marusich@* Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021, 2022,
2023, 2025 Efraim Flashner@* Copyright @copyright{} 2016 John Darrington@*
Copyright @copyright{} 2016, 2017 Nikita Gillmann@* Copyright @copyright{}
2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024, 2025 Janneke
Nieuwenhuizen@* Copyright @copyright{} 2016, 2017, 2018, 2019, 2020, 2021
Julien Lepiller@* Copyright @copyright{} 2016 Alex ter Weele@* Copyright
@copyright{} 2016, 2017, 2018, 2019, 2020, 2021 Christopher Baines@*
Copyright @copyright{} 2017, 2018, 2019 Clément Lassieur@* Copyright
@copyright{} 2017, 2018, 2020, 2021, 2022 Mathieu Othacehe@* Copyright
@copyright{} 2017 Federico Beffa@* Copyright @copyright{} 2017, 2018, 2024,
2025 Carlo Zancanaro@* Copyright @copyright{} 2017 Thomas Danckaert@*
Copyright @copyright{} 2017 humanitiesNerd@* Copyright @copyright{} 2017,
2021 Christine Lemmer-Webber@* Copyright @copyright{} 2017, 2018, 2019,
2020, 2021, 2022 Marius Bakke@* Copyright @copyright{} 2017, 2019, 2020,
2022 Hartmut Goebel@* Copyright @copyright{} 2017, 2019--2025 Maxim
Cournoyer@* Copyright @copyright{} 2017–2022 Tobias Geerinckx-Rice@*
Copyright @copyright{} 2017 George Clemmer@* Copyright @copyright{} 2017
Andy Wingo@* Copyright @copyright{} 2017, 2018, 2019, 2020, 2023, 2024, 2025
Arun Isaac@* Copyright @copyright{} 2017 nee@* Copyright @copyright{} 2018
Rutger Helling@* Copyright @copyright{} 2018, 2021, 2023, 2025 Oleg
Pykhalov@* Copyright @copyright{} 2018 Mike Gerwitz@* Copyright @copyright{}
2018 Pierre-Antoine Rouby@* Copyright @copyright{} 2018, 2019 Gábor
Boskovits@* Copyright @copyright{} 2018, 2019, 2020, 2022, 2023, 2024
Florian Pelz@* Copyright @copyright{} 2018 Laura Lazzati@* Copyright
@copyright{} 2018 Alex Vong@* Copyright @copyright{} 2019 Josh Holland@*
Copyright @copyright{} 2019, 2020 Diego Nicola Barbato@* Copyright
@copyright{} 2019 Ivan Petkov@* Copyright @copyright{} 2019 Jakob
L. Kreuze@* Copyright @copyright{} 2019 Kyle Andrews@* Copyright
@copyright{} 2019 Alex Griffin@* Copyright @copyright{} 2019, 2020, 2021,
2022 Guillaume Le Vaillant@* Copyright @copyright{} 2020 Liliana Marie
Prikler@* Copyright @copyright{} 2019, 2020, 2021, 2022, 2023 Simon
Tournier@* Copyright @copyright{} 2020 Wiktor Żelazny@* Copyright
@copyright{} 2020 Damien Cassou@* Copyright @copyright{} 2020 Jakub
Kądziołka@* Copyright @copyright{} 2020 Jack Hill@* Copyright @copyright{}
2020 Naga Malleswari@* Copyright @copyright{} 2020, 2021 Brice Waegeneire@*
Copyright @copyright{} 2020 R Veera Kumar@* Copyright @copyright{} 2020,
2021, 2022 Pierre Langlois@* Copyright @copyright{} 2020 pinoaffe@*
Copyright @copyright{} 2020, 2023 André Batista@* Copyright @copyright{}
2020, 2021 Alexandru-Sergiu Marton@* Copyright @copyright{} 2020 raingloom@*
Copyright @copyright{} 2020 Daniel Brooks@* Copyright @copyright{} 2020 John
Soo@* Copyright @copyright{} 2020 Jonathan Brielmaier@* Copyright
@copyright{} 2020 Edgar Vincent@* Copyright @copyright{} 2021, 2022 Maxime
Devos@* Copyright @copyright{} 2021 B. Wilson@* Copyright @copyright{} 2021
Xinglu Chen@* Copyright @copyright{} 2021 Raghav Gururajan@* Copyright
@copyright{} 2021 Domagoj Stolfa@* Copyright @copyright{} 2021 Hui Lu@*
Copyright @copyright{} 2021 pukkamustard@* Copyright @copyright{} 2021 Alice
Brenon@* Copyright @copyright{} 2021-2023 Josselin Poiret@* Copyright
@copyright{} 2021, 2023 muradm@* Copyright @copyright{} 2021, 2022 Andrew
Tropin@* Copyright @copyright{} 2021 Sarah Morgensen@* Copyright
@copyright{} 2022 Remco van 't Veer@* Copyright @copyright{} 2022 Aleksandr
Vityazev@* Copyright @copyright{} 2022 Philip M@sup{c}Grath@* Copyright
@copyright{} 2022 Karl Hallsby@* Copyright @copyright{} 2022 Justin
Veilleux@* Copyright @copyright{} 2022 Reily Siegel@* Copyright @copyright{}
2022 Simon Streit@* Copyright @copyright{} 2022 (@* Copyright @copyright{}
2022 John Kehayias@* Copyright @copyright{} 2022⁠–⁠2023 Bruno Victal@*
Copyright @copyright{} 2022 Ivan Vilata-i-Balaguer@* Copyright @copyright{}
2023-2025 Giacomo Leidi@* Copyright @copyright{} 2022 Antero Mejr@*
Copyright @copyright{} 2023 Karl Hallsby@* Copyright @copyright{} 2023
Nathaniel Nicandro@* Copyright @copyright{} 2023 Tanguy Le Carrour@*
Copyright @copyright{} 2023-2024 Zheng Junjie@* Copyright @copyright{} 2023
Brian Cully@* Copyright @copyright{} 2023 Felix Lechner@* Copyright
@copyright{} 2023 Foundation Devices, Inc.@* Copyright @copyright{} 2023
Thomas Ieong@* Copyright @copyright{} 2023 Saku Laesvuori@* Copyright
@copyright{} 2023 Graham James Addis@* Copyright @copyright{} 2023-2025
Tomas Volf@* Copyright @copyright{} 2024, 2025 Herman Rimm@* Copyright
@copyright{} 2024 Matthew Trzcinski@* Copyright @copyright{} 2024 Richard
Sent@* Copyright @copyright{} 2024 Dariqq@* Copyright @copyright{} 2024
Denis 'GNUtoo' Carikli@* Copyright @copyright{} 2024 Fabio Natali@*
Copyright @copyright{} 2024 Arnaud Daby-Seesaram@* Copyright @copyright{}
2024-2025 Nigko Yerden@* Copyright @copyright{} 2024 Troy Figiel@* Copyright
@copyright{} 2024 Sharlatan Hellseher@* Copyright @copyright{} 2024 45mg@*
Copyright @copyright{} 2024 Greg Hogan@* Copyright @copyright{} 2025 Sören
Tempel@* Copyright @copyright{} 2025 Rostislav Svoboda@* Copyright
@copyright{} 2025 Zacchaeus@* Copyright @copyright{} 2025 Sergio Pastor
Pérez@* Copyright @copyright{} 2024 Evgeny Pisemsky@* Copyright @copyright{}
2025 jgart@* Copyright @copyright{} 2025 Artur Wroblewski@* Copyright
@copyright{} 2025 Edouard Klein@* Copyright @copyright{} 2025 Rodion
Goritskov@* Copyright @copyright{} 2025 dan@* Copyright @copyright{} 2025
Noé Lopez@*

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-Lizenz für freie Dokumentation“.
@end copying

@dircategory Systemadministration
@direntry
* Guix.de: (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 direntry

@dircategory Softwareentwicklung
@direntry
* guix shell: (guix.de)guix shell aufrufen.  Software-Umgebungen erzeugen.
* 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 direntry

@titlepage
@title Referenzhandbuch zu GNU Guix
@subtitle Den funktionalen Paketmanager GNU Guix benutzen
@author Die Entwickler von GNU Guix

@page
@vskip 0pt plus 1filll
Edition @value{EDITION} @* @value{UPDATED} @*

@insertcopying
@end titlepage

@contents

@c *********************************************************************
@node Top
@top GNU Guix

Dieses Dokument beschreibt GNU Guix, Version @value{VERSION}, ein Werkzeug
zur funktionalen Verwaltung von Softwarepaketen, das für das GNU-System
geschrieben wurde.

@c TRANSLATORS: You can replace the following paragraph with information on
@c how to join your own translation team and how to report issues with the
@c translation.
Dieses Handbuch ist auch auf Englisch (siehe @ref{Top,,, guix, GNU Guix
Reference Manual}), in Vereinfachtem Chinesisch (siehe @ref{Top,,,
guix.zh_CN, GNU Guix参考手册}), auf Französisch (siehe @ref{Top,,, guix.fr,
Manuel de référence de GNU Guix}), auf Spanisch (siehe @ref{Top,,, guix.es,
Manual de referencia de GNU Guix}), auf Italienisch (siehe @ref{Top,,,
guix.it, Manuale di riferimento di GNU Guix}), auf Brasilianischem
Portugiesisch (siehe @ref{Top,,, guix.pt_BR, Manual de referência do GNU
Guix}) und auf Russisch verfügbar (siehe @ref{Top,,, guix.ru, Руководство
GNU Guix}). Wenn Sie es in Ihre eigene Sprache übersetzen möchten, dann sind
Sie bei
@uref{https://translate.codeberg.org/projects/guix/documentation-manual,
Weblate} herzlich willkommen (siehe @ref{Guix übersetzen}).

@menu
* Einführung::               Was ist Guix überhaupt?
* Installation::             Guix installieren.
* Systeminstallation::       Das ganze Betriebssystem installieren.
* Einstieg::                 Ihre ersten Schritte.
* Paketverwaltung::          Pakete installieren, aktualisieren usw.
* Kanäle::                   Die Paketsammlung anpassen.
* Entwicklung::              Von Guix unterstützte Softwareentwicklung.
* Programmierschnittstelle::  Guix in Scheme verwenden.
* Zubehör::                  Befehle zur Paketverwaltung.
* Fremde Architekturen::     Erstellen für fremde Architekturen.
* Systemkonfiguration::      Das Betriebssystem konfigurieren.
* Problembehandlung bei Guix System::  Wenn es mal nicht so läuft.
* Persönliche Konfiguration::  Persönliche Home-Umgebungen konfigurieren.
* Dokumentation::            Wie man Nutzerhandbücher von Software liest.
* Plattformen::              Plattformen definieren.
* Systemabbilder::           System-Images erzeugen.
* Dateien zur Fehlersuche installieren::  Den Debugger füttern.
* TeX und LaTeX gebrauchen::  Texte setzen.
* Sicherheitsaktualisierungen::  Sicherheits-Patches schnell einspielen.
* Bootstrapping::            GNU/Linux von Grund auf selbst erstellen.
* Portierung::               Guix auf andere Plattformen und Kernels 
                               bringen.
* Mitwirken::                Ihre Hilfe ist nötig!

* Danksagungen::             Danke!
* GNU-Lizenz für freie Dokumentation::  Die Lizenz dieses Handbuchs.
* Konzeptverzeichnis::       Konzepte.
* Programmierverzeichnis::   Datentypen, Funktionen und Variable.

@detailmenu
 --- Detaillierte Liste der Knoten ---



Einführung



* Auf Guix-Art Software verwalten::  Was Guix besonders macht.
* GNU-Distribution::         Die Pakete und Werkzeuge.

Installation



* Aus Binärdatei installieren::  Guix installieren ohne Zeit zu verlieren!
* Den Daemon einrichten::    Die Umgebung des Erstellungs-Daemons 
                               vorbereiten.
* Aufruf des guix-daemon::   Den Erstellungs-Daemon laufen lassen.
* Anwendungen einrichten::   Anwendungsspezifische Einstellungen.
* Aktualisieren von Guix::   Guix und seinen Erstellungs-Daemon 
                               aktualisieren.

Den Daemon einrichten



* Einrichten der Erstellungsumgebung::  Die isolierte Umgebung zum Erstellen 
                                          herrichten.
* Auslagern des Daemons einrichten::  Erstellungen auf entfernte Maschinen 
                                        auslagern.
* SELinux-Unterstützung::    Wie man eine SELinux-Richtlinie für den Daemon 
                               einrichtet.

Systeminstallation



* Einschränkungen::          Was Sie erwarten dürfen.
* Hardware-Überlegungen::    Unterstützte Hardware.
* Installation von USB-Stick oder DVD::  Das Installationsmedium 
                                           vorbereiten.
* Vor der Installation::     Netzwerkanbindung, Partitionierung usw.
* Geführte grafische Installation::  Leichte grafische Installation.
* Manuelle Installation::    Manuelle Installation für Zauberer.
* Nach der Systeminstallation::  Wenn die Installation erfolgreich war.
* Guix in einer VM installieren::  Ein „Guix System“-Spielplatz.
* Ein Abbild zur Installation erstellen::  Wie ein solches entsteht.

Manuelle Installation



* Tastaturbelegung und Netzwerkanbindung und Partitionierung::  Vorab.
* Fortfahren mit der Installation::  Installieren.

Paketverwaltung



* Funktionalitäten::         Wie Guix Ihr Leben schöner machen wird.
* Aufruf von guix package::  Pakete installieren, entfernen usw.
* Substitute::               Vorerstelle Binärdateien herunterladen.
* Pakete mit mehreren Ausgaben.::  Ein Quellpaket, mehrere Ausgaben.
* Aufruf von guix locate::   Pakete finden, die eine Datei enthalten.
* Aufruf von guix gc::       Den Müllsammler laufen lassen.
* Aufruf von guix pull::     Das neueste Guix samt Distribution laden.
* Aufruf von time-machine::  Alte Guix-Versionen verwenden.
* Untergeordnete::           Mit einer anderen Version von Guix 
                               interagieren.
* Aufruf von guix describe::  Informationen über Ihre Guix-Version anzeigen.
* Aufruf von guix archive::  Import und Export von Store-Dateien.

Substitute



* Offizielle Substitut-Server::  Eine besondere Quelle von Substituten.
* Substitut-Server autorisieren::  Wie man Substitute an- und abschaltet.
* Substitute von anderen Servern holen::  Substitutevielfalt.
* Substitutauthentifizierung::  Wie Guix Substitute verifiziert.
* Proxy-Einstellungen::      Wie Sie Substitute über einen Proxy beziehen.
* Fehler bei der Substitution::  Was passiert, wenn die Substitution 
                                   fehlschlägt.
* Vom Vertrauen gegenüber Binärdateien::  Wie können Sie diesem binären Blob 
                                            trauen?

Kanäle



* Weitere Kanäle angeben::   Die Paketsammlung erweitern.
* Eigenen Guix-Kanal benutzen::  Ein angepasstes Guix benutzen.
* Guix nachbilden::          Haargenau dasselbe Guix bekommen.
* Anpassung des systemweiten Guix::  Voreingestellte Guix-Kanäle auf Guix 
                                       System.
* Kanalauthentifizierung::   Wie Guix seine Aktualisierung verifiziert.
* Kanäle mit Substituten::   Kanäle nutzen, für die es Substitute gibt.
* Einen Kanal erstellen::    Wie Sie Ihren eigenen Kanal schreiben.
* Paketmodule in einem Unterverzeichnis::  Den Ort der Paketmodule des 
                                             Kanals angeben.
* Kanalabhängigkeiten deklarieren::  Abhängigkeiten von anderen Kanälen 
                                       festlegen.
* Kanalautorisierungen angeben::  Autorisierungen von Kanalautoren 
                                    definieren.
* Primäre URL::              Spiegelserver vom Original unterscheiden.
* Kanalneuigkeiten verfassen::  Den Kanalnutzern Informationen mitteilen.

Entwicklung



* Aufruf von guix shell::    Software-Umgebungen für den Moment.
* Aufruf von guix environment::  Entwicklungsumgebungen einrichten.
* Aufruf von guix pack::     Software-Bündel erstellen.
* GCC-Toolchain::            Arbeiten mit vom GCC unterstützten Sprachen.
* Aufruf von guix git authenticate::  Git-Repositorys authentifizieren.

Programmierschnittstelle



* Paketmodule::              Pakete aus Sicht des Programmierers.
* Pakete definieren::        Wie Sie neue Pakete definieren.
* Paketvarianten definieren::  Pakete anpassen.
* Manifeste verfassen::      Woraus Ihre Umgebung besteht.
* Erstellungssysteme::       Angeben, wie Pakete erstellt werden.
* Erstellungsphasen::        Die Phasen im Erstellungsprozess eines Pakets.
* Werkzeuge zur Erstellung::  Helferlein für Ihre Paketdefinitionen und 
                                anderes.
* Suchpfade::                Umgebungsvariable mit Suchpfaden deklarieren.
* Der Store::                Den Paket-Store verändern.
* Ableitungen::              Systemnahe Schnittstelle für Paketableitungen.
* Die Store-Monade::         Rein funktionale Schnittstelle zum Store.
* G-Ausdrücke::              Erstellungsausdrücke verarbeiten.
* Aufruf von guix repl::     Guix in Guile programmieren.
* Interaktiv mit Guix arbeiten::  Genau steuern auf der REPL.

Pakete definieren



* „package“-Referenz::       Der Datentyp für Pakete.
* „origin“-Referenz::        Datentyp für Paketursprünge.

Zubehör



* Aufruf von guix build::    Pakete aus der Befehlszeile heraus erstellen.
* Aufruf von guix edit::     Paketdefinitionen bearbeiten.
* Aufruf von guix download::  Eine Datei herunterladen und ihre 
                                Hash-Prüfsumme ausgeben.
* Aufruf von guix hash::     Die kryptografische Prüfsumme einer Datei 
                               berechnen.
* Aufruf von guix import::   Paketdefinitionen importieren.
* Aufruf von guix refresh::  Paketdefinitionen aktualisieren.
* Aufruf von guix style::    Paketdefinitionen umgestalten.
* Aufruf von guix lint::     Fehler in Paketdefinitionen finden.
* Aufruf von guix size::     Plattenplatzverbrauch profilieren.
* Aufruf von guix graph::    Den Paketgraphen visualisieren.
* Aufruf von guix publish::  Substitute teilen.
* Aufruf von guix challenge::  Die Substitut-Server anfechten.
* Aufruf von guix copy::     Mit einem entfernten Store Dateien austauschen.
* Aufruf von guix container::  Prozesse isolieren.
* Aufruf von guix weather::  Die Verfügbarkeit von Substituten einschätzen.
* Aufruf von guix processes::  Auflisten der Client-Prozesse

Aufruf von @command{guix build}



* Gemeinsame Erstellungsoptionen::  Erstellungsoptionen für die meisten 
                                      Befehle.
* Paketumwandlungsoptionen::  Varianten von Paketen erzeugen.
* Zusätzliche Erstellungsoptionen::  Optionen spezifisch für „guix build“.
* Fehlschläge beim Erstellen untersuchen::  Praxiserfahrung beim 
                                              Paketeschreiben.

Fremde Architekturen



* Cross-Kompilieren::        Cross-Kompilieren für eine andere Architektur.
* Native Erstellungen::      Trotz anderer Architektur nativ erstellen.

Systemkonfiguration



* Einstieg in Guix System::  Ihre ersten Schritte.
* 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.
* Swap-Speicher::            Arbeitsspeicher auslagern.
* Benutzerkonten::           Benutzerkonten festlegen.
* Tastaturbelegung::         Wie das System Tastendrücke interpretiert.
* Locales::                  Sprache und kulturelle Konventionen.
* Dienste::                  Systemdienste festlegen.
* Privilegierte Programme::  Mit erhöhten Berechtigungen 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.

Dateisysteme



* Btrfs-Dateisystem::        Btrfs-Dateisystem

Dienste



* Basisdienste::             Essenzielle Systemdienste.
* Geplante Auftragsausführung::  Der mcron-Dienst.
* Log-Rotation::             Alte Protokolle archivieren und löschen.
* Netzwerkeinrichtung::      Netzwerkschnittstellen verbinden.
* Netzwerkdienste::          Firewall, 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.
* Dateisuch-Dienste::        Um nach Dateien suchen zu können.
* 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.
* High Availability Services::  High availability services.
* Zertifikatsdienste::       TLS-Zertifikate via Let’s Encrypt.
* DNS-Dienste::              DNS-Daemons.
* VNC-Dienste::              VNC-Daemons.
* VPN-Dienste::              VPN-Daemons.
* Network File System::      Dienste mit Bezug zum Netzwerkdateisystem.
* Samba-Dienste::            Dienste zu Samba.
* Kontinuierliche Integration::  Cuirass- und Laminar-Dienste.
* Dienste zur Stromverbrauchsverwaltung::  Den Akku schonen, etc.
* 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.

Dienste definieren



* Dienstkompositionen::      Wie Dienste zusammengestellt werden.
* Diensttypen und Dienste::  Typen und Dienste.
* Service-Referenz::         Referenz zur Programmierschnittstelle.
* Shepherd-Dienste::         Eine spezielle Art von Dienst.
* Komplizierte Konfigurationen::  Die Anbindungen für komplizierte 
                                    Konfigurationen definieren.

Problembehandlung bei Guix System



* Chroot ins vorliegende System::  Chroot ins vorliegende System

Persönliche Konfiguration



* Deklaration der Persönlichen Umgebung::  Die Persönliche Umgebung 
                                             einrichten.
* Shell-Konfiguration::      Die Persönliche Umgebung aktivieren.
* Persönliche Dienste::      Dienste der Persönlichen Umgebung festlegen.
* Aufruf von guix home::     Die Konfiguration einer Persönlichen Umgebung 
                               instanziieren.

Persönliche Dienste



* Essenzielle Persönliche Dienste::  Umgebungsvariable, Pakete, 
                                       on-*-Skripte.
* Shells: Persönliche Shell-Dienste.  POSIX-Shells, Bash, Zsh.
* Mcron: Persönlicher Mcron-Dienst.  Geplante Auftragsausführung durch 
                                       Benutzer.
* Stromverbrauch: Persönliche Dienste zur Stromverbrauchsverwaltung.  Dienste 
                                                                        zum 
                                                                        Batterieverbrauch.
* Shepherd: Persönlicher Shepherd-Dienst.  Des Benutzers Daemons verwalten.
* SSH: Secure Shell.         Den Secure-Shell-Client einrichten.
* GPG: GNU Privacy Guard.    Einrichten von GPG und was dazugehört.
* Desktop: Persönliche Desktop-Dienste.  Dienste für grafische Umgebungen.
* Guix: Persönliche Guix-Dienste.  Dienste zu Guix.
* Backup: Backup Home Services.  Services for backing up User's files.
* Schriftarten: Persönliche Schriftarten-Dienste.  Schriftarten je Benutzer.
* Audio: Persönliche Tondienste.  Ton regeln.
* Mail: Persönliche Maildienste.  Dienste, um E-Mail einzurichten.
* Kurznachrichten: Persönliche Kurznachrichtendienste.  Messaging managen.
* Medien: Persönliche Mediendienste.  Zum Umgang mit Medien.
* Sway: Sway-Fensterverwaltung.  Anlegen der Sway-Konfiguration.
* Netzwerk: Persönliche Netzwerkdienste.  Netzwerkdienste.
* Secrets: Secrets Home Services.  Services for storing secrets.
* Verschiedenes: Verschiedene Persönliche Dienste.  Weitere Dienste.

Plattformen



* „platform“-Referenz::      Details der Plattform-Deklarationen.
* Unterstützte Plattformen::  Beschreibung der unterstützten Plattformen.

Systemabbilder erstellen



* „image“-Referenz::         Details der Abbild-Deklarationen.
* Abbilder instanziieren::   So legen Sie eine Image-Instanz an.
* „image-type“-Referenz::    Details der Abbildtyp-Deklarationen.
* Abbild-Module::            Module mit Images definieren.

@code{image}-Referenz



* „partition“-Referenz::     „partition“-Referenz

Dateien zur Fehlersuche installieren



* Fehlersuchinformationen abtrennen::  ‚debug‘-Ausgaben installieren.
* Fehlersuchinformationen erneuern::  Fehlende Informationen zur Fehlersuche 
                                        erstellen.

Bootstrapping



* Quellcode von Anfang an::  Ein Bootstrapping, wie GNU es verdient.
* Vorbereitung zur Verwendung der Bootstrap-Binärdateien::  Das 
                                                              Allerwichtigste 
                                                              erstellen.

@end detailmenu
@end menu

@c *********************************************************************
@node Einführung
@chapter Einführung

@cindex Zweck
GNU Guix@footnote{„Guix“ wird wie „geeks“ ausgesprochen, also als „ɡiːks“ in
der Notation des Internationalen Phonetischen Alphabets (IPA).} ist ein
Werkzeug zur Verwaltung von Softwarepaketen für das GNU-System und eine
Distribution (eine „Verteilung“) desselbigen GNU-Systems. Guix macht es
@emph{nicht} mit besonderen Berechtigungen ausgestatteten,
„unprivilegierten“ Nutzern leicht, Softwarepakete zu installieren, zu
aktualisieren oder zu entfernen, zu einem vorherigen Satz von Paketen
zurückzuwechseln, Pakete aus ihrem Quellcode heraus zu erstellen und hilft
allgemein bei der Erzeugung und Wartung von Software-Umgebungen.

@cindex Guix System
@cindex GuixSD, was jetzt Guix System heißt
@cindex Guix System Distribution, welche jetzt Guix System heißt
Sie können GNU@tie{}Guix auf ein bestehendes GNU/Linux-System aufsetzen, wo
es die bereits verfügbaren Werkzeuge ergänzt, ohne zu stören (siehe
@ref{Installation}), oder Sie können es als eine eigenständige
Betriebssystem-Distribution namens @dfn{Guix@tie{}System}
verwenden@footnote{Der Name @dfn{Guix@tie{}System} wird auf englische Weise
ausgesprochen. Früher hatten wir „Guix System“ als „Guix System
Distribution“ bezeichnet und mit „GuixSD“ abgekürzt. Wir denken mittlerweile
aber, dass es sinnvoller ist, alles unter der Fahne von Guix zu gruppieren,
weil schließlich „Guix System“ auch über den Befehl @command{guix system}
verfügbar ist, selbst wenn Sie Guix auf einer fremden Distribution
benutzen!}. Siehe @ref{GNU-Distribution}.

@menu
* Auf Guix-Art Software verwalten::  Was Guix besonders macht.
* GNU-Distribution::         Die Pakete und Werkzeuge.
@end menu

@node Auf Guix-Art Software verwalten
@section Auf Guix-Art Software verwalten

@cindex Benutzeroberflächen
Guix bietet eine befehlszeilenbasierte Paketverwaltungsschnittstelle (siehe
@ref{Aufruf von guix package}), Werkzeuge als Hilfestellung bei der
Software-Entwicklung (siehe @ref{Entwicklung}), Befehlszeilenwerkzeuge für
fortgeschrittenere Nutzung (siehe @ref{Zubehör}) sowie Schnittstellen zur
Programmierung in Scheme (siehe @ref{Programmierschnittstelle}).
@cindex Erstellungs-Daemon
Der @dfn{Erstellungs-Daemon} ist für das Erstellen von Paketen im Auftrag
von Nutzern verantwortlich (siehe @ref{Den Daemon einrichten}) und für das
Herunterladen vorerstellter Binärdateien aus autorisierten Quellen (siehe
@ref{Substitute}).

@cindex Erweiterbarkeit der Distribution
@cindex Anpassung, von Paketen
Guix enthält Paketdefinitionen für viele Pakete, manche aus GNU und andere
nicht aus GNU, die alle @uref{https://www.gnu.org/philosophy/free-sw.html,
die Freiheit des Computernutzers respektieren}. Es ist @emph{erweiterbar}:
Nutzer können ihre eigenen Paketdefinitionen schreiben (siehe @ref{Pakete definieren}) und sie als unabhängige Paketmodule verfügbar machen (siehe
@ref{Paketmodule}). Es ist auch @emph{anpassbar}: Nutzer können
spezialisierte Paketdefinitionen aus bestehenden @emph{ableiten}, auch von
der Befehlszeile (siehe @ref{Paketumwandlungsoptionen}).

@cindex funktionale Paketverwaltung
@cindex Isolierung
Intern implementiert Guix die Disziplin der @dfn{funktionalen
Paketverwaltung}, zu der Nix schon die Pionierarbeit geleistet hat (siehe
@ref{Danksagungen}). In Guix wird der Prozess, ein Paket zu erstellen und
zu installieren, als eine @emph{Funktion} im mathematischen Sinn
aufgefasst. Diese Funktion hat Eingaben, wie zum Beispiel
Erstellungs-Skripts, einen Compiler und Bibliotheken, und liefert ein
installiertes Paket. Als eine reine Funktion hängt sein Ergebnis allein von
seinen Eingaben ab@tie{}– zum Beispiel kann er nicht auf Software oder
Skripts Bezug nehmen, die nicht ausdrücklich als Eingaben übergeben
wurden. Eine Erstellungsfunktion führt immer zum selben Ergebnis, wenn ihr
die gleiche Menge an Eingaben übergeben wurde. Sie kann die Umgebung des
laufenden Systems auf keine Weise beeinflussen, zum Beispiel kann sie keine
Dateien außerhalb ihrer Erstellungs- und Installationsverzeichnisse
verändern. Um dies zu erreichen, laufen Erstellungsprozesse in isolierten
Umgebungen (sogenannte @dfn{Container}), wo nur ausdrückliche Eingaben
sichtbar sind.

@cindex store
Das Ergebnis von Paketerstellungsfunktionen wird im Dateisystem
@dfn{zwischengespeichert} in einem besonderen Verzeichnis, was als @dfn{der
Store} bezeichnet wird (siehe @ref{Der Store}). Jedes Paket wird in sein
eigenes Verzeichnis im Store installiert@tie{}– standardmäßig ist er unter
@file{/gnu/store} zu finden. Der Verzeichnisname enthält einen Hash aller
Eingaben, anhand derer das Paket erzeugt wurde, somit hat das Ändern einer
Eingabe einen völlig anderen Verzeichnisnamen zur Folge.

Dieses Vorgehen ist die Grundlage für die Guix auszeichnenden
Funktionalitäten: Unterstützung transaktionsbasierter Paketaktualisierungen
und -rücksetzungen, Installation von Paketen für jeden Nutzer sowie Garbage
Collection für Pakete (siehe @ref{Funktionalitäten}).


@node GNU-Distribution
@section GNU-Distribution

@cindex Guix System
Mit Guix kommt eine Distribution des GNU-Systems, die nur aus freier
Software@footnote{Die Bezeichnung „frei“ steht hier für die
@url{https://www.gnu.org/philosophy/free-sw.html,Freiheiten@comma{} die
Nutzern der Software geboten werden}.} besteht. Die Distribution kann für
sich allein installiert werden (siehe @ref{Systeminstallation}), aber Guix
kann auch auf einem bestehenden GNU/Linux-System installiert werden. Wenn
wir die Anwendungsfälle unterscheiden möchten, bezeichnen wir die
alleinstehende Distribution als „Guix@tie{}System“ (mit englischer
Aussprache).

Die Distribution stellt den Kern der GNU-Pakete, also insbesondere GNU libc,
GCC und Binutils, sowie zahlreiche zum GNU-Projekt gehörende und nicht dazu
gehörende Anwendungen zur Verfügung. Die vollständige Liste verfügbarer
Pakete können Sie @url{https://www.gnu.org/software/guix/packages,online}
einsehen, oder indem Sie @command{guix package} ausführen (siehe
@ref{Aufruf von guix package}):

@example
guix package --list-available
@end example

Unser Ziel ist, eine zu 100% freie Software-Distribution von Linux-basierten
und von anderen GNU-Varianten anzubieten, mit dem Fokus darauf, das
GNU-Projekt und die enge Zusammenarbeit seiner Bestandteile zu befördern,
sowie die Programme und Werkzeuge hervorzuheben, die die Nutzer dabei
unterstützen, von dieser Freiheit Gebrauch zu machen.

Pakete sind zurzeit auf folgenden Plattformen verfügbar:

@table @code

@item x86_64-linux
Intel/AMD-@code{x86_64}-Architektur, Linux-Libre als Kernel.

@item i686-linux
Intel-32-Bit-Architektur (IA-32), Linux-Libre als Kernel.

@item armhf-linux
ARMv7-A-Architektur mit „hard float“, Thumb-2 und NEON, für die EABI
„hard-float application binary interface“, mit Linux-Libre als Kernel.

@item aarch64-linux
64-Bit-ARMv8-A-Prozessoren, little-endian, mit Linux-Libre als Kernel.

@item i586-gnu
@uref{https://hurd.gnu.org, GNU/Hurd} auf der Intel-32-Bit-Architektur
(IA32).

Diese Konfiguration ist experimentell und befindet sich noch in der
Entwicklung. Wenn Sie sie ausprobieren möchten, ist es am einfachsten, eine
Instanz des Diensttyps @code{hurd-vm-service-type} auf Ihrer
GNU/Linux-Maschine einzurichten (siehe @ref{transparent-emulation-qemu,
@code{hurd-vm-service-type}}). Siehe auch @ref{Mitwirken} für
Informationen, wie Sie helfen können!

@item x86_64-gnu
@uref{https://hurd.gnu.org, GNU/Hurd} auf der
@code{x86_64}-Intel/AMD-64-Bit-Architektur.

Diese Konfiguration ist noch experimenteller und befindet sich sehr in
Entwicklung auf Seiten der Anbieter von GNU/Hurd.

@item mips64el-linux (eingeschränkte Unterstützung)
64-Bit-MIPS-Prozessoren, little-endian, speziell die Loongson-Reihe,
n32-ABI, mit Linux-Libre als Kernel. Diese Konfiguration wird nicht länger
in vollem Umfang unterstützt; insbesondere gibt es @emph{keine} laufenden
Bemühungen, die Funktionsfähigkeit dieser Architektur sicherzustellen. Wenn
sich jemand findet, der diese Architektur wiederbeleben will, dann ist der
Code dafür noch verfügbar.

@item powerpc-linux (eingeschränkte Unterstützung)
32-Bit-PowerPC-Prozessoren, big-endian, speziell der PowerPC G4 mit AltiVec,
mit Linux-Libre als Kernel. Diese Konfiguration wird @emph{nicht} in vollem
Umfang unterstützt und es gibt @emph{keine} laufenden Bemühungen, die
Funktionsfähigkeit dieser Architektur sicherzustellen.

@item powerpc64le-linux
64-Bit-Prozessoren mit Power-Befehlssatz, little-endian, mit Linux-Libre als
Kernel. Dazu gehören POWER9-Systeme wie die
@uref{https://www.fsf.org/news/talos-ii-mainboard-and-talos-ii-lite-mainboard-now-fsf-certified-to-respect-your-freedom,
RYF-zertifizierte Talos-II-Hauptplatine}. Bei der Plattform handelt es sich
um eine „Technologievorschau“; obwohl sie unterstützt wird, gibt es noch
keine Substitute von der Erstellungsfarm (siehe @ref{Substitute}) und bei
manchen Paketen könnte die Erstellung fehlschlagen (siehe @ref{Überblick über gemeldete Fehler und Änderungen}). Dennoch arbeitet die Guix-Gemeinde aktiv daran, diese
Unterstützung auszubauen, und jetzt ist eine gute Gelegenheit, sie
auszuprobieren und mitzumachen!

@item riscv64-linux
64-Bit-Prozessoren mit RISC-V-Befehlssatz, little-endian, speziell der
RV64GC, mit Linux-Libre als Kernel. Bei der Plattform handelt es sich um
eine „Technologievorschau“; obwohl sie unterstützt wird, gibt es noch keine
Substitute von der Erstellungsfarm (siehe @ref{Substitute}) und bei manchen
Paketen könnte die Erstellung fehlschlagen (siehe @ref{Überblick über gemeldete Fehler und Änderungen}). Dennoch arbeitet die Guix-Gemeinde aktiv daran, diese
Unterstützung auszubauen, und jetzt ist eine gute Gelegenheit, sie
auszuprobieren und mitzumachen!

@end table

Mit Guix@tie{}System @emph{deklarieren} Sie alle Aspekte der
Betriebssystemkonfiguration und Guix kümmert sich darum, die Konfiguration
auf transaktionsbasierte, reproduzierbare und zustandslose Weise zu
instanziieren (siehe @ref{Systemkonfiguration}). Guix System benutzt den
Kernel Linux-libre, das Shepherd-Initialisierungssystem (siehe
@ref{Introduction,,, shepherd, The GNU Shepherd Manual}), die wohlbekannten
GNU-Werkzeuge mit der zugehörigen Werkzeugkette sowie die grafische Umgebung
und Systemdienste Ihrer Wahl.

Guix System ist auf allen oben genannten Plattformen außer
@code{mips64el-linux}, @code{powerpc-linux}, @code{powerpc64le-linux} und
@code{riscv64-linux} verfügbar.

@noindent
Informationen, wie auf andere Architekturen oder Kernels portiert werden
kann, finden Sie im Abschnitt @ref{Portierung}.

Diese Distribution aufzubauen basiert auf Kooperation, und Sie sind herzlich
eingeladen, dabei mitzumachen! Im Abschnitt @ref{Mitwirken} stehen
weitere Informationen, wie Sie uns helfen können.


@c *********************************************************************
@node Installation
@chapter Installation

@cindex Guix installieren
@cindex Fremddistribution
@cindex Guix System
Sie können das Paketverwaltungswerkzeug Guix auf einem bestehenden
GNU/Linux- oder GNU/Hurd-System installieren@footnote{Die Hurd-Unterstützung
ist bislang nur eingeschränkt.}, welche wir als eine @dfn{Fremddistribution}
bezeichnen. Wenn Sie stattdessen die vollständige, eigenständige
GNU-Systemdistribution namens @dfn{Guix@tie{}System} installieren möchten,
siehe @ref{Systeminstallation}. In diesem Abschnitt behandeln wir nur die
Installation von Guix auf einer Fremddistribution.

@quotation Wichtig
Dieser Abschnitt gilt nur für Systeme ohne Guix. Wenn Sie eine bestehende
Guix-Installation haben, würden wichtige Systemdateien überschrieben, wenn
Sie der Anleitung folgten.
@end quotation

@cindex Verzeichnisse auf einer Fremddistribution
Wenn es auf einer Fremddistribution installiert wird, ergänzt GNU@tie{}Guix
die verfügbaren Werkzeuge, ohne dass sie sich gegenseitig stören. Guix’
Daten befinden sich ausschließlich in zwei Verzeichnissen, üblicherweise
@file{/gnu/store} und @file{/var/guix}; andere Dateien auf Ihrem System wie
@file{/etc} bleiben unberührt.

Sobald es installiert ist, kann Guix durch Ausführen von @command{guix pull}
aktualisiert werden (siehe @ref{Aufruf von guix pull}).

@menu
* Aus Binärdatei installieren::  Guix installieren ohne Zeit zu verlieren!
* Den Daemon einrichten::    Die Umgebung des Erstellungs-Daemons 
                               vorbereiten.
* Aufruf des guix-daemon::   Den Erstellungs-Daemon laufen lassen.
* Anwendungen einrichten::   Anwendungsspezifische Einstellungen.
* Aktualisieren von Guix::   Guix und seinen Erstellungs-Daemon 
                               aktualisieren.
@end menu

@node Aus Binärdatei installieren
@section Aus Binärdatei installieren

@cindex Guix aus Binärdateien installieren
@cindex Installations-Skript
Dieser Abschnitt beschreibt, wie Sie Guix aus einem alle Komponenten
umfassenden Tarball installieren, der Binärdateien für Guix und all seine
Abhängigkeiten liefert. Dies geht in der Regel schneller, als Guix aus
seinen Quelldateien zu installieren, was später beschrieben wird.

@quotation Wichtig
Dieser Abschnitt gilt nur für Systeme ohne Guix. Wenn Sie eine bestehende
Guix-Installation haben, würden wichtige Systemdateien überschrieben, wenn
Sie der Anleitung folgten.
@end quotation

Das Shell-Skript @uref{https://guix.gnu.org/guix-install.sh,
@file{guix-install.sh}} automatisiert den Installationsvorgang aus
Binärdateien. Um @file{guix-install.sh} benutzen zu können, werden Bash,
GnuPG, GNU@tie{}tar, wget und Xz vorausgesetzt. Auf Systemen, wo systemd
gefunden wird, brauchen Sie außerdem das Programm @code{newgidmap} aus dem
Paket @code{uidmap} als Voraussetzung.

To install Guix on top of your GNU/Linux system, run the following commands
as root:

@example
cd /tmp
wget https://guix.gnu.org/guix-install.sh
chmod +x guix-install.sh
./guix-install.sh
@end example

Wenn Sie die Installation von Guix erledigt haben, werfen Sie einen Blick
auf @ref{Anwendungen einrichten} für weitere Einstellungen, die Sie vielleicht
vornehmen möchten, und lesen Sie die ersten Schritte im @ref{Einstieg}, um loszulegen!

The script goes through the following steps:

@enumerate
@item
Downloading the binary tarball from
@indicateurl{@value{BASE-URL}/guix-binary-@value{VERSION}.x86_64-linux.tar.xz}
(where @code{x86_64-linux} can be replaced with @code{i686-linux} for an
@code{i686} (32-bits) machine already running the kernel Linux, and so
on---@pxref{GNU-Distribution}) and extracting it.
@item
Setting up the build daemon (@pxref{Den Daemon einrichten}).
@item
Making the @command{guix} command available to non-root users.
@item
Configuring substitute servers (@pxref{Offizielle Substitut-Server}).
@end enumerate

@quotation Anmerkung
Nach Voreinstellung richtet @file{guix-install.sh} Guix so ein, dass
vorerstellte Binärdateien, die wir als @dfn{Substitute} bezeichnen, von den
Erstellungsfarmen des Projekts heruntergeladen werden (siehe
@ref{Substitute}). Wenn Sie keine Zustimmung zu Substituten geben, muss
Guix @emph{alles} auf Ihrem Rechner aus dem Quellcode heraus erstellen,
wodurch jede Installation und jede Aktualisierung sehr aufwendig wird. Siehe
@ref{Vom Vertrauen gegenüber Binärdateien} für eine Erörterung, aus welchen Gründen man
Pakete aus dem Quellcode heraus erstellen wollen könnte.

@cindex Substitute, deren Autorisierung
Um Substitute von @code{@value{SUBSTITUTE-SERVER-1}},
@code{@value{SUBSTITUTE-SERVER-2}} oder einem Spiegelserver davon zu
benutzen (siehe @ref{Substitute}), müssen Sie sie erst autorisieren. Zum
Beispiel:

@example
guix archive --authorize < \
   ~root/.config/guix/current/share/guix/@value{SUBSTITUTE-SERVER-1}.pub
guix archive --authorize < \
   ~root/.config/guix/current/share/guix/@value{SUBSTITUTE-SERVER-2}.pub
@end example
@end quotation

@quotation Anmerkung
Der Tarball zur Installation aus einer Binärdatei kann einfach durch
Ausführung des folgenden Befehls im Guix-Quellbaum (re-)produziert und
verifiziert werden:

@example
make guix-binary.@var{System}.tar.xz
@end example

@noindent
…@: was wiederum dies ausführt:

@example
guix pack -s @var{System} --localstatedir \
  --profile-name=current-guix guix
@end example

Siehe @ref{Aufruf von guix pack} für weitere Informationen zu diesem
praktischen Werkzeug.
@end quotation

@cindex Guix deinstallieren
@cindex Deinstallieren, von Guix
Falls Sie Guix irgendwann deinstallieren möchten, führen Sie dasselbe Skript
mit der Befehlszeilenoption @option{--uninstall} aus:

@example
./guix-install.sh --uninstall
@end example

Durch @option{--uninstall} wird das Skript alle Dateien, Konfigurationen und
Dienste von Guix unwiederbringlich löschen.

Some GNU/Linux distributions, such as openSUSE, Alpine and NixOS provide
Guix through their own package managers.  The version of Guix may be older
than @value{VERSION} but you can update it afterwards by running
@command{guix pull}.

Wir empfehlen Systemadministratoren, die Guix installieren, egal ob über das
Installations-Skript oder über die Paketverwaltung ihrer Fremddistribution,
regelmäßig die Sicherheitshinweise zu lesen und zu befolgen, die
@command{guix pull} anzeigt.

@node Den Daemon einrichten
@section Den Daemon einrichten

@cindex Daemon
@cindex Erstellungs-Daemon
Bei der Installation wurde der @dfn{Erstellungs-Daemon}, der laufen muss,
damit man Guix benutzen kann, bereits eingerichtet und Sie können Befehle
mit @command{guix} in Ihrem Terminalprogramm ausführen, siehe @ref{Einstieg}:

@example
guix build hello
@end example

Wenn dies ohne Fehler durchläuft, können Sie diesen Abschnitt auch
überspringen. Ihre nächste Station wäre der nachfolgende Abschnitt,
@ref{Anwendungen einrichten}.

Allerdings ist jetzt ein guter Zeitpunkt, um alte Versionen des Daemons
auszutauschen, Anpassungen vorzunehmen, Erstellungen auf andere Maschinen
auszulagern (siehe @ref{Auslagern des Daemons einrichten}) oder ihn in speziellen
Umgebungen manuell zu starten, z.B.@: in „chroots“ (siehe @ref{Chroot ins vorliegende System}) oder WSL (nicht nötig bei mit Guix erzeugten
WSL-Abbildern, siehe @ref{Systemabbilder, @code{wsl2-image-type}}). Wenn Sie
mehr wissen möchten oder vorhaben, Ihr System zu optimieren, lohnt es sich,
diesen Abschnitt zu lesen.

Operationen wie das Erstellen eines Pakets oder Laufenlassen des
Müllsammlers werden alle durch einen spezialisierten Prozess durchgeführt,
den Erstellungs-Daemon, im Auftrag seiner Kunden (den Clients). Nur der
Daemon darf auf den Store und seine zugehörige Datenbank zugreifen. Daher
wird jede den Store verändernde Operation durch den Daemon durchgeführt. Zum
Beispiel kommunizieren Befehlszeilenwerkzeuge wie @command{guix package} und
@command{guix build} mit dem Daemon (mittels entfernter Prozeduraufrufe), um
ihm Anweisungen zu geben, was er tun soll.

Folgende Abschnitte beschreiben, wie Sie die Umgebung des
Erstellungs-Daemons ausstatten sollten. @xref{Substitute} für Informationen
darüber, wie Sie es dem Daemon ermöglichen, vorerstellte Binärdateien
herunterzuladen.

@menu
* Einrichten der Erstellungsumgebung::  Die isolierte Umgebung zum Erstellen 
                                          herrichten.
* Auslagern des Daemons einrichten::  Erstellungen auf entfernte Maschinen 
                                        auslagern.
* SELinux-Unterstützung::    Wie man eine SELinux-Richtlinie für den Daemon 
                               einrichtet.
* AppArmor-Unterstützung::   Wie man ein AppArmor-Profil für den Daemon 
                               einrichtet.
@end menu

@node Einrichten der Erstellungsumgebung
@subsection Einrichten der Erstellungsumgebung

@cindex Erstellungsumgebung
In einem normalen Mehrbenutzersystem werden Guix und sein Daemon@tie{}– das
Programm @command{guix-daemon}@tie{}– vom Systemadministrator
installiert. Nicht mit erweiterten Rechten ausgestattete Nutzer können
Guix-Werkzeuge benutzen, um Pakete zu erstellen oder anderweitig auf den
Store zuzugreifen, und der Daemon wird dies für sie erledigen und dabei
sicherstellen, dass der Store in einem konsistenten Zustand verbleibt und
sich die Nutzer erstellte Pakete teilen.

Es gibt zur Zeit zwei Möglichkeiten, wie Sie den Erstellungs-Daemon
einrichten und ausführen können:

@enumerate
@item
Sie können @command{guix-daemon} unter dem Administratornutzer „root“
ausführen, wodurch er Erstellungsprozesse durch unprivilegierte
Benutzerkonten ausführt, die er aus einem Pool von Erstellungsbenutzern
nimmt@tie{}– so wie es seit langem gemacht wurde.

@item
Sie können @command{guix-daemon} unter einem eigenen unprivilegierten
Benutzerkonto ausführen. Dann werden aufbauend auf Linux’ Funktionalität der
@dfn{unprivilegierten Benutzernamensräume} isolierte Umgebungen
angelegt@tie{}– diese Option wird bei der Installation von Guix auf einer
systemd-basierten Distribution mit dem Installations-Script gewählt (siehe
@ref{Aus Binärdatei installieren}).
@end enumerate

In den folgenden Abschnitten wird genauer erläutert, was jede der beiden
Konfigurationen zu bieten hat und welche Isolation von Erstellungen Sie
erwarten dürfen.

@unnumberedsubsubsec Daemon läuft mit Administratornutzer Root

@cindex Erstellungsbenutzer
Wenn @command{guix-daemon} als Administratornutzer @code{root} läuft, wollen
Sie aber vielleicht dennoch nicht, dass Paketerstellungsprozesse auch als
@code{root} ablaufen, aus offensichtlichen Sicherheitsgründen. Um dies zu
vermeiden, sollte ein besonderer Pool aus @dfn{Erstellungsbenutzern}
geschaffen werden, damit vom Daemon gestartete Erstellungsprozesse ihn
benutzen. Mehrere solche Benutzer zu haben, ermöglicht es dem Daemon,
verschiedene Erstellungsprozessen unter verschiedenen
Benutzeridentifikatoren (UIDs) zu starten, was garantiert, dass sie einander
nicht stören@tie{}– eine essenzielle Funktionalität, da Erstellungen als
reine Funktionen angesehen werden (siehe @ref{Einführung}).

Auf einem GNU/Linux-System kann ein Pool von Erstellungsbenutzern wie folgt
erzeugt werden (mit Bash-Syntax und den Befehlen von @code{shadow}):

@c See https://lists.gnu.org/archive/html/bug-guix/2013-01/msg00239.html
@c for why `-G' is needed.
@example
# groupadd --system guixbuild
# for i in $(seq -w 1 10);
  do
    useradd -g guixbuild -G guixbuild                  \
            -d /var/empty -s $(which nologin)          \
            -c "Guix-Erstellungsbenutzer $i" --system  \
            guixbuilder$i;
  done
@end example

@noindent
Die Anzahl der Erstellungsbenutzer entscheidet, wie viele
Erstellungsaufträge parallel ausgeführt werden können, wie es mit der
Befehlszeilenoption @option{--max-jobs} vorgegeben werden kann (siehe
@ref{Aufruf des guix-daemon, @option{--max-jobs}}). Um @command{guix system
vm} und ähnliche Befehle nutzen zu können, müssen Sie die
Erstellungsbenutzer unter Umständen zur @code{kvm}-Benutzergruppe
hinzufügen, damit sie Zugriff auf @file{/dev/kvm} haben, mit @code{-G
guixbuild,kvm} statt @code{-G guixbuild} (siehe @ref{Aufruf von guix system}).

Das Programm @code{guix-daemon} kann mit dem folgenden Befehl als
@code{root} gestartet werden@footnote{Wenn Ihre Maschine systemd als
„init“-System verwendet, genügt es, die Datei
@file{@var{prefix}/lib/systemd/system/guix-daemon.service} nach
@file{/etc/systemd/system} zu kopieren, damit @command{guix-daemon}
automatisch gestartet wird. Ebenso können Sie, wenn Ihre Maschine Upstart
als „init“-System benutzt, die Datei
@file{@var{prefix}/lib/upstart/system/guix-daemon.conf} nach
@file{/etc/init} kopieren.}:

@example
# guix-daemon --build-users-group=guixbuild
@end example

Wenn Sie ihn auf diese Weise einrichten, ist @code{root} der Besitzer von
@file{/gnu/store}.

@unnumberedsubsubsec Daemon läuft ohne erhöhte Berechtigungen

@cindex rootfreier Erstellungs-Daemon
@cindex unprivilegierter Erstellungs-Daemon
@cindex Erstellungs-Daemon, ohne besondere Berechtigungen
Die zweite und bevorzugte Möglichkeit ist, @command{guix-daemon} @emph{mit
einem Benutzerkonto ohne besondere Berechtigungen} auszuführen. Ihr Vorteil
ist, dass weniger Schaden entstehen kann, wenn es ein Erstellungsprozess
schafft, eine Sicherheitslücke im Daemon auszunutzen. Diese Option
funktioniert nur mit Linux’ Mechanismus für Benutzernamensräume ohne
besondere Berechtigungen; heute ist er auf den meisten
GNU/Linux-Distributionen verfügbar und aktiv, aber man kann ihn
deaktivieren. Das Installations-Script erkennt automatisch, ob die
Möglichkeit auf Ihrem System zur Verfügung steht (siehe @ref{Aus Binärdatei installieren}).

Wenn Sie diese Möglichkeit verwenden, müssen Sie lediglich ein Benutzerkonto
anlegen und @command{guix-daemon} wird mit dessen Berechtigungen ausgeführt:

@example
# groupadd --system guix-daemon
# useradd -g guix-daemon -G guix-daemon              \
          -d /var/empty -s $(which nologin)          \
          -c "Guix-Daemon-Benutzer zur Privilegientrennung" \
          --system guix-daemon
@end example

@quotation Warnung
Wenn das Programm @command{nologin} mit @command{which nologin} nicht
gefunden werden kann, müssen Sie vielleicht seinen Pfad manuell
angeben. Normalerweise lautet er @file{/sbin/nologin} oder
@file{/usr/sbin/nologin}.
@end quotation

In dieser Konfiguration ist das Benutzerkonto @code{guix-daemon} der
Besitzer von @file{/gnu/store}.

@anchor{unprivileged-daemon-migration}
@unnumberedsubsubsec Umsteigen auf den Daemon ohne besondere Berechtigungen

@cindex unprivilegierter Daemon, Migration
@cindex rootfreier Daemon, Migration
Um eine bestehende Installation auf den unprivilegierten Betriebsmodus
umzuschalten, sind mehrere Schritte nötig: ein neues Benutzerkonto
@code{guix-daemon} nur für ihn erstellen, @code{guix-daemon} als Besitzer
aller relevanten Dateien vermerken und dann sicherstellen, dass das Programm
@command{guix-daemon} mit dem Benutzer @code{guix-daemon} ausgeführt wird.

Auf Guix System werden diese Schritte automatisch vorgenommen, wenn Sie das
Feld @code{privileged?} im Verbundsobjekt @code{guix-configuration} auf
@code{#f} setzen und Ihr System rekonfigurieren (siehe
@ref{guix-configuration-type, @code{guix-configuration}}).

Auf einer Fremddistribution hingegen muss der Vorgang von Hand durchgeführt
werden. Die folgenden Absätze beschreiben, was Sie zu tun haben.

@quotation Warnung
Folgen Sie den Anweisungen nur, wenn Sie sicher sind, dass Ihre Version von
@command{guix-daemon} neu genug ist und unprivilegiert ausgeführt werden
kann.
@end quotation

Den Besitzer von Dateien können Sie ändern, nachdem Sie den Daemon
angehalten haben. Danach führen Sie die folgenden Befehle als der
Administratorbenutzer root aus (wobei @command{chown} einige Zeit in
Anspruch nehmen kann, wenn sich viele Dateien in @file{/gnu/store}
befinden):

@example
groupadd --system guix-daemon
useradd -g guix-daemon -G guix-daemon,kvm               \
        -d /var/empty -s $(which nologin)               \
        -c "Guix-Daemon-Benutzer zur Privilegientrennung"      \
        --system guix-daemon

# Schreibberechtigung auf den Store herstellen, falls die systemd-Unit
# 'gnu-store.mount' diesen nur lesbar gemacht hat.
mount -o remount,rw /gnu/store

chown -R guix-daemon:guix-daemon                        \
  /gnu                                                  \
  /var/guix/@{gc.lock,daemon-socket,db,discover@}         \
  /var/guix/@{gcroots,offload,substitute,temproots@}      \
  /var/log/guix                                         \
  /etc/guix
@end example

Wenn Ihr System zur Diensteverwaltung systemd einsetzt, wird der Daemon als
@code{guix-daemon} ausgeführt werden, indem Sie die zugehörigen
Konfigurationsdateien kopieren@tie{}– sehen Sie nach, welche Änderungen Sie
an Ihren @file{.service}-Dateien bisher vorgenommen hatten, bevor Sie sie
überschreiben:

@example
cp /var/guix/profiles/per-user/root/current-guix/lib/systemd/system/*.service \
   /etc/systemd/system
systemctl daemon-reload
systemctl start guix-daemon
@end example

Wenn auf Ihrem System AppArmor eingeschaltet ist, siehe @ref{AppArmor-Unterstützung}.

@quotation Warnung
Bei obigen Befehlen gehen wir davon aus, dass @command{guix pull} bereits
durch den root-Benutzer ausgeführt worden ist. Das können Sie mit diesem
Befehl überprüfen:

@example
grep User=guix-daemon \
  /var/guix/profiles/per-user/root/current-guix/lib/systemd/system/guix-daemon.service
@end example

Wenn dieser Befehl keine Zeile @code{User=guix-daemon} anzeigt, führen Sie
zuvor @command{guix pull} mit dem root-Benutzer aus.
@end quotation

@unnumberedsubsubsec Die isolierte Erstellungsumgebung

@cindex chroot
@cindex Erstellungsumgebung, isolieren
@cindex isolierte Erstellungsumgebung
@cindex hermetische Erstellungsumgebung
Bei beiden Möglichkeiten, privilegiert und unprivilegiert, startet der
Daemon Erstellungsprozesse ohne Berechtigungen in einer @emph{isolierten}
oder @emph{hermetischen} Erstellungsumgebung. Auf GNU/Linux enthält die
Erstellungsumgebung standardmäßig nichts außer:

@c Keep this list in sync with libstore/build.cc! -----------------------
@itemize
@item
einem minimalen @code{/dev}-Verzeichnis, was größtenteils vom @code{/dev}
des Wirtssystems unabhängig erstellt wurde@footnote{„Größtenteils“, denn
obwohl die Menge an Dateien, die im @code{/dev} des chroots vorkommen, fest
ist, können die meisten dieser Dateien nur dann erstellt werden, wenn das
Wirtssystem sie auch hat.},

@item
dem @code{/proc}-Verzeichnis, es zeigt nur die Prozesse des Containers, weil
ein separater Namensraum für Prozess-IDs (PIDs) benutzt wird,

@item
@file{/etc/passwd} mit einem Eintrag für den aktuellen Benutzer und einem
Eintrag für den Benutzer @file{nobody},

@item
@file{/etc/group} mit einem Eintrag für die Gruppe des Benutzers,

@item
@file{/etc/hosts} mit einem Eintrag, der @code{localhost} auf
@code{127.0.0.1} abbildet,

@item
einem @file{/tmp}-Verzeichnis mit Schreibrechten.
@end itemize

Im chroot ist kein @file{/home}-Verzeichnis enthalten und die
Umgebungsvariable @env{HOME} ist auf das @emph{nicht} existierende
Verzeichnis @file{/homeless-shelter} festgelegt. Dadurch fallen
unangemessene Verwendungen von @env{HOME} in den Erstellungs-Skripts von
Paketen auf.

Durch diese Maßnahmen ist in der Regel gewährleistet, dass Details aus Ihrer
Umgebung keinen Einfluss auf Erstellungsprozesse haben. In manchen
besonderen Fällen bedarf es mehr Kontrolle@tie{}– typischerweise über Datum,
Kernel oder Prozessor@tie{}– und dazu können Sie auf eine virtuelle
Erstellungsmaschine zurückgreifen (siehe @ref{build-vm, virtuelle
Erstellungsmaschinen}).

Sie können beeinflussen, in welchem Verzeichnis der Daemon Verzeichnisbäume
zur Erstellung unterbringt, indem sie den Wert der Umgebungsvariablen
@env{TMPDIR} ändern. Allerdings heißt innerhalb des chroots der
Erstellungsbaum immer @file{/tmp/guix-build-@var{Name}.drv-0}, wobei
@var{Name} der Ableitungsname ist@tie{}– z.B.@:
@code{coreutils-8.24}. Dadurch hat der Wert von @env{TMPDIR} keinen Einfluss
auf die Erstellungsumgebung, wodurch Unterschiede vermieden werden, falls
Erstellungsprozesse den Namen ihres Erstellungsbaumes einfangen.

@vindex http_proxy
@vindex https_proxy
Der Daemon befolgt außerdem den Wert der Umgebungsvariablen @env{http_proxy}
und @env{https_proxy} für von ihm durchgeführte HTTP- und HTTPS-Downloads,
sei es für Ableitungen mit fester Ausgabe (siehe @ref{Ableitungen}) oder für
Substitute (siehe @ref{Substitute}).


@node Auslagern des Daemons einrichten
@subsection Nutzung der Auslagerungsfunktionalität

@cindex Auslagern
@cindex Build-Hook
Wenn erwünscht, kann der Erstellungs-Daemon Ableitungserstellungen auf
andere Maschinen @dfn{auslagern}, auf denen Guix läuft, mit Hilfe des
@code{offload}-@dfn{Build-Hooks}@footnote{Diese Funktionalität ist nur
verfügbar, wenn @uref{https://github.com/artyom-poptsov/guile-ssh,
Guile-SSH} vorhanden ist.}. Wenn diese Funktionalität aktiviert ist, wird
eine nutzerspezifizierte Liste von Erstellungsmaschinen aus
@file{/etc/guix/machines.scm} gelesen. Wann immer eine Erstellung angefragt
wird, zum Beispiel durch @code{guix build}, versucht der Daemon, sie an eine
der Erstellungsmaschinen auszulagern, die die Einschränkungen der Ableitung
erfüllen, insbesondere ihre Systemtypen@tie{}– z.B.@:
@code{x86_64-linux}. Eine einzelne Maschine kann mehrere Systemtypen haben,
entweder weil ihre Architektur eine native Unterstützung vorsieht, weil
Emulation eingerichtet wurde (siehe @ref{transparent-emulation-qemu,
Transparente Emulation mit QEMU}) oder beides. Fehlende Voraussetzungen für
die Erstellung werden über SSH auf die Zielmaschine kopiert, welche dann mit
der Erstellung weitermacht. Hat sie Erfolg damit, so werden die Ausgabe oder
Ausgaben der Erstellung zurück auf die ursprüngliche Maschine kopiert. Die
Auslagerungsfunktion verfügt über einen einfachen Planungsalgorithmus (einen
Scheduler), mit dem versucht wird, die jeweils beste Maschine
auszuwählen. Unter den verfügbaren wird die beste Maschine nach Kriterien
wie diesen ausgewählt:

@enumerate
@item
Ob Zeitfenster für Erstellungen frei sind („build slots“). Eine
Erstellungsmaschine kann so viele Erstellungszeitfenster (Verbindungen)
unterhalten wie es dem Wert des @code{parallel-builds}-Feldes des
@code{build-machine}-Objekts entspricht.

@item
Was ihre relative Geschwindigkeit ist, gemäß ihrer Definition im
@code{speed}-Feld ihres @code{build-machine}-Objekts.

@item
Ihrer Auslastung („load“). Die normalisierte Auslastung der Maschine darf
einen Schwellwert nicht überschreiten. Dieser ist über das
@code{overload-threshold}-Feld ihres @code{build-machine}-Objekts
einstellbar.

@item
Verfügbarem Speicherplatz auf ihrem Datenträger. Es müssen mehr als
100@tie{}MiB verfügbar sein.
@end enumerate

Die Datei @file{/etc/guix/machines.scm} sieht normalerweise so aus:

@lisp
(list (build-machine
        (name "eightysix.example.org")
        (systems (list "x86_64-linux" "i686-linux"))
        (host-key "ssh-ed25519 AAAAC3Nza…")
        (user "bob")
        (speed 2.))     ;unglaublich schnell!

      (build-machine
        (name "armeight.example.org")
        (systems (list "aarch64-linux"))
        (host-key "ssh-rsa AAAAB3Nza@dots{}")
        (user "alice")

        ;; Weil 'guix offload' vom 'guix-daemon' als
        ;; Administratornutzer root gestartet wird.
        (private-key "/root/.ssh/identität-für-guix")))
@end lisp

@noindent
Im obigen Beispiel geben wir eine Liste mit zwei Erstellungsmaschinen vor,
eine für die @code{x86_64}- und @code{i686}-Architektur und eine für die
@code{aarch64}-Architektur.

Tatsächlich ist diese Datei@tie{}– wenig überraschend!@tie{}– eine
Scheme-Datei, die ausgewertet wird, wenn der @code{offload}-Hook gestartet
wird. Der Wert, den sie zurückliefert, muss eine Liste von
@code{build-machine}-Objekten sein. Obwohl dieses Beispiel eine feste Liste
von Erstellungsmaschinen zeigt, könnte man auch auf die Idee kommen, etwa
mit DNS-SD eine Liste möglicher im lokalen Netzwerk entdeckter
Erstellungsmaschinen zu liefern (siehe @ref{Introduction, Guile-Avahi,,
guile-avahi, Using Avahi in Guile Scheme Programs}). Der Datentyp
@code{build-machine} wird im Folgenden weiter ausgeführt.

@deftp {Datentyp} build-machine
Dieser Datentyp repräsentiert Erstellungsmaschinen, an die der Daemon
Erstellungen auslagern darf. Die wichtigen Felder sind:

@table @code

@item name
Der Rechnername (d.h.@: der Hostname) der entfernten Maschine.

@item systems
Die Systemtypen, die die entfernte Maschine unterstützt@tie{}– z.B.@:
@code{(list "x86_64-linux" "i686-linux")}.

@item user
Das Benutzerkonto auf der entfernten Maschine, mit dem eine Verbindung über
SSH aufgebaut werden soll. Beachten Sie, dass das SSH-Schlüsselpaar
@emph{nicht} durch eine Passphrase geschützt sein darf, damit
nicht-interaktive Anmeldungen möglich sind.

@item host-key
Dies muss der @dfn{öffentliche SSH-Rechnerschlüssel} („Host Key“) der
Maschine im OpenSSH-Format sein. Er wird benutzt, um die Identität der
Maschine zu prüfen, wenn wir uns mit ihr verbinden. Er ist eine lange
Zeichenkette, die ungefähr so aussieht:

@example
ssh-ed25519 AAAAC3NzaC…mde+UhL hint@@example.org
@end example

Wenn auf der Maschine der OpenSSH-Daemon, @command{sshd}, läuft, ist der
Rechnerschlüssel in einer Datei wie @file{/etc/ssh/ssh_host_ed25519_key.pub}
zu finden.

@end table

Eine Reihe optionaler Felder kann festgelegt werden:

@table @asis

@item @code{port} (Vorgabe: @code{22})
Portnummer des SSH-Servers auf der Maschine.

@item @code{private-key} (Vorgabe: @file{~root/.ssh/id_rsa})
Die Datei mit dem privaten SSH-Schlüssel, der beim Verbinden zur Maschine
genutzt werden soll, im OpenSSH-Format. Dieser Schlüssel darf nicht mit
einer Passphrase geschützt sein.

Beachten Sie, dass als Vorgabewert der private Schlüssel @emph{des
root-Benutzers} genommen wird. Vergewissern Sie sich, dass er existiert,
wenn Sie die Standardeinstellung verwenden.

@item @code{compression} (Vorgabe: @code{"zlib@@openssh.com,zlib"})
@itemx @code{compression-level} (Vorgabe: @code{3})
Die Kompressionsmethoden auf SSH-Ebene und das angefragte
Kompressionsniveau.

Beachten Sie, dass Auslagerungen SSH-Kompression benötigen, um beim
Übertragen von Dateien an Erstellungsmaschinen und zurück weniger Bandbreite
zu benutzen.

@item @code{daemon-socket} (Vorgabe: @code{"/var/guix/daemon-socket/socket"})
Dateiname des Unix-Sockets, auf dem @command{guix-daemon} auf der Maschine
lauscht.

@item @code{overload-threshold} (Vorgabe: @code{0.8})
Der Schwellwert für die Auslastung (englisch „load“), ab der eine
potentielle Auslagerungsmaschine für den Auslagerungsplaner nicht mehr in
Betracht kommt. Der Wert entspricht grob der gesamten Prozessornutzung der
Erstellungsmaschine. Er reicht von 0.0 (0%) bis 1.0 (100%). Wenn er
ignoriert werden soll, dann setzen Sie @code{overload-threshold} auf
@code{#f}.

@item @code{parallel-builds} (Vorgabe: @code{1})
Die Anzahl der Erstellungen, die auf der Maschine parallel ausgeführt werden
können.

@item @code{speed} (Vorgabe: @code{1.0})
Ein „relativer Geschwindigkeitsfaktor“. Der Auslagerungsplaner gibt
tendenziell Maschinen mit höherem Geschwindigkeitsfaktor den Vorrang.

@item @code{features} (Vorgabe: @code{'()})
Eine Liste von Zeichenketten, die besondere von der Maschine unterstützte
Funktionalitäten bezeichnen. Ein Beispiel ist @code{"kvm"} für Maschinen,
die über die KVM-Linux-Module zusammen mit entsprechender
Hardware-Unterstützung verfügen. Ableitungen können Funktionalitäten dem
Namen nach anfragen und werden dann auf passenden Erstellungsmaschinen
eingeplant.

@end table
@end deftp

@quotation Anmerkung
Auf Guix System können Sie statt sich um eine zusätzliche Datei
@file{/etc/guix/machines.scm} zu kümmern auch die Erstellungsmaschinen als
Teil der Betriebssystemdeklaration in @code{operating-system} im Feld
@code{build-machines} von @code{guix-configuration} angeben. Siehe das
@ref{guix-configuration-build-machines, @code{build-machines}-Feld von
@code{guix-configuration}}.
@end quotation

Der Befehl @code{guix} muss sich im Suchpfad der Erstellungsmaschinen
befinden. Um dies nachzuprüfen, können Sie Folgendes ausführen:

@example
ssh build-machine guix repl --version
@end example

Es gibt noch eine weitere Sache zu tun, sobald @file{machines.scm}
eingerichtet ist. Wie zuvor erklärt, werden beim Auslagern Dateien zwischen
den Stores der Maschinen hin- und hergeschickt. Damit das funktioniert,
müssen Sie als Erstes ein Schlüsselpaar auf jeder Maschine erzeugen, damit
der Daemon signierte Archive mit den Dateien aus dem Store versenden kann
(siehe @ref{Aufruf von guix archive}):

@example
# guix archive --generate-key
@end example

@quotation Anmerkung
Dieses Schlüsselpaar hat mit dem SSH-Schlüsselpaar, das zuvor in der
Beschreibung des Datentyps @code{build-machine} vorkam, @emph{nichts} zu
tun.
@end quotation

@noindent
Jede Erstellungsmaschine muss den Schlüssel der Hauptmaschine autorisieren,
damit diese Store-Objekte von der Hauptmaschine empfangen kann:

@example
# guix archive --authorize < öffentlicher-schlüssel-hauptmaschine.txt
@end example

@noindent
Andersherum muss auch die Hauptmaschine den jeweiligen Schlüssel jeder
Erstellungsmaschine autorisieren.

Der ganze Umstand mit den Schlüsseln soll ausdrücken, dass sich Haupt- und
Erstellungsmaschinen paarweise gegenseitig vertrauen. Konkret kann der
Erstellungs-Daemon auf der Hauptmaschine die Unverfälschtheit von den
Erstellungsmaschinen empfangener Dateien gewährleisten (und umgekehrt), und
auch dass sie nicht sabotiert wurden und mit einem autorisierten Schlüssel
signiert wurden.

@cindex Auslagerung testen
Um zu testen, ob Ihr System funktioniert, führen Sie diesen Befehl auf der
Hauptmaschine aus:

@example
# guix offload test
@end example

Dadurch wird versucht, zu jeder Erstellungsmaschine eine Verbindung
herzustellen, die in @file{/etc/guix/machines.scm} angegeben wurde,
sichergestellt, dass auf jeder Guix nutzbar ist, und jeweils versucht, etwas
auf die Erstellungsmaschine zu exportieren und von dort zu
importieren. Dabei auftretende Fehler werden gemeldet.

Wenn Sie stattdessen eine andere Maschinendatei verwenden möchten, geben Sie
diese einfach auf der Befehlszeile an:

@example
# guix offload test maschinen-qualif.scm
@end example

Letztendlich können Sie hiermit nur die Teilmenge der Maschinen testen,
deren Name zu einem regulären Ausdruck passt:

@example
# guix offload test maschinen.scm '\.gnu\.org$'
@end example

@cindex Auslagerungs-Lagebericht
Um die momentane Auslastung aller Erstellungsrechner anzuzeigen, führen Sie
diesen Befehl auf dem Hauptknoten aus:

@example
# guix offload status
@end example


@node SELinux-Unterstützung
@subsection SELinux-Unterstützung

@cindex SELinux, Policy für den Daemon
@cindex Mandatory Access Control, SELinux
@cindex Sicherheit, des guix-daemon
Guix enthält eine SELinux-Richtliniendatei („Policy“) unter
@file{etc/guix-daemon.cil}, die auf einem System installiert werden kann,
auf dem SELinux aktiviert ist, damit Guix-Dateien gekennzeichnet sind und um
das erwartete Verhalten des Daemons anzugeben. Da Guix System keine
Grundrichtlinie („Base Policy“) für SELinux bietet, kann diese Richtlinie
für den Daemon auf Guix System nicht benutzt werden.

@subsubsection Installieren der SELinux-Policy
@cindex SELinux, Policy installieren

@quotation Anmerkung
Wenn Sie mit dem Skript @code{guix-install.sh} die Installation aus einer
Binärdatei durchführen, wird Ihnen angeboten, die folgenden Schritte
automatisch durchzuführen (siehe @ref{Aus Binärdatei installieren}).
@end quotation

Um die Richtlinie (Policy) zu installieren, führen Sie folgenden Befehl mit
Administratorrechten aus:

@example
semodule -i /var/guix/profiles/per-user/root/current-guix/share/selinux/guix-daemon.cil
@end example

Dann kennzeichnen Sie als Administratornutzer das Dateisystem neu. Womöglich
müssen Sie sich zuerst Schreibrechte darauf verschaffen:

@example
mount -o remount,rw /gnu/store
restorecon -R /gnu /var/guix
@end example

Nun ist die Zeit gekommen, @command{guix-daemon} zu starten oder neu zu
starten. Wenn Ihre Distribution systemd zur Diensteverwaltung benutzt, dann
geht das so:

@example
systemctl restart guix-daemon
@end example

Sobald die Richtlinie installiert ist, das Dateisystem neu gekennzeichnet
wurde und der Daemon neugestartet wurde, sollte er im Kontext
@code{guix_daemon_t} laufen. Sie können dies mit dem folgenden Befehl
nachprüfen:

@example
ps -Zax | grep guix-daemon
@end example

Beobachten Sie die Protokolldateien von SELinux, wenn Sie einen Befehl wie
@code{guix build hello} ausführen, um sich zu überzeugen, dass SELinux alle
notwendigen Operationen gestattet.

@subsubsection Einschränkungen
@cindex SELinux, Einschränkungen

Diese Richtlinie ist nicht perfekt. Im Folgenden finden Sie eine Liste von
Einschränkungen oder merkwürdigen Verhaltensweisen, die bedacht werden
sollten, wenn man die mitgelieferte SELinux-Richtlinie für den Guix-Daemon
einspielt.

@enumerate
@item
@code{guix_daemon_socket_t} wird nicht wirklich benutzt. Keine der
Socket-Operationen benutzt Kontexte, die irgendetwas mit
@code{guix_daemon_socket_t} zu tun haben. Es schadet nicht, diese ungenutzte
Kennzeichnung zu haben, aber es wäre besser, für die Kennzeichnung auch
Socket-Regeln festzulegen.

@item
@code{guix gc} kann nicht auf beliebige Verknüpfungen zu Profilen
zugreifen. Die Kennzeichnung des Ziels einer symbolischen Verknüpfung ist
notwendigerweise unabhängig von der Dateikennzeichnung der
Verknüpfung. Obwohl alle Profile unter @file{$localstatedir} gekennzeichnet
sind, erben die Verknüpfungen auf diese Profile die Kennzeichnung desjenigen
Verzeichnisses, in dem sie sich befinden. Für Verknüpfungen im Persönlichen
Verzeichnis des Benutzers ist das @code{user_home_t}, aber für Verknüpfungen
aus dem Persönlichen Verzeichnis des Administratornutzers, oder @file{/tmp},
oder das Arbeitsverzeichnis des HTTP-Servers, etc., funktioniert das
nicht. @code{guix gc} würde es nicht gestattet, diese Verknüpfungen
auszulesen oder zu verfolgen.

@item
Die vom Daemon gebotene Funktionalität, auf TCP-Verbindungen zu lauschen,
könnte nicht mehr funktionieren. Dies könnte zusätzliche Regeln brauchen,
weil SELinux Netzwerk-Sockets anders behandelt als Dateien.

@item
Derzeit wird allen Dateien mit einem Namen, der zum regulären Ausdruck
@code{/gnu/store/.+-(guix-.+|profile)/bin/guix-daemon} passt, die
Kennzeichnung @code{guix_daemon_exec_t} zugewiesen, wodurch @emph{jeder
beliebigen} Datei mit diesem Namen in irgendeinem Profil gestattet wäre, in
der Domäne @code{guix_daemon_t} ausgeführt zu werden. Das ist nicht
ideal. Ein Angreifer könnte ein Paket erstellen, dass solch eine ausführbare
Datei enthält, und den Nutzer überzeugen, es zu installieren und
auszuführen. Dadurch käme es in die Domäne @code{guix_daemon_t}. Ab diesem
Punkt könnte SELinux nicht mehr verhindern, dass es auf Dateien zugreift,
auf die Prozesse in dieser Domäne zugreifen dürfen.

Nach jeder Aktualisierung des @file{guix-daemon}, z.B.@: nachdem Sie
@code{guix pull} ausgeführt haben, müssen Sie das Store-Verzeichnis neu
kennzeichnen. Angenommen, der Store befindet sich unter @file{/gnu}, dann
können Sie das mit @code{restorecon -vR /gnu} bewerkstelligen oder durch
andere Mittel, die Ihr Betriebssystem Ihnen zur Verfügung stellt.

Wir könnten zum Zeitpunkt der Installation eine wesentlich restriktivere
Richtlinie generieren, für die nur @emph{genau derselbe} Dateiname des
gerade installierten @code{guix-daemon}-Programms als
@code{guix_daemon_exec_t} gekennzeichnet würde, statt einen vieles
umfassenden regulären Ausdruck zu benutzen. Aber dann müsste der
Administratornutzer zum Zeitpunkt der Installation jedes Mal die Richtlinie
installieren oder aktualisieren müssen, sobald das Guix-Paket aktualisiert
wird, dass das tatsächlich in Benutzung befindliche
@code{guix-daemon}-Programm enthält.
@end enumerate

@node AppArmor-Unterstützung
@subsection AppArmor-Unterstützung

@cindex AppArmor

Zu Guix gibt es ein AppArmor-Profil für den Erstellungsdaemon in
@file{etc/apparmor.d/guix-daemon}. Es kann auf Systemen mit restriktiven
AppArmor-Richtlinien installiert werden, damit er unprivilegiert laufen kann
(siehe @ref{Einrichten der Erstellungsumgebung}). Der unprivilegierte Daemon benutzt
nämlich Linux’ Benutzernamensräume (User Namespaces), aber die Rechte dazu
hat er nur mit einer AppArmor-Richtlinie auf bestimmten Systemen wie etwa
Ubuntu.

Sie können feststellen, ob Ihr System dazugehört, indem Sie nachsehen, ob
der Kernelparameter @code{kernel.apparmor_restrict_unprivileged_userns}
aktiv ist.

@subsubsection Installieren des AppArmor-Profils
@cindex AppArmor, Profilinstallation

@quotation Anmerkung
Wenn Sie mit dem Skript @code{guix-install.sh} die Installation aus einer
Binärdatei durchführen, wird Ihnen angeboten, die folgenden Schritte
automatisch durchzuführen (siehe @ref{Aus Binärdatei installieren}).
@end quotation

Führen Sie diese Befehle als der Administratornutzer root aus, um das Profil
zu installieren:

@example
export apparmor_sources=/var/guix/profiles/per-user/root/current-guix/etc/apparmor.d
cp -f -t /etc/apparmor.d/tunables "$apparmor_sources/tunables/guix"
cp -f -t /etc/apparmor.d "$apparmor_sources/guix-daemon"
cp -f -t /etc/apparmor.d "$apparmor_sources/guix"
apparmor_parser -r /etc/apparmor.d/guix-daemon
apparmor_parser -r /etc/apparmor.d/guix
@end example

Dadurch funktioniert der Daemon jetzt.

@node Aufruf des guix-daemon
@section Aufruf von @command{guix-daemon}
@cindex @command{guix-daemon}
Das Programm @command{guix-daemon} implementiert alle Funktionalitäten, um
auf den Store zuzugreifen. Dazu gehört das Starten von Erstellungsprozessen,
das Ausführen des Müllsammlers, das Abfragen, ob ein Erstellungsergebnis
verfügbar ist, etc. Normalerweise wird er so als Administratornutzer
(@code{root}) gestartet:

@example
# guix-daemon --build-users-group=guixbuild
@end example

@cindex Socket-Aktivierung, bei @command{guix-daemon}
Sie können den Daemon auch über das systemd-Protokoll zur
„Socket-Aktivierung“ starten (siehe @ref{Service De- and Constructors,
@code{make-systemd-constructor},, shepherd, The GNU Shepherd Manual}).

Details, wie Sie ihn einrichten, finden Sie im Abschnitt @ref{Den Daemon einrichten}.

@cindex chroot
@cindex Container, Erstellungsumgebung
@cindex Erstellungsumgebung
@cindex Reproduzierbare Erstellungen
Standardmäßig führt @command{guix-daemon} Erstellungsprozesse mit
unterschiedlichen UIDs aus, die aus der Erstellungsgruppe stammen, deren
Name mit @option{--build-users-group} übergeben wurde. Außerdem läuft jeder
Erstellungsprozess in einer chroot-Umgebung, die nur die Teilmenge des
Stores enthält, von der der Erstellungsprozess abhängt, entsprechend seiner
Ableitung (siehe @ref{Programmierschnittstelle, Ableitungen}), und ein paar
bestimmte Systemverzeichnisse, darunter standardmäßig auch @file{/dev} und
@file{/dev/pts}. Zudem ist die Erstellungsumgebung auf GNU/Linux eine
isolierte Umgebung, d.h.@: ein @dfn{Container}: Nicht nur hat sie ihren
eigenen Dateisystembaum, sie hat auch einen separaten Namensraum zum
Einhängen von Dateisystemen, ihren eigenen Namensraum für PIDs, für
Netzwerke, etc. Dies hilft dabei, reproduzierbare Erstellungen zu
garantieren (siehe @ref{Funktionalitäten}).

Wenn der Daemon im Auftrag des Nutzers eine Erstellung durchführt, erzeugt
er ein Erstellungsverzeichnis, entweder in @file{/tmp} oder im Verzeichnis,
das durch die Umgebungsvariable @env{TMPDIR} angegeben wurde. Dieses
Verzeichnis wird mit dem Container geteilt, solange die Erstellung noch
läuft, allerdings trägt es im Container stattdessen immer den Namen
„/tmp/guix-build-NAME.drv-0“.

Nach Abschluss der Erstellung wird das Erstellungsverzeichnis automatisch
entfernt, außer wenn die Erstellung fehlgeschlagen ist und der Client
@option{--keep-failed} angegeben hat (siehe @ref{Gemeinsame Erstellungsoptionen,
@option{--keep-failed}}).

Der Daemon lauscht auf Verbindungen und erstellt jeweils einen Unterprozess
für jede von einem Client begonnene Sitzung (d.h.@: von einem der
@command{guix}-Unterbefehle). Der Befehl @command{guix processes} zeigt
Ihnen eine Übersicht solcher Systemaktivitäten; damit werden Ihnen alle
aktiven Sitzungen und Clients gezeigt. Weitere Informationen finden Sie
unter @ref{Aufruf von guix processes}.

Die folgenden Befehlszeilenoptionen werden unterstützt:

@table @code
@item --build-users-group=@var{Gruppe}
Verwende die Benutzerkonten aus der @var{Gruppe}, um Erstellungsprozesse
auszuführen (siehe @ref{Den Daemon einrichten, Erstellungsbenutzer}).

@item --no-substitutes
@cindex Substitute
Benutze keine Substitute für Erstellungsergebnisse. Das heißt, dass alle
Objekte lokal erstellt werden müssen, und kein Herunterladen von vorab
erstellten Binärdateien erlaubt ist (siehe @ref{Substitute}).

Wenn der Daemon mit @option{--no-substitutes} ausgeführt wird, können
Clients trotzdem Substitute explizit aktivieren über den entfernten
Prozeduraufruf @code{set-build-options} (siehe @ref{Der Store}).

@anchor{daemon-substitute-urls}
@item --substitute-urls=@var{URLs}
@var{URLs} als standardmäßige, leerzeichengetrennte Liste der Quell-URLs für
Substitute benutzen. Wenn diese Befehlszeilenoption @emph{nicht} angegeben
wird, wird @indicateurl{@value{SUBSTITUTE-URLS}} verwendet.

Das hat zur Folge, dass Substitute von den @var{URLs} heruntergeladen werden
können, solange sie mit einer Signatur versehen sind, der vertraut wird
(siehe @ref{Substitute}).

Siehe @ref{Substitute von anderen Servern holen} für weitere
Informationen, wie der Daemon konfiguriert werden kann, um Substitute von
anderen Servern zu beziehen.

@cindex Auslagern
@item --no-offload
Nicht versuchen, an andere Maschinen ausgelagerte Erstellungen zu benutzen
(siehe @ref{Auslagern des Daemons einrichten}). Somit wird lokal erstellt, statt
Erstellungen auf entfernte Maschinen auszulagern.

@item --cache-failures
Fehler bei der Erstellung zwischenspeichern. Normalerweise werden nur
erfolgreiche Erstellungen gespeichert.

Wenn diese Befehlszeilenoption benutzt wird, kann @command{guix gc
--list-failures} benutzt werden, um die Menge an Store-Objekten abzufragen,
die als Fehlschläge markiert sind; @command{guix gc --clear-failures}
entfernt Store-Objekte aus der Menge zwischengespeicherter
Fehlschläge. Siehe @ref{Aufruf von guix gc}.

@item --cores=@var{n}
@itemx -c @var{n}
@var{n} CPU-Kerne zum Erstellen jeder Ableitung benutzen; @code{0} heißt, so
viele wie verfügbar sind.

Der Vorgabewert ist @code{0}, jeder Client kann jedoch eine abweichende
Anzahl vorgeben, zum Beispiel mit der Befehlszeilenoption @option{--cores}
von @command{guix build} (siehe @ref{Aufruf von guix build}).

Dadurch wird die Umgebungsvariable @env{NIX_BUILD_CORES} im
Erstellungsprozess definiert, welcher sie benutzen kann, um intern parallele
Ausführungen zuzulassen@tie{}– zum Beispiel durch Nutzung von @code{make
-j$NIX_BUILD_CORES}.

@item --max-jobs=@var{n}
@itemx -M @var{n}
Höchstenss @var{n} Erstellungsaufträge parallel bearbeiten. Der Vorgabewert
liegt bei @code{1}. Wird er auf @code{0} gesetzt, werden keine Erstellungen
lokal durchgeführt, stattdessen lagert der Daemon sie nur aus (siehe
@ref{Auslagern des Daemons einrichten}) oder sie schlagen einfach fehl.

@item --max-silent-time=@var{Sekunden}
Wenn der Erstellungs- oder Substitutionsprozess länger als
@var{Sekunden}-lang keine Ausgabe erzeugt, wird er abgebrochen und ein
Fehler beim Erstellen gemeldet.

Der Vorgabewert ist @code{3600} (eine Stunde).

Clients können einen anderen Wert als den hier angegebenen verwenden lassen
(siehe @ref{Gemeinsame Erstellungsoptionen, @option{--max-silent-time}}).

@item --timeout=@var{Sekunden}
Entsprechend wird hier der Erstellungs- oder Substitutionsprozess
abgebrochen und als Fehlschlag gemeldet, wenn er mehr als
@var{Sekunden}-lang dauert.

Vorgegeben sind 24 Stunden.

Clients können einen anderen Wert verwenden lassen (siehe @ref{Gemeinsame Erstellungsoptionen, @option{--timeout}}).

@item --rounds=@var{N}
Jede Ableitung @var{n}-mal hintereinander erstellen und einen Fehler melden,
wenn nacheinander ausgewertete Erstellungsergebnisse nicht Bit für Bit
identisch sind. Beachten Sie, dass Clients wie @command{guix build} einen
anderen Wert verwenden lassen können (siehe @ref{Aufruf von guix build}).

Wenn dies zusammen mit @option{--keep-failed} benutzt wird, bleiben die sich
unterscheidenden Ausgaben im Store unter dem Namen
@file{/gnu/store/…-check}. Dadurch können Unterschiede zwischen den beiden
Ergebnissen leicht erkannt werden.

@item --debug
Informationen zur Fehlersuche ausgeben.

Dies ist nützlich, um Probleme beim Starten des Daemons nachzuvollziehen;
Clients könn aber auch ein abweichenden Wert verwenden lassen, zum Beispiel
mit der Befehlszeilenoption @option{--verbosity} von @command{guix build}
(siehe @ref{Aufruf von guix build}).

@item --chroot-directory=@var{Verzeichnis}
Füge das @var{Verzeichnis} zum chroot von Erstellungen hinzu.

Dadurch kann sich das Ergebnis von Erstellungsprozessen ändern@tie{}– zum
Beispiel, wenn diese optionale Abhängigkeiten aus dem @var{Verzeichnis}
verwenden, wenn sie verfügbar sind, und nicht, wenn es fehlt. Deshalb ist es
nicht empfohlen, dass Sie diese Befehlszeilenoption verwenden, besser
sollten Sie dafür sorgen, dass jede Ableitung alle von ihr benötigten
Eingabgen deklariert.

@item --disable-chroot
Erstellungen ohne chroot durchführen.

@quotation Warnung
Diese Befehlszeilenoption zu benutzen, wird nicht empfohlen, denn dadurch
bekämen Erstellungsprozesse Zugriff auf nicht deklarierte Abhängigkeiten und
könnten allgemein alles machen, was mit der Autorität eines
Erstellungsbenutzers oder des Daemons getan werden darf@tie{}– das bedeutet
mindestens, dass jegliche Dateien im Store sabotiert werden können!

Aber wenn Linux’ unprivilegierte Benutzernamensräume nicht unterstützt
werden, bleibt Ihnen wohl keine andere Möglichkeit (siehe @ref{Einrichten der Erstellungsumgebung}). Benutzung auf eigene Gefahr!
@end quotation

@item --isolate-host-loopback
Verhindern, dass Erstellungen mit fester Ausgabe im Chroot auf die
Loopback-Schnittstelle des Wirtssystems zugreifen. Wenn diese
Befehlszeilenoption benutzt wird, bekommen Erstellungen mit fester Ausgabe
ihre eigene Loopback-Schnittstelle und wenn versucht wird, sich mit
127.0.0.1 oder ::1 zu verbinden, bauen sie stattdessen eine Verbindung zur
eigenen Loopback-Schnittstelle auf.

@item --log-compression=@var{Typ}
Erstellungsprotokolle werden entsprechend dem @var{Typ} komprimiert, der
entweder @code{gzip}, @code{bzip2} oder @code{none} (für keine Kompression)
sein muss.

Sofern nicht @option{--lose-logs} angegeben wurde, werden alle
Erstellungsprotokolle in der @var{localstatedir} gespeichert. Um Platz zu
sparen, komprimiert sie der Daemon standardmäßig automatisch mit gzip.

@item --discover[=yes|no]
Ob im lokalen Netzwerk laufende Substitutserver mit mDNS und DNS-SD
ermittelt werden sollen oder nicht.

Diese Funktionalität ist noch experimentell. Trotzdem sollten Sie bedenken:

@enumerate
@item
Es könnte schneller bzw.@: günstiger sein, als Substitute von entfernten
Servern zu beziehen.
@item
Es gibt keine Sicherheitsrisiken, weil nur echte Substitute benutzt werden
können (siehe @ref{Substitutauthentifizierung}).
@item
Wenn ein Angreifer Ihnen sein @command{guix publish} in Ihrem LAN mitteilt,
kann er Ihnen keine bösartigen Programmdateien unterjubeln, aber er kann
lernen, welche Software Sie installieren.
@item
Server können Ihnen Substitute über unverschlüsseltes HTTP anbieten, wodurch
auch jeder andere in Ihrem LAN vielleicht mitschneiden könnte, welche
Software Sie installieren.
@end enumerate

Das Erkennen von Substitutservern können Sie auch nachträglich zur Laufzeit
an- oder abschalten („on“ oder „off“), indem Sie dies ausführen:

@example
herd discover guix-daemon on
herd discover guix-daemon off
@end example

@item --disable-deduplication
@cindex Deduplizieren
Automatische Dateien-„Deduplizierung“ im Store ausschalten.

Standardmäßig werden zum Store hinzugefügte Objekte automatisch
„dedupliziert“: Wenn eine neue Datei mit einer anderen im Store
übereinstimmt, wird die neue Datei stattdessen als harte Verknüpfung auf die
andere Datei angelegt. Dies reduziert den Speicherverbrauch auf der Platte
merklich, jedoch steigt andererseits die Auslastung bei der Ein-/Ausgabe im
Erstellungsprozess geringfügig. Durch diese Option wird keine solche
Optimierung durchgeführt.

@item --gc-keep-outputs[=yes|no]
Gibt an, ob der Müllsammler (Garbage Collector, GC) die Ausgaben lebendiger
Ableitungen behalten muss („yes“) oder nicht („no“).

@cindex GC-Wurzeln
@cindex Müllsammlerwurzeln
Für @code{yes} behält der Müllsammler die Ausgaben aller lebendigen
Ableitungen im Store@tie{}– die @file{.drv}-Dateien. Der Vorgabewert ist
aber @code{no}, so dass Ableitungsausgaben nur vorgehalten werden, wenn sie
von einer Müllsammlerwurzel aus erreichbar sind. Siehe den Abschnitt
@ref{Aufruf von guix gc} für weitere Informationen zu Müllsammlerwurzeln.

@item --gc-keep-derivations[=yes|no]
Gibt an, ob der Müllsammler (GC) Ableitungen behalten muss („yes“), wenn sie
lebendige Ausgaben haben, oder nicht („no“).

Für @code{yes}, den Vorgabewert, behält der Müllsammler Ableitungen@tie{}–
z.B.@: @file{.drv}-Dateien@tie{}–, solange zumindest eine ihrer Ausgaben
lebendig ist. Dadurch können Nutzer den Ursprung der Dateien in ihrem Store
nachvollziehen. Setzt man den Wert auf @code{no}, wird ein bisschen weniger
Speicher auf der Platte verbraucht.

Auf diese Weise überträgt sich, wenn @option{--gc-keep-derivations} auf
@code{yes} steht, die Lebendigkeit von Ausgaben auf Ableitungen, und wenn
@option{--gc-keep-outputs} auf @code{yes} steht, die Lebendigkeit von
Ableitungen auf Ausgaben. Stehen beide auf @code{yes}, bleiben so alle
Erstellungsvoraussetzungen wie Quelldateien, Compiler, Bibliotheken und
andere Erstellungswerkzeuge lebendiger Objekte im Store erhalten, ob sie von
einer Müllsammlerwurzel aus erreichbar sind oder nicht. Entwickler können
sich so erneute Erstellungen oder erneutes Herunterladen sparen.

@item --impersonate-linux-2.6
Auf Linux-basierten Systemen wird hiermit vorgetäuscht, dass es sich um
Linux 2.6 handeln würde, indem der Kernel für einen
@command{uname}-Systemaufruf als Version der Veröffentlichung mit 2.6
antwortet.

Dies kann hilfreich sein, um Programme zu erstellen, die (normalerweise zu
Unrecht) von der Kernel-Versionsnummer abhängen.

@item --lose-logs
Keine Protokolle der Erstellungen vorhalten. Normalerweise würden solche in
@file{@var{localstatedir}/guix/log} gespeichert.

@item --system=@var{System}
Verwende @var{System} als aktuellen Systemtyp. Standardmäßig ist dies das
Paar aus Befehlssatz und Kernel, welches beim Aufruf von @code{configure}
erkannt wurde, wie zum Beispiel @code{x86_64-linux}.

@item --listen=@var{Endpunkt}
Lausche am @var{Endpunkt} auf Verbindungen. Dabei wird der @var{Endpunkt}
als Dateiname eines Unix-Sockets verstanden, wenn er mit einem @code{/}
(Schrägstrich) beginnt. Andernfalls wird der @var{Endpunkt} als Rechnername
(d.h.@: Hostname) oder als Rechnername-Port-Paar verstanden, auf dem
gelauscht wird. Hier sind ein paar Beispiele:

@table @code
@item --listen=/gnu/var/daemon
Lausche auf Verbindungen am Unix-Socket @file{/gnu/var/daemon}, falls nötig
wird er dazu erstellt.

@item --listen=localhost
@cindex Daemon, Fernzugriff
@cindex Fernzugriff auf den Daemon
@cindex Daemon, Einrichten auf Clustern
@cindex Cluster, Einrichtung des Daemons
Lausche auf TCP-Verbindungen an der Netzwerkschnittstelle, die
@code{localhost} entspricht, auf Port 44146.

@item --listen=128.0.0.42:1234
Lausche auf TCP-Verbindungen an der Netzwerkschnittstelle, die
@code{128.0.0.42} entspricht, auf Port 1234.
@end table

Diese Befehlszeilenoption kann mehrmals wiederholt werden. In diesem Fall
akzeptiert @command{guix-daemon} Verbindungen auf allen angegebenen
Endpunkten. Benutzer können bei Client-Befehlen angeben, mit welchem
Endpunkt sie sich verbinden möchten, indem sie die Umgebungsvariable
@env{GUIX_DAEMON_SOCKET} festlegen (siehe @ref{Der Store,
@env{GUIX_DAEMON_SOCKET}}).

@quotation Anmerkung
Das Daemon-Protokoll ist @emph{weder authentifiziert noch
verschlüsselt}. Die Benutzung von @option{--listen=@var{Rechner}} eignet
sich für lokale Netzwerke, wie z.B.@: in Rechen-Clustern, wo sich nur solche
Knoten mit dem Daemon verbinden, denen man vertraut. In Situationen, wo ein
Fernzugriff auf den Daemon durchgeführt wird, empfehlen wir, über
Unix-Sockets in Verbindung mit SSH zuzugreifen.
@end quotation

Wird @option{--listen} nicht angegeben, lauscht @command{guix-daemon} auf
Verbindungen auf dem Unix-Socket, der sich unter
@file{@var{localstatedir}/guix/daemon-socket/socket} befindet.
@end table


@node Anwendungen einrichten
@section Anwendungen einrichten

@cindex Fremddistribution
Läuft Guix aufgesetzt auf einer GNU/Linux-Distribution außer Guix
System@tie{}– einer sogenannten @dfn{Fremddistribution}@tie{}–, so sind ein
paar zusätzliche Schritte bei der Einrichtung nötig. Hier finden Sie manche
davon.

@subsection Locales

@anchor{locales-and-locpath}
@cindex Locales, nicht auf Guix System
@vindex LOCPATH
@vindex GUIX_LOCPATH
Über Guix installierte Pakete benutzen nicht die Daten zu Regions- und
Spracheinstellungen (Locales) des Wirtssystems. Stattdessen müssen Sie erst
eines der Locale-Pakete installieren, die für Guix verfügbar sind, und dann
den Wert Ihrer Umgebungsvariablen @env{GUIX_LOCPATH} passend festlegen:

@example
$ guix install glibc-locales
$ export GUIX_LOCPATH=$HOME/.guix-profile/lib/locale
@end example

Beachten Sie, dass das Paket @code{glibc-locales} Daten für alle von
GNU@tie{}libc unterstützten Locales enthält und deswegen um die 930@tie{}MiB
wiegt@footnote{Das @code{glibc-locales}-Paket fällt durch Deduplizierung im
Store nur noch mit 213@tie{}MiB ins Gewicht und nimmt auf einem
zstd-komprimierten Btrfs-Dateisystem dann nur 67@tie{}MiB weg.}. Wenn alles,
was Sie brauchen, einige wenige Locales sind, können Sie Ihr eigenes
Locale-Paket mit der Prozedur @code{make-glibc-utf8-locales} aus dem Modul
@code{(gnu packages base)} definieren. Folgendes Beispiel definiert ein
Paket mit den verschiedenen kanadischen UTF-8-Locales, die der GNU@tie{}libc
bekannt sind, das nur um die 14@tie{}MiB schwer ist:

@lisp
(use-modules (gnu packages base))

(define my-glibc-locales
  (make-glibc-utf8-locales
   glibc
   #:locales (list "en_CA" "fr_CA" "ik_CA" "iu_CA" "shs_CA")
   #:name "glibc-kanadische-utf8-locales"))
@end lisp

Die Variable @env{GUIX_LOCPATH} spielt eine ähnliche Rolle wie @env{LOCPATH}
(siehe @ref{Locale Names, @env{LOCPATH},, libc, Referenzhandbuch der
GNU-C-Bibliothek}). Es gibt jedoch zwei wichtige Unterschiede:

@enumerate
@item
@env{GUIX_LOCPATH} wird nur von der libc in Guix beachtet und nicht der von
Fremddistributionen bereitgestellten libc. Mit @env{GUIX_LOCPATH} können Sie
daher sicherstellen, dass die Programme der Fremddistribution keine
inkompatiblen Locale-Daten von Guix laden.

@item
libc hängt an jeden @env{GUIX_LOCPATH}-Eintrag @code{/X.Y} an, wobei
@code{X.Y} die Version von libc ist@tie{}– z.B.@: @code{2.22}. Sollte Ihr
Guix-Profil eine Mischung aus Programmen enthalten, die an verschiedene
libc-Versionen gebunden sind, wird jede nur die Locale-Daten im richtigen
Format zu laden versuchen.
@end enumerate

Das ist wichtig, weil das Locale-Datenformat verschiedener libc-Versionen
inkompatibel sein könnte.

@subsection Name Service Switch

@cindex Name Service Switch, glibc
@cindex NSS (Name Service Switch), glibc
@cindex @abbr{nscd, Name Service Cache Daemon}
Wenn Sie Guix auf einer Fremddistribution verwenden, @emph{empfehlen wir
stärkstens}, dass Sie den @dfn{Name Service Cache Daemon} der
GNU-C-Bibliothek, @command{nscd}, laufen lassen, welcher auf dem Socket
@file{/var/run/nscd/socket} lauschen sollte. Wenn Sie das nicht tun, könnten
mit Guix installierte Anwendungen Probleme beim Auflösen von Hostnamen
(d.h.@: Rechnernamen) oder Benutzerkonten haben, oder sogar abstürzen. Die
nächsten Absätze erklären warum.

@cindex @file{nsswitch.conf}
Die GNU-C-Bibliothek implementiert einen @dfn{Name Service Switch} (NSS),
welcher einen erweiterbaren Mechanismus zur allgemeinen „Namensauflösung“
darstellt: Hostnamensauflösung, Benutzerkonten und weiteres (siehe @ref{Name
Service Switch,,, libc, Referenzhandbuch der GNU-C-Bibliothek}).

@cindex Network Information Service (NIS)
@cindex NIS (Network Information Service)
Für die Erweiterbarkeit unterstützt der NSS @dfn{Plugins}, welche neue
Implementierungen zur Namensauflösung bieten: Zum Beispiel ermöglicht das
Plugin @code{nss-mdns} die Namensauflösung für @code{.local}-Hostnamen, das
Plugin @code{nis} gestattet die Auflösung von Benutzerkonten über den
Network Information Service (NIS) und so weiter. Diese zusätzlichen
„Auflösungsdienste“ werden systemweit konfiguriert in
@file{/etc/nsswitch.conf} und alle auf dem System laufenden Programme halten
sich an diese Einstellungen (siehe @ref{NSS Configuration File,,, libc,
GNU-C-Referenzhandbuch}).

Wenn sie eine Namensauflösung durchführen@tie{}– zum Beispiel, indem sie die
@code{getaddrinfo}-Funktion in C aufrufen@tie{}–, versuchen die Anwendungen
als Erstes, sich mit dem nscd zu verbinden; ist dies erfolgreich, führt nscd
für sie die weiteren Namensauflösungen durch. Falls nscd nicht läuft, führen
sie selbst die Namensauflösungen durch, indem sie die
Namensauflösungsdienste in ihren eigenen Adressraum laden und
ausführen. Diese Namensauflösungsdienste@tie{}– die
@file{libnss_*.so}-Dateien@tie{}– werden mit @code{dlopen} geladen, aber sie
kommen von der C-Bibliothek des Wirtssystems und nicht von der C-Bibliothek,
an die die Anwendung gebunden wurde (also der C-Bibliothek von Guix).

Und hier kommt es zum Problem: Wenn die Anwendung an die C-Bibliothek von
Guix (etwa glibc 2.24) gebunden wurde und die NSS-Plugins von einer anderen
C-Bibliothek (etwa @code{libnss_mdns.so} für glibc 2.22) zu laden versucht,
wird sie vermutlich abstürzen oder die Namensauflösungen werden unerwartet
fehlschlagen.

Durch das Ausführen von @command{nscd} auf dem System wird, neben anderen
Vorteilen, dieses Problem der binären Inkompatibilität vermieden, weil diese
@code{libnss_*.so}-Dateien vom @command{nscd}-Prozess geladen werden, nicht
in den Anwendungen selbst.

@cindex nsncd, Ersatz für nscd
Beachten Sie, dass auf manchen GNU/Linux-Distributionen wie Arch Linux
(Stand Dezember 2024) @command{nscd} nicht mehr angeboten
wird. @command{nsncd} kann ohne weitere Anpassungen als Ersatz dienen. Siehe
@uref{https://github.com/twosigma/nsncd, das Repository von nsncd} und
@uref{https://flokli.de/posts/2022-11-18-nsncd/, diesen Blog-Eintrag post}
für weitere Informationen.

@subsection X11-Schriftarten

@cindex Schriftarten
Die Mehrheit der grafischen Anwendungen benutzen Fontconfig zum Finden und
Laden von Schriftarten und für die Darstellung im X11-Client. Im Paket
@code{fontconfig} in Guix werden Schriftarten standardmäßig in
@file{$HOME/.guix-profile} gesucht. Um es grafischen Anwendungen, die mit
Guix installiert wurden, zu ermöglichen, Schriftarten anzuzeigen, müssen Sie
die Schriftarten auch mit Guix installieren. Essenzielle Pakete für
Schriftarten sind unter anderem @code{font-ghostscript}, @code{font-dejavu}
und @code{font-gnu-freefont}.

@cindex @code{fc-cache}
@cindex Font-Cache
Sobald Sie Schriftarten installiert oder wieder entfernt haben oder wenn
Ihnen auffällt, dass eine Anwendung Schriftarten nicht finden kann, dann
müssen Sie vielleicht Fontconfig installieren und den folgenden Befehl
ausführen, damit dessen Zwischenspeicher für Schriftarten aktualisiert wird:

@example
guix install fontconfig
fc-cache -rv
@end example

Um auf Chinesisch, Japanisch oder Koreanisch verfassten Text in grafischen
Anwendungen anzeigen zu können, möchten Sie vielleicht
@code{font-adobe-source-han-sans} oder @code{font-wqy-zenhei}
installieren. Ersteres hat mehrere Ausgaben, für jede Sprachfamilie eine
(siehe @ref{Pakete mit mehreren Ausgaben.}). Zum Beispiel installiert
folgender Befehl Schriftarten für chinesische Sprachen:

@example
guix install font-adobe-source-han-sans:cn
@end example

@cindex @code{xterm}
Ältere Programme wie @command{xterm} benutzen kein Fontconfig, sondern
X-Server-seitige Schriftartendarstellung. Solche Programme setzen voraus,
dass der volle Name einer Schriftart mit XLFD (X Logical Font Description)
angegeben wird, z.B.@: so:

@example
-*-dejavu sans-medium-r-normal-*-*-100-*-*-*-*-*-1
@end example

Um solche vollen Namen für die in Ihrem Guix-Profil installierten
TrueType-Schriftarten zu verwenden, müssen Sie den Pfad für Schriftarten
(Font Path) des X-Servers anpassen:

@c Note: 'xset' does not accept symlinks so the trick below arranges to
@c get at the real directory.  See <https://bugs.gnu.org/30655>.
@example
xset +fp $(dirname $(readlink -f ~/.guix-profile/share/fonts/truetype/fonts.dir))
@end example

@cindex @code{xlsfonts}
Danach können Sie den Befehl @code{xlsfonts} ausführen (aus dem Paket
@code{xlsfonts}), um sicherzustellen, dass dort Ihre TrueType-Schriftarten
aufgeführt sind.


@subsection X.509-Zertifikate

@cindex @code{nss-certs}
Das Paket @code{nss-certs} bietet X.509-Zertifikate, womit Programme die
Identität von Web-Servern authentifizieren können, auf die über HTTPS
zugegriffen wird.

Wenn Sie Guix auf einer Fremddistribution verwenden, können Sie dieses Paket
installieren und die relevanten Umgebungsvariablen festlegen, damit Pakete
wissen, wo sie Zertifikate finden. Unter @ref{X.509-Zertifikate} stehen
genaue Informationen.

@subsection Emacs-Pakete

@cindex @code{emacs}
Wenn Sie Emacs-Pakete mit Guix installieren, werden die Elisp-Dateien
innerhalb des Verzeichnisses @file{share/emacs/site-lisp/} in demjenigen
Profil platziert, wohin sie installiert werden. Die Elisp-Bibliotheken
werden in Emacs über die @env{EMACSLOADPATH}-Umgebungsvariable verfügbar
gemacht, die durch die Installation von Emacs eingerichtet wird.

@cindex guix-emacs-autoload-packages, Emacs-Pakete neu erkennen
Bei der Initialisierung von Emacs werden „Autoload“-Definitionen automatisch
über die Guix-spezifische Prozedur @code{guix-emacs-autoload-packages}
ausgewertet. Sie können diese Prozedur selbst interaktiv aufrufen, damit neu
installierte Emacs-Pakete erkannt werden, ohne Emacs neu zu starten. Wenn
Sie aber aus irgendeinem Grund die mit Guix installierten Pakete nicht
automatisch laden lassen möchten, können Sie Emacs mit der
Befehlszeilenoption @option{--no-site-file} starten (siehe @ref{Init File,,,
emacs, The GNU Emacs Manual}).

@quotation Anmerkung
Die meisten Varianten von Emacs sind mittlerweile in der Lage, Code nativ zu
kompilieren. Allerdings verhält sich Guix’ Emacs merklich anders als die
Voreinstellungen der Emacs-Macher.

Deren Emacs kompiliert Pakete bei Bedarf („just-in-time“) und legt die
Objektdateien („Shared Objects“) in einem eigenen Verzeichnis innerhalb
Ihres @code{user-emacs-directory}-Verzeichnisses an. Die Objektdateien darin
sind in einer flachen Hierarchie angeordnet und tragen Dateinamen mit zwei
Hashes, mit denen der ursprüngliche Dateiname und der Inhalt des Quellcodes
verifiziert werden.

Guix’ Emacs dagegen kompiliert seine Pakete bevorzugt im
Voraus. Objektdateien tragen im Wesentlichen den ursprünglichen Dateinamen
ohne zusätzliche Hashes, mit denen Name oder Inhalt verifiziert würde. Das
ermöglicht es, für Guix’ Emacs erstellte Pakete zu veredeln (siehe
@ref{Sicherheitsaktualisierungen, Veredelungen}) und obwohl Guix’ Emacs so auch die
hashbasierte Verifizierung des Quellcodes wie im Original-Emacs fehlt, kann
eine solche Benennung als Sicherheitsmaßnahme ohnehin leicht umgangen
werden. Daher schalten wir Just-in-time-Kompilieren ab.

Darüber hinaus sei erwähnt, dass @code{emacs-minimal}@tie{}– die
Emacs-Variante, mit der normalerweise Emacs-Pakete erstellt werden@tie{}–
weiterhin keine nativen Befehle generiert. Um native Befehle für Ihre
Emacs-Pakete schon im Voraus zu erzeugen, nutzen Sie eine Transformation,
z.B.@: @option{--with-input=emacs-minimal=emacs}.
@end quotation

@node Aktualisieren von Guix
@section Aktualisieren von Guix

@cindex Aktualisieren von Guix, auf einer Fremddistribution

Um Guix zu aktualisieren, führen Sie aus:

@example
guix pull
@end example

Siehe @ref{Aufruf von guix pull} für weitere Informationen.

@cindex Aktualisieren von Guix für den root-Administratornutzer, auf einer Fremddistribution
@cindex Aktualisieren des Guix-Daemon, auf einer Fremddistribution
@cindex @command{guix pull} für den root-Administratornutzer, auf einer Fremddistribution

Wenn Sie Guix auf einer Fremddistribution mit @file{guix-install.sh}
installiert haben, können Sie den Erstellungsdaemon aktualisieren, indem Sie
diesen Befehl:

@example
sudo -i guix pull
@end example

@noindent
gefolgt von diesem  ausführen (unter der Annahme, dass Ihre Distribution zur
Dienstverwaltung das systemd-Werkzeug benutzt):

@example
systemctl restart guix-daemon.service
@end example

So funktioniert es, wenn @file{guix-install.sh} benutzt wurde. Andernfalls
genügt es jedoch @emph{nicht}, wenn Sie Guix mit der Paketverwaltung einer
anderen Distribution installiert haben (etwa mit @command{sudo apt install
guix}, @command{pacman -S guix} oder ähnliche Befehle), weil auf vielen
Distributionen @file{guix-daemon.service} nur den von der Distribution
mitgelieferten Guix-Daemon ausführen wird.

Auf Sicherheitsaktualisierungen in Ihrer Distribution zu warten, ist
manchmal in Ordnung, aber Sicherheitslücken im Guix-Paket zu beheben, kostet
Distributionen viel Zeit, weil Guix Sicherheitslücken nicht nachträglich in
den Veröffentlichungen behebt, die die Distributionen benutzen. Im
Guix-Paket in den Versionen mancher Distributionen werden Lücken niemals
geschlossen.

Weil aber beim Aktualisieren von Guix auch ein neuer Daemon installiert
wird, können Sie einfach die Einstellungen Ihrer Distribution ändern, so
dass der bei Guix mitgelieferte guix-daemon verwendet wird. Im Folgenden
gehen wir davon aus, dass Ihre Distribution systemd benutzt.

Erst müssen Sie @file{guix-daemon.service} mit folgendem Befehl ersetzen:

@example
sudo install -m 644 \
     /lib/systemd/system/guix-daemon.service \
     /etc/systemd/system/guix-daemon.service
@end example

Danach müssen Sie @file{/etc/systemd/system/guix-daemon.service}
bearbeiten. Dazu öffnen Sie diese Datei in einem Texteditor mit
Administratorrechten:

@example
sudo $EDITOR /etc/systemd/system/guix-daemon.service
@end example

Dort halten Sie Ausschau nach einer Zeile mit @emph{ExecStart=}, die
ungefähr so aussehen dürfte:
@example
...
[Service]
ExecStart=/usr/bin/guix-daemon --build-users-group=_guixbuild
...
@end example

Ändern Sie @emph{/usr/bin/guix-daemon} dann zu
@emph{/var/guix/profiles/per-user/root/current-guix/bin/guix-daemon} und
speichern Sie die Änderungen.

Wenn Sie das erledigt haben, müssen Sie systemd mitteilen, dass
@emph{guix-daemon.service} ersetzt wurde.

@example
sudo systemctl daemon-reload
@end example

Sobald das erledigt ist, können Sie den Guix-Daemon genauso aktualisieren
wie wenn Sie Guix mit @file{guix-install.sh} installiert hätten:

@example
sudo -i guix pull
sudo systemctl restart guix-daemon.service
@end example

Auf Guix System wird der Daemon aktualisiert, indem Sie das System
rekonfigurieren (siehe @ref{Aufruf von guix system, @code{guix system
reconfigure}}).

Um eine bestehende Installation auf den @emph{unprivilegierten Daemon}
umzuziehen, damit @command{guix-daemon} nicht mehr mit dem
Administratorbenutzer root ausgeführt wird, siehe
@ref{unprivileged-daemon-migration}.

@c TODO What else?

@c *********************************************************************
@node Systeminstallation
@chapter Systeminstallation

@cindex Installieren von Guix System
@cindex Guix System, Installation
Dieser Abschnitt beschreibt, wie Sie „Guix System“ auf einer Maschine
installieren. Guix kann auch als Paketverwaltungswerkzeug ein bestehendes
GNU/Linux-System ergänzen, mehr dazu finden Sie im Abschnitt
@ref{Installation}.

@ifinfo
@quotation Anmerkung
@c This paragraph is for people reading this from tty2 of the
@c installation image.
Sie lesen diese Dokumentation mit einem Info-Betrachter. Details, wie Sie
ihn bedienen, erfahren Sie, indem Sie die Eingabetaste (auch „Return“ oder
„Enter“ genannt) auf folgender Verknüpfung drücken: @ref{Top,
Info-Betrachter,, info-stnd, Stand-alone GNU Info}. Drücken Sie danach
@kbd{l}, um hierher zurückzukommen.

Führen Sie alternativ @command{info info} auf einer anderen Konsole (tty)
aus, um dieses Handbuch offen zu lassen.
@end quotation
@end ifinfo

@menu
* Einschränkungen::          Was Sie erwarten dürfen.
* Hardware-Überlegungen::    Unterstützte Hardware.
* Installation von USB-Stick oder DVD::  Das Installationsmedium 
                                           vorbereiten.
* Vor der Installation::     Netzwerkanbindung, Partitionierung usw.
* Geführte grafische Installation::  Leichte grafische Installation.
* Manuelle Installation::    Manuelle Installation für Zauberer.
* Nach der Systeminstallation::  Wenn die Installation erfolgreich war.
* Guix in einer VM installieren::  Ein „Guix System“-Spielplatz.
* Ein Abbild zur Installation erstellen::  Wie ein solches entsteht.
@end menu

@node Einschränkungen
@section Einschränkungen

Wir denken, dass Guix System für viele Anwendungszwecke von Heim- und
Bürorechnern bis hin zu Servern geeignet ist. Die Verlässlichkeitsgarantien,
die es einem bietet@tie{}– transaktionelle Aktualisierungen und
Rücksetzungen, Reproduzierbarkeit@tie{}– machen es zu einer soliden
Grundlage.

Immer mehr Systemdienste sind verfügbar (siehe @ref{Dienste}).

Bevor Sie mit der Installation fortfahren, denken Sie daran, dass in der
Version @value{VERSION} vielleicht von Ihnen benötigte Dienste fehlen.

Dies soll allerdings nicht nur ein Hinweis sein, sondern auch als Einladung
aufgefasst werden, uns Fehler (und Erfolgsgeschichten!) zu melden und bei
uns mitzumachen, um Guix zu verbessern. Siehe den Abschnitt
@ref{Mitwirken}.


@node Hardware-Überlegungen
@section Hardware-Überlegungen

@cindex Hardwareunterstützung von Guix System
GNU@tie{}Guix legt den Fokus darauf, die Freiheit des Nutzers auf seinem
Rechner zu respektieren. Es baut auf Linux-libre als Kernel auf, wodurch nur
Hardware unterstützt wird, für die Treiber und Firmware existieren, die
freie Software sind. Heutzutage wird ein großer Teil der handelsüblichen
Hardware von GNU/Linux-libre unterstützt@tie{}– von Tastaturen bis hin zu
Grafikkarten, Scannern und Ethernet-Adaptern. Leider gibt es noch Bereiche,
wo die Hardwareanbieter ihren Nutzern die Kontrolle über ihren eigenen
Rechner verweigern. Solche Hardware wird von Guix System nicht unterstützt.

@cindex WLAN, Hardware-Unterstützung
Einer der wichtigsten Bereiche, wo es an freien Treibern und freier Firmware
mangelt, sind WLAN-Geräte. WLAN-Geräte, von denen wir wissen, dass sie
funktionieren, sind unter anderem solche, die die Atheros-Chips AR9271 und
AR7010 verbauen, welche der Linux-libre-Treiber @code{ath9k} unterstützt,
und die, die Broadcom/AirForce-Chips BCM43xx (mit Wireless-Core Revision 5)
verbauen, welche der Linux-libre-Treiber @code{b43-open} unterstützt. Freie
Firmware gibt es für beide und sie wird von Haus aus mit Guix System als ein
Teil von @code{%base-firmware} mitgeliefert (siehe @ref{„operating-system“-Referenz, @code{firmware}}).

Das Installationsprogramm zeigt zu Beginn eine Warnung an, wenn es Geräte
erkennt, die bekanntlich @emph{nicht} funktionieren, weil es keine freie
Firmware oder keine freien Treiber dafür gibt.

@cindex RYF, Respects Your Freedom
Die @uref{https://www.fsf.org/, Free Software Foundation} betreibt
@uref{https://www.fsf.org/ryf, @dfn{Respects Your Freedom}} (RYF), ein
Zertifizierungsprogramm für Hardware-Produkte, die Ihre Freiheit
respektieren, Datenschutz gewährleisten und sicherstellen, dass Sie die
Kontrolle über Ihr Gerät haben. Wir ermutigen Sie dazu, die Liste
RYF-zertifizierter Geräte zu beachten.

Eine weitere nützliche Ressource ist die Website
@uref{https://h-node.org/home/index/de, H-Node}. Dort steht ein Katalog von
Hardware-Geräten mit Informationen darüber, wie gut sie von GNU/Linux
unterstützt werden.


@node Installation von USB-Stick oder DVD
@section Installation von USB-Stick oder DVD

Sie können ein ISO-9660-Installationsabbild von
@indicateurl{@value{BASE-URL}/guix-system-install-@value{VERSION}.x86_64-linux.iso}
herunterladen, dass Sie auf einen USB-Stick aufspielen oder auf eine DVD
brennen können, wobei Sie anstelle von @code{x86_64-linux} eines der
folgenden schreiben können:

@table @code
@item x86_64-linux
für ein GNU/Linux-System auf Intel/AMD-kompatiblen 64-Bit-Prozessoren,

@item i686-linux
für ein 32-Bit-GNU/Linux-System auf Intel-kompatiblen Prozessoren.
@end table

@c start duplication of authentication part from ``Binary Installation''
Laden Sie auch die entsprechende @file{.sig}-Datei herunter und verifizieren
Sie damit die Authentizität Ihres Abbilds, indem Sie diese Befehle eingeben:

@example
$ wget @value{BASE-URL}/guix-system-install-@value{VERSION}.x86_64-linux.iso.sig
$ gpg --verify guix-system-install-@value{VERSION}.x86_64-linux.iso.sig
@end example

Falls dieser Befehl fehlschlägt, weil Sie nicht über den nötigen
öffentlichen Schlüssel verfügen, können Sie ihn mit diesem Befehl
importieren:

@example
$ wget @value{OPENPGP-SIGNING-KEY-URL} \
      -qO - | gpg --import -
@end example

@noindent
und den Befehl @code{gpg --verify} erneut ausführen.

Beachten Sie, dass eine Warnung wie „Dieser Schlüssel trägt keine
vertrauenswürdige Signatur!“ normal ist.

@c end duplication

Dieses Abbild enthält die Werkzeuge, die Sie zur Installation brauchen. Es
ist dafür gedacht,  @emph{so wie es ist} auf einen hinreichend großen
USB-Stick oder eine DVD kopiert zu werden.

@unnumberedsubsec Kopieren auf einen USB-Stick

Stecken Sie einen USB-Stick in Ihren Rechner ein, der mindestens 1@tie{}GiB
groß ist, und bestimmen Sie seinen Gerätenamen. Ist der Gerätename des
USB-Sticks @file{/dev/sdX}, dann kopieren Sie das Abbild mit dem Befehl:

@example
dd if=guix-system-install-@value{VERSION}.x86_64-linux.iso of=/dev/sdX status=progress
sync
@end example

Sie benötigen in der Regel Administratorrechte, um auf @file{/dev/sdX}
zuzugreifen.

@unnumberedsubsec Auf eine DVD brennen

Legen Sie eine unbespielte DVD in Ihren Rechner ein und bestimmen Sie ihren
Gerätenamen. Angenommen der Name des DVD-Laufwerks ist @file{/dev/srX},
kopieren Sie das Abbild mit:

@example
growisofs -dvd-compat -Z /dev/srX=guix-system-install-@value{VERSION}.x86_64-linux.iso
@end example

Der Zugriff auf @file{/dev/srX} setzt in der Regel Administratorrechte
voraus.

@unnumberedsubsec Das System starten

Sobald das erledigt ist, sollten Sie Ihr System neu starten und es vom
USB-Stick oder der DVD hochfahren („booten“) können. Dazu müssen Sie
wahrscheinlich beim Starten des Rechners in das BIOS- oder UEFI-Boot-Menü
gehen, von wo aus Sie auswählen können, dass vom USB-Stick gebootet werden
soll. Um aus Libreboot heraus zu booten, wechseln Sie in den Befehlsmodus,
indem Sie die @kbd{c}-Taste drücken, und geben Sie @command{search_grub usb}
ein.

Leider scheitert auf manchen Maschinen der Bootvorgang und Sie bekommen nach
dem Booten nur einen schwarzen Bildschirm zu sehen, selbst nachdem Sie zehn
Minuten lang gewartet haben. Das kann bedeuten, dass Ihre Maschine Guix
System nicht ausführen kann; vielleicht möchten Sie stattdessen Guix auf
einer Fremddistribution installieren (siehe @ref{Aus Binärdatei installieren}). Aber
es ist noch zu früh, um aufzugeben; womöglich lässt sich der schwarze
Bildschirm umgehen, indem Sie in GRUBs Bootmenü die Taste @kbd{e} drücken
und die Option @option{nomodeset} an die Linux-Bootzeile anhängen. In
manchen Fällen kann das Problem mit dem schwarzen Bildschirm auch gelöst
werden, indem Sie einen anderen Bildschirm anschließen.

Lesen Sie den Abschnitt @ref{Guix in einer VM installieren}, wenn Sie Guix System
stattdessen in einer virtuellen Maschine (VM) installieren möchten.


@node Vor der Installation
@section Vor der Installation

Wenn Sie Ihren Rechner gebootet haben, können Sie sich vom grafischen
Installationsprogramm durch den Installationsvorgang führen lassen, was den
Einstieg leicht macht (siehe @ref{Geführte grafische Installation}). Alternativ können Sie sich auch für einen „manuellen“
Installationsvorgang entscheiden, wenn Sie bereits mit GNU/Linux vertraut
sind und mehr Kontrolle haben möchten, als sie das grafische
Installationsprogramm bietet (siehe @ref{Manuelle Installation}).

Das grafische Installationsprogramm steht Ihnen auf TTY1 zur Verfügung. Auf
den TTYs 3 bis 6 können Sie vor sich eine Eingabeaufforderung für den
Administratornutzer „root“ sehen, nachdem Sie @kbd{strg-alt-f3},
@kbd{strg-alt-f4} usw.@: gedrückt haben. TTY2 zeigt Ihnen dieses Handbuch,
das Sie über die Tastenkombination @kbd{strg-alt-f2} erreichen. In dieser
Dokumentation können Sie mit den Steuerungsbefehlen Ihres Info-Betrachters
blättern (siehe @ref{Top,,, info-stnd, Stand-alone GNU Info}). Auf dem
Installationssystem läuft der GPM-Maus-Daemon, wodurch Sie Text mit der
linken Maustaste markieren und ihn mit der mittleren Maustaste einfügen
können.

@quotation Anmerkung
Für die Installation benötigen Sie Zugang zum Internet, damit fehlende
Abhängigkeiten Ihrer Systemkonfiguration heruntergeladen werden können. Im
Abschnitt „Netzwerkkonfiguration“ weiter unten finden Sie mehr Informationen
dazu.
@end quotation

@node Geführte grafische Installation
@section Geführte grafische Installation

Das grafische Installationsprogramm ist mit einer textbasierten
Benutzeroberfläche ausgestattet. Es kann Sie mit Dialogfeldern durch die
Schritte führen, mit denen Sie GNU@tie{}Guix System installieren.

Die ersten Dialogfelder ermöglichen es Ihnen, das System aufzusetzen, wie
Sie es bei der Installation benutzen: Sie können die Sprache und
Tastaturbelegung festlegen und die Netzwerkanbindung einrichten, die während
der Installation benutzt wird. Das folgende Bild zeigt den Dialog zur
Einrichtung der Netzwerkanbindung.

@image{images/installer-network,5in,, Netzwerkanbindung einrichten mit dem
grafischen Installationsprogramm}

Mit den danach kommenden Schritten können Sie Ihre Festplatte
partitionieren, wie im folgenden Bild gezeigt, und auswählen, ob Ihre
Dateisysteme verschlüsselt werden sollen oder nicht. Sie können Ihren
Rechnernamen und das Administratorpasswort (das „root“-Passwort) festlegen
und ein Benutzerkonto einrichten, und noch mehr.

@image{images/installer-partitions,5in,, Partitionieren mit dem grafischen
Installationsprogramm}

Beachten Sie, dass Sie mit dem Installationsprogramm jederzeit den aktuellen
Installationsschritt verlassen und zu einem vorherigen Schritt zurückkehren
können, wie Sie im folgenden Bild sehen können.

@image{images/installer-resume,5in,, Mit einem Installationsschritt
fortfahren}

Sobald Sie fertig sind, erzeugt das Installationsprogramm eine
Betriebssystemkonfiguration und zeigt sie an (siehe @ref{Das Konfigurationssystem nutzen}). Zu diesem Zeitpunkt können Sie auf „OK“ drücken und
die Installation wird losgehen. Ist sie erfolgreich, können Sie neu starten
und Ihr neues System genießen. Siehe @ref{Nach der Systeminstallation} für
Informationen, wie es weitergeht!


@node Manuelle Installation
@section Manuelle Installation

Dieser Abschnitt beschreibt, wie Sie GNU@tie{}Guix System auf manuelle Weise
auf Ihrer Maschine installieren. Diese Alternative setzt voraus, dass Sie
bereits mit GNU/Linux, der Shell und üblichen Administrationswerkzeugen
vertraut sind. Wenn Sie glauben, dass das nichts für Sie ist, dann möchten
Sie vielleicht das geführte grafische Installationsprogramm benutzen (siehe
@ref{Geführte grafische Installation}).

Das Installationssystem macht Eingabeaufforderungen auf den TTYs 3 bis 6
zugänglich, auf denen Sie als Administratornutzer Befehle eingeben können;
Sie erreichen diese, indem Sie die Tastenkombinationen @kbd{strg-alt-f3},
@kbd{strg-alt-f4} und so weiter benutzen. Es enthält viele übliche
Werkzeuge, mit denen Sie diese Aufgabe bewältigen können. Da es sich auch um
ein vollständiges „Guix System“-System handelt, können Sie aber auch andere
Pakete mit dem Befehl @command{guix package} nachinstallieren, wenn Sie sie
brauchen (siehe @ref{Aufruf von guix package}).

@menu
* Tastaturbelegung und Netzwerkanbindung und Partitionierung::  Vorab.
* Fortfahren mit der Installation::  Installieren.
@end menu

@node Tastaturbelegung und Netzwerkanbindung und Partitionierung
@subsection Tastaturbelegung, Netzwerkanbindung und Partitionierung

Bevor Sie das System installieren können, wollen Sie vielleicht die
Tastaturbelegung ändern, eine Netzwerkverbindung herstellen und die
Zielfestplatte partitionieren. Dieser Abschnitt wird Sie durch diese
Schritte führen.

@subsubsection Tastaturbelegung

@cindex Tastaturbelegung
Das Installationsabbild verwendet die US-amerikanische
QWERTY-Tastaturbelegung. Wenn Sie dies ändern möchten, können Sie den
@command{loadkeys}-Befehl benutzen. Mit folgendem Befehl würden Sie zum
Beispiel die Dvorak-Tastaturbelegung auswählen:

@example
loadkeys dvorak
@end example

Schauen Sie sich an, welche Dateien im Verzeichnis
@file{/run/current-system/profile/share/keymaps} stehen, um eine Liste
verfügbarer Tastaturbelegungen zu sehen. Wenn Sie mehr Informationen
brauchen, führen Sie @command{man loadkeys} aus.

@anchor{manual-installation-networking}
@subsubsection Netzwerkkonfiguration

Führen Sie folgenden Befehl aus, um zu sehen, wie Ihre
Netzwerkschnittstellen benannt sind:

@example
ifconfig -a
@end example

@noindent
…@: oder mit dem GNU/Linux-eigenen @command{ip}-Befehl:

@example
ip address
@end example

@c https://cgit.freedesktop.org/systemd/systemd/tree/src/udev/udev-builtin-net_id.c#n20
Der Name kabelgebundener Schnittstellen (engl. Interfaces) beginnt mit dem
Buchstaben @samp{e}, zum Beispiel heißt die dem ersten fest eingebauten
Ethernet-Adapter entsprechende Schnittstelle @samp{eno1}. Drahtlose
Schnittstellen werden mit einem Namen bezeichnet, der mit dem Buchstaben
@samp{w} beginnt, etwa @samp{w1p2s0}.

@table @asis
@item Kabelverbindung
Um ein kabelgebundenes Netzwerk einzurichten, führen Sie den folgenden
Befehl aus, wobei Sie statt @var{Schnittstelle} den Namen der
kabelgebundenen Schnittstelle eintippen, die Sie benutzen möchten.

@example
ifconfig @var{Schnittstelle} up
@end example

@noindent
…@: oder mit dem GNU/Linux-eigenen @command{ip}-Befehl:

@example
ip link set @var{Schnittstelle} up
@end example

@item Drahtlose Verbindung
@cindex WLAN
@cindex WiFi
Um Drahtlosnetzwerke einzurichten, können Sie eine Konfigurationsdatei für
das Konfigurationswerkzeug des @command{wpa_supplicant} schreiben (wo Sie
sie speichern, ist nicht wichtig), indem Sie eines der verfügbaren
Textbearbeitungsprogramme wie etwa @command{nano} benutzen:

@example
nano wpa_supplicant.conf
@end example

Zum Beispiel können Sie die folgende Formulierung in der Datei speichern,
die für viele Drahtlosnetzwerke funktioniert, sofern Sie die richtige SSID
und Passphrase für das Netzwerk eingeben, mit dem Sie sich verbinden
möchten:

@example
network=@{
  ssid="@var{meine-ssid}"
  key_mgmt=WPA-PSK
  psk="geheime Passphrase des Netzwerks"
@}
@end example

Starten Sie den Dienst für Drahtlosnetzwerke und lassen Sie ihn im
Hintergrund laufen, indem Sie folgenden Befehl eintippen (ersetzen Sie dabei
@var{Schnittstelle} durch den Namen der Netzwerkschnittstelle, die Sie
benutzen möchten):

@example
wpa_supplicant -c wpa_supplicant.conf -i @var{Schnittstelle} -B
@end example

Führen Sie @command{man wpa_supplicant} aus, um mehr Informationen zu
erhalten.
@end table

@cindex DHCP
Zu diesem Zeitpunkt müssen Sie sich eine IP-Adresse beschaffen. Auf einem
Netzwerk, wo IP-Adressen automatisch @i{via} DHCP zugewiesen werden, können
Sie das hier ausführen:

@example
dhclient -v @var{Schnittstelle}
@end example

Versuchen Sie, einen Server zu pingen, um zu prüfen, ob sie mit dem Internet
verbunden sind und alles richtig funktioniert:

@example
ping -c 3 gnu.org
@end example

Einen Internetzugang herzustellen, ist in jedem Fall nötig, weil das Abbild
nicht alle Software und Werkzeuge enthält, die nötig sein könnten.

@cindex Proxy, bei der Systeminstallation
Wenn HTTP- und HTTPS-Zugriffe bei Ihnen über einen Proxy laufen sollen,
führen Sie folgenden Befehl aus:

@example
herd set-http-proxy guix-daemon @var{URL}
@end example

@noindent
Dabei ist @var{URL} die URL des Proxys, zum Beispiel
@code{http://example.org:8118}.

@cindex Über SSH installieren
Wenn Sie möchten, können Sie die weitere Installation auch per Fernwartung
durchführen, indem Sie einen SSH-Server starten:

@example
herd start ssh-daemon
@end example

Vergewissern Sie sich vorher, dass Sie entweder ein Passwort mit
@command{passwd} festgelegt haben, oder dass Sie für OpenSSH eine
Authentifizierung über öffentliche Schlüssel eingerichtet haben, bevor Sie
sich anmelden.

@subsubsection Plattenpartitionierung

Sofern nicht bereits geschehen, ist der nächste Schritt, zu partitionieren
und dann die Zielpartition zu formatieren.

Auf dem Installationsabbild sind mehrere Partitionierungswerkzeuge zu
finden, einschließlich (siehe @ref{Overview,,, parted, GNU Parted User
Manual}), @command{fdisk} und @command{cfdisk}. Starten Sie eines davon und
partitionieren Sie Ihre Festplatte oder sonstigen Massenspeicher, wie Sie
möchten:

@example
cfdisk
@end example

Wenn Ihre Platte mit einer „GUID Partition Table“ (GPT) formatiert ist, und
Sie vorhaben, die BIOS-basierte Variante des GRUB-Bootloaders  zu
installieren (was der Vorgabe entspricht), stellen Sie sicher, dass eine
Partition als BIOS-Boot-Partition ausgewiesen ist (siehe @ref{BIOS
installation,,, grub, GNU GRUB manual}).

@cindex EFI, Installation
@cindex UEFI, Installation
@cindex ESP, EFI-Systempartition
Falls Sie stattdessen einen EFI-basierten GRUB installieren möchten, muss
auf der Platte eine FAT32-formatierte @dfn{EFI-Systempartition} (ESP)
vorhanden sein. Diese Partition kann unter dem Pfad @file{/boot/efi}
eingebunden („gemountet“) werden und die @code{esp}-Flag der Partition muss
gesetzt sein. Dazu würden Sie beispielsweise in @command{parted} eintippen:

@example
parted /dev/sda set 1 esp on
@end example

@quotation Anmerkung
@vindex grub-bootloader
@vindex grub-efi-bootloader
Falls Sie nicht wissen, ob Sie einen EFI- oder BIOS-basierten GRUB
installieren möchten: Wenn bei Ihnen das Verzeichnis
@file{/sys/firmware/efi} im Dateisystem existiert, möchten Sie vermutlich
eine EFI-Installation durchführen, wozu Sie in Ihrer Konfiguration
@code{grub-efi-bootloader} benutzen. Ansonsten sollten Sie den
BIOS-basierten GRUB benutzen, der mit @code{grub-bootloader} bezeichnet
wird.  Siehe @ref{Bootloader-Konfiguration}, wenn Sie mehr Informationen
über Bootloader brauchen.
@end quotation

Sobald Sie die Platte fertig partitioniert haben, auf die Sie installieren
möchten, müssen Sie ein Dateisystem auf Ihrer oder Ihren für Guix System
vorgesehenen Partition(en) erzeugen@footnote{Derzeit unterstützt Guix System
nur die Dateisystemtypen ext4, btrfs, JFS, F2FS und XFS@. Insbesondere
funktioniert Guix-Code, der Dateisystem-UUIDs und -Bezeichnungen ausliest,
nur auf diesen Dateisystemtypen.}. Wenn Sie eine ESP brauchen und dafür die
Partition @file{/dev/sda1} vorgesehen haben, müssen Sie diesen Befehl
ausführen:

@example
mkfs.fat -F32 /dev/sda1
@end example

Für das Wurzeldateisystem ist ext4 das am häufigsten genutzte Format. Andere
Dateisysteme, wie Btrfs, unterstützen Kompression, wovon berichtet wird, es
habe sich als sinnvolle Ergänzung zur Dateideduplikation erwiesen, die der
Daemon unabhängig vom Dateisystem bietet (siehe @ref{Aufruf des guix-daemon,
Deduplizieren}).

Geben Sie Ihren Dateisystemen auch besser eine Bezeichnung („Label“), damit
Sie sie zuverlässig wiedererkennen und später in den
@code{file-system}-Deklarationen darauf Bezug nehmen können (siehe @ref{Dateisysteme}). Dazu benutzen Sie typischerweise die Befehlszeilenoption
@code{-L} des Befehls @command{mkfs.ext4} oder entsprechende Optionen für
andere Befehle. Wenn wir also annehmen, dass @file{/dev/sda2} die Partition
ist, auf der Ihr Wurzeldateisystem (englisch „root“) wohnen soll, können Sie
dort mit diesem Befehl ein Dateisystem mit der Bezeichnung @code{my-root}
erstellen:

@example
mkfs.ext4 -L my-root /dev/sda2
@end example

@cindex verschlüsselte Partition
Falls Sie aber vorhaben, die Partition mit dem Wurzeldateisystem zu
verschlüsseln, können Sie dazu die Cryptsetup-/LUKS-Werkzeuge verwenden
(siehe @inlinefmtifelse{html, @uref{https://linux.die.net/man/8/cryptsetup,
@code{man cryptsetup}}, @code{man cryptsetup}}, um mehr darüber zu
erfahren).

Angenommen Sie wollen die Partition für das Wurzeldateisystem verschlüsselt
auf @file{/dev/sda2} installieren, dann brauchen Sie eine Befehlsfolge
ähnlich wie diese, um sie als LUKS-Partition zu formatieren:

@example
cryptsetup luksFormat /dev/sda2
cryptsetup open /dev/sda2 my-partition
mkfs.ext4 -L my-root /dev/mapper/my-partition
@end example

Sobald das erledigt ist, binden Sie dieses Dateisystem als Installationsziel
mit dem Einhängepunkt @file{/mnt} ein, wozu Sie einen Befehl wie hier
eintippen (auch hier unter der Annahme, dass @code{my-root} die Bezeichnung
des künftigen Wurzeldateisystems ist):

@example
mount LABEL=my-root /mnt
@end example

Binden Sie auch alle anderen Dateisysteme ein, die Sie auf dem Zielsystem
benutzen möchten, mit Einhängepunkten relativ zu diesem Pfad. Wenn Sie sich
zum Beispiel für einen Einhängepunkt @file{/boot/efi} für die
EFI-Systempartition entschieden haben, binden Sie sie jetzt als
@file{/mnt/boot/efi} ein, damit @code{guix system init} sie später findet.

Wenn Sie zudem auch vorhaben, eine oder mehrere Swap-Partitionen zu benutzen
(siehe @ref{Swap-Speicher}), initialisieren Sie diese nun mit
@command{mkswap}. Angenommen Sie haben eine Swap-Partition auf
@file{/dev/sda3}, dann würde der Befehl so lauten:

@example
mkswap /dev/sda3
swapon /dev/sda3
@end example

Alternativ können Sie eine Swap-Datei benutzen. Angenommen, Sie wollten die
Datei @file{/swapdatei} im neuen System als eine Swapdatei benutzen, dann
müssten Sie Folgendes ausführen@footnote{Dieses Beispiel wird auf vielen
Arten von Dateisystemen funktionieren (z.B.@: auf ext4). Auf Dateisystemen
mit Copy-on-Write (wie z.B.@: btrfs) können sich die nötigen Schritte
unterscheiden. Details finden Sie in der Dokumentation auf den
Handbuchseiten von @command{mkswap} und @command{swapon}.}:

@example
# Das bedeutet 10 GiB Swapspeicher. "count" anpassen zum Ändern.
dd if=/dev/zero of=/mnt/swapfile bs=1MiB count=10240
# Zur Sicherheit darf nur der Administrator lesen und schreiben.
chmod 600 /mnt/swapfile
mkswap /mnt/swapfile
swapon /mnt/swapfile
@end example

Bedenken Sie, dass, wenn Sie die Partition für das Wurzeldateisystem
(„root“) verschlüsselt und eine Swap-Datei in diesem Dateisystem wie oben
beschrieben erstellt haben, die Verschlüsselung auch die Swap-Datei schützt,
genau wie jede andere Datei in dem Dateisystem.

@node Fortfahren mit der Installation
@subsection Fortfahren mit der Installation

Wenn die Partitionen des Installationsziels bereit sind und dessen
Wurzeldateisystem unter @file{/mnt} eingebunden wurde, kann es losgehen mit
der Installation. Führen Sie zuerst aus:

@example
herd start cow-store /mnt
@end example

Dadurch wird @file{/gnu/store} copy-on-write, d.h.@: dorthin von Guix
erstellte Pakete werden in ihrer Installationsphase auf dem unter
@file{/mnt} befindlichen Zieldateisystem gespeichert, statt den
Arbeitsspeicher auszulasten. Das ist nötig, weil die erste Phase des Befehls
@command{guix system init} (siehe unten) viele Dateien nach
@file{/gnu/store} herunterlädt oder sie erstellt, Änderungen am
@file{/gnu/store} aber bis dahin wie das übrige Installationssystem nur im
Arbeitsspeicher gelagert werden konnten.

Als Nächstes müssen Sie eine Datei bearbeiten und dort eine Deklaration des
Betriebssystems, das Sie installieren möchten, hineinschreiben. Zu diesem
Zweck sind im Installationssystem drei Texteditoren enthalten. Wir
empfehlen, dass Sie GNU nano benutzen (siehe @ref{Top,,, nano, GNU nano
Manual}), welcher Syntax und zueinander gehörende Klammern hervorheben
kann. Andere mitgelieferte Texteditoren, die Sie benutzen können, sind mg
(ein Emacs-Klon) und nvi (ein Klon des ursprünglichen @command{vi}-Editors
von BSD). Wir empfehlen sehr, dass Sie diese Datei im Zieldateisystem der
Installation speichern, etwa als @file{/mnt/etc/config.scm}, weil Sie Ihre
Konfigurationsdatei im frisch installierten System noch brauchen werden.

Der Abschnitt @ref{Das Konfigurationssystem nutzen} gibt einen Überblick über
die Konfigurationsdatei. Die in dem Abschnitt diskutierten
Beispielkonfigurationen sind im Installationsabbild im Verzeichnis
@file{/etc/configuration} zu finden. Um also mit einer Systemkonfiguration
anzufangen, die einen grafischen Anzeigeserver (einen „Display-Server“ zum
Darstellen einer „Desktop“-Arbeitsumgebung) bietet, könnten Sie so etwas
ausführen:

@example
# mkdir /mnt/etc
# cp /etc/configuration/desktop.scm /mnt/etc/config.scm
# nano /mnt/etc/config.scm
@end example

Achten Sie darauf, was in Ihrer Konfigurationsdatei steht, und besonders auf
Folgendes:

@itemize
@item
Ihre @code{bootloader-configuration}-Form muss sich auf die Ziele beziehen,
auf die Sie GRUB installieren möchten. Sie sollte genau dann
@code{grub-bootloader} nennen, wenn Sie GRUB im alten BIOS-Modus
installieren, und für neuere UEFI-Systeme sollten Sie
@code{grub-efi-bootloader} nennen. Bei Altsystemen bezeichnet das
@code{targets}-Feld die Geräte wie @code{(list "/dev/sda")}, bei
UEFI-Systemen bezeichnet es die Pfade zu eingebundenen EFI-Partitionen (ESP)
wie @code{(list "/boot/efi")}; stellen Sie sicher, dass die Pfade
tatsächlich dort eingebunden sind und ein @code{file-system}-Eintrag dafür
in Ihrer Konfiguration festgelegt wurde.

@item
Dateisystembezeichnungen müssen mit den jeweiligen @code{device}-Feldern in
Ihrer @code{file-system}-Konfiguration übereinstimmen, sofern Sie in Ihrer
@code{file-system}-Konfiguration die Prozedur @code{file-system-label} für
ihre @code{device}-Felder benutzen.

@item
Gibt es verschlüsselte Partitionen oder RAID-Partitionen, dann müssen sie im
@code{mapped-devices}-Feld genannt werden (siehe @ref{Zugeordnete Geräte}).
@end itemize

Wenn Sie damit fertig sind, Ihre Konfigurationsdatei vorzubereiten, können
Sie das neue System initialisieren (denken Sie daran, dass zukünftige
Wurzeldateisystem muss unter @file{/mnt} wie bereits beschrieben eingebunden
sein):

@example
guix system init /mnt/etc/config.scm /mnt
@end example

@noindent
Dies kopiert alle notwendigen Dateien und installiert GRUB auf
@file{/dev/sdX}, sofern Sie nicht noch die Befehlszeilenoption
@option{--no-bootloader} benutzen. Weitere Informationen finden Sie im
Abschnitt @ref{Aufruf von guix system}. Der Befehl kann das Herunterladen oder
Erstellen fehlender Softwarepakete auslösen, was einige Zeit in Anspruch
nehmen kann.

Sobald der Befehl erfolgreich@tie{}– hoffentlich!@tie{}– durchgelaufen ist,
können Sie mit dem Befehl @command{reboot} das neue System booten
lassen. Der Administratornutzer @code{root} hat im neuen System zunächst ein
leeres Passwort, und Passwörter der anderen Nutzer müssen Sie später setzen,
indem Sie den Befehl @command{passwd} als @code{root} ausführen, außer Ihre
Konfiguration enthält schon Passwörter (siehe @ref{user-account-password,
Passwörter für Benutzerkonten}). Siehe @ref{Nach der Systeminstallation} für
Informationen, wie es weiter geht!


@node Nach der Systeminstallation
@section Nach der Systeminstallation

Sie haben es geschafft: Sie haben Guix System erfolgreich gebootet! Melden
Sie sich am System als der Nicht-@code{root}-Benutzer an, den Sie während
der Installation angelegt haben. Sie können Guix System aktualisieren, wann
Sie möchten, indem Sie das hier ausführen:

@example
guix pull
sudo guix system reconfigure /etc/config.scm
@end example

@noindent
Dadurch wird eine neue @dfn{Systemgeneration} aus den neuesten Paketen und
Diensten erstellt.

Werfen Sie nun einen Blick auf @ref{Einstieg in Guix System} und
besuchen Sie uns auf @code{#guix} auf dem Libera.Chat-IRC-Netzwerk oder auf
der Mailing-Liste @file{guix-devel@@gnu.org}, um uns Rückmeldung zu geben!


@node Guix in einer VM installieren
@section Guix in einer virtuellen Maschine installieren

@cindex virtuelle Maschine, Guix System installieren
@cindex Virtual Private Server (VPS)
@cindex VPS (Virtual Private Server)
Wenn Sie Guix System auf einer virtuellen Maschine (VM) oder einem „Virtual
Private Server“ (VPS) statt auf Ihrer echten Maschine installieren möchten,
ist dieser Abschnitt hier richtig für Sie.

Um eine virtuelle Maschine für @uref{https://qemu.org/,QEMU} aufzusetzen,
mit der Sie Guix System in ein „Disk-Image“ installieren können (also in
eine Datei mit einem Abbild eines Plattenspeichers), gehen Sie so vor:

@enumerate
@item
Zunächst laden Sie das Installationsabbild des Guix-Systems wie zuvor
beschrieben herunter und entpacken es (siehe @ref{Installation von USB-Stick oder DVD}).

@item
Legen Sie nun ein Disk-Image an, das das System nach der Installation
enthalten soll. Um ein qcow2-formatiertes Disk-Image zu erstellen, benutzen
Sie den Befehl @command{qemu-img}:

@example
qemu-img create -f qcow2 guix-system.img 50G
@end example

Die Datei, die Sie herausbekommen, wird wesentlich kleiner als 50 GB sein
(typischerweise kleiner als 1 MB), vergrößert sich aber, wenn der
virtualisierte Speicher gefüllt wird.

@item
Starten Sie das USB-Installationsabbild auf einer virtuellen Maschine:

@example
qemu-system-x86_64 -m 1024 -smp 1 -enable-kvm \
  -nic user,model=virtio-net-pci -boot menu=on,order=d \
  -drive file=guix-system.img \
  -drive media=cdrom,readonly=on,file=guix-system-install-@value{VERSION}.@var{System}.iso
@end example

@code{-enable-kvm} ist optional, verbessert die Rechenleistung aber
erheblich, siehe @ref{Guix in einer VM starten}.

@item
Sie sind nun in der virtuellen Maschine als Administratornutzer @code{root}
angemeldet und können mit der Installation wie gewohnt fortfahren. Folgen
Sie der Anleitung im Abschnitt @ref{Vor der Installation}.
@end enumerate

Wurde die Installation abgeschlossen, können Sie das System starten, das
sich nun als Abbild in der Datei @file{guix-system.img} befindet. Der
Abschnitt @ref{Guix in einer VM starten} erklärt, wie Sie das tun können.

@node Ein Abbild zur Installation erstellen
@section Ein Abbild zur Installation erstellen

@cindex Installationsabbild
Das oben beschriebene Installationsabbild wurde mit dem Befehl @command{guix
system} erstellt, genauer gesagt mit:

@example
guix system image -t iso9660 gnu/system/install.scm
@end example

Die Datei @file{gnu/system/install.scm} finden Sie im Quellbaum von
Guix. Schauen Sie sich die Datei und auch den Abschnitt @ref{Aufruf von guix system} an, um mehr Informationen über das Installationsabbild zu erhalten.

@section Abbild zur Installation für ARM-Rechner erstellen

Viele ARM-Chips funktionieren nur mit ihrer eigenen speziellen Variante des
@uref{https://www.denx.de/wiki/U-Boot/, U-Boot-Bootloaders}.

Wenn Sie ein Disk-Image erstellen und der Bootloader nicht anderweitig schon
installiert ist (auf einem anderen Laufwerk), ist es ratsam, ein Disk-Image
zu erstellen, was den Bootloader enthält, mit dem Befehl:

@example
guix system image --system=armhf-linux -e '((@@ (gnu system install) os-with-u-boot) (@@ (gnu system install) installation-os) "A20-OLinuXino-Lime2")'
@end example

@code{A20-OLinuXino-Lime2} ist der Name des Chips. Wenn Sie einen ungültigen
Namen eingeben, wird eine Liste möglicher Chip-Namen ausgegeben.


@c *********************************************************************
@node Einstieg
@chapter Einstieg

Wenn Sie in diesem Abschnitt angekommen sind, haben Sie vermutlich zuvor
entweder Guix auf einer fremden Distribution installiert (siehe
@ref{Installation}) oder Sie haben das eigenständige „Guix System“
installiert (siehe @ref{Systeminstallation}). Nun wird es Zeit für Sie,
Guix kennenzulernen. Darum soll es in diesem Abschnitt gehen. Wir möchten
Ihnen ein Gefühl vermitteln, wie sich Guix anfühlt.

Bei Guix geht es darum, Software zu installieren, also wollen Sie vermutlich
zunächst Software finden, die Sie haben möchten. Sagen wir, Sie suchen ein
Programm zur Textverarbeitung. Dann führen Sie diesen Befehl aus:

@example
guix search text editor
@end example

Durch diesen Befehl stoßen Sie auf eine Reihe passender @dfn{Pakete}. Für
jedes werden Ihnen der Name des Pakets, seine Version, eine Beschreibung und
weitere Informationen angezeigt. Sobald Sie das Paket gefunden haben, dass
Sie benutzen möchten, sagen wir mal Emacs (aha!), dann können Sie
weitermachen und es installieren (führen Sie diesen Befehl als normaler
Benutzer aus, @emph{Guix braucht hierfür keine Administratorrechte}!):

@example
guix install emacs
@end example

@cindex Profil
Sie haben soeben Ihr erstes Paket installiert, Glückwunsch! Das Paket ist
nun Teil Ihres voreingestellten Profils in @file{$HOME/.guix-profile}@tie{}–
ein @dfn{Profil} ist ein Verzeichnis, das installierte Pakete
enthält. Während Sie das getan haben, ist Ihnen wahrscheinlich aufgefallen,
dass Guix vorerstellte Programmbinärdateien herunterlädt, statt sie auf
Ihrem Rechner zu kompilieren, außer wenn Sie diese Funktionalität vorher
ausdrücklich @emph{abgeschaltet} haben. In diesem Fall ist Guix
wahrscheinlich noch immer mit der Erstellung beschäftigt. Siehe
@ref{Substitute} für mehr Informationen.

Wenn Sie @emph{nicht} Guix System benutzen, wird der Befehl @command{guix
install} diesen Hinweis ausgegeben haben:

@example
Hinweis: Vielleicht möchten Sie die nötigen Umgebungsvariablen
festlegen, indem Sie dies ausführen:

     GUIX_PROFILE="$HOME/.guix-profile"
     . "$GUIX_PROFILE/etc/profile"

Sie können sie auch mit `guix package --search-paths -p "$HOME/.guix-profile"' nachlesen.
@end example

Tatsächlich ist es erforderlich, dass Sie Ihrer Shell erst einmal mitteilen,
wo sich @command{emacs} und andere mit Guix installierte Programme
befinden. Wenn Sie die obigen zwei Zeilen in die Shell einfügen, wird genau
das bewerkstelligt: @code{$HOME/.guix-profile/bin}@tie{}– wo sich das
installierte Paket befindet@tie{}– wird in die @code{PATH}-Umgebungsvariable
eingefügt. Sie können diese zwei Zeilen in Ihre Shell hineinkopieren, damit
sie sich sofort auswirken, aber wichtiger ist, dass Sie sie in
@file{~/.bash_profile} kopieren (oder eine äquivalente Datei, wenn Sie
@emph{nicht} Bash benutzen), damit die Umgebungsvariablen nächstes Mal
gesetzt sind, wenn Sie wieder eine Shell öffnen. Das müssen Sie nur einmal
machen und es sorgt auch bei anderen Umgebungsvariablen mit Suchpfaden
dafür, dass die installierte Software gefunden wird. Wenn Sie zum Beispiel
@code{python} und Bibliotheken für Python installieren, wird
@env{GUIX_PYTHONPATH} definiert.

Sie können nun weitere Pakete installieren, wann immer Sie möchten. Um die
installierten Pakete aufzulisten, führen Sie dies aus:

@example
guix package --list-installed
@end example

Um ein Paket wieder zu entfernen, benutzen Sie wenig überraschend
@command{guix remove}. Guix hebt sich von anderen Paketverwaltern darin ab,
dass Sie jede Operation, die Sie durchgeführt haben, auch wieder
@dfn{zurücksetzen} können, egal ob @code{install}, @code{remove} oder
@code{upgrade}, indem Sie dies ausführen:

@example
guix package --roll-back
@end example

Das geht deshalb, weil jede Operation eigentlich als @dfn{Transaktion}
durchgeführt wird, die eine neue @dfn{Generation} erstellt. Über folgenden
Befehl bekommen Sie diese Generationen und den Unterschied zwischen ihnen
angezeigt:

@example
guix package --list-generations
@end example

Jetzt kennen Sie die Grundlagen der Paketverwaltung!

@quotation Vertiefung
Lesen Sie den Abschnitt zur @ref{Paketverwaltung} für mehr Informationen
dazu. Vielleicht gefällt Ihnen @dfn{deklarative} Paketverwaltung mit
@command{guix package --manifest}, die Verwaltung separater @dfn{Profile}
mit @option{--profile}, das Löschen alter Generationen und das „Müllsammeln“
(Garbage Collection) sowie andere raffinierte Funktionalitäten, die sich als
nützlich erweisen werden, wenn Sie sich länger mit Guix befassen. Wenn Sie
Software entwickeln, lernen Sie im Abschnitt @ref{Entwicklung} hilfreiche
Werkzeuge kennen. Und wenn Sie neugierig sind, wird Ihnen im Abschnitt
@ref{Funktionalitäten} ein Überblick gegeben, wie und nach welchen Prinzipien Guix
aufgebaut ist.

Es ist sogar möglich, die Konfiguration Ihrer gesamten @dfn{Persönlichen
Umgebung} mit Guix zu erledigen@tie{}– die „Dotfiles“, die in Ihrem
Persönlichen Verzeichnis einen Namen tragen, der mit einem Punkt beginnt,
außerdem eigene Dienste und Pakete für das Benutzerkonto. Diese Funktion
heißt Guix Home. Siehe @ref{Persönliche Konfiguration}, um mehr darüber zu
erfahren!
@end quotation

Sobald Sie eine Reihe von Paketen installiert haben, werden Sie diese
regelmäßig auf deren neueste und beste Version @emph{aktualisieren}
wollen. Dazu ist es erforderlich, dass Sie zunächst die neueste Version von
Guix und seiner Paketsammlung mit einem „Pull“ laden:

@example
guix pull
@end example

Das Endergebnis ist ein neuer @command{guix}-Befehl innerhalb von
@file{~/.config/guix/current/bin}. Sofern Sie nicht Guix System benutzen,
sollten Sie dem Hinweis Folge leisten, den Sie bei der ersten Ausführung von
@command{guix pull} angezeigt bekommen, d.h.@: ähnlich wie oben beschrieben,
fügen Sie diese zwei Zeilen in Ihr Terminal und Ihre @file{.bash_profile}
ein:

@example
GUIX_PROFILE="$HOME/.config/guix/current"
. "$GUIX_PROFILE/etc/profile"
@end example

@noindent
Ebenso müssen Sie Ihre Shell auf diesen neuen @command{guix}-Befehl
hinweisen:

@example
hash guix
@end example

Wenn das geschafft ist, benutzen Sie ein brandneues Guix. Jetzt können Sie
damit fortfahren, alle zuvor installierten Pakete zu aktualisieren:

@example
guix upgrade
@end example

Während dieser Befehl ausgeführt wird, werden Sie sehen, dass Binärdateien
heruntergeladen werden (vielleicht müssen manche Pakete auch auf Ihrem
Rechner erstellt werden). Letztendlich stehen Ihnen die aktualisierten
Pakete zur Verfügung. Falls eine der Aktualisierungen nicht Ihren Wünschen
entspricht, haben Sie immer auch die Möglichkeit, sie auf den alten Stand
zurückzusetzen!

Sie können sich anzeigen lassen, welche Version von Guix Sie genau
verwenden, indem Sie dies ausführen:

@example
guix describe
@end example

Die angezeigten Informationen sind @emph{alles, was nötig ist, um genau
dasselbe Guix zu installieren}. Damit können Sie zu einem anderen Zeitpunkt
oder auf einer anderen Maschine genau dieselbe Software nachbilden.

@quotation Vertiefung
Siehe @ref{Aufruf von guix pull} für weitere Informationen. Siehe
@ref{Kanäle} für Erklärungen, wie man zusätzliche @dfn{Kanäle} als
Paketquellen angibt, wie man Guix nachbilden kann, und mehr. Vielleicht
hilft Ihnen auch die @command{time-machine}-Funktion (siehe @ref{Aufruf von time-machine}).
@end quotation

Wenn Sie Guix System installieren, dürfte eines der ersten Dinge, das Sie
tun wollen, eine Aktualisierung Ihres Systems sein. Sobald Sie @command{guix
pull} ausgeführt haben, können Sie mit diesem Befehl das System
aktualisieren:

@example
sudo guix system reconfigure /etc/config.scm
@end example

Nach Abschluss läuft auf dem System die neueste Version seiner
Software-Pakete. Genau wie bei Paketen können Sie jederzeit @emph{das
gesamte System} auf eine vorherige Generation @emph{zurücksetzen}. Siehe
@ref{Einstieg in Guix System}, um zu erfahren, wie Sie das System
pflegen.

Jetzt wissen Sie genug, um anzufangen!

@quotation Weitere Ressourcen
Der Rest dieses Handbuchs stellt eine Referenz für alles rund um Guix
dar. Hier sind ein paar andere Ressourcen, die sich als nützlich erweisen
könnten:

@itemize
@item
Siehe @ref{Top,,, guix-cookbook.de, das GNU-Guix-Kochbuch} für eine Liste
von anleitungsartigen Rezepten zu einer Vielzahl von Anwendungszwecken.

@item
In der @uref{https://guix.gnu.org/guix-refcard.pdf, GNU Guix Reference Card}
sind in zwei Seiten die meisten Befehle und Befehlszeilenoptionen
aufgeführt, die Sie jemals brauchen werden.

@item
Auf dem Webauftritt gibt es @uref{https://guix.gnu.org/de/videos/,
Lehrvideos} zu Themen wie der alltäglichen Nutzung von Guix, wo man Hilfe
bekommt und wie man mitmachen kann.

@item
Siehe @ref{Dokumentation}, um zu erfahren, wie Sie von Ihrem Rechner aus auf
Dokumentation von Software zugreifen können.
@end itemize

Wir hoffen, dass Ihnen Guix genauso viel Spaß bereitet wie der Guix-Gemeinde
bei seiner Entwicklung!
@end quotation

@c *********************************************************************
@node Paketverwaltung
@chapter Paketverwaltung

@cindex Pakete
Der Zweck von GNU Guix ist, Benutzern die leichte Installation,
Aktualisierung und Entfernung von Software-Paketen zu ermöglichen, ohne dass
sie ihre Erstellungsprozeduren oder Abhängigkeiten kennen müssen. Guix kann
natürlich noch mehr als diese offensichtlichen Funktionalitäten.

Dieses Kapitel beschreibt die Hauptfunktionalitäten von Guix, sowie die von
Guix angebotenen Paketverwaltungswerkzeuge. Zusätzlich zu den im Folgenden
beschriebenen Befehlszeilen-Benutzerschnittstellen (siehe @ref{Aufruf von guix package, @code{guix package}}) können Sie auch mit der
Emacs-Guix-Schnittstelle (siehe @ref{Top,,, emacs-guix, Referenzhandbuch von
Emacs-Guix}) arbeiten, nachdem Sie das Paket @code{emacs-guix} installiert
haben (führen Sie zum Einstieg in Emacs-Guix den Emacs-Befehl @kbd{M-x
guix-help} aus):

@example
guix install emacs-guix
@end example

@menu
* Funktionalitäten::         Wie Guix Ihr Leben schöner machen wird.
* Aufruf von guix package::  Pakete installieren, entfernen usw.
* Substitute::               Vorerstelle Binärdateien herunterladen.
* Pakete mit mehreren Ausgaben.::  Ein Quellpaket, mehrere Ausgaben.
* Aufruf von guix locate::   Pakete finden, die eine Datei enthalten.
* Aufruf von guix gc::       Den Müllsammler laufen lassen.
* Aufruf von guix pull::     Das neueste Guix samt Distribution laden.
* Aufruf von time-machine::  Alte Guix-Versionen verwenden.
* Untergeordnete::           Mit einer anderen Version von Guix 
                               interagieren.
* Aufruf von guix describe::  Informationen über Ihre Guix-Version anzeigen.
* Aufruf von guix archive::  Import und Export von Store-Dateien.
@end menu

@node Funktionalitäten
@section Funktionalitäten

Wir nehmen hier an, dass Sie schon Ihre ersten Erfahrungen mit Guix gemacht
haben (siehe @ref{Einstieg}) und gerne einen Überblick darüber
bekommen würden, wie Guix im Detail funktioniert.

Wenn Sie Guix benutzen, landet jedes Paket schließlich im @dfn{Paket-Store}
in seinem eigenen Verzeichnis@tie{}– der Name ist ähnlich wie
@file{/gnu/store/xxx-package-1.2}, wobei @code{xxx} eine Zeichenkette in
Base32-Darstellung ist.

Statt diese Verzeichnisse direkt anzugeben, haben Nutzer ihr eigenes
@dfn{Profil}, welches auf diejenigen Pakete zeigt, die sie tatsächlich
benutzen wollen. Diese Profile sind im Persönlichen Verzeichnis des
jeweiligen Nutzers gespeichert als @code{$HOME/.guix-profile}.

Zum Beispiel installiert @code{alice} GCC 4.7.2. Dadurch zeigt dann
@file{/home/alice/.guix-profile/bin/gcc} auf
@file{/gnu/store/…-gcc-4.7.2/bin/gcc}. Auf demselben Rechner hat @code{bob}
bereits GCC 4.8.0 installiert. Das Profil von @code{bob} zeigt dann einfach
weiterhin auf @file{/gnu/store/…-gcc-4.8.0/bin/gcc}@tie{}– d.h.@: beide
Versionen von GCC koexistieren auf demselben System, ohne sich zu stören.

Der Befehl @command{guix package} ist das zentrale Werkzeug, um Pakete zu
verwalten (siehe @ref{Aufruf von guix package}). Es arbeitet auf dem eigenen
Profil jedes Nutzers und kann @emph{mit normalen Benutzerrechten} ausgeführt
werden.

@cindex Transaktionen
Der Befehl stellt die offensichtlichen Installations-, Entfernungs- und
Aktualisierungsoperationen zur Verfügung. Jeder Aufruf ist tatsächlich eine
eigene @emph{Transaktion}: Entweder die angegebene Operation wird
erfolgreich durchgeführt, oder gar nichts passiert. Wenn also der Prozess
von @command{guix package} während der Transaktion beendet wird, oder es zum
Stromausfall während der Transaktion kommt, dann bleibt der alte, nutzbare
Zustands des Nutzerprofils erhalten.

Zudem kann jede Pakettransaktion @emph{zurückgesetzt} werden
(Rollback). Wird also zum Beispiel durch eine Aktualisierung eine neue
Version eines Pakets installiert, die einen schwerwiegenden Fehler zur Folge
hat, können Nutzer ihr Profil einfach auf die vorherige Profilinstanz
zurücksetzen, von der sie wissen, dass sie gut lief. Ebenso unterliegt bei
Guix auch die globale Systemkonfiguration transaktionellen Aktualisierungen
und Rücksetzungen (siehe @ref{Einstieg in Guix System}).

Alle Pakete im Paket-Store können vom @emph{Müllsammler} (Garbage Collector)
gelöscht werden. Guix ist in der Lage, festzustellen, welche Pakete noch
durch Benutzerprofile referenziert werden, und entfernt nur diese, die
nachweislich nicht mehr referenziert werden (siehe @ref{Aufruf von guix gc}). Benutzer können auch ausdrücklich alte Generationen ihres Profils
löschen, damit die zugehörigen Pakete vom Müllsammler gelöscht werden
können.

@cindex reproducibility
@cindex Reproduzierbare Erstellungen
Guix verfolgt einen @dfn{rein funktionalen} Ansatz bei der Paketverwaltung,
wie er in der Einleitung beschrieben wurde (siehe @ref{Einführung}). Jedes
Paketverzeichnis im @file{/gnu/store} hat einen Hash all seiner bei der
Erstellung benutzten Eingaben im Namen@tie{}– Compiler, Bibliotheken,
Erstellungs-Skripts etc. Diese direkte Entsprechung ermöglicht es Benutzern,
eine Paketinstallation zu benutzen, die sicher dem aktuellen Stand ihrer
Distribution entspricht. Sie hilft auch dabei, die @dfn{Reproduzierbarkeit
der Erstellungen} zu maximieren: Dank den isolierten Erstellungsumgebungen,
die benutzt werden, resultiert eine Erstellung wahrscheinlich in bitweise
identischen Dateien, auch wenn sie auf unterschiedlichen Maschinen
durchgeführt wird (siehe @ref{Aufruf des guix-daemon, Container}).

@cindex Substitute
Auf dieser Grundlage kann Guix @dfn{transparent Binär- oder Quelldateien
ausliefern}. Wenn eine vorerstellte Binärdatei für ein
@file{/gnu/store}-Objekt von einer externen Quelle verfügbar ist@tie{}– ein
@dfn{Substitut}@tie{}–, lädt Guix sie einfach herunter und entpackt sie,
andernfalls erstellt Guix das Paket lokal aus seinem Quellcode (siehe
@ref{Substitute}). Weil Erstellungsergebnisse normalerweise Bit für Bit
reproduzierbar sind, müssen die Nutzer den Servern, die Substitute anbieten,
nicht blind vertrauen; sie können eine lokale Erstellung erzwingen und
Substitute @emph{anfechten} (siehe @ref{Aufruf von guix challenge}).

Kontrolle über die Erstellungsumgebung ist eine auch für Entwickler
nützliche Funktionalität. Der Befehl @command{guix shell} ermöglicht es
Entwicklern eines Pakets, schnell die richtige Entwicklungsumgebung für ihr
Paket einzurichten, ohne manuell die Abhängigkeiten des Pakets in ihr Profil
installieren zu müssen (siehe @ref{Aufruf von guix shell}).

@cindex Nachbildung, von Software-Umgebungen
@cindex Provenienzverfolgung, von Software-Artefakten
Ganz Guix und all seine Paketdefinitionen stehen unter Versionskontrolle und
@command{guix pull} macht es möglich, auf dem Verlauf der Entwicklung von
Guix selbst „in der Zeit zu reisen“ (siehe @ref{Aufruf von guix pull}). Dadurch kann eine Instanz von Guix auf einer anderen Maschine oder
zu einem späteren Zeitpunkt genau nachgebildet werden, wodurch auch
@emph{vollständige Software-Umgebungen gänzlich nachgebildet} werden können,
mit genauer @dfn{Provenienzverfolgung}, wo diese Software herkommt.

@node Aufruf von guix package
@section @command{guix package} aufrufen

@cindex Installieren von Paketen
@cindex Entfernen von Paketen
@cindex Paketinstallation
@cindex Paketentfernung
@cindex Profil
@cindex @command{guix package}
Der Befehl @command{guix package} ist ein Werkzeug, womit Nutzer Pakete
installieren, aktualisieren, entfernen und auf vorherige Konfigurationen
zurücksetzen können. Diese Operationen arbeiten auf einem
@dfn{Benutzerprofil}, d.h.@: einem Verzeichnis, das installierte Pakete
enthält. Jeder Benutzer verfügt über ein Standardprofil in
@file{$HOME/.guix-profile}. Dabei wird nur das eigene Profil des Nutzers
verwendet, und es funktioniert mit normalen Benutzerrechten, ohne
Administratorrechte (siehe @ref{Funktionalitäten}). Die Syntax ist:

@example
guix package @var{Optionen}
@end example

@cindex Transaktionen
In erster Linie geben die @var{Optionen} an, welche Operationen in der
Transaktion durchgeführt werden sollen. Nach Abschluss wird ein neues Profil
erzeugt, aber vorherige @dfn{Generationen} des Profils bleiben verfügbar,
falls der Benutzer auf sie zurückwechseln will.

Um zum Beispiel @code{lua} zu entfernen und @code{guile} und
@code{guile-cairo} in einer einzigen Transaktion zu installieren:

@example
guix package -r lua -i guile guile-cairo
@end example

@cindex Alias-Namen für @command{guix package}
Um es Ihnen einfacher zu machen, bieten wir auch die folgenden Alias-Namen
an:

@itemize
@item
@command{guix search} ist eine andere Schreibweise für @command{guix package
-s},
@item
@command{guix install} ist eine andere Schreibweise für @command{guix
package -i},
@item
@command{guix remove} ist eine andere Schreibweise für @command{guix package
-r},
@item
@command{guix upgrade} ist eine andere Schreibweise für @command{guix
package -u}
@item
und @command{guix show} ist eine andere Schreibweise für @command{guix
package --show=}.
@end itemize

Diese Alias-Namen sind weniger ausdrucksstark als @command{guix package} und
stellen weniger Befehlszeilenoptionen bereit, deswegen werden Sie vermutlich
manchmal @command{guix package} direkt benutzen wollen.

@command{guix package} unterstützt auch ein @dfn{deklaratives Vorgehen},
wobei der Nutzer die genaue Menge an Paketen, die verfügbar sein sollen,
festlegt und über die Befehlszeilenoption @option{--manifest} übergibt
(siehe @ref{profile-manifest, @option{--manifest}}).

@cindex Profil
Für jeden Benutzer wird automatisch eine symbolische Verknüpfung zu seinem
Standardprofil angelegt als @file{$HOME/.guix-profile}. Diese symbolische
Verknüpfung zeigt immer auf die aktuelle Generation des Standardprofils des
Benutzers. Somit können Nutzer @file{$HOME/.guix-profile/bin} z.B.@: zu
ihrer Umgebungsvariablen @env{PATH} hinzufügen.
@cindex Suchpfade
Wenn Sie @emph{nicht} Guix System benutzen, sollten Sie in Betracht ziehen,
folgende Zeilen zu Ihrem @file{~/.bash_profile} hinzuzufügen (siehe
@ref{Bash Startup Files,,, bash, Referenzhandbuch von GNU Bash}), damit in
neu erzeugten Shells alle Umgebungsvariablen richtig definiert werden:

@example
GUIX_PROFILE="$HOME/.guix-profile" ; \
source "$GUIX_PROFILE/etc/profile"
@end example

Ist Ihr System für mehrere Nutzer eingerichtet, werden Nutzerprofile an
einem Ort gespeichert, der als @dfn{Müllsammlerwurzel} registriert ist, auf
die @file{$HOME/.guix-profile} zeigt (siehe @ref{Aufruf von guix gc}). Dieses
Verzeichnis ist normalerweise
@code{@var{localstatedir}/guix/profiles/per-user/@var{Benutzer}}, wobei
@var{localstatedir} der an @code{configure} als @option{--localstatedir}
übergebene Wert ist und @var{Benutzer} für den jeweiligen Benutzernamen
steht. Das @file{per-user}-Verzeichnis wird erstellt, wenn
@command{guix-daemon} gestartet wird, und das Unterverzeichnis
@var{Benutzer} wird durch @command{guix package} erstellt.

Als @var{Optionen} kann vorkommen:

@table @code

@item --install=@var{Paket} …
@itemx -i @var{Paket} …
Die angegebenen @var{Paket}e installieren.

Jedes @var{Paket} kann einfach durch seinen Paketnamen aufgeführt werden,
wie @code{guile}, optional gefolgt von einem At-Zeichen @@ und einer
Versionsnummer, wie @code{guile@@3.0.7} oder auch nur @code{guile@@3.0}. In
letzterem Fall wird die neueste Version mit Präfix @code{3.0} ausgewählt.

Wird keine Versionsnummer angegeben, wird die neueste verfügbare Version
ausgewählt. Zudem kann in der Spezifikation von @var{Paket} ein Doppelpunkt
auftauchen, gefolgt vom Namen einer der Ausgaben des Pakets, wie
@code{gcc:doc} oder @code{binutils@@2.22:lib} (siehe @ref{Pakete mit mehreren Ausgaben.}).

Pakete mit zugehörigem Namen (und optional der Version) werden unter den
Modulen der GNU-Distribution gesucht (siehe @ref{Paketmodule}).

Alternativ können Sie für @var{Paket} auch einen Dateinamen aus dem Store
direkt angeben, etwa @file{/gnu/store/…-guile-3.0.7}. Den Dateinamen
erfahren Sie zum Beispiel mit @code{guix build}.

@cindex propagierte Eingaben
Manchmal haben Pakete @dfn{propagierte Eingaben}: Als solche werden
Abhängigkeiten bezeichnet, die automatisch zusammen mit dem angeforderten
Paket installiert werden (im Abschnitt @ref{package-propagated-inputs,
@code{propagated-inputs} in @code{package}-Objekten} sind weitere
Informationen über propagierte Eingaben in Paketdefinitionen zu finden).

@anchor{package-cmd-propagated-inputs}
Ein Beispiel ist die GNU-MPC-Bibliothek: Ihre C-Headerdateien verweisen auf
die der GNU-MPFR-Bibliothek, welche wiederum auf die der GMP-Bibliothek
verweisen. Wenn also MPC installiert wird, werden auch die MPFR- und
GMP-Bibliotheken in das Profil installiert; entfernt man MPC, werden auch
MPFR und GMP entfernt@tie{}– außer sie wurden noch auf andere Art
ausdrücklich vom Nutzer installiert.

Abgesehen davon setzen Pakete manchmal die Definition von Umgebungsvariablen
für ihre Suchpfade voraus (siehe die Erklärung von @option{--search-paths}
weiter unten). Alle fehlenden oder womöglich falschen Definitionen von
Umgebungsvariablen werden hierbei gemeldet.

@item --install-from-expression=@var{Ausdruck}
@itemx -e @var{Ausdruck}
Das Paket installieren, zu dem der @var{Ausdruck} ausgewertet wird.

Beim @var{Ausdruck} muss es sich um einen Scheme-Ausdruck handeln, der zu
einem @code{<package>}-Objekt ausgewertet wird. Diese Option ist besonders
nützlich, um zwischen gleichnamigen Varianten eines Pakets zu unterscheiden,
durch Ausdrücke wie @code{(@@ (gnu packages commencement) guile-final)}.

Beachten Sie, dass mit dieser Option die erste Ausgabe des angegebenen
Pakets installiert wird, was unzureichend sein kann, wenn eine bestimmte
Ausgabe eines Pakets mit mehreren Ausgaben gewünscht ist.

@item --install-from-file=@var{Datei}
@itemx -f @var{Datei}
Das Paket installieren, zu dem der Code in der @var{Datei} ausgewertet wird.

Zum Beispiel könnte die @var{Datei} eine Definition wie diese enthalten
(siehe @ref{Pakete definieren}):

@lisp
@include package-hello.scm
@end lisp

Entwickler könnten es für nützlich erachten, eine solche
@file{guix.scm}-Datei im Quellbaum ihres Projekts abzulegen, mit der
Zwischenstände der Entwicklung getestet und reproduzierbare
Erstellungsumgebungen aufgebaut werden können (siehe @ref{Aufruf von guix shell}).

Es ist auch möglich, eine @var{Datei} mit einer JSON-Repräsentation von
einer oder mehr Paketdefinitionen anzugeben. Wenn Sie @code{guix package -f}
auf @file{hello.json} mit folgendem Inhalt ausführen würden, würde das Paket
@code{greeter} installiert, nachdem @code{myhello} erstellt wurde:

@example
@verbatiminclude package-hello.json
@end example

@item --remove=@var{Paket} …
@itemx -r @var{Paket} …
Die angegebenen @var{Paket}e entfernen.

Wie auch bei @option{--install} kann jedes @var{Paket} neben dem Paketnamen
auch eine Versionsnummer und/oder eine Ausgabe benennen. Zum Beispiel würde
@samp{-r glibc:debug} die @code{debug}-Ausgabe von @code{glibc} aus dem
Profil entfernen.

@item --upgrade[=@var{Regexp} …]
@itemx -u [@var{Regexp} …]
@cindex Pakete aktualisieren
Alle installierten Pakete aktualisieren. Wenn einer oder mehr reguläre
Ausdrücke (Regexps) angegeben wurden, werden nur diejenigen installierten
Pakete aktualisiert, deren Name zu einer der @var{Regexp}s passt. Siehe auch
weiter unten die Befehlszeilenoption @option{--do-not-upgrade}.

Beachten Sie, dass das Paket so auf die neueste Version unter den Paketen
gebracht wird, die in der aktuell installierten Distribution vorliegen. Um
jedoch Ihre Distribution zu aktualisieren, sollten Sie regelmäßig
@command{guix pull} ausführen (siehe @ref{Aufruf von guix pull}).

@cindex Paketumwandlungen, Aktualisierung
Wenn Sie Ihre Pakete aktualisieren, werden die bei der Erstellung des
vorherigen Profils angewandten Paketumwandlungen automatisch erneut angwandt
(siehe @ref{Paketumwandlungsoptionen}). Nehmen wir zum Beispiel an,
Sie haben zuerst Emacs von der Spitze seines Entwicklungs-Branches
installiert:

@example
guix install emacs-next --with-branch=emacs-next=master
@end example

Wenn Sie das nächste Mal @command{guix upgrade} ausführen, lädt Guix von
neuem die Spitze des Emacs-Entwicklungsbranches, um aus diesem Checkout
@code{emacs-next} zu erstellen.

Beachten Sie, dass Umwandlungsoptionen wie @option{--with-branch} und
@option{--with-source} von externem Zustand abhängen. Es liegt an Ihnen,
sicherzustellen, dass sie wie erwartet funktionieren. Sie können auf Pakete
angewandte Umwandlungen auch weglassen, indem Sie das ausführen:

@example
guix install @var{Paket}
@end example

@item --do-not-upgrade[=@var{Regexp} …]
In Verbindung mit der Befehlszeilenoption @option{--upgrade}, führe
@emph{keine} Aktualisierung von Paketen durch, deren Name zum regulären
Ausdruck @var{Regexp} passt. Um zum Beispiel alle Pakete im aktuellen Profil
zu aktualisieren mit Ausnahme derer, die „emacs“ im Namen haben:

@example
$ guix package --upgrade . --do-not-upgrade emacs
@end example

@item @anchor{profile-manifest}--manifest=@var{Datei}
@itemx -m @var{Datei}
@cindex Profildeklaration
@cindex Profilmanifest
Erstellt eine neue Generation des Profils aus dem vom Scheme-Code in
@var{Datei} gelieferten Manifest-Objekt. Wenn diese Befehlszeilenoption
mehrmals wiederholt angegeben wird, werden die Manifeste aneinandergehängt.

Dadurch könnrn Sie den Inhalt des Profils @emph{deklarieren}, statt ihn
durch eine Folge von Befehlen wie @option{--install} u.Ä.@: zu
generieren. Der Vorteil ist, dass die @var{Datei} unter Versionskontrolle
gestellt werden kann, auf andere Maschinen zum Reproduzieren desselben
Profils kopiert werden kann und Ähnliches.

Der Code in der @var{Datei} muss ein @dfn{Manifest}-Objekt liefern, was
ungefähr einer Liste von Paketen entspricht:

@findex packages->manifest
@lisp
(use-package-modules guile emacs)

(packages->manifest
 (list emacs
       guile-2.0
       ;; Eine bestimmte Paketausgabe nutzen.
       (list guile-2.0 "debug")))
@end lisp

Siehe @ref{Manifeste verfassen} für Informationen dazu, wie man ein Manifest
schreibt. Siehe @ref{export-manifest, @option{--export-manifest}}, um zu
erfahren, wie Sie aus einem bestehenden Profil eine Manifestdatei erzeugen
können.

@item --roll-back
@cindex Rücksetzen
@cindex Zurücksetzen von Transaktionen
@cindex Transaktionen, zurücksetzen
Wechselt zur vorherigen @dfn{Generation} des Profils zurück@tie{}– d.h.@:
macht die letzte Transaktion rückgängig.

In Verbindung mit Befehlszeilenoptionen wie @option{--install} wird zuerst
zurückgesetzt, bevor andere Aktionen durchgeführt werden.

Ein Rücksetzen der ersten Generation, die installierte Pakete enthält,
wechselt das Profil zur @dfn{nullten Generation}, die keinerlei Dateien
enthält, abgesehen von Metadaten über sich selbst.

Nach dem Zurücksetzen überschreibt das Installieren, Entfernen oder
Aktualisieren von Paketen vormals zukünftige Generationen, d.h.@: der
Verlauf der Generationen eines Profils ist immer linear.

@item --switch-generation=@var{Muster}
@itemx -S @var{Muster}
@cindex Generationen
Wechselt zu der bestimmten Generation, die durch das @var{Muster} bezeichnet
wird.

Als @var{Muster} kann entweder die Nummer einer Generation oder eine Nummer
mit vorangestelltem „+“ oder „-“ dienen. Letzteres springt die angegebene
Anzahl an Generationen vor oder zurück. Zum Beispiel kehrt
@option{--switch-generation=+1} nach einem Zurücksetzen wieder zur neueren
Generation zurück.

Der Unterschied zwischen @option{--roll-back} und
@option{--switch-generation=-1} ist, dass @option{--switch-generation} keine
nullte Generation erzeugen wird; existiert die angegebene Generation nicht,
bleibt schlicht die aktuelle Generation erhalten.

@item --search-paths[=@var{Art}]
@cindex Suchpfade
Führe die Definitionen von Umgebungsvariablen auf, in Bash-Syntax, die nötig
sein könnten, um alle installierten Pakete nutzen zu können. Diese
Umgebungsvariablen werden benutzt, um die @dfn{Suchpfade} für Dateien
festzulegen, die von einigen installierten Paketen benutzt werden.

Zum Beispiel braucht GCC die Umgebungsvariablen @env{CPATH} und
@env{LIBRARY_PATH}, um zu wissen, wo sich im Benutzerprofil Header und
Bibliotheken befinden (siehe @ref{Environment Variables,,, gcc, Using the
GNU Compiler Collection (GCC)}). Wenn GCC und, sagen wir, die C-Bibliothek
im Profil installiert sind, schlägt @option{--search-paths} also vor, diese
Variablen jeweils auf @file{@var{profile}/include} und
@file{@var{profile}/lib} verweisen zu lassen (siehe @ref{Suchpfade} für
Informationen, wie Paketen Suchpfadspezifikationen zugeordnet werden).

Die typische Nutzung ist, in der Shell diese Variablen zu definieren:

@example
$ eval $(guix package --search-paths)
@end example

Als @var{Art} kann entweder @code{exact}, @code{prefix} oder @code{suffix}
gewählt werden, wodurch die gelieferten Definitionen der Umgebungsvariablen
entweder exakt die Einstellungen für Guix meldet, oder sie als Präfix oder
Suffix an den aktuellen Wert dieser Variablen anhängt. Gibt man keine
@var{Art} an, wird der Vorgabewert @code{exact} verwendet.

Diese Befehlszeilenoption kann auch benutzt werden, um die
@emph{kombinierten} Suchpfade mehrerer Profile zu berechnen. Betrachten Sie
dieses Beispiel:

@example
$ guix package -p foo -i guile
$ guix package -p bar -i guile-json
$ guix package -p foo -p bar --search-paths
@end example

Der letzte Befehl oben meldet auch die Definition der Umgebungsvariablen
@env{GUILE_LOAD_PATH}, obwohl für sich genommen weder @file{foo} noch
@file{bar} zu dieser Empfehlung führen würden.


@cindex Profil, auswählen
@item --profile=@var{Profil}
@itemx -p @var{Profil}
Auf @var{Profil} anstelle des Standardprofils des Benutzers arbeiten.

Als @var{Profil} muss der Name einer Datei angegeben werden, die dann nach
Abschluss der Transaktion erzeugt wird. Konkret wird @var{Profil} nur zu
einer symbolischen Verknüpfung („Symlink“) auf das eigentliche Profil
gemacht, in das Pakete installiert werden.

@example
$ guix install hello -p ~/code/mein-profil
…
$ ~/code/mein-profil/bin/hello
Hallo, Welt!
@end example

Um das Profil loszuwerden, genügt es, die symbolische Verknüpfung und damit
einhergehende Verknüpfungen, die auf bestimmte Generationen verweisen, zu
entfernen:

@example
$ rm ~/code/mein-profil ~/code/mein-profil-*-link
@end example

@item --list-profiles
Alle Profile des Benutzers auflisten:

@example
$ guix package --list-profiles
/home/charlie/.guix-profile
/home/charlie/code/my-profile
/home/charlie/code/devel-profile
/home/charlie/tmp/test
@end example

Wird es als Administratornutzer „root“ ausgeführt, werden die Profile aller
Benutzer aufgelistet.

@cindex Kollisionen, in einem Profil
@cindex Paketkollisionen in Profilen
@cindex Profilkollisionen
@item --allow-collisions
Kollidierende Pakete im neuen Profil zulassen. Benutzung auf eigene Gefahr!

Standardmäßig wird @command{guix package} @dfn{Kollisionen} als Fehler
auffassen und melden. Zu Kollisionen kommt es, wenn zwei oder mehr
verschiedene Versionen oder Varianten desselben Pakets im Profil landen.

@item --bootstrap
Erstellt das Profil mit dem Bootstrap-Guile. Diese Option ist nur für
Entwickler der Distribution nützlich.

@end table

Zusätzlich zu diesen Aktionen unterstützt @command{guix package} folgende
Befehlszeilenoptionen, um den momentanen Zustand eines Profils oder die
Verfügbarkeit von Paketen nachzulesen:

@table @option

@item --search=@var{Regexp}
@itemx -s @var{Regexp}
@anchor{guix-search}
@cindex Suche nach Paketen
Führt alle verfügbaren Pakete auf, deren Name, Zusammenfassung oder
Beschreibung zum regulären Ausdruck @var{Regexp} passt, ohne Groß- und
Kleinschreibung zu unterscheiden und sortiert nach ihrer Relevanz. Alle
Metadaten passender Pakete werden im @code{recutils}-Format geliefert (siehe
@ref{Top, GNU-recutils-Datenbanken,, recutils, GNU recutils manual}).

So können bestimmte Felder mit dem Befehl @command{recsel} extrahiert
werden, zum Beispiel:

@example
$ guix package -s malloc | recsel -p name,version,relevance
name: jemalloc
version: 4.5.0
relevance: 6

name: glibc
version: 2.25
relevance: 1

name: libgc
version: 7.6.0
relevance: 1
@end example

Ebenso kann der Name aller zu den Bedingungen der GNU@tie{}LGPL, Version 3,
verfügbaren Pakete ermittelt werden:

@example
$ guix package -s "" | recsel -p name -e 'license ~ "LGPL 3"'
name: elfutils

name: gmp
…
@end example

Es ist auch möglich, Suchergebnisse näher einzuschränken, indem Sie
@code{-s} mehrmals an @command{guix package} übergeben, oder mehrere
Argumente an @command{guix search} übergeben. Zum Beispiel liefert folgender
Befehl eines Liste von Brettspielen:

@example
$ guix search '\<board\>' game | recsel -p name
name: gnubg
…
@end example

Würden wir @code{-s game} weglassen, bekämen wir auch Software-Pakete
aufgelistet, die mit „printed circuit boards“ (elektronischen Leiterplatten)
zu tun haben; ohne die spitzen Klammern um @code{board} bekämen wir auch
Pakete, die mit „keyboards“ (Tastaturen, oder musikalischen Keyboard) zu tun
haben.

Es ist Zeit für ein komplexeres Beispiel. Folgender Befehl sucht
kryptografische Bibliotheken, filtert Haskell-, Perl-, Python- und
Ruby-Bibliotheken heraus und gibt Namen und Zusammenfassung passender Pakete
aus:

@example
$ guix search crypto library | \
    recsel -e '! (name ~ "^(ghc|perl|python|ruby)")' -p name,synopsis
@end example

@noindent
Siehe @ref{Selection Expressions,,, recutils, GNU recutils manual}, es
enthält weitere Informationen über @dfn{Auswahlausdrücke} mit @code{recsel
-e}.

@item --show=@var{Paket}
Zeigt Details über das @var{Paket} aus der Liste verfügbarer Pakete, im
@code{recutils}-Format (siehe @ref{Top, GNU-recutils-Datenbanken,, recutils,
GNU recutils manual}).

@example
$ guix package --show=guile | recsel -p name,version
name: guile
version: 3.0.5

name: guile
version: 3.0.2

name: guile
version: 2.2.7
…
@end example

Sie können auch den vollständigen Namen eines Pakets angeben, um Details nur
über diese Version angezeigt zu bekommen (diesmal benutzen wir die andere
Schreibweise @command{guix show}):
@example
$ guix show guile@@3.0.5 | recsel -p name,version
name: guile
version: 3.0.5
@end example

@item --list-installed[=@var{Regexp}]
@itemx -I [@var{Regexp}]
Listet die derzeit installierten Pakete im angegebenen Profil auf, die
zuletzt installierten Pakete zuletzt. Wenn ein regulärer Ausdruck
@var{Regexp} angegeben wird, werden nur installierte Pakete aufgeführt,
deren Name zu @var{Regexp} passt.

Zu jedem installierten Paket werden folgende Informationen angezeigt, durch
Tabulatorzeichen getrennt: der Paketname, die Version als Zeichenkette,
welche Teile des Pakets installiert sind (zum Beispiel @code{out}, wenn die
Standard-Paketausgabe installiert ist, @code{include}, wenn seine Header
installiert sind, usw.)@: und an welchem Pfad das Paket im Store zu finden
ist.

@item --list-available[=@var{Regexp}]
@itemx -A [@var{Regexp}]
Listet Pakete auf, die in der aktuell installierten Distribution dieses
Systems verfügbar sind (siehe @ref{GNU-Distribution}). Wenn ein regulärer
Ausdruck @var{Regexp} angegeben wird, werden nur Pakete aufgeführt, deren
Name zum regulären Ausdruck @var{Regexp} passt.

Zu jedem Paket werden folgende Informationen getrennt durch Tabulatorzeichen
ausgegeben: der Name, die Version als Zeichenkette, die Teile des Programms
(siehe @ref{Pakete mit mehreren Ausgaben.}) und die Stelle im Quellcode, an
der das Paket definiert ist.

@item --list-generations[=@var{Muster}]
@itemx -l [@var{Muster}]
@cindex Generationen
Liefert eine Liste der Generationen zusammen mit dem Datum, an dem sie
erzeugt wurden; zu jeder Generation werden zudem die installierten Pakete
angezeigt, zuletzt installierte Pakete zuletzt. Beachten Sie, dass die
nullte Generation niemals angezeigt wird.

Zu jedem installierten Paket werden folgende Informationen durch
Tabulatorzeichen getrennt angezeigt: der Name des Pakets, die Version als
Zeichenkette, welcher Teil des Pakets installiert ist (siehe @ref{Pakete mit mehreren Ausgaben.}) und an welcher Stelle sich das Paket im Store
befindet.

Wenn ein @var{Muster} angegeben wird, liefert der Befehl nur dazu passende
Generationen. Gültige Muster sind zum Beispiel:

@itemize
@item @emph{Ganze Zahlen und kommagetrennte ganze Zahlen}. Beide Muster bezeichnen
Generationsnummern. Zum Beispiel liefert @option{--list-generations=1} die
erste Generation.

Durch @option{--list-generations=1,8,2} werden drei Generationen in der
angegebenen Reihenfolge angezeigt. Weder Leerzeichen noch ein Komma am
Schluss der Liste ist erlaubt.

@item @emph{Bereiche}. @option{--list-generations=2..9} gibt die
angegebenen Generationen und alles dazwischen aus. Beachten Sie, dass der
Bereichsanfang eine kleinere Zahl als das Bereichsende sein muss.

Sie können auch kein Bereichsende angeben, zum Beispiel liefert
@option{--list-generations=2..} alle Generationen ab der zweiten.

@item @emph{Zeitdauern}. Sie können auch die letzten @emph{N}@tie{}Tage, Wochen
oder Monate angeben, indem Sie eine ganze Zahl gefolgt von jeweils „d“, „w“
oder „m“ angeben (dem ersten Buchstaben der Maßeinheit der Dauer im
Englischen). Zum Beispiel listet @option{--list-generations=20d} die
Generationen auf, die höchstens 20 Tage alt sind.
@end itemize

@item --delete-generations[=@var{Muster}]
@itemx -d [@var{Muster}]
Wird kein @var{Muster} angegeben, werden alle Generationen außer der
aktuellen entfernt.

Dieser Befehl akzeptiert dieselben Muster wie
@option{--list-generations}. Wenn ein @var{Muster} angegeben wird, werden
die passenden Generationen gelöscht. Wenn das @var{Muster} für eine
Zeitdauer steht, werden diejenigen Generationen gelöscht, die @emph{älter}
als die angegebene Dauer sind. Zum Beispiel löscht
@option{--delete-generations=1m} die Generationen, die mehr als einen Monat
alt sind.

Falls die aktuelle Generation zum Muster passt, wird sie @emph{nicht}
gelöscht. Auch die nullte Generation wird niemals gelöscht.

Beachten Sie, dass Sie auf gelöschte Generationen nicht zurückwechseln
können. Dieser Befehl sollte also nur mit Vorsicht benutzt werden.

@cindex Manifest, exportieren
@anchor{export-manifest}
@item --export-manifest
Auf die Standardausgabe ein Manifest ausgeben, das mit @option{--manifest}
genutzt werden kann und dem/den gewählten Profil(en) entspricht.

Diese Befehlszeilenoption erleichtert Ihnen den Wechsel vom „imperativen“
Betriebsmodus, wo Sie immer wieder @command{guix install}, @command{guix
upgrade} etc.@: ausführen, zum deklarativen Modus, der mit
@option{--manifest} zur Verfügung steht.

Seien Sie sich bewusst, dass das erzeugte Manifest nur eine
@emph{Annäherung} des Inhalts Ihres Profils ist. Je nachdem, wie Ihr Profil
erzeugt wurde, kann es auf andere Pakete oder Paketversionen verweisen.

Beachten Sie, dass ein Manifest rein symbolisch ist; es enthält nur die
Namen und vielleicht Versionen der Pakete, aber die Bedeutung davon wandelt
sich mit der Zeit. Wenn Sie wollen, dass die Pakete aus immer derselben
Kanalversion stammen, mit der das Profil oder die Profile erstellt wurden,
siehe @option{--export-channels} unten.

@cindex immer dieselbe Version verwenden, bei Kanälen
@item --export-channels
Auf die Standardausgabe die Liste der Kanäle schreiben, die das gewählte
Profil benutzt bzw.@: die die gewählten Profile benutzen. Das Format der
Kanalspezifikation ist für @command{guix pull --channels} und @command{guix
time-machine --channels} geeignet (siehe @ref{Kanäle}).

Zusammen mit @option{--export-manifest} macht diese Befehlszeilenoption
Informationen verfügbar, um das aktuelle Profil nachzubilden (siehe
@ref{Guix nachbilden}).

Beachten Sie jedoch, dass die Ausgabe dieses Befehls nur eine
@emph{Annäherung} dessen ist, woraus ein Profil tatsächlich erstellt
wurde. Insbesondere kann ein Profil aus mehreren Versionen desselben Kanals
aufgebaut worden sein. In diesem Fall wählt @option{--export-manifest} die
neueste aus und schreibt die anderen Versionen in einem Kommentar dazu. Wenn
Sie wirklich Pakete aus unterschiedlichen Kanalversionen zu nehmen brauchen,
können Sie dazu in Ihrem Manifest Untergeordnete angeben (siehe
@ref{Untergeordnete}).

Dies stellt zusammen mit @option{--export-manifest} eine gute Gelegenheit
dar, wenn Sie bereit sind, vom „imperativen“ Modell auf das vollständig
deklarative Modell zu wechseln, wo Sie eine Manifestdatei zusammen mit einer
Kanaldatei benutzen, die ganz genau festlegt, welche Kanalversion(en) Sie
wollen.
@end table

Zu guter Letzt können Sie, da @command{guix package} Erstellungsprozesse zu
starten vermag, auch alle gemeinsamen Erstellungsoptionen (siehe @ref{Gemeinsame Erstellungsoptionen}) verwenden. Auch Paketumwandlungsoptionen wie
@option{--with-source} sind möglich und bleiben über Aktualisierungen hinweg
erhalten (siehe @ref{Paketumwandlungsoptionen}).

@node Substitute
@section Substitute

@cindex Substitute
@cindex vorerstellte Binärdateien
Guix kann transparent Binär- oder Quelldateien ausliefern. Das heißt, Dinge
können sowohl lokal erstellt als auch als vorerstellte Objekte von einem
Server heruntergeladen werden, oder beides gemischt. Wir bezeichnen diese
vorerstellten Objekte als @dfn{Substitute}@tie{}– sie substituieren lokale
Erstellungsergebnisse. In vielen Fällen geht das Herunterladen eines
Substituts wesentlich schneller, als Dinge lokal zu erstellen.

Substitute können alles sein, was das Ergebnis einer Ableitungserstellung
ist (siehe @ref{Ableitungen}). Natürlich sind sie üblicherweise vorerstellte
Paket-Binärdateien, aber wenn zum Beispiel ein Quell-Tarball das Ergebnis
einer Ableitungserstellung ist, kann auch er als Substitut verfügbar sein.

@menu
* Offizielle Substitut-Server::  Eine besondere Quelle von Substituten.
* Substitut-Server autorisieren::  Wie man Substitute an- und abschaltet.
* Substitute von anderen Servern holen::  Substitutevielfalt.
* Substitutauthentifizierung::  Wie Guix Substitute verifiziert.
* Proxy-Einstellungen::      Wie Sie Substitute über einen Proxy beziehen.
* Fehler bei der Substitution::  Was passiert, wenn die Substitution 
                                   fehlschlägt.
* Vom Vertrauen gegenüber Binärdateien::  Wie können Sie diesem binären Blob 
                                            trauen?
@end menu

@node Offizielle Substitut-Server
@subsection Offizielle Substitut-Server

@cindex Erstellungsfarm
@code{@value{SUBSTITUTE-SERVER-1}} und @code{@value{SUBSTITUTE-SERVER-2}}
sind jeweils Fassaden für offizielle Erstellungsfarmen („Build Farms“), die
kontinuierlich Guix-Pakete für einige Prozessorarchitekturen erstellen und
sie als Substitute zur Verfügung stellen. Sie sind die standardmäßige Quelle
von Substituten; durch Übergeben der Befehlszeilenoption
@option{--substitute-urls} an entweder den @command{guix-daemon} (siehe
@ref{daemon-substitute-urls,, @code{guix-daemon --substitute-urls}}) oder
Client-Werkzeuge wie @command{guix package} (siehe
@ref{client-substitute-urls,, die Befehlszeilenoption
@option{--substitute-urls} beim Client}) kann eine abweichende Einstellung
benutzt werden.

Substitut-URLs können entweder HTTP oder HTTPS sein. HTTPS wird empfohlen,
weil die Kommunikation verschlüsselt ist; umgekehrt kann bei HTTP die
Kommunikation belauscht werden, wodurch der Angreifer zum Beispiel erfahren
könnte, ob Ihr System über noch nicht behobene Sicherheitsschwachstellen
verfügt.

Substitute von den offiziellen Erstellungsfarmen sind standardmäßig erlaubt,
wenn Sie Guix System verwenden (siehe @ref{GNU-Distribution}). Auf
Fremddistributionen sind sie allerdings standardmäßig ausgeschaltet, solange
Sie sie nicht ausdrücklich in einem der empfohlenen Installationsschritte
erlaubt haben (siehe @ref{Installation}). Die folgenden Absätze beschreiben,
wie Sie Substitute für die offizielle Erstellungsfarm an- oder ausschalten;
dieselbe Prozedur kann auch benutzt werden, um Substitute für einen
beliebigen anderen Substitutserver zu erlauben.

@node Substitut-Server autorisieren
@subsection Substitut-Server autorisieren

@cindex Sicherheit
@cindex Substitute, deren Autorisierung
@cindex Access Control List (ACL), für Substitute
@cindex ACL (Access Control List), für Substitute
Um es Guix zu gestatten, Substitute von @code{@value{SUBSTITUTE-SERVER-1}},
@code{@value{SUBSTITUTE-SERVER-2}} oder einem Spiegelserver herunterzuladen,
müssen Sie die zugehörigen öffentlichen Schlüssel zur Access Control List
(ACL, Zugriffssteuerungsliste) für Archivimporte hinzufügen, mit Hilfe des
Befehls @command{guix archive} (siehe @ref{Aufruf von guix archive}). Dies
impliziert, dass Sie darauf vertrauen, dass der Substitutserver nicht
kompromittiert wurde und unverfälschte Substitute liefert.

@quotation Anmerkung
Wenn Sie Guix System benutzen, können Sie diesen Abschnitt hier
überspringen, denn Guix System ist so voreingestellt, Substitute von
@code{@value{SUBSTITUTE-SERVER-1}} und @code{@value{SUBSTITUTE-SERVER-2}} zu
autorisieren.
@end quotation

Der öffentliche Schlüssel für jeden vom Guix-Projekt verwalteten
Substitutserver wird zusammen mit Guix installiert, in das Verzeichnis
@code{@var{prefix}/share/guix/}, wobei @var{prefix} das bei der Installation
angegebene Präfix von Guix ist. Wenn Sie Guix aus seinem Quellcode heraus
installieren, sollten Sie sichergehen, dass Sie die GPG-Signatur (auch
„Beglaubigung“ genannt) von @file{guix-@value{VERSION}.tar.gz} prüfen, worin
sich dieser öffentliche Schlüssel befindet. Dann können Sie so etwas wie
hier ausführen:

@example
# guix archive --authorize < @var{prefix}/share/guix/@value{SUBSTITUTE-SERVER-1}.pub
# guix archive --authorize < @var{prefix}/share/guix/@value{SUBSTITUTE-SERVER-2}.pub
@end example

Sobald es eingerichtet wurde, sollte sich die Ausgabe eines Befehls wie
@code{guix build} von so etwas:

@example
$ guix build emacs --dry-run
Folgende Ableitungen würden erstellt:
   /gnu/store/yr7bnx8xwcayd6j95r2clmkdl1qh688w-emacs-24.3.drv
   /gnu/store/x8qsh1hlhgjx6cwsjyvybnfv2i37z23w-dbus-1.6.4.tar.gz.drv
   /gnu/store/1ixwp12fl950d15h2cj11c73733jay0z-alsa-lib-1.0.27.1.tar.bz2.drv
   /gnu/store/nlma1pw0p603fpfiqy7kn4zm105r5dmw-util-linux-2.21.drv
…
@end example

@noindent
in so etwas verwandeln:

@example
$ guix build emacs --dry-run
112.3 MB würden heruntergeladen:
   /gnu/store/pk3n22lbq6ydamyymqkkz7i69wiwjiwi-emacs-24.3
   /gnu/store/2ygn4ncnhrpr61rssa6z0d9x22si0va3-libjpeg-8d
   /gnu/store/71yz6lgx4dazma9dwn2mcjxaah9w77jq-cairo-1.12.16
   /gnu/store/7zdhgp0n1518lvfn8mb96sxqfmvqrl7v-libxrender-0.9.7
…
@end example

@noindent
Der Text hat sich von „Folgende Ableitungen würden erstellt“ zu „112.3 MB
würden heruntergeladen“ geändert. Das zeigt an, dass Substitute von den
festgelegten Substitutservern nutzbar sind und für zukünftige Erstellungen
heruntergeladen werden, wann immer es möglich ist.

@cindex Substitute, wie man sie ausschaltet
Der Substitutsmechanismus kann global ausgeschaltet werden, indem Sie dem
@code{guix-daemon} beim Starten die Befehlszeilenoption
@option{--no-substitutes} übergeben (siehe @ref{Aufruf des guix-daemon}). Er
kann auch temporär ausgeschaltet werden, indem Sie @option{--no-substitutes}
an @command{guix package}, @command{guix build} und andere
Befehlszeilenwerkzeuge übergeben.

@node Substitute von anderen Servern holen
@subsection Substitute von anderen Servern holen
@c Note: This section name appears in a hint printed by 'guix weather'.

@cindex Substitut-Server, weitere hinzufügen
Guix kann auf unterschiedlichen Servern nach Substituten schauen und sie von
dort laden. Das lohnt sich, wenn Sie Pakete von zusätzlichen Kanälen laden,
für die es auf dem offiziellen Server keine Substitute gibt, auf einem
anderen aber schon. Eine andere Situation, wo es sich anbietet, ist, wenn
Sie Substitute lieber vom Substitutserver beziehen, der zu Ihrer
Organisation gehört, und den offiziellen Server nur im Ausnahmefall
einsetzen oder ganz weglassen möchten.

Sie können Guix eine Liste von URLs der Substitutserver mitgeben, damit es
sie in der angegebenen Reihenfolge anfragt. Außerdem müssen Sie die
öffentlichen Schlüssel der Substitutserver ausdrücklich autorisieren, damit
Guix von ihnen signierte Substitute annimmt.

Auf Guix System ginge dies vonstatten, indem Sie die Konfiguration des
@code{guix}-Dienstes modifizieren. Weil der @code{guix}-Dienst zu der Liste
der vorgegebenen Dienste gehört, sowohl für @code{%base-services} als auch
für @code{%desktop-services}, können Sie dessen Konfiguration mit
@code{modify-services} ändern und dort die URLs und Substitutschlüssel
eintragen, die Sie möchten (siehe @ref{Service-Referenz,
@code{modify-services}}).

Ein Beispiel: Nehmen wir an, Sie möchten Substitute zusätzlich zu den
vorgegebenen @code{@value{SUBSTITUTE-SERVER-1}} und
@code{@value{SUBSTITUTE-SERVER-2}} auch von @code{guix.example.org} beziehen
und den Signierschlüssel dieses Servers autorisieren. Die
Betriebssystemkonfiguration, die sich damit ergibt, wird ungefähr so
aussehen:

@lisp
(operating-system
  ;; …
  (services
    ;; Wir nehmen hier '%desktop-services' als Grundlage; geben Sie
    ;; an deren Stelle die Liste der bei Ihnen benutzten Dienste an.
    (modify-services %desktop-services
      (guix-service-type config =>
                        (guix-configuration
                          (inherit config)
                          (substitute-urls
                            (append (list "https://guix.example.org")
                                    %default-substitute-urls))
                          (authorized-keys
                            (append (list (local-file "./key.pub"))
                                    %default-authorized-guix-keys)))))))
@end lisp

Dabei gehen wir davon aus, dass der Signierschlüssel von
@code{guix.example.org} in der Datei @file{key.pub} steht. Sobald Sie diese
Änderung an der Datei mit Ihrer Betriebssystemkonfiguration vorgenommen
haben (etwa @file{/etc/config.scm}), können Sie rekonfigurieren und den
@code{guix-daemon}-Dienst (oder den ganzen Rechner) neu starten, damit die
Änderung in Kraft tritt:

@example
$ sudo guix system reconfigure /etc/config.scm
$ sudo herd restart guix-daemon
@end example

Wenn Sie Guix auf einer „Fremddistribution“ laufen lassen, würden Sie
stattdessen nach den folgenden Schritten vorgehen, um Substitute von
zusätzlichen Servern zu bekommen:

@enumerate
@item
Bearbeiten Sie die Konfigurationsdatei für den @code{guix-daemon}; wenn Sie
systemd benutzen, wäre das normalerweise
@file{/etc/systemd/system/guix-daemon.service}. Schreiben Sie in die
Konfigurationsdatei die Option @option{--substitute-urls} zur
@command{guix-daemon}-Befehlszeile dazu und listen Sie dabei die gewünschten
URLs auf (siehe @ref{daemon-substitute-urls, @code{guix-daemon
--substitute-urls}}):

@example
… --substitute-urls='https://guix.example.org @value{SUBSTITUTE-URLS}'
@end example

@item
Starten Sie den Daemon neu. Bei systemd geht das so:

@example
systemctl daemon-reload
systemctl restart guix-daemon.service
@end example

@item
Autorisieren Sie den Schlüssel des neuen Servers (siehe @ref{Aufruf von guix archive}):

@example
guix archive --authorize < key.pub
@end example

Wir nehmen auch hier an, dass @file{key.pub} den öffentlichen Schlüssel
enthält, mit dem @code{guix.example.org} Substitute signiert.
@end enumerate

Und wir sind fertig! Substitute werden bevorzugt von
@code{https://guix.example.org} bezogen und
@code{@value{SUBSTITUTE-SERVER-1}} und dann
@code{@value{SUBSTITUTE-SERVER-2}} bleiben notfalls als Reserve. Natürlich
können Sie so viele Substitutserver auflisten, wie Sie wollen, allerdings
kann das Erfragen von Substituten etwas länger dauern, wenn zu viele Server
kontaktiert werden müssen.

@quotation Problembehandlung
Der Befehl @command{guix weather} hilft Ihnen bei der Fehlerdiagnose. Wenn
Sie zum Beispiel das ausführen:

@example
guix weather coreutils
@end example

@noindent
wird Ihnen nicht nur mitgeteilt, welcher der aktuell eingerichteten Server
Substitute für das Paket @code{coreutils} bereitstellt, sondern auch ob
einer der Server nicht autorisiert ist. Siehe @ref{Aufruf von guix weather}
für mehr Informationen.
@end quotation

Aber bedenken Sie, es gibt auch Situationen, wo man nur die URL eines
Substitutservers hinzufügen will, @emph{ohne} den Schlüssel zu
autorisieren. Siehe @ref{Substitutauthentifizierung}, um diese bestimmten
Gründe zu verstehen.

@node Substitutauthentifizierung
@subsection Substitutauthentifizierung

@cindex digitale Signaturen
Guix erkennt, wenn ein verfälschtes Substitut benutzt würde, und meldet
einen Fehler. Ebenso werden Substitute ignoriert, die nich signiert sind,
oder nicht mit einem in der ACL aufgelisteten Schlüssel signiert sind.

Es gibt nur eine Ausnahme: Wenn ein unautorisierter Server Substitute
anbietet, die @emph{Bit für Bit identisch} mit denen von einem autorisierten
Server sind, können sie auch vom unautorisierten Server heruntergeladen
werden. Zum Beispiel, angenommen wir haben zwei Substitutserver mit dieser
Befehlszeilenoption ausgewählt:

@example
--substitute-urls="https://a.example.org https://b.example.org"
@end example

@noindent
@cindex Reproduzierbare Erstellungen
Wenn in der ACL nur der Schlüssel für @samp{b.example.org} aufgeführt wurde,
aber @samp{a.example.org} @emph{exakt dieselben} Substitute anbietet, wird
Guix auch Substitute von @samp{a.example.org} herunterladen, weil es in der
Liste zuerst kommt und als Spiegelserver für @samp{b.example.org} aufgefasst
werden kann. In der Praxis haben unabhängige Maschinen bei der Erstellung
normalerweise dieselben Binärdateien als Ergebnis, dank bit-reproduzierbaren
Erstellungen (siehe unten).

Wenn Sie HTTPS benutzen, wird das X.509-Zertifikat des Servers @emph{nicht}
validiert (mit anderen Worten, die Identität des Servers wird nicht
authentifiziert), entgegen dem, was HTTPS-Clients wie Web-Browser
normalerweise tun. Da Guix Substitutinformationen selbst überprüft, wie oben
erklärt, wäre es unnötig (wohingegen mit X.509-Zertifikaten geprüft wird, ob
ein Domain-Name zu öffentlichen Schlüsseln passt).

@node Proxy-Einstellungen
@subsection Proxy-Einstellungen

@vindex http_proxy
@vindex https_proxy
Substitute werden über HTTP oder HTTPS heruntergeladen. Die
Umgebungsvariablen @env{http_proxy} und @env{https_proxy} können in der
Umgebung von @command{guix-daemon} definiert werden und wirken sich dann auf
das Herunterladen von Substituten aus. Beachten Sie, dass der Wert dieser
Variablen in der Umgebung, in der @command{guix build}, @command{guix
package} und andere Client-Befehle ausgeführt werden, @emph{keine Rolle
spielt}.

@node Fehler bei der Substitution
@subsection Fehler bei der Substitution

Selbst wenn ein Substitut für eine Ableitung verfügbar ist, schlägt die
versuchte Substitution manchmal fehl. Das kann aus vielen Gründen geschehen:
die Substitutserver könnten offline sein, das Substitut könnte kürzlich
gelöscht worden sein, die Netzwerkverbindung könnte unterbrochen worden
sein, usw.

Wenn Substitute aktiviert sind und ein Substitut für eine Ableitung zwar
verfügbar ist, aber die versuchte Substitution fehlschlägt, kann Guix
versuchen, die Ableitung lokal zu erstellen, je nachdem, ob
@option{--fallback} übergeben wurde (siehe @ref{fallback-option,, common
build option @option{--fallback}}). Genauer gesagt, wird keine lokale
Erstellung durchgeführt, solange kein @option{--fallback} angegeben wurde,
und die Ableitung wird als Fehlschlag angesehen. Wenn @option{--fallback}
übergeben wurde, wird Guix versuchen, die Ableitung lokal zu erstellen, und
ob die Ableitung erfolgreich ist oder nicht, hängt davon ab, ob die lokale
Erstellung erfolgreich ist oder nicht. Beachten Sie, dass, falls Substitute
ausgeschaltet oder erst gar kein Substitut verfügbar ist, @emph{immer} eine
lokale Erstellung durchgeführt wird, egal ob @option{--fallback} übergeben
wurde oder nicht.

Um eine Vorstellung zu bekommen, wie viele Substitute gerade verfügbar sind,
können Sie den Befehl @command{guix weather} benutzen (siehe @ref{Aufruf von guix weather}). Dieser Befehl zeigt Statistiken darüber an, wie es um die
von einem Server verfügbaren Substitute steht.

@node Vom Vertrauen gegenüber Binärdateien
@subsection Vom Vertrauen gegenüber Binärdateien

@cindex Vertrauen, gegenüber vorerstellten Binärdateien
Derzeit hängt die Kontrolle jedes Individuums über seine Rechner von
Institutionen, Unternehmen und solchen Gruppierungen ab, die über genug
Macht und Entschlusskraft verfügen, die Rechnerinfrastruktur zu sabotieren
und ihre Schwachstellen auszunutzen. Auch wenn es bequem ist, Substitute zu
benutzen, ermuntern wir Nutzer, auch selbst Erstellungen durchzuführen oder
gar ihre eigene Erstellungsfarm zu betreiben, damit die vom Guix-Projekt
betriebenen Substitutserver ein weniger interessantes Ziel werden. Eine Art,
uns zu helfen, ist, die von Ihnen erstellte Software mit dem Befehl
@command{guix publish} zu veröffentlichen, damit andere eine größere Auswahl
haben, von welchem Server sie Substitute beziehen möchten (siehe
@ref{Aufruf von guix publish}).

Guix hat die richtigen Grundlagen, um die Reproduzierbarkeit von
Erstellungen zu maximieren (siehe @ref{Funktionalitäten}). In den meisten Fällen
sollten unabhängige Erstellungen eines bestimmten Pakets zu bitweise
identischen Ergebnissen führen. Wir können also mit Hilfe einer
vielschichtigen Menge an unabhängigen Paketerstellungen die Integrität
unseres Systems besser gewährleisten. Der Befehl @command{guix challenge}
hat das Ziel, Nutzern zu ermöglichen, Substitutserver zu beurteilen, und
Entwickler dabei zu unterstützen, nichtdeterministische Paketerstellungen zu
finden (siehe @ref{Aufruf von guix challenge}). Ebenso ermöglicht es die
Befehlszeilenoption @option{--check} von @command{guix build}, dass Nutzer
bereits installierte Substitute auf Unverfälschtheit zu prüfen, indem sie
durch lokales Erstellen nachgebildet werden (siehe @ref{build-check,
@command{guix build --check}}). Wenn Sie ein Paket komplett neu erstellen
möchten (wobei Sie Sicherheitsaktualisierungen über Veredelungen ignorieren
(siehe @ref{Sicherheitsaktualisierungen}), falls Veredelungen existieren, was nicht
immer der Fall ist), benutzen Sie @option{--check} zusammen mit
@option{--no-grafts} (siehe @ref{Gemeinsame Erstellungsoptionen,
@option{--no-grafts}}). Weil Veredelungen als eigene Ableitungen erstellt
werden, würde, wenn Veredelungen auf das zu erstellende Paket angewandt
werden, durch Angeben von @option{--check} alleine nur die veredelnde
Ableitung neu erstellt und das Paket selbst nicht neu kompiliert.

In Zukunft wollen wir, dass Sie mit Guix Binärdateien von Netzwerkteilnehmer
zu Netzwerkteilnehmer („peer-to-peer“) veröffentlichen und empfangen
können. Wenn Sie mit uns dieses Projekt diskutieren möchten, kommen Sie auf
unsere Mailing-Liste @email{guix-devel@@gnu.org}.

@node Pakete mit mehreren Ausgaben.
@section Pakete mit mehreren Ausgaben.

@cindex mehrere Ausgaben, bei Paketen
@cindex Paketausgaben
@cindex Ausgaben

Oft haben in Guix definierte Pakete eine einzige @dfn{Ausgabe}@tie{}– d.h.@:
aus dem Quellpaket entsteht genau ein Verzeichnis im Store. Wenn Sie
@command{guix install glibc} ausführen, wird die Standard-Paketausgabe des
GNU-libc-Pakets installiert; die Standardausgabe wird @code{out} genannt,
aber ihr Name kann weggelassen werden, wie Sie am obigen Befehl sehen. In
diesem speziellen Fall enthält die Standard-Paketausgabe von @code{glibc}
alle C-Headerdateien, gemeinsamen Bibliotheken („Shared Libraries“),
statischen Bibliotheken („Static Libraries“), Dokumentation für Info sowie
andere zusätzliche Dateien.

Manchmal ist es besser, die verschiedenen Arten von Dateien, die aus einem
einzelnen Quellpaket hervorgehen, in getrennte Ausgaben zu unterteilen. Zum
Beispiel installiert die GLib-C-Bibliothek (die von GTK und damit
zusammenhängenden Paketen benutzt wird) mehr als 20 MiB an HTML-Seiten mit
Referenzdokumentation. Um den Nutzern, die das nicht brauchen, Platz zu
sparen, wird die Dokumentation in einer separaten Ausgabe abgelegt, genannt
@code{doc}. Um also die Hauptausgabe von GLib zu installieren, zu der alles
außer der Dokumentation gehört, ist der Befehl:

@example
guix install glib
@end example

@cindex documentation
Der Befehl, um die Dokumentation zu installieren, ist:

@example
guix install glib:doc
@end example

Jedoch ist die Schreibweise mit Doppelpunkt nur richtig bei der
Spezifikation von Paketausgaben auf der Befehlszeile. Sie ist falsch, wenn
Sie eine @emph{Paket-Variable} in Scheme-Code angeben. Um zum Beispiel die
Dokumentation von @code{glib} zu den global installierten Paketen eines
@code{operating-system}-Objekts hinzuzufügen (siehe @ref{„operating-system“-Referenz}), muss stattdessen eine Liste von zwei Einträgen verwendet
werden, als Erstes die @emph{Paket-Variable} und als Zweites der Name der
gewählten Ausgabe:

@lisp
(use-modules (gnu packages glib))
;; glib-with-documentation ist das Guile-Symbol für das glib-Paket
(operating-system
 …
 (packages
  (append
   (list (list glib-with-documentation "doc"))
         %base-packages)))
@end lisp

Manche Pakete installieren Programme mit unterschiedlich großem
„Abhängigkeiten-Fußabdruck“. Zum Beispiel installiert das Paket WordNet
sowohl Befehlszeilenwerkzeuge als auch grafische Benutzerschnittstellen
(GUIs). Erstere hängen nur von der C-Bibliothek ab, während Letztere auch
von Tcl/Tk und den zu Grunde liegenden X-Bibliotheken abhängen. Jedenfalls
belassen wir deshalb die Befehlszeilenwerkzeuge in der
Standard-Paketausgabe, während sich die GUIs in einer separaten Ausgabe
befinden. So können Benutzer, die die GUIs nicht brauchen, Platz sparen. Der
Befehl @command{guix size} kann dabei helfen, solche Situationen zu erkennen
(siehe @ref{Aufruf von guix size}). @command{guix graph} kann auch helfen
(siehe @ref{Aufruf von guix graph}).

In der GNU-Distribution gibt es viele solche Pakete mit mehreren
Ausgaben. Andere Konventionen für Ausgabenamen sind zum Beispiel @code{lib}
für Bibliotheken und eventuell auch ihre Header-Dateien, @code{bin} für
eigenständige Programme und @code{debug} für Informationen zur
Fehlerbehandlung (siehe @ref{Dateien zur Fehlersuche installieren}). Die Ausgaben
eines Pakets stehen in der dritten Spalte der Anzeige von @command{guix
package --list-available} (siehe @ref{Aufruf von guix package}).


@node Aufruf von guix locate
@section @command{guix locate} aufrufen

@cindex Datei, in Paketen suchen
@cindex Datei suchen
@cindex Suche nach Paketen
Uns steht solch eine Fülle an freier Software zur Verfügung, dass wir früher
oder später suchen müssen, welches Paket wir benötigen. Mit dem Befehl
@command{guix search}, den wir bereits kennengelernt haben (siehe
@ref{Aufruf von guix package}), können wir anhand von Schlüsselwörtern suchen:

@example
guix search video editor
@end example

@cindex Suche nach Paketen, anhand eines Dateinamens
Manchmal möchte man eher wissen, in welchem Paket eine bestimmte Datei
angeboten wird. Hierfür ist @command{guix locate} das Richtige. So können
Sie z.B.@: herausfinden, welches Paket den Befehl @command{ls} verfügbar
macht:

@example
$ guix locate ls
coreutils@@9.1       /gnu/store/…-coreutils-9.1/bin/ls
@end example

Natürlich funktioniert es auch mit anderen Dateien, @emph{nicht} nur für
Befehle:

@example
$ guix locate unistr.h
icu4c@@71.1          /gnu/store/…/include/unicode/unistr.h
libunistring@@1.0    /gnu/store/…/include/unistr.h
@end example

Sie können auch @dfn{glob-Muster} mit Platzhaltern verwenden. Zum Beispiel
würden Sie so nach Paketen suchen, die @file{.service}-Dateien verfügbar
machen:

@example
$ guix locate -g '*.service'
man-db@@2.11.1        …/lib/systemd/system/man-db.service
wpa-supplicant@@2.10  …/system-services/fi.w1.wpa_supplicant1.service
@end example

Der Befehl @command{guix locate} braucht eine Datenbank, die Dateinamen zu
Paketnamen zuordnet. Nach den Vorgabeeinstellungen wird diese Datenbank
automatisch angelegt, wenn sie noch nicht existiert, wozu die @emph{lokal}
verfügbaren Pakete betrachtet werden, was ein paar Minuten dauern kann (je
nachdem wie groß Ihr Store und wie schnell Ihr Speichermedium ist).

@quotation Anmerkung
Im Moment kann @command{guix locate} seine Datenbank nur auf lokalem Wissen
aufbauen@tie{}– Pakete außerhalb Ihres Stores werden nicht aufgenommen. Das
soll sich noch ändern und dann wird es eine vorerstellte Datenbank
herunterladen können, mit der sie auch andere Pakete finden können.
@end quotation

Vorgegeben ist, dass @command{guix locate} zunächst schaut, ob eine
systemweite Datenbank vorhanden ist, in der Regel in
@file{/var/cache/guix/locate}. Wenn Sie @emph{nicht} existiert oder zu alt
ist, wird stattdessen auf eine nutzereigene Datenbank zurückgegriffen,
vorgegeben ist @file{~/.cache/guix/locate}. In einem Mehrbenutzersystem
können Administratoren die Aufgabe übernehmen, regelmäßig die systemweite
Datenbank zu aktualisieren, damit alle Benutzer etwas davon haben, zum
Beispiel mit Hilfe des @code{package-database-service-type} (siehe @ref{Dateisuch-Dienste, @code{package-database-service-type}}).

Die allgemeine Syntax lautet:

@example
guix locate [@var{Optionen}…] @var{Datei}…
@end example

@noindent
Dabei ist @var{Datei} der Name einer aufzufindenden Datei (genauer gesagt
ihr „Basisname“: Dateien, die ein Elternverzeichnis namens @var{Datei}
haben, landen @emph{nicht} im Ergebnis).

Folgende @var{Optionen} gibt es:

@table @code
@item --glob
@item -g
@var{Datei}… werden als @dfn{glob-Muster} aufgefasst@tie{}– also Muster, die
auch Platzhalterzeichen enthalten können wie @samp{*.scm}, was alle Dateien
aufgreift, die in @samp{.scm} enden.

@item --stats
Statistiken über die Datenbank zeigen.

@item --update
@itemx -u
Die Datenbank mit den Dateien auf den neuesten Stand bringen.

Nach den Vorgabeeinstellungen wird die Datenbank dann aktualisiert, wenn sie
zu alt ist.

@item --clear
Die Datenbank leeren und neu befüllen.

Mit dieser Befehlszeilenoption können sie von vorn anfangen, so dass alte
Daten @emph{nicht} mehr in der Datenbank auftauchen. So stellen Sie sicher,
dass die Datenbank nicht endlos anwächst. Nach den Vorgabeeinstellungen für
@command{guix locate} geschieht das regelmäßig automatisch, wenn auch nicht
oft.

@item --database=@var{Datei}
Die @var{Datei} als Datenbank benutzen. Wenn nötig, wird sie erzeugt.

Nach den Vorgabeeinstellungen benutzt @command{guix locate} die Datenbank
unter @file{~/.cache/guix} oder @file{/var/cache/guix}, je nachdem, welche
neuer ist.

@item --method=@var{Methode}
@itemx -m @var{Methode}
Nach der @var{Methode} auswählen, welche Pakete in den Index aufgenommn
werden. Mögliche Werte sind:

@table @code
@item manifests
Dies ist die vorgegebene Methode: Für sie werden die Profile auf der
Maschine betrachtet und die darin vorkommenden Pakete ermittelt@tie{}– das
sind die Pakete, die Sie oder andere Benutzer derselben Maschine direkt oder
indirekt installiert haben. Das geht schnell, aber Pakete, die aus anderem
Grund im Store sind, fehlen, wenn kein Profil darauf verweist.

@item store
Diese Methode ist langsamer, aber gründlicher: Alle Pakete, die im Store
vorhanden sind, werden in die Datenbank aufgenommen.
@end table
@end table


@node Aufruf von guix gc
@section @command{guix gc} aufrufen

@cindex Müllsammler
@cindex Plattenspeicher
@cindex @command{guix gc}
Pakete, die zwar installiert sind, aber nicht benutzt werden, können vom
@dfn{Müllsammler} entfernt werden. Mit dem Befehl @command{guix gc} können
Benutzer den Müllsammler ausdrücklich aufrufen, um Speicher im Verzeichnis
@file{/gnu/store} freizugeben. Dies ist der @emph{einzige} Weg, Dateien aus
@file{/gnu/store} zu entfernen@tie{}– das manuelle Entfernen von Dateien
kann den Store irreparabel beschädigen!

@cindex GC-Wurzeln
@cindex Müllsammlerwurzeln
Der Müllsammler kennt eine Reihe von @dfn{Wurzeln}: Jede Datei in
@file{/gnu/store}, die von einer Wurzel aus erreichbar ist, gilt als
@dfn{lebendig} und kann nicht entfernt werden; jede andere Datei gilt als
@dfn{tot} und ist ein Kandidat, gelöscht zu werden. Die Menge der
Müllsammlerwurzeln (kurz auch „GC-Wurzeln“, von englisch „Garbage
Collector“) umfasst Standard-Benutzerprofile; standardmäßig werden diese
Müllsammlerwurzeln durch symbolische Verknüpfungen in
@file{/var/guix/gcroots} dargestellt. Neue Müllsammlerwurzeln können zum
Beispiel mit @command{guix build --root} festgelegt werden (siehe
@ref{Aufruf von guix build}). Der Befehl @command{guix gc --list-roots} listet
sie auf.

Bevor Sie mit @code{guix gc --collect-garbage} Speicher freimachen, wollen
Sie vielleicht alte Generationen von Benutzerprofilen löschen, damit alte
Paketerstellungen von diesen Generationen entfernt werden können. Führen Sie
dazu @code{guix package --delete-generations} aus (siehe @ref{Aufruf von guix package}).

Unsere Empfehlung ist, dass Sie den Müllsammler regelmäßig laufen lassen und
wenn Sie wenig freien Speicherplatz zur Verfügung haben. Um zum Beispiel
sicherzustellen, dass Sie mindestens 5@tie{}GB auf Ihrer Platte zur
Verfügung haben, benutzen Sie einfach:

@example
guix gc -F 5G
@end example

Es ist völlig sicher, dafür eine nicht interaktive, regelmäßige
Auftragsausführung vorzugeben (siehe @ref{Geplante Auftragsausführung} für eine
Erklärung, wie man das tun kann). @command{guix gc} ohne
Befehlszeilenargumente auszuführen, lässt so viel Müll wie möglich sammeln,
aber das ist oft nicht, was man will, denn so muss man unter Umständen
Software erneut erstellen oder erneut herunterladen, weil der Müllsammler
sie als „tot“ ansieht, sie aber zur Erstellung anderer Software wieder
gebraucht wird@tie{}– das trifft zum Beispiel auf die Compiler-Toolchain zu.

Der Befehl @command{guix gc} hat drei Arbeitsmodi: Er kann benutzt werden,
um als Müllsammler tote Dateien zu entfernen (das Standardverhalten), um
ganz bestimmte, angegebene Datein zu löschen (mit der Befehlszeilenoption
@option{--delete}), um Müllsammlerinformationen auszugeben oder
fortgeschrittenere Anfragen zu verarbeiten. Die
Müllsammler-Befehlszeilenoptionen sind wie folgt:

@table @code
@item --collect-garbage[=@var{Minimum}]
@itemx -C [@var{Minimum}]
Lässt Müll sammeln@tie{}– z.B.@: nicht erreichbare Dateien in
@file{/gnu/store} und seinen Unterverzeichnissen. Wird keine andere
Befehlszeilenoption angegeben, wird standardmäßig diese durchgeführt.

Wenn ein @var{Minimum} angegeben wurde, hört der Müllsammler auf, sobald
@var{Minimum} Bytes gesammelt wurden. Das @var{Minimum} kann die Anzahl der
Bytes bezeichnen oder mit einer Einheit als Suffix versehen sein, wie etwa
@code{MiB} für Mebibytes und @code{GB} für Gigabytes (siehe @ref{Block size,
Größenangaben,, coreutils, GNU Coreutils}).

Wird kein @var{Minimum} angegeben, sammelt der Müllsammler allen Müll.

@item --free-space=@var{Menge}
@itemx -F @var{Menge}
Sammelt Müll, bis die angegebene @var{Menge} an freiem Speicher in
@file{/gnu/store} zur Verfügung steht, falls möglich; die @var{Menge} ist
eine Speichergröße wie @code{500MiB}, wie oben beschrieben.

Wenn die angegebene  @var{Menge} oder mehr bereits in @file{/gnu/store} frei
verfügbar ist, passiert nichts.

@item --delete-generations[=@var{Dauer}]
@itemx -d [@var{Dauer}]
Bevor der Müllsammelvorgang beginnt, werden hiermit alle Generationen von
allen Benutzerprofilen und von allen Persönlichen Umgebungen gelöscht, die
älter sind als die angegebene @var{Dauer}; wird es als Administratornutzer
„root“ ausgeführt, geschieht dies mit den Profilen @emph{von allen
Benutzern}.

Zum Beispiel löscht der folgende Befehl alle Generationen Ihrer Profile, die
älter als zwei Monate sind (ausgenommen die momentanen Generationen), und
schmeißt dann den Müllsammler an, um Platz freizuräumen, bis mindestens 10
GiB verfügbar sind:

@example
guix gc -d 2m -F 10G
@end example

@item --delete
@itemx -D
Versucht, alle als Argumente angegebenen Dateien oder Verzeichnisse im Store
zu löschen. Dies schlägt fehl, wenn manche der Dateien oder Verzeichnisse
nicht im Store oder noch immer lebendig sind.

@item --list-failures
Store-Objekte auflisten, die zwischengespeicherten Erstellungsfehlern
entsprechen.

Hierbei wird nichts ausgegeben, sofern der Daemon nicht mit
@option{--cache-failures} gestartet wurde (siehe @ref{Aufruf des guix-daemon,
@option{--cache-failures}}).

@item --list-roots
Die Müllsammlerwurzeln auflisten, die dem Nutzer gehören. Wird der Befehl
als Administratornutzer ausgeführt, werden @emph{alle} Müllsammlerwurzeln
aufgelistet.

@item --list-busy
Solche Store-Objekte auflisten, die von aktuell laufenden Prozessen benutzt
werden. Diese Store-Objekte werden praktisch wie Müllsammlerwurzeln
behandelt; sie können nicht gelöscht werden.

@item --clear-failures
Die angegebenen Store-Objekte aus dem Zwischenspeicher für fehlgeschlagene
Erstellungen entfernen.

Auch diese Option macht nur Sinn, wenn der Daemon mit
@option{--cache-failures} gestartet wurde. Andernfalls passiert nichts.

@item --list-dead
Zeigt die Liste toter Dateien und Verzeichnisse an, die sich noch im Store
befinden@tie{}– das heißt, Dateien, die von keiner Wurzel mehr erreichbar
sind.

@item --list-live
Zeige die Liste lebendiger Store-Dateien und -Verzeichnisse.

@end table

Außerdem können Referenzen unter bestehenden Store-Dateien gefunden werden:

@table @code

@item --references
@itemx --referrers
@cindex Paketabhängigkeiten
Listet die referenzierten bzw. sie referenzierenden Objekte der angegebenen
Store-Dateien auf.

@item --requisites
@itemx -R
@cindex closure
Listet alle Voraussetzungen der als Argumente übergebenen Store-Dateien
auf. Voraussetzungen sind die Store-Dateien selbst, ihre Referenzen sowie
die Referenzen davon, rekursiv. Mit anderen Worten, die zurückgelieferte
Liste ist der @dfn{transitive Abschluss} dieser Store-Dateien.

Der Abschnitt @ref{Aufruf von guix size} erklärt ein Werkzeug, um den
Speicherbedarf des Abschlusses eines Elements zu ermitteln. Siehe
@ref{Aufruf von guix graph} für ein Werkzeug, um den Referenzgraphen zu
veranschaulichen.

@item --derivers
@cindex derivation
Liefert die Ableitung(en), die zu den angegebenen Store-Objekten führen
(siehe @ref{Ableitungen}).

Zum Beispiel liefert dieser Befehl:

@example
guix gc --derivers $(guix package -I ^emacs$ | cut -f4)
@end example

@noindent
die @file{.drv}-Datei(en), die zum in Ihrem Profil installierten
@code{emacs}-Paket führen.

Beachten Sie, dass es auch sein kann, dass keine passenden
@file{.drv}-Dateien existieren, zum Beispiel wenn diese Dateien bereits dem
Müllsammler zum Opfer gefallen sind. Es kann auch passieren, dass es mehr
als eine passende @file{.drv} gibt, bei Ableitungen mit fester Ausgabe.
@end table

Zuletzt können Sie mit folgenden Befehlszeilenoptionen die Integrität des
Stores prüfen und den Plattenspeicherverbrauch im Zaum halten.

@table @option

@item --verify[=@var{Optionen}]
@cindex Integrität, des Stores
@cindex Integritätsprüfung
Die Integrität des Stores verifizieren

Standardmäßig wird sichergestellt, dass alle Store-Objekte, die in der
Datenbank des Daemons als gültig markiert wurden, auch tatsächlich in
@file{/gnu/store} existieren.

Wenn angegeben, müssen die @var{Optionen} eine kommagetrennte Liste aus
mindestens einem der Worte @code{contents} und @code{repair} sein.

Wenn Sie @option{--verify=contents} übergeben, berechnet der Daemon den Hash
des Inhalts jedes Store-Objekts und vergleicht ihn mit dem Hash in der
Datenbank. Sind die Hashes ungleich, wird eine Datenbeschädigung
gemeldet. Weil dabei @emph{alle Dateien im Store} durchlaufen werden, kann
der Befehl viel Zeit brauchen, besonders auf Systemen mit langsamer Platte.

@cindex Store, reparieren
@cindex Datenbeschädigung, Behebung
Mit @option{--verify=repair} oder @option{--verify=contents,repair} versucht
der Daemon, beschädigte Store-Objekte zu reparieren, indem er Substitute für
selbige herunterlädt (siehe @ref{Substitute}). Weil die Reparatur nicht
atomar und daher womöglich riskant ist, kann nur der Systemadministrator den
Befehl benutzen. Eine weniger aufwendige Alternative, wenn Sie wissen,
welches Objekt beschädigt ist, ist, @command{guix build --repair} zu
benutzen (siehe @ref{Aufruf von guix build}).

@item --optimize
@cindex Deduplizieren
Den Store durch Nutzung harter Verknüpfungen für identische Dateien
optimieren@tie{}– mit anderen Worten wird der Store @dfn{dedupliziert}.

Der Daemon führt Deduplizierung automatisch nach jeder erfolgreichen
Erstellung und jedem Importieren eines Archivs durch, sofern er nicht mit
@option{--disable-deduplication} (siehe @ref{Aufruf des guix-daemon,
@option{--disable-deduplication}}) gestartet wurde. Diese
Befehlszeilenoption brauchen Sie also in erster Linie dann, wenn der Daemon
zuvor mit @option{--disable-deduplication} gestartet worden ist.

@item --vacuum-database
@cindex Bereinigen der Store-Datenbank
@comment Avoid words like 'repair,' 'compress,' and 'optimize.'
Für Guix wird eine SQLite-Datenbank verwendet, um über die Objekte im Store
Buch zu führen (siehe @ref{Der Store}). Mit der Zeit kann die Datenbank
jedoch eine gigantische Größe erreichen und fragmentieren. Deshalb kann es
sich lohnen, den freien Speicher aufzuräumen und nur teilweise genutzte
Datenbankseiten, die beim Löschen von Paketen bzw.@: nach dem Müllsammeln
entstanden sind, zusammenzulegen. Führen Sie @command{sudo guix gc
--vacuum-database} aus, und die Datenbank wird gesperrt und eine
@code{VACUUM}-Operation auf dem Store durchgeführt, welche die Datenbank
defragmentiert und leere Seiten wegschafft. Wenn alles fertig ist, wird die
Datenbank entsperrt.

@end table

@node Aufruf von guix pull
@section @command{guix pull} aufrufen

@cindex Aktualisieren von Guix
@cindex Updaten von Guix
@cindex @command{guix pull}
@cindex pull
@cindex Sicherheit, bei @command{guix pull}
@cindex Authentizität, bei mit @command{guix pull} bezogenem Code
Nach der Installation oder Aktualisierung wird stets die neueste Version von
Paketen verwendet, die in der aktuell installierten Distribution verfügbar
ist. Um die Distribution und die Guix-Werkzeuge zu aktualisieren, führen Sie
@command{guix pull} aus. Der Befehl lädt den neuesten Guix-Quellcode
einschließlich Paketbeschreibungen herunter und installiert ihn. Quellcode
wird aus einem @uref{https://git-scm.com/book/de/, Git-Repository} geladen,
standardmäßig dem offiziellen Repository von GNU@tie{}Guix, was Sie aber
auch ändern können. @command{guix pull} stellt sicher, dass der
heruntergeladene Code @emph{authentisch} ist, indem es überprüft, dass die
Commits durch Guix-Entwickler signiert worden sind.

Genauer gesagt lädt @command{guix pull} Code von den @dfn{Kanälen} herunter
(siehe @ref{Kanäle}), die an einer der folgenden Stellen, in dieser
Reihenfolge, angegeben wurden:

@enumerate
@item
die Befehlszeilenoption @option{--channels},
@item
die Datei @file{~/.config/guix/channels.scm} des Benutzers, außer wenn
@option{-q} übergeben wird,
@item
die systemweite @file{/etc/guix/channels.scm}-Datei, außer wenn @option{-q}
übergeben wird (auf Guix System können Sie die Datei als Teil der
Betriebssystemkonfiguration deklarieren, siehe
@ref{guix-configuration-channels, das Feld @code{channels} von
@code{guix-configuration}}),
@item
die eingebauten vorgegebenen Kanäle, wie sie in der Variablen
@code{%default-channels} festgelegt sind.
@end enumerate

Danach wird @command{guix package} Pakete und ihre Versionen entsprechend
der gerade heruntergeladenen Kopie von Guix benutzen. Nicht nur das, auch
alle Guix-Befehle und Scheme-Module werden aus der neuesten Version von Guix
kommen. Neue @command{guix}-Unterbefehle, die durch die Aktualisierung
hinzugekommen sind, werden also auch verfügbar.

Jeder Nutzer kann seine Kopie von Guix mittels @command{guix pull}
aktualisieren, wodurch sich nur für den Nutzer etwas verändert, der
@command{guix pull} ausgeführt hat. Wenn also zum Beispiel der
Administratornutzer @code{root} den Befehl @command{guix pull} ausführt, hat
das keine Auswirkungen auf die für den Benutzer @code{alice} sichtbare
Guix-Version, und umgekehrt.

Das Ergebnis von @command{guix pull} ist ein als
@file{~/.config/guix/current} verfügbares @dfn{Profil} mit dem neuesten
Guix.

Die Befehlszeilenoption @option{--list-generations} oder kurz @option{-l}
listet ältere von @command{guix pull} erzeugte Generationen auf, zusammen
mit Informationen zu deren Provenienz.

@example
$ guix pull -l
Generation 1	10. Juni 2018 00:18:18
  guix 65956ad
    Repository-URL: https://git.guix.gnu.org/guix.git
    Branch: origin/master
    Commit: 65956ad3526ba09e1f7a40722c96c6ef7c0936fe

Generation 2	11. Juni 2018 11:02:49
  guix e0cc7f6
    Repository-URL: https://git.guix.gnu.org/guix.git
    Branch: origin/master
    Commit: e0cc7f669bec22c37481dd03a7941c7d11a64f1d

Generation 3	13. Juni 2018 23:31:07	(aktuell)
  guix 844cc1c
    Repository-URL: https://git.guix.gnu.org/guix.git
    Branch: origin/master
    Commit: 844cc1c8f394f03b404c5bb3aee086922373490c
@end example

Im Abschnitt @ref{Aufruf von guix describe, @command{guix describe}} werden
andere Möglichkeiten erklärt, sich den momentanen Zustand von Guix
beschreiben zu lassen.

Das Profil @code{~/.config/guix/current} verhält sich genau wie die durch
@command{guix package} erzeugten Profile (siehe @ref{Aufruf von guix package}). Das bedeutet, Sie können seine Generationen auflisten und es auf
die vorherige Generation@tie{}– also das vorherige Guix@tie{}– zurücksetzen
und so weiter:

@example
$ guix pull --roll-back
Von Generation „3“ zu „2“ gewechselt
$ guix pull --delete-generations=1
/var/guix/profiles/per-user/charlie/current-guix-1-link wird gelöscht
@end example

Sie können auch @command{guix package} benutzen (siehe @ref{Aufruf von guix package}), um das Profil zu verwalten, indem Sie es explizit angeben.:
@example
$ guix package -p ~/.config/guix/current --roll-back
switched from generation 3 to 2
$ guix package -p ~/.config/guix/current --delete-generations=1
deleting /var/guix/profiles/per-user/charlie/current-guix-1-link
@end example

Der Befehl @command{guix pull} wird in der Regel ohne Befehlszeilenargumente
aufgerufen, aber er versteht auch folgende Befehlszeilenoptionen:

@table @code
@item --url=@var{URL}
@itemx --commit=@var{Commit}
@itemx --branch=@var{Branch}
Code wird für den @code{guix}-Kanal von der angegebenen @var{URL} für den
angegebenen @var{Commit} (eine gültige Commit-ID, dargestellt als
hexadezimale Zeichenkette oder Namen eines Git-Tags) oder @var{Branch}
heruntergeladen.

@cindex @file{channels.scm}, Konfigurationsdatei
@cindex Konfigurationsdatei für Kanäle
Diese Befehlszeilenoptionen sind manchmal bequemer, aber Sie können Ihre
Konfiguration auch in der Datei @file{~/.config/guix/channels.scm} oder über
die Option @option{--channels} angeben (siehe unten).

@item --channels=@var{Datei}
@itemx -C @var{Datei}
Die Liste der Kanäle aus der angegebenen @var{Datei} statt aus
@file{~/.config/guix/channels.scm} oder aus @file{/etc/guix/channels.scm}
auslesen. Die @var{Datei} muss Scheme-Code enthalten, der zu einer Liste von
Kanalobjekten ausgewertet wird. Siehe @ref{Kanäle} für nähere
Informationen.

@item --no-channel-files
@itemx -q
Unterdrückt das Laden der Kanaldatei des Benutzers
@file{~/.config/guix/channels.scm} und der systemweiten Kanaldatei
@file{/etc/guix/channels.scm}.

@cindex Neuigkeiten über Kanäle
@item --news
@itemx -N
Neuigkeiten anzeigen, die Kanalautoren für ihre Nutzer geschrieben haben, um
sie über Veränderungen seit der vorigen Generation in Kenntnis zu setzen
(siehe @ref{Kanäle, Kanalneuigkeiten verfassen}). Wenn Sie
@option{--details} übergeben, werden auch neue und aktualisierte Pakete
gezeigt.

Sie können sich mit @command{guix pull -l} diese Informationen für vorherige
Generationen ansehen.

@item --list-generations[=@var{Muster}]
@itemx -l [@var{Muster}]
Alle Generationen von @file{~/.config/guix/current} bzw., wenn ein
@var{Muster} angegeben wird, die dazu passenden Generationen auflisten. Die
Syntax für das @var{Muster} ist dieselbe wie bei @code{guix package
--list-generations} (siehe @ref{Aufruf von guix package}).

Nach Voreinstellung werden Informationen über die benutzten Kanäle in der
jeweiligen Version sowie die zugehörigen Neuigkeiten ausgegeben. Wenn Sie
@option{--details} übergeben, wird außerdem die Liste der neu hinzugefügten
oder aktualisierten Pakete in jeder Generation verglichen mit der vorigen
angezeigt.

@item --details
Bei @option{--list-generations} oder @option{--news} wird Guix angewiesen,
mehr Informationen über die Unterschiede zwischen aufeinanderfolgenden
Generationen anzuzeigen@tie{}– siehe oben.

@item --roll-back
@cindex Rücksetzen
@cindex Zurücksetzen von Transaktionen
@cindex Transaktionen, zurücksetzen
Zur vorherigen @dfn{Generation} von @file{~/.config/guix/current}
zurückwechseln@tie{}– d.h.@: die letzte Transaktion rückgängig machen.

@item --switch-generation=@var{Muster}
@itemx -S @var{Muster}
@cindex Generationen
Wechselt zu der bestimmten Generation, die durch das @var{Muster} bezeichnet
wird.

Als @var{Muster} kann entweder die Nummer einer Generation oder eine Nummer
mit vorangestelltem „+“ oder „-“ dienen. Letzteres springt die angegebene
Anzahl an Generationen vor oder zurück. Zum Beispiel kehrt
@option{--switch-generation=+1} nach einem Zurücksetzen wieder zur neueren
Generation zurück.

@item --delete-generations[=@var{Muster}]
@itemx -d [@var{Muster}]
Wird kein @var{Muster} angegeben, werden alle Generationen außer der
aktuellen entfernt.

Dieser Befehl akzeptiert dieselben Muster wie
@option{--list-generations}. Wenn ein @var{Muster} angegeben wird, werden
die passenden Generationen gelöscht. Wenn das @var{Muster} für eine
Zeitdauer steht, werden diejenigen Generationen gelöscht, die @emph{älter}
als die angegebene Dauer sind. Zum Beispiel löscht
@option{--delete-generations=1m} die Generationen, die mehr als einen Monat
alt sind.

Falls die aktuelle Generation zum Muster passt, wird sie @emph{nicht}
gelöscht.

Beachten Sie, dass Sie auf gelöschte Generationen nicht zurückwechseln
können. Dieser Befehl sollte also nur mit Vorsicht benutzt werden.

Im Abschnitt @ref{Aufruf von guix describe, @command{guix describe}} wird eine
Möglichkeit erklärt, sich Informationen nur über die aktuelle Generation
anzeigen zu lassen.

@item --profile=@var{Profil}
@itemx -p @var{Profil}
Auf @var{Profil} anstelle von @file{~/.config/guix/current} arbeiten.

@item --dry-run
@itemx -n
Anzeigen, welche(r) Commit(s) für die Kanäle benutzt würde(n) und was
jeweils erstellt oder substituiert würde, ohne es tatsächlich durchzuführen.

@item --allow-downgrades
Beziehen einer älteren oder mit der bisheriger Version eines Kanals
@emph{nicht} zusammenhängenden Version zulassen.

@cindex Downgrade Attacks, Schutz davor
Nach Voreinstellung schützt @command{guix pull} den Nutzer vor
Herabstufungsangriffen („Downgrade Attacks“). Damit werden Versuche
bezeichnet, jemanden eine frühere oder unzusammenhängende Version des
Git-Repositorys eines Kanals benutzen zu lassen, wodurch diese Person dazu
gebracht werden kann, ältere Versionen von Softwarepaketen mit bekannten
Schwachstellen zu installieren.

@quotation Anmerkung
Sie sollten verstehen, was es für die Sicherheit Ihres Rechners bedeutet,
ehe Sie @option{--allow-downgrades} benutzen.
@end quotation

@item --disable-authentication
Beziehen von Kanalcode ohne Authentifizierung zulassen.

@cindex Authentifizieren, des Codes eines Kanals
Nach Voreinstellung wird durch @command{guix pull} von Kanälen
heruntergeladener Code darauf überprüft, dass deren Commits durch
autorisierte Entwickler signiert worden sind; andernfalls wird ein Fehler
gemeldet. Mit dieser Befehlszeilenoption können Sie anweisen, keine solche
Verifikation durchzuführen.

@quotation Anmerkung
Sie sollten verstehen, was es für die Sicherheit Ihres Rechners bedeutet,
ehe Sie @option{--disable-authentication} benutzen.
@end quotation

@item --no-check-certificate
X.509-Zertifikate von HTTPS-Servern @emph{nicht} validieren.

Wenn Sie diese Befehlszeilenoption benutzen, haben Sie @emph{keinerlei
Garantie}, dass Sie tatsächlich mit dem authentischen Server, der für die
angegebene URL verantwortlich ist, kommunizieren. Wenn der Kanal keine
Kanalauthentifizierung durchführt, macht Sie das anfällig gegen sogenannte
„Man-in-the-Middle“-Angriffe.

@item --system=@var{System}
@itemx -s @var{System}
Versuchen, für die angegebene Art von @var{System} geeignete Binärdateien zu
erstellen@tie{}– z.B.@: @code{i686-linux}@tie{}– statt für die Art von
System, das die Erstellung durchführt.

@item --bootstrap
Das neueste Guix mit dem Bootstrap-Guile erstellen. Diese
Befehlszeilenoption ist nur für Guix-Entwickler von Nutzen.
@end table

Mit Hilfe von @dfn{Kanälen} können Sie @command{guix pull} anweisen, von
welchem Repository und welchem Branch Guix aktualisiert werden soll, sowie
von welchen @emph{weiteren} Repositorys Paketmodule bezogen werden
sollen. Im Abschnitt @ref{Kanäle} finden Sie nähere Informationen.

Außerdem unterstützt @command{guix pull} alle gemeinsamen
Erstellungsoptionen (siehe @ref{Gemeinsame Erstellungsoptionen}).

@node Aufruf von time-machine
@section @command{guix time-machine} aufrufen

@cindex @command{guix time-machine}
@cindex Festsetzen, bei Kanälen
@cindex Nachbilden von Guix
@cindex Reproduzierbarkeit von Guix

Der Befehl @command{guix time-machine} erleichtert den Zugang zu anderen
Versionen von Guix. Damit können ältere Versionen von Paketen installiert
werden oder eine Berechnung in einer identischen Umgebung reproduziert
werden. Die zu benutzende Guix-Version wird über eine Commit-Angabe oder
eine Kanalbeschreibungsdatei, wie sie durch @command{guix describe} erzeugt
werden kann, festgelegt (siehe @ref{Aufruf von guix describe}).

Sagen wir, Sie würden gerne in der Zeit zurückreisen zu den Tagen um
November 2020, als die Version 1.2.0 von Guix veröffentlicht worden ist, und
außerdem möchten Sie nach Ihrer Ankunft den damaligen @command{guile}-Befehl
ausführen:

@example
guix time-machine --commit=v1.2.0 -- \
  environment -C --ad-hoc guile -- guile
@end example

Mit obigem Befehl wird Guix@tie{}1.2.0 geladen (möglicherweise auch andere
Kanäle, die in Ihren @file{channels.scm} genannten Konfigurationsdateien
festgelegt sind@tie{}– siehe unten) und daraufhin dessen Befehl
@command{guix environment} ausgeführt, um eine Umgebung, in einen Container
verpackt, zu betreten, wo dann @command{guile} gestartet wird (@command{guix
environment} ist mittlerweile Teil von @command{guix shell}, siehe
@ref{Aufruf von guix shell}). Es ist so, als würden Sie einen DeLorean
fahren@footnote{Wenn Sie DeLorean nicht kennen, sollten Sie eine Zeitreise
in die 1980er in Betracht
ziehen. (@uref{https://www.imdb.com/title/tt0088763/, Zurück in die Zukunft
(1985)})}! Der erste Aufruf von @command{guix time-machine} kann lange
dauern, weil vielleicht viele Pakete heruntergeladen oder sogar erstellt
werden müssen, aber das Ergebnis bleibt in einem Zwischenspeicher und danach
geschehen Befehle für denselben Commit fast sofort.

Wie auch bei @command{guix pull} werden, wenn keine abweichenden
Befehlszeilenoptionen angegeben wurden, mit @command{time-machine} die
neuesten Commits derjenigen Kanäle geladen, die in
@file{~/.config/guix/channels.scm}, @file{/etc/guix/channels.scm} oder den
vorgegebenen Kanälen festgelegt sind. Die Konfigurationsdateien können Sie
mit der Befehlszeilenoption @option{-q} ignorieren lassen. Mit dem Befehl:

@example
guix time-machine -q -- build hello
@end example

wird dementsprechend das Paket @code{hello} erstellt, so wie es auf Guix’
Haupt-Branch ohne zusätzliche Kanäle definiert ist, was in der Regel einer
neueren Guix-Version entspricht als der, die Sie installiert
haben. Zeitreisen funktionieren also in beide Richtungen!

@quotation Anmerkung
Vergangene Commits zu Guix sind unveränderlich und @command{guix
time-machine} bietet genau dieselbe Software, wie sie in einer damaligen
Guix-Version bestanden hat. Demzufolge werden auch @emph{keine}
Sicherheitspatches für alte Versionen von Guix oder dessen Kanäle
nachgeliefert. Unbedachter Gebrauch der @command{guix time-machine} lässt
Sicherheitsschwachstellen freien Raum. Siehe @ref{Aufruf von guix pull,
@option{--allow-downgrades}}.
@end quotation

@c Keep this paragraph in sync with 'time-machine.scm'.
Einen Fehler meldet @command{guix time-machine}, wenn Sie eine Zeitreise zu
einem älteren Commit als „v0.16.0“ (Commit @samp{4a0b87f0}) vom Dezember
2018 versuchen. Es handelt sich um einen der frühesten Commits, der den
Kanalmechanismus unterstützt hat, durch den „Zeitreisen“ möglich werden.

@quotation Anmerkung
Technisch gesehen sollte es zwar möglich sein, so einen alten Commit von
Guix zu besuchen, aber Sie müssen unter Umständen einige Hürden überwinden,
falls keine Substitute der Binärdateien mehr angeboten werden. Wenn Sie in
die ferne Vergangenheit reisen, können manche Pakete vielleicht nicht mehr
so einfach aus ihrem Quellcode erstellt werden. Ein Beispiel dafür sind alte
Versionen von OpenSSL, dessen Tests fehlschlagen, wenn ein bestimmtes Datum
vergangen ist. Dieses spezielle Problem lässt sich umgehen, indem Sie eine
@dfn{virtuelle Erstellungsmaschine} einrichten, deren Uhr Sie auf einen
passenden Zeitpunkt zurückdrehen (siehe @ref{build-vm, Virtuelle
Erstellungsmaschinen}).
@end quotation

Die allgemeine Syntax lautet:

@example
guix time-machine @var{Optionen}…@: -- @var{Befehl} @var {Argument}…
@end example

Dabei werden der @var{Befehl} und jedes @var{Argument}…@: unverändert an den
@command{guix}-Befehl der angegebenen Version übergeben. Die @var{Optionen},
die die Version definieren, sind dieselben wie bei @command{guix pull}
(siehe @ref{Aufruf von guix pull}):

@table @code
@item --url=@var{URL}
@itemx --commit=@var{Commit}
@itemx --branch=@var{Branch}
Den @code{guix}-Kanal von der angegebenen @var{URL} benutzen, für den
angegebenen @var{Commit} (eine gültige Commit-ID, dargestellt als
hexadezimale Zeichenkette oder Namen eines Git-Tags) oder @var{Branch}.

@item --channels=@var{Datei}
@itemx -C @var{Datei}
Die Liste der Kanäle aus der angegebenen @var{Datei} auslesen. Die
@var{Datei} muss Scheme-Code enthalten, der zu einer Liste von Kanalobjekten
ausgewertet wird. Siehe @ref{Kanäle} für nähere Informationen.

@item --no-channel-files
@itemx -q
Unterdrückt das Laden der Kanaldatei des Benutzers
@file{~/.config/guix/channels.scm} und der systemweiten Kanaldatei
@file{/etc/guix/channels.scm}.

Anstelle von @command{guix time-machine -q} können Sie daher auch den
folgenden Bash-Befehl verwenden, der die Syntax für „Prozesssubstitutionen“
verwendet (siehe @ref{Process Substitution,,, bash, Referenzhandbuch zu GNU
Bash}):

@example
guix time-machine -C <(echo %default-channels) …
@end example

@end table

Beachten Sie, dass durch @command{guix time-machine} Erstellungen von
Kanälen und deren Abhängigkeiten ausgelöst werden können, welche durch die
gemeinsamen Erstellungsoptionen gesteuert werden können (siehe @ref{Gemeinsame Erstellungsoptionen}).

Wenn @command{guix time-machine} ohne jeden Befehl aufgerufen wird, wird der
Dateiname des Profils ausgegeben, mit dem der Befehl ausgeführt würde. Das
bietet sich manchmal an, wenn Sie den Store-Dateinamen des Profils wissen
möchten, z.B.@: um es mit @command{guix copy} zu übertragen.

@node Untergeordnete
@section Untergeordnete

@c TODO: Remove this once we're more confident about API stability.
@quotation Anmerkung
Die hier beschriebenen Funktionalitäten sind in der Version @value{VERSION}
bloß eine „Technologie-Vorschau“, daher kann sich die Schnittstelle in
Zukunft noch ändern.
@end quotation

@cindex Untergeordnete
@cindex Mischen von Guix-Versionen
Manchmal könnten Sie Pakete aus der gerade laufenden Fassung von Guix mit
denen mischen wollen, die in einer anderen Guix-Version verfügbar sind.
Guix-@dfn{Untergeordnete} ermöglichen dies, indem Sie verschiedene
Guix-Versionen beliebig mischen können.

@cindex untergeordnete Pakete
Aus technischer Sicht ist ein „Untergeordneter“ im Kern ein separater
Guix-Prozess, der über eine REPL (siehe @ref{Aufruf von guix repl}) mit Ihrem
Haupt-Guix-Prozess verbunden ist. Das Modul @code{(guix inferior)}
ermöglicht es Ihnen, Untergeordnete zu erstellen und mit ihnen zu
kommunizieren. Dadurch steht Ihnen auch eine hochsprachliche Schnittstelle
zur Verfügung, um die von einem Untergeordneten angebotenen Pakete zu
durchsuchen und zu verändern@tie{}– @dfn{untergeordnete Pakete}.

In Kombination mit Kanälen (siehe @ref{Kanäle}) bieten Untergeordnete eine
einfache Möglichkeit, mit einer anderen Version von Guix zu
interagieren. Nehmen wir zum Beispiel an, Sie wollen das aktuelle
@code{guile}-Paket in Ihr Profil installieren, zusammen mit dem
@code{guile-json}, wie es in einer früheren Guix-Version existiert
hat@tie{}– vielleicht weil das neuere @code{guile-json} eine inkompatible
API hat und Sie daher Ihren Code mit der alten API benutzen möchten. Dazu
könnten Sie ein Manifest für @code{guix package --manifest} schreiben (siehe
@ref{Manifeste verfassen}); in diesem Manifest würden Sie einen
Untergeordneten für diese alte Guix-Version erzeugen, für die Sie sich
interessieren, und aus diesem Untergeordneten das @code{guile-json}-Paket
holen:

@lisp
(use-modules (guix inferior) (guix channels)
             (srfi srfi-1))   ;für die Prozedur 'first'

(define channels
  ;; Dies ist die alte Version, aus der wir
  ;; guile-json extrahieren möchten.
  (list (channel
         (name 'guix)
         (url "https://git.guix.gnu.org/guix.git")
         (commit
          "65956ad3526ba09e1f7a40722c96c6ef7c0936fe"))))

(define inferior
  ;; Ein Untergeordneter, der obige Version repräsentiert.
  (inferior-for-channels channels))

;; Daraus erzeugen wir jetzt ein Manifest mit dem aktuellen
;; „guile“-Paket und dem alten „guile-json“-Paket.
(packages->manifest
 (list (first (lookup-inferior-packages inferior "guile-json"))
       (specification->package "guile")))
@end lisp

Bei seiner ersten Ausführung könnte für @command{guix package --manifest}
erst der angegebene Kanal erstellt werden müssen, bevor der Untergeordnete
erstellt werden kann; nachfolgende Durchläufe sind wesentlich schneller,
weil diese Guix-Version bereits zwischengespeichert ist.

Folgende Prozeduren werden im Modul @code{(guix inferior)} angeboten, um
einen Untergeordneten zu öffnen:

@deffn {Prozedur} inferior-for-channels Kanäle [#:cache-directory] [#:ttl]
Liefert einen Untergeordneten für die @var{Kanäle}, einer Liste von
Kanälen. Dazu wird der Zwischenspeicher im Verzeichnis @var{cache-directory}
benutzt, dessen Einträge nach @var{ttl} Sekunden gesammelt werden
dürfen. Mit dieser Prozedur wird eine neue Verbindung zum Erstellungs-Daemon
geöffnet.

Als Nebenwirkung erstellt oder substituiert diese Prozedur unter Umständen
Binärdateien für die @var{Kanäle}, was einige Zeit in Anspruch nehmen kann.
@end deffn

@deffn {Prozedur} open-inferior Verzeichnis [#:command "bin/guix"]
Öffnet das untergeordnete Guix mit dem Befehl @var{command} im angegebenen
@var{Verzeichnis} durch Ausführung von @code{@var{Verzeichnis}/@var{command}
repl} oder entsprechend. Liefert @code{#f}, wenn der Untergeordnete nicht
gestartet werden konnte.
@end deffn

@cindex untergeordnete Pakete
Die im Folgenden aufgeführten Prozeduren ermöglichen es Ihnen,
untergeordnete Pakete abzurufen und zu verändern.

@deffn {Prozedur} inferior-packages Untergeordneter
Liefert die Liste der Pakete in @var{Untergeordneter}.
@end deffn

@deffn {Prozedur} lookup-inferior-packages Untergeordneter Name [Version]
Liefert die sortierte Liste der untergeordneten Pakete in
@var{Untergeordneter}, die zum Muster @var{Name} in @var{Untergeordneter}
passen, dabei kommen höhere Versionsnummern zuerst. Wenn @var{Version} auf
wahr gesetzt ist, werden nur Pakete geliefert, deren Versionsnummer mit dem
Präfix @var{Version} beginnt.
@end deffn

@deffn {Prozedur} inferior-package? Objekt
Liefert wahr, wenn das @var{Objekt} ein Untergeordneter ist.
@end deffn

@deffn {Prozedur} inferior-package-name Paket
@deffnx {Prozedur} inferior-package-version Paket
@deffnx {Prozedur} inferior-package-synopsis Paket
@deffnx {Prozedur} inferior-package-description Paket
@deffnx {Prozedur} inferior-package-home-page Paket
@deffnx {Prozedur} inferior-package-location Paket
@deffnx {Prozedur} inferior-package-inputs Paket
@deffnx {Prozedur} inferior-package-native-inputs Paket
@deffnx {Prozedur} inferior-package-propagated-inputs Paket
@deffnx {Prozedur} inferior-package-transitive-propagated-inputs Paket
@deffnx {Prozedur} inferior-package-native-search-paths Paket
@deffnx {Prozedur} inferior-package-transitive-native-search-paths Paket
@deffnx {Prozedur} inferior-package-search-paths Paket
Diese Prozeduren sind das Gegenstück zu den Zugriffsmethoden des Verbunds
„package“ für Pakete (siehe @ref{„package“-Referenz}). Die meisten davon
funktionieren durch eine Abfrage auf dem Untergeordneten, von dem das
@var{Paket} kommt, weshalb der Untergeordnete noch lebendig sein muss, wenn
Sie diese Prozeduren aufrufen.
@end deffn

Untergeordnete Pakete können transparent wie jedes andere Paket oder
dateiartige Objekt in G-Ausdrücken verwendet werden (siehe
@ref{G-Ausdrücke}). Sie werden auch transparent wie reguläre Pakete von
der Prozedur @code{packages->manifest} behandelt, welche oft in Manifesten
benutzt wird (siehe @ref{Aufruf von guix package, die Befehlszeilenoption
@option{--manifest} von @command{guix package}}). Somit können Sie ein
untergeordnetes Paket ziemlich überall dort verwenden, wo Sie ein reguläres
Paket einfügen würden: in Manifesten, im Feld @code{packages} Ihrer
@code{operating-system}-Deklaration und so weiter.

@node Aufruf von guix describe
@section @command{guix describe} aufrufen

@cindex reproducibility
@cindex Nachbilden von Guix
@cindex @command{guix describe}
Sie könnten sich des Öfteren Fragen stellen wie: „Welche Version von Guix
benutze ich gerade?“ oder „Welche Kanäle benutze ich?“ Diese Informationen
sind in vielen Situationen nützlich: wenn Sie eine Umgebung auf einer
anderen Maschine oder mit einem anderen Benutzerkonto @emph{nachbilden}
möchten, wenn Sie einen Fehler melden möchten, wenn Sie festzustellen
versuchen, welche Änderung an den von Ihnen verwendeten Kanälen diesen
Fehler verursacht hat, oder wenn Sie Ihren Systemzustand zum Zweck der
Reproduzierbarkeit festhalten möchten. Der Befehl @command{guix describe}
gibt Ihnen Antwort auf diese Fragen.

Wenn Sie ihn aus einem mit @command{guix pull} bezogenen @command{guix}
heraus ausführen, zeigt Ihnen @command{guix describe} die Kanäle an, aus
denen es erstellt wurde, jeweils mitsamt ihrer Repository-URL und Commit-ID
(siehe @ref{Kanäle}):

@example
$ guix describe
Generation 10	03. September 2018 17:32:44	(aktuell)
  guix e0fa68c
    Repository-URL: https://git.guix.gnu.org/guix.git
    Branch: master
    Commit: e0fa68c7718fffd33d81af415279d6ddb518f727
@end example

Wenn Sie mit dem Versionskontrollsystem Git vertraut sind, erkennen Sie
vielleicht die Ähnlichkeit zu @command{git describe}; die Ausgabe ähnelt
auch der von @command{guix pull --list-generations} eingeschränkt auf die
aktuelle Generation (siehe @ref{Aufruf von guix pull, die Befehlszeilenoption
@option{--list-generations}}). Weil die oben gezeigte Git-Commit-ID
eindeutig eine bestimmte Version von Guix bezeichnet, genügt diese
Information, um die von Ihnen benutzte Version von Guix zu beschreiben, und
auch, um sie nachzubilden.

Damit es leichter ist, Guix nachzubilden, kann Ihnen @command{guix describe}
auch eine Liste der Kanäle statt einer menschenlesbaren Beschreibung wie
oben liefern:

@example
$ guix describe -f channels
(list (channel
        (name 'guix)
        (url "https://git.guix.gnu.org/guix.git")
        (commit
          "e0fa68c7718fffd33d81af415279d6ddb518f727")
        (introduction
          (make-channel-introduction
            "9edb3f66fd807b096b48283debdcddccfea34bad"
            (openpgp-fingerprint
              "BBB0 2DDF 2CEA F6A8 0D1D  E643 A2A0 6DF2 A33A 54FA")))))
@end example

@noindent
Sie können die Ausgabe in einer Datei speichern, die Sie an @command{guix
pull -C} auf einer anderen Maschine oder zu einem späteren Zeitpunkt
übergeben, wodurch dann eine Instanz @emph{von genau derselben Guix-Version}
installiert wird (siehe @ref{Aufruf von guix pull, die Befehlszeilenoption
@option{-C}}). Daraufhin können Sie, weil Sie jederzeit dieselbe Version von
Guix installieren können, auch gleich @emph{eine vollständige
Softwareumgebung genau nachbilden}. Wir halten das trotz aller
Bescheidenheit für @emph{klasse} und hoffen, dass Ihnen das auch gefällt!

Die genauen Befehlszeilenoptionen, die @command{guix describe} unterstützt,
lauten wie folgt:

@table @code
@item --format=@var{Format}
@itemx -f @var{Format}
Die Ausgabe im angegebenen @var{Format} generieren, was eines der Folgenden
sein muss:

@table @code
@item human
für menschenlesbare Ausgabe,
@item channels
eine Liste von Kanalspezifikationen erzeugen, die an @command{guix pull -C}
übergeben werden oder als @file{~/.config/guix/channels.scm} eingesetzt
werden können (siehe @ref{Aufruf von guix pull}),
@item channels-sans-intro
verhält sich wie @code{channels}, aber ohne das @code{introduction}-Feld;
benutzen Sie es, um eine Kanalspezifikation zu erzeugen, die für die
Guix-Version 1.1.0 oder früher geeignet ist@tie{}– das
@code{introduction}-Feld ist für Kanalauthentifizierung gedacht (siehe
@ref{Kanäle, Kanalauthentifizierung}), die von diesen älteren Versionen
nicht unterstützt wird,
@item json
@cindex JSON
generiert eine Liste von Kanalspezifikationen im JSON-Format,
@item recutils
generiert eine Liste von Kanalspezifikationen im Recutils-Format.
@end table

@item --list-formats
Verfügbare Formate für die Befehlszeilenoption @option{--format} anzeigen.

@item --profile=@var{Profil}
@itemx -p @var{Profil}
Informationen über das @var{Profil} anzeigen.
@end table

@node Aufruf von guix archive
@section @command{guix archive} aufrufen

@cindex @command{guix archive}
@cindex Archiv
@cindex Exportieren von Dateien aus dem Store
@cindex Importieren von Dateien in den Store
Der Befehl @command{guix archive} ermöglicht es Nutzern, Dateien im Store in
eine einzelne Archivdatei zu @dfn{exportieren} und diese später auf einer
Maschine, auf der Guix läuft, zu @dfn{importieren}. Insbesondere können so
Store-Objekte von einer Maschine in den Store einer anderen Maschine
übertragen werden.

@quotation Anmerkung
Wenn Sie nach einer Möglichkeit suchen, Archivdateien für andere Werkzeuge
als Guix zu erstellen, finden Sie Informationen dazu im Abschnitt
@ref{Aufruf von guix pack}.
@end quotation

@cindex Store-Objekte exportieren
Führen Sie Folgendes aus, um Store-Dateien als ein Archiv auf die
Standardausgabe zu exportieren:

@example
guix archive --export @var{Optionen} @var{Spezifikationen}…
@end example

@var{Spezifikationen} sind dabei entweder die Namen von Store-Dateien oder
Paketspezifikationen wie bei @command{guix package} (siehe @ref{Aufruf von guix package}). Zum Beispiel erzeugt der folgende Befehl ein Archiv der
@code{gui}-Ausgabe des Pakets @code{git} sowie die Hauptausgabe von
@code{emacs}:

@example
guix archive --export git:gui /gnu/store/…-emacs-24.3 > groß.nar
@end example

Wenn die angegebenen Pakete noch nicht erstellt worden sind, werden sie
durch @command{guix archive} automatisch erstellt. Der Erstellungsprozess
kann durch die gemeinsamen Erstellungsoptionen gesteuert werden (siehe
@ref{Gemeinsame Erstellungsoptionen}).

Um das @code{emacs}-Paket auf eine über SSH verbundene Maschine zu
übertragen, würde man dies ausführen:

@example
guix archive --export -r emacs | ssh die-maschine guix archive --import
@end example

@noindent
Auf gleiche Art kann auch ein vollständiges Benutzerprofil von einer
Maschine auf eine andere übertragen werden:

@example
guix archive --export -r $(readlink -f ~/.guix-profile) | \
  ssh die-maschine guix archive --import
@end example

@noindent
Jedoch sollten Sie in beiden Beispielen beachten, dass alles, was zu
@code{emacs}, dem Profil oder deren Abhängigkeiten (wegen @option{-r})
gehört, übertragen wird, egal ob es schon im Store der Zielmaschine
vorhanden ist oder nicht. Mit der Befehlszeilenoption @option{--missing}
lässt sich herausfinden, welche Objekte im Ziel-Store noch fehlen. Der
Befehl @command{guix copy} vereinfacht und optimiert diesen gesamten
Prozess, ist also, was Sie in diesem Fall wahrscheinlich eher benutzen
wollten (siehe @ref{Aufruf von guix copy}).

@cindex Nar, Archivformat
@cindex Normalisiertes Archiv (Nar)
@cindex Nar-Bündel, Archivformat
Dabei wird jedes Store-Objekt als „normalisiertes Archiv“, kurz „Nar“,
formatiert (was im Folgenden beschrieben wird) und die Ausgabe von
@command{guix archive --export} (bzw.@: die Eingabe von @command{guix
archive --import}) ist ein @dfn{Nar-Bündel}.

Das Nar-Format folgt einem ähnlichen Gedanken wie beim „tar“-Format,
unterscheidet sich aber auf eine für unsere Zwecke geeignetere
Weise. Erstens werden im Nar-Format nicht sämtliche Unix-Metadaten aller
Dateien aufgenommen, sondern nur der Dateityp (ob es sich um eine reguläre
Datei, ein Verzeichnis oder eine symbolische Verknüpfung
handelt). Unix-Dateiberechtigungen sowie Besitzer und Gruppe werden nicht
gespeichert. Zweitens entspricht die Reihenfolge, in der der Inhalt von
Verzeichnissen abgelegt wird, immer der Reihenfolge, in der die Dateinamen
gemäß der C-Locale sortiert würden. Dadurch wird die Erstellung von
Archivdateien völlig deterministisch.

Das Nar-Bündel-Format setzt sich im Prinzip aus null oder mehr
aneinandergehängten Nars zusammen mit Metadaten für jedes enthaltene
Store-Objekt, nämlich dessen Dateinamen, Referenzen, der zugehörigen
Ableitung sowie einer digitalen Signatur.

@c FIXME: Add xref to daemon doc about signatures.
Beim Exportieren versieht der Daemon den Inhalt des Archivs mit einer
digitalen Signatur, auch Beglaubigung genannt. Diese digitale Signatur wird
an das Archiv angehängt. Beim Importieren verifiziert der Daemon die
Signatur und lehnt den Import ab, falls die Signatur ungültig oder der
Signierschlüssel nicht autorisiert ist.

Die wichtigsten Befehlszeilenoptionen sind:

@table @code
@item --export
Exportiert die angegebenen Store-Dateien oder Pakete (siehe unten) und
schreibt das resultierende Archiv auf die Standardausgabe.

Abhängigkeiten @emph{fehlen} in der Ausgabe, außer wenn @option{--recursive}
angegeben wurde.

@item -r
@itemx --recursive
Zusammen mit @option{--export} wird @command{guix archive} hiermit
angewiesen, Abhängigkeiten der angegebenen Objekte auch ins Archiv
aufzunehmen. Das resultierende Archiv ist somit eigenständig; es enthält den
Abschluss der exportierten Store-Objekte.

@item --import
Ein Archiv von der Standardeingabe lesen und darin enthaltende Dateien in
den Store importieren. Der Import bricht ab, wenn das Archiv keine gültige
digitale Signatur hat oder wenn es von einem öffentlichen Schlüssel signiert
wurde, der keiner der autorisierten Schlüssel ist (siehe
@option{--authorize} weiter unten).

@item --missing
Eine Liste der Store-Dateinamen von der Standardeingabe lesen, je ein Name
pro Zeile, und auf die Standardausgabe die Teilmenge dieser Dateien
schreiben, die noch nicht im Store vorliegt.

@item --generate-key[=@var{Parameter}]
@cindex Signieren, von Archiven
Ein neues Schlüsselpaar für den Daemon erzeugen. Dies ist erforderlich,
damit Archive mit @option{--export} exportiert werden können. Normalerweise
wird diese Option sofort umgesetzt, jedoch kann sie, wenn erst der
Entropie-Pool neu gefüllt werden muss, einige Zeit in Anspruch nehmen. Auf
Guix System kümmert sich der @code{guix-service-type} darum, dass beim
ersten Systemstart das Schlüsselpaar erzeugt wird.

Das erzeugte Schlüsselpaar wird typischerweise unter @file{/etc/guix}
gespeichert, in den Dateien @file{signing-key.pub} (für den öffentlichen
Schlüssel) und @file{signing-key.sec} (für den privaten Schlüssel, der
geheim gehalten werden muss). Wurden keine @var{Parameters} angegeben, wird
ein ECDSA-Schlüssel unter Verwendung der Kurve Ed25519 erzeugt, oder, falls
die Libgcrypt-Version älter als 1.6.0 ist, ein 4096-Bit-RSA-Schlüssel. Sonst
geben die @var{Parameter} für Libgcrypt geeignete Parameter für
@code{genkey} an (siehe @ref{General public-key related Functions,
@code{gcry_pk_genkey},, gcrypt, Referenzhandbuch von Libgcrypt}).

@item --authorize
@cindex Autorisieren, von Archiven
Mit dem auf der Standardeingabe übergebenen öffentlichen Schlüssel signierte
Importe autorisieren. Der öffentliche Schlüssel muss als
„advanced“-formatierter S-Ausdruck gespeichert sein, d.h.@: im selben Format
wie die Datei @file{signing-key.pub}.

Die Liste autorisierter Schlüssel wird in der Datei @file{/etc/guix/acl}
gespeichert, die auch von Hand bearbeitet werden kann. Die Datei enthält
@url{https://people.csail.mit.edu/rivest/Sexp.txt, „advanced“-formatierte
S-Ausdrücke} und ist als eine Access Control List für die
@url{https://theworld.com/~cme/spki.txt, Simple Public-Key Infrastructure
(SPKI)} aufgebaut.

@item --extract=@var{Verzeichnis}
@itemx -x @var{Verzeichnis}
Ein Archiv mit einem einzelnen Objekt lesen, wie es von Substitutservern
geliefert wird (siehe @ref{Substitute}), und ins @var{Verzeichnis}
entpacken. Dies ist eine systemnahe Operation, die man nur selten direkt
benutzt; siehe unten.

Zum Beispiel entpackt folgender Befehl das Substitut für Emacs, wie es von
@code{@value{SUBSTITUTE-SERVER-1}} geliefert wird, nach @file{/tmp/emacs}:

@example
$ wget -O - \
  https://@value{SUBSTITUTE-SERVER-1}/nar/gzip/…-emacs-24.5 \
  | gunzip | guix archive -x /tmp/emacs
@end example

Archive mit nur einem einzelnen Objekt unterscheiden sich von Archiven für
mehrere Dateien, wie sie @command{guix archive --export} erzeugt; sie
enthalten nur ein einzelnes Store-Objekt und @emph{keine} eingebettete
Signatur. Beim Entpacken findet also @emph{keine} Signaturprüfung statt und
ihrer Ausgabe sollte so erst einmal nicht vertraut werden.

Der eigentliche Zweck dieser Operation ist, die Inspektion von
Archivinhalten von Substitutservern möglich zu machen, auch wenn diesen
unter Umständen nicht vertraut wird (siehe @ref{Aufruf von guix challenge}).

@item --list
@itemx -t
Ein Archiv mit einem einzelnen Objekt lesen, wie es von Substitutservern
geliefert wird (siehe @ref{Substitute}), und die Dateien darin ausgeben,
wie in diesem Beispiel:

@example
$ wget -O - \
  https://@value{SUBSTITUTE-SERVER-1}/nar/lzip/…-emacs-26.3 \
  | lzip -d | guix archive -t
@end example

@end table

@c *********************************************************************
@node Kanäle
@chapter Kanäle

@cindex channels
@cindex @file{channels.scm}, Konfigurationsdatei
@cindex Konfigurationsdatei für Kanäle
@cindex @command{guix pull}, Konfigurationsdatei
@cindex Konfiguration von @command{guix pull}
Guix und die Sammlung darin verfügbarer Pakete können Sie durch Ausführen
von @command{guix pull} aktualisieren. Standardmäßig lädt @command{guix
pull} Guix selbst vom offiziellen Repository von GNU@tie{}Guix herunter und
installiert es. Diesen Vorgang können Sie anpassen, indem Sie eine Datei mit
den @dfn{Kanälen} angeben, die Sie möchten (siehe @ref{Aufruf von guix pull}). Ein Kanal enthält eine Angabe der URL und eines Branches eines zu
installierenden Git-Repositorys. Sie können @command{guix pull} veranlassen,
die Aktualisierungen von einem oder mehreren Kanälen zu beziehen. Mit
anderen Worten können Kanäle benutzt werden, um Guix @emph{anzupassen} und
zu @emph{erweitern}, wie wir im Folgenden sehen werden. Guix ist in der
Lage, dabei Sicherheitsbedenken zu berücksichtigen und Aktualisierungen zu
authentifizieren.

@menu
* Weitere Kanäle angeben::   Die Paketsammlung erweitern.
* Eigenen Guix-Kanal benutzen::  Ein angepasstes Guix benutzen.
* Guix nachbilden::          Haargenau dasselbe Guix bekommen.
* Anpassung des systemweiten Guix::  Voreingestellte Guix-Kanäle auf Guix 
                                       System.
* Kanalauthentifizierung::   Wie Guix seine Aktualisierung verifiziert.
* Kanäle mit Substituten::   Kanäle nutzen, für die es Substitute gibt.
* Einen Kanal erstellen::    Wie Sie Ihren eigenen Kanal schreiben.
* Paketmodule in einem Unterverzeichnis::  Den Ort der Paketmodule des 
                                             Kanals angeben.
* Kanalabhängigkeiten deklarieren::  Abhängigkeiten von anderen Kanälen 
                                       festlegen.
* Kanalautorisierungen angeben::  Autorisierungen von Kanalautoren 
                                    definieren.
* Primäre URL::              Spiegelserver vom Original unterscheiden.
* Kanalneuigkeiten verfassen::  Den Kanalnutzern Informationen mitteilen.
@end menu

@node Weitere Kanäle angeben
@section Weitere Kanäle angeben

@cindex Paketsammlung erweitern (Kanäle)
@cindex Paketvarianten (Kanäle)
Sie können auch @emph{weitere Kanäle} als Bezugsquelle angeben. Um einen
Kanal zu benutzen, tragen Sie ihn in @code{~/.config/guix/channels.scm} ein,
damit @command{guix pull} diesen Kanal @emph{zusätzlich} zu den
standardmäßigen Guix-Kanälen als Paketquelle verwendet:

@vindex %default-channels
@lisp
;; Paketvarianten zu denen von Guix dazunehmen.
(cons (channel
        (name 'paketvarianten)
        (url "https://example.org/variant-packages.git"))
      %default-channels)
@end lisp

@noindent
Beachten Sie, dass der obige Schnipsel (wie immer!)@: Scheme-Code ist; mit
@code{cons} fügen wir einen Kanal zur Liste der Kanäle hinzu, an die die
Variable @code{%default-channels} gebunden ist (siehe @ref{Pairs,
@code{cons} and lists,, guile, Referenzhandbuch zu GNU Guile}). Mit diesem
Dateiinhalt wird @command{guix pull} nun nicht mehr nur Guix, sondern auch
die Paketmodule aus Ihrem Repository erstellen. Das Ergebnis in
@file{~/.config/guix/current} ist so die Vereinigung von Guix und Ihren
eigenen Paketmodulen.

@example
$ guix describe
Generation 19	27. August 2018 16:20:48
  guix d894ab8
    Repository-URL: https://git.guix.gnu.org/guix.git
    Branch: master
    Commit: d894ab8e9bfabcefa6c49d9ba2e834dd5a73a300
  paketvarianten dd3df5e
    Repository-URL: https://example.org/variant-packages.git
    Branch: master
    Commit: dd3df5e2c8818760a8fc0bd699e55d3b69fef2bb
@end example

@noindent
Obige Ausgabe von @command{guix describe} zeigt an, dass jetzt
Generation@tie{}19 läuft und diese sowohl Guix als auch Pakete aus dem Kanal
@code{paketvarianten} enthält (siehe @ref{Aufruf von guix describe}).

@node Eigenen Guix-Kanal benutzen
@section Eigenen Guix-Kanal benutzen

Der Kanal namens @code{guix} gibt an, wovon Guix selbst@tie{}– seine
Befehlszeilenwerkzeuge und seine Paketsammlung@tie{}– heruntergeladen werden
sollen. Wenn Sie zum Beispiel mit einer anderen Kopie des Guix-Repositorys
arbeiten möchten und diese auf @code{example.org} zu finden ist, und zwar im
Branch namens @code{super-hacks}, dann schreiben Sie folgende Spezifikation
in @code{~/.config/guix/channels.scm}:

@lisp
;; 'guix pull' ein anderes Repository benutzen lassen.
(list (channel
        (name 'guix)
        (url "https://example.org/anderes-guix.git")
        (branch "super-hacks")))
@end lisp

@noindent
Ab dann wird @command{guix pull} seinen Code vom Branch @code{super-hacks}
des Repositorys auf @code{example.org} beziehen. Wie man dessen
Autorisierung bewerkstelligt, können Sie im Folgenden lesen (siehe
@ref{Kanalauthentifizierung}).

Wir weisen darauf hin, dass Sie oben im @code{url}-Feld den Namen eines
lokalen Verzeichnisses angeben können, wenn sich der Kanal, den Sie benutzen
möchten, auf einem lokalen Dateisystem befindet. Allerdings wird
@command{guix} dabei überprüfen, ob das besagte Verzeichnis auch Ihrem
Benutzer gehört, bevor es mit der Verarbeitung fortfährt. Das bedeutet, dass
Benutzer, die ein Verzeichnis standardmäßig beziehen möchten, das ihnen
@emph{nicht} gehört, einen Eintrag in deren globaler Git-Konfigurationsdatei
machen müssen, um das Verzeichnis ausdrücklich als sicher
einzustufen. Andernfalls wird sich @command{guix} weigern, es auch nur zu
lesen. Wenn wir annehmen, dass ein systemweites lokales Verzeichnis unter
@code{/src/guix.git} benutzt werden soll, müsste dafür eine
Git-Konfigurationsdatei namens @code{~/.gitconfig} mit folgendem Inhalt
angelegt werden:

@example
[safe]
        directory = /src/guix.git
@end example

@noindent
Dies gilt auch für den Administratorbenutzer @code{root}, @emph{außer} wenn
der Besitzer des Verzeichnisses einen Aufruf mit @command{sudo} macht.

@node Guix nachbilden
@section Guix nachbilden

@cindex Festsetzen, bei Kanälen
@cindex Nachbilden von Guix
@cindex Reproduzierbarkeit von Guix
Der Befehl @command{guix describe} zeigt genau, aus welchen Commits die
Guix-Instanz erstellt wurde, die Sie benutzen (siehe @ref{Aufruf von guix describe}). Sie können diese Instanz auf einer anderen Maschine oder zu
einem späteren Zeitpunkt nachbilden, indem Sie eine Kanalspezifikation
angeben, die auf diese Commits „festgesetzt“ ist.

@lisp
;; Ganz bestimmte Commits der relevanten Kanäle installieren.
(list (channel
       (name 'guix)
       (url "https://git.guix.gnu.org/guix.git")
       (commit "6298c3ffd9654d3231a6f25390b056483e8f407c"))
      (channel
       (name 'paketvarianten)
       (url "https://example.org/variant-packages.git")
       (commit "dd3df5e2c8818760a8fc0bd699e55d3b69fef2bb")))
@end lisp

Um so eine festgesetzte Kanalspezifikation zu bekommen, ist es am
einfachsten, @command{guix describe} auszuführen und seine Ausgabe in
@code{channels}-Formatierung in einer Datei zu speichern. Das geht so:

@example
guix describe -f channels > channels.scm
@end example

Die erzeugte Datei @file{channels.scm} kann mit der Befehlszeilenoption
@option{-C} von @command{guix pull} (siehe @ref{Aufruf von guix pull}) oder
von @command{guix time-machine} (siehe @ref{Aufruf von time-machine})
übergeben werden. Ein Beispiel:

@example
guix time-machine -C channels.scm -- shell python -- python3
@end example

Anhand der Datei @file{channels.scm} ist festgelegt, dass der obige Befehl
immer @emph{genau dieselbe Guix-Instanz} lädt und dann mit dieser Instanz
genau dasselbe Python startet (siehe @ref{Aufruf von guix shell}). So werden
auf jeder beliebigen Maschine zu jedem beliebigen Zeitpunkt genau dieselben
Binärdateien ausgeführt, Bit für Bit.

@cindex Lockfiles
Das Problem, das solche festgesetzten Kanäle lösen, ist ähnlich zu dem,
wofür andere Werkzeuge zur Softwareauslieferung „Lockfiles“ einsetzen@tie{}–
ein Satz von Paketen wird reproduzierbar auf eine bestimmte Version
festgesetzt. Im Fall von Guix werden allerdings sämtliche mit Guix
ausgelieferte Pakete auf die angegebenen Commits fixiert; tatsächlich sogar
der ganze Rest von Guix mitsamt seinen Kernmodulen und Programmen für die
Befehlszeile. Dazu wird sicher garantiert, dass Sie wirklich genau dieselbe
Software vorfinden werden.

Das verleiht Ihnen Superkräfte, mit denen Sie die Provenienz binärer
Artefakte sehr feinkörnig nachverfolgen können und Software-Umgebungen nach
Belieben nachbilden können. Sie können es als eine Art Fähigkeit zur
„Meta-Reproduzierbarkeit“ auffassen, wenn Sie möchten. Der Abschnitt
@ref{Untergeordnete} beschreibt eine weitere Möglichkeit, diese Superkräfte zu
nutzen.

@node Anpassung des systemweiten Guix
@section Anpassung des systemweiten Guix

@cindex systemweites Guix, Anpassung
@cindex Kanäle, im standardmäßigen Guix
Wenn bei Ihnen Guix System läuft oder Sie Guix System benutzen, um Abbilder
(„Images“) zu erstellen, möchten Sie vielleicht Anpassungen vornehmen,
welches @command{guix} darin systemweit verfügbar ist@tie{}– um genau zu
sein, an @file{/run/current-system/profile/bin/guix}. Zum Beispiel könnten
Sie zusätzliche Kanäle vorsehen oder genau festschreiben, welche Version es
verwendet.

Dazu verwenden Sie die Prozedur @code{guix-for-channels}, die ein Paket für
die angegebenen Pakete zurückliefert, welche sie in Ihrer
Betriebssystemkonfiguration so benutzen wie in diesem Beispiel:

@lisp
(use-modules (gnu packages package-management)
             (guix channels))

(define meine-kanäle
  ;; Die Kanäle, die in /run/current-system/profile/bin/guix
  ;; verfügbar sein sollen.
  (append
   (list (channel
          (name 'guix-science)
          (url "https://codeberg.org/guix-science/guix-science")
          (branch "master")))
   %default-channels))

(operating-system
  ;; …
  (services
    ;; Ändern, welches Paket 'guix-service-type' verwendet.
    (modify-services %base-services
      (guix-service-type
       config => (guix-configuration
                  (inherit config)
                  (channels meine-kanäle)
                  (guix (guix-for-channels meine-kanäle)))))))
@end lisp

Das Ergebnis ist ein Betriebssystem, in dem sowohl der @code{guix}-Kanal als
auch der Kanal @code{guix-science} als Voreinstellung sichtbar sind. Das
Feld @code{channels} in der obigen @code{guix-configuration} bewirkt zudem,
dass die Datei @file{/etc/guix/channels.scm}, die von @command{guix pull}
benutzt wird, dieselben Kanäle angibt (siehe
@ref{guix-configuration-channels, das Feld @code{channels} in
@code{guix-configuration}}).

Das Modul @code{(gnu packages package-management)} exportiert die Prozedur
@code{guix-for-channels}, die im Folgenden beschrieben wird.

@deffn {Prozedur} guix-for-channels @var{Kanäle}
Liefert ein Paket mit jedem der @var{Kanäle}.

Das Ergebnis ist ein „normales“ Paket, das für die Nutzung in
@code{guix-configuration} geeignet ist, wie oben gezeigt, aber auch überall
sonst wo ein Paket erwartet wird.
@end deffn

@node Kanalauthentifizierung
@section Kanalauthentifizierung

@anchor{channel-authentication}
@cindex Authentifizieren, des Codes eines Kanals
Die Befehle @command{guix pull} und @command{guix time-machine}
@dfn{authentifizieren} den von Kanälen bezogenen Code. Es wird geprüft, dass
jeder geladene Commit von einem autorisierten Entwickler signiert wurde. Das
Ziel ist, Sie vor unautorisierten Änderungen am Kanal, die Nutzer bösartigen
Code ausführen lassen, zu schützen.

Als Nutzer müssen Sie eine @dfn{Kanaleinführung} („Channel Introduction“) in
Ihrer Kanaldatei angeben, damit Guix weiß, wie der erste Commit
authentifiziert werden kann. Eine Kanalspezifikation, zusammen mit seiner
Einführung, sieht in etwa so aus:

@lisp
(channel
  (name 'ein-kanal)
  (url "https://example.org/ein-kanal.git")
  (introduction
   (make-channel-introduction
    "6f0d8cc0d88abb59c324b2990bfee2876016bb86"
    (openpgp-fingerprint
     "CABB A931 C0FF EEC6 900D  0CFB 090B 1199 3D9A EBB5"))))
@end lisp

Obige Spezifikation zeigt den Namen und die URL des Kanals. Der Aufruf von
@code{make-channel-introduction}, den Sie oben sehen, gibt an, dass die
Authentifizierung dieses Kanals bei Commit @code{6f0d8cc…} beginnt, welcher
mit dem OpenPGP-Schlüssel mit Fingerabdruck @code{CABB A931…} signiert ist.

Für den Hauptkanal mit Namen @code{guix} bekommen Sie diese Informationen
automatisch mit Ihrer Guix-Installation. Für andere Kanäle tragen Sie die
Kanaleinführung, die Ihnen die Kanalautoren mitteilen, in die Datei
@file{channels.scm} ein. Achten Sie dabei darauf, die Kanaleinführung von
einer vertrauenswürdigen Quelle zu bekommen, denn sie stellt die Wurzel all
Ihren Vertrauens dar.

Wenn Sie neugierig sind, wie die Authentifizierung funktioniert, lesen Sie
weiter!

@node Kanäle mit Substituten
@section Kanäle mit Substituten

Wenn Sie @command{guix pull} ausführen, wird Guix als Erstes die Definition
jedes verfügbaren Pakets kompilieren. Das ist eine teure Operation, für die
es aber Substitute geben könnte (siehe @ref{Substitute}). Mit dem folgenden
Schnipsel in @file{channels.scm} wird sichergestellt, dass @command{guix
pull} den neuesten Commit benutzt, für den bereits Substitute für die
Paketdefinitionen vorliegen. Dazu wird der Server für Kontinuierliche
Integration auf @url{https://ci.guix.gnu.org} angefragt.

@lisp
(use-modules (guix ci))

(list (channel-with-substitutes-available
       %default-guix-channel
       "https://ci.guix.gnu.org"))
@end lisp

Beachten Sie: Das heißt @emph{nicht}, dass für alle Pakete, die Sie
installieren werden, nachdem Sie @command{guix pull} durchgeführt haben,
bereits Substitute vorliegen. Es wird nur sichergestellt, dass @command{guix
pull} keine Paketdefinitionen zu kompilieren versucht. Das hilft besonders
auf Maschinen mit eingeschränkten Rechenressourcen.

@node Einen Kanal erstellen
@section Einen Kanal erstellen

@cindex Eigene Pakete (Kanäle)
@cindex Kanäle, für eigene Pakete
Sagen wir, Sie haben ein paar eigene Paketvarianten oder persönliche Pakete,
von denen Sie meinen, dass sie @emph{nicht} geeignet sind, ins Guix-Projekt
selbst aufgenommen zu werden, die Ihnen aber dennoch wie andere Pakete auf
der Befehlszeile zur Verfügung stehen sollen. Indem Sie einen @dfn{Kanal}
damit anlegen, wird Ihre Sammlung von Paketen nutzbar und Sie können sie mit
anderen teilen. Dazu sind folgende Schritte nötig:

@enumerate
@item
Kanäle werden in Git-Repositorys verwaltet, daher ist der erste Schritt beim
Anlegen eines Kanals, dass Sie sein Repository erzeugen.

@example
mkdir my-channel
cd my-channel
git init
@end example

@item
Im nächsten Schritt erzeugen Sie Dateien für Paketmodule (siehe @ref{Paketmodule}). In jeder können eine oder mehrere Paketdefinitionen stehen (siehe
@ref{Pakete definieren}). Über einen Kanal können Sie auch andere Dinge als
nur Pakete bekommen, etwa Erstellungssysteme oder Dienste; hier geht es um
Pakete, weil sie der häufigste Verwendungszweck sind.

Ein Beispiel: Alice könnte ein Modul mit dem Namen @code{(alice packages
greetings)} bereitstellen für ihre
Lieblings-Hallo-Welt-Implementierungen. Zu diesem Zweck würde Alice ein
Verzeichnis entsprechend dem Modulnamen erzeugen.

@example
mkdir -p alice/packages
$EDITOR alice/packages/greetings.scm
git add alice/packages/greetings.scm
@end example

Welchen Namen Sie einem Paketmodul geben möchten, bleibt Ihnen
überlassen. Behalten Sie nur die Einschränkung im Kopf, dass sich der Name
von anderen Paketsammlungen unterscheiden muss, deshalb trifft Alice aus
unserem Beispiel die weise Entscheidung für @code{(alice packages …)} als
Namensraum.

Es sei erwähnt, dass Sie Paketmodule auch in einem Unterverzeichnis
innerhalb des Repositorys ablegen können; siehe dazu @ref{Paketmodule in einem Unterverzeichnis}.

@item
Nachdem das erste Modul eingerichtet ist, geht es als nächster Schritt ans
Testen der angebotenen Pakete. Dazu können Sie @command{guix build}
verwenden, wobei Sie mitteilen, dass es die Module aus dem Git-Checkout
verwenden soll. Nehmen wir zum Beispiel an, in @code{(alice packages
greetings)} wird ein Paket namens @code{hi-from-alice} angeboten. Dann führt
Alice aus dem Git-Checkout diesen Befehl aus:

@example
guix build -L. hi-from-alice
@end example

@noindent
Hier wird mit @code{-L.} das aktuelle Verzeichnis zu Guiles Ladepfad
hinzugefügt (siehe @ref{Load Paths,,, guile, Referenzhandbuch zu GNU
Guile}).

@item
Es kann ein paar Versuche dauern, aber bald ist Alice zufrieden mit ihren
Paketdefinitionen und committet die Datei:

@example
git commit
@end example

Als Kanalautor möchten Sie vielleicht Materialien mitliefern, damit dessen
Nutzer ihn authentifizieren können. Siehe @ref{Kanalauthentifizierung} und
@ref{Kanalautorisierungen angeben} für Informationen, wie das geht.

@item
Wenn jemand also Alice’ Kanal benutzen möchte, muss er diese
Kanalautorisierungen nur in seiner Kanaldatei eintragen (siehe
@ref{Weitere Kanäle angeben}) und @command{guix pull} ausführen
(siehe @ref{Aufruf von guix pull}):

@example
$EDITOR ~/.config/guix/channels.scm
guix pull
@end example

Von nun an verhält sich Guix so, als hätte man das Wurzelverzeichnis des
Git-Repositorys jenes Kanals dauerhaft zu Guiles Ladepfad hinzugefügt. In
Alice’ Fall wird also @code{(alice packages greetings)} automatisch durch
den @command{guix}-Befehl gefunden.
@end enumerate

Erledigt!

@c What follows stems from discussions at
@c <https://debbugs.gnu.org/cgi/bugreport.cgi?bug=22629#134> as well as
@c earlier discussions on guix-devel@gnu.org.
@c Updated in 2025 to refer to the Deprecation Policy.
@quotation Warnung
Ehe Sie Ihren Kanal der Welt zur Verfügung stellen, möchten wir Ihnen auch
ein paar Worte der Warnung mit auf den Weg geben:

@itemize
@item
Bevor Sie einen Kanal veröffentlichen, überlegen Sie sich bitte erst, ob Sie
die Pakete nicht besser zum eigentlichen Guix-Projekt beisteuern (siehe
@ref{Mitwirken}). Das Guix-Projekt ist gegenüber allen Arten freier
Software offen und zum eigentlichen Guix gehörende Pakete stehen allen
Guix-Nutzern zur Verfügung, außerdem profitieren sie von Guix’
Qualitätssicherungsprozess.

@item
Package modules and package definitions are Scheme code that uses various
programming interfaces (APIs).  Those may occasionally change, in accordance
with our deprecation policy (@pxref{Richtlinie zu Veraltetem}), and it is your
responsibility as a channel author to adjust your code accordingly.

@item
Das bedeutet auch, dass Sie, wenn Sie einen externen Kanal verwenden und
dieser kaputt geht, Sie dies bitte @emph{den Autoren des Kanals} und nicht
dem Guix-Projekt melden.
@end itemize

Wir haben Sie gewarnt! Allerdings denken wir auch, dass externe Kanäle eine
praktische Möglichkeit sind, die Paketsammlung von Guix zu ergänzen und Ihre
Verbesserungen mit anderen zu teilen, wie es dem Grundgedanken
@uref{https://www.gnu.org/philosophy/free-sw.html, freier Software}
entspricht. Bitte schicken Sie eine E-Mail an @email{guix-devel@@gnu.org},
wenn Sie dies diskutieren möchten.
@end quotation



@node Paketmodule in einem Unterverzeichnis
@section Paketmodule in einem Unterverzeichnis

@cindex Unterverzeichnis, Kanäle
Als Kanalautor möchten Sie vielleicht Ihre Kanalmodule in einem
Unterverzeichnis anlegen. Wenn sich Ihre Module im Unterverzeichnis
@file{guix} befinden, müssen Sie eine Datei @file{.guix-channel} mit
Metadaten einfügen:

@lisp
(channel
  (version 0)
  (directory "guix"))
@end lisp

Die Module müssen sich @b{unterhalb} des als @code{directory} angegebenen
Verzeichnisses befinden, weil @code{directory} Guiles Einstellung für
@code{load-path} verändert. Zum Beispiel muss sich, wenn in
@file{.guix-channel} @code{(directory "base")} eingetragen ist, ein Modul,
was als @code{(define-module (gnu packages fun))} definiert ist, in
@code{base/gnu/packages/fun.scm} befinden.

Dadurch ist es möglich, nur einen Teil eines Repositorys als Kanal zu
benutzen, was nützlich ist, weil Guix verlangt, dass beim Beziehen von
Kanälen alle Guile-Module darin auch gültig sind. Zum Beispiel handelt es
sich bei Konfigurationsdateien der Maschinen für @command{guix deploy}
@emph{nicht} um gültige Guile-Module und sie zu beziehen würde @command{guix
pull} fehlschlagen lassen.

@node Kanalabhängigkeiten deklarieren
@section Kanalabhängigkeiten deklarieren

@cindex Abhängigkeiten, bei Kanälen
@cindex Metadaten, bei Kanälen
Kanalautoren können auch beschließen, die Paketsammlung von anderen Kanälen
zu erweitern. Dazu können sie in einer Metadatendatei @file{.guix-channel}
deklarieren, dass ihr Kanal von anderen Kanälen abhängt. Diese Datei muss im
Wurzelverzeichnis des Kanal-Repositorys platziert werden.

Die Metadatendatei sollte einen einfachen S-Ausdruck wie diesen enthalten:

@lisp
(channel
 (version 0)
 (dependencies
  (channel
   (name irgendeine-sammlung)
   (url "https://example.org/erste-sammlung.git")

   ;; Der Teil mit der 'introduction' hier ist optional. Sie geben hier
   ;; die Kanaleinführung an, wenn diese Abhängigkeiten authentifiziert
   ;; werden können.
   (introduction
    (channel-introduction
      (version 0)
      (commit "a8883b58dc82e167c96506cf05095f37c2c2c6cd")
      (signer "CABB A931 C0FF EEC6 900D  0CFB 090B 1199 3D9A EBB5"))))
  (channel
   (name eine-andere-sammlung)
   (url "https://example.org/zweite-sammlung.git")
   (branch "testing"))))
@end lisp

Im Beispiel oben wird deklariert, dass dieser Kanal von zwei anderen Kanälen
abhängt, die beide automatisch geladen werden. Die vom Kanal angebotenen
Module werden in einer Umgebung kompiliert, in der die Module all dieser
deklarierten Kanäle verfügbar sind.

Um Verlässlichkeit und Wartbarkeit zu gewährleisten, sollten Sie darauf
verzichten, eine Abhängigkeit von Kanälen herzustellen, die Sie nicht
kontrollieren, außerdem sollten Sie sich auf eine möglichst kleine Anzahl
von Abhängigkeiten beschränken.

@node Kanalautorisierungen angeben
@section Kanalautorisierungen angeben

@cindex Kanalautorisierungen
@anchor{channel-authorizations}
Wie wir oben gesehen haben, wird durch Guix sichergestellt, dass von Kanälen
geladener Code von autorisierten Entwicklern stammt. Als Kanalautor müssen
Sie die Liste der autorisierten Entwickler in der Datei
@file{.guix-authorizations} im Git-Repository des Kanals festlegen. Die
Regeln für die Authentifizierung sind einfach: Jeder Commit muss mit einem
Schlüssel signiert sein, der in der Datei @file{.guix-authorizations} seines
bzw.@: seiner Elterncommits steht@footnote{Git-Commits bilden einen
@dfn{gerichteten azyklischen Graphen} (englisch „directed acyclic graph“,
kurz DAG). Jeder Commit kann null oder mehr Eltern haben; in der Regel haben
Commits einen Elterncommit, Mergecommits haben zwei. Lesen Sie
@uref{https://eagain.net/articles/git-for-computer-scientists/, @i{Git for
Computer Scientists}} für eine gelungene Übersicht.} Die Datei
@file{.guix-authorizations} sieht so aus:

@lisp
;; Beispiel für eine '.guix-authorizations'-Datei.

(authorizations
 (version 0)               ;aktuelle Version des Dateiformats

 (("AD17 A21E F8AE D8F1 CC02  DBD9 F8AE D8F1 765C 61E3"
   (name "alice"))
  ("2A39 3FFF 68F4 EF7A 3D29  12AF 68F4 EF7A 22FB B2D5"
   (name "bob"))
  ("CABB A931 C0FF EEC6 900D  0CFB 090B 1199 3D9A EBB5"
   (name "charlie"))))
@end lisp

Auf jeden Fingerabdruck folgen optional Schlüssel-/Wert-Paare wie im obigen
Beispiel. Derzeit werden diese Schlüssel-/Wert-Paare ignoriert.

Diese Authentifizierungsregel hat ein Henne-Ei-Problem zur Folge: Wie
authentifizieren wir den ersten Commit? Und damit zusammenhängend: Was tun
wir, wenn die Historie eines Kanal-Repositorys @emph{nicht} signierte
Commits enthält und eine @file{.guix-authorizations}-Datei fehlt? Und wie
legen wir eine Abspaltung („Fork“) existierender Kanäle an?

@cindex Kanaleinführung
Kanaleinführungen beantworten diese Fragen, indem sie den ersten Commit
eines Kanals angeben, der authentifiziert werden soll. Das erste Mal, wenn
ein Kanal durch @command{guix pull} oder @command{guix time-machine} geladen
wird, wird nachgeschaut, was der einführende Commit ist und ob er mit dem
angegebenen OpenPGP-Schlüssel signiert wurde. Von da an werden Commits gemäß
obiger Regel authentifiziert. Damit die Authentifizierung erfolgreich ist,
muss der Ziel-Commit entweder Nachkomme oder Vorgänger des einführenden
Commits sein.

Außerdem muss Ihr Kanal alle OpenPGP-Schlüssel zur Verfügung stellen, die
jemals in @file{.guix-authorizations} erwähnt wurden, gespeichert in Form
von @file{.key}-Dateien, entweder als Binärdateien oder mit
„ASCII-Hülle“. Nach Vorgabe wird nach diesen @file{.key}-Dateien im Branch
namens @code{keyring} gesucht, aber Sie können wie hier einen anderen
Branchnamen in @code{.guix-channel} angeben:

@lisp
(channel
  (version 0)
  (keyring-reference "my-keyring-branch"))
@end lisp

Zusammenfassen haben Kanalautoren drei Dinge zu tun, damit Nutzer deren Code
authentifizieren können:

@enumerate
@item
Exportieren Sie die OpenPGP-Schlüssel früherer und aktueller Committer
mittels @command{gpg --export} und speichern Sie sie in @file{.key}-Dateien,
nach Vorgabe gespeichert in einem Branch namens @code{keyring} (wir
empfehlen, dass Sie diesen als einen @dfn{verwaisten Branch}, d.h.@: einen
„Orphan Branch“, anlegen).

@item
Sie müssen eine anfängliche @file{.guix-authorizations}-Datei im
Kanalrepository platzieren. Der Commit dazu muss signiert sein (siehe
@ref{Commit-Zugriff} für Informationen, wie Sie Git-Commits signieren).

@item
Sie müssen veröffentlichen, wie die Kanaleinführung aussieht, zum Beispiel
auf der Webseite des Kanals. Die Kanaleinführung besteht, wie wir oben
gesehen haben, aus einem Paar aus Commit und Schlüssel@tie{}– für denjenigen
Commit, der @file{.guix-authorizations} hinzugefügt hat, mit dem
Fingerabdruck des OpenPGP-Schlüssels, mit dem er signiert wurde.
@end enumerate

Bevor Sie auf Ihr öffentliches Git-Repository pushen, können Sie
@command{guix git authenticate} ausführen, um zu überprüfen, dass Sie alle
Commits, die Sie pushen würden, mit einem autorisierten Schlüssel signiert
haben:

@example
guix git authenticate @var{Commit} @var{Unterzeichner}
@end example

@noindent
Dabei sind @var{Commit} und @var{Unterzeichner} Ihre Kanaleinführung. Siehe
@ref{Aufruf von guix git authenticate} für die Details.

Um einen signierten Kanal anzubieten, ist Disziplin vonnöten: Jeder Fehler,
wie z.B.@: ein unsignierter Commit oder ein mit einem unautorisierten
Schlüssel signierter Commit, verhindert, das Nutzer den Kanal benutzen
können@tie{}– naja, das ist ja auch der Zweck der Authentifizierung! Passen
Sie besonders bei Merges auf: Merge-Commits werden dann und nur dann als
authentisch angesehen, wenn sie mit einem Schlüssel aus der
@file{.guix-authorizations}-Datei @emph{beider} Branches signiert wurden.

@node Primäre URL
@section Primäre URL

@cindex primäre URL, bei Kanälen
Kanalautoren können die primäre URL des Git-Repositorys ihres Kanals in der
Datei @file{.guix-channel} hinterlegen, etwa so:

@lisp
(channel
  (version 0)
  (url "https://example.org/guix.git"))
@end lisp

Dadurch kann der Befehl @command{guix pull} feststellen, ob er Code von
einem Spiegelserver des Kanals lädt. In diesem Fall wird der Benutzer davor
gewarnt, dass Spiegelserver veraltete Versionen anbieten könnten, und die
eigentliche, primäre URL anzeigen. Auf diese Weise wird verhindert, dass
Nutzer manipuliert werden, Code von einem veralteten Spiegelserver zu
benutzen, der keine Sicherheitsaktualisierungen bekommt.

Diese Funktionalität ergibt nur bei authentifizierbaren Repositorys Sinn,
wie zum Beispiel dem offiziellen @code{guix}-Kanal, für den @command{guix
pull} sicherstellt, dass geladener Code authentisch ist.

@node Kanalneuigkeiten verfassen
@section Kanalneuigkeiten verfassen

@cindex Neuigkeiten, bei Kanälen
Kanalautoren möchten ihren Nutzern vielleicht manchmal Informationen über
wichtige Änderungen im Kanal zukommen lassen. Man könnte allen eine E-Mail
schicken, aber das wäre unbequem.

Stattdessen können Kanäle eine Datei mit Neuigkeiten („News File“) anbieten:
Wenn die Kanalnutzer @command{guix pull} ausführen, wird diese Datei
automatisch ausgelesen. Mit @command{guix pull --news} kann man sich die
Ankündigungen anzeigen lassen, die den neu gepullten Commits entsprechen,
falls es welche gibt.

Dazu müssen Kanalautoren zunächst den Namen der Datei mit Neuigkeiten in der
Datei @file{.guix-channel} nennen:

@lisp
(channel
  (version 0)
  (news-file "etc/news.txt"))
@end lisp

Die Datei mit Neuigkeiten, @file{etc/news.txt} in diesem Beispiel, muss
selbst etwa so aussehen:

@lisp
(channel-news
  (version 0)
  (entry (tag "the-bug-fix")
         (title (en "Fixed terrible bug")
                (fr "Oh la la"))
         (body (en "@@emph@{Good news@}!  It's fixed!")
               (eo "Certe ĝi pli bone funkcias nun!")))
  (entry (commit "bdcabe815cd28144a2d2b4bc3c5057b051fa9906")
         (title (en "Added a great package")
                (ca "Què vol dir guix?"))
         (body (en "Don't miss the @@code@{hello@} package!"))))
@end lisp

Obwohl die Datei für Neuigkeiten Scheme-Syntax verwendet, sollten Sie ihr
keinen Dateinamen mit der Endung @file{.scm} geben, sonst wird sie bei der
Erstellung des Kanals miteinbezogen und dann zu einem Fehler führen, weil es
sich bei ihr um kein gültiges Modul handelt. Alternativ können Sie auch das
Kanalmodul in einem Unterverzeichnis platzieren und die Datei für
Neuigkeiten in einem Verzeichnis außerhalb platzieren.

Die Datei setzt sich aus einer Liste von Einträgen mit Neuigkeiten („News
Entries“) zusammen. Jeder Eintrag ist mit einem Commit oder einem Git-Tag
assoziiert und beschreibt die Änderungen, die in diesem oder auch
vorangehenden Commits gemacht wurden. Benutzer sehen die Einträge nur beim
erstmaligen Übernehmen des Commits, auf den sich der jeweilige Eintrag
bezieht.

Das @code{title}-Feld sollte eine einzeilige Zusammenfassung sein, während
@code{body} beliebig lang sein kann. Beide können Texinfo-Auszeichnungen
enthalten (siehe @ref{Overview,,, texinfo, GNU Texinfo}). Sowohl
@code{title} als auch @code{body} sind dabei eine Liste aus Tupeln mit
jeweils Sprachcode und Mitteilung, wodurch @command{guix pull} Neuigkeiten
in derjenigen Sprache anzeigen kann, die der vom Nutzer eingestellten Locale
entspricht.

Wenn Sie Neuigkeiten mit einem gettext-basierten Arbeitsablauf übersetzen
möchten, können Sie übersetzbare Zeichenketten mit @command{xgettext}
extrahieren (siehe @ref{xgettext Invocation,,, gettext, GNU Gettext
Utilities}). Unter der Annahme, dass Sie Einträge zu Neuigkeiten zunächst
auf Englisch verfassen, können Sie mit diesem Befehl eine PO-Datei erzeugen,
die die zu übersetzenden Zeichenketten enthält:

@example
xgettext -o news.po -l scheme -ken etc/news.txt
@end example

Kurz gesagt, ja, Sie können Ihren Kanal sogar als Blog missbrauchen. Aber
das ist @emph{nicht ganz}, was Ihre Nutzer erwarten dürften.

@c *********************************************************************
@node Entwicklung
@chapter Entwicklung

@cindex Softwareentwicklung
Wenn Sie ein Software-Entwickler sind, gibt Ihnen Guix Werkzeuge an die
Hand, die Sie für hilfreich erachten dürften@tie{}– ganz unabhängig davon,
in welcher Sprache Sie entwickeln. Darum soll es in diesem Kapitel gehen.

Der Befehl @command{guix shell} stellt eine bequeme Möglichkeit dar,
Umgebungen für einmalige Nutzungen zu erschaffen, etwa zur Entwicklung an
einem Programm oder um einen Befehl auszuführen, den Sie nicht in Ihr Profil
installieren möchten. Der Befehl @command{guix pack} macht es Ihnen möglich,
@dfn{Anwendungsbündel} zu erstellen, die leicht an Nutzer verteilt werden
können, die kein Guix benutzen.

@menu
* Aufruf von guix shell::    Software-Umgebungen für den Moment.
* Aufruf von guix environment::  Entwicklungsumgebungen einrichten.
* Aufruf von guix pack::     Software-Bündel erstellen.
* GCC-Toolchain::            Arbeiten mit vom GCC unterstützten Sprachen.
* Aufruf von guix git authenticate::  Git-Repositorys authentifizieren.
@end menu

@node Aufruf von guix shell
@section @command{guix shell} aufrufen

@cindex reproduzierbare Erstellungsumgebungen
@cindex Entwicklungsumgebungen
@cindex @command{guix environment}
@cindex @command{guix shell}
@cindex Umgebung, Paketerstellungsumgebung
Der Zweck von @command{guix shell} ist, dass Sie Software-Umgebungen für
außergewöhnliche Fälle einfach aufsetzen können, ohne dass Sie Ihr Profil
ändern müssen. Normalerweise braucht man so etwas für
Entwicklungsumgebungen, aber auch wenn Sie Anwendungen ausführen wollen,
ohne Ihr Profil mit ihnen zu verunreinigen.

@quotation Anmerkung
Der Befehl @command{guix shell} wurde erst kürzlich eingeführt als
Neuauflage von @command{guix environment} (siehe @ref{Aufruf von guix environment}). Wenn Sie mit @command{guix environment} vertraut sind, werden
Sie die Ähnlichkeit bemerken, aber wir hoffen, der neue Befehl erweist sich
als praktischer.
@end quotation

Die allgemeine Syntax lautet:

@example
guix shell [@var{Optionen}] [@var{Pakete}…]
@end example

Manchmal will man keine interaktive Shell-Sitzung. Ein beliebiger Befehl
kann aufgerufen werden, indem Sie nach Angabe der Pakete noch @code{--} vor
den gewünschten Befehl schreiben, um ihn von den übrigen Argumenten
abzutrennen.

Folgendes Beispiel zeigt, wie Sie eine Umgebung erzeugen lassen, die Python
und NumPy enthält,@tie{}– jedes dazu fehlende Paket wird erstellt oder
heruntergeladen@tie{}–, und in der Umgebung dann @command{python3}
ausführen.

@example
guix shell python python-numpy -- python3
@end example

Wir betonen, dass Sie auch das zu Grunde liegende @code{python}-Paket in dem
Befehl angeben müssen, sogar wenn Python schon in Ihre Umgebung installiert
ist. Das bewirkt, dass in der Shell-Umgebung @env{PYTHONPATH} und andere
zugehörige Variable gesetzt werden können. Die Shell-Umgebung kann dafür
nicht darauf zurückgreifen, was vorher in der Umgebung installiert war, weil
es nichtdeterministisch wäre. Das gilt für die meisten Bibliotheken: Auch
das zu deren Programmiersprache gehörige Paket muss im Shell-Aufruf
angegeben werden.

@quotation Anmerkung
@cindex Shebang, bei @command{guix shell}
@command{guix shell} kann auch als Skript-Interpretierer dienen; man spricht
auch von einem @dfn{Shebang}. Hier ist ein Beispiel, wie es in einem
eigenständigen Python-Skript benutzt werden kann:

@example
#!/usr/bin/env -S guix shell python python-numpy -- python3
import numpy
print("Hier spricht numpy", numpy.version.version)
@end example

Sie können beliebige Befehlszeilenoptionen auf diese Weise an @command{guix
shell} übergeben, doch beachten Sie: Der Linux-Kernel beschränkt die Länge
eines Shebangs auf maximal 127 Bytes.
@end quotation

Entwicklungsumgebungen erzeugen Sie wie im folgenden Beispiel, wo eine
interaktive Shell gestartet wird, in der alle Abhängigkeiten und Variable
vorliegen, die zur Arbeit an Inkscape nötig sind:

@example
guix shell --development inkscape
@end example

Sobald er die Shell beendet, findet sich der Benutzer in der ursprünglichen
Umgebung wieder, in der er sich vor dem Aufruf von @command{guix shell}
befand. Beim nächsten Durchlauf des Müllsammlers (siehe @ref{Aufruf von guix gc}) dürfen Pakete von der Platte gelöscht werden, die innerhalb der
Umgebung installiert worden sind und außerhalb nicht länger benutzt werden.

Um die Nutzung zu vereinfachen, wird @command{guix shell}, wenn Sie es
interaktiv ohne Befehlszeilenargumente aufrufen, das bewirken, was es dann
vermutlich soll. Also:

@example
guix shell
@end example

Wenn im aktuellen Arbeitsverzeichnis oder irgendeinem übergeordneten
Verzeichnis eine Datei @file{manifest.scm} vorkommt, wird sie so behandelt,
als hätten Sie sie mit @code{--manifest} übergeben. Ebenso wird mit einer
Datei @file{guix.scm}, wenn sie in selbigen Verzeichnissen enthalten ist,
eine Entwicklungsumgebung hergestellt, als wären @code{--development} und
@code{--file} beide angegeben worden. So oder so wird die jeweilige Datei
nur dann geladen, wenn das Verzeichnis, in dem sie steckt, in
@file{~/.config/guix/shell-authorized-directories} aufgeführt ist. Damit
lassen sich Entwicklungsumgebungen leicht definieren, teilen und betreten.

Vorgegeben ist, dass für die Shell-Sitzung bzw.@: den Befehl eine
@emph{ergänzte} Umgebung aufgebaut wird, in der die neuen Pakete zu
Suchpfad-Umgebungsvariablen wie @code{PATH} hinzugefügt werden. Sie können
stattdessen auch beschließen, eine @emph{isolierte} Umgebung anzufordern mit
nichts als den Paketen, die Sie angegeben haben. Wenn Sie die
Befehlszeilenoption @option{--pure} angeben, werden alle Definitionen von
Umgebungsvariablen aus der Elternumgebung gelöscht@footnote{Denken Sie
daran, wenn Sie das erste Mal @command{guix shell} interaktiv benutzen, mit
der Befehlszeilenoption @option{--check} zu prüfen, dass die
Shell-Einstellungen die Wirkung von @option{--pure} nicht wieder
zurücknehmen.}. Wenn Sie @option{--container} angeben, wird die Shell
darüber hinaus in einem @dfn{Container} vom restlichen System isoliert:

@example
guix shell --container emacs gcc-toolchain
@end example

Dieser Befehl startet eine interaktive Shell in einem Container, der den
Zugriff auf alles außer @code{emacs}, @code{gcc-toolchain} und deren
Abhängigkeiten unterbindet. Im Container haben Sie keinen Netzwerkzugriff
und es werden außer dem aktuellen Arbeitsverzeichnis keine Dateien mit der
äußeren Umgebung geteilt. Das dient dazu, den Zugriff auf systemweite
Ressourcen zu verhindern, wie @file{/usr/bin} auf Fremddistributionen.

Diese @option{--container}-Befehlszeilenoption kann sich aber auch als
nützlich erweisen, um Anwendungen mit hohem Sicherheitsrisiko wie z.B.@:
Webbrowser in eine isolierte Umgebung eingesperrt auszuführen. Folgender
Befehl startet zum Beispiel Ungoogled-Chromium in einer isolierten Umgebung,
für die gilt:
@itemize
@item Netzwerkzugriff des Wirtssystems wird geteilt
@item Umgebungsvariable @code{DISPLAY} und @code{XAUTHORITY} bleiben erhalten
@item hat Zugriff auf Wirts-Autorisierungsinformationen aus dem @code{XAUTHORITY}
file
@item das aktuelle Arbeitsverzeichnis des Wirts ist unbekannt
@end itemize

@example
guix shell --container --network --no-cwd ungoogled-chromium \
  --preserve='^XAUTHORITY$' --expose="$@{XAUTHORITY@}" \
  --preserve='^DISPLAY$' -- chromium
@end example

@vindex GUIX_ENVIRONMENT
@command{guix shell} definiert die Variable @env{GUIX_ENVIRONMENT} in der
neu erzeugten Shell. Ihr Wert ist der Dateiname des Profils dieser neuen
Umgebung. Das könnten Nutzer verwenden, um zum Beispiel eine besondere
Prompt als Eingabeaufforderung für Entwicklungsumgebungen in ihrer
@file{.bashrc} festzulegen (siehe @ref{Bash Startup Files,,, bash,
Referenzhandbuch von GNU Bash}):

@example
if [ -n "$GUIX_ENVIRONMENT" ]
then
    export PS1="\u@@\h \w [dev]\$ "
fi
@end example

@noindent
…@: oder um ihr Profil durchzusehen:

@example
$ ls "$GUIX_ENVIRONMENT/bin"
@end example

Im Folgenden werden die verfügbaren Befehlszeilenoptionen zusammengefasst.

@table @code
@item --check
Hiermit wird die Umgebung angelegt und gemeldet, ob die Shell
Umgebungsvariable überschreiben würde. Es ist eine gute Idee, diese
Befehlszeilenoption anzugeben, wenn Sie zum ersten Mal @command{guix shell}
zum Starten einer interaktiven Sitzung einsetzen, um sicherzugehen, dass
Ihre Shell richtig eingestellt ist.

Wenn die Shell zum Beispiel den Wert der Umgebungsvariablen @env{PATH}
ändert, meldet dies @option{--check}, weil Sie dadurch nicht die Umgebung
bekämen, die Sie angefordert haben.

In der Regel sind solche Probleme ein Zeichen dafür, dass Dateien, die beim
Start der Shell geladen werden, die Umgebungsvariablen unerwartet
verändern. Wenn Sie zum Beispiel Bash benutzen, vergewissern Sie sich, dass
Umgebungsvariable in @file{~/.bash_profile} festgelegt oder geändert werden,
@emph{nicht} in @file{~/.bashrc}@tie{}– erstere Datei wird nur von
Login-Shells mit „source“ geladen. Siehe @ref{Bash Startup Files,,, bash,
Referenzhandbuch zu GNU Bash} für Details über beim Starten von Bash
gelesene Dateien.

@anchor{shell-development-option}
@item --development
@itemx -D
Lässt @command{guix shell} die Abhängigkeiten des danach angegebenen Pakets
anstelle des Pakets in die Umgebung aufnehmen. Es kann mit anderen Paketen
kombiniert werden. Zum Beispiel wird mit folgendem Befehl eine interaktive
Shell gestartet, die die zum Erstellen nötigen Abhängigkeiten von
GNU@tie{}Guile sowie Autoconf, Automake und Libtool enthält:

@example
guix shell -D guile autoconf automake libtool
@end example

@item --expression=@var{Ausdruck}
@itemx -e @var{Ausdruck}
Eine Umgebung für das Paket oder die Liste von Paketen erzeugen, zu der der
@var{Ausdruck} ausgewertet wird.

Zum Beispiel startet dies:

@example
guix shell -D -e '(@@ (gnu packages maths) petsc-openmpi)'
@end example

eine Shell mit der Umgebung für eben diese bestimmte Variante des Pakets
PETSc.

Wenn man dies ausführt:

@example
guix shell -e '(@@ (gnu) %base-packages)'
@end example

bekommt man eine Shell, in der alle Basis-Pakete verfügbar sind.

Die obigen Befehle benutzen nur die Standard-Ausgabe des jeweiligen
Pakets. Um andere Ausgaben auszuwählen, können zweielementige Tupel
spezifiziert werden:

@example
guix shell -e '(list (@@ (gnu packages bash) bash) "include")'
@end example

Siehe @ref{package-development-manifest,
@code{package->development-manifest}}, für Informationen, wie Sie die
Entwicklungsumgebung für ein Paket in einem Manifest wiedergeben.

@item --file=@var{Datei}
@itemx -f @var{Datei}
Eine Umgebung erstellen mit dem Paket oder der Liste von Paketen, zu der der
Code in der @var{Datei} ausgewertet wird.

Zum Beispiel könnte die @var{Datei} eine Definition wie diese enthalten
(siehe @ref{Pakete definieren}):

@lisp
@verbatiminclude environment-gdb.scm
@end lisp

Mit so einer Datei können Sie eine Entwicklungsumgebung für GDB betreten,
indem Sie dies ausführen:

@example
guix shell -D -f gdb-devel.scm
@end example

@anchor{shell-manifest}
@item --manifest=@var{Datei}
@itemx -m @var{Datei}
Eine Umgebung für die Pakete erzeugen, die im Manifest-Objekt enthalten
sind, das vom Scheme-Code in der @var{Datei} geliefert wird. Wenn diese
Befehlszeilenoption mehrmals wiederholt angegeben wird, werden die Manifeste
aneinandergehängt.

Dies verhält sich ähnlich wie die gleichnamige Option des Befehls
@command{guix package} (siehe @ref{profile-manifest, @option{--manifest}})
und benutzt auch dieselben Manifestdateien.

Siehe @ref{Manifeste verfassen} für Informationen dazu, wie man ein Manifest
schreibt. Siehe @option{--export-manifest} im folgenden Text, um zu
erfahren, wie Sie ein erstes Manifest erhalten.

@cindex Manifest, exportieren
@anchor{shell-export-manifest}
@item --export-manifest
Auf die Standardausgabe ein Manifest ausgeben, das mit @option{--manifest}
genutzt werden kann und den angegebenen Befehlszeilenoptionen entspricht.

Auf diese Weise können Sie die Argumente der Befehlszeile in eine
Manifestdatei verwandeln. Nehmen wir an, Sie wären es leid, lange
Befehlszeilen abzutippen, und hätten stattdessen lieber ein
gleichbedeutendes Manifest:

@example
guix shell -D guile git emacs emacs-geiser emacs-geiser-guile
@end example

Fügen Sie einfach @option{--export-manifest} zu der obigen Befehlszeile
hinzu:

@example
guix shell --export-manifest \
  -D guile git emacs emacs-geiser emacs-geiser-guile
@end example

@noindent
… und schon sehen Sie ein Manifest, was so ähnlich aussieht:

@lisp
(concatenate-manifests
  (list (specifications->manifest
          (list "git"
                "emacs"
                "emacs-geiser"
                "emacs-geiser-guile"))
        (package->development-manifest
          (specification->package "guile"))))
@end lisp

Diese Ausgabe können Sie in einer Datei speichern, nennen wir sie
@file{manifest.scm}, die Sie dann an @command{guix shell} oder so ziemlich
jeden beliebigen @command{guix}-Befehl übergeben:

@example
guix shell -m manifest.scm
@end example

Na bitte. Aus der langen Befehlszeile ist ein Manifest geworden! Beim
Verwandlungsvorgang werden Paketumwandlungsoptionen berücksichtigt (siehe
@ref{Paketumwandlungsoptionen}), d.h.@: er sollte verlustfrei sein.

@item --profile=@var{Profil}
@itemx -p @var{Profil}
Eine Umgebung mit den Paketen erzeugen, die im @var{Profil} installiert
sind. Benutzen Sie @command{guix package} (siehe @ref{Aufruf von guix package}), um Profile anzulegen und zu verwalten.

@item --pure
Bestehende Umgebungsvariable deaktivieren, wenn die neue Umgebung erzeugt
wird, mit Ausnahme der mit @option{--preserve} angegebenen Variablen (siehe
unten). Dies bewirkt, dass eine Umgebung erzeugt wird, in der die Suchpfade
nur Paketeingaben nennen und sonst nichts.

@item --preserve=@var{Regexp}
@itemx -E @var{Regexp}
Wenn das hier zusammen mit @option{--pure} angegeben wird, bleiben die zum
regulären Ausdruck @var{Regexp} passenden Umgebungsvariablen erhalten@tie{}–
mit anderen Worten werden sie auf eine „weiße Liste“ von Umgebungsvariablen
gesetzt, die erhalten bleiben müssen. Diese Befehlszeilenoption kann
mehrmals wiederholt werden.

@example
guix shell --pure --preserve=^SLURM openmpi …@: \
  -- mpirun …
@end example

In diesem Beispiel wird @command{mpirun} in einem Kontext ausgeführt, in dem
die einzig definierten Umgebungsvariablen @env{PATH} und solche sind, deren
Name mit @samp{SLURM} beginnt, sowie die üblichen besonders „kostbaren“
Variablen (@env{HOME}, @env{USER}, etc.).

@item --search-paths
Die Umgebungsvariablendefinitionen anzeigen, aus denen die Umgebung besteht.

@item --system=@var{System}
@itemx -s @var{System}
Versuchen, für das angegebene @var{System} zu erstellen@tie{}– z.B.@:
@code{i686-linux}.

@item --container
@itemx -C
@cindex container
Den @var{Befehl} in einer isolierten Umgebung (einem sogenannten
„Container“) ausführen. Das aktuelle Arbeitsverzeichnis außerhalb des
Containers wird in den Container zugeordnet. Zusätzlich wird, wenn es mit
der Befehlszeilenoption @option{--user} nicht anders spezifiziert wurde, ein
stellvertretendes persönliches Verzeichnis erzeugt, dessen Inhalt der des
wirklichen persönlichen Verzeichnisses ist, sowie eine passend konfigurierte
Datei @file{/etc/passwd}.

Der erzeugte Prozess läuft außerhalb des Containers als der momentane
Nutzer. Innerhalb des Containers hat er dieselbe UID und GID wie der
momentane Nutzer, außer die Befehlszeilenoption @option{--user} wird
übergeben (siehe unten).

@item --network
@itemx -N
Bei isolierten Umgebungen („Containern“) wird hiermit der
Netzwerk-Namensraum mit dem des Wirtssystems geteilt. Container, die ohne
diese Befehlszeilenoption erzeugt wurden, haben nur Zugriff auf das
Loopback-Gerät.

@item --link-profile
@itemx -P
Bei isolierten Umgebungen („Containern“) wird das Umgebungsprofil im
Container als @file{~/.guix-profile} verknüpft und @file{~/.guix-profile}
dann in @code{GUIX_ENVIRONMENT} gespeichert. Das ist äquivalent dazu,
@file{~/.guix-profile} im Container zu einer symbolischen Verknüpfung auf
das tatsächliche Profil zu machen. Wenn das Verzeichnis bereits existiert,
schlägt das Verknüpfen fehl und die Umgebung wird nicht hergestellt. Dieser
Fehler wird immer eintreten, wenn @command{guix shell} im persönlichen
Verzeichnis des Benutzers aufgerufen wurde.

Bestimmte Pakete sind so eingerichtet, dass sie in @file{~/.guix-profile}
nach Konfigurationsdateien und Daten suchen,@footnote{Zum Beispiel
inspiziert das Paket @code{fontconfig} das Verzeichnis
@file{~/.guix-profile/share/fonts}, um zusätzliche Schriftarten zu finden.}
weshalb @option{--link-profile} benutzt werden kann, damit sich diese
Programme auch in der isolierten Umgebung wie erwartet verhalten.

@item --user=@var{Benutzer}
@itemx -u @var{Benutzer}
Bei isolierten Umgebungen („Containern“) wird der Benutzername
@var{Benutzer} anstelle des aktuellen Benutzers benutzt. Der erzeugte
Eintrag in @file{/etc/passwd} im Container wird also den Namen
@var{Benutzer} enthalten und das persönliche Verzeichnis wird den Namen
@file{/home/BENUTZER} tragen; keine GECOS-Daten über den Nutzer werden in
die Umgebung übernommen. Des Weiteren sind UID und GID innerhalb der
isolierten Umgebung auf 1000 gesetzt. @var{Benutzer} muss auf dem System
nicht existieren.

Zusätzlich werden alle geteilten oder exponierten Pfade (siehe jeweils
@option{--share} und @option{--expose}), deren Ziel innerhalb des
persönlichen Verzeichnisses des aktuellen Benutzers liegt, relativ zu
@file{/home/BENUTZER} erscheinen, einschließlich der automatischen Zuordnung
des aktuellen Arbeitsverzeichnisses.

@example
# wird Pfade als /home/foo/wd, /home/foo/test und /home/foo/target exponieren
cd $HOME/wd
guix shell --container --user=foo \
     --expose=$HOME/test \
     --expose=/tmp/target=$HOME/target
@end example

Obwohl dies das Datenleck von Nutzerdaten durch Pfade im persönlichen
Verzeichnis und die Benutzereinträge begrenzt, kann dies nur als Teil einer
größeren Lösung für Datenschutz und Anonymität sinnvoll eingesetzt
werden. Es sollte nicht für sich allein dazu eingesetzt werden.

@item --no-cwd
In isolierten Umgebungen („Containern“) ist das vorgegebene Verhalten, das
aktuelle Arbeitsverzeichnis mit dem isolierten Container zu teilen und in
der Umgebung sofort in dieses Verzeichnis zu wechseln. Wenn das nicht
gewünscht wird, kann das Angeben von @option{--no-cwd} dafür sorgen, dass
das Arbeitsverzeichnis @emph{nicht} automatisch geteilt wird und stattdessen
in das Persönliche Verzeichnis („Home“-Verzeichnis) gewechselt wird. Siehe
auch @option{--user}.

@item --writable-root
Wenn Sie @option{--container} benutzen, bekommen Sie durch diese
Befehlszeilenoption in dessen Wurzeldateisystem Schreibberechtigung
(vorgegeben ist, dass nur Lesezugriffe möglich sind).

@item --expose=@var{Quelle}[=@var{Ziel}]
@itemx --share=@var{Quelle}[=@var{Ziel}]
Bei isolierten Umgebungen („Containern“) wird das Dateisystem unter
@var{Quelle} vom Wirtssystem als Nur-Lese-Dateisystem @var{Ziel} (bzw.@: für
@option{--share} auch mit Schreibrechten) im Container zugänglich
gemacht. Wenn kein @var{Ziel} angegeben wurde, wird die @var{Quelle} auch
als Ziel-Einhängepunkt in der isolierten Umgebung benutzt.

Im folgenden Beispiel wird eine Guile-REPL in einer isolierten Umgebung
gestartet, in der das persönliche Verzeichnis des Benutzers als Verzeichnis
@file{/austausch} nur für Lesezugriffe zugänglich gemacht wurde:

@example
guix shell --container --expose=$HOME=/austausch guile -- guile
@end example

@cindex symbolische Verknüpfungen, guix shell
@item --symlink=@var{Spezifikation}
@itemx -S @var{Spezifikation}
Für Container werden hiermit die in der @var{Spezifikation} angegebenen
symbolischen Verknüpfungen hergestellt. Siehe die Dokumentation in
@ref{pack-symlink-option}.

@cindex File System Hierarchy Standard (FHS)
@cindex FHS (File System Hierarchy Standard)
@item --emulate-fhs
@itemx -F
Wenn Sie dies zusammen mit @option{--container} angeben, wird im Container
eine Konfiguration emuliert, die dem
@uref{https://refspecs.linuxfoundation.org/fhs.shtml, Filesystem Hierarchy
Standard (FHS)} folgt, so dass es @file{/bin}, @file{/lib} und weitere
Verzeichnisse gibt, wie es der FHS vorschreibt.

Obwohl Guix vom FHS-Standard abweicht, kann das System in Ihrem Container
mit dieser Befehlszeilenoption zu anderen GNU/Linux-Distributionen ähnlicher
werden. Dadurch lassen sich dortige Entwicklungsumgebungen reproduzieren und
Sie können Programme testen und benutzen, die das Befolgen des FHS-Standards
voraussetzen. Wenn die Option angegeben wird, enthält der Container eine
Version von glibc, die die im Container befindliche @file{/etc/ld.so.cache}
als Zwischenspeicher gemeinsamer Bibliotheken ausliest (anders als glibc im
normalen Gebrauch von Guix), und die im FHS verlangten Verzeichnisse
@file{/bin}, @file{/etc}, @file{/lib} und @file{/usr} werden aus dem Profil
des Containers übernommen.

@cindex Verschachteln von Containern, bei @command{guix shell}
@cindex Container verschachteln, bei @command{guix shell}
@item --nesting
@itemx -W
Wenn Sie dies zusammen mit @option{--container} angeben, wird Guix im
Container verfügbar gemacht, so dass man sich von innerhalb mit dem
Erstellungs-Daemon verbinden kann, der außerhalb des Containers läuft. Das
können Sie gebrauchen, wenn Sie vom isolierten Container aus wiederum andere
Container erzeugen lassen können wollen wie in dieser Beispielsitzung:

@example
$ guix shell -CW coreutils
[env]$ guix shell -C guile -- guile -c '(display "Hallo!\n")'
Hallo!
[env]$ exit
@end example

In der Sitzung wird ein Container gestartet, in dem die
@code{coreutils}-Programme in @env{PATH} zur Verfügung stehen. Von da aus
legen wir mit @command{guix shell} einen inneren, @emph{verschachtelten}
Container an, der außer Guile nichts verfügbar macht.

Ein weiteres Anwendungsbeispiel ist, wenn Sie eine @file{guix.scm} auswerten
möchten, der Sie @emph{nicht} vertrauen, wie hier:

@example
guix shell -CW -- guix build -f guix.scm
@end example

Durch einen so durchgeführten Befehl @command{guix build} sind nur Zugriffe
auf Ihr aktuelles Arbeitsverzeichnis möglich.

Intern werden für die Befehlszeilenoption @option{-W} mehrere Einstellungen
vorgenommen:

@itemize
@item
Der Socket für den Daemon (in der Vorgabeeinstellung ist das
@file{/var/guix/daemon-socket/socket}) wird im Container verfügbar gemacht.
@item
Der gesamte Store (in der Vorgabeeinstellung ist das @file{/gnu/store}) wird
im Container verfügbar gemacht, damit auf Store-Objekte von verschachtelten
@command{guix}-Aufrufen zugegriffen werden kann.
@item
Der aktuell benutzte @command{guix}-Befehl wird zum Profil innerhalb des
Containers hinzugefügt, so dass @command{guix describe} innerhalb und
außerhalb des Containers den gleichen Zustand ausgibt.
@item
Der Zwischenspeicher (in der Vorgabeeinstellung ist das
@file{~/.cache/guix}) des Wirtssystems wird mit Schreibzugriff zugänglich
gemacht. Dadurch können Befehle wie @command{guix time-machine} und
@command{guix shell} effizient ablaufen.
@end itemize

@item --rebuild-cache
@cindex Zwischenspeichern, von Profilen
@cindex Zwischenspeichern, bei @command{guix shell}
In der Regel wird @command{guix shell} die Umgebung zwischenspeichern, damit
weitere Aufrufe sie ohne Verzögerung verwenden können. Am längsten
@emph{nicht} verwendete („least recently used“) Einträge im Zwischenspeicher
werden bei @command{guix shell} regelmäßig entfernt. Auch wenn Sie
@option{--file} oder @option{--manifest} nutzen, wird der Zwischenspeicher
ungültig, sobald die entsprechende Datei geändert wurde.

Mit der Befehlszeilenoption @option{--rebuild-cache} wird die
zwischengespeicherte Umgebung erneuert. Sie können @option{--rebuild-cache}
verwenden, wenn Sie @option{--file} oder @option{--manifest} nutzen und die
Datei @command{guix.scm} oder @command{manifest.scm} auf externe
Abhängigkeiten verweist oder eine andere Umgebung ergeben sollte, wenn sich
zum Beispiel Umgebungsvariable geändert haben.

@item --root=@var{Datei}
@itemx -r @var{Datei}
@cindex persistente Umgebung
@cindex Müllsammlerwurzel, für Umgebungen
Die @var{Datei} zu einer symbolischen Verknüpfung auf das Profil dieser
Umgebung machen und als eine Müllsammlerwurzel registrieren.

Das ist nützlich, um seine Umgebung vor dem Müllsammler zu schützen und sie
„persistent“ zu machen.

Wenn diese Option weggelassen wird, wird das Profil von @command{guix shell}
zwischengespeichert, damit weitere Aufrufe es ohne Verzögerung verwenden
können. Das ist vergleichbar damit, wenn Sie @option{--root} angeben, jedoch
wird @command{guix shell} die am längsten @emph{nicht} verwendeten
Müllsammlerwurzeln („least recently used“) regelmäßig entfernt.

In manchen Fällen wird @command{guix shell} keinen Zwischenspeicher für die
Profile anlegen, z.B.@: wenn Umwandlungsoptionen wie @option{--with-latest}
angegeben wurde. Das bedeutet, die Umgebung ist nur, solange die Sitzung von
@command{guix shell} besteht, vor dem Müllsammler sicher. Dann müssen Sie,
wenn Sie das nächste Mal dieselbe Umgebung neu erzeugen, vielleicht Pakete
neu erstellen oder neu herunterladen.

@ref{Aufruf von guix gc} hat mehr Informationen über Müllsammlerwurzeln.
@end table

@command{guix shell} unterstützt auch alle gemeinsamen Erstellungsoptionen,
die von @command{guix build} unterstützt werden (siehe @ref{Gemeinsame Erstellungsoptionen}), und die Paketumwandlungsoptionen (siehe @ref{Paketumwandlungsoptionen}).

@node Aufruf von guix environment
@section @command{guix environment} aufrufen

@cindex @command{guix environment}

Der Zweck von @command{guix environment} ist es, dass Sie
Entwicklungsumgebungen leicht anlegen können.

@quotation Diese Funktionalität wird demnächst verschwinden
Der Befehl @command{guix environment} gilt als veraltet. Stattdessen sollten
Sie @command{guix shell} benutzen, was einen ähnlichen Zweck erfüllt, aber
leichter zu benutzen ist. Siehe @ref{Aufruf von guix shell}.

Veraltet heißt, @command{guix environment} wird letztendlich entfernt, aber
das Guix-Projekt wird gewährleisten, dass @command{guix environment} bis zum
1.@: Mai 2023 verfügbar bleibt. Reden Sie mit uns unter
@email{guix-devel@@gnu.org}, wenn Sie dabei mitdiskutieren möchten!
@end quotation

Die allgemeine Syntax lautet:

@example
guix environment @var{Optionen} @var{Paket}…
@end example

Folgendes Beispiel zeigt, wie eine neue Shell gestartet wird, auf der alles
für die Entwicklung von GNU@tie{}Guile eingerichtet ist:

@example
guix environment guile
@end example

Wenn benötigte Abhängigkeiten noch nicht erstellt worden sind, wird
@command{guix environment} sie automatisch erstellen lassen. Die Umgebung
der neuen Shell ist eine ergänzte Version der Umgebung, in der @command{guix
environment} ausgeführt wurde. Sie enthält neben den existierenden
Umgebungsvariablen auch die nötigen Suchpfade, um das angegebene Paket
erstellen zu können. Um eine „reine“ Umgebung zu erstellen, in der die
ursprünglichen Umgebungsvariablen nicht mehr vorkommen, kann die
Befehlszeilenoption @option{--pure} benutzt werden@footnote{Manchmal
ergänzen Nutzer fälschlicherweise Umgebungsvariable wie @env{PATH} in ihrer
@file{~/.bashrc}-Datei. Das hat zur Folge, dass wenn @command{guix
environment} Bash startet, selbige @file{~/.bashrc} von Bash gelesen wird
und die neuen Umgebungen somit „verunreinigt“. Es ist ein Fehler, solche
Umgebungsvariable in @file{.bashrc} zu definieren, stattdessen sollten sie
in @file{.bash_profile} geschrieben werden, was nur von Login-Shells mit
„source“ geladen wird. Siehe @ref{Bash Startup Files,,, bash,
Referenzhandbuch zu GNU Bash} für Details über beim Starten von Bash
gelesene Dateien}.

Eine Guix-Umgebung zu verlassen ist gleichbedeutend mit dem Verlassen der
Shell; danach findet sich der Benutzer in der alten Umgebung wieder, in der
er sich vor dem Aufruf von @command{guix environment} befand. Beim nächsten
Durchlauf des Müllsammlers (siehe @ref{Aufruf von guix gc}) werden Pakete von
der Platte gelöscht, die innerhalb der Umgebung installiert worden sind und
außerhalb nicht länger benutzt werden.

@vindex GUIX_ENVIRONMENT
@command{guix environment} definiert die Variable @env{GUIX_ENVIRONMENT} in
der neu erzeugten Shell. Ihr Wert ist der Dateiname des Profils dieser neuen
Umgebung. Das könnten Nutzer verwenden, um zum Beispiel eine besondere
Prompt als Eingabeaufforderung für Entwicklungsumgebungen in ihrer
@file{.bashrc} festzulegen (siehe @ref{Bash Startup Files,,, bash,
Referenzhandbuch von GNU Bash}):

@example
if [ -n "$GUIX_ENVIRONMENT" ]
then
    export PS1="\u@@\h \w [dev]\$ "
fi
@end example

@noindent
…@: oder um ihr Profil durchzusehen:

@example
$ ls "$GUIX_ENVIRONMENT/bin"
@end example

Des Weiteren kann mehr als ein Paket angegeben werden. In diesem Fall wird
die Vereinigung der Eingaben der jeweiligen Pakete zugänglich gemacht. Zum
Beispiel erzeugt der folgende Befehl eine Shell, in der alle Abhängigkeiten
von sowohl Guile als auch Emacs verfügbar sind:

@example
guix environment guile emacs
@end example

Manchmal will man keine interaktive Shell-Sitzung. Ein beliebiger Befehl
kann aufgerufen werden, indem Sie nach Angabe der Pakete noch @code{--} vor
den gewünschten Befehl schreiben, um ihn von den übrigen Argumenten
abzutrennen:

@example
guix environment guile -- make -j4
@end example

In anderen Situationen ist es bequemer, aufzulisten, welche Pakete in der
Umgebung benötigt werden. Zum Beispiel führt der folgende Befehl
@command{python} aus einer Umgebung heraus aus, in der Python@tie{}3 und
NumPy enthalten sind:

@example
guix environment --ad-hoc python-numpy python -- python3
@end example

Man kann auch sowohl die Abhängigkeiten eines Pakets haben wollen als auch
ein paar zusätzliche Pakete, die nicht Erstellungs- oder
Laufzeitabhängigkeiten davon sind, aber trotzdem bei der Entwicklung
nützlich sind. Deshalb hängt die Wirkung von der Position der
Befehlszeilenoption @option{--ad-hoc} ab. Pakete, die links von
@option{--ad-hoc} stehen, werden als Pakete interpretiert, deren
Abhängigkeiten zur Umgebung hinzugefügt werden. Pakete, die rechts stehen,
werden selbst zur Umgebung hinzugefügt. Zum Beispiel erzeugt der folgende
Befehl eine Guix-Entwicklungsumgebung, die zusätzlich Git und strace
umfasst:

@example
guix environment --pure guix --ad-hoc git strace
@end example

@cindex container
Manchmal ist es wünschenswert, die Umgebung so viel wie möglich zu
isolieren, um maximale Reinheit und Reproduzierbarkeit zu
bekommen. Insbesondere ist es wünschenswert, den Zugriff auf @file{/usr/bin}
und andere Systemressourcen aus der Entwicklungsumgebung heraus zu
verhindern, wenn man Guix auf einer fremden Wirtsdistribution benutzt, die
nicht Guix System ist. Zum Beispiel startet der folgende Befehl eine
Guile-REPL in einer isolierten Umgebung, einem sogenannten „Container“, in
der nur der Store und das aktuelle Arbeitsverzeichnis eingebunden sind:

@example
guix environment --ad-hoc --container guile -- guile
@end example

@quotation Anmerkung
Die Befehlszeilenoption @option{--container} funktioniert nur mit
Linux-libre 3.19 oder neuer.
@end quotation

@cindex Zertifikate
Ein weiterer typischer Anwendungsfall für Container ist, gegenüber
Sicherheitslücken anfällige Anwendungen auszuführen, z.B.@: Webbrowser. Um
Eolie auszuführen, müssen wir den Zugriff auf manche Dateien und
Verzeichnisse über @option{--expose} und @option{--share} gewähren. Wir
lassen @code{nss-certs} bereitstellen und machen @file{/etc/ssl/certs/} für
die HTTPS-Authentifizierung sichtbar. Zu guter Letzt behalten wir die
@env{DISPLAY}-Umgebungsvariable bei, weil isolierte grafische Anwendungen
ohne sie nicht angezeigt werden können.

@example
guix environment --preserve='^DISPLAY$' --container --network \
  --expose=/etc/machine-id \
  --expose=/etc/ssl/certs/ \
  --share=$HOME/.local/share/eolie/=$HOME/.local/share/eolie/ \
  --ad-hoc eolie nss-certs dbus --  eolie
@end example

Im Folgenden werden die verfügbaren Befehlszeilenoptionen zusammengefasst.

@table @code
@item --check
Hiermit wird die Umgebung angelegt und gemeldet, ob die Shell
Umgebungsvariable überschreiben würde. Siehe @ref{Aufruf von guix shell,
@option{--check}} für weitere Informationen.

@item --root=@var{Datei}
@itemx -r @var{Datei}
@cindex persistente Umgebung
@cindex Müllsammlerwurzel, für Umgebungen
Die @var{Datei} zu einer symbolischen Verknüpfung auf das Profil dieser
Umgebung machen und als eine Müllsammlerwurzel registrieren.

Das ist nützlich, um seine Umgebung vor dem Müllsammler zu schützen und sie
„persistent“ zu machen.

Wird diese Option weggelassen, ist die Umgebung nur, solange die Sitzung von
@command{guix environment} besteht, vor dem Müllsammler sicher. Das
bedeutet, wenn Sie das nächste Mal dieselbe Umgebung neu erzeugen, müssen
Sie vielleicht Pakete neu erstellen oder neu herunterladen. @ref{Aufruf von guix gc} hat mehr Informationen über Müllsammlerwurzeln.

@item --expression=@var{Ausdruck}
@itemx -e @var{Ausdruck}
Eine Umgebung für das Paket oder die Liste von Paketen erzeugen, zu der der
@var{Ausdruck} ausgewertet wird.

Zum Beispiel startet dies:

@example
guix environment -e '(@@ (gnu packages maths) petsc-openmpi)'
@end example

eine Shell mit der Umgebung für eben diese bestimmte Variante des Pakets
PETSc.

Wenn man dies ausführt:

@example
guix environment --ad-hoc -e '(@@ (gnu) %base-packages)'
@end example

bekommt man eine Shell, in der alle Basis-Pakete verfügbar sind.

Die obigen Befehle benutzen nur die Standard-Ausgabe des jeweiligen
Pakets. Um andere Ausgaben auszuwählen, können zweielementige Tupel
spezifiziert werden:

@example
guix environment --ad-hoc -e '(list (@@ (gnu packages bash) bash) "include")'
@end example

@item --load=@var{Datei}
@itemx -l @var{Datei}
Eine Umgebung erstellen für das Paket oder die Liste von Paketen, zu der der
Code in der @var{Datei} ausgewertet wird.

Zum Beispiel könnte die @var{Datei} eine Definition wie diese enthalten
(siehe @ref{Pakete definieren}):

@lisp
@verbatiminclude environment-gdb.scm
@end lisp

@item --manifest=@var{Datei}
@itemx -m @var{Datei}
Eine Umgebung für die Pakete erzeugen, die im Manifest-Objekt enthalten
sind, das vom Scheme-Code in der @var{Datei} geliefert wird. Wenn diese
Befehlszeilenoption mehrmals wiederholt angegeben wird, werden die Manifeste
aneinandergehängt.

Dies verhält sich ähnlich wie die gleichnamige Option des Befehls
@command{guix package} (siehe @ref{profile-manifest, @option{--manifest}})
und benutzt auch dieselben Manifestdateien.

Siehe @ref{shell-export-manifest, @command{guix shell --export-manifest}}
für Informationen, wie Sie Befehlszeilenoptionen in ein Manifest
„verwandeln“ können.

@item --ad-hoc
Alle angegebenen Pakete in der resultierenden Umgebung einschließen, als
wären sie Eingaben eines @i{ad hoc} definierten Pakets. Diese
Befehlszeilenoption ist nützlich, um schnell Umgebungen aufzusetzen, ohne
dafür einen Paketausdruck schreiben zu müssen, der die gewünschten Eingaben
enthält.

Zum Beispiel wird mit diesem Befehl:

@example
guix environment --ad-hoc guile guile-sdl -- guile
@end example

@command{guile} in einer Umgebung ausgeführt, in der sowohl Guile als auch
Guile-SDL zur Verfügung stehen.

Beachten Sie, dass in diesem Beispiel implizit die vorgegebene Ausgabe von
@code{guile} und @code{guile-sdl} verwendet wird, es aber auch möglich ist,
eine bestimmte Ausgabe auszuwählen@tie{}– z.B.@: wird mit @code{glib:bin}
die Ausgabe @code{bin} von @code{glib} gewählt (siehe @ref{Pakete mit mehreren Ausgaben.}).

Diese Befehlszeilenoption kann mit dem standardmäßigen Verhalten von
@command{guix environment} verbunden werden. Pakete, die vor
@option{--ad-hoc} aufgeführt werden, werden als Pakete interpretiert, deren
Abhängigkeiten zur Umgebung hinzugefügt werden, was dem standardmäßigen
Verhalten entspricht. Pakete, die danach aufgeführt werden, werden selbst
zur Umgebung hinzugefügt.

@item --profile=@var{Profil}
@itemx -p @var{Profil}
Eine Umgebung mit den Paketen erzeugen, die im @var{Profil} installiert
sind. Benutzen Sie @command{guix package} (siehe @ref{Aufruf von guix package}), um Profile anzulegen und zu verwalten.

@item --pure
Bestehende Umgebungsvariable deaktivieren, wenn die neue Umgebung erzeugt
wird, mit Ausnahme der mit @option{--preserve} angegebenen Variablen (siehe
unten). Dies bewirkt, dass eine Umgebung erzeugt wird, in der die Suchpfade
nur Paketeingaben nennen und sonst nichts.

@item --preserve=@var{Regexp}
@itemx -E @var{Regexp}
Wenn das hier zusammen mit @option{--pure} angegeben wird, bleiben die zum
regulären Ausdruck @var{Regexp} passenden Umgebungsvariablen erhalten@tie{}–
mit anderen Worten werden sie auf eine „weiße Liste“ von Umgebungsvariablen
gesetzt, die erhalten bleiben müssen. Diese Befehlszeilenoption kann
mehrmals wiederholt werden.

@example
guix environment --pure --preserve=^SLURM --ad-hoc openmpi …@: \
  -- mpirun …
@end example

In diesem Beispiel wird @command{mpirun} in einem Kontext ausgeführt, in dem
die einzig definierten Umgebungsvariablen @env{PATH} und solche sind, deren
Name mit @samp{SLURM} beginnt, sowie die üblichen besonders „kostbaren“
Variablen (@env{HOME}, @env{USER}, etc.).

@item --search-paths
Die Umgebungsvariablendefinitionen anzeigen, aus denen die Umgebung besteht.

@item --system=@var{System}
@itemx -s @var{System}
Versuchen, für das angegebene @var{System} zu erstellen@tie{}– z.B.@:
@code{i686-linux}.

@item --container
@itemx -C
@cindex container
Den @var{Befehl} in einer isolierten Umgebung (einem sogenannten
„Container“) ausführen. Das aktuelle Arbeitsverzeichnis außerhalb des
Containers wird in den Container zugeordnet. Zusätzlich wird, wenn es mit
der Befehlszeilenoption @option{--user} nicht anders spezifiziert wurde, ein
stellvertretendes persönliches Verzeichnis erzeugt, dessen Inhalt der des
wirklichen persönlichen Verzeichnisses ist, sowie eine passend konfigurierte
Datei @file{/etc/passwd}.

Der erzeugte Prozess läuft außerhalb des Containers als der momentane
Nutzer. Innerhalb des Containers hat er dieselbe UID und GID wie der
momentane Nutzer, außer die Befehlszeilenoption @option{--user} wird
übergeben (siehe unten).

@item --network
@itemx -N
Bei isolierten Umgebungen („Containern“) wird hiermit der
Netzwerk-Namensraum mit dem des Wirtssystems geteilt. Container, die ohne
diese Befehlszeilenoption erzeugt wurden, haben nur Zugriff auf das
Loopback-Gerät.

@item --link-profile
@itemx -P
Bei isolierten Umgebungen („Containern“) wird das Umgebungsprofil im
Container als @file{~/.guix-profile} verknüpft und @file{~/.guix-profile}
dann in @code{GUIX_ENVIRONMENT} gespeichert. Das ist äquivalent dazu,
@file{~/.guix-profile} im Container zu einer symbolischen Verknüpfung auf
das tatsächliche Profil zu machen. Wenn das Verzeichnis bereits existiert,
schlägt das Verknüpfen fehl und die Umgebung wird nicht hergestellt. Dieser
Fehler wird immer eintreten, wenn @command{guix environment} im persönlichen
Verzeichnis des Benutzers aufgerufen wurde.

Bestimmte Pakete sind so eingerichtet, dass sie in @file{~/.guix-profile}
nach Konfigurationsdateien und Daten suchen,@footnote{Zum Beispiel
inspiziert das Paket @code{fontconfig} das Verzeichnis
@file{~/.guix-profile/share/fonts}, um zusätzliche Schriftarten zu finden.}
weshalb @option{--link-profile} benutzt werden kann, damit sich diese
Programme auch in der isolierten Umgebung wie erwartet verhalten.

@item --user=@var{Benutzer}
@itemx -u @var{Benutzer}
Bei isolierten Umgebungen („Containern“) wird der Benutzername
@var{Benutzer} anstelle des aktuellen Benutzers benutzt. Der erzeugte
Eintrag in @file{/etc/passwd} im Container wird also den Namen
@var{Benutzer} enthalten und das persönliche Verzeichnis wird den Namen
@file{/home/BENUTZER} tragen; keine GECOS-Daten über den Nutzer werden in
die Umgebung übernommen. Des Weiteren sind UID und GID innerhalb der
isolierten Umgebung auf 1000 gesetzt. @var{Benutzer} muss auf dem System
nicht existieren.

Zusätzlich werden alle geteilten oder exponierten Pfade (siehe jeweils
@option{--share} und @option{--expose}), deren Ziel innerhalb des
persönlichen Verzeichnisses des aktuellen Benutzers liegt, relativ zu
@file{/home/BENUTZER} erscheinen, einschließlich der automatischen Zuordnung
des aktuellen Arbeitsverzeichnisses.

@example
# wird Pfade als /home/foo/wd, /home/foo/test und /home/foo/target exponieren
cd $HOME/wd
guix environment --container --user=foo \
     --expose=$HOME/test \
     --expose=/tmp/target=$HOME/target
@end example

Obwohl dies das Datenleck von Nutzerdaten durch Pfade im persönlichen
Verzeichnis und die Benutzereinträge begrenzt, kann dies nur als Teil einer
größeren Lösung für Datenschutz und Anonymität sinnvoll eingesetzt
werden. Es sollte nicht für sich allein dazu eingesetzt werden.

@item --no-cwd
In isolierten Umgebungen („Containern“) ist das vorgegebene Verhalten, das
aktuelle Arbeitsverzeichnis mit dem isolierten Container zu teilen und in
der Umgebung sofort in dieses Verzeichnis zu wechseln. Wenn das nicht
gewünscht wird, kann das Angeben von @option{--no-cwd} dafür sorgen, dass
das Arbeitsverzeichnis @emph{nicht} automatisch geteilt wird und stattdessen
in das Persönliche Verzeichnis („Home“-Verzeichnis) gewechselt wird. Siehe
auch @option{--user}.

@item --expose=@var{Quelle}[=@var{Ziel}]
@itemx --share=@var{Quelle}[=@var{Ziel}]
Bei isolierten Umgebungen („Containern“) wird das Dateisystem unter
@var{Quelle} vom Wirtssystem als Nur-Lese-Dateisystem @var{Ziel} (bzw.@: für
@option{--share} auch mit Schreibrechten) im Container zugänglich
gemacht. Wenn kein @var{Ziel} angegeben wurde, wird die @var{Quelle} auch
als Ziel-Einhängepunkt in der isolierten Umgebung benutzt.

Im folgenden Beispiel wird eine Guile-REPL in einer isolierten Umgebung
gestartet, in der das persönliche Verzeichnis des Benutzers als Verzeichnis
@file{/austausch} nur für Lesezugriffe zugänglich gemacht wurde:

@example
guix environment --container --expose=$HOME=/austausch --ad-hoc guile -- guile
@end example

@item --emulate-fhs
@item -F
In Containern wird eine Konfiguration emuliert, die dem Filesystem Hierarchy
Standard (FHS) folgt, siehe
@uref{https://refspecs.linuxfoundation.org/fhs.shtml, dessen offizielle
Spezifikation}. Obwohl Guix vom FHS-Standard abweicht, kann das System in
Ihrem Container mit dieser Befehlszeilenoption zu anderen
GNU/Linux-Distributionen ähnlicher werden. Dadurch lassen sich dortige
Entwicklungsumgebungen reproduzieren und Sie können Programme testen und
benutzen, die das Befolgen des FHS-Standards voraussetzen. Wenn die Option
angegeben wird, enthält der Container eine Version von glibc, die die im
Container befindliche @file{/etc/ld.so.cache} als Zwischenspeicher
gemeinsamer Bibliotheken ausliest (anders als glibc im normalen Gebrauch von
Guix), und die im FHS verlangten Verzeichnisse @file{/bin}, @file{/etc},
@file{/lib} und @file{/usr} werden aus dem Profil des Containers übernommen.

@end table

@command{guix environment} unterstützt auch alle gemeinsamen
Erstellungsoptionen, die von @command{guix build} unterstützt werden (siehe
@ref{Gemeinsame Erstellungsoptionen}), und die Paketumwandlungsoptionen (siehe
@ref{Paketumwandlungsoptionen}).

@node Aufruf von guix pack
@section @command{guix pack} aufrufen

@cindex @command{guix pack}

Manchmal möchten Sie Software an Leute weitergeben, die (noch!) nicht das
Glück haben, Guix zu benutzen. Mit Guix würden sie nur @command{guix package
-i @var{irgendetwas}} einzutippen brauchen, aber wenn sie kein Guix haben,
muss es anders gehen. Hier kommt @command{guix pack} ins Spiel.

@quotation Anmerkung
Wenn Sie aber nach einer Möglichkeit suchen, Binärdateien unter Maschinen
auszutauschen, auf denen Guix bereits läuft, sollten Sie einen Blick auf die
Abschnitte @ref{Aufruf von guix copy}, @ref{Aufruf von guix publish} und
@ref{Aufruf von guix archive} werfen.
@end quotation

@cindex Pack
@cindex Bündel
@cindex Anwendungsbündel
@cindex Software-Bündel
Der Befehl @command{guix pack} erzeugt ein gut verpacktes
@dfn{Software-Bündel}: Konkret wird dadurch ein Tarball oder eine andere Art
von Archiv mit den Binärdateien der Software erzeugt, die Sie sich gewünscht
haben, zusammen mit all ihren Abhängigkeiten. Der resultierende Archiv kann
auch auf jeder Maschine genutzt werden, die kein Guix hat, und jeder kann
damit genau dieselben Binärdateien benutzen, die Ihnen unter Guix zur
Verfügung stehen. Das Bündel wird dabei auf eine Bit für Bit reproduzierbare
Art erzeugt, damit auch jeder nachprüfen kann, dass darin wirklich
diejenigen Binärdateien enthalten sind, von denen Sie es behaupten.

Um zum Beispiel ein Bündel mit Guile, Emacs, Geiser und all ihren
Abhängigkeiten zu erzeugen, führen Sie diesen Befehl aus:

@example
$ guix pack guile emacs emacs-geiser
…
/gnu/store/…-pack.tar.gz
@end example

Als Ergebnis erhalten Sie einen Tarball mit einem Verzeichnis
@file{/gnu/store}, worin sich alles relevanten Pakete befinden. Der
resultierende Tarball enthält auch ein @dfn{Profil} mit den drei angegebenen
Paketen; es ist dieselbe Art von Profil, die auch @command{guix package -i}
erzeugen würde. Mit diesem Mechanismus wird auch der binäre Tarball zur
Installation von Guix erzeugt (siehe @ref{Aus Binärdatei installieren}).

Benutzer des Bündels müssten dann aber zum Beispiel
@file{/gnu/store/…-profile/bin/guile} eintippen, um Guile auszuführen, was
Ihnen zu unbequem sein könnte. Ein Ausweg wäre, dass Sie etwa eine
symbolische Verknüpfung @file{/opt/gnu/bin} auf das Profil anlegen:

@example
guix pack -S /opt/gnu/bin=bin guile emacs emacs-geiser
@end example

@noindent
Benutzer müssten dann nur noch @file{/opt/gnu/bin/guile} eintippen, um Guile
zu genießen.

@cindex verschiebliche Binärdateien, mit @command{guix pack}
Doch was ist, wenn die Empfängerin Ihres Bündels keine Administratorrechte
auf ihrer Maschine hat, das Bündel also nicht ins Wurzelverzeichnis ihres
Dateisystems entpacken kann? Dann möchten Sie vielleicht die
Befehlszeilenoption @option{--relocatable} benutzen (siehe weiter
unten). Mit dieser Option werden @dfn{verschiebliche Binärdateien} erzeugt,
die auch in einem beliebigen anderen Verzeichnis in der
Dateisystemhierarchie abgelegt und von dort ausgeführt werden können. Man
könnte sagen, sie sind pfad-agnostisch. In obigem Beispiel würden Benutzer
Ihren Tarball in ihr Persönliches Verzeichnis (das „Home“-Verzeichnis)
entpacken und von dort den Befehl @file{./opt/gnu/bin/guile} ausführen.

@cindex Docker, ein Abbild erstellen mit guix pack
Eine weitere Möglichkeit ist, das Bündel im Format eines Docker-Abbilds
(englisch Docker-Image) zu erzeugen. Das geht mit dem folgenden Befehl:

@example
guix pack -f docker -S /bin=bin guile guile-readline
@end example

@noindent
Das Ergebnis ist ein Tarball, der dem Befehl @command{docker load} übergeben
werden kann, gefolgt von @code{docker run}:

@example
docker load < @var{Datei}
docker run -ti guile-guile-readline /bin/guile
@end example

@noindent
Dabei steht @var{Datei} für das durch @command{guix pack} gelieferte Abbild
und @code{guile-guile-readline} für den „Image-Tag“, der diesem zugewiesen
wurde. In der
@uref{https://docs.docker.com/engine/reference/commandline/load/,
Dokumentation von Docker} finden Sie nähere Informationen.

@cindex Singularity, ein Abbild erstellen mit guix pack
@cindex SquashFS, ein Abbild erstellen mit guix pack
Und noch eine weitere Möglichkeit ist, dass Sie ein SquashFS-Abbild mit
folgendem Befehl erzeugen:

@example
guix pack -f squashfs bash guile emacs emacs-geiser
@end example

@noindent
Das Ergebnis ist ein SquashFS-Dateisystemabbild, dass entweder als
Dateisystem eingebunden oder mit Hilfe der
@uref{https://www.sylabs.io/docs/,
Singularity-Container-Ausführungsumgebung} als Dateisystemcontainer benutzt
werden kann, mit Befehlen wie @command{singularity shell} oder
@command{singularity exec}.

@cindex AppImage, create an AppImage file with @command{guix pack}
Another format internally based on SquashFS is @uref{https://appimage.org/,
AppImage}. An AppImage file can be created and executed without any special
privileges:

@example
file=$(guix pack -f appimage --entry-point=bin/guile guile)
$file --help
@end example

Es gibt mehrere Befehlszeilenoptionen, mit denen Sie Ihr Bündel anpassen
können:

@table @code
@item --format=@var{Format}
@itemx -f @var{Format}
Generiert ein Bündel im angegebenen @var{Format}.

Die verfügbaren Formate sind:

@table @code
@item tarball
Das standardmäßig benutzte Format. Damit wird ein Tarball generiert, der
alle angegebenen Binärdateien und symbolischen Verknüpfungen enthält.

@item docker
Generiert einen Tarball gemäß des
@uref{https://github.com/docker/docker/blob/master/image/spec/v1.2.md,
Standards für Docker-Abbilder}. Der „Repository-Name“, wie er in der Ausgabe
des Befehls @command{docker images} erscheint, wird in der
Vorgabeeinstellung anhand der Paketnamen berechnet, die auf der Befehlszeile
oder in der Manifest-Datei angegeben wurden. Sie können den Repository-Namen
auch über die Befehlszeilenoption @option{--image-tag} festlegen. Siehe die
Ausgabe mit @option{--help-docker-format} für mehr Details zu solchen
weitergehenden Optionen.

@item squashfs
Generiert ein SquashFS-Abbild, das alle angegebenen Binärdateien und
symbolischen Verknüpfungen enthält, sowie leere Einhängepunkte für virtuelle
Dateisysteme wie procfs.

@quotation Anmerkung
Für Singularity @emph{müssen} Sie eine @file{/bin/sh} in das Abbild
aufnehmen. Aus diesem Grund gilt für @command{guix pack -f squashfs}
implizit immer auch @code{-S /bin=bin}. Daher muss Ihr Aufruf von
@command{guix pack} immer ungefähr so beginnen:

@example
guix pack -f squashfs bash …
@end example

Wenn Sie vergessen, das @code{bash}-Paket (oder etwas Ähnliches) zu bündeln,
werden @command{singularity run} und @command{singularity exec} mit der
wenig hilfreichen Meldung „Datei oder Verzeichnis nicht gefunden“ scheitern.
@end quotation

@item deb
@cindex Debian, ein .deb-Paket mit guix pack erstellen
Hiermit wird ein Debian-Archiv erzeugt (ein Paket mit der
Dateinamenserweiterung „@code{.deb}“), in dem alle angegebenen Binärdateien
und symbolischen Verknüpfungen enthalten sind. Es kann auf jeder
dpkg-basierten GNU(/Linux)-Distribution installiert werden. Fortgeschrittene
Optionen werden Ihnen angezeigt, wenn Sie die Befehlszeilenoption
@option{--help-deb-format} angeben. Mit jenen können Control-Dateien
hinzugefügt werden für eine genaue Steuerung z.B.@: welche bestimmten
Trigger aktiviert werden oder um mit einem Betreuerskript beliebigen
Konfigurations-Code einzufügen, der bei Installation ausgeführt werden soll.

@example
guix pack -f deb -C xz -S /usr/bin/hello=bin/hello hello
@end example

@quotation Anmerkung
Weil in den mit @command{guix pack} erzeugten Archiven eine Ansammlung von
Store-Objekten enthalten ist und weil in jedem @command{dpkg}-Paket keine im
Konflikt stehenden Dateien enthalten sein dürfen, können Sie @i{de facto}
wahrscheinlich nur ein einziges mit @command{guix pack} erzeugtes
„@code{.deb}“-Archiv je System installieren. Allerdings dürfen beliebig
viele Guix-Pakete Teil dieses einen Archivs sein.
@end quotation

@quotation Warnung
@command{dpkg} übernimmt die Zuständigkeit für alle Dateien, die im Bündel
enthalten sind, auch wenn es die Dateien @emph{nicht} kennt. Es ist unklug,
mit Guix erzeugte „@code{.deb}“-Dateien auf einem System zu installieren,
auf dem @file{/gnu/store} bereits von anderer Software verwendet wird, also
wenn z.B.@: Guix bereits installiert ist oder andere Nicht-@code{deb}-Bündel
installiert sind.
@end quotation

@item rpm
@cindex RPM, ein RPM-Archiv erstellen mit guix pack
Hiermit wird ein RPM-Archiv erzeugt (ein Paket mit der
Dateinamenserweiterung „@code{.rpm}“), in dem alle angegebenen Binärdateien
und symbolischen Verknüpfungen enthalten sind. Es kann auf jeder
RPM-basierten GNU/Linux-Distribution installiert werden. Beim RPM-Format
werden Prüfsummen zu jeder enthaltenen Datei eingebettet, welche der
@command{rpm}-Befehl benutzt, um die Integrität des Archivs zu
gewährleisten.

Fortgeschrittene RPM-bezogene Befehlszeilenoptionen werden Ihnen angezeigt,
wenn Sie die Befehlszeilenoption @option{--help-rpm-format} angeben. Mit
diesen Befehlszeilenoptionen können Paketbetreuer Skripte einbinden, die zum
Beispiel vor oder nach der Installation des RPM-Archivs ablaufen sollen.

Das RPM-Format kennt verschiebbare Pakete. Mit der Befehlszeilenoption
@option{--prefix} des @command{rpm}-Befehls ist es Ihnen möglich, ein
RPM-Paket unter ein angegebenes Präfix zu installieren.

@example
guix pack -f rpm -R -C xz -S /usr/bin/hello=bin/hello hello
@end example

@example
sudo rpm --install --prefix=/opt /gnu/store/…-hello.rpm
@end example

@quotation Anmerkung
Anders als bei Debian-Paketen dürfen mehrere RPM-Pakete gleichzeitig
installiert werden, wenn Dateien darin im Konflikt stehen, aber identisch
sind. Es ist daher in der Regel problemlos möglich, mehrere mit
@command{guix pack} erzeugte RPM-Pakete nebeneinander zu installieren.
@end quotation

@quotation Warnung
@command{rpm} übernimmt die Zuständigkeit für alle Dateien, die im Bündel
enthalten sind. Folglich wird @command{rpm} das Verzeichnis
@file{/gnu/store} einfach löschen, sobald Sie ein mit Guix erzeugtes
RPM-Paket deinstallieren, wenn Sie bei der Installation @emph{nicht} die
Befehlszeilenoption @option{--prefix} des @command{rpm}-Befehls benutzt
haben. Es ist unklug, mit Guix erzeugte „@code{.rpm}“-Dateien auf einem
System zu installieren, auf dem @file{/gnu/store} bereits von anderer
Software verwendet wird, also wenn z.B.@: Guix bereits installiert ist oder
andere Nicht-@code{rpm}-Bündel installiert sind.
@end quotation

@item appimage
@cindex AppImage, create an AppImage file with @command{guix pack}
This produces an @uref{https://appimage.org/, AppImage file} with the
@samp{.AppImage} extension.  AppImage is a SquashFS volume prefixed with a
runtime that mounts the SquashFS file system and executes the binary
provided with @option{--entry-point}.  This results in a self-contained
archive that bundles the software and all its requirements into a single
file.  When the file is made executable it runs the packaged software.

@example
guix pack -f appimage --entry-point=bin/vlc vlc
@end example

The runtime used by AppImages invokes the @command{fusermount3} command to
mount the image quickly.  If that command is unavailable, the AppImage fails
to run, but it can still be started by passing the
@option{--appimage-extract-and-run} flag.

@quotation Warnung
When building an AppImage, always @emph{pass} the @option{--relocatable}
option (or @option{-R}, or @option{-RR}) to make sure the image can be used
on systems where Guix is not installed.  A warning is printed when this
option is not used.
@end quotation

@example
guix pack -f appimage --entry-point=bin/hello --relocatable hello
@end example

@quotation Anmerkung
The resulting AppImage does not conform to the complete standard as it
currently does not contain a @file{.DirIcon} file.  This does not impact
functionality of the AppImage itself, but possibly that of software used to
manage AppImages.
@end quotation

@quotation Anmerkung
As the generated AppImage packages the complete dependency graph, it will be
larger than comparable AppImage files found online, which depend on host
system libraries.
@end quotation

@end table

@cindex verschiebliche Binärdateien
@item --relocatable
@itemx -R
Erzeugt @dfn{verschiebliche Binärdateien}@tie{}– also pfad-agnostische,
„portable“ Binärdateien, die an einer beliebigen Stelle in der
Dateisystemhierarchie platziert und von dort ausgeführt werden können.

Wenn diese Befehlszeilenoption einmal übergeben wird, funktionieren die
erzeugten Binärdateien nur dann, wenn @dfn{Benutzernamensräume} des
Linux-Kernels unterstützt werden. Wenn sie @emph{zweimal}@footnote{Es gibt
einen Trick, wie Sie sich das merken können: @code{-RR}, womit
PRoot-Unterstützung hinzugefügt wird, kann man sich als Abkürzung für
„Rundum Relocatable“ oder englisch „Really Relocatable“ vorstellen. Ist das
nicht prima?} übergeben wird, laufen die Binärdateien notfalls mit anderen
Methoden, wenn keine Benutzernamensräume zur Verfügung stehen, funktionieren
also ziemlich überall@tie{}– siehe unten für die Auswirkungen.

Zum Beispiel können Sie ein Bash enthalltendes Bündel erzeugen mit:

@example
guix pack -RR -S /meine-bin=bin bash
@end example

@noindent
…@: Sie können dieses dann auf eine Maschine ohne Guix kopieren und als
normaler Nutzer aus Ihrem Persönlichen Verzeichnis (auch „Home“-Verzeichnis
genannt) dann ausführen mit:

@example
tar xf pack.tar.gz
./meine-bin/sh
@end example

@noindent
Wenn Sie in der so gestarteten Shell dann @code{ls /gnu/store} eintippen,
sehen Sie, dass Ihnen angezeigt wird, in @file{/gnu/store} befänden sich
alle Abhängigkeiten von @code{bash}, obwohl auf der Maschine überhaupt kein
Verzeichnis @file{/gnu/store} existiert! Dies ist vermutlich die einfachste
Art, mit Guix erstellte Software für eine Maschine ohne Guix auszuliefern.

@quotation Anmerkung
Wenn die Voreinstellung verwendet wird, funktionieren verschiebliche
Binärdateien nur mit @dfn{Benutzernamensräumen} (englisch @dfn{User
namespaces}), einer Funktionalität des Linux-Kernels, mit der Benutzer ohne
besondere Berechtigungen Dateisysteme einbinden (englisch „mount“) oder die
Wurzel des Dateisystems wechseln können („change root“, kurz „chroot“). Alte
Versionen von Linux haben diese Funktionalität noch nicht unterstützt und
manche Distributionen von GNU/Linux schalten sie ab.

Um verschiebliche Binärdateien zu erzeugen, die auch ohne
Benutzernamensräume funktionieren, können Sie die Befehlszeilenoption
@option{--relocatable} oder @option{-R} @emph{zweimal} angeben. In diesem
Fall werden die Binärdateien zuerst überprüfen, ob Benutzernamensräume
unterstützt werden, und sonst notfalls einen anderen
@dfn{Ausführungstreiber} benutzen, um das Programm auszuführen, wenn
Benutzernamensräume nicht unterstützt werden. Folgende Ausführungstreiber
werden unterstützt:

@table @code
@item default
Es wird versucht, Benutzernamensräume zu verwenden. Sind Benutzernamensräume
nicht verfügbar (siehe unten), wird auf PRoot zurückgegriffen.

@item performance
Es wird versucht, Benutzernamensräume zu verwenden. Sind Benutzernamensräume
nicht verfügbar (siehe unten), wird auf Fakechroot zurückgegriffen.

@item userns
Das Programm wird mit Hilfe von Benutzernamensräumen ausgeführt. Wenn sie
nicht unterstützt werden, bricht das Programm ab.

@item proot
Durch PRoot ausführen. Das Programm @uref{https://proot-me.github.io/,
PRoot} bietet auch Unterstützung für Dateisystemvirtualisierung, indem der
Systemaufruf @code{ptrace} auf das laufende Programm angewendet wird. Dieser
Ansatz funktioniert auch ohne besondere Kernel-Unterstützung, aber das
Programm braucht mehr Zeit, um selbst Systemaufrufe durchzuführen.

@item fakechroot
Durch Fakechroot laufen lassen. @uref{https://github.com/dex4er/fakechroot/,
Fakechroot} virtualisiert Dateisystemzugriffe, indem Aufrufe von Funktionen
der C-Bibliothek wie @code{open}, @code{stat}, @code{exec} und so weiter
abgefangen werden. Anders als bei PRoot entsteht dabei kaum
Mehraufwand. Jedoch funktioniert das nicht immer, zum Beispiel werden manche
Dateisystemzugriffe aus der C-Bibliothek heraus @emph{nicht} abgefangen,
ebenso wenig wie Dateisystemaufrufe über direkte Systemaufrufe, was zu
fehlerbehaftetem Verhalten führt.
@end table

@vindex GUIX_EXECUTION_ENGINE
Wenn Sie ein verpacktes Programm ausführen, können Sie einen der oben
angeführten Ausführungstreiber ausdrücklich anfordern, indem Sie die
Umgebungsvariable @env{GUIX_EXECUTION_ENGINE} entsprechend festlegen.
@end quotation

@cindex Einsprungpunkt, für Docker- und Singularity-Abbilder
@item --entry-point=@var{Befehl}
Den @var{Befehl} als den @dfn{Einsprungpunkt} des erzeugten Bündels
verwenden, wenn das Bündelformat einen solchen unterstützt@tie{}– derzeit
tun das @code{docker}, @code{appimage} und @code{squashfs}
(Singularity). Der @var{Befehl} wird relativ zum Profil ausgeführt, das sich
im Bündel befindet.

Der Einsprungpunkt gibt den Befehl an, der mit @code{docker run} oder
@code{singularity run} beim Start nach Voreinstellung automatisch ausgeführt
wird. Zum Beispiel können Sie das hier benutzen:

@example
guix pack -f docker --entry-point=bin/guile guile
@end example

Dann kann das erzeugte Bündel mit z.B.@: @code{docker run} ohne weitere
Befehlszeilenargumente einfach geladen und ausgeführt werden, um
@code{bin/guile} zu starten:

@example
docker load -i pack.tar.gz
docker run @var{Abbild-ID}
@end example

@cindex Einsprungpunktargumente, für Docker-Abbilder
@item --entry-point-argument=@var{Befehl}
@itemx -A @var{Befehl}
@var{Befehl} als Argument zum @dfn{Einsprungpunkt} des erzeugten Bündels
mitgeben. Diese Befehlszeilenoption wirkt sich nur in Verbindung mit
@code{--entry-point} aus und sie darf auf der Befehlszeile mehrmals
angegeben werden.

@example
guix pack -f docker --entry-point=bin/guile --entry-point-argument="--help" guile
@end example

@cindex maximale Schichtenanzahl, für Docker-Abbilder
@item --max-layers=@code{n}
Gibt an, auf wie viele Schichten ein Docker-Abbild höchstens aufgeteilt
werden soll, wenn das Abbild erzeugt wird.

@example
guix pack -f docker --max-layers=100 guile
@end example

Mit dieser Befehlszeilenoption können Sie begrenzen, wie kleinteilig ein
Docker-Abbild geschichtet werden soll. Docker-Abbilder können auf mehrere
Schichten aufgeteilt werden, wobei das Abbild mit jeder Schicht größer und
komplexer wird. Indem Sie die Anzahl Schichten begrenzen, bestimmen Sie,
inwieweit folgende Wirkungen erzielt werden sollen:

@itemize
@item Platzverbrauch:
Wenn Sie mehr Schichten verwenden, können sich eher mehrere Abbilder
gemeinsame Abschnitte ihres Paketgraphen teilen, wenn sich dieser ähnelt.

@item Ladezeit:
Bei der Übertragung der Abbilder auf andere Knoten oder Systeme müssen Sie
bei mehrschichtigen Abbildern in diesem Fall weniger lang warten.
@end itemize

@item --expression=@var{Ausdruck}
@itemx -e @var{Ausdruck}
Als Paket benutzen, wozu der @var{Ausdruck} ausgewertet wird.

Der Zweck hiervon ist derselbe wie bei der gleichnamigen Befehlszeilenoption
in @command{guix build} (siehe @ref{Zusätzliche Erstellungsoptionen,
@option{--expression} in @command{guix build}}).

@item --file=@var{Datei}
Build a pack containing the package or other object the code within
@var{file} evaluates to.

This has the same purpose as the same-named option in @command{guix build}
(@pxref{Zusätzliche Erstellungsoptionen, @option{--file} in @command{guix build}}),
but it has no shorthand, because @option{-f} already means
@option{--format}.

@anchor{pack-manifest}
@item --manifest=@var{Datei}
@itemx -m @var{Datei}
Die Pakete benutzen, die im Manifest-Objekt aufgeführt sind, das vom
Scheme-Code in der angegebenen @var{Datei} geliefert wird. Wenn diese
Befehlszeilenoption mehrmals wiederholt angegeben wird, werden die Manifeste
aneinandergehängt.

Dies hat einen ähnlichen Zweck wie die gleichnamige Befehlszeilenoption in
@command{guix package} (siehe @ref{profile-manifest, @option{--manifest}})
und benutzt dieselben Regeln für Manifest-Dateien. Damit können Sie eine
Reihe von Paketen einmal definieren und dann sowohl zum Erzeugen von
Profilesn als auch zum Erzeugen von Archiven benutzen, letztere für
Maschinen, auf denen Guix nicht installiert ist. Beachten Sie, dass Sie
@emph{entweder} eine Manifest-Datei @emph{oder} eine Liste von Paketen
angeben können, aber nicht beides.

Siehe @ref{Manifeste verfassen} für Informationen dazu, wie man ein Manifest
schreibt. Siehe @ref{shell-export-manifest, @command{guix shell
--export-manifest}} für Informationen, wie Sie Befehlszeilenoptionen in ein
Manifest „verwandeln“ können.

@item --system=@var{System}
@itemx -s @var{System}
Versuchen, für die angegebene Art von @var{System} geeignete Binärdateien zu
erstellen@tie{}– z.B.@: @code{i686-linux}@tie{}– statt für die Art von
System, das die Erstellung durchführt.

@item --target=@var{Tripel}
@cindex Cross-Kompilieren
Lässt für das angegebene @var{Tripel} cross-erstellen, dieses muss ein
gültiges GNU-Tripel wie z.B.@: @code{"aarch64-linux-gnu"} sein (siehe
@ref{Specifying target triplets, GNU-Tripel für configure,, autoconf,
Autoconf}).

@item --compression=@var{Werkzeug}
@itemx -C @var{Werkzeug}
Komprimiert den resultierenden Tarball mit dem angegebenen
@var{Werkzeug}@tie{}– dieses kann @code{gzip}, @code{zstd}, @code{bzip2},
@code{xz}, @code{lzip} oder @code{none} für keine Kompression sein.

@anchor{pack-symlink-option}
@item --symlink=@var{Spezifikation}
@itemx -S @var{Spezifikation}
Fügt die in der @var{Spezifikation} festgelegten symbolischen Verknüpfungen
zum Bündel hinzu.  Diese Befehlszeilenoption darf mehrmals vorkommen.

Die @var{Spezifikation} muss von der Form
@code{@var{Quellort}=@var{Zielort}} sein, wobei der @var{Quellort} der Ort
der symbolischen Verknüpfung, die erstellt wird, und @var{Zielort} das Ziel
der symbolischen Verknüpfung ist.

Zum Beispiel wird mit @code{-S /opt/gnu/bin=bin} eine symbolische
Verknüpfung @file{/opt/gnu/bin} auf das Unterverzeichnis @file{bin} im
Profil erzeugt.

@item --save-provenance
Provenienzinformationen für die auf der Befehlszeile übergebenen Pakete
speichern. Zu den Provenienzinformationen gehören die URL und der Commit
jedes benutzten Kanals (siehe @ref{Kanäle}).

Provenienzinformationen werden in der Datei
@file{/gnu/store/…-profile/manifest} im Bündel zusammen mit den üblichen
Paketmetadaten abgespeichert@tie{}– also Name und Version jedes Pakets,
welche Eingaben dabei propagiert werden und so weiter. Die Informationen
nützen den Empfängern des Bündels, weil sie dann wissen, woraus das Bündel
(angeblich) besteht.

Der Vorgabe nach wird diese Befehlszeilenoption @emph{nicht} verwendet, weil
Provenienzinformationen genau wie Zeitstempel nichts zum Erstellungsprozess
beitragen. Mit anderen Worten gibt es unendlich viele Kanal-URLs und
Commit-IDs, aus denen dasselbe Bündel stammen könnte. Wenn solche „stillen“
Metadaten Teil des Ausgabe sind, dann wird also die bitweise
Reproduzierbarkeit von Quellcode zu Binärdateien eingeschränkt.

@item --root=@var{Datei}
@itemx -r @var{Datei}
@cindex Müllsammlerwurzel, für Bündel
Die @var{Datei} zu einer symbolischen Verknüpfung auf das erzeugte Bündel
machen und als Müllsammlerwurzel registrieren.

@item --localstatedir
@itemx --profile-name=@var{Name}
Das „lokale Zustandsverzeichnis“ @file{/var/guix} ins resultierende Bündel
aufnehmen, speziell auch das Profil
@file{/var/guix/profiles/per-user/root/@var{Name}}@tie{}– der vorgegebene
@var{Name} ist @code{guix-profile}, was @file{~root/.guix-profile}
entspricht.

@file{/var/guix} enthält die Store-Datenbank (siehe @ref{Der Store}) sowie
die Müllsammlerwurzeln (siehe @ref{Aufruf von guix gc}). Es ins Bündel
aufzunehmen, bedeutet, dass der enthaltene Store „vollständig“ ist und von
Guix verwaltet werden kann, andernfalls wäre der Store im Bündel „tot“ und
nach dem Auspacken des Bündels könnte Guix keine Objekte mehr dort
hinzufügen oder entfernen.

Ein Anwendungsfall hierfür ist der eigenständige, alle Komponenten
umfassende binäre Tarball von Guix (siehe @ref{Aus Binärdatei installieren}).

@item --derivation
@itemx -d
Den Namen der Ableitung ausgeben, die das Bündel erstellt.

@item --bootstrap
Mit den Bootstrap-Binärdateien das Bündel erstellen. Diese Option ist nur
für Guix-Entwickler nützlich.
@end table

Außerdem unterstützt @command{guix pack} alle gemeinsamen
Erstellungsoptionen (siehe @ref{Gemeinsame Erstellungsoptionen}) und alle
Paketumwandlungsoptionen (siehe @ref{Paketumwandlungsoptionen}).


@node GCC-Toolchain
@section GCC-Toolchain

@cindex GCC
@cindex ld-wrapper
@cindex Wrapper für den Binder/Linker
@cindex Toolchain, für die Entwicklung mit C
@cindex Toolchain, für die Entwicklung mit Fortran

Wenn Sie einen vollständigen Werkzeugsatz zum Kompilieren und Binden von
Quellcode in C oder C++ brauchen, werden Sie das Paket @code{gcc-toolchain}
haben wollen. Das Paket bietet eine vollständige GCC-Toolchain für die
Entwicklung mit C/C++, einschließlich GCC selbst, der GNU-C-Bibliothek
(Header-Dateien und Binärdateien samt Symbolen zur Fehlersuche/Debugging in
der @code{debug}-Ausgabe), Binutils und einen Wrapper für den Binder/Linker.

Der Zweck des Wrappers ist, die an den Binder übergebenen
Befehlszeilenoptionen mit @code{-L} und @code{-l} zu überprüfen und jeweils
passende Argumente mit @code{-rpath} anzufügen, womit dann der echte Binder
aufgerufen wird. Standardmäßig weigert sich der Binder-Wrapper, mit
Bibliotheken außerhalb des Stores zu binden, um „Reinheit“ zu
gewährleisten. Das kann aber stören, wenn man die Toolchain benutzt, um mit
lokalen Bibliotheken zu binden. Um Referenzen auf Bibliotheken außerhalb des
Stores zu erlauben, müssen Sie die Umgebungsvariable
@env{GUIX_LD_WRAPPER_ALLOW_IMPURITIES} setzen.

Das Paket @code{gfortran-toolchain} stellt eine vollständige GCC-Toolchain
für die Entwicklung mit Fortran zur Verfügung. Pakete für die Entwicklung
mit anderen Sprachen suchen Sie bitte mit @samp{guix search gcc toolchain}
(siehe @ref{guix-search,, Invoking guix package}).


@node Aufruf von guix git authenticate
@section @command{guix git authenticate} aufrufen

@cindex @command{guix git authenticate}
@cindex Authentifizieren, eines Git-Checkouts
@cindex Git-Checkout authentifizieren

Der Befehl @command{guix git authenticate} authentifiziert ein Git-Checkout
nach derselben Regel wie für Kanäle (siehe @ref{channel-authentication,
Kanalauthentifizierung}). Das bedeutet, dass angefangen beim angegebenen
Commit sichergestellt wird, dass alle nachfolgenden Commits mit einem
OpenPGP-Schlüssel signiert worden sind, dessen Fingerabdruck in der
@file{.guix-authorizations}-Datei seines bzw.@: seiner jeweiligen
Elterncommits aufgeführt ist.

Sie werden diesen Befehl zu schätzen wissen, wenn Sie einen Kanal
betreuen. Tatsächlich ist dieser Authentifizierungsmechanismus aber auch bei
weiteren Dingen nützlich; vielleicht möchten Sie ihn für Git-Repositorys
einsetzen, die gar nichts mit Guix zu tun haben?

Die allgemeine Syntax lautet:

@example
guix git authenticate @var{Commit} @var{Unterzeichner} [@var{Optionen}…]
@end example

@cindex Einführung, bei Git-Authentifizierung
Nach Vorgabe wird mit diesem Befehl das Git-Checkout im aktuellen
Arbeitsverzeichnis authentifiziert. Es wird bei Erfolg nichts ausgegeben und
der Exit-Status null zurückgeliefert; bei einem Fehler wird ein von null
verschiedener Exit-Status zurückgeliefert. @var{Commit} gibt den ersten
Commit an, der authentifiziert wird, und @var{Unterzeichner} ist der
OpenPGP-Fingerabdruck des öffentlichen Schlüssels, mit dem der @var{Commit}
signiert wurde. Zusammen bilden sie eine „Kanaleinführung“ (siehe
@ref{channel-authentication, Kanaleinführung}). Bei Ihrer ersten
erfolgreichen Ausführung wird die Einführung in der Datei @file{.git/config}
in Ihrem Checkout gespeichert, so dass Sie sie bei späteren Aufrufen nicht
mehr anzugeben brauchen:

@example
guix git authenticate [@var{Optionen}…]
@end example

Should you have branches that require different introductions, you can
specify them directly in @file{.git/config}.  For example, if the branch
called @code{personal-fork} has a different introduction than other
branches, you can extend @file{.git/config} along these lines:

@smallexample
[guix "authentication-personal-fork"]
	introduction-commit = cabba936fd807b096b48283debdcddccfea3900d
	introduction-signer = C0FF EECA BBA9 E6A8 0D1D  E643 A2A0 6DF2 A33A 54FA
	keyring = keyring
@end smallexample

The first run also attempts to install pre-push and post-merge hooks, such
that @command{guix git authenticate} is invoked as soon as you run
@command{git push}, @command{git pull}, and related commands; it does not
overwrite preexisting hooks though.

The command-line options described below allow you to fine-tune the process.

@table @code
@item --repository=@var{Verzeichnis}
@itemx -r @var{Verzeichnis}
Das Git-Repository im @var{Verzeichnis} statt im aktuellen Verzeichnis
öffnen.

@item --keyring=@var{Referenz}
@itemx -k @var{Referenz}
Den OpenPGP-Schlüsselbund („Keyring“) von der angegebenen @var{Referenz}
laden, einem Verweis auf einen Branch wie @code{origin/keyring} oder
@code{my-keyring}. Der Branch muss öffentliche Schlüssel im OpenPGP-Format
in @file{.key}-Dateien enthalten, entweder als Binärdateien oder mit
„ASCII-Hülle“. Nach Vorgabe wird der Schlüsselbund von einem Branch namens
@code{keyring} geladen.

@item --end=@var{Commit}
Revisionen bis @var{Commit} authentifizieren.

@item --stats
Nach Abschluss Statistiken über die signierten Commits anzeigen.

@item --cache-key=@var{Schlüssel}
Bereits authentifizierte Commits werden in einer Datei unter
@file{~/.cache/guix/authentication} zwischengespeichert. Diese Option
erzwingt, dass der Speicher innerhalb dieses Verzeichnisses in der Datei
@var{Schlüssel} angelegt wird.

@item --historical-authorizations=@var{Datei}
Nach Vorgabe wird jeder Commit, dessen Elterncommit(s) die Datei
@file{.guix-authorizations} fehlt, als gefälscht angesehen. Mit dieser
Option werden dagegen die Autorisierungen in der @var{Datei} für jeden
Commit ohne @file{.guix-authorizations} verwendet. Das Format der
@var{Datei} ist dasselbe wie bei @file{.guix-authorizations} (siehe
@ref{channel-authorizations, Format von @file{.guix-authorizations}}).
@end table


@c *********************************************************************
@node Programmierschnittstelle
@chapter Programmierschnittstelle

GNU Guix bietet mehrere Programmierschnittstellen (APIs) in der
Programmiersprache Scheme an, mit denen Software-Pakete definiert, erstellt
und gesucht werden können. Die erste Schnittstelle erlaubt es Nutzern, ihre
eigenen Paketdefinitionen in einer Hochsprache zu schreiben. Diese
Definitionen nehmen Bezug auf geläufige Konzepte der Paketverwaltung, wie
den Namen und die Version eines Pakets, sein Erstellungssystem (Build
System) und seine Abhängigkeiten (Dependencies). Diese Definitionen können
dann in konkrete Erstellungsaktionen umgewandelt werden.

Erstellungsaktionen werden vom Guix-Daemon für dessen Nutzer
durchgeführt. Bei einer normalen Konfiguration hat der Daemon Schreibzugriff
auf den Store, also das Verzeichnis @file{/gnu/store}, Nutzer hingegen
nicht. Die empfohlene Konfiguration lässt den Daemon die Erstellungen in
chroot-Umgebungen durchführen, mit eigenen Benutzerkonten für
„Erstellungsbenutzer“, um gegenseitige Beeinflussung der Erstellung und des
übrigen Systems zu minimieren.

@cindex derivation
Systemnahe APIs stehen zur Verfügung, um mit dem Daemon und dem Store zu
interagieren. Um den Daemon anzuweisen, eine Erstellungsaktion
durchzuführen, versorgen ihn Nutzer jeweils mit einer @dfn{Ableitung}. Eine
Ableitung ist, wie durchzuführende Erstellungsaktionen, sowie die
Umgebungen, in denen sie durchzuführen sind, in Guix eigentlich intern
dargestellt werden. Ableitungen verhalten sich zu Paketdefinitionen
vergleichbar mit Assembler-Code zu C-Programmen. Der Begriff „Ableitung“
kommt daher, dass Erstellungsergebnisse daraus @emph{abgeleitet} werden.

Dieses Kapitel beschreibt der Reihe nach all diese Programmierschnittstellen
(APIs), angefangen mit hochsprachlichen Paketdefinitionen. Siehe @ref{Aufbau des Quellbaums} für einen Gesamtüberblick über den Quellcode.

@menu
* Paketmodule::              Pakete aus Sicht des Programmierers.
* Pakete definieren::        Wie Sie neue Pakete definieren.
* Paketvarianten definieren::  Pakete anpassen.
* Manifeste verfassen::      Woraus Ihre Umgebung besteht.
* Erstellungssysteme::       Angeben, wie Pakete erstellt werden.
* Erstellungsphasen::        Die Phasen im Erstellungsprozess eines Pakets.
* Werkzeuge zur Erstellung::  Helferlein für Ihre Paketdefinitionen und 
                                anderes.
* Suchpfade::                Umgebungsvariable mit Suchpfaden deklarieren.
* Der Store::                Den Paket-Store verändern.
* Ableitungen::              Systemnahe Schnittstelle für Paketableitungen.
* Die Store-Monade::         Rein funktionale Schnittstelle zum Store.
* G-Ausdrücke::              Erstellungsausdrücke verarbeiten.
* Aufruf von guix repl::     Guix in Guile programmieren.
* Interaktiv mit Guix arbeiten::  Genau steuern auf der REPL.
@end menu

@node Paketmodule
@section Paketmodule

Aus Programmierersicht werden die Paketdefinitionen der GNU-Distribution als
Guile-Module in Namensräumen wie @code{(gnu packages …)} sichtbar
gemacht@footnote{Beachten Sie, dass Pakete unter dem Modulnamensraum
@code{(gnu packages …)} nicht notwendigerweise auch „GNU-Pakete“
sind. Dieses Schema für die Benennung von Modulen folgt lediglich den
üblichen Guile-Konventionen: @code{gnu} bedeutet, dass die Module als Teil
des GNU-Systems ausgeliefert werden, und @code{packages} gruppiert Module
mit Paketdefinitionen.} (siehe @ref{Modules, Guile-Module,, guile,
Referenzhandbuch zu GNU Guile}). Zum Beispiel exportiert das Modul
@code{(gnu packages emacs)} eine Variable namens @code{emacs}, die an ein
@code{<package>}-Objekt gebunden ist (siehe @ref{Pakete definieren}).

Der Modulnamensraum @code{(gnu packages …)} wird von Befehlszeilenwerkzeugen
automatisch nach Paketen durchsucht. Wenn Sie zum Beispiel @code{guix
install emacs} ausführen, werden alle @code{(gnu packages …)}-Module
durchlaufen, bis eines gefunden wird, das ein Paketobjekt mit dem Namen
@code{emacs} exportiert. Diese Paketsuchfunktion ist im Modul @code{(gnu
packages)} implementiert.

@cindex Anpassung, von Paketen
@cindex Paketmodulsuchpfad
Benutzer können Paketdefinitionen auch in Modulen mit anderen Namen
unterbringen@tie{}– z.B.@: @code{(my-packages emacs)}@footnote{Beachten Sie,
dass Dateiname und Modulname übereinstimmen müssen. Zum Beispiel muss das
Modul @code{(my-packages emacs)} in einer Datei @file{my-packages/emacs.scm}
relativ zum mit @option{--load-path} oder @env{GUIX_PACKAGE_PATH}
angegebenen Ladepfad stehen. Siehe @ref{Modules and the File System,,,
guile, Referenzhandbuch zu GNU Guile} für Details.}. Es gibt zwei Arten,
solche Paketdefinitionen für die Benutzungsschnittstelle sichtbar zu machen:

@enumerate
@item
Eine Möglichkeit ist, das Verzeichnis, in dem Ihre Paketmodule stehen, mit
der Befehlszeilenoption @code{-L} von @command{guix package} und anderen
Befehlen (siehe @ref{Gemeinsame Erstellungsoptionen}) oder durch Setzen der unten
beschriebenen Umgebungsvariablen @env{GUIX_PACKAGE_PATH} zum Suchpfad
hinzuzufügen.

@item
Die andere Möglichkeit ist, einen @dfn{Kanal} zu definieren und
@command{guix pull} so zu konfigurieren, dass es davon seine Module
bezieht. Ein Kanal ist im Kern nur ein Git-Repository, in welchem
Paketmodule liegen. Siehe @ref{Kanäle} für mehr Informationen, wie Kanäle
definiert und benutzt werden.
@end enumerate

@env{GUIX_PACKAGE_PATH} funktioniert ähnlich wie andere Variable mit
Suchpfaden:

@defvr {Umgebungsvariable} GUIX_PACKAGE_PATH
Dies ist eine doppelpunktgetrennte Liste von Verzeichnissen, die nach
zusätzlichen Paketmodulen durchsucht werden. In dieser Variablen
aufgelistete Verzeichnisse haben Vorrang vor den Modulen, die zur
Distribution gehören.
@end defvr

Die Distribution wird komplett von Grund auf initialisiert@tie{}– man sagt
zur Initialisierung auch @dfn{Bootstrapping}@tie{}– und sie ist
@dfn{eigenständig} („self-contained“): Jedes Paket wird nur auf Basis von
anderen Paketen in der Distribution erstellt. Die Wurzel dieses
Abhängigkeitsgraphen ist ein kleiner Satz von Initialisierungsbinärdateien,
den @dfn{Bootstrap-Binärdateien}, die im Modul @code{(gnu packages
bootstrap)} verfügbar gemacht werden. Für mehr Informationen über
Bootstrapping, siehe @ref{Bootstrapping}.

@node Pakete definieren
@section Pakete definieren

Mit den Modulen @code{(guix packages)} und @code{(guix build-system)} können
Paketdefinitionen auf einer hohen Abstraktionsebene geschrieben werden. Zum
Beispiel sieht die Paketdefinition bzw. das @dfn{Rezept} für das Paket von
GNU Hello so aus:

@lisp
(define-module (gnu packages hello)
  #:use-module (guix packages)
  #:use-module (guix download)
  #:use-module (guix build-system gnu)
  #:use-module (guix licenses)
  #:use-module (gnu packages gawk))

(define-public hello
  (package
    (name "hello")
    (version "2.10")
    (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/hello/hello-" version
                                  ".tar.gz"))
              (sha256
               (base32
                "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"))))
    (build-system gnu-build-system)
    (arguments
     (list #:configure-flags #~(list "--enable-silent-rules")))
    (inputs (list gawk))
    (synopsis "Hello, GNU world: An example GNU package")
    (description "Guess what GNU Hello prints!")
    (home-page "https://www.gnu.org/software/hello/")
    (license gpl3+)))
@end lisp

@noindent
Auch ohne ein Experte in Scheme zu sein, könnten Leser erraten haben, was
die verschiedenen Felder dabei bedeuten. Dieser Ausdruck bindet die Variable
@code{hello} an einen @code{<package>}-Verbund (Record) (siehe @ref{SRFI-9,
Scheme-Verbünde,, guile, Referenzhandbuch zu GNU Guile}). Die Felder dieses
Paket-Objekts lassen sich mit den Prozeduren aus dem Modul @code{(guix
packages)} auslesen, zum Beispiel liefert @code{(package-name hello)}@tie{}–
Überraschung!@tie{}– @code{"hello"}.

@quotation Schnelleinstieg
Ungeduldig? Mit etwas Glück können Sie die Definition vielleicht teilweise
oder sogar ganz aus einer anderen Paketsammlung importieren, indem Sie den
Befehl @code{guix import} verwenden (siehe @ref{Aufruf von guix import}).

Alternativ probieren Sie mal die
@uref{https://guix-hpc.gitlabpages.inria.fr/guix-packager/,
Guix-Packager-Schnittstelle} in Ihrem Web-Browser aus, um eine erste Version
einer Paketdefinition vorgeschlagen zu bekommen.
@end quotation

In obigem Beispiel wurde @code{hello} in einem eigenen Modul ganz für sich
alleine definiert, und zwar @code{(gnu packages hello)}. Technisch gesehen
muss es nicht unbedingt in einem solchen Modul definiert werden, aber es ist
bequem, denn alle Module unter @code{(gnu packages …)} werden automatisch
von den Befehlszeilenwerkzeugen gefunden (siehe @ref{Paketmodule}).

Ein paar Dinge sind noch erwähnenswert in der obigen Paketdefinition:

@itemize
@item
Das @code{source}-Feld für die Quelle des Pakets ist ein
@code{<origin>}-Objekt, was den Paketursprung angibt (siehe @ref{„origin“-Referenz} für eine vollständige Referenz). Hier wird dafür die Methode
@code{url-fetch} aus dem Modul @code{(guix download)} benutzt, d.h.@: die
Quelle ist eine Datei, die über FTP oder HTTP heruntergeladen werden soll.

Das Präfix @code{mirror://gnu} lässt @code{url-fetch} einen der
GNU-Spiegelserver benutzen, die in @code{(guix download)} definiert sind.

Das Feld @code{sha256} legt den erwarteten SHA256-Hashwert der
herunterzuladenden Datei fest. Ihn anzugeben ist Pflicht und er ermöglicht
es Guix, die Integrität der Datei zu überprüfen. Die Form @code{(base32 …)}
geht der base32-Darstellung des Hash-Wertes voraus. Sie finden die
base32-Darstellung mit Hilfe der Befehle @code{guix download} (siehe
@ref{Aufruf von guix download}) und @code{guix hash} (siehe @ref{Aufruf von guix hash}).

@cindex Patches
Wenn nötig kann in der @code{origin}-Form auch ein @code{patches}-Feld
stehen, wo anzuwendende Patches aufgeführt werden, sowie ein
@code{snippet}-Feld mit einem Scheme-Ausdruck mit den Anweisungen, wie der
Quellcode zu modifizieren ist.

@item
@cindex GNU-Erstellungssystem
Das Feld @code{build-system} legt fest, mit welcher Prozedur das Paket
erstellt werden soll (siehe @ref{Erstellungssysteme}). In diesem Beispiel steht
@code{gnu-build-system} für das wohlbekannte GNU-Erstellungssystem, wo
Pakete mit der üblichen Befehlsfolge @code{./configure && make && make check
&& make install} konfiguriert, erstellt und installiert werden.

Sobald Sie anfangen, Pakete für nichttriviale Software zu schreiben, könnten
Sie Werkzeuge benötigen, um jene Erstellungsphasen abzuändern, Dateien zu
verändern oder Ähnliches. Siehe @ref{Werkzeuge zur Erstellung} für mehr Informationen
dazu.

@item
Das Feld @code{arguments} gibt an, welche Optionen dem Erstellungssystem
mitgegeben werden sollen (siehe @ref{Erstellungssysteme}). In diesem Fall
interpretiert @code{gnu-build-system} diese als Auftrag, @file{configure}
mit der Befehlszeilenoption @option{--enable-silent-rules} auszuführen.

Der Wert des @code{arguments}-Feldes ist eine Liste von Argumenten, die an
das Erstellungssystem weitergereicht werden, wie bei @code{apply} (siehe
@ref{Fly Evaluation, @code{apply},, guile, Referenzhandbuch zu GNU Guile}).

@cindex Schlüsselwortargumente, für Erstellungssysteme
Ein Doppelkreuz gefolgt von einem Doppelpunkt (@code{#:}) definiert ein
Scheme-@dfn{Schlüsselwort} (siehe @ref{Keywords,,, guile, Referenzhandbuch
zu GNU Guile}) und @code{#:configure-flags} ist ein Schlüsselwort, um eine
Befehlszeilenoption an das Erstellungssystem mitzugeben (siehe @ref{Coding
With Keywords,,, guile, Referenzhandbuch zu GNU Guile}).

@findex #~
@findex gexp
@cindex Staging, von Argumenten in Erstellungssystemen
@cindex Code-Staging, in Paketdefinitionen
Die Doppelkreuz-Tilde-Zeichen (@code{#~}) wiederum sind Guix-eigene Syntax,
mit der ein sogenannter @dfn{G-Aussdruck} begonnen wird (siehe
@ref{G-Ausdrücke}), womit wir Code zur späteren Ausführung vormerken (wir
nennen ihn @dfn{staged}). Staged Code wird dann und nur dann ausgewertet,
wenn das Paket durch den Erstellungs-Daemon erstellt wird. In diesem
Beispiel ist der Staged Code der @code{(list @dots{})}-Ausdruck, der eine
einelementige Liste mit der configure-Befehlszeilenoption erstellt.

@item
Das Feld @code{inputs} legt Eingaben an den Erstellungsprozess fest@tie{}–
d.h.@: Abhängigkeiten des Pakets zur Erstellungs- oder Laufzeit. Hier fügen
wir eine Eingabe hinzu, eine Referenz auf die Variable @code{gawk};
@var{gawk} ist auch selbst wiederum an ein @code{<package>}-Objekt als
Variablenwert gebunden.

Beachten Sie, dass GCC, Coreutils, Bash und andere essenzielle Werkzeuge
hier nicht als Eingaben aufgeführt werden müssen. Stattdessen sorgt schon
@code{gnu-build-system} dafür, dass diese vorhanden sein müssen (siehe
@ref{Erstellungssysteme}).

Sämtliche anderen Abhängigkeiten müssen aber im @code{inputs}-Feld
aufgezählt werden. Jede hier nicht angegebene Abhängigkeit wird während des
Erstellungsprozesses schlicht nicht verfügbar sein, woraus ein
Erstellungsfehler resultieren kann.
@end itemize

Siehe @ref{„package“-Referenz} für eine umfassende Beschreibung aller
erlaubten Felder.

@quotation Vertiefung
@cindex Scheme-Programmiersprache, Einstieg in die
Fühlen Sie sich eingeschüchtert von der Scheme-Sprache oder wurde Ihre
Neugier geweckt? Im Kochbuch gibt es einen kurzen Abschnitt, wie man
anfängt. Dort werden einige der oben gezeigten Dinge wiederholt und die
Grundlagen erklärt. Siehe @ref{Ein Schnellkurs in Scheme,,,
guix-cookbook.de, GNU-Guix-Kochbuch} für weitere Informationen.
@end quotation

Sobald eine Paketdefinition eingesetzt wurde, können Sie das Paket mit Hilfe
des Befehlszeilenwerkzeugs @code{guix build} dann auch tatsächlich erstellen
(siehe @ref{Aufruf von guix build}) und dabei jegliche Erstellungsfehler, auf
die Sie stoßen, beseitigen (siehe @ref{Fehlschläge beim Erstellen untersuchen}). Sie
können den Befehl @command{guix edit} benutzen, um leicht zur
Paketdefinition zurückzuspringen (siehe @ref{Aufruf von guix edit}). Unter
@ref{Paketrichtlinien} finden Sie mehr Informationen darüber, wie Sie
Paketdefinitionen testen, und unter @ref{Aufruf von guix lint} finden Sie
Informationen, wie Sie prüfen, ob eine Definition alle Stilkonventionen
einhält.
@vindex GUIX_PACKAGE_PATH
Zuletzt finden Sie unter @ref{Kanäle} Informationen, wie Sie die
Distribution um Ihre eigenen Pakete in einem „Kanal“ erweitern.

Zu all dem sei auch erwähnt, dass Sie das Aktualisieren einer
Paketdefinition auf eine vom Anbieter neu veröffentlichte Version mit dem
Befehl @command{guix refresh} teilweise automatisieren können (siehe
@ref{Aufruf von guix refresh}).

Hinter den Kulissen wird die einem @code{<package>}-Objekt entsprechende
Ableitung zuerst durch @code{package-derivation} berechnet. Diese Ableitung
wird in der @file{.drv}-Datei unter @file{/gnu/store} gespeichert. Die von
ihr vorgeschriebenen Erstellungsaktionen können dann durch die Prozedur
@code{build-derivations} umgesetzt werden (siehe @ref{Der Store}).

@deffn {Prozedur} package-derivation Store Paket [System]
Das @code{<derivation>}-Objekt zum @var{Paket} für das angegebene
@var{System} liefern (siehe @ref{Ableitungen}).

Als @var{Paket} muss ein gültiges @code{<package>}-Objekt angegeben werden
und das @var{System} muss eine Zeichenkette sein, die das Zielsystem
angibt@tie{}– z.B.@: @code{"x86_64-linux"} für ein auf x86_64 laufendes,
Linux-basiertes GNU-System. @var{Store} muss eine Verbindung zum Daemon
sein, der die Operationen auf dem Store durchführt (siehe @ref{Der Store}).
@end deffn

@noindent
@cindex Cross-Kompilieren
Auf ähnliche Weise kann eine Ableitung berechnet werden, die ein Paket für
ein anderes System cross-erstellt.

@deffn {Prozedur} package-cross-derivation Store Paket Ziel [System]
Liefert das @code{<derivation>}-Objekt, um das @var{Paket} zu
cross-erstellen vom @var{System} aus für das @var{Ziel}-System.

Als @var{Ziel} muss ein gültiges GNU-Tripel angegeben werden, was die
Ziel-Hardware und das zugehörige Betriebssystem beschreibt, wie z.B.@:
@code{"aarch64-linux-gnu"} (siehe @ref{Specifying Target Triplets,,,
autoconf, Autoconf}).
@end deffn

Wenn Sie einmal Paketdefinitionen fertig verfasst haben, können Sie leicht
@emph{Varianten} derselben Pakete definieren. Siehe @ref{Paketvarianten definieren} für mehr Informationen dazu.

@menu
* „package“-Referenz::       Der Datentyp für Pakete.
* „origin“-Referenz::        Datentyp für Paketursprünge.
@end menu


@node „package“-Referenz
@subsection @code{package}-Referenz

Dieser Abschnitt fasst alle in @code{package}-Deklarationen zur Verfügung
stehenden Optionen zusammen (siehe @ref{Pakete definieren}).

@deftp {Datentyp} package
Dieser Datentyp steht für ein Paketrezept.

@table @asis
@item @code{name}
Der Name des Pakets als Zeichenkette.

@item @code{version}
Die Version des Pakets als Zeichenkette. Siehe @ref{Versionsnummern}, wo
erklärt wird, worauf Sie achten müssen.

@item @code{source}
Ein Objekt, das beschreibt, wie der Quellcode des Pakets bezogen werden
soll. Meistens ist es ein @code{origin}-Objekt, welches für eine aus dem
Internet heruntergeladene Datei steht (siehe @ref{„origin“-Referenz}). Es
kann aber auch ein beliebiges anderes „dateiähnliches“ Objekt sein, wie
z.B.@: ein @code{local-file}, was eine Datei im lokalen Dateisystem
bezeichnet (siehe @ref{G-Ausdrücke, @code{local-file}}).

@item @code{build-system}
Das Erstellungssystem, mit dem das Paket erstellt werden soll (siehe
@ref{Erstellungssysteme}).

@item @code{arguments} (Vorgabe: @code{'()})
Die Argumente, die an das Erstellungssystem übergeben werden sollen (siehe
@ref{Erstellungssysteme}). Dies ist eine Liste, typischerweise eine Reihe von
Schlüssel-Wert-Paaren wie in diesem Beispiel:

@lisp
(package
  (name "beispiel")
  ;; hier würden noch ein paar Felder stehen
  (arguments
    (list #:tests? #f                     ;Tests überspringen
          #:make-flags #~'("VERBOSE=1")   ;Optionen für 'make'
          #:configure-flags #~'("--enable-frobbing"))))
@end lisp

Welche Schlüsselwortargumente genau unterstützt werden, hängt vom jeweiligen
Erstellungssystem ab (siehe @ref{Erstellungssysteme}), doch werden Sie
feststellen, dass fast alle @code{#:configure-flags}, @code{#:make-flags},
@code{#:tests?} und @code{#:phases} berücksichtigen. Insbesondere können Sie
mit dem Schlüsselwort @code{#:phases} den Satz von Erstellungsphasen, der
für Ihr Paket zum Einsatz kommt, ändern (siehe @ref{Erstellungsphasen}).

Auf der REPL können Sie sich mit speziellen Befehlen interaktiv anzeigen
lassen, welchen Wert einige dieser Argumente haben, um Ihnen bei der
Fehlersuche zu helfen (siehe @ref{Interaktiv mit Guix arbeiten}).

@quotation Anmerkung zur Kompatibilität
Bis Version 1.3.0 hat man im @code{arguments}-Feld üblicherweise
@code{quote} (@code{'}) oder @code{quasiquote} (@code{`}) geschrieben, statt
G-Ausdrücke zu verwenden, etwa so:

@lisp
(package
  ;; hier würden noch ein paar Felder stehen
  (arguments   ;quotierte Argumente, die im alten Stil benutzt wurden
   '(#:tests? #f
     #:configure-flags '("--enable-frobbing"))))
@end lisp

Um ein Paket vom diesem Stil in den darüber umzuwandeln, können Sie
@code{guix style -S arguments @var{Paket}} ausführen (siehe @ref{Aufruf von guix style}).
@end quotation

@item @code{inputs} (Vorgabe: @code{'()})
@itemx @code{native-inputs} (Vorgabe: @code{'()})
@itemx @code{propagated-inputs} (Vorgabe: @code{'()})
@cindex Eingaben, von Paketen
In diesen Feldern wird eine Liste der Abhängigkeiten des Pakets
aufgeführt. Dabei ist jedes Listenelement ein „package“-, „origin“- oder
sonstiges dateiartiges Objekt (siehe @ref{G-Ausdrücke}). Um die zu
benutzende Ausgabe zu benennen, übergeben Sie eine zweielementige Liste mit
der Ausgabe als zweitem Element (siehe @ref{Pakete mit mehreren Ausgaben.}
für mehr Informationen zu Paketausgaben). Im folgenden Beispiel etwa werden
drei Eingaben festgelegt:

@lisp
(list libffi libunistring
      `(,glib "bin"))      ;Ausgabe "bin" von GLib
@end lisp

Im obigen Beispiel wird die Ausgabe @code{"out"} für @code{libffi} und
@code{libunistring} benutzt.

@quotation Anmerkung zur Kompatibilität
Bis Version 1.3.0 waren Eingabelisten noch Listen von Tupeln, wobei jedes
Tupel eine Bezeichnung für die Eingabe (als Zeichenkette) als erstes
Element, dann ein „package“-, „origin“- oder „derivation“-Objekt (Paket,
Ursprung oder Ableitung) als zweites Element und optional die Benennung der
davon zu benutzenden Ausgabe umfasste; letztere hatte als Vorgabewert
@code{"out"}. Im folgenden Beispiel wird dasselbe wie oben angegeben, aber
im @dfn{alten Stil für Eingaben}:

@lisp
;; Alter Eingabenstil (veraltet).
`(("libffi" ,libffi)
  ("libunistring" ,libunistring)
  ("glib:bin" ,glib "bin"))  ;Ausgabe "bin" von GLib
@end lisp

Dieser Stil gilt als veraltet. Er wird bislang unterstützt, aber er wird in
einer zukünftigen Version entfernt werden. Man sollte ihn nicht für neue
Paketdefinitionen gebrauchen. Siehe @ref{Aufruf von guix style} für eine
Erklärung, wie Sie zum neuen Stil migrieren.
@end quotation

@cindex Cross-Kompilieren, Paketabhängigkeiten
Die Unterscheidung zwischen @code{native-inputs} und @code{inputs} ist
wichtig, damit Cross-Kompilieren möglich ist. Beim Cross-Kompilieren werden
als @code{inputs} aufgeführte Abhängigkeiten für die
Ziel-Prozessorarchitektur (@emph{target}) erstellt, andersherum werden als
@code{native-inputs} aufgeführte Abhängigkeiten für die Prozessorarchitektur
der erstellenden Maschine (@emph{build}) erstellt.

@code{native-inputs} listet typischerweise die Werkzeuge auf, die während
der Erstellung gebraucht werden, aber nicht zur Laufzeit des Programms
gebraucht werden. Beispiele sind Autoconf, Automake, pkg-config, Gettext
oder Bison. @command{guix lint} kann melden, ob wahrscheinlich Fehler in der
Auflistung sind (siehe @ref{Aufruf von guix lint}).

@anchor{package-propagated-inputs}
Schließlich ist @code{propagated-inputs} ähnlich wie @code{inputs}, aber die
angegebenen Pakete werden automatisch mit ins Profil installiert (siehe
@ref{Funktionalitäten, die Rolle von Profilen in Guix}), wenn das Paket installiert
wird, zu dem sie gehören (siehe @ref{package-cmd-propagated-inputs,
@command{guix package}} für Informationen darüber, wie @command{guix
package} mit propagierten Eingaben umgeht).

Dies ist zum Beispiel nötig, wenn Sie ein Paket für eine C-/C++-Bibliothek
schreiben, die Header-Dateien einer anderen Bibliothek braucht, um mit ihr
kompilieren zu können, oder wenn sich eine pkg-config-Datei auf eine andere
über ihren @code{Requires}-Eintrag bezieht.

Noch ein Beispiel, wo @code{propagated-inputs} nützlich ist, sind Sprachen,
die den Laufzeit-Suchpfad @emph{nicht} zusammen mit dem Programm abspeichern
(@emph{nicht} wie etwa im @code{RUNPATH} bei ELF-Dateien), also Sprachen wie
Guile, Python, Perl und weitere. Wenn Sie ein Paket für eine in solchen
Sprachen geschriebene Bibliothek schreiben, dann sorgen Sie dafür, dass es
zur Laufzeit den von ihr benötigten Code finden kann, indem Sie ihre
Laufzeit-Abhängigkeiten in @code{propagated-inputs} statt in @code{inputs}
aufführen.

@item @code{outputs} (Vorgabe: @code{'("out")})
Die Liste der Benennungen der Ausgaben des Pakets. Der Abschnitt
@ref{Pakete mit mehreren Ausgaben.} beschreibt übliche Nutzungen
zusätzlicher Ausgaben.

@item @code{native-search-paths} (Vorgabe: @code{'()})
@itemx @code{search-paths} (Vorgabe: @code{'()})
Eine Liste von @code{search-path-specification}-Objekten, die
Umgebungsvariable für von diesem Paket beachtete Suchpfade („search paths“)
beschreiben. Siehe @ref{Suchpfade}, wenn Sie mehr über
Suchpfadspezifikationen erfahren möchten.

Wie auch bei Eingaben wird zwischen @code{native-search-paths} und
@code{search-paths} nur dann ein Unterschied gemacht, wenn Sie
cross-kompilieren. Beim Cross-Kompilieren bezieht sich
@code{native-search-paths} ausschließlich auf native Eingaben, wohingegen
sich die @code{search-paths} ausschließlich auf Eingaben für den „Host“
genannten Rechner beziehen.

Für Pakete wie z.B.@: Cross-Compiler sind die Ziel-Eingaben wichtig, z.B.@:
hat unser (angepasster) GCC-Cross-Compiler einen Eintrag für
@env{CROSS_C_INCLUDE_PATH} in @code{search-paths}, damit er
@file{.h}-Dateien für das Zielsystem auswählt und @emph{nicht} die aus
nativen Eingaben. Für die meisten Pakete ist aber einzig
@code{native-search-paths} von Bedeutung.

@item @code{replacement} (Vorgabe: @code{#f})
Dies muss entweder @code{#f} oder ein package-Objekt sein, das als Ersatz
(@dfn{replacement}) dieses Pakets benutzt werden soll. Im Abschnitt zu
@ref{Sicherheitsaktualisierungen, Veredelungen} wird dies erklärt.

@item @code{synopsis}
Eine einzeilige Beschreibung des Pakets.

@item @code{description}
Eine ausführlichere Beschreibung des Pakets, als eine Zeichenkette in
Texinfo-Syntax.

@item @code{license}
@cindex Lizenz, von Paketen
Die Lizenz des Pakets; benutzt werden kann ein Wert aus dem Modul
@code{(guix licenses)} oder eine Liste solcher Werte.

@item @code{home-page}
Die URL, die die Homepage des Pakets angibt, als Zeichenkette.

@item @code{supported-systems} (Vorgabe: @code{%supported-systems})
Die Liste der vom Paket unterstützten Systeme als Zeichenketten der Form
@code{Architektur-Kernel}, zum Beispiel @code{"x86_64-linux"}.

@item @code{location} (Vorgabe: die Stelle im Quellcode, wo die @code{package}-Form steht)
Wo im Quellcode das Paket definiert wurde. Es ist sinnvoll, dieses Feld
manuell zuzuweisen, wenn das Paket von einem anderen Paket erbt, weil dann
dieses Feld nicht automatisch berichtigt wird.
@end table
@end deftp

@defmac this-package
Wenn dies im @emph{lexikalischen Geltungsbereich} der Definition eines
Feldes im Paket steht, bezieht sich dieser Bezeichner auf das Paket, das
gerade definiert wird.

Das folgende Beispiel zeigt, wie man ein Paket als native Eingabe von sich
selbst beim Cross-Kompilieren deklariert:

@lisp
(package
  (name "guile")
  ;; …

  ;; Wenn es cross-kompiliert wird, hängt zum Beispiel
  ;; Guile von einer nativen Version von sich selbst ab.
  ;; Wir fügen sie hier hinzu.
  (native-inputs (if (%current-target-system)
                     (list this-package)
                     '())))
@end lisp

Es ist ein Fehler, außerhalb einer Paketdefinition auf @code{this-package}
zu verweisen.
@end defmac

Die folgenden Hilfsprozeduren sind für den Umgang mit Paketeingaben gedacht.

@deffn {Prozedur} lookup-package-input Paket Name
@deffnx {Prozedur} lookup-package-native-input Paket Name
@deffnx {Prozedur} lookup-package-propagated-input Paket Name
@deffnx {Prozedur} lookup-package-direct-input Paket Name
@var{Name} unter den (nativen, propagierten, direkten) Eingaben von
@var{Paket} suchen und die Eingabe zurückliefern, wenn sie gefunden wird,
ansonsten @code{#f}.

@var{name} is the name of a package or the file name of an origin depended
on.  Here's how you might use it:

@lisp
(use-modules (guix packages) (gnu packages base))

(lookup-package-direct-input coreutils "gmp")
@result{} #<package gmp@@6.2.1 …>
@end lisp

In diesem Beispiel erhalten wir das @code{gmp}-Paket, das zu den direkten
Eingaben von @code{coreutils} gehört.

When looking up an origin, use the name that appears in the origin's
@code{file-name} field or its default file name---e.g.,
@code{"foo-1.2.tar.gz"}.
@end deffn

@cindex Entwicklungseingaben, von Paketen
@cindex implizite Eingaben, von Paketen
Manchmal werden Sie die Liste der zur Entwicklung an einem Paket nötigen
Eingaben brauchen, d.h.@: alle Eingaben, die beim Kompilieren des Pakets
sichtbar gemacht werden. Diese Liste wird von der Prozedur
@code{package-development-inputs} geliefert.

@deffn {Prozedur} package-development-inputs Paket [System] [#:target #f]
Liefert die Liste derjenigen Eingaben, die das @var{Paket} zu
Entwicklungszwecken für @var{System} braucht. Wenn @var{target} wahr ist,
muss dafür ein Ziel wie das GNU-Tripel @code{"aarch64-linux-gnu"} übergeben
werden, damit die Eingaben zum Cross-Kompilieren von @var{Paket}
zurückgeliefert werden.

Beachten Sie, dass dazu sowohl explizite als auch implizite Eingaben
gehören. Mit impliziten Eingaben meinen wir solche, die vom
Erstellungssystem automatisch hinzugefügt werden (siehe @ref{Erstellungssysteme}). Nehmen wir das Paket @code{hello} zur Illustration:

@lisp
(use-modules (gnu packages base) (guix packages))

hello
@result{} #<package hello@@2.10 gnu/packages/base.scm:79 7f585d4f6790>

(package-direct-inputs hello)
@result{} ()

(package-development-inputs hello)
@result{} (("source" …) ("tar" #<package tar@@1.32 …>) …)
@end lisp

Für dieses Beispiel liefert @code{package-direct-inputs} die leere Liste
zurück, weil @code{hello} keinerlei explizite Abhängigkeiten hat. Zu
@code{package-development-inputs} gehören auch durch @code{gnu-build-system}
implizit hinzugefügte Eingaben, die für die Erstellung von @code{hello}
gebraucht werden, nämlich tar, gzip, GCC, libc, Bash und weitere. Wenn Sie
sich das anschauen wollen, zeigt Ihnen @command{guix graph hello} die
expliziten Eingaben, dagegen zeigt @command{guix graph -t bag hello} auch
die impliziten Eingaben (siehe @ref{Aufruf von guix graph}).
@end deffn

Weil Pakete herkömmliche Scheme-Objekte sind, die einen vollständigen
Abhängigkeitsgraphen und die zugehörigen Erstellungsprozeduren umfassen,
bietet es sich oftmals an, Prozeduren zu schreiben, die ein Paket
entgegennehmen und in Abhängigkeit bestimmter Parameter eine abgeänderte
Fassung desselben zurückliefern. Es folgen einige Beispiele.

@cindex Toolchain, für ein Paket auswählen
@deffn {Prozedur} package-with-c-toolchain Paket Toolchain
Liefert eine Variante des @var{Paket}s, die die angegebene @var{Toolchain}
anstelle der vorgegebenen GNU-C/C++-Toolchain benutzt. Als @var{Toolchain}
muss eine Liste von Eingaben (als Tupel aus Bezeichnung und bezeichnetem
Paket) angegeben werden, die eine gleichartige Funktion erfüllen, wie zum
Beispiel das Paket @code{gcc-toolchain}.

Das folgende Beispiel liefert eine Variante des Pakets @code{hello}, die mit
GCC@tie{}10.x und den übrigen Komponenten der GNU-Toolchain (Binutils und
GNU-C-Bibliothek) erstellt wurde statt mit der vorgegebenen Toolchain:

@lisp
(let ((toolchain (specification->package "gcc-toolchain@@10")))
  (package-with-c-toolchain hello `(("toolchain" ,toolchain))))
@end lisp

Die Erstellungs-Toolchain gehört zu den @dfn{impliziten Eingaben} von
Paketen@tie{}– sie wird normalerweise nicht ausdrücklich unter den
verschiedenen „inputs“-Feldern mit verschiedenen Arten von Eingaben
aufgeführt, stattdessen kommt sie über das Erstellungssystem dazu. Daher
funktioniert diese Prozedur intern so, dass sie das Erstellungssystem des
@var{Paket}s verändert, damit es die ausgewählte @var{Toolchain} statt der
vorgegebenen benutzt. Siehe @ref{Erstellungssysteme} für weitere Informationen zu
Erstellungssystemen.
@end deffn

@node „origin“-Referenz
@subsection @code{origin}-Referenz

In diesem Abschnitt werden Paketursprünge@tie{}– englisch
@dfn{Origins}@tie{}– beschrieben. Eine @code{origin}-Deklaration legt Daten
fest, die „produziert“ werden müssen@tie{}– normalerweise heißt das
heruntergeladen. Die Hash-Prüfsumme von deren Inhalt muss dabei im Voraus
bekannt sein. Ursprünge werden in erster Linie benutzt, um den Quellcode von
Paketen zu repräsentieren (siehe @ref{Pakete definieren}). Aus diesem Grund
können Sie mit der @code{origin}-Form Patches angeben, die auf den
ursprünglichen Quellcode angewandt werden sollen, oder auch Schnipsel von
Code, der Veränderungen daran vornimmt.

@deftp {Datentyp} origin
Mit diesem Datentyp wird ein Ursprung, von dem Quellcode geladen werden
kann, beschrieben.

@table @asis
@item @code{uri}
Ein Objekt, was die URI des Quellcodes enthält. Der Objekttyp hängt von der
@code{Methode} ab (siehe unten). Zum Beispiel sind, wenn die
@var{url-fetch}-Methode aus @code{(guix download)} benutzt wird, die
gültigen Werte für @code{uri}: eine URL dargestellt als Zeichenkette oder
eine Liste solcher URLs.

@cindex Ableitungen mit fester Ausgabe, zum Herunterladen
@item @code{method}
Eine monadische Prozedur, um die angegebene URL zu benutzen. Die Prozedur
muss mindestens drei Argumente akzeptieren: den Wert des @code{uri}-Feldes,
den Hash-Algorithmus und den Hash-Wert, der im @code{hash}-Feld angegeben
wird. Sie muss ein Store-Objekt oder eine Ableitung in der Store-Monade
liefern (siehe @ref{Die Store-Monade}). Die meisten Methoden liefern eine
Ableitung mit fester Ausgabe (siehe @ref{Ableitungen}).

Zu den häufig benutzten Methoden gehören @code{url-fetch}, das Daten von
einer URL lädt, und @code{git-fetch}, das Daten aus einem Git-Repository
lädt (siehe unten).

@item @code{sha256}
Ein Byte-Vektor mit dem SHA-256-Hash des Quellcodes. Seine Funktion ist
dieselbe wie das Angeben eines @code{content-hash}-SHA256-Objekts im weiter
unten beschriebenen @code{hash}-Feld.

@item @code{hash}
Das @code{content-hash}-Objekt des Quellcodes. Siehe unten für eine
Erklärung, wie Sie @code{content-hash} benutzen.

Diese Informationen liefert Ihnen der Befehl @code{guix download} (siehe
@ref{Aufruf von guix download}) oder @code{guix hash} (siehe @ref{Aufruf von guix hash}).

@item @code{file-name} (Vorgabe: @code{#f})
Der Dateiname, unter dem der Quellcode abgespeichert werden soll. Wenn er
auf @code{#f} steht, wird ein vernünftiger Name automatisch gewählt. Falls
der Quellcode von einer URL geladen wird, wird der Dateiname aus der URL
genommen. Wenn der Quellcode von einem Versionskontrollsystem bezogen wird,
empfiehlt es sich, den Dateinamen ausdrücklich anzugeben, weil dann keine
sprechende Benennung automatisch gefunden werden kann.

@item @code{patches} (Vorgabe: @code{'()})
Eine Liste von Dateinamen, Ursprüngen oder dateiähnlichen Objekten (siehe
@ref{G-Ausdrücke, dateiartige Objekte}) mit Patches, welche auf den
Quellcode anzuwenden sind.

Die Liste von Patches kann nicht von Parametern der Erstellung
abhängen. Insbesondere kann sie nicht vom Wert von @code{%current-system}
oder @code{%current-target-system} abḧängen.

@item @code{snippet} (Vorgabe: @code{#f})
Ein im Quellcode-Verzeichnis auszuführender G-Ausdruck (siehe
@ref{G-Ausdrücke}) oder S-Ausdruck. Hiermit kann der Quellcode bequem
modifiziert werden, manchmal ist dies bequemer als mit einem Patch.

@item @code{patch-flags} (Vorgabe: @code{'("-p1")})
Eine Liste der Befehlszeilenoptionen, die dem @code{patch}-Befehl übergeben
werden sollen.

@item @code{patch-inputs} (Vorgabe: @code{#f})
Eingabepakete oder -ableitungen für den Patch-Prozess. Bei @code{#f} werden
die üblichen Patcheingaben wie GNU@tie{}Patch bereitgestellt.

@item @code{modules} (Vorgabe: @code{'()})
Eine Liste von Guile-Modulen, die während des Patch-Prozesses und während
der Ausführung des @code{snippet}-Felds geladen sein sollen.

@item @code{patch-guile} (Vorgabe: @code{#f})
Welches Guile-Paket für den Patch-Prozess benutzt werden soll. Bei @code{#f}
wird ein vernünftiger Vorgabewert angenommen.
@end table
@end deftp

@deftp {Datentyp} content-hash @var{Wert} [@var{Algorithmus}]
Erzeugt ein Inhaltshash-Objekt für den gegebenen @var{Algorithmus} und
benutzt dabei den @var{Wert} als dessen Hashwert. Wenn kein
@var{Algorithmus} angegeben wird, wird @code{sha256} angenommen.

Als @var{Wert} kann ein Zeichenketten-Literal, was base32-dekodiert wird,
oder ein Byte-Vektor angegeben werden.

Folgende Formen sind äquivalent:

@lisp
(content-hash "05zxkyz9bv3j9h0xyid1rhvh3klhsmrpkf3bcs6frvlgyr2gwilj")
(content-hash "05zxkyz9bv3j9h0xyid1rhvh3klhsmrpkf3bcs6frvlgyr2gwilj"
              sha256)
(content-hash (base32
               "05zxkyz9bv3j9h0xyid1rhvh3klhsmrpkf3bcs6frvlgyr2gwilj"))
(content-hash (base64 "kkb+RPaP7uyMZmu4eXPVkM4BN8yhRd8BTHLslb6f/Rc=")
              sha256)
@end lisp

Als interne Implementierung wird für @code{content-hash} derzeit ein Makro
benutzt. Es überprüft, wenn möglich, zum Zeitpunkt der Makroumschreibung, ob
die Angaben in Ordnung sind, z.B.@: ob der @var{Wert} die richtige Größe für
den angegebenen @var{Algorithmus} hat.
@end deftp

Wie wir oben gesehen haben, hängt es von der im @code{method}-Feld
angegebenen Methode ab, wie die in einem Paketursprung verwiesenen Daten
geladen werden. Das Modul @code{(guix download)} stellt die am häufigsten
benutzte Methode zur Verfügung, nämlich @code{url-fetch}, die im Folgenden
beschrieben wird.

@deffn {Prozedur} url-fetch URL Hash-Algo Hash [Name] [#:executable? #f]
Liefert eine Ableitung mit fester Ausgabe, die Daten von der @var{URL} lädt
(einer Zeichenkette oder Liste von Zeichenketten für alternativ mögliche
URLs). Es wird erwartet, dass die Daten @var{Hash} als Prüfsumme haben,
gemäß dem Algorithmus, der in @var{Hash-Algo} (einem Symbol) angegebenen
wurde. Nach Vorgabe ergibt sich der Dateiname aus dem Basisnamen der URL;
optional kann in @var{Name} ein anderslautender Name festgelegt werden. Wenn
@var{executable?} wahr ist, wird die heruntergeladene Datei als ausführbar
markiert.

Wenn eine der URL mit @code{mirror://} beginnt, wird der „Host Part“ an
deren Anfang als Name eines Spiegelserver-Schemas aufgefasst, wie es in
@file{%mirror-file} steht.

Alternativ wird, wenn die URL mit @code{file://} beginnt, der zugehörige
Dateiname in den Store eingefügt und zurückgeliefert.
@end deffn

Ebenso ist im Modul @code{(guix git-download)} die @code{git-fetch}-Methode
für Paketursprünge definiert. Sie lädt Daten aus einem Repository des
Versionskontrollsystems Git. Der Datentyp @code{git-reference} beschreibt
dabei das Repository und den daraus zu ladenden Commit.

@deffn {Prozedur} git-fetch Ref Hash-Algo Hash [Name]
Liefert eine Ableitung mit fester Ausgabe, die @var{Ref} lädt, ein
@code{<git-reference>}-Objekt. Es wird erwartet, dass die Ausgabe rekursiv
die Prüfsumme @var{Hash} aufweist (ein „rekursiver Hash“) gemäß dem Typ
@var{Hash-Algo} (einem Symbol). Als Dateiname wird @var{Name} verwendet,
oder ein generischer Name, falls @var{Name} @code{#f} ist.
@end deffn

@deffn {Prozedur} git-fetch/lfs Ref Hash-Algo Hash [Name]
Dies ist eine Variante der Prozedur @code{git-fetch}, die die
Git-Erweiterung @acronym{LFS, Large File Storage} unterstützt. Sie kann zum
Beispiel dabei helfen, binäre Testdaten herunterzuladen, die im Testkatalog
eines Pakets gebraucht werden.
@end deffn

@deftp {Datentyp} git-reference
Dieser Datentyp steht für eine Git-Referenz, die @code{git-fetch} laden
soll.

@table @asis
@item @code{url}
Die URL des zu klonenden Git-Repositorys.

@item @code{commit}
Diese Zeichenkette gibt entweder den zu ladenden Commit an (als Zeichenkette
aus Hexadezimalzeichen) oder sie entspricht dem zu ladenden Tag. Sie können
auch eine „kurze“ Commit-Zeichenkette oder einen Bezeichner wie von
@command{git describe}, z.B.@: @code{v1.0.1-10-g58d7909c97}, verwenden.

@item @code{recursive?} (Vorgabe: @code{#f})
Dieser boolesche Wert gibt an, ob Git-Submodule rekursiv geladen werden
sollen.
@end table

Im folgenden Beispiel wird der Tag @code{v2.10} des Repositorys für
GNU@tie{}Hello bezeichnet:

@lisp
(git-reference
  (url "https://git.savannah.gnu.org/git/hello.git")
  (commit "v2.10"))
@end lisp

Das ist äquivalent zu folgender Referenz, wo der Commit ausdrücklich benannt
wird:

@lisp
(git-reference
  (url "https://git.savannah.gnu.org/git/hello.git")
  (commit "dc7dc56a00e48fe6f231a58f6537139fe2908fb9"))
@end lisp
@end deftp

Bei Mercurial-Repositorys finden Sie im Modul @code{(guix hg-download)}
Definitionen für die Methode @code{hg-fetch} für Paketursprünge sowie den
Datentyp @code{hg-reference}. Mit ihnen wird das Versionskontrollsystem
Mercurial unterstützt.

@deffn {Prozedur} hg-fetch Ref Hash-Algo Hash [Name]
Liefert eine Ableitung mit fester Ausgabe, die @var{Ref} lädt, ein
@code{<hg-reference>}-Objekt. Es wird erwartet, dass die Ausgabe rekursiv
die Prüfsumme @var{Hash} aufweist (ein „rekursiver Hash“) gemäß dem Typ
@var{Hash-Algo} (einem Symbol). Als Dateiname wird @var{Name} verwendet,
oder ein generischer Name, falls @var{Name} @code{#f} ist.
@end deffn

@deftp {Datentyp} hg-reference
Dieser Datentyp steht für eine Mercurial-Referenz, die @code{hg-fetch} laden
soll.

@table @asis
@item @code{url}
Die URL des zu klonenden Mercurial-Repositorys.

@item @code{changeset}
Diese Zeichenkette gibt den zu ladenden Änderungssatz an.
@end table
@end deftp

Bei Subversion-Repositorys finden Sie im Modul @code{(guix svn-download)}
Definitionen für die Methode @code{svn-fetch} für Paketursprünge sowie den
Datentyp @code{svn-reference}. Mit ihnen wird das Versionskontrollsystem
Subversion unterstützt.

@deffn {Prozedur} svn-fetch Ref Hash-Algo Hash [Name]
Liefert eine Ableitung mit fester Ausgabe, die @var{Ref} lädt, ein
@code{<svn-reference>}-Objekt. Es wird erwartet, dass die Ausgabe rekursiv
die Prüfsumme @var{Hash} aufweist (ein „rekursiver Hash“) gemäß dem Typ
@var{Hash-Algo} (einem Symbol). Als Dateiname wird @var{Name} verwendet,
oder ein generischer Name, falls @var{Name} @code{#f} ist.
@end deffn

@deftp {Datentyp} svn-reference
Dieser Datentyp steht für eine Subversion-Referenz, die @code{svn-fetch}
laden soll.

@table @asis
@item @code{url}
Die URL des zu klonenden Subversion-Repositorys.

@item @code{revision}
Diese Zeichenkette gibt die zu ladende Revision als Zahl an.

@item @code{recursive?} (Vorgabe: @code{#f})
Dieser boolesche Wert gibt an, ob Subversions „externe Verweise“ rekursiv
geladen werden sollen.

@item @code{user-name} (Vorgabe: @code{#f})
Der Name eines Kontos mit Lesezugriff auf das Repository, wenn das
Repository nicht öffentlich ist.

@item @code{password} (Vorgabe: @code{#f})
Das Passwort zum Zugriff auf das Subversion-Repository, wenn nötig.
@end table
@end deftp

Bei Bazaar-Repositorys finden Sie im Modul @code{(guix bzr-download)}
Definitionen für die Methode @code{bzr-fetch} für Paketursprünge sowie den
Datentyp @code{bzr-reference}. Mit ihnen wird das Versionskontrollsystem
Bazaar unterstützt.

@deffn {Prozedur} bzr-fetch Ref Hash-Algo Hash [Name]
Liefert eine Ableitung mit fester Ausgabe, die @var{Ref} lädt, ein
@code{<bzr-reference>}-Objekt. Es wird erwartet, dass die Ausgabe rekursiv
die Prüfsumme @var{Hash} aufweist (ein „rekursiver Hash“) gemäß dem Typ
@var{Hash-Algo} (einem Symbol). Als Dateiname wird @var{Name} verwendet,
oder ein generischer Name, falls @var{Name} @code{#f} ist.
@end deffn

@deftp {Datentyp} bzr-reference
Dieser Datentyp steht für eine Bazaar-Referenz, die @code{bzr-fetch} laden
soll.

@table @asis
@item @code{url}
Die URL des zu klonenden Bazaar-Repositorys.

@item @code{revision}
Diese Zeichenkette gibt die zu ladende Revision als Zahl an.
@end table
@end deftp

For CVS repositories, the module @code{(guix cvs-download)} defines the
@code{cvs-fetch} origin method and @code{cvs-reference} data type for
support of the Concurrent Versions System (CVS).

@deffn {Procedure} cvs-fetch ref hash-algo hash [name]
Liefert eine Ableitung mit fester Ausgabe, die @var{Ref} lädt, ein
@code{<cvs-reference>}-Objekt. Es wird erwartet, dass die Ausgabe rekursiv
die Prüfsumme @var{Hash} aufweist (ein „rekursiver Hash“) gemäß dem Typ
@var{Hash-Algo} (einem Symbol). Als Dateiname wird @var{Name} verwendet,
oder ein generischer Name, falls @var{Name} @code{#f} ist.
@end deffn

@deftp {Data Type} cvs-reference
Dieser Datentyp steht für eine CVS-Referenz, die @code{cvs-fetch} laden
soll.

@table @asis
@item @code{root-directory}
The CVS root directory.

@item @code{module}
Module to fetch.

@item @code{revision}
Revision to fetch.
@end table

The example below denotes a version of gnu-standards to fetch:

@lisp
(cvs-reference
  (root-directory ":pserver:anonymous@@cvs.savannah.gnu.org:/sources/gnustandards")
  (module "gnustandards")
  (revision "2020-11-25"))
@end lisp

@end deftp

@node Paketvarianten definieren
@section Paketvarianten definieren

@cindex Pakete anpassen
@cindex Varianten, von Paketen
Eine der schönen Sachen an Guix ist, dass Sie aus einer Paketdefinition
leicht Varianten desselben Pakets @emph{ableiten} können@tie{}– solche, die
vom Anbieter eine andere Paketversion nehmen, als im Guix-Repository
angegeben, solche mit anderen Abhängigkeiten, anders gearteten
Compiler-Optionen und mehr. Manche dieser eigenen Pakete lassen sich direkt
aus der Befehlszeile definieren (siehe @ref{Paketumwandlungsoptionen}). Dieser Abschnitt beschreibt, wie man Paketvarianten mit Code
definiert. Das kann in „Manifesten“ nützlich sein (siehe @ref{Manifeste verfassen}) und in Ihrer eigenen Paketsammlung (siehe @ref{Einen Kanal erstellen}), unter anderem!

@cindex inherit, für Paketdefinitionen
Wie zuvor erörtert, sind Pakete Objekte erster Klasse in der
Scheme-Sprache. Das Modul @code{(guix packages)} stellt das
@code{package}-Konstrukt zur Verfügung, mit dem neue Paketobjekte definiert
werden können (siehe @ref{„package“-Referenz}). Am einfachsten ist es, eine
Paketvariante zu definieren, indem Sie das @code{inherit}-Schlüsselwort mit
einem @code{package}-Objekt verwenden. Dadurch können Sie die Felder einer
Paketdefinition erben lassen, aber die Felder selbst festlegen, die Sie
festlegen möchten.

Betrachten wir zum Beispiel die Variable @code{hello}, die eine Definition
für die aktuelle Version von GNU@tie{}Hello enthält. So können Sie eine
Variante für Version 2.2 definieren (welche 2006 veröffentlicht wurde@tie{}–
ein guter Jahrgang!):

@lisp
(use-modules (gnu packages base))    ;für „hello“

(define hello-2.2
  (package
    (inherit hello)
    (version "2.2")
    (source (origin
              (method url-fetch)
              (uri (string-append "mirror://gnu/hello/hello-" version
                                  ".tar.gz"))
              (sha256
               (base32
                "0lappv4slgb5spyqbh6yl5r013zv72yqg2pcl30mginf3wdqd8k9"))))))
@end lisp

Das obige Beispiel entspricht dem, was Sie mit den Paketumwandlungsoptionen
@option{--with-version} oder @option{--with-source} erreichen können. Im
Kern erhält @code{hello-2.2} alle Felder von @code{hello} mit Ausnahme von
@code{version} und @code{source}, die ersetzt werden (die beiden unterliegen
einem „Override“). Beachten Sie, dass es die ursprüngliche
@code{hello}-Variable weiterhin gibt, sie bleibt unverändert in dem Modul
@code{(gnu packages base)}. Wenn Sie auf diese Weise ein eigenes Paket
definieren, fügen Sie tatsächlich eine neue Paketdefinition hinzu; das
Original bleibt erhalten.

Genauso gut können Sie Varianten mit einer anderen Menge von Abhängigkeiten
als im ursprünglichen Paket definieren. Zum Beispiel hängt das vorgegebene
@code{gdb}-Paket von @code{guile} ab, aber weil es eine optionale
Abhängigkeit ist, können Sie eine Variante definieren, die jene Abhängigkeit
entfernt, etwa so:

@lisp
(use-modules (gnu packages gdb))   ;für „gdb“

(define gdb-sans-guile
  (package
    (inherit gdb)
    (inputs (modify-inputs (package-inputs gdb)
              (delete "guile")))))
@end lisp

Mit obiger @code{modify-inputs}-Form wird das @code{"guile"}-Paket aus den
Eingaben im @code{inputs}-Feld von @code{gdb} entfernt. Das
@code{modify-inputs}-Makro hilft Ihnen, wann immer Sie etwas aus den
Paketeingaben entfernen, hinzufügen oder ersetzen möchten.

@defmac modify-inputs Eingaben Klauseln
Ändert die übergebenen Paketeingaben, die @code{package-inputs} & Co.@:
liefern können, entsprechend der angegebenen Klauseln. Jede Klausel muss
eine der folgenden Formen aufweisen:

@table @code
@item (delete @var{Name}…)
Die Pakete mit den angegebenen @var{Name}n (als Zeichenketten) aus den
Eingaben entfernen.

@item (prepend @var{Paket}…)
Jedes @var{Paket} vorne an die Eingabenliste anstellen.

@item (append @var{Paket}…)
Jedes @var{Paket} am Ende der Eingabenliste anhängen.

@item (replace @var{Name} @var{Ersatz})
Das Paket namens @var{Name} durch @var{Ersatz} ersetzen.
@end table

Mit folgendem Beispiel werden die Eingaben GMP und ACL unter denen von
Coreutils weggelassen und libcap wird an dem Anfang hinzugefügt:

@lisp
(modify-inputs (package-inputs coreutils)
  (delete "gmp" "acl")
  (prepend libcap))
@end lisp

Mit folgendem Beispiel wird das @code{guile}-Paket unter den Eingaben von
@code{guile-redis} weggelassen und stattdessen wird @code{guile-2.2}
verwendet:

@lisp
(modify-inputs (package-inputs guile-redis)
  (replace "guile" guile-2.2))
@end lisp

Die letzte Art Klausel ist @code{append}, was bedeutet, dass Eingaben hinten
an die Liste angehängt werden.
@end defmac

Manchmal bietet es sich an, Funktionen (also „Prozeduren“, wie
Scheme-Anwender sagen) zu schreiben, die ein Paket abhängig von bestimmten
Parametern zurückliefern. Als Beispiel betrachten wir die
@code{luasocket}-Bibliothek für die Programmiersprache Lua. Wir möchten
@code{luasocket}-Pakete für die hauptsächlichen Versionen von Lua verfügbar
machen. Eine Möglichkeit, das zu erreichen, ist, eine Prozedur zu
definieren, die ein Lua-Paket nimmt und ein von diesem abhängiges
@code{luasocket}-Paket liefert.

@lisp
(define (make-lua-socket name lua)
  ;; Liefert ein luasocket-Paket, das mit LUA erstellt wird.
  (package
    (name name)
    (version "3.0")
    ;; hier würden noch ein paar Felder stehen
    (inputs (list lua))
    (synopsis "Socket library for Lua")))

(define-public lua5.1-socket
  (make-lua-socket "lua5.1-socket" lua-5.1))

(define-public lua5.2-socket
  (make-lua-socket "lua5.2-socket" lua-5.2))
@end lisp

Damit haben wir Pakete @code{lua5.1-socket} und @code{lua5.2-socket}
definiert, indem wir @code{make-lua-socket} mit verschiedenen Argumenten
aufgerufen haben. Siehe @ref{Procedures,,, guile, Referenzhandbuch von GNU
Guile} für mehr Informationen über Prozeduren. Weil wir mit
@code{define-public} öffentlich sichtbare Definitionen auf oberster Ebene
(„top-level“) für diese beiden Pakete angegeben haben, kann man sie von der
Befehlszeile aus benutzen (siehe @ref{Paketmodule}).

@cindex Paketumwandlungen
Bei diesen handelt es sich um sehr einfache Paketvarianten. Bequemer ist es
dann, mit dem Modul @code{(guix transformations)} eine hochsprachliche
Schnittstelle einzusetzen, die auf die komplexeren Paketumwandlungsoptionen
direkt abbildet (siehe @ref{Paketumwandlungsoptionen}):

@deffn {Prozedur} options->transformation Optionen
Liefert eine Prozedur, die gegeben ein zu erstellendes Objekt (ein Paket,
eine Ableitung oder Ähnliches) die durch @var{Optionen} festgelegten
Umwandlungen daran umsetzt und die sich ergebenden Objekte
zurückliefert. @var{Optionen} muss eine Liste von Paaren aus Symbol und
Zeichenkette sein wie:

@lisp
((with-branch . "guile-gcrypt=master")
 (without-tests . "libgcrypt"))
@end lisp

Jedes Symbol benennt eine Umwandlung. Die entsprechende Zeichenkette ist ein
Argument an diese Umwandlung.
@end deffn

Zum Beispiel wäre ein gleichwertiges Manifest zu diesem Befehl:

@example
guix build guix \
  --with-branch=guile-gcrypt=master \
  --with-debug-info=zlib
@end example

@noindent
… dieses hier:

@lisp
(use-modules (guix transformations))

(define transform
  ;; Die Prozedur zur Paketumwandlung.
  (options->transformation
   '((with-branch . "guile-gcrypt=master")
     (with-debug-info . "zlib"))))

(packages->manifest
 (list (transform (specification->package "guix"))))
@end lisp

@cindex Eingaben umschreiben
@cindex Abhängigkeitsgraphen umschreiben
Die Prozedur @code{options->transformation} lässt sich einfach benutzen, ist
aber vielleicht nicht so flexibel, wie Sie es sich wünschen. Wie sieht ihre
Implementierung aus? Aufmerksamen Lesern mag aufgefallen sein, dass die
meisten Paketumwandlungen die oberflächlichen Änderungen aus den ersten
Beispielen in diesem Abschnitt übersteigen: Sie @dfn{schreiben Eingaben um},
was im Abhängigkeitsgraphen bestimmte Eingaben durch andere ersetzt.

Das Umschreiben des Abhängigkeitsgraphen, damit Pakete im Graphen
ausgetauscht werden, ist in der Prozedur @code{package-input-rewriting} aus
@code{(guix packages)} implementiert.

@deffn {Prozedur} package-input-rewriting Ersetzungen [umgeschriebener-Name] @
  [#:deep? #t] [#:recursive? #f]
Eine Prozedur liefern, die für ein ihr übergebenes Paket dessen direkte und
indirekte Abhängigkeit gemäß den @var{Ersetzungen} umschreibt,
einschließlich ihrer impliziten Eingaben, wenn @var{deep?} wahr
ist. @var{Ersetzungen} ist eine Liste von Paketpaaren; das erste Element
eines Paares ist das zu ersetzende Paket und das zweite ist, wodurch es
ersetzt werden soll.

Wenn @var{recursive?} wahr ist, werden die Ersetzungen außerdem auf die
rechte Seite der @var{Ersetzungen} rekursiv angewendet.

Optional kann als @var{umgeschriebener-Name} eine ein Argument nehmende
Prozedur angegeben werden, die einen Paketnamen nimmt und den Namen nach dem
Umschreiben zurückliefert.
@end deffn

@noindent
Betrachten Sie dieses Beispiel:

@lisp
(define libressl-statt-openssl
  ;; Dies ist eine Prozedur, mit der OPENSSL durch LIBRESSL
  ;; rekursiv ersetzt wird.
  (package-input-rewriting `((,openssl . ,libressl))))

(define git-mit-libressl
  (libressl-statt-openssl git))
@end lisp

@noindent
Hier definieren wir zuerst eine Umschreibeprozedur, die @var{openssl} durch
@var{libressl} ersetzt. Dann definieren wir damit eine @dfn{Variante} des
@var{git}-Pakets, die @var{libressl} statt @var{openssl} benutzt. Das ist
genau, was auch die Befehlszeilenoption @option{--with-input} tut (siehe
@ref{Paketumwandlungsoptionen, @option{--with-input}}).

Die folgende Variante von @code{package-input-rewriting} kann für die
Ersetzung passende Pakete anhand ihres Namens finden, statt zu prüfen, ob
der Wert identisch ist.

@deffn {Prozedur} package-input-rewriting/spec @var{Ersetzungen} @
  [#:deep? #t] [#:replace-hidden? #t]
Liefert eine Prozedur, die für ein gegebenes Paket die angegebenen
@var{Ersetzungen} auf dessen gesamten Paketgraphen anwendet (einschließlich
impliziter Eingaben, außer wenn @var{deep?} falsch ist).

@var{replacements} is a list of spec/procedures pair; each spec is a package
specification such as @code{"gcc"} or @code{"guile@@2"}, and each procedure
takes a matching package and returns a replacement for that package.
Matching packages that have the @code{hidden?} property set are not replaced
unless @var{replace-hidden?} is set to true.
@end deffn

Das obige Beispiel könnte auch so geschrieben werden:

@lisp
(define libressl-statt-openssl
  ;; Rekursiv alle Pakete namens "openssl" durch LibreSSL ersetzen.
  (package-input-rewriting/spec `(("openssl" . ,(const libressl)))))
@end lisp

Der Hauptunterschied ist hier, dass diesmal Pakete zur Spezifikation passen
müssen und nicht deren Wert identisch sein muss, damit sie ersetzt
werden. Mit anderen Worten wird jedes Paket im Graphen ersetzt, das
@code{openssl} heißt.

Eine allgemeiner anwendbare Prozedur, um den Abhängigkeitsgraphen eines
Pakets umzuschreiben, ist @code{package-mapping}. Sie unterstützt beliebige
Änderungen an den Knoten des Graphen.

@deffn {Prozedur} package-mapping Prozedur [Schnitt?] [#:deep? #f]
Liefert eine Prozedur, die, wenn ihr ein Paket übergeben wird, die an
@code{package-mapping} übergebene @var{Prozedur} auf alle vom Paket
abhängigen Pakete anwendet. Die Prozedur liefert das resultierende
Paket. Wenn @var{Schnitt?} für ein Paket davon einen wahren Wert liefert,
findet kein rekursiver Abstieg in dessen Abhängigkeiten statt. Steht
@var{deep?} auf wahr, wird die @var{Prozedur} auch auf implizite Eingaben
angewandt.
@end deffn

@quotation Tipps
Es kann kompliziert werden, zu verstehen, was für eine Variante sich nach
Behandlung mit einem Gemisch aus obigen Werkzeugen ergibt. Abhilfe leisten
Mittel, mit denen Sie die Pakete untersuchen können:

@itemize
@item
Sie können das Paket interaktiv auf der REPL untersuchen, um sich zum
Beispiel die benutzten Eingaben, den Code in Erstellungsphasen oder die an
configure übergebenen Befehlszeilenoptionen anzuschauen (siehe @ref{Interaktiv mit Guix arbeiten}).

@item
Wenn Sie die Abhängigkeiten umschreiben, können Sie mit @command{guix graph}
oftmals leichter visualisiert bekommen, welche Änderungen passieren (siehe
@ref{Aufruf von guix graph}).
@end itemize
@end quotation

@node Manifeste verfassen
@section Manifeste verfassen

@cindex Manifest
@cindex Bill of Materials (Manifeste)
Sie können die Paketlisten für @command{guix}-Befehle auf der Befehlszeile
angeben. Das ist bequem, bis die Paketlisten länger und weniger trivial
werden. Dann nämlich wird es bald bequemer, die Paketliste in einer Form zu
haben, die wir ein @dfn{Manifest} nennen. Neudeutsch kann man ein Manifest
wie eine „Bill of Materials“, eine Stückliste oder Güterliste auffassen,
womit ein Satz von Paketen festgelegt wird. Im Normalfall denken Sie sich
ein Code-Schnipsel aus, mit dem das Manifest erstellt wird, bringen den Code
in einer Datei unter, sagen wir @file{manifest.scm}, und übergeben diese
Datei mit der Befehlszeilenoption @option{-m} (oder @option{--manifest}),
die von vielen @command{guix}-Befehlen unterstützt wird. Zum Beispiel könnte
so ein Manifest für einen einfachen Satz Pakete aussehen:

@lisp
;; Manifest dreier Pakete.
(specifications->manifest '("gcc-toolchain" "make" "git"))
@end lisp

Sobald Sie das Manifest haben, können Sie es an z.B.@: @command{guix
package} übergeben, was dann nur genau diese drei Pakete in Ihr Profil
installiert (siehe @ref{profile-manifest, die Befehlszeilenoption
@option{-m} von @command{guix package}}):

@example
guix package -m manifest.scm
@end example

@noindent
… oder Sie übergeben das Manifest an @command{guix shell} (siehe
@ref{shell-manifest, die Befehlszeilenoption @option{-m} von @command{guix
shell}}) und richten sich so eine vergängliche Umgebung ein:

@example
guix shell -m manifest.scm
@end example

@noindent
… oder Sie übergeben das Manifest an @command{guix pack}, was ziemlich
genauso geht (siehe @ref{pack-manifest, die Befehlszeilenoption @option{-m}
von @command{guix pack}}). Ein Manifest können Sie unter Versionskontrolle
stellen oder es mit anderen Teilen, um deren System schnell auf den gleichen
Stand zu bringen, und vieles mehr.

Doch wie schreibt man eigentlich sein erstes Manifest? Für den Anfang
möchten Sie vielleicht ein Manifest, das dem nachempfunden ist, was Sie
schon in einem Ihrer Profile haben. Statt bei null anzufangen, können Sie
sich mit @command{guix package} ein Manifest generieren lassen (siehe
@ref{export-manifest, @command{guix package --export-manifest}}):

@example
# Wir schreiben in 'manifest.scm' ein Manifest, das dem
# Standardprofil ~/.guix-profile entspricht.
guix package --export-manifest > manifest.scm
@end example

Oder vielleicht möchten Sie die Argumente von der Befehlszeile in ein
Manifest übertragen. Dabei kann @command{guix shell} helfen (siehe
@ref{shell-export-manifest, @command{guix shell --export-manifest}}):

@example
# Wir schreiben ein Manifest für die auf der Befehlszeile
# angegebenen Pakete.
guix shell --export-manifest gcc-toolchain make git > manifest.scm
@end example

In beiden Fällen werden bei der Befehlszeilenoption
@option{--export-manifest} etliche Feinheiten berücksichtigt, um ein
originalgetreues Manifest zu erzeugen. Insbesondere werden
Paketumwandlungsoptionen wiedergegeben (siehe @ref{Paketumwandlungsoptionen}).

@quotation Anmerkung
Manifeste sind @emph{symbolisch}: Sie beziehen sich auf die Pakete, die in
den @emph{aktuell verwendeten} Kanälen enthalten sind (siehe
@ref{Kanäle}). Im obigen Beispiel bezieht sich @code{gcc-toolchain} heute
vielleicht auf Version 14, aber in zwei Jahren kann es Version 16 heißen.

Wenn Sie wollen, dass immer dieselben Paketversionen und -varianten in Ihre
Software-Umgebung aufgenommen werden, sind mehr Informationen nötig, nämlich
welche Kanalversionen zur Zeit in Benutzung sind. Das sagt uns @command{guix
describe}. Siehe @ref{Guix nachbilden} für weitere Informationen.
@end quotation

Sobald Sie sich Ihr erstes Manifest beschafft haben, möchten Sie vielleicht
Anpassungen daran vornehmen. Da es sich beim Manifest um Code handelt,
stehen Ihnen alle Guix-Programmierschnittstellen zur Verfügung!

Nehmen wir an, Sie hätten gerne ein Manifest, um eine angepasste Variante
von GDB, dem GNU-Debugger, einzusetzen, die von Guile @emph{nicht} abhängt,
zusammen mit noch einem anderen Paket. Um auf dem Beispiel aus dem vorigen
Abschnitt aufzubauen (siehe @ref{Paketvarianten definieren}), können Sie das
Manifest z.B.@: folgendermaßen schreiben:

@lisp
(use-modules (guix packages)
             (gnu packages gdb)               ;für 'gdb'
             (gnu packages version-control))  ;für 'git'

;; Eine Variante von GDB ohne Abhängigkeit von Guile definieren.
(define gdb-sans-guile
  (package
    (inherit gdb)
    (inputs (modify-inputs (package-inputs gdb)
              (delete "guile")))))

;; Liefert ein Manifest mit diesem Paket und außerdem Git.
(packages->manifest (list gdb-sans-guile git))
@end lisp

Beachten Sie, in diesem Beispiel nimmt das Manifest direkt Bezug auf die
Variablen @code{gdb} und @code{git}, die an je ein Paketobjekt vom Typ
@code{package} gebunden sind (siehe @ref{„package“-Referenz}), statt wie
zuvor @code{specifications->manifest} aufzurufen und damit die Pakete anhand
deren Namens zu finden. Die @code{use-modules}-Form am Dateianfang gibt uns
Zugriff auf den Kern der Paketschnittstelle (siehe @ref{Pakete definieren})
und die Module, in denen @code{gdb} und @code{git} definiert sind (siehe
@ref{Paketmodule}). Nahtlos können wir all dies miteinander
verknüpfen@tie{}– grenzenlose Möglichkeiten eröffnen sich; lassen Sie Ihrer
Kreativität freien Lauf!

Der Datentyp für Manifeste sowie Prozeduren, um mit ihm umzugehen, sind
definiert im Modul @code{(guix profiles)}. In Code, den Sie mit @option{-m}
übergeben, wird es automatisch verfügbar gemacht. Nun folgt die Referenz
dazu.

@deftp {Datentyp} manifest
Der Datentyp, der ein Manifest repräsentiert.

Zurzeit gibt es darin ein Feld:

@table @code
@item entries
Dies muss eine Liste von @code{manifest-entry}-Verbundsobjekten sein, wie
hier beschrieben.
@end table
@end deftp

@deftp {Datentyp} manifest-entry
Der Datentyp steht für einen Eintrag im Manifest. Zu so einem
Manifesteintrag gehören im Wesentlichen Metadaten: der Name und die Version
als Zeichenkette, das Objekt selbst (meistens ein Paket), welche Ausgabe man
davon haben will (siehe @ref{Pakete mit mehreren Ausgaben.}) und noch ein
paar optionale Informationen, wie wir im Folgenden näher ausführen.

Die meiste Zeit basteln Sie sich die Manifesteinträge nicht selber zusammen,
sondern Sie übergeben ein Paket an @code{package->manifest-entry}, siehe
unten. Aber es könnte Ihnen ein außergewöhnlicher Fall unterkommen, wo Sie
einen Manifesteintrag für etwas erzeugen wollen, das @emph{kein} Paket ist,
wie in diesem Beispiel:

@lisp
;; Für ein Nicht-Paketobjekt einen einzelnen Manifesteintrag von Hand schreiben.
(let ((hello (program-file "hello" #~(display "Hi!"))))
  (manifest-entry
    (name "foo")
    (version "42")
    (item
     (computed-file "verzeichnis-mit-hello"
                     #~(let ((bin (string-append #$output "/bin")))
                         (mkdir #$output) (mkdir bin)
                          (symlink #$hello
                                   (string-append bin "/hello")))))))
@end lisp

Diese Felder stehen zur Verfügung:

@table @asis
@item @code{name}
@itemx @code{version}
Name und Version für diesen Eintrag als Zeichenkette.

@item @code{item}
Ein Paket oder anderes dateiartiges Objekt (siehe @ref{G-Ausdrücke,
dateiartige Objekte}).

@item @code{output} (Vorgabe: @code{"out"})
Welche der Ausgaben von @code{item} genommen werden soll, sofern @code{item}
mehrere Ausgaben umfasst (siehe @ref{Pakete mit mehreren Ausgaben.}).

@item @code{dependencies} (Vorgabe: @code{'()})
Die Liste der Manifesteinträge, von denen dieser Eintrag abhängt. Wenn ein
Profil erstellt wird, werden die aufgeführten Abhängigkeiten zum Profil
hinzugefügt.

In der Regel landen die propagierten Eingaben eines Pakets (siehe
@ref{„package“-Referenz, @code{propagated-inputs}}) in je einem
Manifesteintrag unter den Abhängigkeiten des Manifesteintrags des Pakets.

@item @code{search-paths} (Vorgabe: @code{'()})
Die Liste der Suchpfadspezifikationen, die für diesen Eintrag beachtet
werden (siehe @ref{Suchpfade}).

@item @code{properties} (Vorgabe: @code{'()})
Eine Liste von Paaren aus jeweils einem Symbol und dem Wert dazu. Beim
Erstellen eines Profils werden die Eigenschaften serialisiert.

So kann man den Paketen zusätzliche Metadaten aufschnallen wie z.B.@: welche
Umwandlungsoptionen darauf angewendet wurden (siehe @ref{Paketumwandlungsoptionen}).

@item @code{parent} (Vorgabe: @code{(delay #f)})
Ein Versprechen (unter englischsprechenden Schemern bekannt als „Promise“),
das auf den übergeordneten Manifesteintrag zeigt.

Es wird benutzt, um in auf Manifesteinträge in @code{dependencies} bezogenen
Fehlermeldungen Hinweise auf den Kontext zu geben.
@end table
@end deftp

@deffn {Prozedur} concatenate-manifests Liste
Fasst die Manifeste in der @var{Liste} zu einem zusammen und liefert es
zurück.
@end deffn

@c TODO: <manifest-pattern>, manifest-lookup, manifest-remove, etc.

@deffn {Prozedur} package->manifest-entry Paket [Ausgabe] [#:properties]
Liefert einen Manifesteintrag für die @var{Ausgabe} von @var{Paket}, wobei
@var{Ausgabe} als Vorgabewert @code{"out"} hat. Als Eigenschaften werden die
@var{properties} benutzt; vorgegeben ist die leere Liste oder, wenn eine
oder mehrere Paketumwandlungen auf das @var{Paket} angewendet wurden, eine
assoziative Liste mit diesen Umwandlungen, die als Argument an
@code{options->transformation} gegeben werden kann (siehe @ref{Paketvarianten definieren, @code{options->transformation}}).

Mit folgendem Code-Schnipsel wird ein Manifest mit einem Eintrag für die
Standardausgabe sowie die Ausgabe namens @code{send-email} des Pakets
@code{git} erstellt:

@lisp
(use-modules (gnu packages version-control))

(manifest (list (package->manifest-entry git)
                (package->manifest-entry git "send-email")))
@end lisp
@end deffn

@deffn {Prozedur} packages->manifest Pakete
Liefert eine Liste von Manifesteinträgen, jeweils einer für jedes
Listenelement in @var{Pakete}. In @var{Pakete} können Paketobjekte oder
Tupel aus Paket und Zeichenkette stehen, wobei die Zeichenkette die
Paketausgabe angibt.

Mithilfe dieser Prozedur kann man das obige Manifest auch kürzer
aufschreiben:

@lisp
(use-modules (gnu packages version-control))

(packages->manifest (list git `(,git "send-email")))
@end lisp
@end deffn

@anchor{package-development-manifest}
@deffn {Prozedur} package->development-manifest Paket [System] [#:target]
Liefert ein Manifest mit den @dfn{Entwicklungseingaben} des @var{Pakets} für
@var{System}. Optional kann mit @var{target} das Zielsystem zum
Cross-Kompilieren angegeben werden. Zu den Entwicklungseingaben gehören die
expliziten und impliziten Eingaben vom @var{Paket}.

Genau wie bei der Option @option{-D} für @command{guix shell} (siehe
@ref{shell-development-option, @command{guix shell -D}}) beschreibt das sich
daraus ergebende Manifest die Umgebung, um am @var{Paket} als Entwickler
mitzuarbeiten. Wenn Sie zum Beispiel eine Entwicklungsumgebung für Inkscape
aufsetzen wollen und darin auch Git für die Versionskontrolle zur Verfügung
haben möchten, geben Sie diese Bestandteilliste mit folgendem Manifest
wieder:

@lisp
(use-modules (gnu packages inkscape)          ;für 'inkscape'
             (gnu packages version-control))  ;für 'git'

(concatenate-manifests
 (list (package->development-manifest inkscape)
       (packages->manifest (list git))))
@end lisp

Dieses Beispiel zeigt, wie @code{package->development-manifest} ein
Entwicklungsmanifest mit einem Compiler (GCC), den vielen benutzten
Bibliotheken (Boost, GLib, GTK, etc.) und noch ein paar zusätzlichen
Entwicklungswerkzeugen liefert@tie{}– das sagen uns die von @command{guix
show inkscape} aufgeführten Abhängigkeiten.
@end deffn

@c TODO: Move (gnu packages) interface to a section of its own.

Zum Schluss sind im Modul @code{(gnu packages)} noch Abstraktionen
enthalten, um Manifeste anzufertigen. Dazu gehört, Pakete anhand ihres
Namens zu finden@tie{}– siehe unten.

@deffn {Prozedur} specifications->manifest Spezifikationen
Liefert ein Manifest für die @var{Spezifikationen}, einer Liste von
Spezifikationen wie @code{"emacs@@25.2"} oder @code{"guile:debug"}. Das
Format für die Spezifikationen ist dasselbe wie bei den
Befehlszeilenwerkzeugen @command{guix install}, @command{guix package} und
so weiter (siehe @ref{Aufruf von guix package}).

Ein Beispiel wäre diese Möglichkeit, das zuvor gezeigte Git-Manifest anders
zu formulieren wie hier:

@lisp
(specifications->manifest '("git" "git:send-email"))
@end lisp

Man bemerke, dass wir uns nicht um @code{use-modules} kümmern müssen, um die
richtige Auswahl von Modulen zu importieren und die richtigen Variablen zu
referenzieren. Stattdessen nehmen wir auf Pakete direkt auf die Weise Bezug,
die wir von der Befehlszeile kennen. Wie praktisch!
@end deffn

@c TODO: specifications->package, etc.


@node Erstellungssysteme
@section Erstellungssysteme

@cindex Erstellungssystem
Jede Paketdefinition legt ein @dfn{Erstellungssystem} („build system“) sowie
dessen Argumente fest (siehe @ref{Pakete definieren}). Das
@code{build-system}-Feld steht für die Erstellungsprozedur des Pakets sowie
für weitere implizite Eingaben für die Erstellungsprozedur.

Erstellungssysteme sind @code{<build-system>}-Objekte. Die Schnittstelle, um
solche zu erzeugen und zu verändern, ist im Modul @code{(guix build-system)}
zu finden, und die eigentlichen Erstellungssysteme werden jeweils von ihren
eigenen Modulen exportiert.

@cindex Bag (systemnahe Paketrepräsentation)
Intern funktionieren Erstellungssysteme, indem erst Paketobjekte zu
@dfn{Bags} kompiliert werden. Eine Bag (deutsch: Beutel, Sack) ist wie ein
Paket, aber mit weniger Zierrat@tie{}– anders gesagt ist eine Bag eine
systemnähere Darstellung eines Pakets, die sämtliche Eingaben des Pakets
einschließlich vom Erstellungssystem hinzugefügter Eingaben enthält. Diese
Zwischendarstellung wird dann zur eigentlichen Ableitung kompiliert (siehe
@ref{Ableitungen}). Die Prozedur @code{package-with-c-toolchain} ist zum
Beispiel eine Möglichkeit, wie die durch das Erstellungssystem
hinzugenommenen impliziten Eingaben abgeändert werden können (siehe
@ref{„package“-Referenz, @code{package-with-c-toolchain}}).

Erstellungssysteme akzeptieren optional eine Liste von @dfn{Argumenten}. In
Paketdefinitionen werden diese über das @code{arguments}-Feld übergeben
(siehe @ref{Pakete definieren}). Sie sind in der Regel
Schlüsselwort-Argumente (siehe @ref{Optional Arguments,
Schlüsselwort-Argumente in Guile,, guile, Referenzhandbuch zu GNU
Guile}). Der Wert dieser Argumente wird normalerweise vom Erstellungssystem
in der @dfn{Erstellungsschicht} ausgewertet, d.h.@: von einem durch den
Daemon gestarteten Guile-Prozess (siehe @ref{Ableitungen}).

Das häufigste Erstellungssystem ist @code{gnu-build-system}, was die übliche
Erstellungsprozedur für GNU-Pakete und viele andere Pakete darstellt. Es
wird vom Modul @code{(guix build-system gnu)} bereitgestellt.

@defvar gnu-build-system
@code{gnu-build-system} steht für das GNU-Erstellungssystem und Varianten
desselben (siehe @ref{Configuration, Konfiguration und
Makefile-Konventionen,, standards, GNU Coding Standards}).

@cindex Erstellungsphasen
Kurz gefasst werden Pakete, die es benutzen, konfiguriert, erstellt und
installiert mit der üblichen Befehlsfolge @code{./configure && make && make
check && make install}. In der Praxis braucht man oft noch ein paar weitere
Schritte. Alle Schritte sind in voneinander getrennte @dfn{Phasen}
unterteilt. Siehe @ref{Erstellungsphasen} für mehr Informationen zu
Erstellungsphasen und wie man sie anpassen kann.

Zusätzlich stellt dieses Erstellungssystem sicher, dass die
„Standard“-Umgebung für GNU-Pakete zur Verfügung steht. Diese umfasst
Werkzeuge wie GCC, libc, Coreutils, Bash, Make, Diffutils, grep und sed
(siehe das Modul @code{(guix build-system gnu)} für eine vollständige
Liste). Wir bezeichnen sie als @dfn{implizite Eingaben} eines Pakets, weil
Paketdefinitionen sie nicht aufführen müssen.

Dieses Erstellungssystem unterstützt eine Reihe von Schlüsselwortargumenten,
die über das @code{arguments}-Feld eines Pakets übergeben werden
können. Hier sind einige der wichtigen Parameter:

@table @code
@item #:phases
Mit diesem Argument wird erstellungsseitiger Code angegeben, der zu einer
assoziativen Liste von Erstellungsphasen ausgewertet wird. Siehe @ref{Erstellungsphasen} für nähere Informationen.

@item #:configure-flags
Diese Liste von Befehlszeilenoptionen (als Zeichenketten) werden dem
@command{configure}-Skript übergeben. Siehe @ref{Pakete definieren} für ein
Beispiel.

@item #:make-flags
Diese Zeichenkettenliste enthält Befehlszeilenoptionen, die als Argumente an
@command{make}-Aufrufe in den Phasen @code{build}, @code{check} und
@code{install} übergeben werden.

@item #:out-of-source?
Dieser Boolesche Ausdruck, nach Vorgabe steht er auf @code{#f}, zeigt an, ob
Erstellungen in einem gesonderten Erstellungsverzeichnis abseits des
Quellbaums ausgeführt werden sollen.

Wenn es auf wahr steht, wird in der @code{configure}-Phase eigens ein
Erstellungsverzeichnis angelegt, dorthin gewechselt und das
@code{configure}-Skript von dort ausgeführt. Das ist nützlich bei Paketen,
die so etwas voraussetzen, wie @code{glibc}.

@item #:tests?
Dieser Boolesche Ausdruck, nach Vorgabe steht er auf @code{#t}, zeigt an, ob
in der @code{check}-Phase der Testkatalog des Pakets ausgeführt werden soll.

@item #:test-target
In dieser Zeichenkette, nach Vorgabe @code{"check"}, wird der Name des
Makefile-Ziels angegeben, das die @code{check}-Phase benutzt.

@item #:parallel-build?
@itemx #:parallel-tests?
Mit diesen Booleschen Werten wird festgelegt, ob die Erstellung respektive
der Testkatalog parallel ausgeführt werden soll, indem die
Befehlszeilenoption @code{-j} an @command{make} übergeben wird. Wenn die
Werte wahr sind, wird an @code{make} die Option @code{-j@var{n}} übergeben,
wobei @var{n} die Zahl ist, die in der @option{--cores}-Befehlszeilenoption
an @command{guix-daemon} oder an den @command{guix}-Clientbefehl übergeben
wurde (siehe @ref{Gemeinsame Erstellungsoptionen, @option{--cores}}).

@cindex RUNPATH, Validierung
@item #:validate-runpath?
Dieser Boolesche Ausdruck, nach Vorgabe @code{#t}, bestimmt, ob der in
ELF-Binärdateien, die in der @code{install}-Phase installiert worden sind,
eingetragene @code{RUNPATH} „validiert“ werden soll. ELF-Binärdateien sind
gemeinsame Bibliotheken („Shared Libraries“ mit Dateiendung @code{.so})
sowie ausführbare Dateien. Siehe @ref{phase-validate-runpath, die Phase
@code{validate-runpath}} für die Details.

@item #:substitutable?
Dieser Boolesche Ausdruck, nach Vorgabe @code{#t}, sagt aus, ob
Paketausgaben substituierbar sein sollen, d.h.@: ob Benutzer Substitute
dafür beziehen können sollen, statt sie lokal erstellen zu müssen (siehe
@ref{Substitute}).

@item #:allowed-references
@itemx #:disallowed-references
Wenn für diese Argumente ein wahrer Wert angegeben wird, muss er einer Liste
von Abhängigkeiten entsprechen, die @emph{nicht} unter den Referenzen der
Erstellungsergebnisse vorkommen dürfen. Wenn nach dem Ende der Erstellung
eine solche Referenz noch vorhanden ist, schlägt der Erstellungsvorgang
fehl.

Sie eignen sich, um zu garantieren, dass ein Paket nicht fälschlich seine
Abhängigkeiten aus der Erstellungszeit weiter referenziert, wenn das, zum
Beispiel, die Größe unnötig in die Höhe treiben würde.
@end table

Auch die meisten anderen Erstellungssysteme unterstützen diese
Schlüsselwortargumente.
@end defvar

Andere @code{<build-system>}-Objekte werden definiert, um andere
Konventionen und Werkzeuge von Paketen für freie Software zu
unterstützen. Die anderen Erstellungssysteme erben den Großteil vom
@code{gnu-build-system} und unterscheiden sich hauptsächlich darin, welche
Eingaben dem Erstellungsprozess implizit hinzugefügt werden und welche Liste
von Phasen durchlaufen wird. Manche dieser Erstellungssysteme sind im
Folgenden aufgeführt.

@defvar agda-build-system
Diese Variable wird vom Modul @code{(guix build-system agda)}
exportiert. Sie implementiert eine Erstellungsprozedur für
Agda-Bibliotheken.

Das Erstellungssystem fügt @code{agda} zu den Eingaben hinzu. Ein anderes
Agda-Paket kann mit dem Schlüssel @code{#:agda} angegeben werden.

Für den Schlüssel @code{#:plan} wird eine Liste von Cons-Zellen der Form
@code{(@var{Regexp} . @var{Parameterliste})} angegeben, wobei @var{Regexp}
ein regulärer Ausdruck ist, der auf die zu erstellenden @code{.agda}-Dateien
passt, und @var{Parameterliste} eine Liste von Parametern sein kann, die an
@code{agda} bei dessen Typprüfung übergeben werden.

Wenn die Bibliothek Haskell benutzt, um eine Datei zu erzeugen, in der alle
importierten Module stehen, können Sie @code{#:gnu-and-haskell?} auf
@code{#t} setzen, damit automatisch @code{ghc} und die Standardeingaben des
@code{gnu-build-system} zur Liste der Eingaben hinzugefügt werden. Sie
werden trotzdem von Hand eine Phase hinzufügen oder die @code{'build}-Phase
anpassen müssen, wie es in der Definition von @code{agda-stdlib} gemacht
worden ist.

@end defvar

@defvar ant-build-system
Diese Variable wird vom Modul @code{(guix build-system ant)} exportiert. Sie
implementiert die Erstellungsprozedur für Java-Pakete, die mit dem
@url{https://ant.apache.org/, Ant build tool} erstellt werden können.

Sowohl @code{ant} als auch der @dfn{Java Development Kit} (JDK), wie er vom
Paket @code{icedtea} bereitgestellt wird, werden zu den Eingaben
hinzugefügt. Wenn andere Pakete dafür benutzt werden sollen, können sie
jeweils mit den Parametern @code{#:ant} und @code{#:jdk} festgelegt werden.

Falls das ursprüngliche Paket über keine nutzbare Ant-Erstellungsdatei
(„Ant-Buildfile“) verfügt, kann aus der Angabe im Parameter
@code{#:jar-name} eine minimale Ant-Erstellungsdatei @file{build.xml}
erzeugt werden, in der die für die Erstellung durchzuführenden Aufgaben
(Tasks) für die Erstellung des angegebenen Jar-Archivs stehen. In diesem
Fall kann der Parameter @code{#:source-dir} benutzt werden, um das
Unterverzeichnis mit dem Quellcode anzugeben; sein Vorgabewert ist „src“.

Der Parameter @code{#:main-class} kann mit einer minimalen
Ant-Erstellungsdatei benutzt werden, um die Hauptklasse des resultierenden
Jar-Archivs anzugeben. Dies ist nötig, wenn die Jar-Datei ausführbar sein
soll. Mit dem Parameter @code{#:test-include} kann eine Liste angegeben
werden, welche Junit-Tests auszuführen sind. Der Vorgabewert ist @code{(list
"**/*Test.java")}. Mit @code{#:test-exclude} kann ein Teil der Testdateien
ignoriert werden. Der Vorgabewert ist @code{(list "**/Abstract*.java")},
weil abstrakte Klassen keine ausführbaren Tests enthalten können.

Der Parameter @code{#:build-target} kann benutzt werden, um die Ant-Aufgabe
(Task) anzugeben, die während der @code{build}-Phase ausgeführt werden
soll. Vorgabe ist, dass die Aufgabe (Task) „jar“ ausgeführt wird.

@end defvar

@defvar android-ndk-build-system
@cindex Android-Distribution
@cindex Android-NDK-Erstellungssystem
Diese Variable wird von @code{(guix build-system android-ndk)}
exportiert. Sie implementiert eine Erstellungsprozedur für das Android NDK
(Native Development Kit) benutzende Pakete mit einem Guix-spezifischen
Erstellungsprozess.

Für das Erstellungssystem wird angenommen, dass Pakete die zu ihrer
öffentlichen Schnittstelle gehörenden Header-Dateien im Unterverzeichnis
@file{include} der Ausgabe @code{out} und ihre Bibliotheken im
Unterverzeichnis @file{lib} der Ausgabe @code{out} platzieren.

Ebenso wird angenommen, dass es keine im Konflikt stehenden Dateien unter
der Vereinigung aller Abhängigkeiten gibt.

Derzeit wird Cross-Kompilieren hierfür nicht unterstützt, also wird dabei
vorausgesetzt, dass Bibliotheken und Header-Dateien dieselben wie im
Wirtssystem sind.

@end defvar

@defvar asdf-build-system/source
@defvarx asdf-build-system/sbcl
@defvarx asdf-build-system/ecl
@defvarx asdf-build-system/clasp

Diese Variablen, die vom Modul @code{(guix build-system asdf)} exportiert
werden, implementieren Erstellungsprozeduren für Common-Lisp-Pakete, welche
@url{https://common-lisp.net/project/asdf/, „ASDF“} benutzen. ASDF dient der
Systemdefinition für Common-Lisp-Programme und -Bibliotheken.

Das Erstellungssystem @code{asdf-build-system/source} installiert die Pakete
in Quellcode-Form und kann @i{via} ASDF mit jeder
Common-Lisp-Implementierung geladen werden. Die anderen Erstellungssysteme
wie @code{asdf-build-system/sbcl} installieren binäre Systeme in dem Format,
das von einer bestimmten Implementierung verstanden wird. Diese
Erstellungssysteme können auch benutzt werden, um ausführbare Programme zu
erzeugen oder um Lisp-Abbilder mit einem vorab geladenen Satz von Paketen zu
erzeugen.

Das Erstellungssystem benutzt gewisse Namenskonventionen. Bei Binärpaketen
sollte dem Paketnamen die Lispimplementierung als Präfix vorangehen, z.B.@:
@code{sbcl-} für @code{asdf-build-system/sbcl}.

Zudem sollte das entsprechende Quellcode-Paket mit der Konvention wie bei
Python-Paketen (siehe @ref{Python-Module}) ein @code{cl-} als Präfix
bekommen.

Um ausführbare Programme und Abbilder zu erzeugen, können die
erstellungsseitigen Prozeduren @code{build-program} und @code{build-image}
benutzt werden. Sie sollten in einer Erstellungsphase nach der
@code{create-asdf-configuration}-Phase aufgerufen werden, damit das gerade
erstellte System Teil des resultierenden Abbilds sein kann. An
@code{build-program} muss eine Liste von Common-Lisp-Ausdrücken über das
Argument @code{#:entry-program} übergeben werden.

Vorgegeben ist, alle @file{.asd}-Dateien im Quellverzeichnis zu lesen, um zu
ermitteln, welche Systeme definiert sind. Mit dem Parameter
@code{#:asd-files} kann die Liste zu lesender @file{.asd}-Dateien festgelegt
werden. Außerdem wird bei Paketen, für deren Tests ein System in einer
separaten Datei definiert wurde, dieses System geladen, bevor die Tests
ablaufen, wenn es im Parameter @code{#:test-asd-file} steht. Ist dafür kein
Wert gesetzt, werden die Dateien @code{<system>-tests.asd},
@code{<system>-test.asd}, @code{tests.asd} und @code{test.asd} durchsucht,
wenn sie existieren.

Wenn aus irgendeinem Grund der Paketname nicht den Namenskonventionen folgen
kann oder wenn mehrere Systeme kompiliert werden, kann der Parameter
@code{#:asd-systems} benutzt werden, um die Liste der Systemnamen anzugeben.

@end defvar

@defvar cargo-build-system
@cindex Rust-Programmiersprache
@cindex Cargo (Rust-Erstellungssystem)
Diese Variable wird vom Modul @code{(guix build-system cargo)}
exportiert. Damit können Pakete mit Cargo erstellt werden, dem
Erstellungswerkzeug der @uref{https://www.rust-lang.org,
Rust-Programmiersprache}.

@quotation Diese Funktionalität wird demnächst verschwinden
Parameters @code{#:cargo-inputs} and @code{#:cargo-development-inputs},
previously used for specifying source inputs, are deprecated.  Their support
will be removed after Dec. 31, 2026.
@end quotation

It adds @code{rust} and @code{rust:cargo} to the set of inputs.  A different
Rust package can be specified with the @code{#:rust} parameter.

In its @code{unpack-rust-crates}, @code{configure} and
@code{patch-cargo-checksums} phases, this build system will make any source
inputs available to Cargo.  It will also remove an included
@code{Cargo.lock} file to be recreated by @command{cargo} during the
@code{build} phase.  The @code{package} phase will run @command{cargo
package} to create a source crate for future use.  The @code{install} phase
installs the binaries defined by the crate.  Unless @code{install-source?
#f} is defined it will also install a source crate repository of itself and
unpacked sources, to ease in future hacking on Rust packages.

This build system supports
@url{https://doc.rust-lang.org/cargo/reference/workspaces.html, Cargo
workspaces}.  Parameter @code{#:cargo-package-crates} (default: @code{''()})
allows specifying names of library crates to package in the @code{package}
phase.  Specified crates are packaged from left to right, in case there's
dependency among them.  For example, specifying @code{''("pcre2-sys"
"pcre2")} will package @code{"pcre2-sys"} first and then @code{"pcre2"}.
Parameter @code{#:cargo-install-paths} (default: @code{''()}) allows
specifying paths of binary crates to install in the @code{install} phase,
@code{''("crates/atuin")}, for example.

@xref{Rust-Crates}, for packaging guidelines.
@end defvar

@defvar chicken-build-system
Diese Variable wird von @code{(guix build-system chicken)} exportiert. Mit
ihr werden Module von @uref{https://call-cc.org/, CHICKEN Scheme}
kompiliert. Sie sind auch bekannt als „Eggs“ oder als
„Erweiterungen“. CHICKEN erzeugt C-Quellcode, der dann von einem C-Compiler
kompiliert wird; in diesem Fall vom GCC.

Dieses Erstellungssystem fügt @code{chicken} neben den Paketen des
@code{gnu-build-system} zu den Paketeingaben hinzu.

Das Erstellungssystem kann den Namen des Eggs (noch) nicht automatisch
herausfinden, also müssen Sie, ähnlich wie beim @code{#:import-path} des
@code{go-build-system}, im @code{arguments}-Feld des Pakets den
@code{#:egg-name} festlegen.

Zum Beispiel würden Sie so vorgehen, um ein Paket für das Egg @code{srfi-1}
zu schreiben:

@lisp
(arguments '(#:egg-name "srfi-1"))
@end lisp

Abhängigkeiten von Eggs müssen in @code{propagated-inputs} genannt werden
und @emph{nicht} in @code{inputs}, weil CHICKEN keine absoluten Referenzen
in kompilierte Eggs einbettet. Abhängigkeiten für Tests sollten wie üblich
in @code{native-inputs} stehen.
@end defvar

@defvar copy-build-system
Diese Variable wird vom Modul @code{(guix build-system copy)}
exportiert. Damit können einfache Pakete erstellt werden, für die nur wenig
kompiliert werden muss, sondern in erster Linie Dateien kopiert werden.

Dadurch wird ein Großteil der Pakete von @code{gnu-build-system} zur Menge
der Paketeingaben hinzugefügt. Deswegen kann man bei Nutzung des
@code{copy-build-system} auf große Teile des Codes verzichten, der beim
@code{trivial-build-system} anfallen würde.

Um den Dateiinstallationsvorgang weiter zu vereinfachen, wird ein Argument
@code{#:install-plan} zur Verfügung gestellt, mit dem der Paketautor angeben
kann, welche Dateien wohin gehören. Der Installationsplan ist eine Liste aus
@code{(@var{Quelle} @var{Ziel} [@var{Filter}])}. Die @var{Filter} sind
optional.

@itemize
@item Wenn die @var{Quelle} einer Datei oder einem Verzeichnis ohne Schrägstrich am Ende entspricht, wird sie nach @var{Ziel} installiert.
@itemize
@item Hat das @var{Ziel} einen Schrägstrich am Ende, wird mit dem Basisnamen der @var{Quelle} innerhalb von @var{Ziel} installiert.
@item Andernfalls wird die @var{Quelle} als @var{Ziel} installiert.
@end itemize

@item Falls es sich bei der @var{Quelle} um ein Verzeichnis mit Schrägstrich am Ende handelt oder wenn @var{Filter} benutzt werden,
so ist der Schrägstrich am Ende von @var{Ziel} mit der Bedeutung wie oben
implizit.
@itemize
@item Ohne Angabe von @var{Filter}n wird der gesamte @emph{Inhalt} der @var{Quelle} nach @var{Ziel} installiert.
@item Werden @var{Filter} als @code{#:include}, @code{#:include-regexp}, @code{#:exclude}
oder @code{#:exclude-regexp} aufgeführt, werden je nach Filter nur die
ausgewählten Dateien installiert. Jeder Filter wird als Liste von
Zeichenketten angegeben.
@itemize
@item Bei @code{#:include} werden all die Dateien installiert, deren Pfad als Suffix
zu mindestens einem der Elemente der angegebenen Liste passt.
@item Bei @code{#:include-regexp} werden all die Dateien installiert, deren
Unterpfad zu mindestens einem der regulären Ausdrücke in der angegebenen
Liste passt.
@item Die Filter @code{#:exclude} und @code{#:exclude-regexp}
bewirken das Gegenteil ihrer Include-Entsprechungen. Ohne
@code{#:include}-Angaben werden alle Dateien außer den zu den
Exclude-Filtern passenden installiert. Werden sowohl @code{#:include} als
auch @code{#:exclude} angegeben, werden zuerst die @code{#:include}-Angaben
beachtet und danach wird durch @code{#:exclude} gefiltert.
@end itemize
@item When a package has multiple outputs, the @code{#:output} argument
can be used to specify which output label the files should be installed to.
@end itemize
In jedem Fall bleiben die Pfade relativ zur @var{Quelle} innerhalb des
@var{Ziel}s erhalten.
@end itemize

Beispiele:

@itemize
@item @code{("foo/bar" "share/my-app/")}: Installiert @file{bar} nach @file{share/my-app/bar}.
@item @code{("foo/bar" "share/my-app/baz")}: Installiert @file{bar} nach @file{share/my-app/baz}.
@item @code{("foo/" "share/my-app")}: Installiert den Inhalt von @file{foo} innerhalb von @file{share/my-app}.
Zum Beispiel wird @file{foo/sub/datei} nach @file{share/my-app/sub/datei}
installiert.
@item @code{("foo/" "share/my-app" #:include ("sub/datei"))}: Installiert nur @file{foo/sub/datei}
nach @file{share/my-app/sub/datei}.
@item @code{("foo/sub" "share/my-app" #:include ("datei"))}: Installiert @file{foo/sub/datei}
nach @file{share/my-app/datei}.
@item @code{("foo/doc" "share/my-app/doc" #:output "doc")}: Install
@file{"foo/doc"} to @file{"share/my-app/doc"} within the @code{"doc"}
output.
@end itemize
@end defvar

@defvar vim-build-system
Diese Variable wird vom Modul @code{(guix build-system vim)} exportiert. Sie
ist eine Erweiterung des @code{copy-build-system}, mit der Plugins für Vim
und Neovim an die Stelle installiert werden, die von den beiden Texteditoren
als „packpaths“ erwartet wird.

Pakete, die mit dem Präfix @code{vim-} beginnen, werden in den Packpath von
Vim installiert und die, die mit dem Präfix @code{neovim-} beginnen, werden
in den Packpath von Neovim installiert. Wenn ein Verzeichnis @code{doc} beim
Plugin enthalten ist, werden automatisch Helptags generiert.

Für @code{vim-build-system} stehen ein paar mehr Schlüsselwörter zur
Verfügung:
@itemize
@item Mit @code{plugin-name} ist es möglich, den Namen des Plugins anzugeben.
Vorgegeben ist hierfür der Name und die Version des Pakets, aber hilfreicher
ist, den Namen anzugeben, der vom Autor beim Anbieter für das Plugin
hinterlegt wurde. Dieser Name ist der, den Sie in Vim für @command{:packadd}
benutzen.
@item With @code{install-plan} it is possible to augment the built-in
install-plan of the @code{vim-build-system}.  This is particularly helpful
if you have files which should be installed in other locations.  For more
information about using the @code{install-plan}, see the
@code{copy-build-system} (@pxref{Erstellungssysteme, @code{copy-build-system}}).
@item With @code{#:vim} it is possible to add this package to Vim's packpath,
in addition to if it is added automatically because of the @code{vim-}
prefix in the package's name.
@item With @code{#:neovim} it is possible to add this package to Neovim's
packpath, in addition to if it is added automatically because of the
@code{neovim-} prefix in the package's name.
@item With @code{#:mode} it is possible to adjust the path which the plugin is
installed into.  By default the plugin is installed into @code{start} and
other options are available, including @code{opt}.  Adding a plugin into
@code{opt} will mean you will need to run, for example, @command{:packadd
foo} to load the @code{foo} plugin from inside of Vim.
@end itemize
@end defvar

@cindex Clojure (Programmiersprache)
@cindex einfaches Clojure-Erstellungssystem
@defvar clojure-build-system
Diese Variable wird durch das Modul @code{(guix build-system clojure)}
exportiert. Sie implementiert eine einfache Erstellungsprozedur für in
@uref{https://clojure.org/, Clojure} geschriebene Pakete mit dem guten alten
@code{compile} in Clojure. Cross-Kompilieren wird noch nicht unterstützt.

Das Erstellungssystem fügt @code{clojure}, @code{icedtea} und @code{zip} zu
den Eingaben hinzu. Sollen stattdessen andere Pakete benutzt werden, können
diese jeweils mit den Parametern @code{#:clojure}, @code{#:jdk} und
@code{#:zip} spezifiziert werden.

Eine Liste der Quellcode-Verzeichnisse, Test-Verzeichnisse und Namen der
Jar-Dateien können jeweils über die Parameter @code{#:source-dirs},
@code{#:test-dirs} und @code{#:jar-names} angegeben werden. Das Verzeichnis,
in das kompiliert wird, sowie die Hauptklasse können jeweils mit den
Parametern @code{#:compile-dir} und @code{#:main-class} angegeben
werden. Andere Parameter sind im Folgenden dokumentiert.

Dieses Erstellungssystem ist eine Erweiterung des @code{ant-build-system},
bei der aber die folgenden Phasen geändert wurden:

@table @code

@item build
Diese Phase ruft @code{compile} in Clojure auf, um Quelldateien zu
kompilieren, und führt @command{jar} aus, um Jar-Dateien aus sowohl
Quelldateien als auch kompilierten Dateien zu erzeugen, entsprechend der
jeweils in @code{#:aot-include} und @code{#:aot-exclude} festgelegten Listen
aus in der Menge der Quelldateien eingeschlossenen und ausgeschlossenen
Bibliotheken. Die Ausschlussliste hat Vorrang vor der Einschlussliste. Diese
Listen setzen sich aus Symbolen zusammen, die für Clojure-Bibliotheken
stehen oder dem Schlüsselwort @code{#:all} entsprechen, was für alle im
Quellverzeichis gefundenen Clojure-Bibliotheken steht. Der Parameter
@code{#:omit-source?} entscheidet, ob Quelldateien in die Jar-Archive
aufgenommen werden sollen.

@item check
In dieser Phase werden Tests auf die durch Einschluss- und Ausschlussliste
@code{#:test-include} bzw. @code{#:test-exclude} angegebenen Dateien
ausgeführt. Deren Bedeutung ist analog zu @code{#:aot-include} und
@code{#:aot-exclude}, außer dass das besondere Schlüsselwort @code{#:all}
jetzt für alle Clojure-Bibliotheken in den Test-Verzeichnissen steht. Der
Parameter @code{#:tests?} entscheidet, ob Tests ausgeführt werden sollen.

@item install
In dieser Phase werden alle zuvor erstellten Jar-Dateien installiert.
@end table

Zusätzlich zu den bereits angegebenen enthält dieses Erstellungssystem noch
eine weitere Phase.

@table @code

@item install-doc
Diese Phase installiert alle Dateien auf oberster Ebene, deren Basisnamen
ohne Verzeichnisangabe zu @code{%doc-regex} passen. Ein anderer regulärer
Ausdruck kann mit dem Parameter @code{#:doc-regex} verwendet werden. All die
so gefundenen oder (rekursiv) in den mit @code{#:doc-dirs} angegebenen
Dokumentationsverzeichnissen liegenden Dateien werden installiert.
@end table
@end defvar

@defvar cmake-build-system
Diese Variable wird von @code{(guix build-system cmake)} exportiert. Sie
implementiert die Erstellungsprozedur für Pakete, die das
@url{https://www.cmake.org, CMake-Erstellungswerkzeug} benutzen.

This build system adds the following keyword parameters to the ones defined
by @code{gnu-build-system}:

@table @code
@item #:cmake
The @code{cmake} package is added to the set of inputs. Which package is
used can be specified with the @code{#:cmake} parameter.

@item #:build-type
The @code{#:build-type} parameter specifies in abstract terms the flags
passed to the compiler; it defaults to @code{"RelWithDebInfo"} (short for
``release mode with debugging information''), which roughly means that code
is compiled with @code{-O2 -g}, as is the case for Autoconf-based packages
by default.

@item #:generator
This parameter specifies the
@url{https://cmake.org/cmake/help/latest/manual/cmake-generators.7.html,
CMake generator} responsible for writing the input files for the native
build system.

@item #:test-exclude
Tests matching this regular expression are excluded from testing by
@url{https://cmake.org/cmake/help/latest/manual/ctest.1.html, ctest}.

@item #:test-repeat-until-pass?
Directs @url{https://cmake.org/cmake/help/latest/manual/ctest.1.html, ctest}
to
@url{https://cmake.org/cmake/help/latest/manual/ctest.1.html#cmdoption-ctest-repeat,
repeat} failed tests up to @code{#:test-repeat-until-pass-count} times and
is enabled by default.

@item #:test-repeat-until-pass-count
When @code{#:test-repeat-until-pass?} is enabled this parameter sets the
maximum number of failures for each test. The default is @code{5}.
@end table
@end defvar

@defvar composer-build-system
Diese Variable wird von @code{(guix build-system composer)} exportiert. Sie
implementiert die Erstellungsprozedur für Pakete, die auf die
PHP-Paketverwaltung @url{https://getcomposer.org/, Composer} zugeschnitten
sind.

Das Erstellungssystem fügt automatisch das Paket @code{php} zu den Eingaben
hinzu. Welches Paket benutzt wird, kann mit dem Parameter @code{#:php}
geändert werden.

Mit dem Parameter @code{#:test-target} stellen Sie ein, welcher Skript die
Tests laufen lässt. Vorgegeben ist, den Skript @code{test} zu starten, wenn
er existiert. Wenn der Skript @emph{nicht} existiert, wird durch das
Erstellungssystem @code{phpunit} im Quellverzeichnis ausgeführt, sofern eine
Datei @file{phpunit.xml} existiert.
@end defvar

@defvar dune-build-system
Diese Variable wird vom Modul @code{(guix build-system dune)}
exportiert. Sie unterstützt es, Pakete mit @uref{https://dune.build/, Dune}
zu erstellen, einem Erstellungswerkzeug für die Programmiersprache OCaml,
und ist als Erweiterung des unten beschriebenen OCaml-Erstellungssystems
@code{ocaml-build-system} implementiert. Als solche können auch die
Parameter @code{#:ocaml} und @code{#:findlib} an dieses Erstellungssystem
übergeben werden.

Das Erstellungssystem fügt automatisch das Paket @code{dune} zu den Eingaben
hinzu. Welches Paket benutzt wird, kann mit dem Parameter @code{#:dune}
geändert werden.

Es gibt keine @code{configure}-Phase, weil dune-Pakete typischerweise nicht
konfiguriert werden müssen. Vom Parameter @code{#:build-flags} wird
erwartet, dass es sich um eine Liste von Befehlszeilenoptionen handelt, die
zur Erstellung an den @code{dune}-Befehl übergeben werden.

Der Parameter @code{#:jbuild?} kann übergeben werden, um den Befehl
@code{jbuild} anstelle des neueren @code{dune}-Befehls aufzurufen, um das
Paket zu erstellen. Der Vorgabewert ist @code{#f}.

Mit dem Parameter @code{#:package} kann ein Paketname angegeben werden, wenn
im Paket mehrere Pakete enthalten sind und nur eines davon erstellt werden
soll. Es ist äquivalent dazu, die Befehlszeilenoption @code{-p} an
@code{dune} zu übergeben.

@end defvar

@defvar elm-build-system
Diese Variable wird von @code{(guix build-system elm)} exportiert. Sie
implementiert eine Erstellungsprozedur für @url{https://elm-lang.org,
Elm-Pakete} ähnlich wie @samp{elm install}.

Mit dem Erstellungssystem wird ein Elm-Compiler-Paket zu der Menge der
Eingaben hinzugefügt. Anstelle des vorgegebenen Compiler-Pakets (derzeit ist
es @code{elm-sans-reactor}) kann das stattdessen zu verwendende
Compiler-Paket im Argument @code{#:elm} angegeben werden. Zudem werden
Elm-Pakete, die vom Erstellungssystem selbst vorausgesetzt werden, als
implizite Eingaben hinzugefügt, wenn sie noch keine sind; wenn Sie das
verhindern möchten, übergeben Sie das Argument
@code{#:implicit-elm-package-inputs?}, was in erster Linie zum Bootstrapping
gebraucht wird.

Die Einträge für @code{"dependencies"} und @code{"test-dependencies"} in der
Datei @file{elm.json} eines Elm-Pakets werden jeweils mit
@code{propagated-inputs} bzw.@: @code{inputs} wiedergegeben.

In Elm wird von Paketnamen eine bestimmte Struktur verlangt. Siehe @ref{Elm-Pakete} für mehr Details auch zu den Werkzeugen in @code{(guix
build-system elm)}, um damit umzugehen.

Derzeit gelten für @code{elm-build-system} ein paar nennenswerte
Einschränkungen:

@itemize
@item
Der Fokus für das Erstellungssystem liegt auf dem, was in Elm @dfn{Pakete}
genannt wird, also auf @dfn{Projekten in Elm}, für die @code{@{ "type":
"package" @}} in deren @file{elm.json}-Dateien deklariert wurde. Wenn jemand
mit @code{elm-build-system} @dfn{Elm-Anwendungen} erstellen möchte (für die
@code{@{ "type": "application" @}} deklariert wurde), ist das möglich, aber
es müssen eigens Änderungen an den Erstellungsphasen vorgenommen
werden. Beispiele sind in den Definitionen der Beispielanwendung
@code{elm-todomvc} und im @code{elm}-Paket selbst zu finden (weil die
Web-Oberfläche des Befehls @samp{elm reactor} eine Elm-Anwendung ist).

@item
In Elm können mehrere Versionen desselben Pakets nebeneinander unter
@env{ELM_HOME} vorkommen, aber mit @code{elm-build-system} klappt das noch
nicht so gut. Diese Einschränkung gilt vor allem für Elm-Anwendungen, weil
dort die Versionen ihrer Abhängigkeiten genau festgelegt werden, während
Elm-Pakete mit einem Bereich von Versionen umgehen können. Ein Ausweg wird
in der oben genannten Beispielanwendung genommen, nämlich benutzt sie die
Prozedur @code{patch-application-dependencies} aus @code{(guix build
elm-build-system)}, um die @file{elm.json}-Dateien umzuschreiben, damit sie
sich stattdessen auf die Paketversionen beziehen, die es in der
Erstellungsumgebung tatsächlich gibt. Alternativ könnte man auch auf
Guix-Paketumwandlungen zurückgreifen (siehe @ref{Paketvarianten definieren}), um den gesamten Abhängigkeitsgraphen einer Anwendung
umzuschreiben.

@item
Wir sind noch nicht so weit, dass wir den Testkatalog für Elm-Projekte
durchlaufen lassen könnten, weil es in Guix weder ein Paket für
@url{https://github.com/mpizenberg/elm-test-rs, @command{elm-test-rs}} noch
für den Node.js-basierten
@url{https://github.com/rtfeldman/node-test-runner, @command{elm-test}}
gibt, um Testläufe durchzuführen.
@end itemize
@end defvar

@defvar go-build-system
Diese Variable wird vom Modul @code{(guix build-system go)} exportiert. Mit
ihr ist eine Erstellungsprozedur für Go-Pakete implementiert, die dem
normalen
@url{https://golang.org/cmd/go/#hdr-Compile_packages_and_dependencies,
Go-Erstellungsmechanismus} entspricht.

Beim Aufruf wird ein Wert für den Schlüssel @code{#:import-path} und
manchmal auch für @code{#:unpack-path} erwartet.  Der
@url{https://golang.org/doc/code.html#ImportPaths, „import path“} entspricht
dem Dateisystempfad, den die Erstellungsskripts des Pakets und darauf Bezug
nehmende Pakete erwarten; durch ihn wird ein Go-Paket eindeutig
bezeichnet. Typischerweise setzt er sich aus einer Kombination der
entfernten URI des Paketquellcodes und der Dateisystemhierarchie
zusammen. Manchmal ist es nötig, den Paketquellcode in ein anderes als das
vom „import path“ bezeichnete Verzeichnis zu entpacken; diese andere
Verzeichnisstruktur sollte dann als @code{#:unpack-path} angegeben werden.

Pakete, die Go-Bibliotheken zur Verfügung stellen, sollten ihren Quellcode
auch in die Erstellungsausgabe installieren. Der Schlüssel
@code{#:install-source?}, sein Vorgabewert ist @code{#t}, steuert, ob
Quellcode installiert wird. Bei Paketen, die nur ausführbare Dateien
liefern, kann der Wert auf @code{#f} gesetzt werden.

Cross-Erstellungen von Paketen sind möglich. Wenn für eine bestimmte
Architektur oder ein bestimmtes Betriebssystem erstellt werden muss, kann
man mit den Schlüsselwörtern @code{#:goarch} und @code{#:goos} erzwingen,
dass das Paket für diese Architektur und dieses Betriebssystem erstellt
wird. Die für Go nutzbaren Kombinationen sind
@url{https://golang.org/doc/install/source#environment, in der
Go-Dokumentation} nachlesbar.

Nach dem Schlüsselwort @code{#:go} kann festgelegt werden, mit welchem
Go-Compiler-Paket das Paket erstellt werden soll.

The phase @code{check} provides a wrapper for @code{go test} which builds a
test binary (or multiple binaries), vets the code and then runs the test
binary.  Build, test and test binary flags can be provided as
@code{#:test-flags} parameter, default is @code{'()}.  See @code{go help
test} and @code{go help testflag} for more details.

The key @code{#:embed-files}, default is @code{'()}, provides a list of
future embedded files or regexps matching files.  They will be copied to
build directory after @code{unpack} phase.  See
@url{https://pkg.go.dev/embed} for more details.

@end defvar

@defvar glib-or-gtk-build-system
Diese Variable wird vom Modul @code{(guix build-system glib-or-gtk)}
exportiert. Sie ist für Pakete gedacht, die GLib oder GTK benutzen.

Dieses Erstellungssystem fügt die folgenden zwei Phasen zu denen von
@code{gnu-build-system} hinzu:

@table @code
@item glib-or-gtk-wrap
Die Phase @code{glib-or-gtk-wrap} stellt sicher, dass Programme in
@file{bin/} in der Lage sind, GLib-„Schemata“ und
@uref{https://developer.gnome.org/gtk3/stable/gtk-running.html, GTK-Module}
zu finden. Dazu wird für das Programm ein Wrapper-Skript erzeugt, dass das
eigentliche Programm mit den richtigen Werten für die Umgebungsvariablen
@env{XDG_DATA_DIRS} und @env{GTK_PATH} aufruft.

Es ist möglich, bestimmte Paketausgaben von diesem Wrapping-Prozess
auszunehmen, indem Sie eine Liste ihrer Namen im Parameter
@code{#:glib-or-gtk-wrap-excluded-outputs} angeben. Das ist nützlich, wenn
man von einer Ausgabe weiß, dass sie keine Binärdateien enthält, die GLib
oder GTK benutzen, und diese Ausgabe durch das Wrappen ohne Not eine weitere
Abhängigkeit von GLib und GTK bekäme.

@item glib-or-gtk-compile-schemas
Mit der Phase @code{glib-or-gtk-compile-schemas} wird sichergestellt, dass
alle @uref{https://developer.gnome.org/gio/stable/glib-compile-schemas.html,
GSettings-Schemata} für GLib kompiliert werden. Dazu wird das Programm
@command{glib-compile-schemas} ausgeführt. Es kommt aus dem Paket
@code{glib:bin}, was automatisch vom Erstellungssystem importiert
wird. Welches @code{glib}-Paket dieses @command{glib-compile-schemas}
bereitstellt, kann mit dem Parameter @code{#:glib} spezifiziert werden.
@end table

Beide Phasen finden nach der @code{install}-Phase statt.
@end defvar

@defvar guile-build-system
Dieses Erstellungssystem ist für Guile-Pakete gedacht, die nur aus
Scheme-Code bestehen und so schlicht sind, dass sie nicht einmal ein
Makefile und erst recht keinen @file{configure}-Skript enthalten. Hierzu
wird Scheme-Code mit @command{guild compile} kompiliert (siehe
@ref{Compilation,,, guile, Referenzhandbuch zu GNU Guile}) und die
@file{.scm}- und @file{.go}-Dateien an den richtigen Pfad installiert. Auch
Dokumentation wird installiert.

Das Erstellungssystem unterstützt Cross-Kompilieren durch die
Befehlszeilenoption @option{--target} für @samp{guild compile}.

Mit @code{guile-build-system} erstellte Pakete müssen ein Guile-Paket in
ihrem @code{native-inputs}-Feld aufführen.
@end defvar

@defvar julia-build-system
Diese Variable wird vom Modul @code{(guix build-system julia)}
exportiert. Sie entspricht einer Implementierung der durch
@uref{https://julialang.org/, Julia-Pakete} genutzten Erstellungsprozedur
und verhält sich im Prinzip so, wie wenn man @samp{julia -e 'using Pkg;
Pkg.add(paket)'} in einer Umgebung ausführt, in der die Umgebungsvariable
@env{JULIA_LOAD_PATH} die Pfade aller Julia-Pakete unter den Paketeingaben
enthält. Tests werden durch Aufruf von @code{/test/runtests.jl} ausgeführt.

Der Name des Julia-Pakets und seine UUID werden aus der Datei
@file{Project.toml} ausgelesen. Durch Angabe des Arguments
@code{#:julia-package-name} (die Groß-/Kleinschreibung muss stimmen) bzw.@:
durch @code{#:julia-package-uuid} können andere Werte verwendet werden.

Julia-Pakete verwalten ihre Abhängigkeiten zu Binärdateien für gewöhnlich
mittels @code{JLLWrappers.jl}, einem Julia-Paket, das ein Modul erzeugt
(benannt nach der Bibliothek, die zugänglich gemacht wird, gefolgt von
@code{_jll.jl}).

Um die @code{_jll.jl}-Pakete mit den Pfaden zu Binärdateien hinzuzufügen,
müssen Sie die Dateien in @file{src/wrappers/} patchen, um dem Aufruf an das
Makro @code{JLLWrappers.@@generate_wrapper_header} noch ein zweites Argument
mit dem Store-Pfad der Binärdatei mitzugeben.

Zum Beispiel fügen wir für das MbedTLS-Julia-Paket eine Erstellungsphase
hinzu (siehe @ref{Erstellungsphasen}), in der der absolute Dateiname des
zugänglich gemachten MbedTLS-Pakets hinzugefügt wird:

@lisp
(add-after 'unpack 'override-binary-path
  (lambda* (#:key inputs #:allow-other-keys)
    (for-each (lambda (wrapper)
                (substitute* wrapper
                  (("generate_wrapper_header.*")
                   (string-append
                    "generate_wrapper_header(\"MbedTLS\", \""
                    (assoc-ref inputs "mbedtls") "\")\n"))))
              ;; Es gibt eine Julia-Datei für jede Plattform,
              ;; wir ändern sie alle.
              (find-files "src/wrappers/" "\\.jl$"))))
@end lisp

Für manche ältere Pakete, die noch keine @file{Project.toml} benutzen, muss
auch diese Datei erstellt werden. Das geht intern vonstatten, sofern die
Argumente @code{#:julia-package-name} und @code{#:julia-package-uuid}
übergeben werden.
@end defvar

@defvar maven-build-system
Diese Variable wird vom Modul @code{(guix build-system maven)}
exportiert. Darin wird eine Erstellungsprozedur für
@uref{https://maven.apache.org, Maven-Pakete} implementiert. Maven ist ein
Werkzeug zur Verwaltung der Abhängigkeiten und des „Lebenszyklus“ eines
Java-Projekts. Um Maven zu benutzen, werden Abhängigkeiten und Plugins in
einer Datei @file{pom.xml} angegeben, die Maven ausliest. Wenn Maven
Abhängigkeiten oder Plugins fehlen, lädt es sie herunter und erstellt damit
das Paket.

Durch Guix’ Maven-Erstellungssystem wird gewährleistet, dass Maven im
Offline-Modus läuft und somit nicht versucht, Abhängigkeiten
herunterzuladen. Maven wird in einen Fehler laufen, wenn eine Abhängigkeit
fehlt. Bevor Maven ausgeführt wird, wird der Inhalt der @file{pom.xml} (auch
in Unterprojekten) so verändert, dass darin die diejenige Version von
Abhängigkeiten und Plugins aufgeführt wird, die in Guix’ Erstellungsumgebung
vorliegt. Abhängigkeiten und Plugins müssen in das vorgetäuschte
Maven-Repository unter @file{lib/m2} installiert werden; bevor Maven
ausgeführt wird, werden symbolische Verknüpfungen in ein echtes Repository
hergestellt. Maven wird angewiesen, dieses Repository für die Erstellung zu
verwenden und installiert erstellte Artefakte dorthin. Geänderte Dateien
werden ins Verzeichnis @file{lib/m2} der Paketausgabe kopiert.

Sie können eine @file{pom.xml}-Datei über das Argument @code{#:pom-file}
festlegen oder die vom Erstellungssystem vorgegebene @file{pom.xml}-Datei im
Quellverzeichnis verwenden lassen.

Sollten Sie die Version einer Abhängigkeit manuell angeben müssen, können
Sie dafür das Argument @code{#:local-packages} benutzen. Es nimmt eine
assoziative Liste entgegen, deren Schlüssel jeweils die @code{groupId} des
Pakets und deren Wert eine assoziative Liste ist, deren Schlüssel wiederum
die @code{artifactId} des Pakets und deren Wert die einzusetzende Version in
@file{pom.xml} ist.

Manche Pakete haben Abhängigkeiten oder Plugins, die weder zur Laufzeit noch
zur Erstellungszeit in Guix sinnvoll sind. Sie können sie entfernen, indem
Sie das @code{#:exclude}-Argument verwenden, um die @file{pom.xml}-Datei zu
bearbeiten. Sein Wert ist eine assoziative Liste, deren Schlüssel die
@code{groupId} des Plugins oder der Abhängigkeit ist, die Sie entfernen
möchten, und deren Wert eine Liste von zu entfernenden
@code{artifactId}-Vorkommen angibt.

Sie können statt der vorgegebenen @code{jdk}- und @code{maven}-Pakete andere
Pakete mit dem entsprechenden Argument, @code{#:jdk} bzw.@: @code{#:maven},
verwenden.

Mit dem Argument @code{#:maven-plugins} geben Sie eine Liste von
Maven-Plugins zur Nutzung während der Erstellung an, im gleichen Format wie
das @code{inputs}-Feld der Paketdeklaration. Der Vorgabewert ist
@code{(default-maven-plugins)}; diese Variable wird exportiert, falls Sie
sie benutzen möchten.
@end defvar

@defvar minetest-mod-build-system
Diese Variable wird vom Modul @code{(guix build-system minetest)}
exportiert. Mit ihr ist ein Erstellungssystem für Mods für
@uref{https://www.minetest.net, Minetest} implementiert, was bedeutet,
Lua-Code, Bilder und andere Ressourcen an den Ort zu kopieren, wo Minetest
nach Mods sucht. Das Erstellungssystem verkleinert auch PNG-Bilder und
prüft, dass Minetest die Mod fehlerfrei laden kann.
@end defvar

@defvar minify-build-system
Diese Variable wird vom Modul @code{(guix build-system minify)}
exportiert. Sie implementiert eine Prozedur zur Minifikation einfacher
JavaScript-Pakete.

Es fügt @code{uglify-js} zur Menge der Eingaben hinzu und komprimiert damit
alle JavaScript-Dateien im @file{src}-Verzeichnis. Ein anderes Programm zur
Minifikation kann verwendet werden, indem es mit dem Parameter
@code{#:uglify-js} angegeben wird; es wird erwartet, dass das angegebene
Paket den minifizierten Code auf der Standardausgabe ausgibt.

Wenn die Eingabe-JavaScript-Dateien nicht alle im @file{src}-Verzeichnis
liegen, kann mit dem Parameter @code{#:javascript-files} eine Liste der
Dateinamen übergeben werden, auf die das Minifikationsprogramm aufgerufen
wird.
@end defvar

@defvar mix-build-system
This is a variable exported by @code{guix build-system mix}.  It implements
the standard build procedure used by Elixr programs with
@url{https://hexdocs.pm/mix/Mix.html,Mix}, which consists of running
@command{mix compile}, thereby creating bytecode.

The API is similar to the @var{gnu-build-system}, with some specifics for
Elixir:
@itemize
@item
@code{#:tests?} is a boolean, @code{#true} by default, determining whether
tests for the current build have to be run or not.
@item
@code{#:test-flags} is a list of arguments append to the @command{mix test}
invocation.  It defaults to @code{'()}.
@item
@code{#:mix-exs}, changes the full path to the @code{mix.exs} file.  It
defaults to @code{"mix.exs"}.  Please refer to
@url{https://hexdocs.pm/mix/Mix.html#module-environment-variables,upstream}
documentation for more details.
@item
@code{#:mix-path}, appends extra code paths.  It defaults to @code{#f}.
Please refer to
@url{https://hexdocs.pm/mix/Mix.html#module-environment-variables,upstream}
documentation for more details.
@end itemize
@end defvar

@defvar mozilla-build-system
Diese Variable wird vom Modul @code{(guix build-system mozilla)}
exportiert. Durch Sie werden die configure-Befehlszeilenoptionen
@code{--target} und @code{--host} so verwendet, wie es bei von Mozilla
entwickelter Software erwartet wird@tie{}– aus historischen Gründen wird bei
Mozilla-Software für @code{--host} das System verlangt, von dem aus
cross-kompiliert wird, und für @code{--target} das System, für das
cross-kompiliert wird, entgegen der bei Autotools üblichen Konvention.
@end defvar

@defvar ocaml-build-system
Diese Variable wird vom Modul @code{(guix build-system ocaml)}
exportiert. Mit ihr ist ein Erstellungssystem für @uref{https://ocaml.org,
OCaml-Pakete} implementiert, was bedeutet, dass es die richtigen
auszuführenden Befehle für das jeweilige Paket auswählt. OCaml-Pakete können
sehr unterschiedliche Befehle erwarten. Dieses Erstellungssystem probiert
manche davon durch.

Wenn im Paket eine Datei @file{setup.ml} auf oberster Ebene vorhanden ist,
wird @code{ocaml setup.ml -configure}, @code{ocaml setup.ml -build} und
@code{ocaml setup.ml -install} ausgeführt. Das Erstellungssystem wird
annehmen, dass die Datei durch @uref{http://oasis.forge.ocamlcore.org/,
OASIS} erzeugt wurde, und wird das Präfix setzen und Tests aktivieren, wenn
diese nicht abgeschaltet wurden. Sie können Befehlszeilenoptionen zum
Konfigurieren und Erstellen mit den Parametern @code{#:configure-flags} und
@code{#:build-flags} übergeben. Der Schlüssel @code{#:test-flags} kann
übergeben werden, um die Befehlszeilenoptionen zu ändern, mit denen die
Tests aktiviert werden. Mit dem Parameter @code{#:use-make?} kann dieses
Erstellungssystem für die build- und install-Phasen abgeschaltet werden.

Verfügt das Paket über eine @file{configure}-Datei, wird angenommen, dass
diese von Hand geschrieben wurde mit einem anderen Format für Argumente als
bei einem Skript des @code{gnu-build-system}. Sie können weitere
Befehlszeilenoptionen mit dem Schlüssel @code{#:configure-flags} hinzufügen.

Falls dem Paket ein @file{Makefile} beiliegt (oder @code{#:use-make?} auf
@code{#t} gesetzt wurde), wird dieses benutzt und weitere
Befehlszeilenoptionen können mit dem Schlüssel @code{#:make-flags} zu den
build- und install-Phasen hinzugefügt werden.

Letztlich gibt es in manchen Pakete keine solchen Dateien, sie halten sich
aber an bestimmte Konventionen, wo ihr eigenes Erstellungssystem zu finden
ist. In diesem Fall führt Guix’ OCaml-Erstellungssystem @code{ocaml
pkg/pkg.ml} oder @code{ocaml pkg/build.ml} aus und kümmert sich darum, dass
der Pfad zu dem benötigten findlib-Modul passt. Weitere
Befehlszeilenoptionen können über den Schlüssel @code{#:build-flags}
übergeben werden. Um die Installation kümmert sich
@command{opam-installer}. In diesem Fall muss das @code{opam}-Paket im
@code{native-inputs}-Feld der Paketdefinition stehen.

Beachten Sie, dass die meisten OCaml-Pakete davon ausgehen, dass sie in
dasselbe Verzeichnis wie OCaml selbst installiert werden, was wir in Guix
aber nicht so haben wollen. Solche Pakete installieren ihre
@file{.so}-Dateien in das Verzeichnis ihres Moduls, was für die meisten
anderen Einrichtungen funktioniert, weil es im OCaml-Compilerverzeichnis
liegt. Jedoch können so in Guix die Bibliotheken nicht gefunden werden,
deswegen benutzen wir @env{CAML_LD_LIBRARY_PATH}. Diese Umgebungsvariable
zeigt auf @file{lib/ocaml/site-lib/stubslibs} und dorthin sollten
@file{.so}-Bibliotheken installiert werden.
@end defvar

@defvar python-build-system
Diese Variable wird vom Modul @code{(guix build-system python)}
exportiert. Sie implementiert mehr oder weniger die konventionelle
Erstellungsprozedur, wie sie für Python-Pakete üblich ist, d.h.@: erst wird
@code{python setup.py build} ausgeführt und dann @code{python setup.py
install --prefix=/gnu/store/…}.

Für Pakete, die eigenständige Python-Programme nach @code{bin/}
installieren, sorgt dieses Erstellungssystem dafür, dass die Programme in
ein Wrapper-Skript verpackt werden, welches die eigentlichen Programme mit
einer Umgebungsvariablen @env{GUIX_PYTHONPATH} aufruft, die alle
Python-Bibliotheken auflistet, von denen die Programme abhängen.

Welches Python-Paket benutzt wird, um die Erstellung durchzuführen, kann mit
dem Parameter @code{#:python} bestimmt werden. Das ist nützlich, wenn wir
erzwingen wollen, dass ein Paket mit einer bestimmten Version des
Python-Interpretierers arbeitet. Das kann nötig sein, wenn das Programm nur
mit einer einzigen Interpretiererversion kompatibel ist.

Standardmäßig ruft Guix @code{setup.py} auf, was zu @code{setuptools}
gehört, ähnlich wie es auch @command{pip} tut. Manche Pakete sind mit
setuptools (und pip) inkompatibel, deswegen können Sie diese Einstellung
abschalten, indem Sie den Parameter @code{#:use-setuptools?} auf @code{#f}
setzen.

Wenn eine der Ausgaben @code{"python"} heißt, wird das Paket dort hinein
installiert und @emph{nicht} in die vorgegebene Ausgabe @code{"out"}. Das
ist für Pakete gedacht, bei denen ein Python-Paket nur einen Teil der
Software ausmacht, man also die Phasen des @code{python-build-system} mit
einem anderen Erstellungssystem zusammen verwenden wollen könnte. Oft kann
man das bei Anbindungen für Python gebrauchen.
@end defvar

@defvar pyproject-build-system
Diese Variable wird vom Modul @code{guix build-system pyproject}
exportiert. Es basiert auf @var{python-build-system} und fügt Unterstützung
für @file{pyproject.toml} und @url{https://peps.python.org/pep-0517/, PEP
517} hinzu. Auch kommt Unterstützung für verschiedene Build Backends und
Testrahmen hinzu.

Die Programmierschnittstelle unterscheidet sich leicht von
@var{python-build-system}:
@itemize
@item
@code{#:use-setuptools?} und @code{#:test-target} wurden entfernt.
@item
@code{#:configure-flags} is changed. Instead of a list this option must be a
JSON object, whose interpretation depends on the build backend. For instance
the example from @url{https://peps.python.org/pep-0517/#config-settings,PEP
517} should be written as @code{'(@@ ("CC" "gcc") ("--global-option"
("--some-global-option")) ("--build-option" ("--build-option1"
"--build-option2")))}
@item
@code{#:backend-path} is added.  It defaults to @code{#false}, but when set
to a list it will be appended to Python’s search path and overrides the
definition in @file{pyproject.toml}.
@item
@code{#:build-backend} ist neu. Die Vorgabe dafür ist @code{#false}, so dass
das richtige Backend wenn möglich aufgrund von @file{pyproject.toml}
bestimmt wird.
@item
@code{#:test-backend} ist neu. Die Vorgabe dafür ist @code{#false}, so dass
das richtige Test-Backend wenn möglich aufgrund der Paketeingaben gewählt
wird.
@item
@code{#:test-flags} ist neu. Vorgegeben ist @code{'()}. Die Optionen darin
werden als Befehlszeilenargumente an den Test-Befehl übermittelt. Beachten
Sie, dass ausführliche Ausgaben immer aktiviert werden, falls dies für das
Backend implementiert ist.
@end itemize

Wir stufen es als „experimentell“ ein, weil die Details der Implementierung
noch @emph{nicht} in Stein gemeißelt sind. Dennoch würden wir es begrüßen,
wenn Sie es für neue Python-Projekte verwenden (auch für solche, die
@file{setup.py} haben). Die Programmierschnittstelle wird sich noch ändern,
aber wir werden uns um im Guix-Kanal aufkommende Probleme kümmern.

Schlussendlich wird dieses Erstellungssystem für veraltet erklärt werden und
in @var{python-build-system} aufgehen, wahrscheinlich irgendwann im Jahr
2024.
@end defvar

@defvar perl-build-system
Diese Variable wird vom Modul @code{(guix build-system perl)}
exportiert. Mit ihr wird die Standard-Erstellungsprozedur für Perl-Pakete
implementiert, welche entweder darin besteht, @code{perl Build.PL
--prefix=/gnu/store/…} gefolgt von @code{Build} und @code{Build install}
auszuführen, oder @code{perl Makefile.PL PREFIX=/gnu/store/…} gefolgt von
@code{make} und @code{make install} auszuführen, je nachdem, ob eine Datei
@code{Build.PL} oder eine Datei @code{Makefile.PL} in der Paketdistribution
vorliegt. Den Vorrang hat erstere, wenn sowohl @code{Build.PL} als auch
@code{Makefile.PL} in der Paketdistribution existieren. Der Vorrang kann
umgekehrt werden, indem @code{#t} für den Parameter @code{#:make-maker?}
angegeben wird.

Der erste Aufruf von @code{perl Makefile.PL} oder @code{perl Build.PL}
übergibt die im Parameter @code{#:make-maker-flags}
bzw. @code{#:module-build-flags} angegebenen Befehlszeilenoptionen, je
nachdem, was verwendet wird.

Welches Perl-Paket dafür benutzt wird, kann mit @code{#:perl} angegeben
werden.
@end defvar

@defvar renpy-build-system
Diese Variable wird vom Modul @code{(guix build-system renpy)}
exportiert. Sie implementiert mehr oder weniger die herkömmliche
Erstellungsprozedur, die für Ren’py-Spiele benutzt wird. Das bedeutet, das
@code{#:game} wird einmal geladen, wodurch Bytecode dafür erzeugt wird.

Des Weiteren wird ein Wrapper-Skript in @code{bin/} und eine *.desktop-Datei
in @code{share/applications} erzeugt. Mit beiden davon kann man das Spiel
starten.

Welches Ren’py-Paket benutzt wird, gibt man mit @code{#:renpy} an. Spiele
können auch in andere Ausgaben als in „out“ installiert werden, indem man
@code{#:output} benutzt.
@end defvar

@defvar qt-build-system
Diese Variable wird vom Modul @code{(guix build-system qt)} exportiert. Sie
ist für Anwendungen gedacht, die Qt oder KDE benutzen.

Dieses Erstellungssystem fügt die folgenden zwei Phasen zu denen von
@code{cmake-build-system} hinzu:

@table @code
@item check-setup
Die Phase @code{check-setup} bereitet die Umgebung für Überprüfungen vor,
wie sie von Qt-Test-Programmen üblicherweise benutzt werden. Zurzeit werden
nur manche Umgebungsvariable gesetzt: @code{QT_QPA_PLATFORM=offscreen},
@code{DBUS_FATAL_WARNINGS=0} und @code{CTEST_OUTPUT_ON_FAILURE=1}.

Diese Phase wird vor der @code{check}-Phase hinzugefügt. Es handelt sich um
eine eigene Phase, die nach Bedarf angepasst werden kann.

@item qt-wrap
In der Phase @code{qt-wrap} wird nach Qt5-Plugin-Pfaden, QML-Pfaden und
manchen XDG-Daten in den Ein- und Ausgaben gesucht. Wenn solch ein Pfad
gefunden wird, werden für alle Programme in den Verzeichnissen @file{bin/},
@file{sbin/}, @file{libexec/} und @file{lib/libexec/} in der Ausgabe
Wrapper-Skripte erzeugt, die die nötigen Umgebungsvariablen definieren.

Es ist möglich, bestimmte Paketausgaben von diesem Wrapping-Prozess
auszunehmen, indem Sie eine Liste ihrer Namen im Parameter
@code{#:qt-wrap-excluded-outputs} angeben. Das ist nützlich, wenn man von
einer Ausgabe weiß, dass sie keine Qt-Binärdateien enthält, und diese
Ausgabe durch das Wrappen ohne Not eine weitere Abhängigkeit von Qt, KDE
oder Ähnlichem bekäme.

Diese Phase wird nach der @code{install}-Phase hinzugefügt.
@end table
@end defvar

@defvar r-build-system
Diese Variable wird vom Modul @code{(guix build-system r)} exportiert. Sie
entspricht einer Implementierung der durch @uref{https://r-project.org,
R-Pakete} genutzten Erstellungsprozedur, die wenig mehr tut, als @samp{R CMD
INSTALL --library=/gnu/store/…} in einer Umgebung auszuführen, in der die
Umgebungsvariable @env{R_LIBS_SITE} die Pfade aller R-Pakete unter den
Paketeingaben enthält. Tests werden nach der Installation mit der R-Funktion
@code{tools::testInstalledPackage} ausgeführt.
@end defvar

@defvar rakudo-build-system
Diese Variable wird vom Modul @code{(guix build-system rakudo)}
exportiert. Sie implementiert die Erstellungsprozedur, die von
@uref{https://rakudo.org/, Rakudo} für @uref{https://perl6.org/,
Perl6-Pakete} benutzt wird. Pakete werden ins Verzeichnis
@code{/gnu/store/…/NAME-VERSION/share/perl6} abgelegt und Binärdateien,
Bibliotheksdateien und Ressourcen werden installiert, zudem werden die
Dateien im Verzeichnis @code{bin/} in Wrapper-Skripte verpackt. Tests können
übersprungen werden, indem man @code{#f} im Parameter @code{tests?}
übergibt.

Welches rakudo-Paket benutzt werden soll, kann mit dem Parameter
@code{rakudo} angegeben werden. Das perl6-tap-harness-Paket, das für die
Tests benutzt wird, kann mit @code{#:prove6} ausgewählt werden; es kann auch
entfernt werden, indem man @code{#f} für den Parameter @code{with-prove6?}
übergibt. Welches perl6-zef-Paket für Tests und Installation verwendet wird,
kann mit dem Parameter @code{#:zef} angegeben werden; es kann auch entfernt
werden, indem man @code{#f} für den Parameter @code{with-zef?} übergibt.
@end defvar

@defvar rebar-build-system
Diese Variable wird von @code{(guix build-system rebar)} exportiert. Sie
implementiert eine Erstellungsprozedur, die auf
@uref{https://rebar3.org,rebar3} aufbaut, einem Erstellungssystem für
Programme, die in der Sprache Erlang geschrieben sind.

Das Erstellungssystem fügt sowohl @code{rebar3} als auch @code{erlang} zu
den Eingaben hinzu. Sollen stattdessen andere Pakete benutzt werden, können
diese jeweils mit den Parametern @code{#:rebar} und @code{#:erlang}
spezifiziert werden.

Dieses Erstellungssystem basiert auf @code{gnu-build-system}, bei dem aber
die folgenden Phasen geändert wurden:

@table @code

@item unpack
Diese Phase entpackt die Quelle wie es auch das @code{gnu-build-system} tut,
schaut nach einer Datei @code{contents.tar.gz} auf der obersten Ebene des
Quellbaumes und wenn diese existiert, wird auch sie entpackt. Das
erleichtert den Umgang mit Paketen, die auf @uref{https://hex.pm/}, der
Paketsammlung für Erlang und Elixir, angeboten werden.

@item bootstrap
@item configure
Die Phasen @code{bootstrap} und @code{configure} fehlen, weil Erlang-Pakete
normalerweise nicht konfiguriert werden müssen.

@item build
In dieser Phase wird @code{rebar3 compile} mit den Befehlszeilenoptionen aus
@code{#:rebar-flags} ausgeführt.

@item check
Sofern @emph{nicht} @code{#:tests? #f} übergeben wird, wird in dieser Phase
@code{rebar3 eunit} ausgeführt oder das Gleiche auf ein anderes bei
@code{#:test-target} angegebenes Ziel. Dabei werden die
Befehlszeilenoptionen aus @code{#:rebar-flags} übergeben.

@item install
Hier werden die im standardmäßigen Profil @i{default} erzeugten Dateien
installiert oder die aus einem mit @code{#:install-profile} angegebenen
anderen Profil.

@end table
@end defvar

@defvar texlive-build-system
Diese Variable wird vom Modul @code{(guix build-system texlive)}
exportiert. Mit ihr werden TeX-Pakete in Stapelverarbeitung („batch mode“)
mit der angegebenen Engine erstellt. Das Erstellungssystem setzt die
Variable @env{TEXINPUTS} so, dass alle TeX-Quelldateien unter den Eingaben
gefunden werden können.

Standardmäßig wird versucht, @code{luatex} auf allen Dateien mit der
Dateiendung @file{.ins} auszuführen, und wenn keine gefunden werden, wird es
auf allen @file{.dtx}-Dateien ausgeführt. Eine andere Engine oder ein
anderes Format kann mit dem Argument @code{#:tex-engine} bzw.@:
@code{#:tex-format} angegeben werden. Verschiedene Erstellungsziele können
mit dem Argument @code{#:build-targets} festgelegt werden, das eine Liste
von Dateinamen erwartet.

Es werden außerdem Font-Metriken (d.h.@: @file{.tfm}-Dateien) aus
Metafont-Dateien erzeugt, wenn möglich. Auch können formatierte Dateien für
TeX (d.h.@: @file{.fmt}-Dateien) erzeugt werden, die im Argument
@code{#:create-formats} aufzulisten sind, und es wird je eine symbolische
Verknüpfung im @file{bin/}-Verzeichnis zu in @file{texmf-dist/scripts/}
befindlichen Skripts angelegt, wenn der Name der Datei im Argument
@code{#:link-scripts} aufgelistet ist.

Das Erstellungssystem fügt @code{texlive-bin} aus dem Modul @code{(gnu
packages tex)} zu den nativen Eingaben hinzu. Das zu benutzende Paket kann
mit dem Argument @code{#:texlive-bin} geändert werden.

Das Paket @code{texlive-latex-bin} aus demselben Modul enthält den Großteil
der Werkzeuge zum Erstellen von TeX-Live-Paketen; weil es praktisch ist,
wird es auch in der Vorgabeeinstellung zu den nativen Eingaben
hinzugefügt. Das kann jedoch störend sein, wenn eine Abhängigkeit von
@code{texlive-latex-bin} selbst erstellt wird. In diesem speziellen Fall
sollten Sie das Argument @code{#:texlive-latex-bin?} auf @code{#f} setzen.
@end defvar

@defvar ruby-build-system
Diese Variable wird vom Modul @code{(guix build-system ruby)}
exportiert. Sie steht für eine Implementierung der
RubyGems-Erstellungsprozedur, die für Ruby-Pakete benutzt wird, wobei
@code{gem build} gefolgt von @code{gem install} ausgeführt wird.

Das @code{source}-Feld eines Pakets, das dieses Erstellungssystem benutzt,
verweist typischerweise auf ein Gem-Archiv, weil Ruby-Entwickler dieses
Format benutzen, wenn sie ihre Software veröffentlichen. Das
Erstellungssystem entpackt das Gem-Archiv, spielt eventuell Patches für den
Quellcode ein, führt die Tests aus, verpackt alles wieder in ein Gem-Archiv
und installiert dieses. Neben Gem-Archiven darf das Feld auch auf
Verzeichnisse und Tarballs verweisen, damit es auch möglich ist,
unveröffentlichte Gems aus einem Git-Repository oder traditionelle
Quellcode-Veröffentlichungen zu benutzen.

Welches Ruby-Paket benutzt werden soll, kann mit dem Parameter @code{#:ruby}
festgelegt werden. Eine Liste zusätzlicher Befehlszeilenoptionen für den
Aufruf des @command{gem}-Befehls kann mit dem Parameter @code{#:gem-flags}
angegeben werden.
@end defvar

@defvar waf-build-system
Diese Variable wird durch das Modul @code{(guix build-system waf)}
exportiert. Damit ist eine Erstellungsprozedur rund um das @code{waf}-Skript
implementiert. Die üblichen Phasen@tie{}– @code{configure}, @code{build} und
@code{install}@tie{}– sind implementiert, indem deren Namen als Argumente an
das @code{waf}-Skript übergeben werden.

Das @code{waf}-Skript wird vom Python-Interpetierer ausgeführt. Mit welchem
Python-Paket das Skript ausgeführt werden soll, kann mit dem Parameter
@code{#:python} angegeben werden.
@end defvar

@defvar zig-build-system
Diese Variable wird von @code{(guix build-system zig)} exportiert. Sie
implementiert die Erstellungsprozeduren für Pakete, die das für
@url{https://ziglang.org/, Zig} vorgesehene Erstellungssystem (den Befehl
@command{zig build}) benutzen.

Dieses Erstellungssystem fügt @code{zig} neben den Paketen des
@code{gnu-build-system} zu den Paketeingaben hinzu.

Vorgegeben ist, dass dieses Erstellungssystem den Paketquellcode in die
Ausgabe installiert. Dieses Verhalten kann unterbunden werden, indem Sie den
Parameter @code{#:install-source?} auf @code{#f} setzen.

Bei Paketen, die nichts installieren und keinen Testkatalog mitbringen
(vermutlich Bibliothekspakete, die von anderen Zig-Paketen benutzt werden
sollen), können Sie den Parameter @code{#:skip-build?} auf @code{#t} setzen,
um die Phasen @code{build} und @code{check} zu überspringen.

In der Phase @code{configure} werden Umgebungsvariable für @command{zig
build} eingestellt. Eigene Phasen müssen Sie danach laufen lassen, wenn Sie
darin @command{zig} aufrufen möchten.

Für den Parameter @code{#:zig-build-flags} geben Sie eine Liste von
Befehlszeilenoptionen an, die zur Erstellung in der @code{build}-Phase an
den Befehl @command{zig build} übergeben werden. Für den Parameter
@code{#:zig-test-flags} geben Sie eine Liste von Befehlszeilenoptionen an,
die während der @code{check}-Phase an @command{zig build test} übergeben
werden. Sie können einen anderen Compiler als vorgegeben verwenden, indem
Sie den Parameter @code{#:zig} angeben.

Mit dem optionalen Parameter @code{#:zig-release-type} deklarieren Sie, für
welche Art von Release optimiert wird. Diese Werte sind möglich:
@code{"safe"} (sicher), @code{"fast"} (schnell) oder @code{"small"}
(klein). Vorgegeben ist der Wert @code{#f}, durch den kein Release als
Befehlszeilenoption an den @code{zig}-Befehl übergeben wird. Dadurch wird
eine @code{"debug"}-Version zur Fehlersuche erstellt.
@end defvar

@defvar scons-build-system
Diese Variable wird vom Modul @code{(guix build-system scons)}
exportiert. Sie steht für eine Implementierung der Erstellungsprozedur, die
das SCons-Softwarekonstruktionswerkzeug („software construction tool“)
benutzt. Das Erstellungssystem führt @code{scons} aus, um das Paket zu
erstellen, führt mit @code{scons test} Tests aus und benutzt @code{scons
install}, um das Paket zu installieren.

Zusätzliche Optionen, die an @code{scons} übergeben werden sollen, können
mit dem Parameter @code{#:scons-flags} angegeben werden. Die
voreingestellten Erstellungs- und Installationsziele können jeweils durch
@code{#:build-targets} und @code{#:install-targets} ersetzt werden. Die
Python-Version, die benutzt werden soll, um SCons auszuführen, kann
festgelegt werden, indem das passende SCons-Paket mit dem Parameter
@code{#:scons} ausgewählt wird.
@end defvar

@defvar hare-build-system
This variable is exported by @code{(guix build-system hare)}.  It implements
the Makefile build process typically used by Hare packages, removing the
@code{configure} phase used by @code{gnu-build-system} and modifying
existing phases to set the Hare architecture tag, module path, and package
install destinations appropriately.

This relies on the package's Makefile supporting, at minimum, the variables
@code{HAREFLAGS} and @code{THIRDPARTYDIR}.  Packages may set
@code{make-flags} to override or supplement these variables.

By default, Hare modules are installed to the @code{lib} output if it
exists, and all other files to the @code{bin} output. If an output does not
exist, the default @code{out} output is used instead. This behavior may be
overriden through the @code{#:binary-output} and @code{#:module-output}
keyword arguments.

@code{(guix build-system hare)} also provides utility definitions for
creating Hare packages.  The variable @code{%hare-supported-systems} is the
list of build targets currently supported by @code{hare}, for use in
@code{supported-systems} (@pxref{„package“-Referenz}).  The procedure
@code{target->hare-arch} may be used to get the Hare architecture tag for a
given (supported) Guix target or system.
@end defvar

@defvar haskell-build-system
Diese Variable wird vom Modul @code{(guix build-system haskell)}
exportiert. Sie bietet Zugang zur Cabal-Erstellungsprozedur, die von
Haskell-Paketen benutzt wird, was bedeutet, @code{runhaskell Setup.hs
configure --prefix=/gnu/store/…} und @code{runhaskell Setup.hs build}
auszuführen. Statt das Paket mit dem Befehl @code{runhaskell Setup.hs
install} zu installieren, benutzt das Erstellungssystem @code{runhaskell
Setup.hs copy} gefolgt von @code{runhaskell Setup.hs register}, um keine
Bibliotheken im Store-Verzeichnis des Compilers zu speichern, auf dem keine
Schreibberechtigung besteht. Zusätzlich generiert das Erstellungssystem
Dokumentation durch Ausführen von @code{runhaskell Setup.hs haddock}, außer
@code{#:haddock? #f} wurde übergeben. Optional können an Haddock Parameter
mit Hilfe des Parameters @code{#:haddock-flags} übergeben werden. Wird die
Datei @code{Setup.hs} nicht gefunden, sucht das Erstellungssystem
stattdessen nach @code{Setup.lhs}.

Welcher Haskell-Compiler benutzt werden soll, kann über den
@code{#:haskell}-Parameter angegeben werden. Als Vorgabewert verwendet er
@code{ghc}.
@end defvar

@defvar dub-build-system
Diese Variable wird vom Modul @code{(guix build-system dub)} exportiert. Sie
verweist auf eine Implementierung des Dub-Erstellungssystems, das von
D-Paketen benutzt wird. Dabei werden @code{dub build} und @code{dub run}
ausgeführt. Die Installation wird durch manuelles Kopieren der Dateien
durchgeführt.

Welcher D-Compiler benutzt wird, kann mit dem Parameter @code{#:ldc}
festgelegt werden, was als Vorgabewert @code{ldc} benutzt.
@end defvar

@anchor{emacs-build-system}
@defvar emacs-build-system
Diese Variable wird vom Modul @code{(guix build-system emacs)}
exportiert. Darin wird eine Installationsprozedur ähnlich der des
Paketsystems von Emacs selbst implementiert (siehe @ref{Packages,,, emacs,
The GNU Emacs Manual}).

Zunächst wird eine Datei @code{@code{Paket}-autoloads.el} erzeugt, dann
werden alle Emacs-Lisp-Dateien zu Bytecode kompiliert. Anders als beim
Emacs-Paketsystem werden die Info-Dokumentationsdateien in das
Standardverzeichnis für Dokumentation verschoben und die Datei @file{dir}
gelöscht. Die Dateien des Elisp-Pakets werden direkt in
@file{share/emacs/site-lisp} installiert.
@end defvar

@defvar font-build-system
Diese Variable wird vom Modul @code{(guix build-system font)}
exportiert. Mit ihr steht eine Installationsprozedur für Schriftarten-Pakete
zur Verfügung für vom Anbieter vorkompilierte TrueType-, OpenType- und
andere Schriftartendateien, die nur an die richtige Stelle kopiert werden
müssen. Dieses Erstellungssystem kopiert die Schriftartendateien an den
Konventionen folgende Orte im Ausgabeverzeichnis.
@end defvar

@defvar meson-build-system
Diese Variable wird vom Modul @code{(guix build-system meson)}
exportiert. Sie enthält die Erstellungsprozedur für Pakete, die
@url{https://mesonbuild.com, Meson} als ihr Erstellungssystem benutzen.

Mit ihr werden sowohl Meson als auch @uref{https://ninja-build.org/, Ninja}
zur Menge der Eingaben hinzugefügt; die Pakete dafür können mit den
Parametern @code{#:meson} und @code{#:ninja} geändert werden, wenn nötig.

Dieses Erstellungssystem ist eine Erweiterung für das
@code{gnu-build-system}, aber mit Änderungen an den folgenden Phasen, die
Meson-spezifisch sind:

@table @code

@item configure
Diese Phase führt den @code{meson}-Befehl mit den in
@code{#:configure-flags} angegebenen Befehlszeilenoptionen aus. Die
Befehlszeilenoption @option{--build-type} wird immer auf
@code{debugoptimized} gesetzt, solange nichts anderes mit dem Parameter
@code{#:build-type} angegeben wurde.

@item build
Diese Phase ruft @code{ninja} auf, um das Paket standardmäßig parallel zu
erstellen. Die Vorgabeeinstellung, dass parallel erstellt wird, kann
verändert werden durch Setzen von @code{#:parallel-build?}.

@item check
Die Phase führt @samp{meson test} mit einer unveränderlichen Grundmenge von
Optionen aus. Diese Grundmenge können Sie mit dem Argument
@code{#:test-options} erweitern, um zum Beispiel einen bestimmten
Testkatalog auszuwählen oder zu überspringen.

@item install
Diese Phase führt @code{ninja install} aus und kann nicht verändert werden.
@end table

Dazu fügt das Erstellungssystem noch folgende neue Phasen:

@table @code

@item fix-runpath
In dieser Phase wird sichergestellt, dass alle Binärdateien die von ihnen
benötigten Bibliotheken finden können. Die benötigten Bibliotheken werden in
den Unterverzeichnissen des Pakets, das erstellt wird, gesucht, und zum
@code{RUNPATH} hinzugefügt, wann immer es nötig ist. Auch werden diejenigen
Referenzen zu Bibliotheken aus der Erstellungsphase wieder entfernt, die bei
@code{meson} hinzugefügt wurden, aber eigentlich zur Laufzeit nicht
gebraucht werden, wie Abhängigkeiten nur für Tests.

@item glib-or-gtk-wrap
Diese Phase ist dieselbe, die auch im @code{glib-or-gtk-build-system} zur
Verfügung gestellt wird, und mit Vorgabeeinstellungen wird sie nicht
durchlaufen. Wenn sie gebraucht wird, kann sie mit dem Parameter
@code{#:glib-or-gtk?} aktiviert werden.

@item glib-or-gtk-compile-schemas
Diese Phase ist dieselbe, die auch im @code{glib-or-gtk-build-system} zur
Verfügung gestellt wird, und mit Vorgabeeinstellungen wird sie nicht
durchlaufen. Wenn sie gebraucht wird, kann sie mit dem Parameter
@code{#:glib-or-gtk?} aktiviert werden.
@end table
@end defvar

@defvar linux-module-build-system
Mit @code{linux-module-build-system} können Linux-Kernelmodule erstellt
werden.

@cindex Erstellungsphasen
Dieses Erstellungssystem ist eine Erweiterung des @code{gnu-build-system},
bei der aber die folgenden Phasen geändert wurden:

@table @code

@item configure
Diese Phase konfiguriert die Umgebung so, dass das externe Kernel-Modul
durch das Makefile des Linux-Kernels erstellt werden kann.

@item build
Diese Phase benutzt das Makefile des Linux-Kernels, um das externe
Kernel-Modul zu erstellen.

@item install
Diese Phase benutzt das Makefile des Linux-Kernels zur Installation des
externen Kernel-Moduls.
@end table

Es ist möglich und hilfreich, den für die Erstellung des Moduls zu
benutzenden Linux-Kernel anzugeben (in der @code{arguments}-Form eines
Pakets, dass das @code{linux-module-build-system} als Erstellungssystem
benutzt, wird dazu der Schlüssel @code{#:linux} benutzt).
@end defvar

@defvar node-build-system
Diese Variable wird vom Modul @code{(guix build-system node)}
exportiert. Sie stellt eine Implementierung der Erstellungsprozedur von
@uref{https://nodejs.org, Node.js} dar, die annäherungsweise der Funktion
des Befehls @code{npm install} gefolgt vom Befehl @code{npm test}
entspricht.

Welches Node.js-Paket zur Interpretation der @code{npm}-Befehle benutzt
wird, kann mit dem Parameter @code{#:node} angegeben werden. Dessen
Vorgabewert ist @code{node}.
@end defvar

@defvar tree-sitter-build-system

Diese Variable wird vom Modul @code{(guix build-system tree-sitter)}
exportiert. Sie implementiert, wie Grammatiken für
@url{https://tree-sitter.github.io/tree-sitter/, Tree-sitter}, einer
Bibliothek zur Syntaxanalyse, kompiliert werden. Dazu wird hauptsächlich
@code{tree-sitter generate} ausgeführt, um Grammatiken in
@code{grammar.js}-Dateien nach JSON und anschließend nach C zu
übersetzen. Daraus wird dann Maschinencode kompiliert.

Tree-sitter-Pakete können mehrere Grammatiken enthalten. Deswegen ermöglicht
es dieses Erstellungssystem, mit einem Schlüsselwort
@code{#:grammar-directories} eine Liste von Orten anzugeben, wo je eine
@code{grammar.js} zu finden ist.

In manchen Fällen hängt die eine Grammatik von der anderen ab, etwa wenn C++
von C abhängt oder TypeScript von JavaScript. Solche Abhängigkeiten können
Sie als Eingaben unter @code{#:inputs} angeben.

@end defvar

Letztlich gibt es für die Pakete, die bei weitem nichts so komplexes
brauchen, ein „triviales“ Erstellungssystem. Es ist in dem Sinn trivial,
dass es praktisch keine Hilfestellungen gibt: Es fügt keine impliziten
Eingaben hinzu und hat kein Konzept von Erstellungsphasen.

@defvar trivial-build-system
Diese Variable wird vom Modul @code{(guix build-system trivial)} exportiert.

Diesem Erstellungssystem muss im Argument @code{#:builder} ein
Scheme-Ausdruck übergeben werden, der die Paketausgabe(n) erstellt@tie{}–
wie bei @code{build-expression->derivation} (siehe @ref{Ableitungen,
@code{build-expression->derivation}}).
@end defvar

@defvar channel-build-system
Diese Variable wird vom Modul @code{(guix build-system channel)} exportiert.

Dieses Erstellungssystem ist in erster Linie auf interne Nutzung
ausgelegt. Ein Paket mit diesem Erstellungssystem muss im @code{source}-Feld
eine Kanalspezifikation stehen haben (siehe @ref{Kanäle}); alternativ kann
für @code{source} der Name eines Verzeichnisses angegeben werden, dann muss
aber ein Argument @code{#:commit} mit dem gewünschten Commit (einer
hexadezimalen Zeichenkette) übergeben werden, so dass dieser erstellt wird.

Optional kann ein @code{#:channels}-Argument mit zusätzlichen Kanälen
angegeben werden.

Damit ergit sich ein Paket mit einer Guix-Instanz der angegebenen Kanäle,
ähnlich der, die @command{guix time-machine} erstellen würde.
@end defvar

@node Erstellungsphasen
@section Erstellungsphasen

@cindex Erstellungsphasen, bei Paketen
Fast alle Erstellungssysteme für Pakete implementieren ein Konzept von
@dfn{Erstellungsphasen}: einer Abfolge von Aktionen, die vom
Erstellungssystem ausgeführt werden, wenn Sie das Paket erstellen. Dabei
fallen in den Store installierte Nebenerzeugnisse an. Eine Ausnahme ist der
Erwähnung wert: das magere @code{trivial-build-system} (siehe @ref{Erstellungssysteme}).

Wie im letzten Abschnitt erläutert, stellen diese Erstellungssysteme eine
standardisierte Liste von Phasen zur Verfügung. Für @code{gnu-build-system}
sind dies die hauptsächlichen Erstellungsphasen:

@table @code
@item set-paths
Suchpfade in Umgebungsvariablen definieren. Dies geschieht für alle
Eingabepakete. @env{PATH} wird so auch festgelegt. Siehe @ref{Suchpfade}.

@item unpack
Den Quell-Tarball entpacken und das Arbeitsverzeichnis wechseln in den
entpackten Quellbaum. Wenn die Quelle bereits ein Verzeichnis ist, wird es
in den Quellbaum kopiert und dorthin gewechselt.

@item patch-source-shebangs
„Shebangs“ in Quelldateien beheben, damit Sie sich auf die richtigen
Store-Dateipfade beziehen. Zum Beispiel könnte @code{#!/bin/sh} zu
@code{#!/gnu/store/…-bash-4.3/bin/sh} geändert werden.

@item configure
Das Skript @file{configure} mit einigen vorgegebenen Befehlszeilenoptionen
ausführen, wie z.B.@: mit @option{--prefix=/gnu/store/…}, sowie mit den im
@code{#:configure-flags}-Argument angegebenen Optionen.

@item build
@code{make} ausführen mit den Optionen aus der Liste in
@code{#:make-flags}. Wenn das Argument @code{#:parallel-build?} auf wahr
gesetzt ist (was der Vorgabewert ist), wird @code{make -j} zum Erstellen
ausgeführt.

@item check
@code{make check} (oder statt @code{check} ein anderes bei
@code{#:test-target} angegebenes Ziel) ausführen, außer falls @code{#:tests?
#f} gesetzt ist. Wenn das Argument @code{#:parallel-tests?} auf wahr gesetzt
ist (der Vorgabewert), führe @code{make check -j} aus.

@item install
@code{make install} mit den in @code{#:make-flags} aufgelisteten Optionen
ausführen.

@item patch-shebangs
Shebangs in den installierten ausführbaren Dateien beheben.

@item strip
Symbole zur Fehlerbehebung aus ELF-Dateien entfernen (außer
@code{#:strip-binaries?} ist auf falsch gesetzt) und in die
@code{debug}-Ausgabe kopieren, falls diese verfügbar ist (siehe
@ref{Dateien zur Fehlersuche installieren}).

@cindex RUNPATH, Validierung
@anchor{phase-validate-runpath}
@item validate-runpath
Den @code{RUNPATH} von ELF-Binärdateien validieren, sofern
@code{#:validate-runpath?} falsch ist (siehe @ref{Erstellungssysteme}).

Die Validierung besteht darin, sicherzustellen, dass jede gemeinsame
Bibliothek, die von einer ELF-Binärdatei gebraucht wird (sie sind in
@code{DT_NEEDED}-Einträgen im @code{PT_DYNAMIC}-Segment der ELF-Datei
aufgeführt), im @code{DT_RUNPATH}-Eintrag der Datei gefunden wird. Mit
anderen Worten wird gewährleistet, dass es beim Ausführen oder Benutzen
einer solchen Binärdatei nicht zur Laufzeit zu einem Fehler kommt, eine
Datei würde nicht gefunden. Siehe @ref{Options, @option{-rpath},, ld, The
GNU Linker} für mehr Informationen zum @code{RUNPATH}.

@end table

Andere Erstellungssysteme haben ähnliche, aber etwas unterschiedliche
Phasen. Zum Beispiel hat das @code{cmake-build-system} gleichnamige Phasen,
aber seine @code{configure}-Phase führt @command{cmake} statt
@command{./configure} aus. Andere Erstellungssysteme wie z.B.@:
@code{python-build-system} haben eine völlig andere Liste von
Standardphasen. Dieser gesamte Code läuft @dfn{erstellungsseitig}: Er wird
dann ausgewertet, wenn Sie das Paket wirklich erstellen, in einem eigenen
Erstellungprozess nur dafür, den der Erstellungs-Daemon erzeugt (siehe
@ref{Aufruf des guix-daemon}).

Erstellungsphasen werden durch assoziative Listen (kurz „Alists“)
repräsentiert (siehe @ref{Association Lists,,, guile, Referenzhandbuch zu
GNU Guile}) wo jeder Schlüssel ein Symbol für den Namen der Phase ist und
der assoziierte Wert eine Prozedur ist, die eine beliebige Anzahl von
Argumenten nimmt. Nach Konvention empfangen diese Prozeduren dadurch
Informationen über die Erstellung in Form von
@dfn{Schlüsselwort-Parametern}, die darin benutzt oder ignoriert werden
können.

@vindex %standard-phases
Zum Beispiel werden die @code{%standard-phases}, das ist die Variable mit
der Alist der Erstellungsphasen, in @code{(guix build gnu-build-system)} so
definiert@footnote{Wir stellen hier nur eine vereinfachte Sicht auf diese
Erstellungsphasen vor. Wenn Sie alle Details wollen, schauen Sie sich
@code{(guix build gnu-build-system)} an!}:

@lisp
;; Die Erstellungsphasen von 'gnu-build-system'.

(define* (unpack #:key source #:allow-other-keys)
  ;; Quelltarball extrahieren.
  (invoke "tar" "xvf" source))

(define* (configure #:key outputs #:allow-other-keys)
  ;; 'configure'-Skript ausführen. In Ausgabe "out" installieren.
  (let ((out (assoc-ref outputs "out")))
    (invoke "./configure"
            (string-append "--prefix=" out))))

(define* (build #:allow-other-keys)
  ;; Kompilieren.
  (invoke "make"))

(define* (check #:key (test-target "check") (tests? #true)
                #:allow-other-keys)
  ;; Testkatalog ausführen.
  (if tests?
      (invoke "make" test-target)
      (display "test suite not run\n")))

(define* (install #:allow-other-keys)
  ;; Dateien ins bei 'configure' festgelegte Präfix installieren.
  (invoke "make" "install"))

(define %standard-phases
  ;; Die Liste der Standardphasen (der Kürze halber lassen wir einige
  ;; aus). Jedes Element ist ein Paar aus Symbol und Prozedur.
  (list (cons 'unpack unpack)
        (cons 'configure configure)
        (cons 'build build)
        (cons 'check check)
        (cons 'install install)))
@end lisp

Hier sieht man wie @code{%standard-phases} als eine Liste von Paaren aus
Symbol und Prozedur (siehe @ref{Pairs,,, guile, Referenzhandbuch zu GNU
Guile}) definiert ist. Das erste Paar assoziiert die @code{unpack}-Prozedur
mit dem @code{unpack}-Symbol@tie{}– es gibt einen Namen an. Das zweite Paar
definiert die @code{configure}-Phase auf ähnliche Weise, ebenso die
anderen. Wenn ein Paket erstellt wird, das @code{gnu-build-system} benutzt,
werden diese Phasen der Reihe nach ausgeführt. Sie können beim Erstellen von
Paketen im Erstellungsprotokoll den Namen jeder gestarteten und
abgeschlossenen Phase sehen.

Schauen wir uns jetzt die Prozeduren selbst an. Jede davon wird mit
@code{define*} definiert, dadurch können bei @code{#:key} die
Schlüsselwortparameter aufgelistet werden, die die Prozedur annimmt, wenn
gewünscht auch zusammen mit einem Vorgabewert, und durch
@code{#:allow-other-keys} wird veranlasst, dass andere
Schlüsselwortparameter ignoriert werden (siehe @ref{Optional Arguments,,,
guile, Referenzhandbuch zu GNU Guile}).

Die @code{unpack}-Prozedur berücksichtigt den @code{source}-Parameter; das
Erstellungssystem benutzt ihn, um den Dateinamen des Quell-Tarballs (oder
des Checkouts aus einer Versionskontrolle) zu finden. Die anderen Parameter
ignoriert sie. Die @code{configure}-Phase interessiert sich nur für den
@code{outputs}-Parameter, eine Alist, die die Namen von Paketausgaben auf
ihre Dateinamen im Store abbildet (siehe @ref{Pakete mit mehreren Ausgaben.}). Sie extrahiert den Dateinamen für @code{out}, die
Standardausgabe, und gibt ihn an @command{./configure} als das
Installationspräfix weiter, wodurch @command{make install} zum Schluss alle
Dateien in dieses Verzeichnis kopieren wird (siehe @ref{Configuration,
configuration and makefile conventions,, standards, GNU Coding
Standards}). @code{build} und @code{install} ignorieren all ihre
Argumente. @code{check} berücksichtigt das Argument @code{test-target},
worin der Name des Makefile-Ziels angegeben wird, um die Tests
auszuführen. Es wird stattdessen eine Nachricht angezeigt und die Tests
übersprungen, wenn @code{tests?} falsch ist.

@cindex Erstellungsphasen, Anpassen der
Die Liste der Phasen, die für ein bestimmtes Paket benutzt werden, kann über
den @code{#:phases}-Parameter an das Erstellungssystem geändert werden. Das
Ändern des Satzes von Erstellungsphasen funktioniert so, dass eine neue
Alist von Phasen aus der oben beschriebenen @code{%standard-phases}-Alist
heraus erzeugt wird. Dazu können die Standardprozeduren zur Bearbeitung von
assoziativen Listen wie @code{alist-delete} benutzt werden (siehe
@ref{SRFI-1 Association Lists,,, guile, Referenzhandbuch zu GNU Guile}),
aber es ist bequemer, dafür die Prozedur @code{modify-phases} zu benutzen
(siehe @ref{Werkzeuge zur Erstellung, @code{modify-phases}}).

Hier ist ein Beispiel für eine Paketdefinition, die die
@code{configure}-Phase aus @code{%standard-phases} entfernt und eine neue
Phase vor der @code{build}-Phase namens @code{set-prefix-in-makefile}
einfügt:

@lisp
(define-public beispiel
  (package
    (name "beispiel")
    ;; wir lassen die anderen Felder aus
    (build-system gnu-build-system)
    (arguments
     (list
      #:phases
      #~(modify-phases %standard-phases
          (delete 'configure)
          (add-before 'build 'set-prefix-in-makefile
            (lambda* (#:key inputs #:allow-other-keys)
              ;; Makefile anpassen, damit die 'PREFIX'-
              ;; Variable auf #$output verweist und
              ;; 'XMLLINT' auf den richtigen Pfad verweist.
              (substitute* "Makefile"
                (("PREFIX =.*")
                 (string-append "PREFIX = " #$output "\n"))
                (("XMLLINT =.*")
                 (string-append "XMLLINT = "
                                (search-input-file inputs "/bin/xmllint")
                                "\n"))))))))))
@end lisp

Die neu eingefügte Phase wurde als anonyme Prozedur geschrieben. Solche
namenlosen Prozeduren schreibt man mit @code{lambda*}. Durch sie wird nach
der ausführbaren Datei @file{xmllint} in jedem Verzeichnis @file{/bin} aller
Paketeingaben gesucht (siehe @ref{„package“-Referenz}). Oben berücksichtigt
sie den @code{outputs}-Parameter, den wir zuvor gesehen haben. Siehe
@ref{Werkzeuge zur Erstellung} für mehr Informationen über die in dieser Phase
benutzten Hilfsmittel und für mehr Beispiele zu @code{modify-phases}.

@quotation Tipp
Sie können den Code, der sich für das @code{#:phases}-Argument ergibt,
interaktiv auf der REPL untersuchen (siehe @ref{Interaktiv mit Guix arbeiten}).
@end quotation

@cindex Code-Staging
@cindex Staging, von Code
Sie sollten im Kopf behalten, dass Erstellungsphasen aus Code bestehen, der
erst dann ausgewertet wird, wenn das Paket erstellt wird. Das ist der Grund,
warum der gesamte @code{modify-phases}-Ausdruck oben quotiert wird. Quotiert
heißt, er steht nach einem @code{#~} oder Doppelkreuz-Tilde: Er wird nicht
sofort als Code ausgewertet, sondern nur zur späteren Ausführung vorgemerkt
(wir sagen @dfn{staged}, siehe @ref{G-Ausdrücke} für eine Erläuterung von
Code-Staging und den beteiligten @dfn{Code-Schichten} (oder „Strata“).

@node Werkzeuge zur Erstellung
@section Werkzeuge zur Erstellung

Sobald Sie anfangen, nichttriviale Paketdefinitionen (siehe @ref{Pakete definieren}) oder andere Erstellungsaktionen (siehe @ref{G-Ausdrücke}) zu
schreiben, würden Sie sich wahrscheinlich darüber freuen, Helferlein für
„Shell-artige“ Aktionen vordefiniert zu bekommen, also Code, den Sie
benutzen können, um Verzeichnisse anzulegen, Dateien rekursiv zu kopieren
oder zu löschen, Erstellungsphasen anzupassen und Ähnliches. Das Modul
@code{(guix build utils)} macht solche nützlichen Werkzeugprozeduren
verfügbar.

Die meisten Erstellungssysteme laden @code{(guix build utils)} (siehe
@ref{Erstellungssysteme}). Wenn Sie also eigene Erstellungsphasen für Ihre
Paketdefinitionen schreiben, können Sie in den meisten Fällen annehmen, dass
diese Prozeduren bei der Auswertung sichtbar sein werden.

Beim Schreiben von G-Ausdrücken können Sie auf der „Erstellungsseite“
@code{(guix build utils)} mit @code{with-imported-modules} importieren und
anschließend mit der @code{use-modules}-Form sichtbar machen (siehe
@ref{Using Guile Modules,,, guile, Referenzhandbuch zu GNU Guile}):

@lisp
(with-imported-modules '((guix build utils))  ;importieren
  (computed-file "leerer-verzeichnisbaum"
                 #~(begin
                     ;; Sichtbar machen.
                     (use-modules (guix build utils))

                     ;; Jetzt kann man problemlos 'mkdir-p' nutzen.
                     (mkdir-p (string-append #$output "/a/b/c")))))
@end lisp

Der Rest dieses Abschnitts stellt eine Referenz der meisten
Werkzeugprozeduren dar, die @code{(guix build utils)} anbietet.

@c TODO Document what's missing.

@subsection Umgehen mit Store-Dateinamen

Dieser Abschnitt dokumentiert Prozeduren, die sich mit Dateinamen von
Store-Objekten befassen.

@deffn {Prozedur} %store-directory
Liefert den Verzeichnisnamen des Stores.
@end deffn

@deffn {Prozedur} store-file-name? Datei
Liefert wahr zurück, wenn sich @var{Datei} innerhalb des Stores befindet.
@end deffn

@deffn {Prozedur} strip-store-file-name Datei
Liefert den Namen der @var{Datei}, die im Store liegt, ohne den Anfang
@file{/gnu/store} und ohne die Prüfsumme am Namensanfang. Als Ergebnis
ergibt sich typischerweise eine Zeichenkette aus
@code{"@var{Paket}-@var{Version}"}.
@end deffn

@deffn {Prozedur} package-name->name+version Name
Liefert für den Paket-@var{Name}n (so etwas wie @code{"foo-0.9.1b"}) zwei
Werte zurück: zum einen @code{"foo"} und zum anderen @code{"0.9.1b"}. Wenn
der Teil mit der Version fehlt, werden der @var{Name} und @code{#f}
zurückgeliefert. Am ersten Bindestrich, auf den eine Ziffer folgt, wird der
Versionsteil abgetrennt.
@end deffn

@subsection Dateitypen

Bei den folgenden Prozeduren geht es um Dateien und Dateitypen.

@deffn {Prozedur} directory-exists? Verzeichnis
Liefert @code{#t}, wenn das @var{Verzeichnis} existiert und ein Verzeichnis
ist.
@end deffn

@deffn {Prozedur} executable-file? Datei
Liefert @code{#t}, wenn die @var{Datei} existiert und ausführbar ist.
@end deffn

@deffn {Prozedur} symbolic-link? Datei
Liefert @code{#t}, wenn die @var{Datei} eine symbolische Verknüpfung ist
(auch bekannt als „Symlink“).
@end deffn

@deffn {Prozedur} elf-file? Datei
@deffnx {Prozedur} ar-file? Datei
@deffnx {Prozedur} gzip-file? Datei
Liefert @code{#t}, wenn die @var{Datei} jeweils eine ELF-Datei, ein
@code{ar}-Archiv (etwa eine statische Bibliothek mit @file{.a}) oder eine
gzip-Datei ist.
@end deffn

@deffn {Prozedur} reset-gzip-timestamp Datei [#:keep-mtime? #t]
Wenn die @var{Datei} eine gzip-Datei ist, wird ihr eingebetteter Zeitstempel
zurückgesetzt (wie bei @command{gzip --no-name}) und wahr
geliefert. Ansonsten wird @code{#f} geliefert. Wenn @var{keep-mtime?} wahr
ist, wird der Zeitstempel der letzten Modifikation von @var{Datei}
beibehalten.
@end deffn

@subsection Änderungen an Dateien

Die folgenden Prozeduren und Makros helfen beim Erstellen, Ändern und
Löschen von Dateien. Sie machen Funktionen ähnlich zu Shell-Werkzeugen wie
@command{mkdir -p}, @command{cp -r}, @command{rm -r} und @command{sed}
verfügbar. Sie ergänzen Guiles ausgiebige aber kleinschrittige
Dateisystemschnittstelle (siehe @ref{POSIX,,, guile, Referenzhandbuch zu GNU
Guile}).

@defmac with-directory-excursion Verzeichnis Rumpf…
Den @var{Rumpf} ausführen mit dem @var{Verzeichnis} als aktuellem
Verzeichnis des Prozesses.

Im Grunde ändert das Makro das aktuelle Arbeitsverzeichnis auf
@var{Verzeichnis} bevor der @var{Rumpf} ausgewertet wird, mittels
@code{chdir} (siehe @ref{Processes,,, guile, Referenzhandbuch zu GNU
Guile}). Wenn der dynamische Bereich von @var{Rumpf} wieder verlassen wird,
wechselt es wieder ins anfängliche Verzeichnis zurück, egal ob der
@var{Rumpf} durch normales Zurückliefern eines Ergebnisses oder durch einen
nichtlokalen Sprung wie etwa eine Ausnahme verlassen wurde.
@end defmac

@deffn {Prozedur} mkdir-p Verzeichnis
Das @var{Verzeichnis} und all seine Vorgänger erstellen.
@end deffn

@deffn {Prozedur} install-file Datei Verzeichnis
@var{Verzeichnis} erstellen, wenn es noch nicht existiert, und die
@var{Datei} mit ihrem Namen dorthin kopieren.
@end deffn

@deffn {Prozedur} make-file-writable Datei
Dem Besitzer der @var{Datei} Schreibberechtigung darauf erteilen.
@end deffn

@deffn {Prozedur} copy-recursively Quelle Zielort @
  [#:log (current-output-port)] [#:follow-symlinks? #f] [#:copy-file @
copy-file] [#:keep-mtime? #f] [#:keep-permissions? #t] [#:select? (const @
#t)]
Das Verzeichnis @var{Quelle} rekursiv an den @var{Zielort} kopieren. Wenn
@var{follow-symlinks?} wahr ist, folgt die Rekursion symbolischen
Verknüpfungen, ansonsten werden die Verknüpfungen als solche
beibehalten. Zum Kopieren regulärer Dateien wird @var{copy-file}
aufgerufen. Dabei wird @var{select?} auf jedem Eintrag in @var{Quelle} mit
zwei Argumenten aufgerufen, @var{Datei} und @var{Stat}. @var{Datei} ist der
absolute Dateiname des Eintrags und @var{Stat} ist das, was ein Aufruf von
@code{lstat} zurückgibt (bzw.@: @code{stat}, wenn @var{follow-symlinks?}
wahr ist). Einträge, für die @var{select?} @emph{nicht} wahr zurückliefert,
werden ausgelassen. Wenn @var{keep-mtime?} wahr ist, bleibt der Zeitstempel
der letzten Änderung an den Dateien in @var{Quelle} dabei bei denen am
@var{Zielort} erhalten. Wenn @var{keep-permissions?} wahr ist, bleiben
Dateiberechtigungen erhalten. Ein ausführliches Protokoll wird in den bei
@var{log} angegebenen Port geschrieben.
@end deffn

@deffn {Prozedur} delete-file-recursively Verzeichnis @
[#:follow-mounts? #f]
Das @var{Verzeichnis} rekursiv löschen, wie bei @command{rm -rf}, ohne
symbolischen Verknüpfungen zu folgen. Auch Einhängepunkten wird @emph{nicht}
gefolgt, außer falls @var{follow-mounts?} wahr ist. Fehler dabei werden
angezeigt aber ignoriert.
@end deffn

@defmac substitute* Datei @
  ((Regexp Muster-Variable…) Rumpf…) …
Den regulären Ausdruck @var{Regexp} in der @var{Datei} durch die durch
@var{Rumpf} berechnete Zeichenkette ersetzen. Bei der Auswertung von
@var{Rumpf} wird jede @var{Muster-Variable} an den Teilausdruck an der
entsprechenden Position der Regexp gebunden. Zum Beispiel:

@lisp
(substitute* file
  (("Hallo")
   "Guten Morgen\n")
  (("foo([a-z]+)bar(.*)$" alles Buchstaben Ende)
   (string-append "baz" Buchstaben Ende)))
@end lisp

Jedes Mal, wenn eine Zeile in der @var{Datei} den Text @code{Hallo} enthält,
wird dieser durch @code{Guten Morgen} ersetzt. Jedes Mal, wenn eine Zeile
zum zweiten regulären Ausdruck passt, wird @code{alles} an die vollständige
Übereinstimmung gebunden, @code{Buchstaben} wird an den ersten Teilausdruck
gebunden und @code{Ende} an den letzten.

Wird für eine @var{Muster-Variable} nur @code{_} geschrieben, so wird keine
Variable an die Teilzeichenkette an der entsprechenden Position im Muster
gebunden.

Alternativ kann statt einer @var{Datei} auch eine Liste von Dateinamen
angegeben werden. In diesem Fall wird jede davon den Substitutionen
unterzogen.

Seien Sie vorsichtig bei der Nutzung von @code{$}, um auf das Ende einer
Zeile zu passen. @code{$} passt nämlich @emph{nicht} auf den Zeilenumbruch
am Ende einer Zeile. Wenn es zum Beispiel zu einer ganzen Zeile passen soll,
an deren Ende ein Backslash steht, kann der benötigte reguläre Ausdruck etwa
@code{"(.*)\\\\\n$"} lauten.
@end defmac

@subsection Dateien suchen

@cindex Dateien, suchen
Dieser Abschnitt beschreibt Prozeduren, um Dateien zu suchen und zu filtern.

@deffn {Prozedur} file-name-predicate Regexp
Liefert ein Prädikat, das gegeben einen Dateinamen, dessen Basisnamen auf
@var{Regexp} passt, wahr liefert.
@end deffn

@deffn {Prozedur} find-files Verzeichnis [Prädikat] @
  [#:stat lstat] [#:directories? #f] [#:fail-on-error? #f]
Liefert die lexikografisch sortierte Liste der Dateien innerhalb
@var{Verzeichnis}, für die das @var{Prädikat} wahr liefert. An
@var{Prädikat} werden zwei Argumente übergeben: Der absolute Dateiname und
der zugehörige Stat-Puffer. Das vorgegebene Prädikat liefert immer wahr. Als
@var{Prädikat} kann auch ein regulärer Ausdruck benutzt werden; in diesem
Fall ist er äquivalent zu @code{(file-name-predicate @var{Prädikat})}. Mit
@var{stat} werden Informationen über die Datei ermittelt; wenn dafür
@code{lstat} benutzt wird, bedeutet das, dass symbolische Verknüpfungen
nicht verfolgt werden. Wenn @var{directories?} wahr ist, dann werden auch
Verzeichnisse aufgezählt. Wenn @var{fail-on-error?} wahr ist, dann wird bei
einem Fehler eine Ausnahme ausgelöst.
@end deffn

Nun folgen ein paar Beispiele, wobei wir annehmen, dass das aktuelle
Verzeichnis der Wurzel des Guix-Quellbaums entspricht.

@lisp
;; Alle regulären Dateien im aktuellen Verzeichnis auflisten.
(find-files ".")
@result{} ("./.dir-locals.el" "./.gitignore" …)

;; Alle .scm-Dateien unter gnu/services auflisten.
(find-files "gnu/services" "\\.scm$")
@result{} ("gnu/services/admin.scm" "gnu/services/audio.scm" …)

;; ar-Dateien im aktuellen Verzeichnis auflisten.
(find-files "." (lambda (file stat) (ar-file? file)))
@result{} ("./libformat.a" "./libstore.a" …)
@end lisp

@deffn {Prozedur} which Programm
Liefert den vollständigen Dateinamen für das @var{Programm}, der in
@code{$PATH} gesucht wird, oder @code{#f}, wenn das @var{Programm} nicht
gefunden werden konnte.
@end deffn

@deffn {Prozedur} search-input-file Eingaben Name
@deffnx {Prozedur} search-input-directory Eingaben Name
Liefert den vollständigen Dateinamen von @var{Name}, das in allen
@var{Eingaben} gesucht wird. @code{search-input-file} sucht nach einer
regulären Datei, während @code{search-input-directory} nach einem
Verzeichnis sucht. Wenn der @var{Name} nicht vorkommt, wird eine Ausnahme
ausgelöst.

Hierbei muss für @var{Eingaben} eine assoziative Liste wie @code{inputs}
oder @code{native-inputs} übergeben werden, die für Erstellungsphasen zur
Verfügung steht (siehe @ref{Erstellungsphasen}).
@end deffn

Hier ist ein (vereinfachtes) Beispiel, wie @code{search-input-file} in einer
Erstellungsphase des @code{wireguard-tools}-Pakets benutzt wird:

@lisp
(add-after 'install 'wrap-wg-quick
  (lambda* (#:key inputs outputs #:allow-other-keys)
    (let ((coreutils (string-append (assoc-ref inputs "coreutils")
                                    "/bin")))
      (wrap-program (search-input-file outputs "bin/wg-quick")
        #:sh (search-input-file inputs "bin/bash")
        `("PATH" ":" prefix ,(list coreutils))))))
@end lisp

@subsection Programme aufrufen

@cindex Aufruf von Programmen, aus Scheme
@cindex Programme aufrufen, aus Scheme
Im Modul finden Sie Prozeduren, die geeignet sind, Prozesse zu
erzeugen. Hauptsächlich handelt es sich um praktische Wrapper für Guiles
@code{system*} (siehe @ref{Processes, @code{system*},, guile,
Referenzhandbuch zu GNU Guile}).

@deffn {Prozedur} invoke Programm Argumente…
@var{Programm} mit @var{Argumente} aufrufen. Es wird eine
@code{&invoke-error}-Ausnahme ausgelöst, wenn der Exit-Code ungleich null
ist, ansonsten wird @code{#t} zurückgeliefert.

Der Vorteil gegenüber @code{system*} ist, dass Sie den Rückgabewert nicht zu
überprüfen brauchen. So vermeiden Sie umständlichen Code in
Shell-Skript-haften Schnipseln etwa in Erstellungsphasen von Paketen.
@end deffn

@deffn {Prozedur} invoke-error? c
Liefert wahr, wenn @var{c} ein @code{&invoke-error}-Zustand ist.
@end deffn

@deffn {Prozedur} invoke-error-program c
@deffnx {Prozedur} invoke-error-arguments c
@deffnx {Prozedur} invoke-error-exit-status c
@deffnx {Prozedur} invoke-error-term-signal c
@deffnx {Prozedur} invoke-error-stop-signal c
Auf bestimmte Felder von @var{c} zugreifen, einem
@code{&invoke-error}-Zustand.
@end deffn

@deffn {Prozedur} report-invoke-error c Port
Auf @var{Port} (nach Vorgabe der @code{current-error-port}) eine Meldung für
@var{c}, einem @code{&invoke-error}-Zustand, menschenlesbar ausgeben.

Normalerweise würden Sie das so benutzen:

@lisp
(use-modules (srfi srfi-34) ;für 'guard'
             (guix build utils))

(guard (c ((invoke-error? c)
           (report-invoke-error c)))
  (invoke "date" "--imaginary-option"))

@print{} command "date" "--imaginary-option" failed with status 1
@end lisp
@end deffn

@deffn {Prozedur} invoke/quiet Programm Argumente…
@var{Programm} mit @var{Argumente} aufrufen und dabei die Standardausgabe
und Standardfehlerausgabe von @var{Programm} einfangen. Wenn @var{Programm}
erfolgreich ausgeführt wird, wird @emph{nichts} ausgegeben und der
unbestimmte Wert @code{*unspecified*} zurückgeliefert. Andernfalls wird ein
@code{&message}-Fehlerzustand ausgelöst, der den Status-Code und die Ausgabe
von @var{Programm} enthält.

Hier ist ein Beispiel:

@lisp
(use-modules (srfi srfi-34) ;für 'guard'
             (srfi srfi-35) ;für 'message-condition?'
             (guix build utils))

(guard (c ((message-condition? c)
           (display (condition-message c))))
  (invoke/quiet "date")  ;alles in Ordnung
  (invoke/quiet "date" "--imaginary-option"))

@print{} 'date --imaginary-option' exited with status 1; output follows:

    date: Unbekannte Option »--imaginary-option«
    „date --help“ liefert weitere Informationen.
@end lisp
@end deffn

@subsection Erstellungsphasen

@cindex Erstellungsphasen
@code{(guix build utils)} enthält auch Werkzeuge, um die von
Erstellungssystemen benutzten Erstellungsphasen zu verändern (siehe
@ref{Erstellungssysteme}). Erstellungsphasen werden durch assoziative Listen oder
„Alists“ repräsentiert (siehe @ref{Association Lists,,, guile,
Referenzhandbuch zu GNU Guile}), wo jeder Schlüssel ein Symbol ist, das den
Namen der Phase angibt, und der assoziierte Wert eine Prozedur ist (siehe
@ref{Erstellungsphasen}).

Die zum Kern von Guile („Guile core“) gehörenden Prozeduren und das Modul
@code{(srfi srfi-1)} stellen beide Werkzeuge zum Bearbeiten von Alists zur
Verfügung. Das Modul @code{(guix build utils)} ergänzt sie um Werkzeuge, die
speziell für Erstellungsphasen gedacht sind.

@cindex Erstellungsphasen, Ändern von
@defmac modify-phases Phasen Klausel…
Die @var{Phasen} der Reihe nach entsprechend jeder @var{Klausel} ändern. Die
Klauseln dürfen eine der folgenden Formen haben:

@lisp
(delete @var{alter-Phasenname})
(replace @var{alter-Phasenname} @var{neue-Phase})
(add-before @var{alter-Phasenname} @var{neuer-Phasenname} @var{neue-Phase})
(add-after @var{alter-Phasenname} @var{neuer-Phasenname} @var{neue-Phase})
@end lisp

Jeder @var{Phasenname} oben ist ein Ausdruck, der zu einem Symbol auswertet,
und @var{neue-Phase} ist ein Ausdruck, der zu einer Prozedur auswertet.
@end defmac

Folgendes Beispiel stammt aus der Definition des @code{grep}-Pakets. Es fügt
eine neue Phase namens @code{egrep-und-fgrep-korrigieren} hinzu, die auf die
@code{install}-Phase folgen soll. Diese Phase ist eine Prozedur
(@code{lambda*} bedeutet, sie ist eine Prozedur ohne eigenen Namen), die ein
Schlüsselwort @code{#:outputs} bekommt und die restlichen
Schlüsselwortargumente ignoriert (siehe @ref{Optional Arguments,,, guile,
Referenzhandbuch zu GNU Guile} für mehr Informationen zu @code{lambda*} und
optionalen sowie Schlüsselwort-Argumenten). In der Phase wird
@code{substitute*} benutzt, um die installierten Skripte @file{egrep} und
@file{fgrep} so zu verändern, dass sie @code{grep} anhand seines absoluten
Dateinamens aufrufen:

@lisp
(modify-phases %standard-phases
  (add-after 'install 'egrep-und-fgrep-korrigieren
    ;; 'egrep' und 'fgrep' patchen, damit diese 'grep' über den
    ;; absoluten Dateinamen ausführen, statt es in $PATH zu suchen.
    (lambda* (#:key outputs #:allow-other-keys)
      (let* ((out (assoc-ref outputs "out"))
             (bin (string-append out "/bin")))
        (substitute* (list (string-append bin "/egrep")
                           (string-append bin "/fgrep"))
          (("^exec grep")
           (string-append "exec " bin "/grep")))))))
@end lisp

In dem Beispiel, das nun folgt, werden Phasen auf zweierlei Art geändert:
Die Standard-@code{configure}-Phase wird gelöscht, meistens weil das Paket
über kein @file{configure}-Skript oder etwas Ähnliches verfügt, und die
vorgegebene @code{install}-Phase wird durch eine ersetzt, in der die zu
installierenden ausführbaren Dateien manuell kopiert werden.

@lisp
(modify-phases %standard-phases
  (delete 'configure)      ;kein 'configure'-Skript
  (replace 'install
    (lambda* (#:key outputs #:allow-other-keys)
      ;; Das Makefile im Paket enthält kein "install"-Ziel,
      ;; also müssen wir es selber machen.
      (let ((bin (string-append (assoc-ref outputs "out")
                                "/bin")))
        (install-file "footswitch" bin)
        (install-file "scythe" bin)))))
@end lisp

@c TODO: Add more examples.

@subsection Wrapper

@cindex Programme wrappen
@cindex Wrappen, von Programmen
Es kommt vor, dass Befehle nur richtig funktionieren, wenn bestimmte
Umgebungsvariable festgelegt sind. Meistens geht es dabei um Suchpfade
(siehe @ref{Suchpfade}). Wenn man sie nicht zuweist, finden die Programme
vielleicht benötigte Dateien oder andere Befehle @emph{nicht} oder sie
nehmen die „falschen“, je nachdem, in welcher Umgebung man sie
ausführt. Einige Beispiele:

@itemize
@item
ein Shell-Skript, wo erwartet wird, dass die darin benutzten Befehle in
@env{PATH} zu finden sind,

@item
ein Guile-Programm, wo erwartet wird, dass dessen Module in
@env{GUILE_LOAD_PATH} und @env{GUILE_LOAD_COMPILED_PATH} liegen,

@item
eine Qt-Anwendung, für die bestimmte Plugins in @env{QT_PLUGIN_PATH}
erwartet werden.
@end itemize

Das Ziel einer Paketautorin ist, dass Befehle immer auf gleiche Weise
funktionieren statt von externen Einstellungen abhängig zu sein. Eine
Möglichkeit, das zu bewerkstelligen, ist, Befehle in ein dünnes
@dfn{Wrapper}-Skript einzukleiden, welches diese Umgebungsvariablen festlegt
und so dafür sorgt, dass solche Laufzeitabhängigkeiten sicherlich gefunden
werden. Der Wrapper würde in den obigen Beispielen also benutzt, um
@env{PATH}, @env{GUILE_LOAD_PATH} oder @env{QT_PLUGIN_PATH} festzulegen.

Das Wrappen wird erleichtert durch ein paar Hilfsprozeduren im Modul
@code{(guix build utils)}, mit denen Sie Befehle wrappen können.

@deffn {Prozedur} wrap-program Programm [#:sh sh] @
[#:rest Variable]
Einen Wrapper für @var{Programm} anlegen. Die Liste @var{Variable} sollte so
aussehen:

@lisp
'(@var{Variable} @var{Trennzeichen} @var{Position} @var{Liste-von-Verzeichnissen})
@end lisp

Das @var{Trennzeichen} ist optional. Wenn Sie keines angeben, wird @code{:}
genommen.

Zum Beispiel kopiert dieser Aufruf:

@lisp
(wrap-program "foo"
              '("PATH" ":" = ("/gnu/…/bar/bin"))
              '("CERT_PATH" suffix ("/gnu/…/baz/certs"
                                    "/qux/certs")))
@end lisp

@file{foo} nach @file{.foo-real} und erzeugt die Datei @file{foo} mit
folgendem Inhalt:

@example
#!ort/mit/bin/bash
export PATH="/gnu/…/bar/bin"
export CERT_PATH="$CERT_PATH$@{CERT_PATH:+:@}/gnu/…/baz/certs:/qux/certs"
exec -a $0 ort/mit/.foo-real "$@@"
@end example

Wenn @var{Programm} bereits mit @code{wrap-program} gewrappt wurde, wird
sein bestehender Wrapper um die Definitionen jeder Variable in der
@var{Variable}-Liste ergänzt. Ansonsten wird ein Wrapper mit @var{sh} als
Interpretierer angelegt.
@end deffn

@deffn {Prozedur} wrap-script Programm [#:guile guile] [#:rest Variable]
Das Skript @var{Programm} in einen Wrapper wickeln, damit @var{Variable}
vorher festgelegt werden. Das Format für @var{Variable} ist genau wie bei
der Prozedur @code{wrap-program}. Der Unterschied zu @code{wrap-program}
ist, dass kein getrenntes Shell-Skript erzeugt wird, sondern das
@var{Programm} selbst abgeändert wird, indem zu Beginn von @var{Programm}
ein Guile-Skript platziert wird. In der Sprache des Skripts wird das
Guile-Skript als Kommentar interpretiert.

Besondere Kommentare zur Kodierung der Datei, wie es sie bei Python geben
kann, werden auf der zweiten Zeile neu erzeugt.

Beachten Sie, dass diese Prozedur auf dieselbe Datei nur einmal angewandt
werden kann, denn sie auf Guile-Skripts loszulassen wird @emph{nicht}
unterstützt.
@end deffn

@node Suchpfade
@section Suchpfade

@cindex Suchpfad
Zahlreiche Programme und Bibliotheken suchen nach Eingabedaten in einem
@dfn{Suchpfad}, d.h.@: einer Liste von Verzeichnissen: Shells wie Bash
suchen ausführbare Dateien im Befehls-Suchpfad, ein C-Compiler sucht
@file{.h}-Dateien in seinem Header-Suchpfad, der Python-Interpretierer sucht
@file{.py}-Dateien in seinem Suchpfad, der Rechtschreibprüfer hat einen
Suchpfad für Wörterbücher und so weiter.

Suchpfade kann man für gewöhnlich über Umgebungsvariable festlegen (siehe
@ref{Environment Variables,,, libc, Referenzhandbuch der
GNU-C-Bibliothek}). Zum Beispiel ändern Sie die oben genannten Suchpfade,
indem Sie den Wert der Umgebungsvariablen @env{PATH}, @env{C_INCLUDE_PATH},
@env{PYTHONPATH} (oder @env{GUIX_PYTHONPATH}) und @env{DICPATH}
festlegen@tie{}– Sie wissen schon, diese Variablen, die auf @env{PATH} enden
und wenn Sie etwas daran falsch machen, werden Dinge „nicht gefunden“.

Vielleicht ist Ihnen auf der Befehlszeile aufgefallen, dass Guix Bescheid
weiß, welche Umgebungsvariablen definiert sein müssen und wie. Wenn Sie
Pakete in Ihr Standardprofil installieren, wird die Datei
@file{~/.guix-profile/etc/profile} angelegt, die Sie mit @command{source} in
Ihre Shell übernehmen können, damit die Variablen richtig festgelegt
sind. Genauso werden Ihnen, wenn Sie mit @command{guix shell} eine Umgebung
mit Python und der Python-Bibliothek NumPy erzeugen lassen und die
Befehlszeilenoption @option{--search-paths} angeben, die Variablen
@env{PATH} und @env{GUIX_PYTHONPATH} gezeigt (siehe @ref{Aufruf von guix shell}):

@example
$ guix shell python python-numpy --pure --search-paths
export PATH="/gnu/store/@dots{}-profile/bin"
export GUIX_PYTHONPATH="/gnu/store/@dots{}-profile/lib/python3.9/site-packages"
@end example

Wenn Sie @option{--search-paths} weglassen, werden diese Umgebungsvariablen
direkt festgelegt, so dass Python NumPy vorfinden kann:

@example
$ guix shell python python-numpy -- python3
Python 3.9.6 (default, Jan  1 1970, 00:00:01)
[GCC 10.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import numpy
>>> numpy.version.version
'1.20.3'
@end example

Damit das funktioniert, wurden in der Definition des @code{python}-Pakets
der dafür nötige Suchpfad und die zugehörige Umgebungsvariable
@env{GUIX_PYTHONPATH} @emph{deklariert}. Das sieht so aus:

@lisp
(package
  (name "python")
  (version "3.9.9")
  ;; davor stehen andere Felder …
  (native-search-paths
   (list (search-path-specification
          (variable "GUIX_PYTHONPATH")
          (files (list "lib/python/3.9/site-packages"))))))
@end lisp

Die Aussage hinter dem @code{native-search-paths}-Feld ist, dass wenn das
@code{python}-Paket benutzt wird, die Umgebungsvariable
@env{GUIX_PYTHONPATH} so definiert wird, dass alle Unterverzeichnisse
@file{lib/python/3.9/site-packages} in seiner Umgebung enthalten sind. (Mit
@code{native-} meinen wir, dass in einer Umgebung zur Cross-Kompilierung nur
native Eingaben zum Suchpfad hinzugefügt werden dürfen; siehe @ref{„package“-Referenz, @code{search-paths}}.) In unserem NumPy-Beispiel oben enthält das
Profil, in dem @code{python} auftaucht, genau ein solches Unterverzeichnis,
auf das @env{GUIX_PYTHONPATH} festgelegt wird. Wenn es mehrere
@file{lib/python/3.9/site-packages} gibt@tie{}– etwa wenn wir über
Erstellungsumgebungen reden@tie{}–, dann werden alle durch Doppelpunkte
(@code{:}) getrennt zu @env{GUIX_PYTHONPATH} hinzugefügt.

@quotation Anmerkung
Wir weisen darauf hin, dass @env{GUIX_PYTHONPATH} als Teil der Definition
des @code{python}-Pakets spezifiziert wird und @emph{nicht} als Teil von
@code{python-numpy}. Der Grund ist, dass diese Umgebungsvariable zu Python
„gehört“ und nicht zu NumPy: Python ist es, das den Wert der Variablen
ausliest und befolgt.

Daraus folgt, dass wenn Sie ein Profil ohne @code{python} erzeugen,
@code{GUIX_PYTHONPATH} @emph{nicht} definiert wird, selbst wenn
@file{.py}-Dateien zum Profil gehören:

@example
$ guix shell python-numpy --search-paths --pure
export PATH="/gnu/store/@dots{}-profile/bin"
@end example

Das ist logisch, wenn wir das Profil alleine betrachten: Keine Software im
Profil würde @env{GUIX_PYTHONPATH} auslesen.
@end quotation

Selbstverständlich gibt es mehr als nur eine Sorte Suchpfad: Es gibt Pakete,
die mehrere Suchpfade berücksichtigen, solche mit anderen Trennzeichen als
dem Doppelpunkt, solche, die im Suchpfad gleich mehrere Verzeichnisse
aufnehmen, und so weiter. Ein weiterführendes Beispiel ist der Suchpfad von
libxml2: Der Wert der Umgebungsvariablen @env{XML_CATALOG_FILES} wird durch
Leerzeichen getrennt, er muss eine Liste von @file{catalog.xml}-Dateien
(keinen Verzeichnissen) fassen und diese sind in
@file{xml}-Unterverzeichnissen zu finden@tie{}– ganz schön
anspruchsvoll. Die Suchpfadspezifikation dazu sieht so aus:

@c This is defined at (guix search-paths) as $XML_CATALOG_FILES.
@lisp
(search-path-specification
 (variable "XML_CATALOG_FILES")
 (separator " ")
 (files '("xml"))
 (file-pattern "^catalog\\.xml$")
 (file-type 'regular))
@end lisp

Keine Angst; die meisten Suchpfadspezifikationen sind einfacher.

Im Modul @code{(guix search-paths)} wird der Datentyp für
Suchpfadspezifikationen definiert sowie eine Reihe von Hilfsprozeduren. Es
folgt nun die Referenz der Suchpfadspezifikationen.

@deftp {Datentyp} search-path-specification
Der Datentyp für Suchpfadspezifikationen.

@table @asis
@item @code{variable}
Welchen Namen die Umgebungsvariable für diesen Suchpfad trägt (als
Zeichenkette).

@item @code{files}
Eine Liste der Unterverzeichnisse, die zum Suchpfad hinzugefügt werden
sollen.

@item @code{separator} (Vorgabe: @code{":"})
Die Zeichenkette, wodurch Komponenten des Suchpfads voneinander getrennt
werden.

Für den Sonderfall, dass für @code{separator} der Wert @code{#f} gewählt
wird, handelt es sich um einen „Suchpfad mit nur einer Komponente“, mit
anderen Worten einen Suchpfad, der höchstens ein Element enthalten darf. Das
ist für Fälle gedacht wie die @code{SSL_CERT_DIR}-Variable (die OpenSSL,
cURL und ein paar andere Pakete beachten) oder die
@code{ASPELL_DICT_DIR}-Variable (auf die das Rechtschreibprüfprogramm
GNU@tie{}Aspell achtet), welche beide auf ein einzelnes Verzeichnis zeigen
müssen.

@item @code{file-type} (Vorgabe: @code{'directory})
Welche Art von Datei passt@tie{}– hier kann @code{'directory} (für
Verzeichnisse) oder @code{'regular} (für reguläre Dateien) angegeben werden,
aber auch jedes andere Symbol, was @code{stat:type} zurückliefern kann
(siehe @ref{File System, @code{stat},, guile, Referenzhandbuch zu GNU
Guile}).

In the @env{XML_CATALOG_FILES} example above, we would match regular files;
in the Python example, we would match directories.

@item @code{file-pattern} (Vorgabe: @code{#f})
Das hier muss entweder @code{#f} oder ein regulärer Ausdruck sein, der
angibt, welche Dateien @emph{innerhalb} der mit dem Feld @code{files}
angegebenen Unterverzeichnisse darauf passen.

Again, the @env{XML_CATALOG_FILES} example shows a situation where this is
needed.
@end table
@end deftp

Manche Suchpfade sind an mehr als ein Paket gekoppelt. Um sie nicht doppelt
und dreifach zu spezifizieren, sind manche davon vordefiniert in @code{(guix
search-paths)}.

@defvar $SGML_CATALOG_FILES
@defvarx $XML_CATALOG_FILES
These two search paths indicate where the
@url{https://www.oasis-open.org/specs/a401.htm,TR9401 catalog}@footnote{
Alternatively known as SGML catalog.} or
@url{https://www.oasis-open.org/committees/download.php/14809/xml-catalogs.html,
XML catalog} files can be found.
@end defvar

@defvar $SSL_CERT_DIR
@defvarx $SSL_CERT_FILE
Mit diesen beiden Suchpfaden wird angegeben, wo X.509-Zertifikate zu finden
sind (siehe @ref{X.509-Zertifikate}).
@end defvar

Diese vordefinierten Suchpfade kann man wie im folgenden Beispiel benutzen:

@lisp
(package
  (name "curl")
  ;; eigentlich stehen hier noch ein paar Felder …
  (native-search-paths (list $SSL_CERT_DIR $SSL_CERT_FILE)))
@end lisp

Wie macht man aus Suchpfadspezifikationen einerseits und einem Haufen
Verzeichnisse andererseits nun eine Menge von Definitionen für
Umgebungsvariable? Das ist die Aufgabe von @code{evaluate-search-paths}.

@deffn {Prozedur} evaluate-search-paths Suchpfade Verzeichnisse [getenv]
Die @var{Suchpfade} auswerten. Sie werden als Liste von
Suchpfadspezifikationen übergeben und untersucht werden @var{Verzeichnisse},
eine Liste von Verzeichnisnamen. Das Ergebnis wird als Liste von Paaren aus
Spezifikation und Wert zurückgeliefert. Wenn Sie @var{getenv} angeben,
werden darüber die momentanen Festlegungen erfasst und nur die @emph{nicht}
bereits gültigen gemeldet.
@end deffn

Das Modul @code{(guix profiles)} enthält eine zugeschnittenere Hilfsprozedur
@code{load-profile}, mit der Umgebungsvariable eines Profils festgelegt
werden.

@node Der Store
@section Der Store

@cindex store
@cindex Store-Objekte
@cindex Store-Pfade

Konzeptionell ist der @dfn{Store} der Ort, wo Ableitungen nach erfolgreicher
Erstellung gespeichert werden@tie{}– standardmäßig finden Sie ihn in
@file{/gnu/store}. Unterverzeichnisse im Store werden @dfn{Store-Objekte}
oder manchmal auch @dfn{Store-Pfade} genannt. Mit dem Store ist eine
Datenbank assoziiert, die Informationen enthält wie zum Beispiel, welche
Store-Pfade jeder Store-Pfad jeweils referenziert, und eine Liste, welche
Store-Objekte @emph{gültig} sind, also Ergebnisse erfolgreicher Erstellungen
sind. Die Datenbank befindet sich in @file{@var{localstatedir}/guix/db},
wobei @var{localstatedir} das mit @option{--localstatedir} bei der
Ausführung von „configure“ angegebene Zustandsverzeichnis ist, normalerweise
@file{/var}.

Auf den Store wird @emph{nur} durch den Daemon im Auftrag seiner Clients
zugegriffen (siehe @ref{Aufruf des guix-daemon}). Um den Store zu verändern,
verbinden sich Clients über einen Unix-Socket mit dem Daemon, senden ihm
entsprechende Anfragen und lesen dann dessen Antwort@tie{}– so etwas nennt
sich entfernter Prozeduraufruf (englisch „Remote Procedure Call“ oder kurz
RPC).

@quotation Anmerkung
Benutzer dürfen @emph{niemals} Dateien in @file{/gnu/store} direkt
verändern, sonst wären diese nicht mehr konsistent und die Grundannahmen im
funktionalen Modell von Guix, dass die Objekte unveränderlich sind, wären
dahin (siehe @ref{Einführung}).

Siehe @ref{Aufruf von guix gc, @command{guix gc --verify}} für Informationen,
wie die Integrität des Stores überprüft und nach versehentlichen
Veränderungen unter Umständen wiederhergestellt werden kann.
@end quotation

Das Modul @code{(guix store)} bietet Prozeduren an, um sich mit dem Daemon
zu verbinden und entfernte Prozeduraufrufe durchzuführen. Diese werden im
Folgenden beschrieben. Das vorgegebene Verhalten von @code{open-connection},
und daher allen @command{guix}-Befehlen, ist, sich mit dem lokalen Daemon
oder dem an der in der Umgebungsvariablen @env{GUIX_DAEMON_SOCKET} angegeben
URL zu verbinden.

@defvr {Umgebungsvariable} GUIX_DAEMON_SOCKET
Ist diese Variable gesetzt, dann sollte ihr Wert ein Dateipfad oder eine URI
sein, worüber man sich mit dem Daemon verbinden kann. Ist der Wert der Pfad
zu einer Datei, bezeichnet dieser einen Unix-Socket, mit dem eine Verbindung
hergestellt werden soll. Ist er eine URI, so werden folgende URI-Schemata
unterstützt:

@table @code
@item file
@itemx unix
Für Unix-Sockets. @code{file:///var/guix/daemon-socket/socket} kann
gleichbedeutend auch als @file{/var/guix/daemon-socket/socket} angegeben
werden.

@item guix
@cindex Daemon, Fernzugriff
@cindex Fernzugriff auf den Daemon
@cindex Daemon, Einrichten auf Clustern
@cindex Cluster, Einrichtung des Daemons
Solche URIs benennen Verbindungen über TCP/IP ohne Verschlüsselung oder
Authentifizierung des entfernten Rechners. Die URI muss den Hostnamen, also
den Rechnernamen des entfernten Rechners, und optional eine Portnummer
angeben (sonst wird als Vorgabe der Port 44146 benutzt):

@example
guix://master.guix.example.org:1234
@end example

Diese Konfiguration ist für lokale Netzwerke wie etwa in Rechen-Clustern
geeignet, wo sich nur vertrauenswürdige Knoten mit dem Erstellungs-Daemon
z.B.@: unter @code{master.guix.example.org} verbinden können.

Die Befehlszeilenoption @option{--listen} von @command{guix-daemon} kann
benutzt werden, damit er auf TCP-Verbindungen lauscht (siehe @ref{Aufruf des guix-daemon, @option{--listen}}).

@item ssh
@cindex SSH-Zugriff auf Erstellungs-Daemons
Mit solchen URIs kann eine Verbindung zu einem entfernten Daemon über SSH
hergestellt werden. Diese Funktionalität setzt Guile-SSH voraus (siehe
@ref{Voraussetzungen}) sowie eine funktionierende @command{guile}-Binärdatei,
deren Ort im @env{PATH} der Zielmaschine eingetragen ist. Authentisierung
über einen öffentlichen Schlüssel oder GSSAPI ist möglich. Eine typische URL
sieht so aus:

@example
ssh://charlie@@guix.example.org:22
@end example

Was @command{guix copy} betrifft, richtet es sich nach den üblichen
OpenSSH-Client-Konfigurationsdateien (siehe @ref{Aufruf von guix copy}).
@end table

In Zukunft könnten weitere URI-Schemata unterstützt werden.

@c XXX: Remove this note when the protocol incurs fewer round trips
@c and when (guix derivations) no longer relies on file system access.
@quotation Anmerkung
Die Fähigkeit, sich mit entfernten Erstellungs-Daemons zu verbinden, sehen
wir als experimentell an, Stand @value{VERSION}. Bitte diskutieren Sie mit
uns jegliche Probleme oder Vorschläge, die Sie haben könnten (siehe
@ref{Mitwirken}).
@end quotation
@end defvr

@deffn {Prozedur} open-connection [URI] [#:reserve-space? #t]
Sich mit dem Daemon über den Unix-Socket an @var{URI} verbinden (einer
Zeichenkette). Wenn @var{reserve-space?} wahr ist, lässt ihn das etwas
zusätzlichen Speicher im Dateisystem reservieren, damit der Müllsammler auch
dann noch funktioniert, wenn die Platte zu voll wird. Liefert ein
Server-Objekt.

@var{URI} nimmt standardmäßig den Wert von @code{%default-socket-path} an,
was dem bei der Installation mit dem Aufruf von @command{configure}
ausgewählten Vorgabeort entspricht, gemäß den Befehlszeilenoptionen, mit
denen @command{configure} aufgerufen wurde.
@end deffn

@deffn {Prozedur} close-connection Server
Die Verbindung zum @var{Server} trennen.
@end deffn

@defvar current-build-output-port
Diese Variable ist an einen SRFI-39-Parameter gebunden, der auf den
Scheme-Port verweist, an den vom Daemon empfangene Erstellungsprotokolle und
Fehlerprotokolle geschrieben werden sollen.
@end defvar

Prozeduren, die entfernte Prozeduraufrufe durchführen, nehmen immer ein
Server-Objekt als ihr erstes Argument.

@cindex ungültige Store-Objekte
@deffn {Prozedur} valid-path? Server Pfad
Liefert @code{#t}, wenn der @var{Pfad} ein gültiges Store-Objekt benennt,
und sonst @code{#f} (ein ungültiges Objekt kann auf der Platte gespeichert
sein, tatsächlich aber ungültig sein, zum Beispiel weil es das Ergebnis
einer abgebrochenen oder fehlgeschlagenen Erstellung ist).

Ein @code{&store-protocol-error}-Fehlerzustand wird ausgelöst, wenn der
@var{Pfad} nicht mit dem Store-Verzeichnis als Präfix beginnt
(@file{/gnu/store}).
@end deffn

@deffn {Prozedur} add-text-to-store Server Name Text [Referenzen]
Den @var{Text} im Store in einer Datei namens @var{Name} ablegen und ihren
Store-Pfad zurückliefern. @var{Referenzen} ist die Liste der Store-Pfade,
die der Store-Pfad dann referenzieren soll.
@end deffn

@deffn {Prozedur} build-derivations Store Ableitungen [Modus]
Die @var{Ableitungen} erstellen (eine Liste von
@code{<derivation>}-Objekten, @file{.drv}-Dateinamen oder Paaren aus je
Ableitung und Ausgabe. Dabei gilt der angegebene @var{Modus}@tie{}–
vorgegeben ist @code{(build-mode normal)}.
@end deffn

Es sei erwähnt, dass im Modul @code{(guix monads)} eine Monade sowie
monadische Versionen obiger Prozeduren angeboten werden, damit an Code, der
auf den Store zugreift, bequemer gearbeitet werden kann (siehe @ref{Die Store-Monade}).

@c FIXME
@i{Dieser Abschnitt ist im Moment noch unvollständig.}

@node Ableitungen
@section Ableitungen

@cindex Ableitungen
Systemnahe Erstellungsaktionen sowie die Umgebung, in der selbige
durchzuführen sind, werden durch @dfn{Ableitungen} dargestellt. Eine
Ableitung enthält folgende Informationen:

@itemize
@item
Die Ausgaben, die die Ableitung hat. Ableitungen erzeugen mindestens eine
Datei bzw. ein Verzeichnis im Store, können aber auch mehrere erzeugen.

@item
@cindex Erstellungszeitabhängigkeiten
@cindex Abhängigkeiten zur Erstellungszeit
Die Eingaben der Ableitung, also Abhängigkeiten zur Zeit ihrer Erstellung,
die entweder andere Ableitungen oder einfache Dateien im Store sind (wie
Patches, Erstellungsskripts usw.).

@item
Das System, wofür mit der Ableitung erstellt wird, also ihr Ziel@tie{}–
z.B.@: @code{x86_64-linux}.

@item
Der Dateiname eines Erstellungsskripts im Store, zusammen mit den
Argumenten, mit denen es aufgerufen werden soll.

@item
Eine Liste zu definierender Umgebungsvariabler.

@end itemize

@cindex Ableitungspfad
Ableitungen ermöglichen es den Clients des Daemons, diesem
Erstellungsaktionen für den Store mitzuteilen. Es gibt davon zwei Arten,
sowohl Darstellungen im Arbeitsspeicher jeweils für Client und Daemon als
auch Dateien im Store, deren Namen auf @file{.drv} enden@tie{}– diese
Dateien werden als @dfn{Ableitungspfade} bezeichnet. Ableitungspfade können
an die Prozedur @code{build-derivations} übergeben werden, damit die darin
niedergeschriebenen Erstellungsaktionen durchgeführt werden (siehe @ref{Der Store}).

@cindex Ableitungen mit fester Ausgabe
Operationen wie das Herunterladen von Dateien und Checkouts von unter
Versionskontrolle stehenden Quelldateien, bei denen der Hash des Inhalts im
Voraus bekannt ist, werden als @dfn{Ableitungen mit fester Ausgabe}
modelliert. Anders als reguläre Ableitungen sind die Ausgaben von
Ableitungen mit fester Ausgabe unabhängig von ihren Eingaben@tie{}– z.B.@:
liefert das Herunterladen desselben Quellcodes dasselbe Ergebnis unabhängig
davon, mit welcher Methode und welchen Werkzeugen er heruntergeladen wurde.

@cindex references
@cindex Laufzeitabhängigkeiten
@cindex Abhängigkeiten, zur Laufzeit
Den Ausgaben von Ableitungen@tie{}– d.h.@: Erstellungergebnissen@tie{}– ist
eine Liste von @dfn{Referenzen} zugeordnet, die auch der entfernte
Prozeduraufruf @code{references} oder der Befehl @command{guix gc
--references} liefert (siehe @ref{Aufruf von guix gc}). Referenzen sind die
Menge der Laufzeitabhängigkeiten von Erstellungsergebnissen. Referenzen sind
eine Teilmenge der Eingaben von Ableitungen; die Teilmenge wird automatisch
ermittelt, indem der Erstellungsdaemon alle Dateien unter den Ausgaben nach
Referenzen durchsucht.

Das Modul @code{(guix derivations)} stellt eine Repräsentation von
Ableitungen als Scheme-Objekte zur Verfügung, zusammen mit Prozeduren, um
Ableitungen zu erzeugen und zu manipulieren. Die am wenigsten abstrahierte
Methode, eine Ableitung zu erzeugen, ist mit der Prozedur @code{derivation}:

@deffn {Prozedur} derivation Store Name Ersteller Argumente @
  [#:outputs '("out")] [#:hash #f] [#:hash-algo #f] [#:recursive? #f] @
[#:inputs '()] [#:env-vars '()] [#:system (%current-system)] @
[#:references-graphs #f] [#:allowed-references #f] @
[#:disallowed-references #f] [#:leaked-env-vars #f] [#:local-build? #f] @
[#:substitutable? #t] [#:properties '()]
Eine Ableitungen mit den @var{Argumente}n erstellen und das resultierende
@code{<derivation>}-Objekt liefern.

Wurden @var{hash} und @var{hash-algo} angegeben, wird eine @dfn{Ableitung
mit fester Ausgabe} erzeugt@tie{}– d.h.@: eine, deren Ausgabe schon im
Voraus bekannt ist, wie z.B.@: beim Herunterladen einer Datei. Wenn des
Weiteren auch @var{recursive?} wahr ist, darf die Ableitung mit fester
Ausgabe eine ausführbare Datei oder ein Verzeichnis sein und @var{hash} muss
die Prüfsumme eines Archivs mit dieser Ausgabe sein.

Ist @var{references-graphs} wahr, dann muss es eine Liste von Paaren aus je
einem Dateinamen und einem Store-Pfad sein. In diesem Fall wird der
Referenzengraph jedes Store-Pfads in einer Datei mit dem angegebenen Namen
in der Erstellungsumgebung zugänglich gemacht, in einem einfachen
Text-Format.

Ist @var{allowed-references} ein wahr, muss es eine Liste von Store-Objekten
oder Ausgaben sein, die die Ausgabe der Ableitung referenzieren darf. Ebenso
muss @var{disallowed-references}, wenn es auf wahr gesetzt ist, eine Liste
von Dingen bezeichnen, die die Ausgaben @emph{nicht} referenzieren dürfen.

Ist @var{leaked-env-vars} wahr, muss es eine Liste von Zeichenketten sein,
die Umgebungsvariable benennen, die aus der Umgebung des Daemons in die
Erstellungsumgebung überlaufen@tie{}– ein „Leck“, englisch „leak“. Dies kann
nur in Ableitungen mit fester Ausgabe benutzt werden, also wenn @var{hash}
wahr ist. So ein Leck kann zum Beispiel benutzt werden, um Variable wie
@code{http_proxy} an Ableitungen zu übergeben, die darüber Dateien
herunterladen.

Ist @var{local-build?} wahr, wird die Ableitung als schlechter Kandidat für
das Auslagern deklariert, der besser lokal erstellt werden sollte (siehe
@ref{Auslagern des Daemons einrichten}). Dies betrifft kleine Ableitungen, wo das
Übertragen der Daten aufwendiger als ihre Erstellung ist.

Ist @var{substitutable?} falsch, wird deklariert, dass für die Ausgabe der
Ableitung keine Substitute benutzt werden sollen (siehe
@ref{Substitute}). Das ist nützlich, wenn Pakete erstellt werden, die
Details über den Prozessorbefehlssatz des Wirtssystems auslesen.

@var{properties} muss eine assoziative Liste enthalten, die „Eigenschaften“
der Ableitungen beschreibt. Sie wird genau so, wie sie ist, in der Ableitung
gespeichert.
@end deffn

@noindent
Hier ist ein Beispiel mit einem Shell-Skript, das als Ersteller benutzt
wird. Es wird angenommen, dass @var{Store} eine offene Verbindung zum Daemon
ist und @var{bash} auf eine ausführbare Bash im Store verweist:

@lisp
(use-modules (guix utils)
             (guix store)
             (guix derivations))

(let ((builder   ; das Ersteller-Bash-Skript in den Store einfügen
        (add-text-to-store store "my-builder.sh"
                           "echo Hallo Welt > $out\n" '())))
  (derivation store "foo"
              bash `("-e" ,builder)
              #:inputs `((,bash) (,builder))
              #:env-vars '(("HOME" . "/homeless"))))
@result{} #<derivation /gnu/store/…-foo.drv => /gnu/store/…-foo>
@end lisp

Wie man sehen kann, ist es umständlich, diese grundlegende Methode direkt zu
benutzen. Natürlich ist es besser, Erstellungsskripts in Scheme zu
schreiben! Am besten schreibt man den Erstellungscode als „G-Ausdruck“ und
übergibt ihn an @code{gexp->derivation}. Mehr Informationen finden Sie im
Abschnitt @ref{G-Ausdrücke}.

Doch es gab einmal eine Zeit, zu der @code{gexp->derivation} noch nicht
existiert hatte und wo das Zusammenstellen von Ableitungen mit
Scheme-Erstellungscode noch mit @code{build-expression->derivation}
bewerkstelligt wurde, was im Folgenden beschrieben wird. Diese Prozedur gilt
als veraltet und man sollte nunmehr die viel schönere Prozedur
@code{gexp->derivation} benutzen.

@deffn {Prozedur} build-expression->derivation Store Name Ausdruck @
       [#:system (%current-system)] [#:inputs '()] [#:outputs '("out")] @
[#:hash #f] [#:hash-algo #f] [#:recursive? #f] [#:env-vars '()] @
[#:modules '()] [#:references-graphs #f] [#:allowed-references #f] @
[#:disallowed-references #f] [#:local-build? #f] [#:substitutable? #t] @
[#:guile-for-build #f]
Liefert eine Ableitung, die den Scheme-Ausdruck @var{Ausdruck} als Ersteller
einer Ableitung namens @var{Name} ausführt. @var{inputs} muss die Liste der
Eingaben enthalten, jeweils als Tupel @code{(Name Ableitungspfad
Unterableitung)}; wird keine @var{Unterableitung} angegeben, wird
@code{"out"} angenommen. @var{Module} ist eine Liste der Namen von
Guile-Modulen im momentanen Suchpfad, die in den Store kopiert, kompiliert
und zur Verfügung gestellt werden, wenn der @var{Ausdruck} ausgeführt
wird@tie{}– z.B.@: @code{((guix build utils) (guix build
gnu-build-system))}.

Der @var{Ausdruck} wird in einer Umgebung ausgewertet, in der
@code{%outputs} an eine Liste von Ausgabe-/Pfad-Paaren gebunden wurde und in
der @code{%build-inputs} an eine Liste von Zeichenkette-/Ausgabepfad-Paaren
gebunden wurde, die aus den @var{inputs}-Eingaben konstruiert worden
ist. Optional kann in @var{env-vars} eine Liste von Paaren aus Zeichenketten
stehen, die Name und Wert von für den Ersteller sichtbaren
Umgebungsvariablen angeben. Der Ersteller terminiert, indem er @code{exit}
mit dem Ergebnis des @var{Ausdruck}s aufruft; wenn also der @var{Ausdruck}
den Wert @code{#f} liefert, wird angenommen, dass die Erstellung
fehlgeschlagen ist.

@var{Ausdruck} wird mit einer Ableitung @var{guile-for-build} erstellt. Wird
kein @var{guile-for-build} angegeben oder steht es auf @code{#f}, wird
stattdessen der Wert der Fluiden @code{%guile-for-build} benutzt.

Siehe die Erklärungen zur Prozedur @code{derivation} für die Bedeutung von
@var{references-graphs}, @var{allowed-references},
@var{disallowed-references}, @var{local-build?} und @var{substitutable?}.
@end deffn

@noindent
Hier ist ein Beispiel einer Ableitung mit nur einer Ausgabe, die ein
Verzeichnis erzeugt, in dem eine einzelne Datei enthalten ist:

@lisp
(let ((builder '(let ((out (assoc-ref %outputs "out")))
                  (mkdir out)    ; das Verzeichnis
                                 ; /gnu/store/…-goo erstellen
                  (call-with-output-file (string-append out "/test")
                    (lambda (p)
                      (display '(Hallo Guix) p))))))
  (build-expression->derivation store "goo" builder))

@result{} #<derivation /gnu/store/…-goo.drv => …>
@end lisp


@node Die Store-Monade
@section Die Store-Monade

@cindex Monade

Die auf dem Store arbeitenden Prozeduren, die in den vorigen Abschnitten
beschrieben wurden, nehmen alle eine offene Verbindung zum
Erstellungs-Daemon als ihr erstes Argument entgegen. Obwohl das ihnen zu
Grunde liegende Modell funktional ist, weisen sie doch alle Nebenwirkungen
auf oder hängen vom momentanen Zustand des Stores ab.

Ersteres ist umständlich, weil die Verbindung zum Erstellungs-Daemon
zwischen all diesen Funktionen durchgereicht werden muss, so dass eine
Komposition mit Funktionen ohne diesen Parameter unmöglich wird. Letzteres
kann problematisch sein, weil Operationen auf dem Store Nebenwirkungen
und/oder Abhängigkeiten von externem Zustand haben und ihre
Ausführungsreihenfolge deswegen eine Rolle spielt.

@cindex monadische Werte
@cindex monadische Funktionen
Hier kommt das Modul @code{(guix monads)} ins Spiel. Im Rahmen dieses Moduls
können @dfn{Monaden} benutzt werden und dazu gehört insbesondere eine für
unsere Zwecke sehr nützliche Monade, die @dfn{Store-Monade}. Monaden sind
ein Konstrukt, mit dem zwei Dinge möglich sind: eine Assoziation von Werten
mit einem „Kontext“ (in unserem Fall ist das die Verbindung zum Store) und
das Festlegen einer Reihenfolge für Berechnungen (hiermit sind auch Zugriffe
auf den Store gemeint). Werte in einer Monade@tie{}– solche, die mit
weiterem Kontext assoziiert sind@tie{}– werden @dfn{monadische Werte}
genannt; Prozeduren, die solche Werte liefern, heißen @dfn{monadische
Prozeduren}.

Betrachten Sie folgende „normale“ Prozedur:

@lisp
(define (sh-symlink store)
  ;; Eine Ableitung liefern, die mit der ausführbaren Datei „bash“
  ;; symbolisch verknüpft.
  (let* ((drv (package-derivation store bash))
         (out (derivation->output-path drv))
         (sh  (string-append out "/bin/bash")))
    (build-expression->derivation store "sh"
                                  `(symlink ,sh %output))))
@end lisp

Unter Verwendung von @code{(guix monads)} und @code{(guix gexp)} lässt sie
sich als monadische Funktion aufschreiben:

@lisp
(define (sh-symlink)
  ;; Ebenso, liefert aber einen monadischen Wert.
  (mlet %store-monad ((drv (package->derivation bash)))
    (gexp->derivation "sh"
                      #~(symlink (string-append #$drv "/bin/bash")
                                 #$output))))
@end lisp

An der zweiten Version lassen sich mehrere Dinge beobachten: Der Parameter
@code{Store} ist jetzt implizit geworden und wurde in die Aufrufe der
monadischen Prozeduren @code{package->derivation} und
@code{gexp->derivation} „eingefädelt“ und der von @code{package->derivation}
gelieferte monadische Wert wurde mit @code{mlet} statt einem einfachen
@code{let} @dfn{gebunden}.

Wie sich herausstellt, muss man den Aufruf von @code{package->derivation}
nicht einmal aufschreiben, weil er implizit geschieht, wie wir später sehen
werden (siehe @ref{G-Ausdrücke}):

@lisp
(define (sh-symlink)
  (gexp->derivation "sh"
                    #~(symlink (string-append #$bash "/bin/bash")
                               #$output)))
@end lisp

@c See
@c <https://syntaxexclamation.wordpress.com/2014/06/26/escaping-continuations/>
@c for the funny quote.
Die monadische @code{sh-symlink} einfach aufzurufen, bewirkt nichts. Wie
jemand einst sagte: „Mit einer Monade geht man um, wie mit Gefangenen, gegen
die man keine Beweise hat: Man muss sie laufen lassen.“ Um also aus der
Monade auszubrechen und die gewünschte Wirkung zu erzielen, muss man
@code{run-with-store} benutzen:

@lisp
(run-with-store (open-connection) (sh-symlink))
@result{} /gnu/store/…-sh-symlink
@end lisp

Erwähnenswert ist, dass das Modul @code{(guix monad-repl)} die REPL von
Guile um neue „Befehle“ erweitert, mit denen es leichter ist, mit
monadischen Prozeduren umzugehen: @code{run-in-store} und
@code{enter-store-monad} (siehe @ref{Interaktiv mit Guix arbeiten}). Mit
Ersterer wird ein einzelner monadischer Wert durch den Store „laufen
gelassen“:

@example
scheme@@(guile-user)> ,run-in-store (package->derivation hello)
$1 = #<derivation /gnu/store/…-hello-2.9.drv => …>
@end example

Mit Letzterer wird rekursiv eine weitere REPL betreten, in der alle
Rückgabewerte automatisch durch den Store laufen gelassen werden:

@example
scheme@@(guile-user)> ,enter-store-monad
store-monad@@(guile-user) [1]> (package->derivation hello)
$2 = #<derivation /gnu/store/…-hello-2.9.drv => …>
store-monad@@(guile-user) [1]> (text-file "foo" "Hallo!")
$3 = "/gnu/store/…-foo"
store-monad@@(guile-user) [1]> ,q
scheme@@(guile-user)>
@end example

@noindent
Beachten Sie, dass in einer @code{store-monad}-REPL keine nicht-monadischen
Werte zurückgeliefert werden können.

Es gibt noch andere Meta-Befehle auf der REPL, so etwa @code{,build}, womit
ein dateiartiges Objekt erstellt wird (siehe @ref{Interaktiv mit Guix arbeiten}).

Die wichtigsten syntaktischen Formen, um mit Monaden im Allgemeinen
umzugehen, werden im Modul @code{(guix monads)} bereitgestellt und sind im
Folgenden beschrieben.

@defmac with-monad Monade Rumpf …
Alle @code{>>=}- oder @code{return}-Formen im @var{Rumpf} in der
@var{Monade} auswerten.
@end defmac

@defmac return Wert
Einen monadischen Wert liefern, der den übergebenen @var{Wert} kapselt.
@end defmac

@defmac >>= mWert mProz …
Den monadischen Wert @var{mWert} @dfn{binden}, wobei sein „Inhalt“ an die
monadischen Prozeduren @var{mProz}…@: übergeben wird@footnote{Diese
Operation wird gemeinhin „bind“ genannt, aber mit diesem Begriff wird in
Guile eine völlig andere Prozedur bezeichnet, die nichts damit zu tun
hat. Also benutzen wir dieses etwas kryptische Symbol als Erbe der
Haskell-Programmiersprache.}. Es kann eine einzelne @var{mProz} oder mehrere
davon geben, wie in diesem Beispiel:

@lisp
(run-with-state
    (with-monad %state-monad
      (>>= (return 1)
           (lambda (x) (return (+ 1 x)))
           (lambda (x) (return (* 2 x)))))
  'irgendein-Zustand)

@result{} 4
@result{} irgendein-Zustand
@end lisp
@end defmac

@defmac mlet Monade ((Variable mWert) …) Rumpf …
@defmacx mlet* Monade ((Variable mWert) …) Rumpf …
Die @var{Variable}n an die monadischen Werte @var{mWert} im @var{Rumpf}
binden, der eine Folge von Ausdrücken ist. Wie beim bind-Operator kann man
es sich vorstellen als „Auspacken“ des rohen, nicht-monadischen Werts, der
im @var{mWert} steckt, wobei anschließend dieser rohe, nicht-monadische Wert
im Sichtbarkeitsbereich des @var{Rumpf}s von der @var{Variable}n bezeichnet
wird. Die Form (@var{Variable} -> @var{Wert}) bindet die @var{Variable} an
den „normalen“ @var{Wert}, wie es @code{let} tun würde. Die
Bindungsoperation geschieht in der Reihenfolge von links nach rechts. Der
letzte Ausdruck des @var{Rumpfs} muss ein monadischer Ausdruck sein und
dessen Ergebnis wird das Ergebnis von @code{mlet} oder @code{mlet*} werden,
wenn es durch die @var{Monad} laufen gelassen wurde.

@code{mlet*} verhält sich gegenüber @code{mlet} wie @code{let*} gegenüber
@code{let} (siehe @ref{Local Bindings,,, guile, Referenzhandbuch zu GNU
Guile}).
@end defmac

@defmac mbegin Monade mAusdruck …
Der Reihe nach den @var{mAusdruck} und die nachfolgenden monadischen
Ausdrücke binden und als Ergebnis das des letzten Ausdrucks liefern. Jeder
Ausdruck in der Abfolge muss ein monadischer Ausdruck sein.

Dies verhält sich ähnlich wie @code{mlet}, außer dass die Rückgabewerte der
monadischen Prozeduren ignoriert werden. In diesem Sinn verhält es sich
analog zu @code{begin}, nur auf monadischen Ausdrücken.
@end defmac

@defmac mwhen Bedingung mAusdr0 mAusdr* …
Wenn die @var{Bedingung} wahr ist, wird die Folge monadischer Ausdrücke
@var{mAusdr0}..@var{mAusdr*} wie bei @code{mbegin} ausgewertet. Wenn die
@var{Bedingung} falsch ist, wird @code{*unspecified*} („unbestimmt“) in der
momentanen Monade zurückgeliefert. Jeder Ausdruck in der Folge muss ein
monadischer Ausdruck sein.
@end defmac

@defmac munless Bedingung mAusdr0 mAusdr* …
Wenn die @var{Bedingung} falsch ist, wird die Folge monadischer Ausdrücke
@var{mAusdr0}..@var{mAusdr*} wie bei @code{mbegin} ausgewertet. Wenn die
@var{Bedingung} wahr ist, wird @code{*unspecified*} („unbestimmt“) in der
momentanen Monade zurückgeliefert. Jeder Ausdruck in der Folge muss ein
monadischer Ausdruck sein.
@end defmac

@cindex Zustandsmonade
Das Modul @code{(guix monads)} macht die @dfn{Zustandsmonade} (englisch
„state monad“) verfügbar, mit der ein zusätzlicher Wert@tie{}– der
Zustand@tie{}– durch die monadischen Prozeduraufrufe @emph{gefädelt} werden
kann.

@defvar %state-monad
Die Zustandsmonade. Prozeduren in der Zustandsmonade können auf den
gefädelten Zustand zugreifen und ihn verändern.

Betrachten Sie das folgende Beispiel. Die Prozedur @code{Quadrat} liefert
einen Wert in der Zustandsmonade zurück. Sie liefert das Quadrat ihres
Arguments, aber sie inkrementiert auch den momentanen Zustandswert:

@lisp
(define (Quadrat x)
  (mlet %state-monad ((Anzahl (current-state)))
    (mbegin %state-monad
      (set-current-state (+ 1 Anzahl))
      (return (* x x)))))

(run-with-state (sequence %state-monad (map Quadrat (iota 3))) 0)
@result{} (0 1 4)
@result{} 3
@end lisp

Wird das „durch“ die Zustandsmonade @code{%state-monad} laufen gelassen,
erhalten wir jenen zusätzlichen Zustandswert, der der Anzahl der Aufrufe von
@code{Quadrat} entspricht.
@end defvar

@deffn {Monadische Prozedur} current-state
Liefert den momentanen Zustand als einen monadischen Wert.
@end deffn

@deffn {Monadische Prozedur} set-current-state @var{Wert}
Setzt den momentanen Zustand auf @var{Wert} und liefert den vorherigen
Zustand als einen monadischen Wert.
@end deffn

@deffn {Monadische Prozedur} state-push @var{Wert}
Hängt den @var{Wert} vorne an den momentanen Zustand an, der eine Liste sein
muss. Liefert den vorherigen Zustand als monadischen Wert.
@end deffn

@deffn {Monadische Prozedur} state-pop
Entfernt einen Wert vorne vom momentanen Zustand und liefert ihn als
monadischen Wert zurück. Dabei wird angenommen, dass es sich beim Zustand um
eine Liste handelt.
@end deffn

@deffn {Prozedur} run-with-state mWert [Zustand]
Den monadischen Wert @var{mWert} mit @var{Zustand} als initialem Zustand
laufen lassen. Dies liefert zwei Werte: den Ergebniswert und den
Ergebniszustand.
@end deffn

Die zentrale Schnittstelle zur Store-Monade, wie sie vom Modul @code{(guix
store)} angeboten wird, ist die Folgende:

@defvar %store-monad
Die Store-Monade@tie{}– ein anderer Name für @code{%state-monad}.

Werte in der Store-Monade kapseln Zugriffe auf den Store. Sobald ihre
Wirkung gebraucht wird, muss ein Wert der Store-Monade „ausgewertet“ werden,
indem er an die Prozedur @code{run-with-store} übergeben wird (siehe unten).
@end defvar

@deffn {Prozedur} run-with-store Store mWert @
  [#:guile-for-build] [#:system (%current-system)]
Den @var{mWert}, einen monadischen Wert in der Store-Monade, in der offenen
Verbindung @var{Store} laufen lassen.
@end deffn

@deffn {Monadische Prozedur} text-file @var{Name} @var{Text} [@var{Referenzen}]
Als monadischen Wert den absoluten Dateinamen im Store für eine Datei
liefern, deren Inhalt der der Zeichenkette @var{Text} ist. @var{Referenzen}
ist dabei eine Liste von Store-Objekten, die die Ergebnis-Textdatei
referenzieren wird; der Vorgabewert ist die leere Liste.
@end deffn

@deffn {Monadische Prozedur} binary-file @var{Name} @var{Daten} [@var{Referenzen}]
Den absoluten Dateinamen im Store als monadischen Wert für eine Datei
liefern, deren Inhalt der des Byte-Vektors @var{Daten} ist. @var{Referenzen}
ist dabei eine Liste von Store-Objekten, die die Ergebnis-Binärdatei
referenzieren wird; der Vorgabewert ist die leere Liste.
@end deffn

@deffn {Monadische Prozedur} interned-file @var{Datei} [@var{Name}] @
         [#:recursive? #t] [#:select? (const #t)]
Liefert den Namen der @var{Datei}, nachdem sie in den Store interniert
wurde. Dabei wird der @var{Name} als ihr Store-Name verwendet, oder, wenn
kein @var{Name} angegeben wurde, der Basisname der @var{Datei}.

Ist @var{recursive?} wahr, werden in der @var{Datei} enthaltene Dateien
rekursiv hinzugefügt; ist die @var{Datei} eine flache Datei und
@var{recursive?} ist wahr, wird ihr Inhalt in den Store eingelagert und ihre
Berechtigungs-Bits übernommen.

Steht @var{recursive?} auf wahr, wird @code{(@var{select?} @var{Datei}
@var{Stat})} für jeden Verzeichniseintrag aufgerufen, wobei @var{Datei} der
absolute Dateiname und @var{Stat} das Ergebnis von @code{lstat} ist, außer
auf den Einträgen, wo @var{select?} keinen wahren Wert liefert.

Folgendes Beispiel fügt eine Datei unter zwei verschiedenen Namen in den
Store ein:

@lisp
(run-with-store (open-connection)
  (mlet %store-monad ((a (interned-file "README"))
                      (b (interned-file "README" "LEGU-MIN")))
    (return (list a b))))

@result{} ("/gnu/store/rwm…-README" "/gnu/store/44i…-LEGU-MIN")
@end lisp

@end deffn

Das Modul @code{(guix packages)} exportiert die folgenden paketbezogenen
monadischen Prozeduren:

@deffn {Monadische Prozedur} package-file @var{Paket} [@var{Datei}] @
       [#:system (%current-system)] [#:target #f] @ [#:output "out"]
Liefert als monadischen Wert den absoluten Dateinamen der @var{Datei}
innerhalb des Ausgabeverzeichnisses @var{output} des @var{Paket}s. Wird
keine @var{Datei} angegeben, wird der Name des Ausgabeverzeichnisses
@var{output} für das @var{Paket} zurückgeliefert. Ist @var{target} wahr,
wird sein Wert als das Zielsystem bezeichnendes Tripel zum Cross-Kompilieren
benutzt.

Beachten Sie, dass durch diese Prozedur das @var{Paket} @emph{nicht}
erstellt wird, also muss ihr Ergebnis keine bereits existierende Datei
bezeichnen, kann aber. Wir empfehlen, diese Prozedur nur dann zu benutzen,
wenn Sie wissen, was Sie tun.
@end deffn

@deffn {Monadische Prozedur} package->derivation @var{Paket} [@var{System}]
@deffnx {Monadische Prozedur} package->cross-derivation @var{Paket} @
          @var{Ziel} [@var{System}]
Monadische Version von @code{package-derivation} und
@code{package-cross-derivation} (siehe @ref{Pakete definieren}).
@end deffn


@node G-Ausdrücke
@section G-Ausdrücke

@cindex G-Ausdruck
@cindex Erstellungscode maskieren
Es gibt also „Ableitungen“, die eine Abfolge von Erstellungsaktionen
repräsentieren, die durchgeführt werden müssen, um ein Objekt im Store zu
erzeugen (siehe @ref{Ableitungen}). Diese Erstellungsaktionen werden
durchgeführt, nachdem der Daemon gebeten wurde, die Ableitungen tatsächlich
zu erstellen; dann führt der Daemon sie in einer isolierten Umgebung (einem
sogenannten Container) aus (siehe @ref{Aufruf des guix-daemon}).

@cindex Code-Staging
@cindex Staging, von Code
@cindex Schichten von Code
Wenig überraschend ist, dass wir diese Erstellungsaktionen gerne in Scheme
schreiben würden. Wenn wir das tun, bekommen wir zwei verschiedene
@dfn{Schichten} von Scheme-Code@footnote{Der Begriff @dfn{Schicht}, englisch
Stratum, wurde in diesem Kontext von Manuel Serrano et al.@: in ihrer Arbeit
an Hop geprägt. Oleg Kiselyov, der aufschlussreiche
@url{http://okmij.org/ftp/meta-programming/#meta-scheme, Essays und Code zu
diesem Thema} geschrieben hat, nennt diese Art der Code-Generierung
@dfn{Staging}, deutsch etwa Inszenierung bzw.@: Aufführung.}: den
„wirtsseitigen Code“ („host code“)@tie{}– also Code, der Pakete definiert,
mit dem Daemon kommuniziert etc.@:@tie{}– und den „erstellungsseitigen Code“
(„build code“)@tie{}– also Code, der die Erstellungsaktionen auch wirklich
umsetzt, indem Dateien erstellt werden, @command{make} aufgerufen wird und
so weiter (siehe @ref{Erstellungsphasen}).

Um eine Ableitung und ihre Erstellungsaktionen zu beschreiben, muss man
normalerweise erstellungsseitigen Code im wirtsseitigen Code einbetten. Das
bedeutet, man behandelt den erstellungsseitigen Code als Daten, was wegen
der Homoikonizität von Scheme@tie{}– dass Code genauso als Daten
repräsentiert werden kann@tie{}– sehr praktisch ist. Doch brauchen wir hier
mehr als nur den normalen Quasimaskierungsmechanismus mit @code{quasiquote}
in Scheme, wenn wir Erstellungsausdrücke konstruieren möchten.

Das Modul @code{(guix gexp)} implementiert @dfn{G-Ausdrücke}, eine Form von
S-Ausdrücken, die zu Erstellungsausdrücken angepasst wurden. G-Ausdrücke
(englisch „G-expressions“, kurz @dfn{Gexps}) setzen sich grundlegend aus
drei syntaktischen Formen zusammen: @code{gexp}, @code{ungexp} und
@code{ungexp-splicing} (alternativ einfach: @code{#~}, @code{#$} und
@code{#$@@}), die jeweils mit @code{quasiquote}, @code{unquote} und
@code{unquote-splicing} vergleichbar sind (siehe @ref{Expression Syntax,
@code{quasiquote},, guile, Referenzhandbuch zu GNU Guile}). Es gibt aber
auch erhebliche Unterschiede:

@itemize
@item
G-Ausdrücke sind dafür gedacht, in eine Datei geschrieben zu werden, wo sie
von anderen Prozessen ausgeführt oder manipuliert werden können.

@item
Wenn ein abstraktes Objekt wie ein Paket oder eine Ableitung innerhalb eines
G-Ausdrucks demaskiert wird, ist das Ergebnis davon dasselbe, wie wenn
dessen Ausgabedateiname genannt worden wäre.

@item
G-Ausdrücke tragen Informationen über die Pakete oder Ableitungen mit sich,
auf die sie sich beziehen, und diese Abhängigkeiten werden automatisch zu
den sie benutzenden Erstellungsprozessen als Eingaben hinzugefügt.
@end itemize

@cindex Herunterbrechen, von abstrakten Objekten in G-Ausdrücken
Dieser Mechanismus ist nicht auf Pakete und Ableitung beschränkt: Es können
@dfn{Compiler} definiert werden, die weitere abstrakte, hochsprachliche
Objekte auf Ableitungen oder Dateien im Store „herunterbrechen“, womit diese
Objekte dann auch in G-Ausdrücken eingefügt werden können. Zum Beispiel sind
„dateiartige Objekte“ ein nützlicher Typ solcher abstrakter Objekte. Mit
ihnen können Dateien leicht in den Store eingefügt und von Ableitungen und
anderem referenziert werden (siehe unten @code{local-file} und
@code{plain-file}).

Zur Veranschaulichung dieser Idee soll uns dieses Beispiel eines G-Ausdrucks
dienen:

@lisp
(define build-exp
  #~(begin
      (mkdir #$output)
      (chdir #$output)
      (symlink (string-append #$coreutils "/bin/ls")
               "list-files")))
@end lisp

Indem wir diesen G-Ausdruck an @code{gexp->derivation} übergeben, bekommen
wir eine Ableitung, die ein Verzeichnis mit genau einer symbolischen
Verknüpfung auf @file{/gnu/store/…-coreutils-8.22/bin/ls} erstellt:

@lisp
(gexp->derivation "das-ding" build-exp)
@end lisp

Wie man es erwarten würde, wird die Zeichenkette
@code{"/gnu/store/…-coreutils-8.22"} anstelle der Referenzen auf das Paket
@var{coreutils} im eigentlichen Erstellungscode eingefügt und
@var{coreutils} automatisch zu einer Eingabe der Ableitung gemacht. Genauso
wird auch @code{#$output} (was äquivalent zur Schreibweise @code{(ungexp
output)} ist) ersetzt durch eine Zeichenkette mit dem Namen der Ausgabe der
Ableitung.

@cindex Cross-Kompilieren
Im Kontext der Cross-Kompilierung bietet es sich an, zwischen Referenzen auf
die @emph{native} Erstellung eines Pakets@tie{}– also der, die auf dem
Wirtssystem ausgeführt werden kann@tie{}– und Referenzen auf
Cross-Erstellungen eines Pakets zu unterscheiden. Hierfür spielt @code{#+}
dieselbe Rolle wie @code{#$}, steht aber für eine Referenz auf eine native
Paketerstellung.

@lisp
(gexp->derivation "vi"
   #~(begin
       (mkdir #$output)
       (mkdir (string-append #$output "/bin"))
       (system* (string-append #+coreutils "/bin/ln")
                "-s"
                (string-append #$emacs "/bin/emacs")
                (string-append #$output "/bin/vi")))
   #:target "aarch64-linux-gnu")
@end lisp

@noindent
Im obigen Beispiel wird die native Erstellung der @var{coreutils} benutzt,
damit @command{ln} tatsächlich auf dem Wirtssystem ausgeführt werden kann,
aber danach die cross-kompilierte Erstellung von @var{emacs} referenziert.

@cindex importierte Module, in G-Ausdrücken
@findex with-imported-modules
Eine weitere Funktionalität von G-Ausdrücken stellen @dfn{importierte
Module} dar. Manchmal will man bestimmte Guile-Module von der „wirtsseitigen
Umgebung“ im G-Ausdruck benutzen können, deswegen sollten diese Module in
die „erstellungsseitige Umgebung“ importiert werden. Die
@code{with-imported-modules}-Form macht das möglich:

@lisp
(let ((build (with-imported-modules '((guix build utils))
               #~(begin
                   (use-modules (guix build utils))
                   (mkdir-p (string-append #$output "/bin"))))))
  (gexp->derivation "leeres-Verzeichnis"
                    #~(begin
                        #$build
                        (display "Erfolg!\n")
                        #t)))
@end lisp

@noindent
In diesem Beispiel wird das Modul @code{(guix build utils)} automatisch in
die isolierte Erstellungsumgebung unseres G-Ausdrucks geholt, so dass
@code{(use-modules (guix build utils))} wie erwartet funktioniert.

@cindex Modulabschluss
@findex source-module-closure
Normalerweise möchten Sie, dass der @emph{Abschluss} eines Moduls importiert
wird@tie{}– also das Modul und alle Module, von denen es abhängt@tie{}–
statt nur das Modul selbst. Ansonsten scheitern Versuche, das Modul zu
benutzen, weil seine Modulabhängigkeiten fehlen. Die Prozedur
@code{source-module-closure} berechnet den Abschluss eines Moduls, indem es
den Kopf seiner Quelldatei analysiert, deswegen schafft die Prozedur hier
Abhilfe:

@lisp
(use-modules (guix modules))   ;„source-module-closure“ verfügbar machen

(with-imported-modules (source-module-closure
                         '((guix build utils)
                           (gnu build image)))
  (gexp->derivation "etwas-mit-vm"
                    #~(begin
                        (use-modules (guix build utils)
                                     (gnu build image))
                        …)))
@end lisp

@cindex Erweiterungen, für G-Ausdrücke
@findex with-extensions
Auf die gleiche Art können Sie auch vorgehen, wenn Sie nicht bloß reine
Scheme-Module importieren möchten, sondern auch „Erweiterungen“ wie
Guile-Anbindungen von C-Bibliotheken oder andere „vollumfängliche“
Pakete. Sagen wir, Sie bräuchten das Paket @code{guile-json} auf der
Erstellungsseite, dann könnten Sie es hiermit bekommen:

@lisp
(use-modules (gnu packages guile))  ;für „guile-json“

(with-extensions (list guile-json)
  (gexp->derivation "etwas-mit-json"
                    #~(begin
                        (use-modules (json))
                        …)))
@end lisp

Die syntaktische Form, in der G-Ausdrücke konstruiert werden, ist im
Folgenden zusammengefasst.

@defmac #~@var{Ausdruck}
@defmacx (gexp @var{Ausdruck})
Liefert einen G-Ausdruck, der den @var{Ausdruck} enthält. Der @var{Ausdruck}
kann eine oder mehrere der folgenden Formen enthalten:

@table @code
@item #$@var{Objekt}
@itemx (ungexp @var{Objekt})
Eine Referenz auf das @var{Objekt} einführen. Das @var{Objekt} kann einen
der unterstützten Typen haben, zum Beispiel ein Paket oder eine Ableitung,
so dass die @code{ungexp}-Form durch deren Ausgabedateiname ersetzt
wird@tie{}– z.B.@: @code{"/gnu/store/…-coreutils-8.22}.

Wenn das @var{Objekt} eine Liste ist, wird diese durchlaufen und alle
unterstützten Objekte darin auf diese Weise ersetzt.

Wenn das @var{Objekt} ein anderer G-Ausdruck ist, wird sein Inhalt eingefügt
und seine Abhängigkeiten zu denen des äußeren G-Ausdrucks hinzugefügt.

Wenn das @var{Objekt} eine andere Art von Objekt ist, wird es so wie es ist
eingefügt.

@item #$@var{Objekt}:@var{Ausgabe}
@itemx (ungexp @var{Objekt} @var{Ausgabe})
Dies verhält sich wie die Form oben, bezieht sich aber ausdrücklich auf die
angegebene @var{Ausgabe} des @var{Objekt}s@tie{}– dies ist nützlich, wenn
das @var{Objekt} mehrere Ausgaben generiert (siehe @ref{Pakete mit mehreren Ausgaben.}).

Manchmal wird in einem G-Ausdruck grundsätzlich auf die Ausgabe @code{"out"}
von etwas verwiesen, aber man möchte ihn eigentlich mit einem Verweis auf
eine andere Ausgabe einfügen. Für solche Fälle gibt es die Prozedur
@code{gexp-input}. Siehe @ref{gexp-input}.

@item #+@var{Objekt}
@itemx #+@var{Objekt}:@var{Ausgabe}
@itemx (ungexp-native @var{Objekt})
@itemx (ungexp-native @var{Objekt} @var{Ausgabe})
Das Gleiche wie @code{ungexp}, jedoch wird im Kontext einer
Cross-Kompilierung eine Referenz auf die @emph{native} Erstellung des
@var{Objekt}s eingefügt.

@item #$output[:@var{Ausgabe}]
@itemx (ungexp output [@var{Ausgabe}])
Fügt eine Referenz auf die angegebene @var{Ausgabe} dieser Ableitung ein,
oder auf die Hauptausgabe, wenn keine @var{Ausgabe} angegeben wurde.

Dies ist nur bei G-Ausdrücken sinnvoll, die an @code{gexp->derivation}
übergeben werden.

@item #$@@@var{Liste}
@itemx (ungexp-splicing @var{Liste})
Das Gleiche wie oben, jedoch wird nur der Inhalt der @var{Liste} in die
äußere Liste eingespleißt.

@item #+@@@var{Liste}
@itemx (ungexp-native-splicing @var{Liste})
Das Gleiche, aber referenziert werden native Erstellungen der Objekte in der
@var{Liste}.

@end table

G-Ausdrücke, die mit @code{gexp} oder @code{#~} erzeugt wurden, sind zur
Laufzeit Objekte vom Typ @code{gexp?} (siehe unten).
@end defmac

@defmac with-imported-modules Module Rumpf…
Markiert die in @var{Rumpf}…@: definierten G-Ausdrücke, dass sie in ihrer
Ausführungsumgebung die angegebenen @var{Module} brauchen.

Jedes Objekt unter den @var{Module}n kann der Name eines Moduls wie
@code{(guix build utils)} sein, oder es kann nacheinander ein Modulname, ein
Pfeil und ein dateiartiges Objekt sein:

@lisp
`((guix build utils)
  (guix gcrypt)
  ((guix config) => ,(scheme-file "config.scm"
                                  #~(define-module …))))
@end lisp

@noindent
Im Beispiel oben werden die ersten beiden Module vom Suchpfad genommen und
das letzte aus dem angegebenen dateiartigen Objekt erzeugt.

Diese Form hat einen @emph{lexikalischen} Sichtbarkeitsbereich: Sie wirkt
sich auf die direkt in @var{Rumpf}…@: definierten G-Ausdrücke aus, aber
nicht auf jene, die, sagen wir, in aus @var{Rumpf}…@: heraus aufgerufenen
Prozeduren definiert wurden.
@end defmac

@defmac with-extensions Erweiterungen Rumpf…
Markiert die in @var{Rumpf}…@: definierten G-Ausdrücke, dass sie
@var{Erweiterungen} in ihrer Erstellungs- und Ausführungsumgebung
benötigen. @var{Erweiterungen} sind typischerweise eine Liste von
Paketobjekten wie zum Beispiel die im Modul @code{(gnu packages guile)}
definierten.

Konkret werden die unter den @var{Erweiterungen} aufgeführten Pakete zum
Ladepfad hinzugefügt, während die in @var{Rumpf}…@: aufgeführten
importierten Module kompiliert werden und sie werden auch zum Ladepfad des
von @var{Rumpf}…@: gelieferten G-Ausdrucks hinzugefügt.
@end defmac

@deffn {Prozedur} gexp? Objekt
Liefert @code{#t}, wenn das @var{Objekt} ein G-Ausdruck ist.
@end deffn

G-Ausdrücke sind dazu gedacht, auf die Platte geschrieben zu werden,
entweder als Code, der eine Ableitung erstellt, oder als einfache Dateien im
Store. Die monadischen Prozeduren unten ermöglichen Ihnen das (siehe
@ref{Die Store-Monade}, wenn Sie mehr Informationen über Monaden suchen).

@deffn {Monadische Prozedur} gexp->derivation @var{Name} @var{Ausdruck} @
       [#:system (%current-system)] [#:target #f] [#:graft? #t] @
[#:hash #f] [#:hash-algo #f] @ [#:recursive? #f] [#:env-vars '()] @
[#:modules '()] [#:module-path @code{%load-path}] @
[#:effective-version "2.2"] [#:references-graphs #f] @
[#:allowed-references #f] [#:disallowed-references #f] @
[#:leaked-env-vars #f] [#:script-name @
(string-append @var{Name} "-builder")] @
[#:deprecation-warnings #f] [#:local-build? #f] @
[#:substitutable? #t] [#:properties '()] [#:guile-for-build #f]
Liefert eine Ableitung unter dem @var{Name}n, die jeden @var{Ausdruck} (ein
G-Ausdruck) mit @var{guile-for-build} (eine Ableitung) für das @var{System}
erstellt; der @var{Ausdruck} wird dabei in einer Datei namens
@var{script-name} gespeichert. Wenn „@var{target}“ wahr ist, wird es beim
Cross-Kompilieren als Zieltripel für mit @var{Ausdruck} bezeichnete Pakete
benutzt.

@var{modules} gilt als veraltet; stattdessen sollte
@code{with-imported-modules} benutzt werden. Die Bedeutung ist, dass die
@var{Module} im Ausführungskontext des @var{Ausdruck}s verfügbar gemacht
werden; @var{modules} ist dabei eine Liste von Namen von Guile-Modulen, die
im Modulpfad @var{module-path} gesucht werden, um sie in den Store zu
kopieren, zu kompilieren und im Ladepfad während der Ausführung des
@var{Ausdruck}s verfügbar zu machen@tie{}– z.B.@: @code{((guix build utils)
(guix build gnu-build-system))}.

@var{effective-version} bestimmt, unter welcher Zeichenkette die
Erweiterungen des @var{Ausdruck}s zum Suchpfad hinzugefügt werden (siehe
@code{with-extensions})@tie{}– z.B.@: @code{"2.2"}.

@var{graft?} bestimmt, ob vom @var{Ausdruck} benannte Pakete veredelt werden
sollen, falls Veredelungen zur Verfügung stehen.

Ist @var{references-graphs} wahr, muss es eine Liste von Tupeln in einer der
folgenden Formen sein:

@example
(@var{Dateiname} @var{Objekt})
(@var{Dateiname} @var{Objekt} @var{Ausgabe})
(@var{Dateiname} @var{Gexp-Input})
(@var{Dateiname} @var{Store-Objekt})
@end example

Bei jedem Element von @var{references-graphs} wird das rechts Stehende
automatisch zu einer Eingabe des Erstellungsprozesses vom @var{Ausdruck}
gemacht. In der Erstellungsumgebung enthält das, was mit @var{Dateiname}
bezeichnet wird, den Referenzgraphen des entsprechenden Objekts in einem
einfachen Textformat.

@var{allowed-references} muss entweder @code{#f} oder eine Liste von
Ausgabenamen und Paketen sein. Eine solche Liste benennt Store-Objekte, die
das Ergebnis referenzieren darf. Jede Referenz auf ein nicht dort
aufgeführtes Store-Objekt löst einen Erstellungsfehler aus. Genauso
funktioniert @var{disallowed-references}, was eine Liste von Objekten sein
kann, die von den Ausgaben nicht referenziert werden dürfen.

@var{deprecation-warnings} bestimmt, ob beim Kompilieren von Modulen
Warnungen angezeigt werden sollen, wenn auf als veraltet markierten Code
zugegriffen wird. @var{deprecation-warnings} kann @code{#f}, @code{#t} oder
@code{'detailed} (detailliert) sein.

Die anderen Argumente verhalten sich wie bei @code{derivation} (siehe
@ref{Ableitungen}).
@end deffn

@cindex dateiartige Objekte
Die im Folgenden erklärten Prozeduren @code{local-file}, @code{plain-file},
@code{computed-file}, @code{program-file} und @code{scheme-file} liefern
@dfn{dateiartige Objekte}. Das bedeutet, dass diese Objekte, wenn sie in
einem G-Ausdruck demaskiert werden, zu einer Datei im Store
führen. Betrachten Sie zum Beispiel diesen G-Ausdruck:

@lisp
#~(system* #$(file-append glibc "/sbin/nscd") "-f"
           #$(local-file "/tmp/my-nscd.conf"))
@end lisp

Der Effekt hiervon ist, dass @file{/tmp/my-nscd.conf} „interniert“ wird,
indem es in den Store kopiert wird. Sobald er umgeschrieben wurde, zum
Beispiel über @code{gexp->derivation}, referenziert der G-Ausdruck diese
Kopie im @file{/gnu/store}. Die Datei in @file{/tmp} zu bearbeiten oder zu
löschen, hat dann keinen Effekt mehr darauf, was der G-Ausdruck
tut. @code{plain-file} kann in ähnlicher Weise benutzt werden, es
unterscheidet sich aber darin, dass dort der Prozedur der Inhalt der Datei
als eine Zeichenkette übergeben wird.

@deffn {Prozedur} local-file Datei [Name] [#:recursive? #f] [#:select? (const #t)]
Liefert ein Objekt, dass die lokale Datei @var{Datei} repräsentiert und sie
zum Store hinzufügen lässt; dieses Objekt kann in einem G-Ausdruck benutzt
werden. Wurde für die @var{Datei} ein relativer Dateiname als literaler
Ausdruck angegeben, wird sie relativ zur Quelldatei gesucht, in der diese
Form steht. Wurde die @var{Datei} @emph{nicht} als literale Zeichenkette
angegeben, wird sie zur Laufzeit relativ zum aktuellen Arbeitsverzeichnis
gesucht. Die @var{Datei} wird unter dem angegebenen @var{Name}n im Store
abgelegt@tie{}– als Vorgabe wird dabei der Basisname der @var{Datei}
genommen.

Ist @var{recursive?} wahr, werden in der @var{Datei} enthaltene Dateien
rekursiv hinzugefügt; ist die @var{Datei} eine flache Datei und
@var{recursive?} ist wahr, wird ihr Inhalt in den Store eingelagert und ihre
Berechtigungs-Bits übernommen.

Steht @var{recursive?} auf wahr, wird @code{(@var{select?} @var{Datei}
@var{Stat})} für jeden Verzeichniseintrag aufgerufen, wobei @var{Datei} der
absolute Dateiname und @var{Stat} das Ergebnis von @code{lstat} ist, außer
auf den Einträgen, wo @var{select?} keinen wahren Wert liefert.

@findex assume-valid-file-name
@var{file} can be wrapped in the @code{assume-valid-file-name} syntactic
keyword. When this is done, there will not be a warning when
@code{local-file} is used with a non-literal path.  The path is still looked
up relative to the current working directory at run time.  Wrapping is done
like this:

@lisp
(define alice-key-file-path "alice.pub")
;; ...
(local-file (assume-valid-file-name alice-key-file-path))
@end lisp

@cindex relative file name, in @code{local-file}
@findex assume-source-relative-file-name
@var{file} can be wrapped in the @code{assume-source-relative-file-name}
syntactic keyword.  When this is done, the file name will be looked up
relative to the source file where it appears even when it is not a string
literal.

Dies ist das deklarative Gegenstück zur monadischen Prozedur
@code{interned-file} (siehe @ref{Die Store-Monade, @code{interned-file}}).
@end deffn

@deffn {Prozedur} plain-file Name Inhalt
Liefert ein Objekt, das eine Textdatei mit dem angegebenen @var{Name}n
repräsentiert, die den angegebenen @var{Inhalt} hat (eine Zeichenkette oder
ein Bytevektor), welche zum Store hinzugefügt werden soll.

Dies ist das deklarative Gegenstück zu @code{text-file}.
@end deffn

@deffn {Prozedur} computed-file @var{Name} @var{G-Ausdruck} @
  [#:guile] [#:local-build? #t] [#:options '()]
Liefert ein Objekt, das das Store-Objekt mit dem @var{Name}n repräsentiert,
eine Datei oder ein Verzeichnis, das vom @var{G-Ausdruck} berechnet
wurde. Wenn @var{local-build?} auf wahr steht (wie vorgegeben), wird auf der
lokalen Maschine erstellt. @var{options} ist eine Liste zusätzlicher
Argumente, die an @code{gexp->derivation} übergeben werden.

Dies ist das deklarative Gegenstück zu @code{gexp->derivation}.
@end deffn

@deffn {Monadische Prozedur} gexp->script @var{Name} @var{Ausdruck} @
  [#:guile (default-guile)] [#:module-path %load-path] @
[#:system (%current-system)] [#:target 'current]
Liefert ein ausführbares Skript namens @var{Name}, das den @var{Ausdruck}
mit dem angegebenen @var{guile} ausführt, wobei vom @var{Ausdruck}
importierte Module in seinem Suchpfad stehen. Die Module des @var{Ausdruck}s
werden dazu im Modulpfad @var{module-path} gesucht.

Folgendes Beispiel erstellt ein Skript, das einfach nur den Befehl
@command{ls} ausführt:

@lisp
(use-modules (guix gexp) (gnu packages base))

(gexp->script "list-files"
              #~(execl #$(file-append coreutils "/bin/ls")
                       "ls"))
@end lisp

Lässt man es durch den Store „laufen“ (siehe @ref{Die Store-Monade,
@code{run-with-store}}), erhalten wir eine Ableitung, die eine ausführbare
Datei @file{/gnu/store/…-list-files} generiert, ungefähr so:

@example
#!/gnu/store/…-guile-2.0.11/bin/guile -ds
!#
(execl "/gnu/store/…-coreutils-8.22"/bin/ls" "ls")
@end example
@end deffn

@deffn {Prozedur} program-file Name G-Ausdruck [#:guile #f] [#:module-path %load-path]
Liefert ein Objekt, das eine ausführbare Store-Datei @var{Name}
repräsentiert, die den @var{G-Ausdruck} ausführt. @var{guile} ist das zu
verwendende Guile-Paket, mit dem das Skript ausgeführt werden
kann. Importierte Module des @var{G-Ausdruck}s werden im Modulpfad
@var{module-path} gesucht.

Dies ist das deklarative Gegenstück zu @code{gexp->script}.
@end deffn

@deffn {Monadische Prozedur} gexp->file @var{Name} @var{G-Ausdruck} @
            [#:set-load-path? #t] [#:module-path %load-path] [#:splice? #f] @
[#:guile (default-guile)] @
[#:system (%current-system)] [#:target 'current]
Liefert eine Ableitung, die eine Datei @var{Name} erstellen wird, deren
Inhalt der @var{G-Ausdruck} ist. Ist @var{splice?} wahr, dann wird
@var{G-Ausdruck} stattdessen als eine Liste von mehreren G-Ausdrücken
behandelt, die alle in die resultierende Datei gespleißt werden.

Ist @var{set-load-path?} wahr, wird in die resultierende Datei Code
hinzugefügt, der den Ladepfad @code{%load-path} und den Ladepfad für
kompilierte Dateien @code{%load-compiled-path} festlegt, die für die
importierten Module des @var{G-Ausdruck}s nötig sind. Die Module des
@var{G-Ausdruck}s werden im Modulpfad @var{module-path} gesucht.

Die resultierende Datei referenziert alle Abhängigkeiten des
@var{G-Ausdruck}s oder eine Teilmenge davon.
@end deffn

@deffn {Prozedur} scheme-file Name G-Ausdruck [#:splice? #f] @
           [#:guile #f] [#:set-load-path? #t]
Liefert ein Objekt, das die Scheme-Datei @var{Name} mit dem @var{G-Ausdruck}
als Inhalt repräsentiert. @var{guile} ist das zu verwendende Guile-Paket,
mit dem die Datei angelegt wird.

Dies ist das deklarative Gegenstück zu @code{gexp->file}.
@end deffn

@deffn {Monadische Prozedur} text-file* @var{Name} @var{Text} …
Liefert eine Ableitung als monadischen Wert, welche eine Textdatei erstellt,
in der der gesamte @var{Text} enthalten ist. @var{Text} kann eine Folge
nicht nur von Zeichenketten, sondern auch Objekten beliebigen Typs sein, die
in einem G-Ausdruck benutzt werden können, also Paketen, Ableitungen,
Objekte lokaler Dateien und so weiter. Die resultierende Store-Datei
referenziert alle davon.

Diese Variante sollte gegenüber @code{text-file} bevorzugt verwendet werden,
wann immer die zu erstellende Datei Objekte im Store referenzieren
wird. Typischerweise ist das der Fall, wenn eine Konfigurationsdatei
erstellt wird, die Namen von Store-Dateien enthält, so wie hier:

@lisp
(define (profile.sh)
  ;; Liefert den Namen eines Shell-Skripts im Store,
  ;; welcher die Umgebungsvariable „PATH“ initialisiert.
  (text-file* "profile.sh"
              "export PATH=" coreutils "/bin:"
              grep "/bin:" sed "/bin\n"))
@end lisp

In diesem Beispiel wird die resultierende Datei
@file{/gnu/store/…-profile.sh} sowohl @var{coreutils}, @var{grep} als auch
@var{sed} referenzieren, so dass der Müllsammler diese nicht löscht, während
die resultierende Datei noch lebendig ist.
@end deffn

@deffn {Prozedur} mixed-text-file Name Text …
Liefert ein Objekt, was die Store-Datei @var{Name} repräsentiert, die
@var{Text} enthält. @var{Text} ist dabei eine Folge von Zeichenketten und
dateiartigen Objekten wie zum Beispiel:

@lisp
(mixed-text-file "profile"
                 "export PATH=" coreutils "/bin:" grep "/bin")
@end lisp

Dies ist das deklarative Gegenstück zu @code{text-file*}.
@end deffn

@deffn {Prozedur} file-union Name Dateien [#:dangling-symlinks? #f]
Liefert ein @code{<computed-file>}, das ein Verzeichnis mit allen
@var{Dateien} enthält. Jedes Objekt in @var{Dateien} muss eine
zweielementige Liste sein, deren erstes Element der im neuen Verzeichnis zu
benutzende Dateiname ist und deren zweites Element ein G-Ausdruck ist, der
die Zieldatei benennt. @code{#:dangling-symlinks?} bestimmt, ob
vorausgesetzt wird, dass ein G-Ausdruck auf eine existierende Datei
heruntergebrochen wird. Hier ist ein Beispiel:

@lisp
(file-union "etc"
            `(("hosts" ,(plain-file "hosts"
                                    "127.0.0.1 localhost"))
              ("bashrc" ,(plain-file "bashrc"
                                     "alias ls='ls --color=auto'"))))
@end lisp

Dies liefert ein Verzeichnis @code{etc}, das zwei Dateien enthält.
@end deffn

@deffn {Procedure} symlink-to target
Return a @code{<computed-file>} that is a symbolic link to target.  Note,
that the target does not need to exist at the build time.  One of uses is to
put arbitrary symlinks into user's home:

@lisp
(service home-files-service-type
  `(("Sync" ,(symlink-to "/storage/Sync"))))
@end lisp
@end deffn

@deffn {Prozedur} directory-union Name Dinge
Liefert ein Verzeichnis, was die Vereinigung der @var{Dinge} darstellt,
wobei @var{Dinge} eine Liste dateiartiger Objekte sein muss, die
Verzeichnisse bezeichnen. Zum Beispiel:

@lisp
(directory-union "guile+emacs" (list guile emacs))
@end lisp

Das liefert ein Verzeichnis, welches die Vereinigung der Pakete @code{guile}
und @code{emacs} ist.
@end deffn

@deffn {Prozedur} file-append Objekt Suffix …
Liefert ein dateiartiges Objekt, das zur Aneinanderreihung von @var{Objekt}
und @var{Suffix} umgeschrieben wird, wobei das @var{Objekt} ein
herunterbrechbares Objekt und jedes @var{Suffix} eine Zeichenkette sein
muss.

Betrachten Sie zum Beispiel diesen G-Ausdruck:

@lisp
(gexp->script "uname-ausfuehren"
              #~(system* #$(file-append coreutils
                                        "/bin/uname")))
@end lisp

Denselben Effekt könnte man erreichen mit:

@lisp
(gexp->script "uname-ausfuehren"
              #~(system* (string-append #$coreutils
                                        "/bin/uname")))
@end lisp

Es gibt jedoch einen Unterschied, nämlich enthält das resultierende Skript
bei @code{file-append} tatsächlich den absoluten Dateinamen als
Zeichenkette, während im anderen Fall das resultierende Skript einen
Ausdruck @code{(string-append …)} enthält, der den Dateinamen erst @emph{zur
Laufzeit} zusammensetzt.
@end deffn

@defmac let-system System Rumpf…
@defmacx let-system (System Zielsystem) Rumpf…
@var{System} an das System binden, für das momentan erstellt wird@tie{}–
z.B.@: @code{"x86_64-linux"}@tie{}–, während der @var{Rumpf} ausgeführt
wird.

In der zweiten Form wird zusätzlich das @var{Ziel} an das aktuelle Ziel
(„Target“) bei der Cross-Kompilierung gebunden. Dabei handelt es sich um ein
GNU-Tripel wie z.B.@: @code{"arm-linux-gnueabihf"}@tie{}– oder um @code{#f},
wenn nicht cross-kompiliert wird.

@code{let-system} zu benutzen, bietet sich dann an, wenn einmal das in den
G-Ausdruck gespleißte Objekt vom Zielsystem abhängen sollte, wie in diesem
Beispiel:

@lisp
#~(system*
   #+(let-system system
       (cond ((string-prefix? "armhf-" system)
              (file-append qemu "/bin/qemu-system-arm"))
             ((string-prefix? "x86_64-" system)
              (file-append qemu "/bin/qemu-system-x86_64"))
             (else
              (error "weiß nicht!"))))
   "-net" "user" #$image)
@end lisp
@end defmac

@defmac with-parameters ((Parameter Wert) …) Ausdruck
Mit diesem Makro verhält es sich ähnlich wie mit der
@code{parameterize}-Form für dynamisch gebundene @dfn{Parameter} (siehe
@ref{Parameters,,, guile, Referenzhandbuch zu GNU Guile}). Der
Hauptunterschied ist, dass es sich erst auswirkt, wenn das vom
@var{Ausdruck} zurückgelieferte dateiartige Objekt auf eine Ableitung oder
ein Store-Objekt heruntergebrochen wird.

Eine typische Anwendung von @code{with-parameters} ist, den für ein
bestimmtes Objekt geltenden Systemtyp zwingend festzulegen:

@lisp
(with-parameters ((%current-system "i686-linux"))
  coreutils)
@end lisp

Obiges Beispiel liefert ein Objekt, das der Erstellung von Coreutils für die
i686-Architektur entspricht, egal was der aktuelle Wert von
@code{%current-system} ist.
@end defmac

@anchor{gexp-input}
@deffn {Prozedur} gexp-input @var{Objekt} [@var{Ausgabe}] [#:native? #f]
Liefert ein @dfn{gexp-input}-Verbundsobjekt, das für die @var{Ausgabe} des
dateiartigen Objekts @var{Objekt} steht. Dabei legt man mit @code{#:native?}
fest, ob eine native Erstellung referenziert wird (wie bei
@code{ungexp-native}) oder nicht.

Diese Prozedur verwendet man, um eine Referenz auf eine bestimmte Ausgabe
eines Objekts an eine Prozedur zu übergeben, in der keine Ausgabe ausgewählt
wird. Zum Beispiel, wenn Sie diese Prozedur vorliegen haben, die ein
dateiartiges Objekt entgegennimmt:

@lisp
(define (make-symlink Ziel)
  (computed-file "eine-symbolische-verknüpfung"
                 #~(symlink #$Ziel #$output)))
@end lisp

Mit @code{make-symlink} wird hier für sich alleine immer auf die
Standardausgabe von @var{Ziel} verwiesen@tie{}– also auf die Ausgabe
@code{"out"} (siehe @ref{Pakete mit mehreren Ausgaben.}). Um die Prozedur
auf z.B.@: die Ausgabe @code{"lib"} des Pakets @code{hwloc} verweisen zu
lassen, ruft man sie so auf:

@lisp
(make-symlink (gexp-input hwloc "lib"))
@end lisp

Auch eine Komposition mit Funktionen für dateiartige Objekte ist möglich:

@lisp
(make-symlink
  (file-append (gexp-input hwloc "lib") "/lib/libhwloc.so"))
@end lisp
@end deffn

Natürlich gibt es zusätzlich zu in „wirtsseitigem“ Code eingebetteten
G-Ausdrücken auch Module mit „erstellungsseitig“ nutzbaren Werkzeugen. Um
klarzustellen, dass sie dafür gedacht sind, in der Erstellungsschicht
benutzt zu werden, bleiben diese Module im Namensraum @code{(guix build …)}.

@cindex Herunterbrechen, von abstrakten Objekten in G-Ausdrücken
Intern werden hochsprachliche, abstrakte Objekte mit ihrem Compiler entweder
zu Ableitungen oder zu Store-Objekten @dfn{heruntergebrochen}. Wird zum
Beispiel ein Paket heruntergebrochen, bekommt man eine Ableitung, während
ein @code{plain-file} zu einem Store-Objekt heruntergebrochen wird. Das wird
mit der monadischen Prozedur @code{lower-object} bewerkstelligt.

@deffn {Monadische Prozedur} lower-object @var{Objekt} [@var{System}] @
           [#:target #f]
Liefert die Ableitung oder das Store-Objekt, das dem @var{Objekt} für
@var{System} als Wert in der Store-Monade @code{%store-monad} entspricht,
cross-kompiliert für das Zieltripel @var{target}, wenn @var{target} wahr
ist. Das @var{Objekt} muss ein Objekt sein, für das es einen mit ihm
assoziierten G-Ausdruck-Compiler gibt, wie zum Beispiel ein
@code{<package>}.
@end deffn

@deffn {Prozedur} gexp->approximate-sexp G-Ausdruck
Es kann gelegentlich nützlich sein, einen G-Ausdruck in einen S-Ausdruck
umzuwandeln, weil zum Beispiel manche Prüfer (siehe @ref{Aufruf von guix lint}) einen Blick auf die Erstellungsphasen eines Pakets werfen, um
mögliche Fehler zu finden. Diese Umwandlung können Sie mit dieser Prozedur
bewerkstelligen. Allerdings kann dabei manche Information verloren
gehen. Genauer gesagt werden herunterbrechbare Objekte stillschweigend durch
ein beliebiges Objekt ersetzt. Zurzeit ist dieses beliebige Objekt die Liste
@code{(*approximate*)}, aber verlassen Sie sich nicht darauf, dass es so
bleibt.
@end deffn

@node Aufruf von guix repl
@section @command{guix repl} aufrufen

@cindex @command{guix repl}
@cindex REPL (Lese-Auswerten-Schreiben-Schleife) und Skripts
Der Befehl @command{guix repl} erleichtert es, Guix von Guile aus zu
programmieren. Dazu startet er eine Guile-REPL (@dfn{Read-Eval-Print Loop},
kurz REPL, deutsch Lese-Auswerten-Schreiben-Schleife) zur interaktiven
Programmierung (siehe @ref{Using Guile Interactively,,, guile,
Referenzhandbuch zu GNU Guile}) oder er führt Guile-Skripts aus (siehe
@ref{Running Guile Scripts,,, guile, Referenzhandbuch zu GNU Guile}). Im
Vergleich dazu, einfach den Befehl @command{guile} aufzurufen, garantiert
@command{guix repl}, dass alle Guix-Module und deren Abhängigkeiten im
Suchpfad verfügbar sind.

Die allgemeine Syntax lautet:

@example
guix repl @var{Optionen} [@var{Datei} @var{Argumente}]
@end example

Wird ein @var{Datei}-Argument angegeben, wird die angegebene @var{Datei} als
Guile-Skript ausgeführt.

@example
guix repl my-script.scm
@end example

Um Argumente an das Skript zu übergeben, geben Sie davor @code{--} an, damit
Sie nicht als Argumente an @command{guix repl} verstanden werden:

@example
guix repl -- my-script.scm --input=foo.txt
@end example

Wenn Sie möchten, dass ein Skript direkt aus der Shell heraus ausgeführt
werden kann und diejenige ausführbare Datei von Guix benutzt wird, die sich
im Suchpfad des Benutzers befindet, dann fügen Sie die folgenden zwei Zeilen
ganz oben ins Skript ein.

@example
@code{#!/usr/bin/env -S guix repl --}
@code{!#}
@end example

Wenn ein Skript in einer interaktiven REPL direkt aus der Shell heraus
ausgeführt werden soll, verwenden Sie die Befehlszeilenoption
@code{--interactive}:

@example
@code{#!/usr/bin/env -S guix repl --interactive}
@code{!#}
@end example

Ohne einen Dateinamen als Argument wird eine Guile-REPL gestartet, so dass
man Guix interaktiv benutzen kann (siehe @ref{Interaktiv mit Guix arbeiten}):

@example
$ guix repl
scheme@@(guile-user)> ,use (gnu packages base)
scheme@@(guile-user)> coreutils
$1 = #<package coreutils@@8.29 gnu/packages/base.scm:327 3e28300>
@end example

@cindex Untergeordnete
@command{guix repl} implementiert zusätzlich ein einfaches maschinenlesbares
Protokoll für die REPL, das von @code{(guix inferior)} benutzt wird, um mit
@dfn{Untergeordneten} zu interagieren, also mit getrennten Prozessen einer
womöglich anderen Version von Guix.

Folgende @var{Optionen} gibt es:

@table @code
@item --list-types
Zeigt an, welche Möglichkeiten Sie für @var{Typ} angeben können, wenn Sie
@command{guix repl --type=TYP} benutzen, und terminiert.

@item --type=@var{Typ}
@itemx -t @var{Typ}
Startet eine REPL des angegebenen @var{Typ}s, der einer der Folgenden sein
darf:

@table @code
@item guile
Die Voreinstellung, mit der eine normale, voll funktionsfähige Guile-REPL
gestartet wird.
@item machine
Startet eine REPL, die ein maschinenlesbares Protokoll benutzt. Dieses
Protokoll wird vom Modul @code{(guix inferior)} gesprochen.
@end table

@item --listen=@var{Endpunkt}
Der Vorgabe nach würde @command{guix repl} von der Standardeingabe lesen und
auf die Standardausgabe schreiben. Wird diese Befehlszeilenoption angegeben,
lauscht die REPL stattdessen auf dem @var{Endpunkt} auf Verbindungen. Hier
sind Beispiele gültiger Befehlszeilenoptionen:

@table @code
@item --listen=tcp:37146
Verbindungen mit dem „localhost“ auf Port 37146 akzeptieren.

@item --listen=unix:/tmp/socket
Verbindungen zum Unix-Socket @file{/tmp/socket} akzeptieren.
@end table

@item --interactive
@itemx -i
Im Anschluss, nachdem @var{Datei} ausgeführt wurde, die interaktive REPL
starten.

@item --load-path=@var{Verzeichnis}
@itemx -L @var{Verzeichnis}
Das @var{Verzeichnis} vorne an den Suchpfad für Paketmodule anfügen (siehe
@ref{Paketmodule}).

Damit können Nutzer dafür sorgen, dass ihre eigenen selbstdefinierten Pakete
für Skript oder REPL sichtbar sind.

@item -q
Das Laden der @file{~/.guile}-Datei unterdrücken. Nach Voreinstellung würde
diese Konfigurationsdatei beim Erzeugen einer REPL für @code{guile} geladen.
@end table

@node Interaktiv mit Guix arbeiten
@section Interaktiv mit Guix arbeiten

@cindex interaktiv benutzen
@cindex REPL (Lese-Auswerten-Schreiben-Schleife)
Mit dem Befehl @command{guix repl} finden Sie sich in einer netten und
freundlichen REPL wieder (das steht für Read-Eval-Print Loop, deutsch
Lese-Auswerten-Schreiben-Schleife) (siehe @ref{Aufruf von guix repl}). Wenn
Sie mit Guix programmieren möchten@tie{}– also eigene Pakete definieren,
Manifeste schreiben, Dienste für Guix System oder Guix Home definieren und
so@tie{}–, dann wird Ihnen sicher gefallen, dass Sie Ihre Ideen auf der REPL
ausprobieren können.

Wenn Sie Emacs benutzen, eignet sich dafür Geiser am meisten (siehe @ref{Perfekt eingerichtet}), aber Emacs zu benutzen ist nicht unbedingt erforderlich, um
Spaß an der REPL zu haben. Beim Verwenden von @command{guix repl} oder
@command{guile} auf dem Terminal raten wir dazu, dass Sie Readline
aktivieren, um Autovervollständigung zu genießen, und Colorized aktivieren
für farbige Ausgaben. Führen Sie dazu dies aus:

@example
guix install guile guile-readline guile-colorized
@end example

@noindent
… und legen Sie dann eine Datei @file{.guile} in Ihrem Persönlichen
Verzeichnis („Home“-Verzeichnis) an mit diesem Inhalt:

@lisp
(use-modules (ice-9 readline) (ice-9 colorized))

(activate-readline)
(activate-colorized)
@end lisp

Auf der REPL können Sie Scheme-Code auswerten lassen. Sie tippen also einen
Scheme-Ausdruck nach der Eingabeaufforderung und schon zeigt die REPL, zu
was er ausgewertet wird:

@example
$ guix repl
scheme@@(guix-user)> (+ 2 3)
$1 = 5
scheme@@(guix-user)> (string-append "a" "b")
$2 = "ab"
@end example

Interessant wird es, wenn Sie auf der REPL anfangen, mit Guix
herumzubasteln. Dazu „importieren“ Sie zunächst das Modul @code{(guix)},
damit Sie Zugriff auf den Hauptteil der Programmierschnittstelle haben, und
vielleicht wollen Sie auch noch andere nützliche Guix-Module
importieren. Sie könnten @code{(use-modules (guix))} eintippen, denn es ist
gültiger Scheme-Code zum Importieren eines Moduls (siehe @ref{Using Guile
Modules,,, guile, Referenzhandbuch zu GNU Guile}), aber auf der REPL können
Sie den @dfn{Befehl} @code{use} als Kurzschreibweise einsetzen (siehe
@ref{REPL Commands,,, guile, Referenzhandbuch zu GNU Guile}):

@example
scheme@@(guix-user)> ,use (guix)
scheme@@(guix-user)> ,use (gnu packages base)
@end example

Beachten Sie, dass am Anfang jedes REPL-Befehls ein führendes Komma stehen
muss. Der Grund ist, dass ein REPL-Befehl wie @code{use} eben @emph{kein}
gültiger Scheme-Code ist; er wird von der REPL gesondert interpretiert.

Durch Guix wird die Guile-REPL um zusätzliche Befehle erweitert, die dort
praktisch sind. Einer davon, der Befehl @code{build}, ist hier nützlich: Mit
ihm wird sichergestellt, dass das angegebene dateiartige Objekt erstellt
wurde; wenn nicht, wird es erstellt. In jedem Fall wird der Dateiname jeder
Ausgabe der Erstellung zurückgeliefert. Im folgenden Beispiel erstellen wir
die Pakete @code{coreutils} und @code{grep} sowie eine als
@code{computed-file} angegebene Datei (siehe @ref{G-Ausdrücke,
@code{computed-file}}), um sogleich mit der Prozedur @code{scandir}
aufzulisten, was für Dateien in Grep im Verzeichnis @code{/bin} enthalten
sind:

@example
scheme@@(guix-user)> ,build coreutils
$1 = "/gnu/store/…-coreutils-8.32-debug"
$2 = "/gnu/store/…-coreutils-8.32"
scheme@@(guix-user)> ,build grep
$3 = "/gnu/store/…-grep-3.6"
scheme@@(guix-user)> ,build (computed-file "x" #~(mkdir #$output))
/gnu/store/…-x.drv wird erstellt …
$4 = "/gnu/store/…-x"
scheme@@(guix-user)> ,use(ice-9 ftw)
scheme@@(guix-user)> (scandir (string-append $3 "/bin"))
$5 = ("." ".." "egrep" "fgrep" "grep")
@end example

Paketautoren kann es gefallen, die Erstellungsphasen oder -optionen für ein
bestimmtes Paket zu untersuchen. Dessen bedarf es vor allem, wenn Sie viel
mit Vererbung von Paketen (@code{inherit}) arbeiten, um Paketvarianten zu
definieren (siehe @ref{Paketvarianten definieren}) oder wenn Paketargumente
im @code{arguments}-Feld das Ergebnis einer Berechnung sind. In beiden
Fällen kommt man leicht durcheinander, was am Ende die Paketargumente
sind. Mit diesen Befehlen können Sie diese Paketargumente inspizieren:

@example
scheme@@(guix-user)> ,phases grep
$1 = (modify-phases %standard-phases
       (add-after 'install 'fix-egrep-and-fgrep
         (lambda* (#:key outputs #:allow-other-keys)
           (let* ((out (assoc-ref outputs "out"))
                  (bin (string-append out "/bin")))
             (substitute* (list (string-append bin "/egrep")
                                (string-append bin "/fgrep"))
               (("^exec grep")
                (string-append "exec " bin "/grep")))))))
scheme@@(guix-user)> ,configure-flags findutils
$2 = (list "--localstatedir=/var")
scheme@@(guix-user)> ,make-flags binutils
$3 = '("MAKEINFO=true")
@end example

Will man die einzelnen Schritte von Guix nachvollziehen, eignet sich der
Befehl @code{lower}: Er nimmt ein dateiartiges Objekt, um es zu einer
Ableitung oder einem Store-Objekt „herunterzubrechen“ (siehe
@ref{Ableitungen}):

@example
scheme@@(guix-user)> ,lower grep
$6 = #<derivation /gnu/store/…-grep-3.6.drv => /gnu/store/…-grep-3.6 7f0e639115f0>
scheme@@(guix-user)> ,lower (plain-file "x" "Hallo!")
$7 = "/gnu/store/…-x"
@end example

Die vollständige Liste der REPL-Befehle bekommen Sie zu sehen, wenn Sie
@code{,help guix} eingeben. Hier eine Referenz:

@deffn {REPL-Befehl} build @var{Objekt}
Das @var{Objekt} herunterbrechen und erstellen, wenn es noch nicht erstellt
ist. Als Ergebnis zurückgeliefert wird der Dateiname jeder Ausgabe.
@end deffn

@deffn {REPL command} build-options @var{options}
Set build options for rest of the REPL commands to @var{options}.  Must be a
list of keywords with values accepted by procedure @code{(@@ (guix store)
set-build-options)}.  An example would be:

@example
,build-options '(#:offload? #f)
@end example
@end deffn

@deffn {REPL-Befehl} graft? @var{Veredeln?}
Bestimmt, ob während der Erstellung Veredelungen durchgeführt werden
sollen. Entspricht dem Argument @code{--no-grafts} für @code{guix build}.
@end deffn

@deffn {REPL-Befehl} lower @var{Objekt}
Das @var{Objekt} zu einer Ausgabe oder einem Dateinamen im Store
herunterbrechen und diesen zurückliefern.
@end deffn

@deffn {REPL-Befehl} verbosity @var{Stufe}
Legt @var{Stufe} als die Ausführlichkeitsstufe für Erstellungen fest.

Das ist das Gleiche wie die Befehlszeilenoption @option{--verbosity} (siehe
@ref{Gemeinsame Erstellungsoptionen}): Stufe 0 zeigt gar nichts an, Stufe 1 nur
Ereignisse bei der Erstellung und auf höheren Stufen bekommen Sie
Erstellungsprotokolle angezeigt.
@end deffn

@deffn {REPL-Befehl} phases @var{Paket}
@deffnx {REPL-Befehl} configure-flags @var{Paket}
@deffnx {REPL-Befehl} make-flags @var{Paket}
Diese REPL-Befehle liefern den Wert eines Bestandteils des
@code{arguments}-Feldes von @var{Paket} zurück (siehe @ref{„package“-Referenz}): Ersterer zeigt den „staged code“, der mit @code{#:phases}
assoziiert ist (siehe @ref{Erstellungsphasen}), der zweite Befehl zeigt den Code
für @code{#:configure-flags} und mit @code{,make-flags} wird einem der Code
für @code{#:make-flags} geliefert.
@end deffn

@deffn {REPL-Befehl} run-in-store @var{Ausdruck}
Den @var{Ausdruck}, einen monadischen Ausdruck, durch die Store-Monade
laufen lassen. Siehe @ref{Die Store-Monade} für mehr Erklärungen.
@end deffn

@deffn {REPL-Befehl} enter-store-monad
Damit betreten Sie eine neue REPL, die monadische Ausdrücke auswerten kann
(siehe @ref{Die Store-Monade}). Sie können diese „innere“ REPL verlassen,
indem Sie @code{,q} eintippen.
@end deffn

@c *********************************************************************
@node Zubehör
@chapter Zubehör

Dieser Abschnitt beschreibt die Befehlszeilenwerkzeuge von Guix. Manche
davon richten sich hauptsächlich an Entwickler und solche Nutzer, die neue
Paketdefinitionen schreiben, andere sind auch für ein breiteres Publikum
nützlich. Sie ergänzen die Scheme-Programmierschnittstelle um bequeme
Befehle.

@menu
* Aufruf von guix build::    Pakete aus der Befehlszeile heraus erstellen.
* Aufruf von guix edit::     Paketdefinitionen bearbeiten.
* Aufruf von guix download::  Eine Datei herunterladen und ihre 
                                Hash-Prüfsumme ausgeben.
* Aufruf von guix hash::     Die kryptografische Prüfsumme einer Datei 
                               berechnen.
* Aufruf von guix import::   Paketdefinitionen importieren.
* Aufruf von guix refresh::  Paketdefinitionen aktualisieren.
* Aufruf von guix style::    Paketdefinitionen umgestalten.
* Aufruf von guix lint::     Fehler in Paketdefinitionen finden.
* Aufruf von guix size::     Plattenplatzverbrauch profilieren.
* Aufruf von guix graph::    Den Paketgraphen visualisieren.
* Aufruf von guix publish::  Substitute teilen.
* Aufruf von guix challenge::  Die Substitut-Server anfechten.
* Aufruf von guix copy::     Mit einem entfernten Store Dateien austauschen.
* Aufruf von guix container::  Prozesse isolieren.
* Aufruf von guix weather::  Die Verfügbarkeit von Substituten einschätzen.
* Aufruf von guix processes::  Auflisten der Client-Prozesse
@end menu

@node Aufruf von guix build
@section Aufruf von @command{guix build}

@cindex Paketerstellung
@cindex @command{guix build}
Der Befehl @command{guix build} lässt Pakete oder Ableitungen samt ihrer
Abhängigkeiten erstellen und gibt die resultierenden Pfade im Store
aus. Beachten Sie, dass das Nutzerprofil dadurch nicht modifiziert
wird@tie{}– eine solche Installation bewirkt der Befehl @command{guix
package} (siehe @ref{Aufruf von guix package}). @command{guix build} wird also
hauptsächlich von Entwicklern der Distribution benutzt.

Die allgemeine Syntax lautet:

@example
guix build @var{Optionen} @var{Paket-oder-Ableitung}…
@end example

Zum Beispiel wird mit folgendem Befehl die neueste Version von Emacs und von
Guile erstellt, das zugehörige Erstellungsprotokoll angezeigt und
letztendlich werden die resultierenden Verzeichnisse ausgegeben:

@example
guix build emacs guile
@end example

Folgender Befehl erstellt alle Pakete, die zur Verfügung stehen:

@example
guix build --quiet --keep-going \
  $(guix package -A | awk '@{ print $1 "@@" $2 @}')
@end example

Als @var{Paket-oder-Ableitung} muss entweder der Name eines in der
Software-Distribution zu findenden Pakets, wie etwa @code{coreutils} oder
@code{coreutils@@8.20}, oder eine Ableitung wie
@file{/gnu/store/…-coreutils-8.19.drv} sein. Im ersten Fall wird nach einem
Paket mit entsprechendem Namen (und optional der entsprechenden Version) in
den Modulen der GNU-Distribution gesucht (siehe @ref{Paketmodule}).

Alternativ kann die Befehlszeilenoption @option{--expression} benutzt
werden, um einen Scheme-Ausdruck anzugeben, der zu einem Paket ausgewertet
wird; dies ist nützlich, wenn zwischen mehreren gleichnamigen Paketen oder
Paket-Varianten unterschieden werden muss.

Null oder mehr @var{Optionen} können angegeben werden. Zur Verfügung stehen
die in den folgenden Unterabschnitten beschriebenen Befehlszeilenoptionen.

@menu
* Gemeinsame Erstellungsoptionen::  Erstellungsoptionen für die meisten 
                                      Befehle.
* Paketumwandlungsoptionen::  Varianten von Paketen erzeugen.
* Zusätzliche Erstellungsoptionen::  Optionen spezifisch für „guix build“.
* Fehlschläge beim Erstellen untersuchen::  Praxiserfahrung beim 
                                              Paketeschreiben.
@end menu

@node Gemeinsame Erstellungsoptionen
@subsection Gemeinsame Erstellungsoptionen

Einige dieser Befehlszeilenoptionen zur Steuerung des Erstellungsprozess
haben @command{guix build} und andere Befehle, mit denen Erstellungen
ausgelöst werden können, wie @command{guix package} oder @command{guix
archive}, gemeinsam. Das sind folgende:

@table @code

@item --load-path=@var{Verzeichnis}
@itemx -L @var{Verzeichnis}
Das @var{Verzeichnis} vorne an den Suchpfad für Paketmodule anfügen (siehe
@ref{Paketmodule}).

Damit können Nutzer dafür sorgen, dass ihre eigenen selbstdefinierten Pakete
für die Befehlszeilenwerkzeuge sichtbar sind.

@item --keep-failed
@itemx -K
Den Verzeichnisbaum, in dem fehlgeschlagene Erstellungen durchgeführt
wurden, behalten. Wenn also eine Erstellung fehlschlägt, bleibt ihr
Erstellungsbaum in @file{/tmp} erhalten. Der Name dieses Unterverzeichnisses
wird am Ende dem Erstellungsprotokolls ausgegeben. Dies hilft bei der Suche
nach Fehlern in Erstellungen. Der Abschnitt @ref{Fehlschläge beim Erstellen untersuchen}
zeigt Ihnen Hinweise und Tricks, wie Erstellungsfehler untersucht werden
können.

Diese Option impliziert @option{--no-offload} und sie hat keine
Auswirkungen, wenn eine Verbindung zu einem entfernten Daemon über eine
@code{guix://}-URI verwendet wurde (siehe @ref{Der Store, die
@env{GUIX_DAEMON_SOCKET}-Variable}).

@item --keep-going
@itemx -k
Weitermachen, auch wenn ein Teil der Erstellungen fehlschlägt. Das bedeutet,
dass der Befehl erst terminiert, wenn alle Erstellungen erfolgreich oder mit
Fehler durchgeführt wurden.

Das normale Verhalten ist, abzubrechen, sobald eine der angegebenen
Ableitungen fehlschlägt.

@item --dry-run
@itemx -n
Die Ableitungen nicht erstellen.

@anchor{fallback-option}
@item --fallback
Wenn das Substituieren vorerstellter Binärdateien fehlschlägt, diese
ersatzweise lokal selbst erstellen (siehe @ref{Fehler bei der Substitution}).

@item --substitute-urls=@var{URLs}
@anchor{client-substitute-urls}
Die @var{urls} als durch Leerraumzeichen getrennte Liste von Quell-URLs für
Substitute anstelle der vorgegebenen URL-Liste für den @command{guix-daemon}
verwenden (siehe @ref{daemon-substitute-urls,, @command{guix-daemon} URLs}).

Das heißt, die Substitute dürfen von den @var{urls} heruntergeladen werden,
sofern sie mit einem durch den Systemadministrator autorisierten Schlüssel
signiert worden sind (siehe @ref{Substitute}).

Wenn als @var{urls} eine leere Zeichenkette angegeben wurde, verhält es
sich, als wären Substitute abgeschaltet.

@item --no-substitutes
Benutze keine Substitute für Erstellungsergebnisse. Das heißt, dass alle
Objekte lokal erstellt werden müssen, und kein Herunterladen von vorab
erstellten Binärdateien erlaubt ist (siehe @ref{Substitute}).

@item --no-grafts
Pakete nicht „veredeln“ (engl. „graft“). Praktisch heißt das, dass als
Veredelungen verfügbare Paketaktualisierungen nicht angewandt werden. Der
Abschnitt @ref{Sicherheitsaktualisierungen} hat weitere Informationen zu Veredelungen.

@item --rounds=@var{n}
Jede Ableitung @var{n}-mal nacheinander erstellen und einen Fehler melden,
wenn die aufeinanderfolgenden Erstellungsergebnisse nicht Bit für Bit
identisch sind.

Das ist eine nützliche Methode, um nicht-deterministische
Erstellungsprozesse zu erkennen. Nicht-deterministische Erstellungsprozesse
sind ein Problem, weil Nutzer dadurch praktisch nicht @emph{verifizieren}
können, ob von Drittanbietern bereitgestellte Binärdateien unverfälscht
sind. Der Abschnitt @ref{Aufruf von guix challenge} erklärt dies genauer.

Wenn dies zusammen mit @option{--keep-failed} benutzt wird, bleiben die sich
unterscheidenden Ausgaben im Store unter dem Namen
@file{/gnu/store/…-check}. Dadurch können Unterschiede zwischen den beiden
Ergebnissen leicht erkannt werden.

@item --no-offload
Nicht versuchen, an andere Maschinen ausgelagerte Erstellungen zu benutzen
(siehe @ref{Auslagern des Daemons einrichten}). Somit wird lokal erstellt, statt
Erstellungen auf entfernte Maschinen auszulagern.

@item --max-silent-time=@var{Sekunden}
Wenn der Erstellungs- oder Substitutionsprozess länger als
@var{Sekunden}-lang keine Ausgabe erzeugt, wird er abgebrochen und ein
Fehler beim Erstellen gemeldet.

Standardmäßig wird die Einstellung für den Daemon benutzt (siehe
@ref{Aufruf des guix-daemon, @option{--max-silent-time}}).

@item --timeout=@var{Sekunden}
Entsprechend wird hier der Erstellungs- oder Substitutionsprozess
abgebrochen und als Fehlschlag gemeldet, wenn er mehr als
@var{Sekunden}-lang dauert.

Standardmäßig wird die Einstellung für den Daemon benutzt (siehe
@ref{Aufruf des guix-daemon, @option{--timeout}}).

@c Note: This option is actually not part of %standard-build-options but
@c most programs honor it.
@cindex Ausführlichkeit der Befehlszeilenwerkzeuge
@cindex Erstellungsprotokolle, Ausführlichkeit
@item -v @var{Stufe}
@itemx --verbosity=@var{Stufe}
Die angegebene Ausführlichkeitsstufe verwenden. Als @var{Stufe} muss eine
ganze Zahl angegeben werden. Wird 0 gewählt, wird keine Ausgabe zur
Fehlersuche angezeigt, 1 bedeutet eine knappe Ausgabe, 2 ist wie 1, aber
zeigt zusätzlich an, von welcher URL heruntergeladen wird, und 3 lässt alle
Erstellungsprotokollausgaben auf die Standardfehlerausgabe schreiben.

@item --cores=@var{n}
@itemx -c @var{n}
Die Nutzung von bis zu @var{n} Prozessorkernen für die Erstellungen
gestatten. Der besondere Wert @code{0} bedeutet, dass so viele wie möglich
benutzt werden.

@item --max-jobs=@var{n}
@itemx -M @var{n}
Höchstens @var{n} gleichzeitige Erstellungsaufträge erlauben. Im Abschnitt
@ref{Aufruf des guix-daemon, @option{--max-jobs}} finden Sie Details zu dieser
Option und der äquivalenten Option des @command{guix-daemon}.

@item --debug=@var{Stufe}
Ein Protokoll zur Fehlersuche ausgeben, das vom Erstellungsdaemon kommt. Als
@var{Stufe} muss eine ganze Zahl zwischen 0 und 5 angegeben werden; höhere
Zahlen stehen für ausführlichere Ausgaben. Stufe 4 oder höher zu wählen,
kann bei der Suche nach Fehlern, wie der Erstellungs-Daemon eingerichtet
ist, helfen.

@end table

Intern ist @command{guix build} im Kern eine Schnittstelle zur Prozedur
@code{package-derivation} aus dem Modul @code{(guix packages)} und zu der
Prozedur @code{build-derivations} des Moduls @code{(guix derivations)}.

Neben auf der Befehlszeile übergebenen Optionen beachten @command{guix
build} und andere @command{guix}-Befehle, die Erstellungen durchführen
lassen, die Umgebungsvariable @env{GUIX_BUILD_OPTIONS}.

@defvr {Umgebungsvariable} GUIX_BUILD_OPTIONS
Nutzer können diese Variable auf eine Liste von Befehlszeilenoptionen
definieren, die automatisch von @command{guix build} und anderen
@command{guix}-Befehlen, die Erstellungen durchführen lassen, benutzt wird,
wie in folgendem Beispiel:

@example
$ export GUIX_BUILD_OPTIONS="--no-substitutes -c 2 -L /foo/bar"
@end example

Diese Befehlszeilenoptionen werden unabhängig von den auf der Befehlszeile
übergebenen Befehlszeilenoptionen grammatikalisch analysiert und das
Ergebnis an die bereits analysierten auf der Befehlszeile übergebenen
Befehlszeilenoptionen angehängt.
@end defvr


@node Paketumwandlungsoptionen
@subsection Paketumwandlungsoptionen

@cindex Paketvarianten
Eine weitere Gruppe von Befehlszeilenoptionen, die @command{guix build} und
auch @command{guix package} unterstützen, sind
@dfn{Paketumwandlungsoptionen}. Diese Optionen ermöglichen es,
@dfn{Paketvarianten} zu definieren@tie{}– zum Beispiel können Pakete aus
einem anderen Quellcode als normalerweise erstellt werden. Damit ist es
leicht, angepasste Pakete schnell zu erstellen, ohne die vollständigen
Definitionen von Paketvarianten einzutippen (siehe @ref{Pakete definieren}).

Paketumwandlungsoptionen bleiben über Aktualisierungen hinweg erhalten:
@command{guix upgrade} versucht, Umwandlungsoptionen, die vorher zur
Erstellung des Profils benutzt wurden, auf die aktualisierten Pakete
anzuwenden.

Im Folgenden finden Sie die verfügbaren Befehlszeilenoptionen. Die meisten
Befehle unterstützen sie ebenso wie eine Option @option{--help-transform},
mit der all die verfügbaren Optionen und je eine Kurzbeschreibung dazu
angezeigt werden. (Diese Optionen werden der Kürze wegen nicht in der
Ausgabe von @option{--help} aufgeführt.)

@table @code

@cindex Rechenleistung, Codeoptimierung
@cindex Optimierung, von Paketcode
@cindex Tuning, von Paketcode
@cindex SIMD-Unterstützung
@cindex tunebare Pakete
@cindex Paket-Multiversionierung
@item --tune[=@var{CPU}]
Die optimierte Version als „tunebar“ markierter Pakete benutzen. @var{CPU}
gibt die Prozessorarchitektur an, für die optimiert werden soll. Wenn als
@var{CPU} die Bezeichnung @code{native} angegeben wird oder nichts angegeben
wird, wird für den Prozessor optimiert, auf dem der Befehl @command{guix}
läuft.

Gültige Namen für @var{CPU} sind genau die, die vom zugrunde liegenden
Compiler erkannt werden. Vorgegeben ist, dass als Compiler die GNU Compiler
Collection benutzt wird. Auf x86_64-Prozessoren gehören @code{nehalem},
@code{haswell}, und @code{skylake} zu den CPU-Namen (siehe @ref{x86 Options,
@code{-march},, gcc, Using the GNU Compiler Collection (GCC)}).

Mit dem Erscheinen neuer Generationen von Prozessoren wächst der
Standardbefehlssatz (die „Instruction Set Architecture“, ISA) um neue
Befehle an, insbesondere wenn es um Befehle zur Parallelverarbeitung geht
(„Single-Instruction/Multiple-Data“, SIMD). Zum Beispiel implementieren
sowohl die Core2- als auch die Skylake-Prozessoren den x86_64-Befehlssatz,
jedoch können nur letztere AVX2-SIMD-Befehle ausführen.

Der Mehrwert, den @option{--tune} bringt, besteht in erster Linie bei
Programmen, für die SIMD-Fähigkeiten geeignet wären @emph{und} die über
keinen Mechanismus verfügen, zur Laufzeit die geeigneten Codeoptimierungen
zuzuschalten. Pakete, bei denen die Eigenschaft @code{tunable?} angegeben
wurde, werden bei der Befehlszeilenoption @option{--tune} als @dfn{tunebare
Pakete} optimiert. Eine Paketdefinition, bei der diese Eigenschaft
hinterlegt wurde, sieht so aus:

@lisp
(package
  (name "hello-simd")
  ;; …

  ;; Dieses Paket kann von SIMD-Erweiterungen profitieren,
  ;; deshalb markieren wir es als "tunebar".
  (properties '((tunable? . #t))))
@end lisp

Andere Pakete werden als @emph{nicht} tunebar aufgefasst. Dadurch kann Guix
allgemeine Binärdateien verwenden, wenn sich die Optimierung für einen
bestimmten Prozessor wahrscheinlich @emph{nicht} lohnt.

Bei der Erstellung tunebarer Pakete wird @code{-march=@var{CPU}}
übergeben. Intern wird die Befehlszeilenoption @option{-march} durch einen
Compiler-Wrapper an den eigentlichen Wrapper übergeben. Weil die
Erstellungsmaschine den Code für die Mikroarchitektur vielleicht gar nicht
ausführen kann, wird der Testkatalog bei der Erstellung tunebarer Pakete
übersprungen.

Damit weniger Neuerstellungen erforderlich sind, werden die von tunebaren
Paketen abhängigen Pakete mit den optimierten Paketen @emph{veredelt} (siehe
@ref{Sicherheitsaktualisierungen, Veredelungen}). Wenn Sie @option{--no-grafts}
übergeben, wirkt @option{--tune} deshalb @emph{nicht} mehr.

Wir geben dieser Technik den Namen @dfn{Paket-Multiversionierung}: Mehrere
Varianten des tunebaren Pakets können erstellt werden; eine für jede
Prozessorvariante. Das ist die grobkörnige Entsprechung der
@dfn{Funktions-Multiversionierung}, die in der GNU-Toolchain zu finden ist
(siehe @ref{Function Multiversioning,,, gcc, Using the GNU Compiler
Collection (GCC)}).

@item --with-source=@var{Quelle}
@itemx --with-source=@var{Paket}=@var{Quelle}
@itemx --with-source=@var{Paket}@@@var{Version}=@var{Quelle}
Den Paketquellcode für das @var{Paket} von der angegebenen @var{Quelle}
holen und die @var{Version} als seine Versionsnummer verwenden. Die
@var{Quelle} muss ein Dateiname oder eine URL sein wie bei @command{guix
download} (siehe @ref{Aufruf von guix download}).

Wird kein @var{Paket} angegeben, wird als Paketname derjenige auf der
Befehlszeile angegebene Paketname angenommen, der zur Basis am Ende der
@var{Quelle} passt@tie{}– wenn z.B.@: als @var{Quelle} die Datei
@code{/src/guile-2.0.10.tar.gz} angegeben wurde, entspricht das dem
@code{guile}-Paket.

Ebenso wird, wenn keine @var{Version} angegeben wurde, die Version als
Zeichenkette aus der @var{Quelle} abgeleitet; im vorherigen Beispiel wäre
sie @code{2.0.10}.

Mit dieser Option können Nutzer versuchen, eine andere Version ihres Pakets
auszuprobieren, als die in der Distribution enthaltene Version. Folgendes
Beispiel lädt @file{ed-1.7.tar.gz} von einem GNU-Spiegelserver herunter und
benutzt es als Quelle für das @code{ed}-Paket:

@example
guix build ed --with-source=mirror://gnu/ed/ed-1.4.tar.gz
@end example

Für Entwickler wird es einem durch @option{--with-source} leicht gemacht,
„Release Candidates“, also Vorabversionen, zu testen, oder sogar welchen
Einfluss diese auf abhängige Pakete haben:

@example
guix build elogind --with-source=…/shepherd-0.9.0rc1.tar.gz
@end example

…@: oder ein Checkout eines versionskontrollierten Repositorys in einer
isolierten Umgebung zu erstellen:

@example
$ git clone git://git.sv.gnu.org/guix.git
$ guix build guix --with-source=guix@@1.0=./guix
@end example

@item --with-input=@var{Paket}=@var{Ersatz}
Abhängigkeiten vom @var{Paket} durch eine Abhängigkeit vom
@var{Ersatz}-Paket ersetzen. Als @var{Paket} muss ein Paketname angegeben
werden und als @var{Ersatz} eine Paketspezifikation wie @code{guile} oder
@code{guile@@1.8}.

Mit folgendem Befehl wird zum Beispiel Guix erstellt, aber statt der
aktuellen stabilen Guile-Version hängt es von der alten Guile-Version
@code{guile@@2.2} ab:

@example
guix build --with-input=guile=guile@@2.2 guix
@end example

Die Ersetzung ist rekursiv und umfassend. In diesem Beispiel würde nicht nur
@code{guix}, sondern auch seine Abhängigkeit @code{guile-json} (was auch von
@code{guile} abhängt) für @code{guile@@2.2} neu erstellt.

Implementiert wird das alles mit der Scheme-Prozedur
@code{package-input-rewriting/spec} (siehe @ref{Pakete definieren,
@code{package-input-rewriting/spec}}).

@item --with-graft=@var{Paket}=@var{Ersatz}
Dies verhält sich ähnlich wie mit @option{--with-input}, aber mit dem
wichtigen Unterschied, dass nicht die gesamte Abhängigkeitskette neu
erstellt wird, sondern das @var{Ersatz}-Paket erstellt und die
ursprünglichen Binärdateien, die auf das @var{Paket} verwiesen haben, damit
@dfn{veredelt} werden. Im Abschnitt @ref{Sicherheitsaktualisierungen} finden Sie
weitere Informationen über Veredelungen.

Zum Beispiel veredelt folgender Befehl Wget und alle Abhängigkeiten davon
mit der Version 3.5.4 von GnuTLS, indem Verweise auf die ursprünglich
verwendete GnuTLS-Version ersetzt werden:

@example
guix build --with-graft=gnutls=gnutls@@3.5.4 wget
@end example

Das hat den Vorteil, dass es viel schneller geht, als alles neu zu
erstellen. Die Sache hat aber einen Haken: Veredelung funktioniert nur, wenn
das @var{Paket} und sein @var{Ersatz} miteinander streng kompatibel
sind@tie{}– zum Beispiel muss, wenn diese eine Programmbibliothek zur
Verfügung stellen, deren Binärschnittstelle („Application Binary Interface“,
kurz ABI) kompatibel sein. Wenn das @var{Ersatz}-Paket auf irgendeine Art
inkompatibel mit dem @var{Paket} ist, könnte das Ergebnispaket unbrauchbar
sein. Vorsicht ist also geboten!

@cindex Dateien zur Fehlersuche, neu erstellen
@item --with-debug-info=@var{Paket}
Das @var{Paket} auf eine Weise erstellen, die Informationen zur Fehlersuche
enthält, und von ihm abhängige Pakete damit veredeln. Das ist nützlich, wenn
das @var{Paket} noch keine Fehlersuchinformationen als installierbare
@code{debug}-Ausgabe enthält (siehe @ref{Dateien zur Fehlersuche installieren}).

Als Beispiel nehmen wir an, Inkscape stürzt bei Ihnen ab und Sie möchten
wissen, was dabei in GLib passiert. Die GLib-Bibliothek liegt tief im
Abhängigkeitsgraphen von Inkscape und verfügt nicht über eine
@code{debug}-Ausgabe; das erschwert die Fehlersuche. Glücklicherweise können
Sie GLib mit Informationen zur Fehlersuche neu erstellen und an Inkscape
anheften:

@example
guix install inkscape --with-debug-info=glib
@end example

Nur GLib muss neu kompiliert werden, was in vernünftiger Zeit möglich
ist. Siehe @ref{Dateien zur Fehlersuche installieren} für mehr Informationen.

@quotation Anmerkung
Intern funktioniert diese Option, indem @samp{#:strip-binaries? #f} an das
Erstellungssystem des betreffenden Pakets übergeben wird (siehe @ref{Erstellungssysteme}). Die meisten Erstellungssysteme unterstützen diese Option, manche
aber nicht. In diesem Fall wird ein Fehler gemeldet.

Auch wenn ein in C/C++ geschriebenes Paket ohne @code{-g} erstellt wird (was
selten der Fall ist), werden Informationen zur Fehlersuche weiterhin fehlen,
obwohl @code{#:strip-binaries?} auf falsch steht.
@end quotation

@cindex Toolchain, die Erstellungs-Toolchain eines Pakets ändern
@item --with-c-toolchain=@var{Paket}=@var{Toolchain}
Mit dieser Befehlszeilenoption wird die Kompilierung des @var{Paket}s und
aller davon abhängigen Objekte angepasst, so dass mit der @var{Toolchain}
statt der vorgegebenen GNU-Toolchain für C/C++ erstellt wird.

Betrachten Sie dieses Beispiel:

@example
guix build octave-cli \
  --with-c-toolchain=fftw=gcc-toolchain@@10 \
  --with-c-toolchain=fftwf=gcc-toolchain@@10
@end example

Mit dem obigen Befehl wird eine Variante der Pakete @code{fftw} und
@code{fftwf} mit Version@tie{}10 der @code{gcc-toolchain} anstelle der
vorgegebenen Toolchain erstellt, um damit anschließend eine diese benutzende
Variante des GNU-Octave-Befehlszeilenprogramms zu erstellen. Auch
GNU@tie{}Octave selbst wird mit @code{gcc-toolchain@@10} erstellt.

Das zweite Beispiel bewirkt eine Erstellung der „Hardware
Locality“-Bibliothek (@code{hwloc}) sowie ihrer abhängigen Objekte bis
einschließlich @code{intel-mpi-benchmarks} mit dem Clang-C-Compiler:

@example
guix build --with-c-toolchain=hwloc=clang-toolchain \
           intel-mpi-benchmarks
@end example

@quotation Anmerkung
Es kann vorkommen, dass die Anwendungsbinärschnittstellen („Application
Binary Interfaces“, kurz ABIs) der Toolchains inkompatibel sind. Das tritt
vor allem bei der C++-Standardbibliothek und Bibliotheken zur
Laufzeitunterstützung wie denen von OpenMP auf. Indem alle abhängigen
Objekte mit derselben Toolchain erstellt werden, minimiert
@option{--with-c-toolchain} das Risiko, dass es zu Inkompatibilitäten kommt,
aber es kann nicht ganz ausgeschlossen werden. Bedenken Sie, für welches
@var{Paket} Sie dies benutzen.
@end quotation

@item --with-git-url=@var{Paket}=@var{URL}
@cindex Git, den neuesten Commit benutzen
@cindex neuester Commit, davon erstellen
Build @var{package} from the latest commit of the @code{master} branch of
the Git repository at @var{url}.  Git sub-modules of the repository are
fetched, recursively, if @var{package} @code{source} is not a Git
repository, otherwise it depends on the inherited value of
@code{recursive?}.

Zum Beispiel erstellt der folgende Befehl die NumPy-Python-Bibliothek unter
Verwendung des neuesten Commits von Python auf dessen „master“-Branch.

@example
guix build python-numpy \
  --with-git-url=python=https://github.com/python/cpython
@end example

Diese Befehlszeilenoption kann auch mit @option{--with-branch} oder
@option{--with-commit} kombiniert werden (siehe unten).

@cindex Kontinuierliche Integration
Da es den neuesten Commit auf dem verwendeten Branch benutzt, ändert sich
das Ergebnis natürlich mit der Zeit. Nichtsdestoweniger ist es eine bequeme
Möglichkeit, ganze Softwarestapel auf dem neuesten Commit von einem oder
mehr Paketen aufbauen zu lassen. Es ist besonders nützlich im Kontext
Kontinuierlicher Integration (englisch „Continuous Integration“, kurz CI).

Checkouts bleiben zwischengespeichert als @file{~/.cache/guix/checkouts},
damit danach schneller auf dasselbe Repository zugegriffen werden
kann. Eventuell möchten Sie das Verzeichnis ab und zu bereinigen, um
Plattenplatz zu sparen.

@item --with-branch=@var{Paket}=@var{Branch}
Das @var{Paket} aus dem neuesten Commit auf dem @var{Branch} erstellen. Wenn
das @code{source}-Feld des @var{Paket}s ein origin-Objekt mit der Methode
@code{git-fetch} (siehe @ref{„origin“-Referenz}) oder ein
@code{git-checkout}-Objekt ist, wird die URL des Repositorys vom
@code{source}-Feld genommen. Andernfalls müssen Sie die Befehlszeilenoption
@option{--with-git-url} benutzen, um die URL des Git-Repositorys anzugeben.

Zum Beispiel wird mit dem folgenden Befehl @code{guile-sqlite3} aus dem
neuesten Commit seines @code{master}-Branches erstellt und anschließend
@code{guix} (was von @code{guile-sqlite3} abhängt) und @code{cuirass} (was
von @code{guix} abhängt) unter Nutzung genau dieser
@code{guile-sqlite3}-Erstellung erstellt:

@example
guix build --with-branch=guile-sqlite3=master cuirass
@end example

@item --with-commit=@var{Paket}=@var{Commit}
Dies verhält sich ähnlich wie @option{--with-branch}, außer dass es den
angegebenen @var{Commit} benutzt statt die Spitze eines angegebenen
Branches. Als @var{Commit} muss ein gültiger SHA1-Bezeichner, ein Tag oder
ein Bezeichner wie von @command{git describe} (wie @code{1.0-3-gabc123}) für
einen Git-Commit angegeben werden.

@item --with-patch=@var{Paket}=@var{Datei}
Die @var{Datei} zur Liste der auf das @var{Paket} anzuwendenden Patches
hinzufügen. Als @var{Paket} muss eine Spezifikation wie @code{python@@3.8}
oder @code{glibc} benutzt werden. In der @var{Datei} muss ein Patch
enthalten sein; er wird mit den im Ursprung (@code{origin}) des @var{Paket}s
angegebenen Befehlszeilenoptionen angewandt (siehe @ref{„origin“-Referenz}). Die vorgegebenen Optionen enthalten @code{-p1} (siehe
@ref{patch Directories,,, diffutils, Comparing and Merging Files}).

Zum Beispiel wird mit dem folgenden Befehl für die Neuerstellung von
Coreutils die GNU-C-Bibliothek (glibc) wie angegeben gepatcht:

@example
guix build coreutils --with-patch=glibc=./glibc-frob.patch
@end example

In diesem Beispiel wird glibc selbst und alles, was im Abhängigkeitsgraphen
auf dem Weg zu Coreutils liegt, neu erstellt.

@cindex configure-Befehlszeilenoptionen, ändern
@item --with-configure-flag=@var{Paket}=@var{Befehlszeilenoption}
Hängt die @var{Befehlszeilenoption} an die Befehlszeilenoptionen an, die zur
Erstellung von @var{Paket} an den Aufruf von configure übergeben
werden. @var{Paket} wird als Paketspezifikation angegeben, etwa
@code{guile@@3.0} oder @code{glibc}. Das Erstellungssystem von @var{Paket}
muss dafür das Argument @code{#:configure-flags} unterstützen.

Zum Beispiel können Sie mit folgendem Befehl GNU@tie{}Hello mit der
configure-Option @code{--disable-nls} erstellen:

@example
guix build hello --with-configure-flag=hello=--disable-nls
@end example

Folgender Befehl gibt @command{cmake} eine zusätzliche Option beim Erstellen
von @code{lapack} mit:

@example
guix build lapack \
  --with-configure-flag=lapack=-DBUILD_SHARED_LIBS=OFF
@end example

@quotation Anmerkung
Intern funktioniert diese Option, indem das Argument
@samp{#:configure-flags} an das Erstellungssystem des betreffenden Pakets
übergeben wird (siehe @ref{Erstellungssysteme}). Die meisten Erstellungssysteme
unterstützen diese Option, manche aber nicht. In diesem Fall wird ein Fehler
gemeldet.
@end quotation

@cindex Anbieter von Paketen (Upstream), neueste Version
@item --with-latest=@var{Paket}
@itemx --with-version=@var{Paket}=@var{Version}
Sie hätten gerne das Neueste vom Neuen? Dann ist die Befehlszeilenoption
@option{--with-latest} das Richtige für Sie! Damit wird jedes Vorkommen von
@var{Paket} im Abhängigkeitsgraphen durch dessen neueste angebotene Version
ersetzt, wie sie auch von @command{guix refresh} gemeldet würde (siehe
@ref{Aufruf von guix refresh}).

Dazu wird die neueste angebotene Version des @var{Paket}s ermittelt (wenn
möglich), heruntergeladen und, @emph{wenn} eine OpenPGP-Signatur mit dabei
ist, es damit authentifiziert.

Zum Beispiel wird durch folgenden Befehl Guix mit der neuesten Version von
Guile-JSON erstellt:

@example
guix build guix --with-latest=guile-json
@end example

Die Paketumwandlungsoption @option{--with-version} funktioniert ähnlich, nur
können Sie damit genau festlegen, welche @var{Version} benutzt werden soll,
sofern diese Version vom Anbieter heruntergeladen werden kann. Um zum
Beispiel eine Entwicklungsumgebung zur Arbeit mit SciPy, erstellt für die
NumPy-Version 1.22.4, herzustellen (wobei wir den Testkatalog davon
überspringen, weil wir nicht warten wollen), lautet der Befehl:

@example
guix shell python python-scipy --with-version=python-numpy=1.22.4
@end example

@quotation Warnung
Hier wird aus dem beim Anbieter zu einer bestimmten Zeit veröffentlichten
Quellcode eine Abhängigkeit. Deswegen ist mit @option{--with-latest} und
@option{--with-version} bereitgestellte Software unter Umständen nicht
reproduzierbar, weil der Quellcode auf Anbieter-Servern verschwindet oder
für die gleiche Versionsnummer anderer Quellcode angeboten wird.

Wenn Sie alte Software-Versionen auf reproduzierbare Weise nachbilden können
wollen, siehe @ref{Aufruf von time-machine, @command{guix time-machine}}.
@end quotation

Es gibt jedoch Einschränkungen. Erstens gehen Sie in dem Fall, dass das
Werkzeug nicht in der Lage ist oder nicht weiß, wie es den Quellcode
authentifiziert, das Risiko ein, dass bösartiger Code ausgeführt wird; Ihnen
wird dann eine Warnung angezeigt. Zweitens wird mit dieser Option einfach
der Quellcode ausgetauscht und die übrige Paketdefinition bleibt
erhalten. Manchmal reicht das nicht; es könnte sein, dass neue
Abhängigkeiten hinzugefügt oder neue Patches angewandt werden müssen oder
dass ganz allgemein Arbeiten zur Qualitätssicherung, die Guix-Entwickler
normalerweise leisten, fehlen werden.

Sie sind gewarnt worden! Wenn die Einschränkungen unbedenklich sind, können
Sie das Paket zackig auf den neuesten Stand bringen. Wir ermutigen Sie dazu,
Patches einzureichen, die die eigentliche Paketdefinition aktualisieren,
sobald Sie die neue Version mit der Befehlszeilenoption
@option{--with-latest} erfolgreich getestet haben (siehe
@ref{Mitwirken}).

@cindex Testkatalog, überspringen
@item --without-tests=@var{Paket}
Das @var{Paket} erstellen, ohne seine Tests zu durchlaufen. Das erweist sich
als nützlich, wenn Sie Testkataloge überspringen möchten, die viel Zeit in
Anspruch nehmen, oder wenn der Testkatalog eines Pakets nichtdeterministisch
fehlschlägt. Dies sollte mit Bedacht eingesetzt werden, denn das Ausführen
des Testkatalogs sichert zu, dass ein Paket wie gewollt funktioniert.

Wenn die Tests abgeschaltet werden, ergibt sich ein anderes
Store-Objekt. Dadurch muss, wenn diese Option benutzt wird, auch alles, was
vom Paket abhängt, neu erstellt werden, wie Sie in diesem Beispiel sehen
können:

@example
guix install --without-tests=python python-notebook
@end example

Mit obigem Befehl wird @code{python-notebook} für ein @code{python}
installiert, dessen Testkatalog nicht ausgeführt wurde. Dazu wird auch alles
neu erstellt, was von @code{python} abhängt, einschließlich
@code{python-notebook}.

Intern funktioniert @option{--without-tests}, indem es die Option
@code{#:tests?} der @code{check}-Phase eines Pakets abändert (siehe
@ref{Erstellungssysteme}). Beachten Sie, dass manche Pakete eine angepasste
@code{check}-Phase benutzen, die eine Einstellung wie @code{#:tests? #f}
nicht berücksichtigt. Deshalb wirkt sich @option{--without-tests} auf diese
Pakete nicht aus.

@end table

Sie fragen sich sicher, wie Sie dieselbe Wirkung mit Scheme-Code erzielen
können, zum Beispiel wenn Sie Ihr Manifest oder eine eigene Paketumwandlung
schreiben? Siehe @ref{Paketvarianten definieren} für eine Übersicht über
verfügbare Programmierschnittstellen.

@node Zusätzliche Erstellungsoptionen
@subsection Zusätzliche Erstellungsoptionen

Die unten aufgeführten Befehlszeilenoptionen funktionieren nur mit
@command{guix build}.

@table @code

@item --quiet
@itemx -q
Schweigend erstellen, ohne das Erstellungsprotokoll anzuzeigen@tie{}– dies
ist äquivalent zu @option{--verbosity=0}. Nach Abschluss der Erstellung ist
das Protokoll in @file{/var} (oder einem entsprechenden Ort) einsehbar und
kann jederzeit mit der Befehlszeilenoption @option{--log-file} gefunden
werden.

@item --file=@var{Datei}
@itemx -f @var{Datei}
Das Paket, die Ableitung oder das dateiähnliche Objekt erstellen, zu dem der
Code in der @var{Datei} ausgewertet wird (siehe @ref{G-Ausdrücke,
dateiartige Objekte}).

Zum Beispiel könnte in der @var{Datei} so eine Paketdefinition stehen (siehe
@ref{Pakete definieren}):

@lisp
@include package-hello.scm
@end lisp

Die @var{Datei} darf auch eine JSON-Darstellung von einer oder mehreren
Paketdefinitionen sein. Wenn wir @code{guix build -f} auf einer
@file{hello.json}-Datei mit dem folgenden Inhalt ausführen würden, würden
die Pakete @code{myhello} und @code{greeter} erstellt werden:

@example
@verbatiminclude package-hello.json
@end example

@item --manifest=@var{Manifest}
@itemx -m @var{Manifest}
Alle Pakete erstellen, die im angegebenen @var{Manifest} stehen (siehe
@ref{profile-manifest, @option{--manifest}}).

@item --expression=@var{Ausdruck}
@itemx -e @var{Ausdruck}
Das Paket oder die Ableitung erstellen, zu der der @var{Ausdruck}
ausgewertet wird.

Zum Beispiel kann der @var{Ausdruck} @code{(@@ (gnu packages guile)
guile-1.8)} sein, was diese bestimmte Variante der Version 1.8 von Guile
eindeutig bezeichnet.

Alternativ kann der @var{Ausdruck} ein G-Ausdruck sein. In diesem Fall wird
er als Erstellungsprogramm an @code{gexp->derivation} übergeben (siehe
@ref{G-Ausdrücke}).

Zudem kann der @var{Ausdruck} eine monadische Prozedur mit null Argumenten
bezeichnen (siehe @ref{Die Store-Monade}). Die Prozedur muss eine Ableitung
als monadischen Wert zurückliefern, die dann durch @code{run-with-store}
laufen gelassen wird.

@item --development
@itemx -D
Die „Entwicklungsumgebung“ (Abhängigkeiten der Erstellung) für das folgende
Paket erstellen.

Zum Beispiel werden mit dem folgenden Befehl die Eingaben von @code{hello}
erstellt, allerdings @emph{nicht} @code{hello} selbst, und zusätzlich wird
@code{guile} erstellt:

@example
guix build -D hello guile
@end example

Beachten Sie, dass sich @option{-D} (oder @option{--development}) nur auf
das direkt folgende Paket auf der Befehlszeile bezieht. Intern benutzt es
@code{package->development-manifest} (siehe
@ref{package-development-manifest, @code{package->development-manifest}}).

@quotation Anmerkung
Die Wirkung, wenn Sie @option{--development} und @option{--target} (für
Cross-Kompilierung) zusammen benutzen, ist vielleicht nicht, was Sie
erwarten: Alle abhängigen Pakete des angegebenen Pakets, die es hat, wenn es
nativ kompiliert wird, werden cross-kompiliert.
@end quotation

@cindex Abhängige eines Pakets, diese erstellen
@cindex Erstellen der Abhängigen eines Pakets
@anchor{build-dependents}
@item --dependents[=@var{Tiefe}]
@itemx -P @var{depth}
Erstellt die Abhängigen des folgenden Pakets. Vorgegeben ist, dass alle
direkten und indirekten Abhängigen erstellt werden. Wenn eine @var{Tiefe}
angegeben wird, werden nur so weit entfernte Abhängige erstellt: 1 bedeutet
direkte Abhängige, 2 sind auch Abhängige von Abhängigen, und so weiter.

Zum Beispiel lässt der folgende Befehl @emph{alle} Abhängigen von libgit2
erstellen:

@example
guix build --dependents libgit2
@end example

Um alle direkt von NumPy abhängigen Pakete zu erstellen, führen Sie aus:

@example
guix build -P1 python-numpy
@end example

Was zur Liste der Abhängigen gehört, wird genauso berechnet wie bei
@command{guix refresh --list-dependent} (siehe @ref{Aufruf von guix refresh}).

@item --source
@itemx -S
Die Quellcode-Ableitung der Pakete statt die Pakete selbst erstellen.

Zum Beispiel liefert @code{guix build -S gcc} etwas in der Art von
@file{/gnu/store/…-gcc-4.7.2.tar.bz2}, also den Tarball mit dem
GCC-Quellcode.

Der gelieferte Quell-Tarball ist das Ergebnis davon, alle Patches und
Code-Schnipsel aufzuspielen, die im @code{origin}-Objekt des Pakets
festgelegt wurden (siehe @ref{Pakete definieren}).

@cindex Quellcode, überprüfen
Wie andere Arten von Ableitung kann auch das Ergebnis einer
Quellcode-Ableitung mit der Befehlszeilenoption @option{--check} geprüft
werden (siehe @ref{build-check}). Das ist nützlich, um zu überprüfen, ob ein
(vielleicht bereits erstellter oder substituierter, also
zwischengespeicherter) Paketquellcode zu ihrer deklarierten Hash-Prüfsumme
passt.

Beachten Sie, dass @command{guix build -S} nur für die angegebenen Pakete
den Quellcode herunterlädt. Dazu gehört @emph{nicht} der Quellcode statisch
gebundener Abhängigkeiten und der Quellcode alleine reicht nicht aus, um die
Pakete zu reproduzieren.

@item --sources
Den Quellcode für @var{Paket-oder-Ableitung} und alle Abhängigkeiten davon
rekursiv herunterladen und zurückliefern. Dies ist eine praktische Methode,
eine lokale Kopie des gesamten Quellcodes zu beziehen, der nötig ist, um die
Pakete zu erstellen, damit Sie diese später auch ohne Netzwerkzugang
erstellen lassen können. Es handelt sich um eine Erweiterung der
Befehlszeilenoption @option{--source}, die jeden der folgenden Argumentwerte
akzeptiert:

@table @code
@item package
Mit diesem Wert verhält sich die Befehlszeilenoption @option{--sources} auf
genau die gleiche Weise wie die Befehlszeilenoption @option{--source}.

@item all
Erstellt die Quellcode-Ableitungen aller Pakete einschließlich allen
Quellcodes, der als Teil der Eingaben im @code{inputs}-Feld aufgelistet
ist. Dies ist der vorgegebene Wert, wenn sonst keiner angegeben wird.

@example
$ guix build --sources tzdata
Folgende Ableitungen werden erstellt:
   /gnu/store/…-tzdata2015b.tar.gz.drv
   /gnu/store/…-tzcode2015b.tar.gz.drv
@end example

@item transitive
Die Quellcode-Ableitungen aller Pakete sowie aller transitiven Eingaben der
Pakete erstellen. Damit kann z.B.@: Paket-Quellcode vorab heruntergeladen
und später offline erstellt werden.

@example
$ guix build --sources=transitive tzdata
Folgende Ableitungen werden erstellt:
   /gnu/store/…-tzcode2015b.tar.gz.drv
   /gnu/store/…-findutils-4.4.2.tar.xz.drv
   /gnu/store/…-grep-2.21.tar.xz.drv
   /gnu/store/…-coreutils-8.23.tar.xz.drv
   /gnu/store/…-make-4.1.tar.xz.drv
   /gnu/store/…-bash-4.3.tar.xz.drv
…
@end example

@end table

@item --system=@var{System}
@itemx -s @var{System}
Versuchen, für das angegebene @var{System}@tie{}– z.B.@:
@code{i686-linux}@tie{}– statt für denselben Systemtyp wie auf dem
Wirtssystem zu erstellen. Beim Befehl @command{guix build} können Sie diese
Befehlszeilenoption mehrmals wiederholen, wodurch für jedes angegebene
System eine Erstellung durchgeführt wird; andere Befehle ignorieren
überzählige @option{-s}-Befehlszeilenoptionen.

@quotation Anmerkung
Die Befehlszeilenoption @option{--system} dient der @emph{nativen}
Kompilierung (nicht zu verwechseln mit Cross-Kompilierung). Siehe
@option{--target} unten für Informationen zur Cross-Kompilierung.
@end quotation

Ein Beispiel sind Linux-basierte Systeme, die verschiedene Persönlichkeiten
emulieren können. Zum Beispiel können Sie @option{--system=i686-linux} auf
einem @code{x86_64-linux}-System oder @option{--system=armhf-linux} auf
einem @code{aarch64-linux}-System angeben, um Pakete in einer vollständigen
32-Bit-Umgebung zu erstellen.

@quotation Anmerkung
Das Erstellen für ein @code{armhf-linux}-System ist ungeprüft auf allen
@code{aarch64-linux}-Maschinen aktiviert, obwohl bestimmte aarch64-Chipsätze
diese Funktionalität nicht unterstützen, darunter auch ThunderX.
@end quotation

Ebenso können Sie, wenn transparente Emulation mit QEMU und
@code{binfmt_misc} aktiviert sind (siehe @ref{Virtualisierungsdienste,
@code{qemu-binfmt-service-type}}), für jedes System Erstellungen
durchführen, für das ein QEMU-@code{binfmt_misc}-Handler installiert ist.

Erstellungen für ein anderes System, das nicht dem System der Maschine, die
Sie benutzen, entspricht, können auch auf eine entfernte Maschine mit der
richtigen Architektur ausgelagert werden. Siehe @ref{Auslagern des Daemons einrichten}
für mehr Informationen über das Auslagern.

@item --target=@var{Tripel}
@cindex Cross-Kompilieren
Lässt für das angegebene @var{Tripel} cross-erstellen. Dieses muss ein
gültiges GNU-Tripel wie z.B.@: @code{"aarch64-linux-gnu"} sein (siehe
@ref{Specifying Target Triplets, GNU-Konfigurationstripel,, autoconf,
Autoconf}).

@item --list-systems
Listet alle unterstützten Systeme auf, die als Argument an @option{--system}
gegeben werden können.

@item --list-targets
Listet alle unterstützten Ziele auf, die als Argument an @option{--target}
gegeben werden können.

@anchor{build-check}
@item --check
@cindex Determinismus, Überprüfung
@cindex Reproduzierbarkeit, Überprüfung
@var{Paket-oder-Ableitung} erneut erstellen, wenn diese bereits im Store
verfügbar ist, und einen Fehler melden, wenn die Erstellungsergebnisse nicht
Bit für Bit identisch sind.

Mit diesem Mechanismus können Sie überprüfen, ob zuvor installierte
Substitute unverfälscht sind (siehe @ref{Substitute}) oder auch ob das
Erstellungsergebnis eines Pakets deterministisch ist. Siehe @ref{Aufruf von guix challenge} für mehr Hintergrundinformationen und Werkzeuge.

Wenn dies zusammen mit @option{--keep-failed} benutzt wird, bleiben die sich
unterscheidenden Ausgaben im Store unter dem Namen
@file{/gnu/store/…-check}. Dadurch können Unterschiede zwischen den beiden
Ergebnissen leicht erkannt werden.

@item --repair
@cindex Reparieren von Store-Objekten
@cindex Datenbeschädigung, Behebung
Versuchen, die angegebenen Store-Objekte zu reparieren, wenn sie beschädigt
sind, indem sie neu heruntergeladen oder neu erstellt werden.

Diese Operation ist nicht atomar und nur der Administratornutzer @code{root}
kann sie verwenden.

@item --derivations
@itemx -d
Liefert die Ableitungspfade und @emph{nicht} die Ausgabepfade für die
angegebenen Pakete.

@item --root=@var{Datei}
@itemx -r @var{Datei}
@cindex GC-Wurzeln, Hinzufügen
@cindex Müllsammlerwurzeln, Hinzufügen
Die @var{Datei} zu einer symbolischen Verknüpfung auf das Ergebnis machen
und als Müllsammlerwurzel registrieren.

Dadurch wird das Ergebnis dieses Aufrufs von @command{guix build} vor dem
Müllsammler geschützt, bis die @var{Datei} gelöscht wird. Wird diese
Befehlszeilenoption @emph{nicht} angegeben, können Erstellungsergebnisse vom
Müllsammler geholt werden, sobald die Erstellung abgeschlossen ist. Siehe
@ref{Aufruf von guix gc} für mehr Informationen zu Müllsammlerwurzeln.

@item --log-file
@cindex Erstellungsprotokolle, Zugriff
Liefert die Dateinamen oder URLs der Erstellungsprotokolle für das
angegebene @var{Paket-oder-Ableitung} oder meldet einen Fehler, falls
Protokolldateien fehlen.

Dies funktioniert, egal wie die Pakete oder Ableitungen angegeben
werden. Zum Beispiel sind folgende Aufrufe alle äquivalent:

@example
guix build --log-file $(guix build -d guile)
guix build --log-file $(guix build guile)
guix build --log-file guile
guix build --log-file -e '(@@ (gnu packages guile) guile-2.0)'
@end example

Wenn ein Protokoll lokal nicht verfügbar ist und sofern
@option{--no-substitutes} nicht übergeben wurde, sucht der Befehl nach einem
entsprechenden Protokoll auf einem der Substitutserver.

Stellen Sie sich zum Beispiel vor, sie wollten das Erstellungsprotokoll von
GDB auf einem @code{aarch64}-System sehen, benutzen aber selbst eine
@code{x86_64}-Maschine:

@example
$ guix build --log-file gdb -s aarch64-linux
https://@value{SUBSTITUTE-SERVER-1}/log/…-gdb-7.10
@end example

So haben Sie umsonst Zugriff auf eine riesige Bibliothek von
Erstellungsprotokollen!
@end table

@node Fehlschläge beim Erstellen untersuchen
@subsection Fehlschläge beim Erstellen untersuchen

@cindex Erstellungsfehler, Fehlersuche
Wenn Sie ein neues Paket definieren (siehe @ref{Pakete definieren}), werden
Sie sich vermutlich einige Zeit mit der Fehlersuche beschäftigen und die
Erstellung so lange anpassen, bis sie funktioniert. Dazu müssen Sie die
Erstellungsbefehle selbst in einer Umgebung benutzen, die der, die der
Erstellungsdaemon aufbaut, so ähnlich wie möglich ist.

Das Erste, was Sie dafür tun müssen, ist die Befehlszeilenoption
@option{--keep-failed} oder @option{-K} von @command{guix build}
einzusetzen, wodurch Verzeichnisbäume fehlgeschlagener Erstellungen in
@file{/tmp} oder dem von Ihnen als @env{TMPDIR} ausgewiesenen Verzeichnis
erhalten und nicht gelöscht werden (siehe @ref{Gemeinsame Erstellungsoptionen,
@option{--keep-failed}}).

Im Anschluss können Sie mit @command{cd} in die Verzeichnisse dieses
fehlgeschlagenen Erstellungsbaums wechseln und mit @command{source} dessen
@file{environment-variables}-Datei laden, die alle
Umgebungsvariablendefinitionen enthält, die zum Zeitpunkt des Fehlschlags
der Erstellung galten. Sagen wir, Sie suchen Fehler in einem Paket
@code{foo}, dann würde eine typische Sitzung so aussehen:

@example
$ guix build foo -K
…@: @i{Erstellung schlägt fehl}
$ cd /tmp/guix-build-foo.drv-0
$ source ./environment-variables
$ cd foo-1.2
@end example

Nun können Sie Befehle (fast) so aufrufen, als wären Sie der Daemon, und
Fehlerursachen in Ihrem Erstellungsprozess ermitteln.

Manchmal passiert es, dass zum Beispiel die Tests eines Pakets erfolgreich
sind, wenn Sie sie manuell aufrufen, aber scheitern, wenn der Daemon sie
ausführt. Das kann passieren, weil der Daemon Erstellungen in isolierten
Umgebungen („Containern“) durchführt, wo, anders als in der obigen Umgebung,
kein Netzwerkzugang möglich ist, @file{/bin/sh} nicht exisiert usw.@: (siehe
@ref{Einrichten der Erstellungsumgebung}).

In solchen Fällen müssen Sie den Erstellungsprozess womöglich aus einer zu
der des Daemons ähnlichen isolierten Umgebung heraus ausprobieren:

@example
$ guix build -K foo
…
$ cd /tmp/guix-build-foo.drv-0
$ guix shell --no-grafts -C -D foo strace gdb
[env]# source ./environment-variables
[env]# cd foo-1.2
@end example

Hierbei erzeugt @command{guix shell -C} eine isolierte Umgebung und öffnet
darin eine Shell (siehe @ref{Aufruf von guix shell}). Der Teil mit
@command{strace gdb} fügt die Befehle @command{strace} und @command{gdb} zur
isolierten Umgebung hinzu, die Sie gut gebrauchen können, während Sie Fehler
suchen. Wegen der Befehlszeilenoption @option{--no-grafts} bekommen Sie
haargenau dieselbe Umgebung ohne veredelte Pakete (siehe @ref{Sicherheitsaktualisierungen} für mehr Informationen zu Veredelungen).

Um der isolierten Umgebung des Erstellungsdaemons noch näher zu kommen,
können wir @file{/bin/sh} entfernen (wobei Sie zunächst die
Befehlszeilenoption @option{--writable-root} für @command{guix shell}
angeben müssen):

@example
[env]# rm /bin/sh
@end example

(Keine Sorge, das ist harmlos: All dies passiert nur in der zuvor von
@command{guix shell} erzeugten Wegwerf-Umgebung.)

Der Befehl @command{strace} befindet sich wahrscheinlich nicht in Ihrem
Suchpfad, aber wir können ihn so benutzen:

@example
[env]# $GUIX_ENVIRONMENT/bin/strace -f -o log make check
@end example

Auf diese Weise haben Sie nicht nur die Umgebungsvariablen, die der Daemon
benutzt, nachgebildet, sondern lassen auch den Erstellungsprozess in einer
isolierten Umgebung ähnlich der des Daemons laufen.


@node Aufruf von guix edit
@section @command{guix edit} aufrufen

@cindex @command{guix edit}
@cindex Paketdefinition, Bearbeiten
So viele Pakete, so viele Quelldateien! Der Befehl @command{guix edit}
erleichtert das Leben von sowohl Nutzern als auch Paketentwicklern, indem er
Ihren Editor anweist, die Quelldatei mit der Definition des jeweiligen
Pakets zu bearbeiten. Zum Beispiel startet dies:

@example
guix edit gcc@@4.9 vim
@end example

@noindent
das mit der Umgebungsvariablen @env{VISUAL} oder @env{EDITOR} angegebene
Programm und lässt es das Rezept von GCC@tie{}4.9.3 und von Vim anzeigen.

Wenn Sie ein Git-Checkout von Guix benutzen (siehe @ref{Erstellung aus dem Git})
oder Ihre eigenen Pakete im @env{GUIX_PACKAGE_PATH} erstellt haben (siehe
@ref{Paketmodule}), werden Sie damit die Paketrezepte auch bearbeiten
können. Andernfalls werden Sie zumindest in die Lage versetzt, die nur
lesbaren Rezepte für sich im Moment im Store befindliche Pakete zu
untersuchen.

Statt @env{GUIX_PACKAGE_PATH} zu benutzen, können Sie mit der
Befehlszeilenoption @option{--load-path=@var{Verzeichnis}} (oder kurz
@option{-L @var{Verzeichnis}}) das @var{Verzeichnis} vorne an den
Paketmodul-Suchpfad anhängen und so Ihre eigenen Pakete sichtbar machen.

@node Aufruf von guix download
@section @command{guix download} aufrufen

@cindex @command{guix download}
@cindex Paketquellcode herunterladen
Wenn Entwickler einer Paketdefinition selbige schreiben, müssen diese
normalerweise einen Quellcode-Tarball herunterladen, seinen SHA256-Hash als
Prüfsumme berechnen und diese in der Paketdefinition eintragen (siehe
@ref{Pakete definieren}). Das Werkzeug @command{guix download} hilft bei
dieser Aufgabe: Damit wird eine Datei von der angegebenen URI
heruntergeladen, in den Store eingelagert und sowohl ihr Dateiname im Store
als auch ihr SHA256-Hash als Prüfsumme angezeigt.

Dadurch, dass die heruntergeladene Datei in den Store eingefügt wird, wird
Bandbreite gespart: Wenn der Entwickler schließlich versucht, das neu
definierte Paket mit @command{guix build} zu erstellen, muss der
Quell-Tarball nicht erneut heruntergeladen werden, weil er sich bereits im
Store befindet. Es ist auch eine bequeme Methode, Dateien temporär
aufzubewahren, die letztlich irgendwann gelöscht werden (siehe @ref{Aufruf von guix gc}).

Der Befehl @command{guix download} unterstützt dieselben URIs, die in
Paketdefinitionen verwendet werden. Insbesondere unterstützt er
@code{mirror://}-URIs. @code{https}-URIs (HTTP über TLS) werden unterstützt,
@emph{vorausgesetzt} die Guile-Anbindungen für GnuTLS sind in der Umgebung
des Benutzers verfügbar; wenn nicht, wird ein Fehler gemeldet. Siehe die
@ref{Guile Preparations, Installationsanleitung der GnuTLS-Anbindungen für
Guile,, gnutls-guile, GnuTLS-Guile} für mehr Informationen.

Mit @command{guix download} werden HTTPS-Serverzertifikate verifiziert,
indem die Zertifikate der X.509-Autoritäten in das durch die
Umgebungsvariable @env{SSL_CERT_DIR} bezeichnete Verzeichnis heruntergeladen
werden (siehe @ref{X.509-Zertifikate}), außer
@option{--no-check-certificate} wird benutzt.

Alternativ können Sie @command{guix download} auch benutzen, um ein
Git-Repository herunterzuladen, insbesondere auch einen bestimmten Commit,
Tag oder Branch.

Folgende Befehlszeilenoptionen stehen zur Verfügung:

@table @code
@item --hash=@var{Algorithmus}
@itemx -H @var{Algorithmus}
Einen Hash mit dem angegebenen @var{Algorithmus} berechnen. Siehe
@ref{Aufruf von guix hash} für weitere Informationen.

@item --format=@var{Format}
@itemx -f @var{Format}
Die Hash-Prüfsumme im angegebenen @var{Format} ausgeben. Für weitere
Informationen, was gültige Werte für das @var{Format} sind, siehe
@ref{Aufruf von guix hash}.

@item --no-check-certificate
X.509-Zertifikate von HTTPS-Servern @emph{nicht} validieren.

Wenn Sie diese Befehlszeilenoption benutzen, haben Sie @emph{keinerlei
Garantie}, dass Sie tatsächlich mit dem authentischen Server, der für die
angegebene URL verantwortlich ist, kommunizieren. Das macht Sie anfällig
gegen sogenannte „Man-in-the-Middle“-Angriffe.

@item --output=@var{Datei}
@itemx -o @var{Datei}
Die heruntergeladene Datei @emph{nicht} in den Store, sondern in die
angegebene @var{Datei} abspeichern.

@item --git
@itemx -g
Ein Checkout des neuesten Commits des angegebenen Git-Repositorys für dessen
Standard-Branch herunterladen.

@item --commit=@var{Commit-oder-Tag}
Das Checkout des Git-Repositorys bei @var{Commit-oder-Tag} herunterladen.

Für @var{Commit-oder-Tag} können Sie entweder einen Git-Tag oder einen
Commit angeben, der im Git-Repository definiert ist.

@item --branch=@var{Branch}
Das Checkout des Git-Repositorys für @var{Branch} herunterladen.

Vom Repository wird ein Checkout des neuesten Commits auf @var{Branch}
heruntergeladen. Der Name des Branchs muss für das Git-Repository gültig
sein.

@item --recursive
@itemx -r
Das Git-Repository rekursiv klonen.
@end table

@node Aufruf von guix hash
@section @command{guix hash} aufrufen

@cindex @command{guix hash}
Der Befehl @command{guix hash} berechnet den Hash einer Datei. Er ist primär
ein Werkzeug, dass es bequemer macht, etwas zur Distribution beizusteuern:
Damit wird die kryptografische Hash-Prüfsumme berechnet, die bei der
Definition eines Pakets benutzt werden kann (siehe @ref{Pakete definieren}).

Die allgemeine Syntax lautet:

@example
guix hash @var{Option} @var{Datei} ...
@end example

Wird als @var{Datei} ein Bindestrich @code{-} angegeben, berechnet
@command{guix hash} den Hash der von der Standardeingabe gelesenen
Daten. @command{guix hash} unterstützt die folgenden Optionen:

@table @code

@item --hash=@var{Algorithmus}
@itemx -H @var{Algorithmus}
Mit dem angegebenen @var{Algorithmus} einen Hash berechnen. Die Vorgabe ist,
@code{sha256} zu benutzen.

@var{Algorithmus} muss der Name eines durch Libgcrypt über Guile-Gcrypt zur
Verfügung gestellten kryptografischen Hashalgorithmus sein, z.B.@:
@code{sha512} oder @code{sha3-256} (siehe @ref{Hash Functions,,,
guile-gcrypt, Referenzhandbuch zu Guile-Gcrypt}).

@item --format=@var{Format}
@itemx -f @var{Format}
Gibt die Prüfsumme im angegebenen @var{Format} aus.

Unterstützte Formate: @code{base64}, @code{nix-base32}, @code{base32},
@code{base16} (@code{hex} und @code{hexadecimal} können auch benutzt
werden).

Wird keine Befehlszeilenoption @option{--format} angegeben, wird
@command{guix hash} die Prüfsumme im @code{nix-base32}-Format
ausgeben. Diese Darstellung wird bei der Definition von Paketen benutzt.

@item --recursive
@itemx -r
Die Befehlszeilenoption @option{--recursive} ist veraltet. Benutzen Sie
@option{--serializer=nar} (siehe unten). @option{-r} bleibt als bequeme
Kurzschreibweise erhalten.

@item --serializer=@var{Typ}
@itemx -S @var{Typ}
Die Prüfsumme der @var{Datei} auf die durch @var{Typ} angegebene Art
berechnen.

Als @var{Typ} können Sie einen hiervon benutzen:

@table @code
@item none
Dies entspricht der Vorgabe: Die Prüfsumme des Inhalts der Datei wird
berechnet.

@item nar
@c FIXME: Replace xref above with xref to an ``Archive'' section when
@c it exists.
In diesem Fall wird die Prüfsumme eines Normalisierten Archivs (kurz „Nar“)
berechnet, das die @var{Datei} enthält, und auch ihre Kinder, wenn es sich
um ein Verzeichnis handelt. Einige der Metadaten der @var{Datei} sind Teil
dieses Archivs. Zum Beispiel unterscheidet sich die berechnete Prüfsumme,
wenn die @var{Datei} eine reguläre Datei ist, je nachdem, ob die @var{Datei}
ausführbar ist oder nicht. Metadaten wie der Zeitstempel haben keinen
Einfluss auf die Prüfsumme (siehe @ref{Aufruf von guix archive}, für mehr
Informationen über das Nar-Format).

@item git
Die Prüfsumme der Datei oder des Verzeichnisses als Git-Baumstruktur
berechnen, nach derselben Methode wie beim Git-Versionskontrollsystem.
@end table

@item --exclude-vcs
@itemx -x
Wenn dies zusammen mit der Befehlszeilenoption @option{--recursive}
angegeben wird, werden Verzeichnisse zur Versionskontrolle (@file{.bzr},
@file{.git}, @file{.hg}, etc.)@: vom Archiv ausgenommen.

@vindex git-fetch
Zum Beispiel würden Sie auf diese Art die Prüfsumme eines Git-Checkouts
berechnen, was nützlich ist, wenn Sie die Prüfsumme für die Methode
@code{git-fetch} benutzen (siehe @ref{„origin“-Referenz}):

@example
$ git clone http://example.org/foo.git
$ cd foo
$ guix hash -x --serializer=nar .
@end example
@end table

@node Aufruf von guix import
@section @command{guix import} aufrufen

@cindex Pakete importieren
@cindex Paketimport
@cindex Pakete an Guix anpassen
@cindex @command{guix import} aufrufen
Der Befehl @command{guix import} ist für Leute hilfreich, die ein Paket
gerne mit so wenig Arbeit wie möglich zur Distribution hinzufügen
würden@tie{}– ein legitimer Anspruch. Der Befehl kennt ein paar Sammlungen,
aus denen mit ihm Paketmetadaten „importiert“ werden können. Das Ergebnis
ist eine Paketdefinition oder eine Vorlage dafür in dem uns bekannten Format
(siehe @ref{Pakete definieren}).

Die allgemeine Syntax lautet:

@example
guix import [@var{Globale-Optionen}…] @var{Importer} @var{Paket} [@var{Optionen}…]
@end example

Der @var{Importer} gibt die Quelle an, aus der Paketmetadaten importiert
werden, und die @var{Optionen} geben eine Paketbezeichnung und andere vom
@var{Importer} abhängige Daten an. @command{guix import} verfügt selbst über
folgende @var{Globale-Optionen}:

@table @code
@item --insert=@var{Datei}
@itemx -i @var{Datei}
Die vom @var{Importer} erzeugten Paketdefinitionen in die angegebene
@var{Datei} schreiben, entweder in alphabetischer Reihenfolge unter
bestehenden Paketdefinitionen oder andernfalls am Dateiende.
@end table

Manche Importer setzen voraus, dass der Befehl @command{gpgv} ausgeführt
werden kann. Sie funktionieren nur, wenn GnuPG installiert und im
@code{$PATH} enthalten ist; falls nötig können Sie @code{guix install gnupg}
ausführen.

Derzeit sind folgende „Importer“ verfügbar:

@table @code
@item gnu
Metadaten für das angegebene GNU-Paket importieren. Damit wird eine Vorlage
für die neueste Version dieses GNU-Pakets zur Verfügung gestellt,
einschließlich der Prüfsumme seines Quellcode-Tarballs, seiner kanonischen
Zusammenfassung und seiner Beschreibung.

Zusätzliche Informationen wie Paketabhängigkeiten und seine Lizenz müssen
noch manuell ermittelt werden.

Zum Beispiel liefert der folgende Befehl eine Paketdefinition für
GNU@tie{}Hello:

@example
guix import gnu hello
@end example

Speziell für diesen Importer stehen noch folgende Befehlszeilenoptionen zur
Verfügung:

@table @code
@item --key-download=@var{Richtlinie}
Die Richtlinie zum Umgang mit fehlenden OpenPGP-Schlüsseln beim Verifizieren
der Paketsignatur (auch „Beglaubigung“ genannt) festlegen, wie bei
@command{guix refresh}. Siehe @ref{Aufruf von guix refresh,
@option{--key-download}}.
@end table

@item pypi
@cindex pypi
Metadaten aus dem @uref{https://pypi.python.org/, Python Package Index}
importieren. Informationen stammen aus der JSON-formatierten Beschreibung,
die unter @code{pypi.python.org} verfügbar ist, und enthalten meistens alle
relevanten Informationen einschließlich der Abhängigkeiten des Pakets. Für
maximale Effizienz wird empfohlen, das Hilfsprogramm @command{unzip} zu
installieren, damit der Importer „Python Wheels“ entpacken und daraus Daten
beziehen kann.

Der folgende Befehl importiert Metadaten für die neueste Version des
Python-Pakets namens @code{itsdangerous}:

@example
guix import pypi itsdangerous
@end example

Sie können auch um eine bestimmte Version bitten:

@example
guix import pypi itsdangerous@@1.1.0
@end example

@table @code
@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@end table

@item gem
@cindex gem
Metadaten von @uref{https://rubygems.org/, RubyGems}
importieren. Informationen kommen aus der JSON-formatierten Beschreibung,
die auf @code{rubygems.org} verfügbar ist, und enthält die relevantesten
Informationen einschließlich der Laufzeitabhängigkeiten. Dies hat aber auch
Schattenseiten@tie{}– die Metadaten unterscheiden nicht zwischen
Zusammenfassungen und Beschreibungen, daher wird dieselbe Zeichenkette für
beides eingesetzt. Zudem fehlen Informationen zu nicht in Ruby geschriebenen
Abhängigkeiten, die benötigt werden, um native Erweiterungen zu in Ruby
geschriebenem Code zu erstellen. Diese herauszufinden bleibt dem
Paketentwickler überlassen.

Der folgende Befehl importiert Metadaten aus dem Ruby-Paket @code{rails}.

@example
guix import gem rails
@end example

Sie können auch um eine bestimmte Version bitten:

@example
guix import gem rails@@7.0.4
@end example

@table @code
@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@end table

@item minetest
@cindex minetest
@cindex ContentDB
Importiert Metadaten aus der @uref{https://content.minetest.net,
ContentDB}. Informationen werden aus den JSON-formatierten Metadaten
genommen, die über die @uref{https://content.minetest.net/help/api/,
Programmierschnittstelle („API“) von ContentDB} angeboten werden, und
enthalten die relevantesten Informationen wie zum Beispiel
Abhängigkeiten. Allerdings passt das Ergebnis nicht
ganz. Lizenzinformationen sind oft unvollständig. Der Commit-Hash fehlt
manchmal. Die importierten Beschreibungen sind in Markdown formatiert, aber
Guix braucht stattdessen Texinfo-Auszeichnungen. Texturpakete und Teilspiele
werden nicht unterstützt.

Der folgende Befehl importiert Metadaten für die Mesecons-Mod von Jeija:

@example
guix import minetest Jeija/mesecons
@end example

Man muss den Autorennamen nicht angeben:

@example
guix import minetest mesecons
@end example

@table @code
@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@end table

@item cpan
@cindex CPAN
Importiert Metadaten von @uref{https://www.metacpan.org/,
MetaCPAN}. Informationen werden aus den JSON-formatierten Metadaten
genommen, die über die @uref{https://fastapi.metacpan.org/,
Programmierschnittstelle („API“) von MetaCPAN} angeboten werden, und
enthalten die relevantesten Informationen wie zum Beispiel
Modulabhängigkeiten. Lizenzinformationen sollten genau nachgeprüft
werden. Wenn Perl im Store verfügbar ist, wird das Werkzeug @code{corelist}
benutzt, um Kernmodule in der Abhängigkeitsliste wegzulassen.

Folgender Befehl importiert Metadaten für das Perl-Modul Acme::Boolean:

@example
guix import cpan Acme::Boolean
@end example

Like many other importers, the @code{cpan} importer supports recursive
imports:

@table @code
@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@end table

@item cran
@cindex CRAN
@cindex Bioconductor
Metadaten aus dem @uref{https://cran.r-project.org/, CRAN} importieren, der
zentralen Sammlung für die @uref{https://r-project.org, statistische und
grafische Umgebung GNU@tie{}R}.

Informationen werden aus der Datei namens @file{DESCRIPTION} des Pakets
extrahiert.

Der folgende Befehl importiert Metadaten für das Cairo-R-Paket:

@example
guix import cran Cairo
@end example

Sie können auch um eine bestimmte Version bitten:

@example
guix import cran rasterVis@@0.50.3
@end example

Wird zudem @option{--recursive} angegeben, wird der Importer den
Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für all die Pakete erzeugen, die noch nicht
Teil von Guix sind.

Wird @option{--style=specification} angegeben, wird der Importer
Paketdefinitionen erzeugen, deren Eingaben als Paketspezifikationen statt
als Referenzen auf Paketvariable vorliegen. Das ist nützlich, wenn die
erzeugten Paketdefinitionen in bestehende, nutzereigene Module eingefügt
werden, weil dann die Liste der benutzten Paketmodule nicht angepasst werden
muss. Die Vorgabe ist @option{--style=variable}.

Wird @option{--prefix=license:} angegeben, stellt der Importer jedem für
eine Lizenz stehenden Atom das Präfix @code{license:} voran, damit
@code{(guix licenses)} mit diesem Präfix importiert werden kann.

Wird @option{--archive=bioconductor} angegeben, werden Metadaten vom
@uref{https://www.bioconductor.org/, Bioconductor} importiert, einer
Sammlung von R-Paketen zur Analyse und zum Verständnis von großen Mengen
genetischer Daten in der Bioinformatik.

Informationen werden aus der Datei namens @file{DESCRIPTION} im Archiv des
Pakets extrahiert.

Der folgende Befehl importiert Metadaten für das R-Paket GenomicRanges:

@example
guix import cran --archive=bioconductor GenomicRanges
@end example

Schließlich können Sie auch solche R-Pakete importieren, die noch nicht auf
CRAN oder im Bioconductor veröffentlicht wurden, solange sie in einem
Git-Repository stehen. Benutzen Sie @option{--archive=git} gefolgt von der
URL des Git-Repositorys.

@example
guix import cran --archive=git https://github.com/immunogenomics/harmony
@end example

@item texlive
@cindex TeX Live
@cindex CTAN
Informationen über TeX-Pakete, die Teil der
@uref{https://www.tug.org/texlive/, TeX-Live-Distribution} sind, aus der
Datenbank von TeX Live importieren.

Paketinformationen werden der Paketdatenbank von TeX Live entnommen. Bei ihr
handelt es sich um eine reine Textdatei, die im @code{texlive-scripts}-Paket
enthalten ist. Der Quellcode wird von unter Umständen mehreren Stellen im
SVN-Repository des TeX-Live-Projekts heruntergeladen. Beachten Sie, dass
deswegen SVN installiert und in @code{$PATH} zu finden sein muss; führen Sie
dazu gegebenenfalls @code{guix install subversion} aus.

Der folgende Befehl importiert Metadaten für das TeX-Paket @code{fontspec}:

@example
guix import texlive fontspec
@end example

Zu den zusätzlichen Optionen gehören:

@table @code
@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@end table

@item json
@cindex JSON, Import
Paketmetadaten aus einer lokalen JSON-Datei importieren. Betrachten Sie
folgende Beispiel-Paketdefinition im JSON-Format:

@example
@{
  "name": "hello",
  "version": "2.10",
  "source": "mirror://gnu/hello/hello-2.10.tar.gz",
  "build-system": "gnu",
  "home-page": "https://www.gnu.org/software/hello/",
  "synopsis": "Hello, GNU world: An example GNU package",
  "description": "GNU Hello prints a greeting.",
  "license": "GPL-3.0+",
  "native-inputs": ["gettext"]
@}
@end example

Die Felder sind genauso benannt wie bei einem @code{<package>}-Verbundstyp
(siehe @ref{Pakete definieren}). Referenzen zu anderen Paketen stehen darin
als JSON-Liste von mit Anführungszeichen quotierten Zeichenketten wie
@code{guile} oder @code{guile@@2.0}.

Der Importer unterstützt auch eine ausdrücklichere Definition der
Quelldateien mit den üblichen Feldern eines @code{<origin>}-Verbunds:

@example
@{
  …
  "source": @{
    "method": "url-fetch",
    "uri": "mirror://gnu/hello/hello-2.10.tar.gz",
    "sha256": @{
      "base32": "0ssi1wpaf7plaswqqjwigppsg5fyh99vdlb9kzl7c9lng89ndq1i"
    @}
  @}
  …
@}
@end example

Der folgende Befehl liest Metadaten aus der JSON-Datei @code{hello.json} und
gibt einen Paketausdruck aus:

@example
guix import json hello.json
@end example

@item hackage
@cindex hackage
Metadaten aus @uref{https://hackage.haskell.org/, Hackage}, dem zentralen
Paketarchiv der Haskell-Gemeinde, importieren. Informationen werden aus
Cabal-Dateien ausgelesen. Darin sind alle relevanten Informationen
einschließlich der Paketabhängigkeiten enthalten.

Speziell für diesen Importer stehen noch folgende Befehlszeilenoptionen zur
Verfügung:

@table @code
@item --stdin
@itemx -s
Eine Cabal-Datei von der Standardeingabe lesen.
@item --no-test-dependencies
@itemx -t
Keine Abhängigkeiten übernehmen, die nur von Testkatalogen benötigt werden.
@item --cabal-environment=@var{Aliste}
@itemx -e @var{Aliste}
@var{Aliste} muss eine assoziative Liste der Scheme-Programmiersprache sein,
die die Umgebung definiert, in der bedingte Ausdrücke von Cabal ausgewertet
werden. Dabei werden folgende Schlüssel akzeptiert: @code{os}, @code{arch},
@code{impl} und eine Zeichenkette, die dem Namen einer Option (einer „Flag“)
entspricht. Der mit einer „Flag“ assoziierte Wert muss entweder das Symbol
@code{true} oder @code{false} sein. Der anderen Schlüsseln zugeordnete Wert
muss mit der Definition des Cabal-Dateiformats konform sein. Der vorgegebene
Wert zu den Schlüsseln @code{os}, @code{arch} and @code{impl} ist jeweils
@samp{linux}, @samp{x86_64} bzw. @samp{ghc}.
@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@end table

Der folgende Befehl importiert Metadaten für die neuste Version des
Haskell-„HTTP“-Pakets, ohne Testabhängigkeiten zu übernehmen und bei
Übergabe von @code{false} als Wert der Flag @samp{network-uri}:

@example
guix import hackage -t -e "'((\"network-uri\" . false))" HTTP
@end example

Eine ganz bestimmte Paketversion kann optional ausgewählt werden, indem man
nach dem Paketnamen anschließend ein At-Zeichen und eine Versionsnummer
angibt wie in folgendem Beispiel:

@example
guix import hackage mtl@@2.1.3.1
@end example

@item stackage
@cindex stackage
Der @code{stackage}-Importer ist ein Wrapper um den
@code{hackage}-Importer. Er nimmt einen Paketnamen und schaut dafür die
Paketversion nach, die Teil einer @uref{https://www.stackage.org,
Stackage-Veröffentlichung} mit Langzeitunterstützung (englisch „Long-Term
Support“, kurz LTS) ist, deren Metadaten er dann mit dem
@code{hackage}-Importer bezieht. Beachten Sie, dass es Ihre Aufgabe ist,
eine LTS-Veröffentlichung auszuwählen, die mit dem von Guix benutzten
GHC-Compiler kompatibel ist.

Speziell für diesen Importer stehen noch folgende Befehlszeilenoptionen zur
Verfügung:

@table @code
@item --no-test-dependencies
@itemx -t
Keine Abhängigkeiten übernehmen, die nur von Testkatalogen benötigt werden.
@item --lts-version=@var{Version}
@itemx -l @var{Version}
@var{Version} ist die gewünschte Version der LTS-Veröffentlichung. Wird
keine angegeben, wird die neueste benutzt.
@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@end table

Der folgende Befehl importiert Metadaten für dasjenige Haskell-„HTTP“-Paket,
das in der LTS-Stackage-Veröffentlichung mit Version 7.18 vorkommt:

@example
guix import stackage --lts-version=7.18 HTTP
@end example

@item elpa
@cindex elpa
Metadaten aus der Paketsammlung „Emacs Lisp Package Archive“ (ELPA)
importieren (siehe @ref{Packages,,, emacs, The GNU Emacs Manual}).

Speziell für diesen Importer stehen noch folgende Befehlszeilenoptionen zur
Verfügung:

@table @code
@item --archive=@var{Repo}
@itemx -a @var{Repo}
Mit @var{Repo} wird die Archiv-Sammlung (ein „Repository“) bezeichnet, von
dem die Informationen bezogen werden sollen. Derzeit sind die unterstützten
Repositorys und ihre Bezeichnungen folgende:
@itemize -
@item
@uref{https://elpa.gnu.org/packages, GNU}, bezeichnet mit @code{gnu}. Dies
ist die Vorgabe.

Pakete aus @code{elpa.gnu.org} wurden mit einem der Schlüssel im
GnuPG-Schlüsselbund in @file{share/emacs/25.1/etc/package-keyring.gpg} (oder
einem ähnlichen Pfad) des @code{emacs}-Pakets signiert (siehe @ref{Package
Installation, ELPA-Paketsignaturen,, emacs, The GNU Emacs Manual}).

@item
@uref{https://elpa.nongnu.org/nongnu/, NonGNU}, bezeichnet mit
@code{nongnu}.

@item
@uref{https://stable.melpa.org/packages, MELPA-Stable}, bezeichnet mit
@code{melpa-stable}.

@item
@uref{https://melpa.org/packages, MELPA}, bezeichnet mit @code{melpa}.
@end itemize

@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@end table

@item crate
@cindex crate
Metadaten aus der Paketsammlung crates.io für Rust @uref{https://crates.io,
crates.io} importieren, wie Sie in diesem Beispiel sehen:

@example
guix import crate blake2-rfc
@end example

Mit dem Crate-Importer können Sie auch eine Version als Zeichenkette
angeben:

@example
guix import crate constant-time-eq@@0.1.0
@end example

Zu den zusätzlichen Optionen gehören:

@table @code
@item --allow-yanked
Wenn es keine @emph{nicht} zurückgenommene („yanked“) Version einer Crate
gibt, wird die neueste zurückgenommene benutzt statt abzubrechen.
@item --lockfile=@var{file}
@itemx -f @var{Datei}
When @option{--lockfile} is specified, the importer will ignore other
options and won't output package expressions, instead importing source
expressions from @var{file}, a @file{Cargo.lock} file.

@xref{Packaging Rust Crates,,, guix-cookbook, GNU Guix Cookbook}, for
packaging workflow utilizing it.
@end table

@item elm
@cindex elm
Metadaten aus der Paketsammlung @uref{https://package.elm-lang.org,
package.elm-lang.org} für Elm importieren, wie Sie in diesem Beispiel sehen:

@example
guix import elm elm-explorations/webgl
@end example

Mit dem Elm-Importer können Sie auch eine Version als Zeichenkette angeben:

@example
guix import elm elm-explorations/webgl@@1.1.3
@end example

Zu den zusätzlichen Optionen gehören:

@table @code
@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@end table

@item npm-binary
@cindex npm
@cindex Node.js
Metadaten aus der @uref{https:///registry.npmjs.org, npm-Registry}
importieren, wie in diesem Beispiel:

@example
guix import npm-binary buffer-crc32
@end example

Mit dem npm-binary-Importer können Sie auch eine Version als Zeichenkette
angeben:

@example
guix import npm-binary buffer-crc32@@1.0.0
@end example

@quotation Anmerkung
Die erzeugten Paketausdrücke überspringen den build-Schritt des
@code{node-build-system}. Damit beziehen sich erzeugte Paketausdrücke oft
auf transpilierte oder generierte Dateien, statt sie aus ihrem Quellcode zu
erstellen.
@end quotation

Zu den zusätzlichen Optionen gehören:

@table @code
@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@end table

@item opam
@cindex OPAM
@cindex OCaml
Metadaten aus der Paketsammlung @uref{https://opam.ocaml.org/, OPAM} der
OCaml-Gemeinde importieren.

Zu den zusätzlichen Optionen gehören:

@table @code
@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@end table

@item composer
@cindex Composer
@cindex PHP
Metadaten aus dem Paketarchiv @uref{https://getcomposer.org/, Composer}, das
die PHP-Gemeinschaft verwendet, importieren.

@example
guix import composer phpunit/phpunit
@end example

Zu den zusätzlichen Optionen gehören:

@table @code
@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@item --repo
Vorgegeben ist, nach Paketen im offiziellen OPAM-Repository zu suchen. Mit
dieser Befehlszeilenoption, die mehr als einmal angegeben werden kann,
können Sie andere Repositorys hinzufügen, in denen nach Paketen gesucht
wird. Als gültige Argumente akzeptiert werden:

@itemize
@item der Name eines bekannten Repositorys, entweder @code{opam},
      @code{coq} (äquivalent zu @code{coq-released}), @code{coq-core-dev},
@code{coq-extra-dev} oder @code{grew}.
@item die URL eines Repository, wie sie der Befehl
      @code{opam repository add} erfordert (zum Beispiel wäre
@uref{https://opam.ocaml.org} die URL, die dem Namen @code{opam} oben
entspricht).
@item den Pfad zur lokalen Kopie eines Repositorys (ein Verzeichnis mit
      einem Unterverzeichnis @file{packages/}).
@end itemize

Die an diese Befehlszeilenoption übergebenen Repositorys sind in der
Reihenfolge Ihrer Präferenz anzugeben. Die zusätzlich angegebenen
Repositorys ersetzen @emph{nicht} das voreingestellte Repository
@code{opam}; es bleibt immer als letzte Möglichkeit stehen.

Beachten Sie ebenso, dass Versionsnummern mehrerer Repositorys @emph{nicht}
verglichen werden, sondern einfach das Paket aus dem ersten Repository (von
links nach rechts), das mindestens eine Version des angeforderten Pakets
enthält, genommen wird und die importierte Version der neuesten @emph{aus
nur diesem Repository} entspricht.

@end table

@item go
@cindex go
Metadaten für ein Go-Modul von @uref{https://proxy.golang.org,
proxy.golang.org} importieren.

@example
guix import go gopkg.in/yaml.v2
@end example

Es ist möglich, bei der Paketspezifikation ein Suffix @code{@@VERSION}
anzugeben, um diese bestimmte Version zu importieren.

Zu den zusätzlichen Optionen gehören:

@table @code
@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@item --pin-versions
Wenn Sie diese Option verwenden, behält der Importer genau diese Version der
Go-Modul-Abhängigkeiten bei, statt die neuesten verfügbaren Versionen zu
benutzen. Das kann hilfreich sein, wenn Sie versuchen, Pakete zu
importieren, die für deren Erstellung rekursiv von alten Versionen ihrer
selbst abhängen. Wenn Sie diesen Modus nutzen, wird das Symbol für das Paket
durch Anhängen der Versionsnummer an seinen Namen gebildet, damit mehrere
Versionen desselben Pakets gleichzeitig existieren können.
@end table

@item egg
@cindex egg
Metadaten für @uref{https://wiki.call-cc.org/eggs, CHICKEN-Eggs}
importieren. Die Informationen werden aus den @file{PAKET.egg}-Dateien
genommen, die im Git-Repository @uref{git://code.call-cc.org/eggs-5-all,
eggs-5-all} stehen. Jedoch gibt es dort nicht alle Informationen, die wir
brauchen: Ein Feld für die Beschreibung (@code{description}) fehlt und die
benutzten Lizenzen sind ungenau (oft wird BSD angegeben statt BSD-N).

@example
guix import egg sourcehut
@end example

Sie können auch um eine bestimmte Version bitten:

@example
guix import egg arrays@@1.0
@end example

Zu den zusätzlichen Optionen gehören:
@table @code
@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@end table

@item hexpm
@cindex hexpm
Metadaten aus der Paketsammlung hex.pm für Erlang und Elixir
@uref{https://hex.pm, hex.pm} importieren, wie Sie in diesem Beispiel sehen:

@example
guix import hexpm stun
@end example

Der Importer versucht, das richtige Erstellungssystem für das Paket zu
erkennen.

Mit dem hexpm-Importer können Sie auch eine Version als Zeichenkette
angeben:

@example
guix import hexpm cf@@0.3.0
@end example

Zu den zusätzlichen Optionen gehören:

@table @code
@item --recursive
@itemx -r
Den Abhängigkeitsgraphen des angegebenen Pakets beim Anbieter rekursiv
durchlaufen und Paketausdrücke für alle solchen Pakete erzeugen, die es in
Guix noch nicht gibt.
@end table
@end table

@command{guix import} verfügt über eine modulare Code-Struktur. Mehr
Importer für andere Paketformate zu haben, wäre nützlich, und Ihre Hilfe ist
hierbei gerne gesehen (siehe @ref{Mitwirken}).

@node Aufruf von guix refresh
@section @command{guix refresh} aufrufen

@cindex @command{guix refresh}
Die Zielgruppe des Befehls @command{guix refresh} zum Auffrischen von
Paketen sind in erster Linie Paketautoren. Als Nutzer könnten Sie an der
Befehlszeilenoption @option{--with-latest} Interesse haben, die auf
@command{guix refresh} aufbaut, um Ihnen Superkräfte bei der
Paketaktualisierung zu verleihen (siehe @ref{Paketumwandlungsoptionen,
@option{--with-latest}}). Nach Vorgabe werden mit @command{guix refresh}
alle Pakete in der Distribution gemeldet, die nicht der neuesten Version des
Anbieters entsprechen, indem Sie dies ausführen:

@example
$ guix refresh
gnu/packages/gettext.scm:29:13: gettext würde von 0.18.1.1 auf 0.18.2.1 aktualisiert
gnu/packages/glib.scm:77:12: glib würde von 2.34.3 auf 2.37.0 aktualisiert
@end example

Alternativ können die zu betrachtenden Pakete dabei angegeben werden, was
zur Ausgabe einer Warnung führt, wenn es für Pakete kein
Aktualisierungsprogramm gibt:

@example
$ guix refresh coreutils guile guile-ssh
gnu/packages/ssh.scm:205:2: Warnung: Kein Aktualisierungsprogramm für guile-ssh
gnu/packages/guile.scm:136:12: guile würde von 2.0.12 auf 2.0.13 aktualisiert
@end example

@command{guix refresh} durchsucht die Paketsammlung beim Anbieter jedes
Pakets und bestimmt, was die höchste Versionsnummer ist, zu der es dort eine
Veröffentlichung gibt. Zum Befehl gehören Aktualisierungsprogramme, mit
denen bestimmte Typen von Paketen automatisch aktualisiert werden können:
GNU-Pakete, ELPA-Pakete usw.@:@tie{}– siehe die Dokumentation von
@option{--type} unten. Es gibt jedoch auch viele Pakete, für die noch keine
Methode enthalten ist, um das Vorhandensein einer neuen Veröffentlichung zu
prüfen. Der Mechanismus ist aber erweiterbar, also können Sie gerne mit uns
in Kontakt treten, wenn Sie eine neue Methode hinzufügen möchten!

Wenn Sie aus irgendeinem Grund auf eine ältere Version aktualisieren
möchten, geht das auch, indem Sie nach der Paketspezifikation ein
Gleichheitszeichen und die gewünschte Versionsnummer schreiben. Allerdings
können nicht alle Aktualisierungsprogramme damit umgehen; wenn es das
Aktualisieren auf die bestimmte Version nicht unterstützt, meldet das
Aktualisierungsprogramm einen Fehler.

@example
$ guix refresh -u guile=3.0.4
…
gnu/packages/guile.scm:392:2: guile: Aktualisiere von Version 3.0.3 auf Version 3.0.4 …
…
$ guix refresh -u guile@@2.0=2.0.12
…
gnu/packages/guile.scm:147:2: guile: Aktualisiere von Version 2.0.10 auf Version 2.0.12 …
…
@end example

@cindex Zielversion, guix refresh
In bestimmten Fällen möchte man viele Pakete, die man über ein Manifest oder
eine Modulauswahl angibt, alle zusammen aktualisieren. Für so etwas gibt es
die Befehlszeilenoption @option{--target-version}, mit der alle auf die
gleiche Version gebracht werden können, wie in diesen Beispielen hier:

@example
$ guix refresh qtbase qtdeclarative --target-version=6.5.2
gnu/packages/qt.scm:1248:13: qtdeclarative würde von 6.3.2 auf 6.5.2 aktualisiert
gnu/packages/qt.scm:584:2: qtbase würde von 6.3.2 auf 6.5.2 aktualisiert
@end example

@example
$ guix refresh --manifest=qt5-manifest.scm --target-version=5.15.10
gnu/packages/qt.scm:1173:13: qtxmlpatterns würde von 5.15.8 auf 5.15.10 aktualisiert
gnu/packages/qt.scm:1202:13: qtdeclarative würde von 5.15.8 auf 5.15.10 aktualisiert
gnu/packages/qt.scm:1762:13: qtserialbus würde von 5.15.8 auf 5.15.10 aktualisiert
gnu/packages/qt.scm:2070:13: qtquickcontrols2 würde von 5.15.8 auf 5.15.10 aktualisiert
…
@end example

@example
$ guix refresh -s module:kde-plasma --target-version=6.3.6
[@dots{}] plasma-systemmonitor würde von 6.3.4 auf 6.3.6 aktualisiert
[@dots{}] plasma-workspace-wallpapers würde von 6.3.4 auf 6.3.6 aktualisiert
[@dots{}] plasma-browser-integration würde von 6.3.4 auf 6.3.6 aktualisiert
@dots{}
@end example

@cindex unvollständige Zielversion, guix refresh
Mit der Befehlszeilenoption @option{--target-version} können Sie eine
unvollständig definierte Version als Präfix angeben, um auf die
neuestmögliche Version mit dieser Haupt- oder Haupt- und Nebenversionsnummer
als Präfix zu aktualisieren:

@example
$ guix refresh qtbase@@5 qtdeclarative@@5 --target-version=5
gnu/packages/qt.scm:1472:13: qtdeclarative würde von 5.15.8 auf 5.15.10 aktualisiert
gnu/packages/qt.scm:452:13: qtbase würde von 5.15.8 auf 5.15.10 aktualisiert
@end example

@cindex unvollständige Versionsangabe, guix refresh
Genauso wie --target-version können Sie für jedes Paket einzeln ein solches
Präfix für die Paketversionsangabe mit einem vorangestellten Tildezeichen
@samp{~} angeben. Zum Beispiel:

@example
$ guix refresh bash=~5 guile=~3
gnu/packages/guile.scm:354:13: guile würde von 3.0.9 auf 3.0.10 aktualisiert
gnu/packages/bash.scm:150:15: bash würde von 5.1.16 auf 5.2.37 aktualisiert
@end example

Manchmal unterscheidet sich der vom Anbieter benutzte Name von dem
Paketnamen, der in Guix verwendet wird, so dass @command{guix refresh} etwas
Unterstützung braucht. Die meisten Aktualisierungsprogramme folgen der
Eigenschaft @code{upstream-name} in Paketdefinitionen, die diese
Unterstützung bieten kann:

@lisp
(define-public network-manager
  (package
    (name "network-manager")
    ;; …
    (properties '((upstream-name . "NetworkManager")))))
@end lisp

Wenn @option{--update} übergeben wird, werden die Quelldateien der
Distribution verändert, so dass für diese Paketdefinitionen und, wenn
möglich, für deren Eingaben die aktuelle Version und die aktuelle
Hash-Prüfsumme des Quellcodes eingetragen wird (siehe @ref{Pakete definieren}). Dazu werden der neueste Quellcode-Tarball jedes Pakets sowie die
jeweils zugehörige OpenPGP-Signatur heruntergeladen; mit Letzterer wird der
heruntergeladene Tarball gegen seine Signatur mit @command{gpgv}
authentifiziert und schließlich dessen Hash berechnet. Beachten Sie, dass
GnuPG dazu installiert sein und in @code{$PATH} vorkommen muss. Falls dies
nicht der Fall ist, führen Sie @code{guix install gnupg} aus.

Vielleicht möchten Sie auch die Definitionen aktualisieren, die den Paketen,
die in Ihrem Profil installiert sind, entsprechen:

@example
$ ./pre-inst-env guix refresh -u \
       $(guix package --list-installed | cut -f1)
@end example

Wenn Sie sich fragen, ob ein Paket aktualisiert werden sollte oder nicht,
kann es helfen, sich anzuschauen, welche Pakete von der Aktualisierung
betroffen wären und auf Kompatibilität hin geprüft werden sollten. Dazu kann
die Befehlszeilenoption @option{--list-dependent} zusammen mit einem oder
mehreren Paketnamen an @command{guix refresh} übergeben werden.

Wenn der öffentliche Schlüssel, mit dem der Tarball signiert wurde, im
Schlüsselbund des Benutzers fehlt, wird versucht, ihn automatisch von einem
Schlüssel-Server zu holen. Wenn das klappt, wird der Schlüssel zum
Schlüsselbund des Benutzers hinzugefügt, ansonsten meldet @command{guix
refresh} einen Fehler.

Die folgenden Befehlszeilenoptionen werden unterstützt:

@table @code

@item --recursive
Hiermit werden die angegebenen Pakete betrachtet und außerdem alle Pakete,
von denen sie abhängen.

@example
$ guix refresh --recursive coreutils
gnu/packages/acl.scm:40:13: acl würde von 2.2.53 auf 2.3.1 aktualisiert
gnu/packages/m4.scm:30:12: 1.4.18 ist bereits die neuste Version von m4
gnu/packages/xml.scm:68:2: Warnung: Kein Aktualisierungsprogramm für expat
gnu/packages/multiprecision.scm:40:12: 6.1.2 ist bereits die neuste Version von gmp
…
@end example

@item --expression=@var{Ausdruck}
@itemx -e @var{Ausdruck}
Als Paket benutzen, wozu der @var{Ausdruck} ausgewertet wird.

Dies ist nützlich, um genau ein bestimmtes Paket zu referenzieren, wie in
diesem Beispiel:

@example
guix refresh -l -e '(@@@@ (gnu packages commencement) glibc-final)'
@end example

Dieser Befehls listet auf, was alles von der „endgültigen“ Erstellung von
libc abhängt (praktisch alle Pakete).

@item --update
@itemx -u
Die Quelldateien der Distribution (die Paketdefinitionen) werden direkt „in
place“ verändert. Normalerweise führen Sie dies aus einem Checkout des
Guix-Quellbaums heraus aus (siehe @ref{Guix vor der Installation ausführen}):

@example
./pre-inst-env guix refresh -s non-core -u
@end example

Siehe @ref{Pakete definieren} für mehr Informationen zu
Paketdefinitionen. Sie können es auch auf Paketen eines Drittanbieterkanals
ausführen:

@example
guix refresh -L /pfad/zum/kanal -u @var{Paket}
@end example

Siehe @ref{Einen Kanal erstellen} für Informationen, wie Sie einen Kanal
anlegen.

Mit diesem Befehl bringen Sie die Version und die Hash-Prüfsumme des
Quellcodes in dem Paket auf den neuesten Stand. Je nachdem, welches
Aktualisierungsprogramm dafür eingesetzt wird, kann es sogar die Eingaben im
Feld @samp{inputs} des Pakets aktualisieren. Es kommt vor, dass sich dabei
Fehler in die Eingaben einschleichen@tie{}– vielleicht fehlt eine
zusätzliche notwendige Eingabe oder es wird eine hinzugefügt, die
@emph{nicht} erwünscht ist.

@cindex @code{updater-extra-inputs}, Paketeigenschaft
@cindex @code{updater-ignored-inputs}, Paketeigenschaft
Um damit leichter umzugehen, können Paketautoren die Eingaben, die außer den
vom Aktualisierungsprogramm gefundenen Eingaben in Guix noch zusätzlich
nötig sind, oder solche, die ignoriert werden sollen, in den Eigenschaften
des Pakets hinterlegen: Es gibt die Eigenschaften
@code{updater-extra-inputs} und @code{updater-ignored-inputs}, wenn es um
„normale“ Abhängigkeiten geht, und entsprechende Eigenschaften für
@code{native-inputs} und @code{propagated-inputs}. Folgendes Beispiel zeigt,
wie das Aktualisierungsprogramm auf @samp{openmpi} als eine zusätzliche
Eingabe hingewiesen wird:

@lisp
(define-public python-mpi4py
  (package
    (name "python-mpi4py")
    ;; …
    (inputs (list openmpi))
    (properties
     '((updater-extra-inputs . ("openmpi"))))))
@end lisp

So wird bei @command{guix refresh -u python-mpi4py} die Eingabe
@samp{openmpi} nicht mehr entfernt, obwohl es keine der Eingaben ist, die
von sich aus hinzugefügt würden.

@item --select=[@var{Teilmenge}]
@itemx -s @var{Teilmenge}
Wählt alle Pakete aus der @var{Teilmenge} aus, die entweder @code{core},
@code{non-core} oder @code{module:@var{Name}} sein muss.

Die @code{core}-Teilmenge bezieht sich auf alle Pakete, die den Kern der
Distribution ausmachen, d.h.@: Pakete, aus denen heraus „alles andere“
erstellt wird. Dazu gehören GCC, libc, Binutils, Bash und so weiter. In der
Regel ist die Folge einer Änderung an einem dieser Pakete in der
Distribution, dass alle anderen neu erstellt werden müssen. Daher sind
solche Änderungen unangenehm für Nutzer, weil sie einiges an Erstellungszeit
oder Bandbreite investieren müssen, um die Aktualisierung abzuschließen.

Die @code{non-core}-Teilmenge bezieht sich auf die übrigen Pakete. Sie wird
typischerweise dann benutzt, wenn eine Aktualisierung der Kernpakete zu
viele Umstände machen würde.

Wenn als Teilmenge @code{module:@var{Name}} angegeben wird, werden alle
Pakete in dem angegebenen Guile-Modul ausgewählt. Das Modul kann als z.B.@:
@code{module:guile} oder @code{module:(gnu packages guile)} angegeben
werden, erstere ist die Kurzform für die andere.

@item --manifest=@var{Datei}
@itemx -m @var{Datei}
Wählt alle Pakete im in der @var{Datei} stehenden Manifest aus. Das ist
nützlich, um zu überprüfen, welche Pakete aus dem Manifest des Nutzers
aktualisiert werden können.

@item --type=@var{Aktualisierungsprogramm}
@itemx -t @var{Aktualisierungsprogramm}
Nur solche Pakete auswählen, die vom angegebenen
@var{Aktualisierungsprogramm} behandelt werden. Es darf auch eine
kommagetrennte Liste mehrerer Aktualisierungsprogramme angegeben
werden. Zurzeit kann als @var{Aktualisierungsprogramm} eines der folgenden
angegeben werden:

@table @code
@item gnu
Aktualisierungsprogramm für GNU-Pakete,
@item savannah
Aktualisierungsprogramm auf @uref{https://savannah.gnu.org, Savannah}
angebotener Pakete,
@item sourceforge
Aktualisierungsprogramm auf @uref{https://sourceforge.net, SourceForge}
angebotener Pakete,
@item gnome
Aktualisierungsprogramm für GNOME-Pakete,
@item kde
Aktualisierungsprogramm für KDE-Pakete,
@item xorg
Aktualisierungsprogramm für X.org-Pakete,
@item kernel.org
Aktualisierungsprogramm auf kernel.org angebotener Pakete,
@item egg
Aktualisierungsprogramm für @uref{https://wiki.call-cc.org/eggs/,
Egg-Pakete},
@item elpa
Aktualisierungsprogramm für @uref{https://elpa.gnu.org/, ELPA-Pakete},
@item cran
Aktualisierungsprogramm für @uref{https://cran.r-project.org/, CRAN-Pakete},
@item bioconductor
Aktualisierungsprogramm für R-Pakete vom
@uref{https://www.bioconductor.org/, Bioconductor},
@item cpan
Aktualisierungsprogramm für @uref{https://www.cpan.org/, CPAN-Pakete},
@item pypi
Aktualisierungsprogramm für @uref{https://pypi.python.org, PyPI-Pakete},
@item gem
Aktualisierungsprogramm für @uref{https://rubygems.org, RubyGems-Pakete}.
@item github
Aktualisierungsprogramm für @uref{https://github.com, GitHub-Pakete}.

Das @code{github}-Aktualisierungsprogramm benutzt die
@uref{https://developer.github.com/v3/, GitHub-Programmierschnittstelle}
(die „Github-API“), um Informationen über neue Veröffentlichungen
einzuholen. Geschieht dies oft, z.B.@: beim Auffrischen aller Pakete, so
wird GitHub irgendwann aufhören, weitere API-Anfragen zu
beantworten. Normalerweise sind 60 API-Anfragen pro Stunde erlaubt, für eine
vollständige Auffrischung aller GitHub-Pakete in Guix werden aber mehr
benötigt. Wenn Sie sich bei GitHub mit Ihrem eigenen API-Token
authentisieren, gelten weniger einschränkende Grenzwerte. Um einen API-Token
zu benutzen, setzen Sie die Umgebungsvariable @env{GUIX_GITHUB_TOKEN} auf
einen von @uref{https://github.com/settings/tokens} oder anderweitig
bezogenen API-Token.
@item hackage
Aktualisierungsprogramm für @uref{https://hackage.haskell.org,
Hackage-Pakete}.
@item stackage
Aktualisierungsprogramm für @uref{https://www.stackage.org,
Stackage-Pakete}.
@item crate
Aktualisierungsprogramm für @uref{https://crates.io, Crates-Pakete}.
@item launchpad
Aktualisierungsprogramm für @uref{https://launchpad.net, Launchpad}.

@item generic-html
a generic updater that crawls, by default, the HTML page where the source
tarball of the package is hosted, when applicable.  Behavior can be
customized with the following package properties:

@table @code
@item release-monitoring-url
an alternate URL to crawl;

@item release-file-regexp
an regular expression matching release file names, whose first subexpression
must correspond to the version string.
@end table

Here is an example package with a custom release monitoring URL and a regexp
matching an unconventional release file name (it's unconventional due to the
use of upper case letter and the lack of a hyphen before the version
string):

@lisp
(package
  ;; @dots{}
  (home-page "http://example.org/software/the-package.html")
  (properties
    `((release-monitoring-url . ,home-page)
      (release-file-regexp . "ThePackage([0-9\\.]+)\\.tgz"))))
@end lisp

@item generic-git
allgemeines Aktualisierungsprogramm, das auf in Git-Repositorys angebotene
Pakete anwendbar ist. Es wird versucht, Versionen anhand der Namen von
Git-Tags zu erkennen, aber wenn Tag-Namen nicht korrekt zerteilt und
verglichen werden, können Anwender die folgenden Eigenschaften im Paket
festlegen.

@itemize
@item @code{release-tag-prefix}: einen regulären Ausdruck, der zum Präfix des
Tag-Namens passt.

@item @code{release-tag-suffix}: einen regulären Ausdruck, der zum Suffix des
Tag-Namens passt.

@item @code{release-tag-version-delimiter}: eine Zeichenkette, die im
Tag-Namen die Zahlen trennt, aus denen sich die Version zusammensetzt.

@item @code{accept-pre-releases}: ob Vorabveröffentlichungen berücksichtigt
werden sollen. Vorgegeben ist, sie zu ignorieren. Setzen Sie dies auf
@code{#t}, um sie hinzuzunehmen.

@end itemize

@lisp
(package
  (name "foo")
  ;; …
  (properties
    '((release-tag-prefix . "^release0-")
      (release-tag-suffix . "[a-z]?$")
      (release-tag-version-delimiter . ":"))))
@end lisp


@end table

Zum Beispiel prüft folgender Befehl nur auf mögliche Aktualisierungen von
auf @code{elpa.gnu.org} angebotenen Emacs-Paketen und von CRAN-Paketen:

@example
$ guix refresh --type=elpa,cran
gnu/packages/statistics.scm:819:13: r-testthat would be upgraded from 0.10.0 to 0.11.0
gnu/packages/emacs.scm:856:13: emacs-auctex would be upgraded from 11.88.6 to 11.88.9
@end example

@item --list-updaters
Eine Liste verfügbarer Aktualisierungsprogramme anzeigen und terminieren
(siehe @option{--type} oben).

Für jedes Aktualisierungsprogramm den Anteil der davon betroffenen Pakete
anzeigen; zum Schluss wird der Gesamtanteil von irgendeinem
Aktualisierungsprogramm betroffener Pakete angezeigt.

@item --list-dependent
@itemx -l
Auflisten, welche abhängigen Pakete auf oberster Ebene neu erstellt werden
müssten, wenn eines oder mehrere Pakete aktualisiert würden.

Siehe @ref{Aufruf von guix graph, den @code{reverse-package}-Typ von
@command{guix graph}} für Informationen dazu, wie Sie die Liste der
Abhängigen eines Pakets visualisieren können.

Siehe @ref{build-dependents, @command{guix build --dependents}} für eine
einfache Möglichkeit, alle Abhängigen eines Pakets erstellen.

Bedenken Sie, dass die Befehlszeilenoption @option{--list-dependent} das
Ausmaß der nach einer Aktualisierungen benötigten Neuerstellungen nur
@emph{annähert}. Es könnten auch unter Umständen mehr Neuerstellungen
anfallen.

@example
$ guix refresh --list-dependent flex
Die folgenden 120 Pakete zu erstellen, würde zur Folge haben, dass 213 abhängige Pakete neu erstellt werden:
hop@@2.4.0 emacs-geiser@@0.13 notmuch@@0.18 mu@@0.9.9.5 cflow@@1.4 idutils@@4.6 …
@end example

Der oben stehende Befehl gibt einen Satz von Paketen aus, die Sie erstellen
wollen könnten, um die Kompatibilität einer Aktualisierung des
@code{flex}-Pakets beurteilen zu können.

@item --list-transitive
@itemx -T
Die Pakete auflisten, von denen eines oder mehrere Pakete abhängen.

@example
$ guix refresh --list-transitive flex
flex@@2.6.4 hängt von den folgenden 25 Paketen ab: perl@@5.28.0 help2man@@1.47.6
bison@@3.0.5 indent@@2.2.10 tar@@1.30 gzip@@1.9 bzip2@@1.0.6 xz@@5.2.4 file@@5.33 …
@end example

Der oben stehende Befehl gibt einen Satz von Paketen aus, die, wenn sie
geändert würden, eine Neuerstellung des @code{flex}-Pakets auslösen würden.

@item --load-path=@var{Verzeichnis}
@itemx -L @var{Verzeichnis}
Das @var{Verzeichnis} vorne an den Suchpfad für Paketmodule anfügen (siehe
@ref{Paketmodule}).

Damit können Nutzer dafür sorgen, dass ihre eigenen selbstdefinierten Pakete
für die Befehlszeilenwerkzeuge sichtbar sind.

@end table

Mit den folgenden Befehlszeilenoptionen können Sie das Verhalten von GnuPG
anpassen:

@table @code

@item --gpg=@var{Befehl}
Den @var{Befehl} als GnuPG-2.x-Befehl einsetzen. Der @var{Befehl} wird im
@code{$PATH} gesucht.

@item --keyring=@var{Datei}
Die @var{Datei} als Schlüsselbund mit Anbieterschlüsseln verwenden. Die
@var{Datei} muss im @dfn{Keybox-Format} vorliegen. Keybox-Dateien haben
normalerweise einen Namen, der auf @file{.kbx} endet. Sie können mit Hilfe
von GNU@tie{}Privacy Guard (GPG) bearbeitet werden (siehe @ref{kbxutil,
@command{kbxutil},, gnupg, Using the GNU Privacy Guard} für Informationen
über ein Werkzeug zum Bearbeiten von Keybox-Dateien).

Wenn diese Befehlszeilenoption nicht angegeben wird, benutzt @command{guix
refresh} die Keybox-Datei @file{~/.config/guix/upstream/trustedkeys.kbx} als
Schlüsselbund für Signierschlüssel von Anbietern. OpenPGP-Signaturen werden
mit Schlüsseln aus diesem Schlüsselbund überprüft; fehlende Schlüssel werden
auch in diesen Schlüsselbund heruntergeladen (siehe @option{--key-download}
unten).

Sie können wie folgt Schlüssel in eine bestimmte Keybox-Datei herunterladen:

@example
gpg --no-default-keyring --keyring mykeyring.kbx \
  --recv-keys @value{OPENPGP-SIGNING-KEY-ID}
@end example

Siehe @ref{GPG Configuration Options, @option{--keyring},, gnupg, Using the
GNU Privacy Guard} für mehr Informationen zur Befehlszeilenoption
@option{--keyring} von GPG.

@item --key-download=@var{Richtlinie}
Fehlende OpenPGP-Schlüssel gemäß dieser @var{Richtlinie} behandeln, für die
eine der Folgenden angegeben werden kann:

@table @code
@item always
Immer fehlende OpenPGP-Schlüssel herunterladen und zum GnuPG-Schlüsselbund
des Nutzers hinzufügen.

@item never
Niemals fehlende OpenPGP-Schlüssel herunterladen, sondern einfach abbrechen.

@item interactive
Ist ein Paket mit einem unbekannten OpenPGP-Schlüssel signiert, wird der
Nutzer gefragt, ob der Schlüssel heruntergeladen werden soll oder nicht.

@item auto
Automatically selects the @code{interactive} policy when the standard input
is connected to a pseudo terminal (TTY), else @code{always}.  This is the
default behavior.
@end table

@item --key-server=@var{Host}
Den mit @var{Host} bezeichneten Rechner als Schlüsselserver für OpenPGP
benutzen, wenn ein öffentlicher Schlüssel importiert wird.

@end table

@node Aufruf von guix style
@section @command{guix style} aufrufen

@cindex @command{guix style}
@cindex Stilregeln
@cindex Linting, Code-Stil
@cindex Formatierung, Code-Stil
@cindex Formatierungskonventionen
Mit dem Befehl @command{guix style} können sowohl Nutzer als auch
Paketentwickler ihre Paketdefinitionen und Konfigurationsdateien
entsprechend der aktuell modischen Trends umgestalten. Sie können entweder
ganze Dateien mit der Befehlszeilenoption @option{--whole-file}
umformatieren oder die gewählten @dfn{Stilregeln} auf einzelne
Paketdefinitionen anwenden. Im Moment werden Regeln für die folgenden
Stilfragen angeboten:

@itemize
@item
Den Stil der Paketeingaben nach den Projektkonventionen auszurichten (siehe
@ref{Formatierung von Code}), sowie

@item
Paketeingaben in den „neuen Stil“ umzuschreiben, wie unten erklärt wird.
@end itemize

Zurzeit läuft eine Umstellung der Notation, wie Paketeingaben aufgeschrieben
werden (siehe @ref{„package“-Referenz}, für weitere Informationen zu
Paketeingaben). Bis Version 1.3.0 wurden Paketeingaben im „alten Stil“
verfasst, d.h.@: man schrieb zu jeder Eingabe ausdrücklich eine Bezeichnung
dazu, in der Regel der Paketname:

@lisp
(package
  ;; …
  ;; Der „alte Stil“ (veraltet).
  (inputs `(("libunistring" ,libunistring)
            ("libffi" ,libffi))))
@end lisp

Der alte Stil gilt heute als veraltet. Der bevorzugte Stil sieht so aus:

@lisp
(package
  ;; …
  ;; Der „neue Stil“.
  (inputs (list libunistring libffi)))
@end lisp

Ebenso gilt als veraltet, Eingaben mit @code{alist-delete} und seinen
Freunden zu verarbeiten; bevorzugt wird @code{modify-inputs} (siehe
@ref{Paketvarianten definieren} für weitere Informationen zu
@code{modify-inputs}).

In den allermeisten Fällen ist das eine rein mechanische Änderung der
oberflächlichen Syntax und die Pakete müssen dazu nicht einmal neu erstellt
werden. Diese kann @command{guix style -S inputs} für Sie übernehmen, egal
ob Sie an Paketen innerhalb des eigentlichen Guix oder in einem externen
Kanal arbeiten.

Die allgemeine Syntax lautet:

@example
guix style [@var{Optionen}] @var{Paket}…
@end example

Damit wird sich @command{guix style} der Analyse und Umschreibung der
Definition von @var{Paket}… annehmen. Wenn Sie kein @var{Paket} angeben,
nimmt es sich @emph{alle} Pakete vor. Mit der Befehlszeilenoption
@option{--styling} oder @option{-S} können Sie auswählen, nach welcher
Stilregel @command{guix style} vorgeht. Vorgegeben ist die
@code{format}-Regel, siehe unten.

Um ganze Quelldateien auf einmal umzuformatieren, lautet die Syntax:

@example
guix style --whole-file @var{Datei}…
@end example

Die verfügbaren Befehlszeilenoptionen folgen.

@table @code
@item --dry-run
@itemx -n
Anzeigen, welche Stellen im Quellcode verändert würden, sie jedoch nicht
verändern.

@item --whole-file
@itemx -f
Ganze Quelldateien auf einmal umformatieren. In diesem Fall werden weitere
Argumente als Dateinamen aufgefasst (und eben nicht als Paketnamen) und die
Befehlszeilenoption @option{--styling} ist ohne Wirkung.

Zum Beispiel können Sie so die Datei mit Ihrer Betriebssystemkonfiguration
umformatieren (vorausgesetzt Sie haben die Schreibberechtigung auf der
Datei):

@example
guix style -f /etc/config.scm
@end example

@item --alphabetical-sort
@itemx -A
Place the top-level package definitions in the given files in alphabetical
order.  Package definitions with matching names are placed with versions in
descending order.  This option only has an effect in combination with
@option{--whole-file}.

@item --styling=@var{Regel}
@itemx -S @var{Regel}
Die @var{Regel} anwenden, die eine der folgenden Stilregeln sein muss:

@table @code
@item format
Die angegebene Paketdefinition bzw.@: mehrere Paketdefinitionen
formatieren. Das ist die voreingestellte Stilregel. Wenn zum Beispiel eine
Paketautorin, die Guix aus einem Checkout heraus ausführt (siehe
@ref{Guix vor der Installation ausführen}), die Definition des
Coreutils-Pakets formatieren wollte, würde sie das machen:

@example
./pre-inst-env guix style coreutils
@end example

@item inputs
Paketeingaben in den oben beschriebenen „neuen Stil“ umschreiben. Hiermit
würden Sie die Eingaben des Pakets @code{oderso} in Ihrem eigenen Kanal
umschreiben:

@example
guix style -L ~/eigener/kanal -S inputs oderso
@end example

Die Umschreibung geschieht auf konservative Art: Kommentare bleiben erhalten
und wenn es den Code in einem @code{inputs}-Feld @emph{nicht} erfassen kann,
gibt @command{guix style} auf. Die Befehlszeilenoption
@option{--input-simplification} ermöglicht, genau zu bestimmen, unter
welchen Voraussetzungen Eingaben vereinfacht werden sollen.

@item arguments
Die Paketargumente werden so umgeschrieben, dass G-Ausdrücke benutzt werden
(siehe @ref{G-Ausdrücke}). Betrachten Sie zum Beispiel diese
Paketdefinition:

@lisp
(define-public mein-paket
  (package
    ;; …
    (arguments      ;der alte Stil mit quotierten Argumenten
     '(#:make-flags '("V=1")
       #:phases (modify-phases %standard-phases
                  (delete 'build))))))
@end lisp

@noindent
Wenn Sie @command{guix style -S arguments} auf dieses Paket ausführen, würde
sein @code{arguments}-Feld so umgeschrieben:

@lisp
(define-public mein-paket
  (package
    ;; …
    (arguments
      (list #:make-flags #~'("V=1")
            #:phases #~(modify-phases %standard-phases
                         (delete 'build))))))
@end lisp

Wir weisen darauf hin, dass Änderungen durch die @code{arguments}-Regel
@emph{keine} Neuerstellung der betroffenen Pakete zur Folge hat. Des
Weiteren wird, wenn eine Paketdefinition bereits G-Ausdrücke benutzt, nichts
durch @command{guix style} verändert.

@item git-source
If the @code{home-page} is a Git repository (as per
@code{git-repository-url?}), and the actual Git repository is tagged with
@code{version} or @code{(string-append ``v'' version)}, change the package
origin to the @code{git-fetch} method (@pxref{„origin“-Referenz}).  Consider
this example:

@lisp
(define-public guile-json-4
  (package
    (inherit guile-json-3)
    (name "guile-json")
    (version "4.7.3")
    (source (origin
              (method url-fetch)
              (uri (string-append "mirror://savannah/guile-json/guile-json-"
                                  version ".tar.gz"))
              (sha256
               (base32
                "127k2xc07w1gnyqs40z4865l8p3ra5xgpcn569dz04lxsa709fiq"))))))
@end lisp

@noindent
Running @command{guix style -S git-source} on this package would rewrite its
@code{source} field like to:

@lisp
(define-public guile-json-4
  (package
    (inherit guile-json-3)
    (name "guile-json")
    (version "4.7.3")
    (source (origin
              (method git-fetch)
              (uri (git-reference (url
                                   "https://github.com/aconchillo/guile-json")
                                  (commit version)))
              (file-name (git-file-name name version))
              (sha256 (base32
                       "0akhm8xjv8fl55fyq0w6c9c6hi5j7mifjx01w07np7qg1cjl9f06"))))))
@end lisp

@end table

@item --list-stylings
@itemx -l
Alle verfügbaren Stilregeln auflisten und beschreiben und sonst nichts.

@item --load-path=@var{Verzeichnis}
@itemx -L @var{Verzeichnis}
Das @var{Verzeichnis} vorne an den Suchpfad für Paketmodule anfügen (siehe
@ref{Paketmodule}).

@item --expression=@var{Ausdruck}
@itemx -e @var{Ausdruck}
Das Paket umgestalten, zu dem der @var{Ausdruck} ausgewertet wird.

Zum Beispiel startet dies:

@example
guix style -e '(@@ (gnu packages gcc) gcc-5)'
@end example

ändert den Stil der Paketdefinition für @code{gcc-5}.

@item --input-simplification=@var{Richtlinie}
Wenn Sie die Stilregel @code{inputs} verwenden, als @samp{-S inputs}, geben
Sie hiermit die Richtlinie zur Vereinfachung der Paketeingaben für die Fälle
an, wenn eine Eingabenbezeichnung nicht zum damit assoziierten Paketnamen
passt. Die @var{Richtlinie} kann eine der folgenden sein:

@table @code
@item silent
Die Eingaben nur vereinfachen, wenn die Änderung unmerklich sind, in dem
Sinne, dass das Paket nicht aufs Neue erstellt werden muss (seine Ableitung
also dieselbe bleibt).

@item safe
Die Eingaben nur vereinfachen, wenn dies keine Probleme mit sich
bringt. Hier darf das Paket neu erstellt werden müssen, aber die Änderung
daran hat keine beobachtbaren Auswirkungen.

@item always
Die Eingaben selbst dann vereinfachen, wenn die Eingabebezeichnungen
@emph{nicht} zu den Paketnamen passen, obwohl das Auswirkungen haben könnte.
@end table

Die Vorgabe ist @code{silent}, also nur unmerkliche Vereinfachungen, die
keine Neuerstellung auslösen.
@end table

@node Aufruf von guix lint
@section @command{guix lint} aufrufen

@cindex @command{guix lint}
@cindex Pakete, auf Fehler prüfen
Den Befehl @command{guix lint} gibt es, um Paketentwicklern beim Vermeiden
häufiger Fehler und bei der Einhaltung eines konsistenten Code-Stils zu
helfen. Er führt eine Reihe von Prüfungen auf einer angegebenen Menge von
Paketen durch, um in deren Definition häufige Fehler aufzuspüren. Zu den
verfügbaren @dfn{Prüfern} gehören (siehe @option{--list-checkers} für eine
vollständige Liste):

@table @code
@item synopsis
@itemx description
Überprüfen, ob bestimmte typografische und stilistische Regeln in
Paketbeschreibungen und -zusammenfassungen eingehalten wurden.

@item inputs-should-be-native
Eingaben identifizieren, die wahrscheinlich native Eingaben sein sollten.

@item source
@itemx home-page
@itemx mirror-url
@itemx github-url
@itemx source-file-name
Die URLs für die Felder @code{home-page} und @code{source} anrufen und nicht
erreichbare URLs melden. Wenn passend, wird eine @code{mirror://}-URL
vorgeschlagen. Wenn die Quell-URL auf eine GitHub-URL weiterleitet, wird
eine Empfehlung ausgegeben, direkt letztere zu verwenden. Es wird geprüft,
dass der Quell-Dateiname aussagekräftig ist, dass er also z.B.@: nicht nur
aus einer Versionsnummer besteht oder als „git-checkout“ angegeben wurde,
ohne dass ein @code{Dateiname} deklariert wurde (siehe @ref{„origin“-Referenz}).

@item source-unstable-tarball
Analysiert die @code{source}-URL, um zu bestimmen, ob der Tarball von GitHub
automatisch generiert wurde oder zu einer Veröffentlichung gehört. Leider
werden GitHubs automatisch generierte Tarballs manchmal neu generiert.

@item misplaced-flags
Parse the @code{make-flags} and @code{configure-flags} to check for any
flags which should be set with another flag as part of the build-system.
For example,

@lisp
(build-system cmake-build-system)
(arguments
 (list #:configure-flags #~(list "-DCMAKE_BUILD_TYPE=RELEASE"
                                 "-DTESTS=ON")))
@end lisp

should instead be written as:

@lisp
(build-system cmake-build-system)
(arguments
 (list #:build-type "RELEASE"
       #:configure-flags #~(list "-DTESTS=ON")))
@end lisp

@item derivation
Prüft, ob die Ableitung der angegebenen Pakete auf allen unterstützten
Systmen erfolgreich berechnet werden kann (siehe @ref{Ableitungen}).

@item profile-collisions
Prüft, ob die Installation der angegebenen Pakete in ein Profil zu
Kollisionen führen würde. Kollisionen treten auf, wenn mehrere Pakete mit
demselben Namen aber anderer Versionsnummer oder anderem Store-Dateinamen
propagiert werden. Siehe @ref{„package“-Referenz, @code{propagated-inputs}}
für weitere Informationen zu propagierten Eingaben.

@item archival
@cindex Software Heritage, Quellcode-Archiv
@cindex Archivierung von Quellcode, Software Heritage
Überprüft, ob der Quellcode des Pakets bei der
@uref{https://www.softwareheritage.org, Software Heritage} archiviert ist.

Wenn der noch nicht archivierte Quellcode aus einem Versionskontrollsystem
(„Version Control System“, VCS) stammt, wenn er also z.B.@: mit
@code{git-fetch} bezogen wird, wird eine Anfrage an Software Heritage
gestellt, diesen zu speichern („Save“), damit sie ihn irgendwann in deren
Archiv aufnehmen. So wird gewährleistet, dass der Quellcode langfristig
verfügbar bleibt und Guix notfalls auf Software Heritage zurückgreifen kann,
falls der Quellcode bei seinem ursprünglichen Anbieter verschwindet. Der
Status kürzlicher Archivierungsanfragen kann
@uref{https://archive.softwareheritage.org/save/#requests, online eingesehen
werden}.

Wenn der Quellcode in Form eines über @code{url-fetch} zu beziehenden
Tarballs vorliegt, wird bloß eine Nachricht ausgegeben, wenn er nicht
archiviert ist. Zum Zeitpunkt, wo dies geschrieben wurde, ermöglicht
Software Heritage keine Anfragen, beliebige Tarballs zu archivieren; wir
arbeiten an Möglichkeiten wie auch @emph{nicht} versionskontrollierter
Quellcode archiviert werden kann.

Software Heritage
@uref{https://archive.softwareheritage.org/api/#rate-limiting, beschränkt},
wie schnell dieselbe IP-Adresse Anfragen stellen kann. Ist das Limit
erreicht, gibt @command{guix lint} eine Mitteilung aus und der
@code{archival}-Prüfer steht so lange still, bis die Beschränkung wieder
zurückgesetzt wurde.

@item cve
@cindex Sicherheitslücken
@cindex CVE, Common Vulnerabilities and Exposures
Bekannte Sicherheitslücken melden, die in den Datenbanken der „Common
Vulnerabilities and Exposures“ (CVE) aus diesem und dem letzten Jahr
vorkommen, @uref{https://nvd.nist.gov/vuln/data-feeds, wie sie von der
US-amerikanischen NIST veröffentlicht werden}.

Um Informationen über eine bestimmte Sicherheitslücke angezeigt zu bekommen,
besuchen Sie Webseiten wie:

@itemize
@item
@indicateurl{https://web.nvd.nist.gov/view/vuln/detail?vulnId=CVE-YYYY-ABCD}
@item
@indicateurl{https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-YYYY-ABCD}
@end itemize

@noindent
wobei Sie statt @code{CVE-YYYY-ABCD} die CVE-Kennnummer angeben@tie{}–
z.B.@: @code{CVE-2015-7554}.

Paketentwickler können in ihren Paketrezepten den Namen und die Version des
Pakets in der @uref{https://nvd.nist.gov/products/cpe,Common Platform
Enumeration (CPE)} angeben, falls sich diese von dem in Guix benutzten Namen
und der Version unterscheiden, zum Beispiel so:

@lisp
(package
  (name "grub")
  ;; …
  ;; CPE bezeichnet das Paket als "grub2".
  (properties '((cpe-name . "grub2")
                (cpe-version . "2.3"))))
@end lisp

A CVE alert can be a false positive when its CPE name matches the one in
Guix, while actually referring to a distinct product.  These alerts can be
addressed by setting the correct CPE vendor, or when no vendors apply, by
ignoring alerts from irrelevant vendors, as in these examples:

@lisp
(package
  (name "halibut")
  ;; @dots{}
  (properties '((cpe-vendor . "halibut_project"))))

(package
  (name "cvs")
  ;; @dots{}
  (properties '((lint-hidden-cpe-vendors . ("jenkins"
                                            "vendor2")))))
@end lisp

@c See <https://www.openwall.com/lists/oss-security/2017/03/15/3>.
Zuletzt geben manche Einträge in der CVE-Datenbank die Version des Pakets
nicht an, auf das sie sich beziehen, und würden daher bis in alle Ewigkeit
Warnungen auslösen. Paketentwickler, die CVE-Warnmeldungen gefunden und
geprüft haben, dass diese ignoriert werden können, können sie wie in diesem
Beispiel deklarieren:

@lisp
(package
  (name "t1lib")
  ;; …
  ;; Diese CVEs treffen nicht mehr zu und können bedenkenlos ignoriert
  ;; werden.
  (properties `((lint-hidden-cve . ("CVE-2011-0433"
                                    "CVE-2011-1553"
                                    "CVE-2011-1554"
                                    "CVE-2011-5244")))))
@end lisp

@item formatting
Offensichtliche Fehler bei der Formatierung von Quellcode melden, z.B.@:
Leerraum-Zeichen am Zeilenende oder Nutzung von Tabulatorzeichen.

@item input-labels
Eingabebezeichnungen im alten Stil melden, die nicht dem Namen des damit
assoziierten Pakets entsprechen. Diese Funktionalität soll bei der Migration
weg vom „alten Eingabenstil“ helfen. Siehe @ref{„package“-Referenz}, um mehr
Informationen über Paketeingaben und Eingabenstile zu bekommen. Siehe
@ref{Aufruf von guix style} für Informationen, wie Sie zum neuen Stil
migrieren können.
@end table

Die allgemeine Syntax lautet:

@example
guix lint @var{Optionen} @var{Pakete}…
@end example

Wird kein Paket auf der Befehlszeile angegeben, dann werden alle Pakete
geprüft, die es gibt. Als @var{Optionen} können null oder mehr der folgenden
Befehlszeilenoptionen übergeben werden:

@table @code
@item --list-checkers
@itemx -l
Alle verfügbaren Prüfer für die Pakete auflisten und beschreiben.

@item --checkers
@itemx -c
Nur die Prüfer aktivieren, die hiernach in einer kommagetrennten Liste aus
von @option{--list-checkers} aufgeführten Prüfern vorkommen.

@item --exclude
@itemx -x
Nur die Prüfer deaktivieren, die hiernach in einer kommagetrennten Liste aus
von @option{--list-checkers} aufgeführten Prüfern vorkommen.

@item --expression=@var{Ausdruck}
@itemx -e @var{Ausdruck}
Als Paket benutzen, wozu der @var{Ausdruck} ausgewertet wird.

Dies ist nützlich, um die Pakete eindeutig angeben zu können, wie in diesem
Beispiel:

@example
guix lint -c archival -e '(@@ (gnu packages guile) guile-3.0)'
@end example

@item --no-network
@itemx -n
Nur die Prüfer aktivieren, die keinen Internetzugang benötigen.

@item --load-path=@var{Verzeichnis}
@itemx -L @var{Verzeichnis}
Das @var{Verzeichnis} vorne an den Suchpfad für Paketmodule anfügen (siehe
@ref{Paketmodule}).

Damit können Nutzer dafür sorgen, dass ihre eigenen selbstdefinierten Pakete
für die Befehlszeilenwerkzeuge sichtbar sind.

@end table

@node Aufruf von guix size
@section @command{guix size} aufrufen

@cindex size
@cindex Paketgröße
@cindex closure
@cindex @command{guix size}
Der Befehl @command{guix size} hilft Paketentwicklern dabei, den
Plattenplatzverbrauch von Paketen zu profilieren. Es ist leicht, die
Auswirkungen zu unterschätzen, die das Hinzufügen zusätzlicher
Abhängigkeiten zu einem Paket hat oder die das Verwenden einer einzelnen
Ausgabe für ein leicht aufteilbares Paket ausmacht (siehe @ref{Pakete mit mehreren Ausgaben.}). Das sind typische Probleme, auf die @command{guix size}
aufmerksam machen kann.

Dem Befehl können eine oder mehrere Paketspezifikationen wie @code{gcc@@4.8}
oder @code{guile:debug} übergeben werden, oder ein Dateiname im
Store. Betrachten Sie dieses Beispiel:

@example
$ guix size coreutils
Store-Objekt                            Gesamt   Selbst
/gnu/store/…-gcc-5.5.0-lib           60.4    30.1  38.1%
/gnu/store/…-glibc-2.27              30.3    28.8  36.6%
/gnu/store/…-coreutils-8.28          78.9    15.0  19.0%
/gnu/store/…-gmp-6.1.2               63.1     2.7   3.4%
/gnu/store/…-bash-static-4.4.12       1.5     1.5   1.9%
/gnu/store/…-acl-2.2.52              61.1     0.4   0.5%
/gnu/store/…-attr-2.4.47             60.6     0.2   0.3%
/gnu/store/…-libcap-2.25             60.5     0.2   0.2%
Gesamt: 78.9 MiB
@end example

@cindex closure
Die hier aufgelisteten Store-Objekte bilden den @dfn{transitiven Abschluss}
der Coreutils@tie{}– d.h.@: die Coreutils und all ihre Abhängigkeiten und
deren Abhängigkeiten, rekursiv@tie{}–, wie sie hiervon angezeigt würden:<f

@example
$ guix gc -R /gnu/store/…-coreutils-8.23
@end example

Hier zeigt die Ausgabe neben den Store-Objekten noch drei Spalten. Die erste
Spalte namens „Gesamt“ gibt wieder, wie viele Mebibytes (MiB) der Abschluss
des Store-Objekts groß ist@tie{}– das heißt, dessen eigene Größe plus die
Größe all seiner Abhängigkeiten. Die nächste Spalte, bezeichnet mit
„Selbst“, zeigt die Größe nur dieses Objekts an. Die letzte Spalte zeigt das
Verhältnis der Größe des Objekts zur Gesamtgröße aller hier aufgelisteten
Objekte an.

In diesem Beispiel sehen wir, dass der Abschluss der Coreutils 79@tie{}MiB
schwer ist, wovon das meiste durch libc und die Bibliotheken zur
Laufzeitunterstützung von GCC ausgemacht wird. (Dass libc und die
Bibliotheken vom GCC einen großen Anteil am Abschluss ausmachen, ist aber an
sich noch kein Problem, weil es Bibliotheken sind, die auf dem System
sowieso immer verfügbar sein müssen.)

Weil der Befehl auch Namen von Store-Dateien akzeptiert, kann man damit auch
die Größe eines Erstellungsergebnisses ermitteln:

@example
guix size $(guix system build config.scm)
@end example

Wenn das oder die Paket(e), die an @command{guix size} übergeben wurden, im
Store verfügbar sind@footnote{Genauer gesagt braucht @command{guix size} die
@emph{nicht veredelte} Variante des angegebenen Pakets bzw. der Pakete, wie
@code{guix build @var{Paket} --no-grafts} sie liefert. Siehe @ref{Sicherheitsaktualisierungen} für Informationen über Veredelungen.}, beauftragen Sie mit
@command{guix size} den Daemon, die Abhängigkeiten davon zu bestimmen und
deren Größe im Store zu messen, ähnlich wie es mit @command{du -ms
--apparent-size} geschehen würde (siehe @ref{du invocation,,, coreutils, GNU
Coreutils}).

Wenn die übergebenen Pakete @emph{nicht} im Store liegen, erstattet
@command{guix size} Bericht mit Informationen, die aus verfügbaren
Substituten herausgelesen werden (siehe @ref{Substitute}). Dadurch kann die
Plattenausnutzung von Store-Objekten profiliert werden, die gar nicht auf
der Platte liegen und nur auf entfernten Rechnern vorhanden sind.

Sie können auch mehrere Paketnamen angeben:

@example
$ guix size coreutils grep sed bash
Store-Objekt                            Gesamt   Selbst
/gnu/store/…-coreutils-8.24          77.8    13.8  13.4%
/gnu/store/…-grep-2.22               73.1     0.8   0.8%
/gnu/store/…-bash-4.3.42             72.3     4.7   4.6%
/gnu/store/…-readline-6.3            67.6     1.2   1.2%
…
Gesamt: 102.3 MiB
@end example

@noindent
In diesem Beispiel sehen wir, dass die Kombination der vier Pakete insgesamt
102,3@tie{}MiB Platz verbraucht, was wesentlich weniger als die Summe der
einzelnen Abschlüsse ist, weil diese viele Abhängigkeiten gemeinsam
verwenden.

Wenn Sie sich das von @command{guix size} gelieferte Profil anschauen,
fragen Sie sich vielleicht, warum ein bestimmtes Paket überhaupt darin
auftaucht. Den Grund erfahren Sie, wenn Sie @command{guix graph --path -t
references} benutzen, um sich den kürzesten Pfad zwischen zwei Paketen
anzeigen zu lassen (siehe @ref{Aufruf von guix graph}).

Die verfügbaren Befehlszeilenoptionen sind:

@table @option

@item --substitute-urls=@var{URLs}
Substitutinformationen von den @var{URLs} benutzen. Siehe
@ref{client-substitute-urls, dieselbe Option bei @code{guix build}}.

@item --sort=@var{Schlüssel}
Zeilen anhand des @var{Schlüssel}s sortieren, der eine der folgenden
Alternativen sein muss:

@table @code
@item self
die Größe jedes Objekts (die Vorgabe),
@item closure
die Gesamtgröße des Abschlusses des Objekts.
@end table

@item --map-file=@var{Datei}
Eine grafische Darstellung des Plattenplatzverbrauchs als eine
PNG-formatierte Karte in die @var{Datei} schreiben.

Für das Beispiel oben sieht die Karte so aus:

@image{images/coreutils-size-map,5in,, Karte der Plattenausnutzung der
Coreutils, erzeugt mit @command{guix size}}

Diese Befehlszeilenoption setzt voraus, dass
@uref{https://wingolog.org/software/guile-charting/, Guile-Charting}
installiert und im Suchpfad für Guile-Module sichtbar ist. Falls nicht,
schlägt @command{guix size} beim Versuch fehl, dieses Modul zu laden.

@item --system=@var{System}
@itemx -s @var{System}
Pakete für dieses @var{System} betrachten@tie{}– z.B.@: für
@code{x86_64-linux}.

@item --load-path=@var{Verzeichnis}
@itemx -L @var{Verzeichnis}
Das @var{Verzeichnis} vorne an den Suchpfad für Paketmodule anfügen (siehe
@ref{Paketmodule}).

Damit können Nutzer dafür sorgen, dass ihre eigenen selbstdefinierten Pakete
für die Befehlszeilenwerkzeuge sichtbar sind.
@end table

@node Aufruf von guix graph
@section @command{guix graph} aufrufen

@cindex DAG
@cindex @command{guix graph}
@cindex Paketabhängigkeiten
Pakete und ihre Abhängigkeiten bilden einen @dfn{Graphen}, genauer gesagt
einen gerichteten azyklischen Graphen (englisch „Directed Acyclic Graph“,
kurz DAG). Es kann schnell schwierig werden, ein Modell eines Paket-DAGs vor
dem geistigen Auge zu behalten, weshalb der Befehl @command{guix graph} eine
visuelle Darstellung des DAGs bietet. Das vorgegebene Verhalten von
@command{guix graph} ist, eine DAG-Darstellung im Eingabeformat von
@uref{https://www.graphviz.org/, Graphviz} auszugeben, damit die Ausgabe
direkt an den Befehl @command{dot} aus Graphviz weitergeleitet werden
kann. Es kann aber auch eine HTML-Seite mit eingebettetem JavaScript-Code
ausgegeben werden, um ein Sehnendiagramm (englisch „Chord Diagram“) in einem
Web-Browser anzuzeigen, mit Hilfe der Bibliothek @uref{https://d3js.org/,
d3.js}, oder es können Cypher-Anfragen ausgegeben werden, mit denen eine die
Anfragesprache @uref{https://www.opencypher.org/, openCypher} unterstützende
Graph-Datenbank einen Graphen konstruieren kann. Wenn Sie @option{--path}
angeben, zeigt Guix Ihnen einfach nur den kürzesten Pfad zwischen zwei
Paketen an. Die allgemeine Syntax ist:

@example
guix graph @var{Optionen} @var{Pakete}…
@end example

Zum Beispiel erzeugt der folgende Befehl eine PDF-Datei, die den Paket-DAG
für die GNU@tie{}Core Utilities darstellt, welcher ihre Abhängigkeiten zur
Erstellungszeit anzeigt:

@example
guix graph coreutils | dot -Tpdf > dag.pdf
@end example

Die Ausgabe sieht so aus:

@image{images/coreutils-graph,2in,,Abhängigkeitsgraph der GNU Coreutils}

Ein netter, kleiner Graph, oder?

Vielleicht ist es Ihnen aber lieber, den Graphen interaktiv mit dem
@command{xdot}-Programm anzuschauen (aus dem Paket @code{xdot}):

@example
guix graph coreutils | xdot -
@end example

Aber es gibt mehr als eine Art von Graph! Der Graph oben ist kurz und knapp:
Es ist der Graph der Paketobjekte, ohne implizite Eingaben wie GCC, libc,
grep und so weiter. Oft möchte man einen knappen Graphen sehen, aber
manchmal will man auch mehr Details sehen. @command{guix graph} unterstützt
mehrere Typen von Graphen; Sie können den Detailgrad auswählen.

@table @code
@item package
Der vorgegebene Typ aus dem Beispiel oben. Er zeigt den DAG der Paketobjekte
ohne implizite Abhängigkeiten. Er ist knapp, filtert aber viele Details
heraus.

@item reverse-package
Dies zeigt den @emph{umgekehrten} DAG der Pakete. Zum Beispiel liefert

@example
guix graph --type=reverse-package ocaml
@end example

…@: den Graphen der Pakete, die @emph{explizit} von OCaml abhängen (wenn Sie
auch an Fällen interessiert sind, bei denen OCaml eine implizite
Abhängigkeit ist, siehe @code{reverse-bag} weiter unten).

Beachten Sie, dass für Kernpakete damit gigantische Graphen entstehen
können. Wenn Sie nur die Anzahl der Pakete wissen wollen, die von einem
gegebenen Paket abhängen, benutzen Sie @command{guix refresh
--list-dependent} (siehe @ref{Aufruf von guix refresh,
@option{--list-dependent}}).

@item bag-emerged
Dies ist der Paket-DAG @emph{einschließlich} impliziter Eingaben.

Zum Beispiel liefert der folgende Befehl

@example
guix graph --type=bag-emerged coreutils
@end example

…@: diesen größeren Graphen:

@image{images/coreutils-bag-graph,,5in,Detaillierter Abhängigkeitsgraph der
GNU Coreutils}

Am unteren Rand des Graphen sehen wir alle impliziten Eingaben des
@var{gnu-build-system} (siehe @ref{Erstellungssysteme, @code{gnu-build-system}}).

Beachten Sie dabei aber, dass auch hier die Abhängigkeiten dieser impliziten
Eingaben@tie{}– d.h.@: die @dfn{Bootstrap-Abhängigkeiten} (siehe
@ref{Bootstrapping})@tie{}– nicht gezeigt werden, damit der Graph knapper
bleibt.

@item bag
Ähnlich wie @code{bag-emerged}, aber diesmal mit allen
Bootstrap-Abhängigkeiten.

@item bag-with-origins
Ähnlich wie @code{bag}, aber auch mit den Ursprüngen und deren
Abhängigkeiten.

@item reverse-bag
Dies zeigt den @emph{umgekehrten} DAG der Pakete. Anders als
@code{reverse-package} werden auch implizite Abhängigkeiten
berücksichtigt. Zum Beispiel liefert

@example
guix graph -t reverse-bag dune
@end example

@noindent
…@: den Graphen aller Pakete, die von Dune direkt oder indirekt
abhängen. Weil Dune eine @emph{implizite} Abhängigkeit von vielen Paketen
über das @code{dune-build-system} ist, zeigt er eine große Zahl von Paketen,
während bei @code{reverse-package} nur sehr wenige bis gar keine zu sehen
sind.

@item derivation
Diese Darstellung ist am detailliertesten: Sie zeigt den DAG der Ableitungen
(siehe @ref{Ableitungen}) und der einfachen Store-Objekte. Verglichen mit
obiger Darstellung sieht man viele zusätzliche Knoten einschließlich
Erstellungs-Skripts, Patches, Guile-Module usw.

Für diesen Typ Graph kann auch der Name einer @file{.drv}-Datei anstelle
eines Paketnamens angegeben werden, etwa so:

@example
guix graph -t derivation $(guix system build -d my-config.scm)
@end example

@item module
Dies ist der Graph der @dfn{Paketmodule} (siehe @ref{Paketmodule}). Zum
Beispiel zeigt der folgende Befehl den Graphen für das Paketmodul an, das
das @code{guile}-Paket definiert:

@example
guix graph -t module guile | xdot -
@end example
@end table

Alle oben genannten Typen entsprechen @emph{Abhängigkeiten zur
Erstellungszeit}. Der folgende Graphtyp repräsentiert die
@emph{Abhängigkeiten zur Laufzeit}:

@table @code
@item references
Dies ist der Graph der @dfn{Referenzen} einer Paketausgabe, wie
@command{guix gc --references} sie liefert (siehe @ref{Aufruf von guix gc}).

Wenn die angegebene Paketausgabe im Store nicht verfügbar ist, versucht
@command{guix graph}, die Abhängigkeitsinformationen aus Substituten zu
holen.

Hierbei können Sie auch einen Store-Dateinamen statt eines Paketnamens
angeben. Zum Beispiel generiert der Befehl unten den Referenzgraphen Ihres
Profils (der sehr groß werden kann!):

@example
guix graph -t references $(readlink -f ~/.guix-profile)
@end example

@item referrers
Dies ist der Graph der ein Store-Objekt @dfn{referenzierenden} Objekte, wie
@command{guix gc --referrers} sie liefern würde (siehe @ref{Aufruf von guix gc}).

Er basiert ausschließlich auf lokalen Informationen aus Ihrem Store. Nehmen
wir zum Beispiel an, dass das aktuelle Inkscape in 10 Profilen verfügbar
ist, dann wird @command{guix graph -t referrers inkscape} einen Graph
zeigen, der bei Inkscape gewurzelt ist und Kanten zu diesen 10 Profilen hat.

Ein solcher Graph kann dabei helfen, herauszufinden, weshalb ein
Store-Objekt nicht vom Müllsammler abgeholt werden kann.

@end table

@cindex kürzester Pfad, zwischen Paketen
Oftmals passt der Graph des Pakets, für das Sie sich interessieren, nicht
auf Ihren Bildschirm, und überhaupt möchten Sie ja nur wissen, @emph{warum}
das Paket von einem anderen abhängt, das scheinbar nichts damit zu tun
hat. Die Befehlszeilenoption @option{--path} weist @command{guix graph} an,
den kürzesten Pfad zwischen zwei Paketen (oder Ableitungen, Store-Objekten
etc.)@: anzuzeigen:

@example
$ guix graph --path emacs libunistring
emacs@@26.3
mailutils@@3.9
libunistring@@0.9.10
$ guix graph --path -t derivation emacs libunistring
/gnu/store/…-emacs-26.3.drv
/gnu/store/…-mailutils-3.9.drv
/gnu/store/…-libunistring-0.9.10.drv
$ guix graph --path -t references emacs libunistring
/gnu/store/…-emacs-26.3
/gnu/store/…-libidn2-2.2.0
/gnu/store/…-libunistring-0.9.10
@end example

Manchmal eignet es sich, den angezeigten Graphen abzuschneiden, damit er
ordentlich dargestellt werden kann. Eine Möglihkeit ist, mit der
Befehlszeilenoption @option{--max-depth} (kurz @option{-M}) die maximale
Tiefe des Graphen festzulegen. Im folgenden Beispiel wird nur
@code{libreoffice} und diejenigen Knoten dargestellt, deren Distanz zu
@code{libreoffice} höchstens 2 beträgt:

@example
guix graph -M 2 libreoffice | xdot -f fdp -
@end example

Dabei bleibt zwar immer noch ein gewaltiges Spaghettiknäuel übrig, aber
zumindest kann das @command{dot}-Programm daraus schnell eine halbwegs
lesbare Darstellung erzeugen.

Folgendes sind die verfügbaren Befehlszeilenoptionen:

@table @option
@item --type=@var{Typ}
@itemx -t @var{Typ}
Eine Graph-Ausgabe dieses @var{Typ}s generieren. Dieser @var{Typ} muss einer
der oben genannten Werte sein.

@item --list-types
Die unterstützten Graph-Typen auflisten.

@item --backend=@var{Backend}
@itemx -b @var{Backend}
Einen Graph mit Hilfe des ausgewählten @var{Backend}s generieren.

@item --list-backends
Die unterstützten Graph-Backends auflisten.

Derzeit sind die verfügbaren Backends Graphviz und d3.js.

@item --path
Den kürzesten Pfad zwischen zwei Knoten anzeigen, die den mit
@option{--type} angegebenen Typ aufweisen. Im Beispiel unten wird der
kürzeste Pfad zwischen @code{libreoffice} und @code{llvm} anhand der
Referenzen von @code{libreoffice} angezeigt:

@example
$ guix graph --path -t references libreoffice llvm
/gnu/store/…-libreoffice-6.4.2.2
/gnu/store/…-libepoxy-1.5.4
/gnu/store/…-mesa-19.3.4
/gnu/store/…-llvm-9.0.1
@end example

@item --expression=@var{Ausdruck}
@itemx -e @var{Ausdruck}
Als Paket benutzen, wozu der @var{Ausdruck} ausgewertet wird.

Dies ist nützlich, um genau ein bestimmtes Paket zu referenzieren, wie in
diesem Beispiel:

@example
guix graph -e '(@@@@ (gnu packages commencement) gnu-make-final)'
@end example

@item --system=@var{System}
@itemx -s @var{System}
Den Graphen für das @var{System} anzeigen@tie{}– z.B.@: @code{i686-linux}.

Der Abhängigkeitsgraph ist größtenteils von der Systemarchitektur
unabhängig, aber ein paar architekturabhängige Teile können Ihnen mit dieser
Befehlszeilenoption visualisiert werden.

@item --load-path=@var{Verzeichnis}
@itemx -L @var{Verzeichnis}
Das @var{Verzeichnis} vorne an den Suchpfad für Paketmodule anfügen (siehe
@ref{Paketmodule}).

Damit können Nutzer dafür sorgen, dass ihre eigenen selbstdefinierten Pakete
für die Befehlszeilenwerkzeuge sichtbar sind.
@end table

Hinzu kommt, dass @command{guix graph} auch all die üblichen
Paketumwandlungsoptionen unterstützt (siehe @ref{Paketumwandlungsoptionen}). Somit ist es kein Problem, die Folgen einer den Paketgraphen
umschreibenden Umwandlung wie @option{--with-input} zu erkennen. Zum
Beispiel gibt der folgende Befehl den Graphen von @code{git} aus, nachdem
@code{openssl} an allen Stellen im Graphen durch @code{libressl} ersetzt
wurde:

@example
guix graph git --with-input=openssl=libressl
@end example

Ihrem Vergnügen sind keine Grenzen gesetzt!

@node Aufruf von guix publish
@section @command{guix publish} aufrufen

@cindex @command{guix publish}
Der Zweck von @command{guix publish} ist, es Nutzern zu ermöglichen, ihren
Store auf einfache Weise mit anderen zu teilen, die ihn dann als
Substitutserver einsetzen können (siehe @ref{Substitute}).

Wenn @command{guix publish} ausgeführt wird, wird dadurch ein HTTP-Server
gestartet, so dass jeder mit Netzwerkzugang davon Substitute beziehen
kann. Das bedeutet, dass jede Maschine, auf der Guix läuft, auch als
Erstellungsfarm fungieren kann, weil die HTTP-Schnittstelle mit Cuirass, der
Software, mit der die offizielle Erstellungsfarm
@code{@value{SUBSTITUTE-SERVER-1}} betrieben wird, kompatibel ist.

Um Sicherheit zu gewährleisten, wird jedes Substitut signiert, so dass
Empfänger dessen Authentizität und Integrität nachprüfen können (siehe
@ref{Substitute}). Weil @command{guix publish} den Signierschlüssel des
Systems benutzt, der nur vom Systemadministrator gelesen werden kann, muss
es als der Administratornutzer „root“ gestartet werden. Mit der
Befehlszeilenoption @option{--user} werden Administratorrechte bald nach dem
Start wieder abgelegt.

Das Schlüsselpaar zum Signieren muss erzeugt werden, bevor @command{guix
publish} gestartet wird. Dazu können Sie @command{guix archive
--generate-key} ausführen (siehe @ref{Aufruf von guix archive}).

Wird die Befehlszeilenoption @option{--advertise} übergeben, teilt der
Server anderen Rechnern im lokalen Netzwerk seine Verfügbarkeit mit, über
Multicast-DNS (mDNS) und DNS-Service-Discovery (DNS-SD), zurzeit mittels
Guile-Avahi (siehe @ref{Top,,, guile-avahi, Using Avahi in Guile Scheme
Programs}).

Die allgemeine Syntax lautet:

@example
guix publish @var{Optionen}…
@end example

Wird @command{guix publish} ohne weitere Argumente ausgeführt, wird damit
ein HTTP-Server gestartet, der auf Port 8080 lauscht:

@example
guix publish
@end example

@cindex Socket-Aktivierung, bei @command{guix publish}
Sie können @command{guix publish} auch über das systemd-Protokoll zur
„Socket-Aktivierung“ starten (siehe @ref{Service De- and Constructors,
@code{make-systemd-constructor},, shepherd, The GNU Shepherd Manual}).

Sobald ein Server zum Veröffentlichen autorisiert wurde, kann der Daemon
davon Substitute herunterladen. Siehe @ref{Substitute von anderen Servern holen}.

Nach den Voreinstellungen komprimiert @command{guix publish} Archive erst
dann, wenn sie angefragt werden. Dieser „dynamische“ Modus bietet sich an,
weil so nichts weiter eingerichtet werden muss und er direkt verfügbar
ist. Wenn Sie allerdings viele Clients bedienen wollen, empfehlen wir, dass
Sie die Befehlszeilenoption @option{--cache} benutzen, die das
Zwischenspeichern der komprimierten Archive aktiviert, bevor diese an die
Clients geschickt werden@tie{}– siehe unten für Details. Mit dem Befehl
@command{guix weather} haben Sie eine praktische Methode zur Hand, zu
überprüfen, was so ein Server anbietet (siehe @ref{Aufruf von guix weather}).

Als Bonus dient @command{guix publish} auch als inhaltsadressierbarer
Spiegelserver für Quelldateien, die in @code{origin}-Verbundsobjekten
eingetragen sind (siehe @ref{„origin“-Referenz}). Wenn wir zum Beispiel
annehmen, dass @command{guix publish} auf @code{example.org} läuft, liefert
folgende URL die rohe @file{hello-2.10.tar.gz}-Datei mit dem angegebenen
SHA256-Hash als ihre Prüfsumme (dargestellt im @code{nix-base32}-Format,
siehe @ref{Aufruf von guix hash}):

@example
http://example.org/file/hello-2.10.tar.gz/sha256/0ssi1…ndq1i
@end example

Offensichtlich funktionieren diese URLs nur mit solchen Dateien, die auch im
Store vorliegen; in anderen Fällen werden sie 404 („Nicht gefunden“)
zurückliefern.

@cindex Erstellungsprotokolle, Veröffentlichen
Erstellungsprotokolle sind unter @code{/log}-URLs abrufbar:

@example
http://example.org/log/gwspk…-guile-2.2.3
@end example

@noindent
Ist der @command{guix-daemon} so eingestellt, dass er Erstellungsprotokolle
komprimiert abspeichert, wie es voreingestellt ist (siehe @ref{Aufruf des guix-daemon}), liefern @code{/log}-URLs das unveränderte komprimierte
Protokoll, mit einer entsprechenden @code{Content-Type}- und/oder
@code{Content-Encoding}-Kopfzeile. Wir empfehlen dabei, dass Sie den
@command{guix-daemon} mit @option{--log-compression=gzip} ausführen, weil
Web-Browser dieses Format automatisch dekomprimieren können, was bei
Bzip2-Kompression nicht der Fall ist.

Folgende Befehlszeilenoptionen stehen zur Verfügung:

@table @code
@item --port=@var{Port}
@itemx -p @var{Port}
Auf HTTP-Anfragen auf diesem @var{Port} lauschen.

@item --listen=@var{Host}
Auf der Netzwerkschnittstelle für den angegebenen @var{Host}, also der
angegebenen Rechneradresse, lauschen. Vorgegeben ist, Verbindungen mit jeder
Schnittstelle zu akzeptieren.

@item --user=@var{Benutzer}
@itemx -u @var{Benutzer}
So früh wie möglich alle über die Berechtigungen des @var{Benutzer}s
hinausgehenden Berechtigungen ablegen@tie{}– d.h.@: sobald der Server-Socket
geöffnet und der Signierschlüssel gelesen wurde.

@item --compression[=@var{Methode}[:@var{Stufe}]]
@itemx -C [@var{Methode}[:@var{Stufe}]]
Daten auf der angegebenen Kompressions-@var{Stufe} mit der angegebenen
@var{Methode} komprimieren. Als @var{Methode} kann entweder @code{lzip},
@code{zstd} oder @code{gzip} angegeben werden. Wird keine @var{Methode}
angegeben, wird @code{gzip} benutzt.

Daten auf der angegebenen Kompressions-@var{Stufe} komprimieren. Wird als
@var{Stufe} null angegeben, wird Kompression deaktiviert. Der Bereich von 1
bis 9 entspricht unterschiedlichen Kompressionsstufen: 1 ist am schnellsten,
während 9 am besten komprimiert (aber den Prozessor mehr auslastet). Der
Vorgabewert ist 3.

Normalerweise ist die Kompression mit @code{lzip} wesentlich besser als bei
@code{gzip}, dafür wird der Prozessor geringfügig stärker ausgelastet; siehe
@uref{https://nongnu.org/lzip/lzip_benchmark.html,Vergleichswerte auf dem
Webauftritt von lzip}. @code{lzip} erreicht jedoch nur einen niedrigen
Durchsatz bei der Dekompression (in der Größenordnung von 50@tie{}MiB/s auf
moderner Hardware), was einen Engpass beim Herunterladen über schnelle
Netzwerkverbindungen darstellen kann.

Das Kompressionsverhältnis von @code{zstd} liegt zwischen dem von
@code{lzip} und dem von @code{gzip}; sein größter Vorteil ist eine
@uref{https://facebook.github.io/zstd/,hohe Geschwindigkeit bei der
Dekompression}.

Wenn @option{--cache} nicht übergeben wird, werden Daten dynamisch immer
erst dann komprimiert, wenn sie abgeschickt werden; komprimierte Datenströme
landen in keinem Zwischenspeicher. Um also die Auslastung der Maschine, auf
der @command{guix publish} läuft, zu reduzieren, kann es eine gute Idee
sein, eine niedrige Kompressionsstufe zu wählen, @command{guix publish}
einen Proxy mit Zwischenspeicher (einen „Caching Proxy“) voranzuschalten,
oder @option{--cache} zu benutzen. @option{--cache} zu benutzen, hat den
Vorteil, dass @command{guix publish} damit eine
@code{Content-Length}-HTTP-Kopfzeile seinen Antworten beifügen kann.

Wenn diese Befehlszeilenoption mehrfach angegeben wird, wird jedes Substitut
mit allen ausgewählten Methoden komprimiert und jede davon wird bei Anfragen
mitgeteilt. Das ist nützlich, weil Benutzer, bei denen nicht alle
Kompressionsmethoden unterstützt werden, die passende wählen können.

@item --cache=@var{Verzeichnis}
@itemx -c @var{Verzeichnis}
Archive und Metadaten (@code{.narinfo}-URLs) in das @var{Verzeichnis}
zwischenspeichern und nur solche Archive versenden, die im Zwischenspeicher
vorliegen.

Wird diese Befehlszeilenoption weggelassen, dann werden Archive und
Metadaten „dynamisch“ erst auf eine Anfrage hin erzeugt. Dadurch kann die
verfügbare Bandbreite reduziert werden, besonders wenn Kompression aktiviert
ist, weil die Operation dann durch die Prozessorleistung beschränkt sein
kann. Noch ein Nachteil des voreingestellten Modus ist, dass die Länge der
Archive nicht im Voraus bekannt ist, @command{guix publish} also keine
@code{Content-Length}-HTTP-Kopfzeile an seine Antworten anfügt, wodurch
Clients nicht wissen können, welche Datenmenge noch heruntergeladen werden
muss.

Im Gegensatz dazu löst, wenn @option{--cache} benutzt wird, die erste
Anfrage nach einem Store-Objekt (über dessen @code{.narinfo}-URL) den Start
eines Hintergrundprozesses aus, der das Archiv in den Zwischenspeicher
einlagert (auf Englisch sagen wir „bake the archive“), d.h.@: seine
@code{.narinfo} wird berechnet und das Archiv, falls nötig,
komprimiert. Sobald das Archiv im @var{Verzeichnis} zwischengespeichert
wurde, werden nachfolgende Anfragen erfolgreich sein und direkt aus dem
Zwischenspeicher bedient, der garantiert, dass Clients optimale Bandbreite
genießen.

Die erste Anfrage nach einer @code{.narinfo} wird trotzdem 200
zurückliefern, wenn das angefragte Store-Objekt „klein genug“ ist, also
kleiner als der Schwellwert für die Zwischenspeicherumgehung, siehe
@option{--cache-bypass-threshold} unten. So müssen Clients nicht darauf
warten, dass das Archiv eingelagert wurde. Bei größeren Store-Objekten
liefert die erste @code{.narinfo}-Anfrage 404 zurück, was bedeutet, dass
Clients warten müssen, bis das Archiv eingelagert wurde.

Der Prozess zum Einlagern wird durch Worker-Threads umgesetzt. Der Vorgabe
entsprechend wird dazu pro Prozessorkern ein Thread erzeugt, aber dieses
Verhalten kann angepasst werden. Siehe @option{--workers} weiter unten.

Wird @option{--ttl} verwendet, werden zwischengespeicherte Einträge
automatisch gelöscht, sobald die dabei angegebene Zeit abgelaufen ist.

@item --workers=@var{N}
Wird @option{--cache} benutzt, wird die Reservierung von @var{N}
Worker-Threads angefragt, um Archive einzulagern.

@item --ttl=@var{ttl}
@code{Cache-Control}-HTTP-Kopfzeilen erzeugen, die eine Time-to-live (TTL)
von @var{ttl} signalisieren. Für @var{ttl} muss eine Dauer (mit dem
Anfangsbuchstaben der Maßeinheit der Dauer im Englischen) angegeben werden:
@code{5d} bedeutet 5 Tage, @code{1m} bedeutet 1 Monat und so weiter.

Das ermöglicht es Guix, Substitutinformationen @var{ttl} lang
zwischenzuspeichern. Beachten Sie allerdings, dass @code{guix publish}
selbst @emph{nicht} garantiert, dass die davon angebotenen Store-Objekte so
lange verfügbar bleiben, wie es die @var{ttl} vorsieht.

Des Weiteren können bei Nutzung von @option{--cache} die
zwischengespeicherten Einträge gelöscht werden, wenn auf sie @var{ttl} lang
nicht zugegriffen wurde und kein ihnen entsprechendes Objekt mehr im Store
existiert.

@item --negative-ttl=@var{ttl}
Eben solche @code{Cache-Control}-HTTP-Kopfzeilen für erfolglose (negative)
Suchen erzeugen, um eine Time-to-live (TTL) zu signalisieren, wenn
Store-Objekte fehlen und mit dem HTTP-Status-Code 404 geantwortet wird. Nach
Vorgabe wird für negative Antworten @emph{keine} TTL signalisiert.

Dieser Parameter kann helfen, die Last auf dem Server und die Verzögerung zu
regulieren, weil folgsame Clients angewiesen werden, für diese Zeit geduldig
zu warten, wenn ein Store-Objekt fehlt.

@item --cache-bypass-threshold=@var{Größe}
Wird dies in Verbindung mit @option{--cache} angegeben, werden Store-Objekte
kleiner als die @var{Größe} sofort verfügbar sein, obwohl sie noch nicht in
den Zwischenspeicher eingelagert wurden. Die @var{Größe} gibt die Größe in
Bytes an oder ist mit einem Suffix @code{M} für Megabyte und so weiter
versehen. Die Vorgabe ist @code{10M}.

Durch diese „Zwischenspeicherumgehung“ lässt sich die Verzögerung bis zur
Veröffentlichung an Clients reduzieren, auf Kosten zusätzlicher
Ein-/Ausgaben und CPU-Auslastung für den Server. Je nachdem, welche
Zugriffsmuster Clients haben, werden diese Store-Objekte vielleicht mehrfach
zur Einlagerung vorbereitet, ehe eine Kopie davon im Zwischenspeicher
verfügbar wird.

Wenn ein Anbieter nur wenige Nutzer unterhält, kann es helfen, den
Schwellwert zu erhöhen, oder auch wenn garantiert werden soll, dass es auch
für wenig beliebte Store-Objekte Substitute gibt.

@item --nar-path=@var{Pfad}
Den @var{Pfad} als Präfix für die URLs von „nar“-Dateien benutzen (siehe
@ref{Aufruf von guix archive, Normalisierte Archive}).

Vorgegeben ist, dass Nars unter einer URL mit
@code{/nar/gzip/…-coreutils-8.25} angeboten werden. Mit dieser
Befehlszeilenoption können Sie den @code{/nar}-Teil durch den angegebenen
@var{Pfad} ersetzen.

@item --public-key=@var{Datei}
@itemx --private-key=@var{Datei}
Die angegebenen @var{Datei}en als das Paar aus öffentlichem und privatem
Schlüssel zum Signieren veröffentlichter Store-Objekte benutzen.

Die Dateien müssen demselben Schlüsselpaar entsprechen (der private
Schlüssel wird zum Signieren benutzt, der öffentliche Schlüssel wird
lediglich in den Metadaten der Signatur aufgeführt). Die Dateien müssen
Schlüssel im kanonischen („canonical“) S-Ausdruck-Format enthalten, wie es
von @command{guix archive --generate-key} erzeugt wird (siehe @ref{Aufruf von guix archive}). Vorgegeben ist, dass @file{/etc/guix/signing-key.pub} und
@file{/etc/guix/signing-key.sec} benutzt werden.

@item --repl[=@var{Port}]
@itemx -r [@var{Port}]
Einen Guile-REPL-Server (siehe @ref{REPL Servers,,, guile, Referenzhandbuch
zu GNU Guile}) auf diesem @var{Port} starten (37146 ist
voreingestellt). Dies kann zur Fehlersuche auf einem laufenden
„@command{guix publish}“-Server benutzt werden.
@end table

@command{guix publish} auf einem „Guix System“-System zu aktivieren ist ein
Einzeiler: Instanziieren Sie einfach einen
@code{guix-publish-service-type}-Dienst im @code{services}-Feld Ihres
@code{operating-system}-Objekts zur Betriebssystemdeklaration (siehe
@ref{guix-publish-service-type, @code{guix-publish-service-type}}).

Falls Sie Guix aber auf einer „Fremddistribution“ laufen lassen, folgen Sie
folgenden Anweisungen:

@itemize
@item
Wenn Ihre Wirtsdistribution systemd als „init“-System benutzt:

@example
# ln -s ~root/.guix-profile/lib/systemd/system/guix-publish.service \
        /etc/systemd/system/
# systemctl start guix-publish && systemctl enable guix-publish
@end example

@item
Wenn Ihre Wirts-Distribution als „init“-System Upstart verwendet:

@example
# ln -s ~root/.guix-profile/lib/upstart/system/guix-publish.conf /etc/init/
# start guix-publish
@end example

@item
Verfahren Sie andernfalls auf die gleiche Art für das „init“-System, das
Ihre Distribution verwendet.
@end itemize

@node Aufruf von guix challenge
@section @command{guix challenge} aufrufen

@cindex Reproduzierbare Erstellungen
@cindex verifizierbare Erstellungen
@cindex @command{guix challenge}
@cindex Anfechten
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 @command{guix
challenge} zu beantworten.

Die erste Frage ist offensichtlich wichtig: Bevor man einen Substitutserver
benutzt (siehe @ref{Substitute}), @emph{verifiziert} man besser, dass er
die richtigen Binärdateien liefert, d.h.@: man @emph{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 @file{/gnu/store}-Dateinamen auftauchende
Hash-Prüfsumme der Hash aller Eingaben des Prozesses ist, mit dem die Datei
oder das Verzeichnis erstellt wurde@tie{}– Compiler, Bibliotheken,
Erstellungsskripts und so weiter (siehe @ref{Einführung}). Wenn wir von
deterministischen Erstellungen ausgehen, sollte ein Store-Dateiname also auf
genau eine Erstellungsausgabe abgebildet werden. Mit @command{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:

@smallexample
$ guix challenge \
  --substitute-urls="https://@value{SUBSTITUTE-SERVER-1} https://guix.example.org" \
  openssl git pius coreutils grep
Liste der Substitute von „https://@value{SUBSTITUTE-SERVER-1}“ 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://@value{SUBSTITUTE-SERVER-1}/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://@value{SUBSTITUTE-SERVER-1}/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://@value{SUBSTITUTE-SERVER-1}/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

…

5 Store-Objekte wurden analysiert:
  — 2 (40.0%) waren identisch
  — 3 (60.0%) unterscheiden sich
  — 0 (0.0%) blieben ergebnislos
@end smallexample

@noindent
In diesem Beispiel werden mit @command{guix challenge} alle Substitutserver
zu jedem der fünf auf der Befehlszeile angegebenen Pakete
angefragt. Diejenigen Store-Objekte, bei denen die Server ein anderes
Ergebnis berechnet haben als die lokale Erstellung (falls vorhanden) oder wo
die Server untereinander zu verschiedenen Ergebnissen gekommen sind, werden
gemeldet. Daran, dass eine @samp{lokale Prüfsumme} dabeisteht, erkennen Sie,
dass für die Pakete eine lokale Erstellung vorgelegen hat.

@cindex Nichtdeterminismus, in Paketerstellungen
Nehmen wir zum Beispiel an, @code{guix.example.org} gibt uns immer eine
verschiedene Antwort, aber @code{@value{SUBSTITUTE-SERVER-1}} stimmt mit
lokalen Erstellungen überein, @emph{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 @ref{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
@uref{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:

@example
guix challenge git \
  --diff=diffoscope \
  --substitute-urls="https://@value{SUBSTITUTE-SERVER-1} https://guix.example.org"
@end example

Dadurch wird @command{diffoscope} automatisch aufgerufen, um detaillierte
Informationen über sich unterscheidende Dateien anzuzeigen.

Alternativ können wir so etwas machen (siehe @ref{Aufruf von guix archive}):

@example
$ wget -q -O - https://@value{SUBSTITUTE-SERVER-1}/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
@end example

Dieser Befehl zeigt die Unterschiede zwischen den Dateien, die sich aus der
lokalen Erstellung ergeben, und den Dateien, die sich aus der Erstellung auf
@code{@value{SUBSTITUTE-SERVER-1}} ergeben (siehe @ref{Overview, Dateien
vergleichen und zusammenführen,, diffutils, Comparing and Merging
Files}). Der Befehl @command{diff} funktioniert großartig für
Textdateien. Wenn sich Binärdateien unterscheiden, ist
@uref{https://diffoscope.org/, Diffoscope} 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 @command{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
@code{@value{SUBSTITUTE-SERVER-1}} und andere Substitutserver dasselbe
Erstellungsergebnis bekommen, das Sie bekommen haben. Das geht so:

@example
guix challenge @var{Paket}
@end example

Die allgemeine Syntax lautet:

@example
guix challenge @var{Optionen} @var{Argumente}…
@end example

@noindent
wobei jedes der @var{Argumente} eine Paketspezifikation wie
@code{guile@@2.0} oder @code{glibc:debug} sein muss oder alternativ der Name
einer Datei im Store, wie er zum Beispiel durch @command{guix build} oder
@command{guix gc --list-live} mitgeteilt wird.

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:

@table @code

@item --substitute-urls=@var{URLs}
Die @var{URLs} als durch Leerraumzeichen getrennte Liste von
Substitut-Quell-URLs benutzen. mit denen verglichen wird.

@item --diff=@var{Modus}
Wenn sich Dateien unterscheiden, diese Unterschiede entsprechend dem
@var{Modus} anzeigen. Dieser kann einer der folgenden sein:

@table @asis
@item @code{simple} (die Vorgabe)
Zeige die Liste sich unterscheidender Dateien.

@item @code{diffoscope}
@itemx @var{Befehl}
@uref{https://diffoscope.org/, Diffoscope} aufrufen und ihm zwei
Verzeichnisse mit verschiedenem Inhalt übergeben.

Wenn der @var{Befehl} ein absoluter Dateiname ist, wird der @var{Befehl}
anstelle von Diffoscope ausgeführt.

@item @code{none}
Keine näheren Details zu Unterschieden anzeigen.
@end table

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

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

@end table

@node Aufruf von guix copy
@section @command{guix copy} aufrufen

@cindex @command{guix copy}
@cindex Kopieren, von Store-Objekten, über SSH
@cindex SSH, Kopieren von Store-Objekten
@cindex Store-Objekte zwischen Maschinen teilen
@cindex Übertragen von Store-Objekten zwischen Maschinen
Der Befehl @command{guix copy} kopiert Objekte aus dem Store einer Maschine
in den Store einer anderen Maschine mittels einer Secure-Shell-Verbindung
(kurz SSH-Verbindung)@footnote{Dieser Befehl steht nur dann zur Verfügung,
wenn Guile-SSH gefunden werden kann. Siehe @ref{Voraussetzungen} für
Details.}. Zum Beispiel kopiert der folgende Befehl das Paket
@code{coreutils}, das Profil des Benutzers und all deren Abhängigkeiten auf
den anderen @var{Rechner}, dazu meldet sich Guix als @var{Benutzer} an:

@example
guix copy --to=@var{Benutzer}@@@var{Rechner} \
          coreutils $(readlink -f ~/.guix-profile)
@end example

Wenn manche der zu kopierenden Objekte schon auf dem anderen @var{Rechner}
vorliegen, werden sie tatsächlich @emph{nicht} übertragen.

Der folgende Befehl bezieht @code{libreoffice} und @code{gimp} von dem
@var{Rechner}, vorausgesetzt sie sind dort verfügbar:

@example
guix copy --from=@var{host} libreoffice gimp
@end example

Die SSH-Verbindung wird mit dem Guile-SSH-Client hergestellt, der mit
OpenSSH kompatibel ist: Er berücksichtigt @file{~/.ssh/known_hosts} und
@file{~/.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 @file{/etc/guix/acl} eingetragen sein, damit Ihr Daemon sie
akzeptiert. Siehe @ref{Aufruf von guix archive} für mehr Informationen über
die Authentifizierung von Store-Objekten.

Die allgemeine Syntax lautet:

@example
guix copy [--to=@var{Spezifikation}|--from=@var{Spezifikation}] @var{Objekte}…
@end example

Sie müssen immer eine der folgenden Befehlszeilenoptionen angeben:

@table @code
@item --to=@var{Spezifikation}
@itemx --from=@var{Spezifikation}
Gibt den Rechner (den „Host“) an, an den oder von dem gesendet
bzw. empfangen wird. Die @var{Spezifikation} muss eine SSH-Spezifikation
sein wie @code{example.org}, @code{charlie@@example.org} oder
@code{charlie@@example.org:2222}.
@end table

Die @var{Objekte} können entweder Paketnamen wie @code{gimp} oder
Store-Objekte wie @file{/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 @option{--dry-run} wurde angegeben
wurde. Alle gemeinsamen Erstellungsoptionen werden unterstützt (siehe
@ref{Gemeinsame Erstellungsoptionen}).


@node Aufruf von guix container
@section @command{guix container} aufrufen
@cindex container
@cindex @command{guix container}
@quotation Anmerkung
Dieses Werkzeug ist noch experimentell, Stand Version @value{VERSION}. Die
Schnittstelle wird sich in Zukunft grundlegend verändern.
@end quotation

Der Zweck von @command{guix container} ist, in einer isolierten Umgebung
(gemeinhin als „Container“ bezeichnet) laufende Prozesse zu manipulieren,
die typischerweise durch die Befehle @command{guix shell} (siehe
@ref{Aufruf von guix shell}) und @command{guix system container} (siehe
@ref{Aufruf von guix system}) erzeugt werden.

Die allgemeine Syntax lautet:

@example
guix container @var{Aktion} @var{Optionen}…
@end example

Mit @var{Aktion} wird die Operation angegeben, die in der isolierten
Umgebung durchgeführt werden soll, und mit @var{Optionen} werden die
kontextabhängigen Argumente an die Aktion angegeben.

Folgende Aktionen sind verfügbar:

@table @code
@item exec
Führt einen Befehl im Kontext der laufenden isolierten Umgebung aus.

Die Syntax ist:

@example
guix container exec @var{PID} @var{Programm} @var{Argumente}…
@end example

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

Der folgende Befehl startet eine interaktive Login-Shell innerhalb einer
isolierten Guix-Systemumgebung, gestartet durch @command{guix system
container}, dessen Prozess-ID 9001 ist:

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

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

@end table

@node Aufruf von guix weather
@section @command{guix weather} aufrufen

@cindex @command{guix weather}
Manchmal werden Sie schlecht gelaunt sein, weil es zu wenige Substitute gibt
und die Pakete bei Ihnen selbst erstellt werden müssen (siehe
@ref{Substitute}). Der Befehl @command{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
@command{guix publish} benutzen (siehe @ref{Aufruf von guix publish}). Auch
kann es passieren, dass Substitute durchaus verfügbar sind, aber sie auf
Ihrem System nicht autorisiert wurden. Derartige Fehler wird @command{guix
weather} Ihnen mitteilen, damit Sie die Autorisierung erteilen können, wenn
Sie dies wünschen (siehe @ref{Substitute von anderen Servern holen}).

@cindex Statistik, für Substitute
@cindex Verfügbarkeit von Substituten
@cindex Substitutverfügbarkeit
@cindex Wetter, Substitutverfügbarkeit
Hier ist ein Beispiel für einen Aufruf davon:

@example
$ 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
@end example

@cindex Kontinuierliche Integration, Statistik
Wie Sie sehen können, wird der Anteil unter allen Paketen angezeigt, für die
auf dem Server Substitute verfügbar sind@tie{}– 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 @command{guix weather}, wenn es mit der
Befehlszeilenoption @option{--coverage} aufgerufen wird, „wichtige“
Paketsubstitute, die auf dem Server fehlen, auflisten (siehe unten).

Dazu werden mit @command{guix weather} Anfragen über HTTP(S) zu Metadaten
(@dfn{Narinfos}) für alle relevanten Store-Objekte gestellt. Wie
@command{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:

@example
guix weather @var{Optionen}…@: [@var{Pakete}…]
@end example

Wenn keine @var{Pakete} angegeben werden, prüft @command{guix weather} für
@emph{alle} Pakete bzw.@: für die Pakete mit @option{--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
@option{--system} auf bestimmte Systemtypen einzuschränken. Der Rückgabewert
von @command{guix weather} ist @emph{nicht} null, wenn weniger als 100%
Substitute verfügbar sind.

Die verfügbaren Befehlszeilenoptionen folgen.

@table @code
@item --substitute-urls=@var{URLs}
@var{URLs} ist eine leerzeichengetrennte Liste anzufragender
Substitutserver-URLs. Wird diese Befehlszeilenoption weggelassen, werden die
mit der Befehlszeilenoption @option{--substitute-urls} von
@command{guix-daemon} übergebenen URLs benutzt. Wenn auch diesem keine URLs
gegeben wurden, wird die vorgegebene Menge an Substitutservern angefragt.

@item --system=@var{System}
@itemx -s @var{System}
Substitute für das @var{System} anfragen@tie{}– z.B.@: für
@code{aarch64-linux}. Diese Befehlszeilenoption kann mehrmals angegeben
werden, wodurch @command{guix weather} die Substitute für mehrere
Systemtypen anfragt.

@item --manifest=@var{Datei}
Anstatt die Substitute für alle Pakete anzufragen, werden nur die in der
@var{Datei} angegebenen Pakete erfragt. Die @var{Datei} muss ein
@dfn{Manifest} enthalten, wie bei der Befehlszeilenoption @code{-m} von
@command{guix package} (siehe @ref{Aufruf von guix package}).

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

@item --expression=@var{Ausdruck}
@itemx -e @var{Ausdruck}
Als Paket benutzen, wozu der @var{Ausdruck} ausgewertet wird.

Diese Option wird meist benutzt, um versteckte Pakete anzugeben (engl.@:
„hidden packages“). Das sind Pakete, die nicht wie andere referenziert
werden können. Um sie trotzdem zu benutzen, schreiben Sie einen Ausdruck:

@example
guix weather -e '(@@@@ (gnu packages rust) rust-bootstrap)'
@end example

Diese Befehlszeilenoption können Sie mehrmals angegeben.

@item --coverage[=@var{Anzahl}]
@itemx -c [@var{Anzahl}]
Einen Bericht über die Substitutabdeckung für Pakete ausgeben, d.h.@: Pakete
mit mindestens @var{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 @var{b} von @var{a} abhängt und
Substitute für @var{a} fehlen, wird nur @var{a} aufgeführt, obwohl dann in
der Regel auch die Substitute für @var{b} fehlen. Das Ergebnis sieht so aus:

@example
$ guix weather --substitute-urls=@value{SUBSTITUTE-URLS} -c 10
8.983 Paketableitungen für x86_64-linux berechnen …
Nach 9.343 Store-Objekten von @value{SUBSTITUTE-URLS} suchen …
Liste der Substitute von „@value{SUBSTITUTE-URLS}“ wird aktualisiert …@: 100.0%
@value{SUBSTITUTE-URLS}
  64.7% Substitute verfügbar (6.047 von 9.343)
…
2502 Pakete fehlen auf „@value{SUBSTITUTE-URLS}“ 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
    …
@end example

Was man hier in diesem Beispiel sehen kann, ist, dass es für
@code{kcoreaddons} und vermutlich die 58 Pakete, die davon abhängen, auf
@code{@value{SUBSTITUTE-SERVER-1}} keine Substitute gibt; Gleiches gilt für
@code{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.

@item --display-missing
Eine Liste derjenigen Store-Objekte anzeigen, für die @emph{keine}
Substitute verfügbar sind.
@end table

@node Aufruf von guix processes
@section @command{guix processes} aufrufen

@cindex @command{guix processes}
Der Befehl @command{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@footnote{Entfernte Sitzungen, wenn
@command{guix-daemon} mit @option{--listen} unter Angabe eines TCP-Endpunkts
gestartet wurde, werden @emph{nicht} aufgelistet.}. Hier ist ein Beispiel
für die davon gelieferten Informationen:

@example
$ sudo guix processes
SessionPID: 19002
ClientPID: 19090
ClientCommand: guix shell 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
@end example

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

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

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

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

Weitere Befehlszeilenoptionen folgen.

@table @code
@item --format=@var{Format}
@itemx -f @var{Format}
Die Ausgabe im angegebenen @var{Format} generieren, was eines der Folgenden
sein muss:

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

@item normalized
Normalisiert die ausgegebenen Datensätze nach Typ (als „Record Sets“, siehe
@ref{Record Sets,,, recutils, Handbuch von GNU recutils}). 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 @code{ChildProcess}) mit der PID der ihn
erzeugt habenden Sitzung (Typ @code{Session}) angezeigt, vorausgesetzt die
Sitzung wurde mit @command{guix build} gestartet.

@example
$ 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
@end example
@end table
@end table

@node Fremde Architekturen
@chapter Fremde Architekturen

Es ist möglich, für Rechner mit einer anderen CPU-Architektur als der
eigenen Pakete zu erstellen (siehe @ref{Aufruf von guix package}), Bündel zu
erstellen (siehe @ref{Aufruf von guix pack}) oder auch vollständige Systeme
aufzusetzen (siehe @ref{Aufruf von guix system}).

GNU Guix unterstützt zwei unterschiedliche Mechanismen, um Software für
fremde Architekturen bereitzustellen:

@enumerate
@item
Das traditionelle Vorgehen mit
@uref{https://de.wikipedia.org/wiki/Cross-Compiler,Cross-Kompilierung}.
@item
Nativ zu erstellen. Dieser Mechanismus bedeutet, dass zum Erstellen für das
fremde Zielsystem der Befehlssatz des Zielrechners ausgeführt
wird. Gängigerweise setzt man hierzu einen Emulator ein wie das
QEMU-Programm.
@end enumerate

@menu
* Cross-Kompilieren::        Cross-Kompilieren für eine andere Architektur.
* Native Erstellungen::      Trotz anderer Architektur nativ erstellen.
@end menu

@node Cross-Kompilieren
@section Cross-Kompilieren

@cindex fremde Architekturen
Für die Befehle, die Cross-Kompilierung unterstützen, werden die
Befehlszeilenoptionen @option{--list-targets} und @option{--target}
angeboten.

Die Befehlszeilenoption @option{--list-targets} listet alle unterstützten
Zielsysteme auf, die Sie als Argument für @option{--target} angeben können.

@example
$ guix build --list-targets
Die verfügbaren Zielsysteme sind:

   - aarch64-linux-gnu
   - arm-linux-gnueabihf
   - avr
   - i586-pc-gnu
   - i686-linux-gnu
   - i686-w64-mingw32
   - loongarch64-linux-gnu
   - mips64el-linux-gnu
   - or1k-elf
   - powerpc-linux-gnu
   - powerpc64le-linux-gnu
   - riscv64-linux-gnu
   - x86_64-linux-gnu
   - x86_64-linux-gnux32
   - x86_64-w64-mingw32
   - xtensa-ath9k-elf
@end example

Zielsysteme werden als GNU-Tripel angegeben (siehe @ref{Specifying Target
Triplets, GNU-Tripel für configure,, autoconf, Autoconf}).

Diese Tripel werden an GCC und die anderen benutzten Compiler übergeben, die
an der Erstellung eines Pakets, Systemabbilds oder sonstigen
GNU-Guix-Ausgabe beteiligt sein können.

@example
$ guix build --target=aarch64-linux-gnu hello
/gnu/store/9926by9qrxa91ijkhw9ndgwp4bn24g9h-hello-2.12

$ file /gnu/store/9926by9qrxa91ijkhw9ndgwp4bn24g9h-hello-2.12/bin/hello
/gnu/store/9926by9qrxa91ijkhw9ndgwp4bn24g9h-hello-2.12/bin/hello: ELF
64-bit LSB executable, ARM aarch64 …
@end example

Der große Vorteil beim Cross-Kompilieren liegt darin, dass keine
Leistungseinbußen beim Kompilieren zu befürchten sind, im Gegensatz zur
Emulation mit QEMU. Jedoch besteht ein höheres Risiko, dass manche Pakete
nicht erfolgreich cross-kompiliert werden können, weil sich weniger Leute
mit diesem Mechanismus lange befassen.

@node Native Erstellungen
@section Native Erstellungen

Die Befehle, die es erlauben, mit einem gewählten System Erstellungen
durchzuführen, haben die Befehlszeilenoptionen @option{--list-systems} und
@option{--system}.

Die Befehlszeilenoption @option{--list-systems} listet alle unterstützten
Systeme auf, mit denen erstellt werden kann, wenn man sie als Argument für
@option{--system} angibt.

@example
$ guix build --list-systems
Die verfügbaren Systeme sind:

   - x86_64-linux [current]
   - aarch64-linux
   - armhf-linux
   - i586-gnu
   - i686-linux
   - mips64el-linux
   - powerpc-linux
   - powerpc64le-linux
   - riscv64-linux

$ guix build --system=i686-linux hello
/gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12

$ file /gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12/bin/hello
/gnu/store/cc0km35s8x2z4pmwkrqqjx46i8b1i3gm-hello-2.12/bin/hello: ELF
32-bit LSB executable, Intel 80386 @dots{}
@end example

Im obigen Beispiel ist das aktuelle System @var{x86_64-linux}. Wir erstellen
das @var{hello}-Paket aber für das System @var{i686-linux}.

Das geht, weil der @var{i686}-Befehlssatz der CPU eine Teilmenge des
@var{x86_64}-Befehlssatzes ist, also Binärdateien für @var{i686} auf einem
@var{x86_64}-System laufen können.

Wenn wir aber im Rahmen desselben Beispiels das System @var{aarch64-linux}
wählen und @command{guix build --system=aarch64-linux hello} auch wirklich
Ableitungen erstellen muss, klappt das vielleicht erst nach einem weiteren
Schritt.

Denn Binärdateien mit dem Zielsystem @var{aarch64-linux} können auf einem
@var{x86_64-linux}-System erst mal @emph{nicht} ausgeführt werden. Deshalb
wird nach einer Emulationsschicht gesucht. Der GNU-Guix-Daemon kann den
@uref{https://en.wikipedia.org/wiki/Binfmt_misc,binfmt_misc-Mechanismus} des
Linux-Kernels dafür einsetzen. Zusammengefasst würde der Linux-Kernel die
Ausführung einer Binärdatei für eine fremde Plattform wie
@var{aarch64-linux} auslagern auf ein Programm der Anwendungsebene („User
Space“); normalerweise lagert man so auf einen Emulator aus.

Es gibt einen Dienst, der QEMU als Hintergrundprogramm für den
@code{binfmt_misc}-Mechanismus registriert (siehe @ref{Virtualisierungsdienste, @code{qemu-binfmt-service-type}}). Auf Debian-basierten
Fremddistributionen ist deren Alternative das Paket @code{qemu-user-static}.

Wenn der @code{binfmt_misc}-Mechanismus falsch eingerichtet ist, schlägt die
Erstellung folgendermaßen fehl:

@example
$ guix build --system=armhf-linux hello --check
…
@ unsupported-platform /gnu/store/jjn969pijv7hff62025yxpfmc8zy0aq0-hello-2.12.drv aarch64-linux
while setting up the build environment: a `aarch64-linux' is required to
build `/gnu/store/jjn969pijv7hff62025yxpfmc8zy0aq0-hello-2.12.drv', but
I am a `x86_64-linux'…
@end example

Aber wenn der @code{binfmt_misc}-Mechanismus richtig mit QEMU verbunden
wurde, kann man diese Meldung erwarten:

@example
$ guix build --system=armhf-linux hello --check
/gnu/store/13xz4nghg39wpymivlwghy08yzj97hlj-hello-2.12
@end example

Der größte Vorteil, den man davon hat, nativ zu erstellen statt zu
cross-kompilieren, ist, dass die Erstellung bei mehr Paketen klappt. Doch es
hat seinen Preis: Mit QEMU als Hintergrundprogramm zu kompilieren ist
@emph{viel langsamer} als Cross-Kompilierung, weil jede Anweisung emuliert
werden muss.

Die Verfügbarkeit von Substituten für die Architektur, die man bei
@code{--system} angibt, lindert dieses Problem. Eine andere Möglichkeit ist,
GNU Guix auf einer Maschine zu installieren, deren CPU den Befehlssatz
tatsächlich unterstützt, für den man erstellen möchte. Diese Maschine kann
man über den Mechanismus zum Auslagern von Erstellungen einbeziehen (siehe
@ref{Auslagern des Daemons einrichten}).

@node Systemkonfiguration
@chapter Systemkonfiguration

@cindex 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 @dfn{Systemkonfiguration}
kann @dfn{instanziiert}, also umgesetzt, werden.

@c Yes, we're talking of Puppet, Chef, & co. here.  ↑
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 @ref{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
* Einstieg in Guix System::  Ihre ersten Schritte.
* 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.
* Swap-Speicher::            Arbeitsspeicher auslagern.
* Benutzerkonten::           Benutzerkonten festlegen.
* Tastaturbelegung::         Wie das System Tastendrücke interpretiert.
* Locales::                  Sprache und kulturelle Konventionen.
* Dienste::                  Systemdienste festlegen.
* Privilegierte Programme::  Mit erhöhten Berechtigungen 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.
@end menu

@node Einstieg in Guix System
@section Einstieg

@cindex Systemkonfigurationsdatei
@cindex Konfigurationsdatei, des Systems
Vermutlich lesen Sie diesen Abschnitt, nachdem Sie zuvor Guix System
installiert haben (siehe @ref{Systeminstallation}), und wollen wissen, wie
Sie jetzt weitermachen. Falls Sie bereits über Erfahrung mit der
Administration eines GNU/Linux-Systems verfügen, sei gesagt, dass Guix
System deutlich anders konfiguriert wird, als Sie es kennen: Systemdienste
installiert man @emph{nicht} mit @command{guix install}, man richtet Dienste
@emph{nicht} durch Änderungen an Dateien in @file{/etc} ein und neue
Benutzerkonten legt man @emph{nicht} mit einem Aufruf von @command{useradd}
an. Hier wird all dies stattdessen in einer @dfn{Systemkonfigurationsdatei}
niedergeschrieben.

Daher lautet der erste Schritt bei Guix System, die
@dfn{Systemkonfigurationsdatei} zu schreiben. Zum Glück wurde bereits eine
bei der Systeminstallation erzeugt; sie steht in @file{/etc/config.scm}.

@quotation Anmerkung
Den Ort, an dem Sie Ihre Systemkonfigurationsdatei aufbewahren, können Sie
frei wählen@tie{}– sie muss nicht @file{/etc/config.scm} heißen. Es ist eine
gute Idee, sie unter Versionskontrolle zu stellen, zum Beispiel in einem
@uref{https://git-scm.com/book/de/, Git-Repository}.
@end quotation

Die @emph{gesamte} Konfiguration des Systems@tie{}– Benutzerkonten,
Systemdienste, Zeitzone, Locale@tie{}– wird in dieser Datei stattfinden, die
dieser Schablone folgt:

@lisp
(use-modules (gnu))
(use-package-modules …)
(use-service-modules …)

(operating-system
  (host-name …)
  (timezone …)
  (locale …)
  (bootloader …)
  (file-systems …)
  (users …)
  (packages …)
  (services …))
@end lisp

Diese Konfigurationsdatei ist in Wirklichkeit ein Scheme-Programm. In den
ersten Zeilen werden Module importiert, die Variable zur Verfügung stellen,
die wir im Rest der Datei brauchen@tie{}– z.B.@: Pakete, Dienste und so
weiter. Die Form @code{operating-system} deklariert die Systemkonfiguration
als ein @dfn{Verbundsobjekt}, das aus einigen @dfn{Feldern} besteht. Siehe
@ref{Das Konfigurationssystem nutzen}, wenn Sie vollständige Beispiele sehen
möchten und mehr darüber erfahren möchten, was Sie eintragen.

Der zweite Schritt, wo Sie die Konfigurationsdatei haben, ist, sie zu
testen. Natürlich können Sie auch Ihr Glück herausfordern und diesen Schritt
überspringen@tie{}– es ist Ihre Sache! Um sie zu testen, übergeben Sie die
Konfigurationsdatei an @command{guix system vm} (dafür müssen Sie
@emph{nicht} root sein, ein normaler Benutzer ohne besondere Berechtigungen
reicht aus):

@example
guix system vm /etc/config.scm
@end example

@noindent
Dieser Befehl liefert den Namen eines Shell-Skripts, welches eine virtuelle
Maschine (VM) startet, auf der das System läuft, @emph{wie es in der
Konfigurationsdatei deklariert wurde}:

@example
/gnu/store/…-run-vm.sh
@end example

@noindent
In der VM können Sie sich als @code{root} ohne Passwort anmelden. So können
Sie leicht prüfen, ob Ihre Konfigurationsdatei fehlerfrei ist und sich so
verhält wie gewünscht, ohne dass Sie Ihr System der Gefahr aussetzen
müssen. Siehe @ref{Aufruf von guix system} für weitere Informationen.

@quotation Anmerkung
Beim Gebrauch von @command{guix system vm} werden hardwareabhängige Bereiche
wie die Dateisysteme und zugeordneten Geräte außen vor gelassen, weil sie in
der VM nicht sinnvoll getestet werden können. Andere Bereiche wie eine
statische Netzwerkkonfiguration (siehe @ref{Netzwerkeinrichtung,
@code{static-networking-service-type}}) bleiben zwar, funktionieren in der
VM aber nicht ohne Weiteres.
@end quotation

@cindex System instanziieren
@cindex Rekonfigurieren des Systems
Der dritte Schritt, sobald Sie mit Ihrer Konfiguration zufrieden sind, ist,
diese zu @dfn{instanziieren}@tie{}– sie also auf Ihrem System wirksam werden
zu lassen. Dazu geben Sie ein:

@example
sudo guix system reconfigure /etc/config.scm
@end example

@cindex Aktualisieren der Systemdienste
@cindex Systemdienste, Aktualisieren der
@noindent
Dies ist eine @dfn{transaktionelle} Operation: Entweder sie ist erfolgreich
und endet mit einem aktualisierten System, oder sie scheitert und es ändert
sich nichts. Beachten Sie, dass dadurch @emph{keine} Systemdienste neu
gestartet werden, die schon vorher liefen. Wenn Sie die laufenden Dienste
aktualisieren möchten, müssen Sie den Rechner neu starten oder sie selbst
neu starten. Um zum Beispiel den Daemon für Secure Shell (SSH) zu starten,
würden Sie dies ausführen:

@example
sudo herd restart sshd
@end example

@quotation Anmerkung
Systemdienste werden durch Shepherd verwaltet (siehe @ref{Jump Start,,,
shepherd, The GNU Shepherd Manual}). Mit dem Befehl @code{herd} können Sie
Dienste einsehen, starten und stoppen. Um den Status der Dienste zu sehen,
geben Sie ein:

@example
sudo herd status
@end example

Für genaue Informationen über einen bestimmten Dienst schreiben Sie seinen
Namen zum Befehl dazu:

@example
sudo herd status sshd
@end example

Siehe @ref{Dienste} für weitere Informationen.
@end quotation

@cindex Provenienz, des Systems
Das System speichert Informationen über seine @dfn{Provenienz}@tie{}– sprich
die Konfigurationsdatei und welche Kanäle verwendet wurden, um sie
aufzuspielen. So können Sie die Provenienz einsehen:

@example
guix system describe
@end example

Des Weiteren bleiben vorherige Systemgenerationen bei @command{guix system
reconfigure} erhalten und Sie können sich deren Liste anzeigen lassen:

@example
guix system list-generations
@end example

@noindent
@cindex Zurücksetzen, des Systems
Vor allem können Sie jederzeit das System auf eine vorherige Generation
@emph{zurücksetzen}, wenn etwas schiefgeht! Sobald Sie den Rechner neu
starten, wird Ihnen ein Untermenü im Bootloader auffallen, das mit „Old
system generations“ bezeichnet wird. Über dieses können Sie @emph{eine
ältere Generation Ihres Systems} starten, falls die neueste Generation auf
irgendeine Weise „kaputt“ ist oder auf andere Weise nicht Ihren Wünschen
entspricht. Sie können es auch dauerhaft zurücksetzen:

@example
sudo guix system roll-back
@end example

@noindent
Alternativ rufen Sie @command{guix system switch-generation} auf, um zu
einer bestimmten Generation zu wechseln.

Ab und zu werden Sie der alten Generationen überdrüssig und löschen die, die
Sie nicht mehr brauchen, damit der @dfn{Müllsammler} Platz auf der Platte
freiräumen kann (siehe @ref{Aufruf von guix gc}). Um zum Beispiel Generationen
zu löschen, die mehr als 4 Monate alt sind, geben Sie ein:

@example
sudo guix system delete-generations 4m
@end example

Von da an, wenn Sie etwas an der Konfiguration des Systems ändern möchten,
etwa ein Benutzerkonto hinzufügen oder Parameter eines Dienstes verändern
wollen, müssen Sie zunächst die Konfigurationsdatei bearbeiten und dann
rufen Sie @command{guix system reconfigure} auf wie oben gezeigt.
@cindex Aktualisieren, des Systems
Wenn Sie bewirken möchten, dass aktuellere Systemsoftware läuft, holen Sie
sich zunächst eine aktuelle Version von Guix und rekonfigurieren Ihr System
anschließend mit diesem neuen Guix:

@example
guix pull
sudo guix system reconfigure /etc/config.scm
@end example

@noindent
Wir empfehlen, diese Schritte regelmäßig zu wiederholen, damit Ihr System
die aktuellen Sicherheitsaktualisierungen benutzt (siehe @ref{Sicherheitsaktualisierungen}).

@c See <https://lists.gnu.org/archive/html/guix-devel/2019-01/msg00268.html>.
@quotation Anmerkung
@cindex sudo, Wirkung auf @command{guix pull}
Bei Nutzung von @command{sudo guix} wird der @command{guix}-Befehl des
aktiven Benutzers ausgeführt und @emph{nicht} der des Administratornutzers
„root“, weil @command{sudo} die Umgebungsvariable @env{PATH} unverändert
lässt.

Das macht hier einen Unterschied, weil @command{guix pull} den
@command{guix}-Befehl und Paketdefinitionen nur für dasjenige Benutzerkonto
aktualisiert, mit dem es ausgeführt wird. Würden Sie stattdessen in der
Login-Shell des „root“-Nutzers @command{guix system reconfigure} ausführen,
müssten Sie auch für ihn @command{guix pull} ausführen.
@end quotation

So viel dazu! Wenn Guix für Sie insgesamt neu ist, siehe @ref{Einstieg}. In den nächsten Abschnitten wird auf den Kern der Sache näher
eingegangen: die Systemkonfiguration.

@node Das Konfigurationssystem nutzen
@section Das Konfigurationssystem nutzen

Im letzten Abschnitt haben Sie kennengelernt, wie die Administration einer
Maschine mit Guix System abläuft (siehe @ref{Einstieg in Guix System}). Werfen wir jetzt einen genaueren Blick darauf, was in der
Systemkonfigurationsdatei steht.

Das Betriebssystem können Sie konfigurieren, indem Sie eine
@code{operating-system}-Deklaration in einer Datei speichern, die Sie dann
dem Befehl @command{guix system} übergeben (siehe @ref{Aufruf von guix system}), wie zuvor gezeigt. Eine einfache Konfiguration mit dem
vorgegebenen Linux-Libre als Kernel, mit einer initialen RAM-Disk und ein
paar Systemdiensten zusätzlich zu den vorgegebenen sieht so aus:

@findex operating-system
@lisp
@include os-config-bare-bones.texi
@end lisp

Die Konfiguration ist deklarativ. Es handelt sich um Programmcode, der in
der Sprache Scheme geschrieben ist. Der gesamte @code{(operating-system
…)}-Ausdruck legt ein @dfn{Verbundsobjekt} an mit mehreren
@dfn{Feldern}. Manche der Felder oben, wie etwa @code{host-name} und
@code{bootloader}, müssen angegeben werden. Andere sind optional, wie etwa
@code{packages} und @code{services}; werden sie nicht angegeben, nehmen sie
einen Vorgabewert an. Siehe @ref{„operating-system“-Referenz} für Details zu
allen verfügbaren Feldern.

Im Folgenden werden die Effekte von einigen der wichtigsten Feldern
erläutert.

@quotation Problembehandlung
Die Konfigurationsdatei ist ein Scheme-Programm und ein Fehler in Syntax
oder Semantik kann leicht passieren. Syntaxfehler wie eine falsch gesetzte
Klammer lassen sich oft finden, indem Sie die Datei umformatieren lassen:

@example
guix style -f config.scm
@end example

Im Kochbuch gibt es einen kurzen Abschnitt, wie man mit der Scheme-Sprache
anfängt. Dort werden die Grundlagen erklärt, was ihnen beim Schreiben Ihrer
Konfiguration helfen wird. Siehe @ref{Ein Schnellkurs in Scheme,,,
guix-cookbook.de, GNU-Guix-Kochbuch}.
@end quotation

@unnumberedsubsec Bootloader

@cindex Legacy-Boot, auf Intel-Maschinen
@cindex BIOS-Boot, auf Intel-Maschinen
@cindex UEFI-Boot
@cindex EFI-Boot
Das @code{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
@dfn{Unified Extensible Firmware Interface} (UEFI) zum Booten. In diesem
Fall sollte das @code{bootloader}-Feld in etwa so aussehen:

@lisp
(bootloader-configuration
  (bootloader grub-efi-bootloader)
  (targets '("/boot/efi")))
@end lisp

Siehe den Abschnitt @ref{Bootloader-Konfiguration} für weitere Informationen
zu den verfügbaren Konfigurationsoptionen.

@unnumberedsubsec Global sichtbare Pakete

@vindex %base-packages
Im Feld @code{packages} werden Pakete aufgeführt, die auf dem System für
alle Benutzerkonten global sichtbar sein sollen, d.h.@: in der
@env{PATH}-Umgebungsvariablen jedes Nutzers, zusätzlich zu den nutzereigenen
Profilen (siehe @ref{Aufruf von guix package}). Die Variable
@code{%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 @command{mg}, @command{find}, @command{grep} und so
weiter. Obiges Beispiel fügt zu diesen noch das Programm GNU@tie{}Screen
hinzu, welches aus dem Modul @code{(gnu packages screen)} genommen wird
(siehe @ref{Paketmodule}). Die Syntax @code{(list Paket Ausgabe)} kann
benutzt werden, um eine bestimmte Ausgabe eines Pakets auszuwählen:

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

(operating-system
  ;; …
  (packages (cons (list isc-bind "utils")
                  %base-packages)))
@end lisp

@findex specification->package
Sich auf Pakete anhand ihres Variablennamens zu beziehen, wie oben bei
@code{isc-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
@code{use-package-modules} entsprechend zu ergänzen. Um dies zu vermeiden,
kann man auch die Prozedur @code{specification->package} aus dem Modul
@code{(gnu packages)} aufrufen, welche das einem angegebenen Namen oder
Name-Versions-Paar zu Grunde liegende Paket liefert:

@lisp
(use-modules (gnu packages))

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

@findex specifications->packages
Wenn ein Paket mehr als eine Ausgabe hat, kann man auch ohne größere
Umstände auf eine bestimmte Ausgabe außer der Standardausgabe @code{out}
verweisen, indem man die Prozedur @code{specifications->packages} aus dem
Modul @code{(gnu packages)} verwendet. Zum Beispiel:

@lisp
(use-modules (gnu packages))

(operating-system
  ;; ...
  (packages (append (specifications->packages
                      '("git" "git:send-email"))
                    %base-packages)))

@end lisp

@unnumberedsubsec Systemdienste

@cindex services
@vindex %base-services
Das Feld @code{services} listet @dfn{Systemdienste} auf, die zur Verfügung
stehen sollen, wenn das System startet (siehe @ref{Dienste}). Die
@code{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 @ref{Netzwerkdienste, @code{openssh-service-type}}). Intern sorgt der
@code{openssh-service-type} dafür, dass @code{sshd} mit den richtigen
Befehlszeilenoptionen aufgerufen wird, je nach Systemkonfiguration werden
auch für dessen Betrieb nötige Konfigurationsdateien erstellt (siehe
@ref{Dienste definieren}).

@cindex Anpassung, von Diensten
@findex modify-services
Gelegentlich werden Sie die Basis-Dienste nicht einfach so, wie sie sind,
benutzen, sondern anpassen wollen. Benutzen Sie @code{modify-services}
(siehe @ref{Service-Referenz, @code{modify-services}}), um die Liste der
Basis-Dienste zu modifizieren.

@anchor{auto-login to TTY} Wenn Sie zum Beispiel @code{guix-daemon} und Mingetty (das Programm, womit
Sie sich auf der Konsole anmelden) in der @code{%base-services}-Liste
modifizieren möchten (siehe @ref{Basisdienste, @code{%base-services}}),
schreiben Sie das Folgende in Ihre Betriebssystemdeklaration:

@lisp
(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))
@end lisp

Dadurch ändert sich die Konfiguration@tie{}– d.h.@: die
Dienst-Parameter@tie{}– der @code{guix-service-type}-Instanz und die aller
@code{mingetty-service-type}-Instanzen in der @code{%base-services}-Liste
(siehe @ref{Automatisch an virtueller Konsole anmelden, das Kochbuch,,
guix-cookbook.de, GNU-Guix-Kochbuch} für eine Anleitung, wie man damit ein
Benutzerkonto automatisch auf nur einem TTY anmelden ließe). Das
funktioniert so: Zunächst arrangieren wir, dass die ursprüngliche
Konfiguration an den Bezeichner @code{config} im @var{Rumpf} gebunden wird,
dann schreiben wir den @var{Rumpf}, damit er zur gewünschten Konfiguration
ausgewertet wird. Beachten Sie insbesondere, wie wir mit @code{inherit} eine
neue Konfiguration erzeugen, die dieselben Werte wie die alte Konfiguration
hat, aber mit ein paar Modifikationen.

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

@lisp
@include os-config-desktop.texi
@end lisp

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

@lisp
@include os-config-lightweight-desktop.texi
@end lisp

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

Im Abschnitt @ref{Desktop-Dienste} finden Sie eine genaue Liste der unter
@code{%desktop-services} angebotenen Dienste.

Beachten Sie, dass @code{%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 @ref{SRFI-1 Filtering and Partitioning,,, guile, Referenzhandbuch zu
GNU Guile}). Beispielsweise liefert der folgende Ausdruck eine Liste mit
allen Diensten von @code{%desktop-services} außer dem Avahi-Dienst.

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

Alternativ können Sie das Makro @code{modify-services} benutzen:

@lisp
(modify-services %desktop-services
  (delete avahi-service-type))
@end lisp

@unnumberedsubsec Dienste untersuchen

@cindex Problembehandlung, bei Systemdiensten
@cindex Untersuchen, Systemdienste
@cindex Systemdienste untersuchen
Bei der Arbeit an Ihrer Systemkonfiguration kann es vorkommen, dass ein
Systemdienst nicht auftaucht oder sich das System falsch verhält und Sie
sich fragen, warum. Dann gibt es mehrere Ansätze, wie Sie Ihr System
untersuchen und auf Fehlersuche gehen können.

@cindex Abhängigkeitsgraph, bei Shepherd-Diensten
Zunächst können Sie den Abhängigkeitsgraphen der Shepherd-Dienste
untersuchen, und zwar so:

@example
guix system shepherd-graph /etc/config.scm | \
  guix shell xdot -- xdot -
@end example

So können Sie sich veranschaulichen, welche Shepherd-Dienste in
@file{/etc/config.scm} definiert sind. Jeder Kasten steht für einen Dienst,
wie ihn @command{sudo herd status} auf dem laufenden System anzeigt, und
jeder Pfeil steht für eine Abhängigkeit (in dem Sinn, dass, wenn Dienst
@var{A} von @var{B} abhängt, @var{B} vor @var{A} gestartet sein muss).

@cindex Erweiterungsgraph, bei Diensten
Allerdings ist nicht jeder „Dienst“ auch ein Shepherd-Dienst, weil die
Definition des Begriffs Dienst in Guix System weit ist (siehe
@ref{Dienste}). Um allgemein jeden Systemdienst und die Beziehung zwischen
solchen zu veranschaulichen, geben Sie ein:

@example
guix system extension-graph /etc/config.scm | \
  guix shell xdot -- xdot -
@end example

So können Sie den @dfn{Diensterweiterungsgraphen} sehen, also welche Dienste
welche anderen „erweitern“ und so zum Beispiel zu deren Konfiguration
beitragen. Siehe @ref{Dienstkompositionen}, um mehr über die Bedeutung des
Graphen zu erfahren.

Zu guter Letzt könnte Ihnen helfen, Ihre Systemkonfiguration auf der REPL zu
untersuchen (@ref{Interaktiv mit Guix arbeiten}). Hier sehen Sie eine
Beispielsitzung:

@example
$ guix repl
scheme@@(guix-user)> ,use (gnu)
scheme@@(guix-user)> (define os (load "config.scm"))
scheme@@(guix-user)> ,pp (map service-kind (operating-system-services os))
$1 = (#<service-type localed cabba93>
      …)
@end example

Siehe @ref{Service-Referenz}, um mehr über die Scheme-Schnittstelle zum
Verändern und Untersuchen von Diensten zu lernen.

@unnumberedsubsec Das System instanziieren

@cindex System instanziieren
@cindex Rekonfigurieren des Systems
Angenommen, Sie haben die @code{operating-system}-Deklaration in einer Datei
@file{config.scm} gespeichert, dann instanziiert der Befehl @command{sudo
guix system reconfigure config.scm} diese Konfiguration und macht sie zum
voreingestellten GRUB-Boot-Eintrag. Siehe @ref{Einstieg in Guix System} für einen Überblick.

Der normale Weg, die Systemkonfiguration nachträglich zu ändern, ist, die
Datei zu aktualisieren und @command{guix system reconfigure} erneut
auszuführen. Man sollte nie die Dateien in @file{/etc} bearbeiten oder den
Systemzustand mit Befehlen wie @command{useradd} oder @command{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.

@unnumberedsubsec Die Programmierschnittstelle

Auf der Ebene von Scheme wird der Großteil der
@code{operating-system}-Deklaration mit der folgenden monadischen Prozedur
instanziiert (siehe @ref{Die Store-Monade}):

@deffn {Monadische Prozedur} operating-system-derivation os
Liefert eine Ableitung, mit der ein @code{operating-system}-Objekt @var{os}
erstellt wird (siehe @ref{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 @var{os} zu instanziieren.
@end deffn

Diese Prozedur wird vom Modul @code{(gnu system)} angeboten. Zusammen mit
@code{(gnu services)} (siehe @ref{Dienste}) deckt dieses Modul den Kern von
„Guix System“ ab. Schauen Sie es sich mal an!


@node „operating-system“-Referenz
@section @code{operating-system}-Referenz

Dieser Abschnitt fasst alle Optionen zusammen, die für
@code{operating-system}-Deklarationen zur Verfügung stehen (siehe @ref{Das Konfigurationssystem nutzen}).

@deftp {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 @ref{Das Konfigurationssystem nutzen}).

@table @asis
@item @code{kernel} (Vorgabe: @code{linux-libre})
@c footnote duplicated in @pxref{Installation}
Das Paket für den zu nutzenden Betriebssystem-Kernel als
„package“-Objekt@footnote{Derzeit wird nur der Kernel Linux-libre
vollständig unterstützt. Die Nutzung von GNU@tie{}mach mit GNU@tie{}Hurd ist
experimentell und steht nur zur Erstellung eines Disk-Image für virtuelle
Maschinen bereit.}.

@cindex hurd
@item @code{hurd} (Vorgabe: @code{#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 @code{kernel} das @code{gnumach}-Paket (das ist der Microkernel,
auf dem Hurd läuft) ausgewählt sein.

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

@item @code{kernel-loadable-modules} (Vorgabe: '())
Eine Liste von Objekten (normalerweise Pakete), aus denen Kernel-Module
geladen werden können, zum Beispiel @code{(list ddcci-driver-linux)}.

@item @code{kernel-arguments} (Vorgabe: @code{%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@tie{}– wie z.B.@: @code{("console=ttyS0")}.

@item @code{bootloader}
Das Konfigurationsobjekt für den Bootloader, mit dem das System gestartet
wird. Siehe @ref{Bootloader-Konfiguration}.

@item @code{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.

@item @code{keyboard-layout} (Vorgabe: @code{#f})
Dieses Feld gibt an, welche Tastaturbelegung auf der Konsole benutzt werden
soll. Es kann entweder auf @code{#f} gesetzt sein, damit die voreingestellte
Tastaturbelegung benutzt wird (in der Regel ist diese „US English“), oder
ein @code{<keyboard-layout>}-Verbundsobjekt sein. Siehe @ref{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
@code{luks-device-mapping} zugeordneten Gerät befindet (siehe @ref{Zugeordnete Geräte}).

@quotation Anmerkung
Damit wird @emph{nicht} angegeben, welche Tastaturbelegung der Bootloader
benutzt, und auch nicht, welche der grafische Anzeigeserver verwendet. Siehe
@ref{Bootloader-Konfiguration} für Informationen darüber, wie Sie die
Tastaturbelegung des Bootloaders angeben können. Siehe @ref{X Window} für
Informationen darüber, wie Sie die Tastaturbelegung angeben können, die das
X-Fenstersystem verwendet.
@end quotation

@item @code{initrd-modules} (Vorgabe: @code{%base-initrd-modules})
@cindex initrd
@cindex initiale RAM-Disk
Die Liste der Linux-Kernel-Module, die in der initialen RAM-Disk zur
Verfügung stehen sollen. Siehe @ref{Initiale RAM-Disk}.

@item @code{initrd} (Vorgabe: @code{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 @ref{Initiale RAM-Disk}.

@item @code{firmware} (Vorgabe: @code{%base-firmware})
@cindex 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
@code{ath9k} und @code{b43-open}). Siehe den Abschnitt @ref{Hardware-Überlegungen} für mehr Informationen zu unterstützter Hardware.

@item @code{host-name}
Der Rechnername.

@item @code{mapped-devices} (Vorgabe: @code{'()})
Eine Liste zugeordneter Geräte („mapped devices“). Siehe @ref{Zugeordnete Geräte}.

@item @code{file-systems}
Eine Liste von Dateisystemen. Siehe @ref{Dateisysteme}.

@item @code{swap-devices} (Vorgabe: @code{'()})
@cindex Swap-Geräte
Eine Liste der Swap-Speicher. Siehe @ref{Swap-Speicher}.

@item @code{users} (Vorgabe: @code{%base-user-accounts})
@itemx @code{groups} (Vorgabe: @code{%base-groups})
Liste der Benutzerkonten und Benutzergruppen. Siehe @ref{Benutzerkonten}.

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

@item @code{skeletons} (Vorgabe: @code{(default-skeletons)})
Eine Liste von Tupeln aus je einem Ziel-Dateinamen und einem dateiähnlichen
Objekt (siehe @ref{G-Ausdrücke, dateiartige Objekte}). 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:

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

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

@item @code{packages} (Vorgabe: @code{%base-packages})
Eine Liste von Paketen, die ins globale Profil installiert werden sollen,
welches unter @file{/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:

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

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
@ref{Aufruf von guix package}).

@item @code{timezone} (Vorgabe: @code{"Etc/UTC"})
Eine Zeichenkette, die die Zeitzone bezeichnet, wie z.B.@:
@code{"Europe/Berlin"}.

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

@item @code{locale} (Vorgabe: @code{"en_US.utf8"})
Der Name der als Voreinstellung zu verwendenden Locale (siehe @ref{Locale
Names,,, libc, Referenzhandbuch der GNU-C-Bibliothek}). Siehe @ref{Locales}
für weitere Informationen.

@item @code{locale-definitions} (Vorgabe: @code{%default-locale-definitions})
Die Liste der Locale-Definitionen, die kompiliert werden sollen und dann im
laufenden System benutzt werden können. Siehe @ref{Locales}.

@item @code{locale-libcs} (Vorgabe: @code{(list @var{glibc})})
Die Liste der GNU-libc-Pakete, deren Locale-Daten und -Werkzeuge zum
Erzeugen der Locale-Definitionen verwendet werden sollen. Siehe
@ref{Locales} für eine Erläuterung der Kompatibilitätsauswirkungen,
deretwegen man diese Option benutzen wollen könnte.

@item @code{name-service-switch} (Vorgabe: @code{%default-nss})
Die Konfiguration des Name Service Switch (NSS) der libc@tie{}– ein
@code{<name-service-switch>}-Objekt. Siehe @ref{Name Service Switch} für
Details.

@item @code{services} (Vorgabe: @code{%base-services})
Eine Liste von „service“-Objekten, die die Systemdienste
repräsentieren. Siehe @ref{Dienste}.

@anchor{operating-system-essential-services}
@cindex essenzielle Dienste
@item @code{essential-services} (Vorgabe: …)
Die Liste „essenzieller Dienste“@tie{}– d.h.@: Dinge wie Instanzen von
@code{system-service-type} (siehe @ref{Service-Referenz}) und
@code{host-name-service-type}, die aus der Betriebssystemdefinition an sich
abgeleitet werden. Als normaler Benutzer sollten Sie dieses Feld
@emph{niemals} ändern müssen.

@item @code{pam-services} (Vorgabe: @code{(base-pam-services)})
@cindex PAM
@cindex Pluggable Authentication Modules
@c FIXME: Add xref to PAM services section.
Dienste für @dfn{Pluggable Authentication Modules} (PAM) von Linux.

@item @code{privileged-programs} (Vorgabe: @code{%default-privileged-programs})
Eine Liste von @code{<privileged-program>}-Objekten. Siehe @ref{Privilegierte Programme}.

@item @code{sudoers-file} (Vorgabe: @code{%sudoers-specification})
@cindex sudoers-Datei
Der Inhalt der Datei @file{/etc/sudoers} als ein dateiähnliches Objekt
(siehe @ref{G-Ausdrücke, @code{local-file} und @code{plain-file}}).

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

@end table

@defmac this-operating-system
Wenn dies im @emph{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 @code{label}-Felds
schreibt:

@lisp
(use-modules (gnu) (guix))

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

Es ist ein Fehler, außerhalb einer Betriebssystemdefinition auf
@code{this-operating-system} zu verweisen.
@end defmac

@end deftp

@node Dateisysteme
@section Dateisysteme

Die Liste der Dateisysteme, die eingebunden werden sollen, steht im
@code{file-systems}-Feld der Betriebssystemdeklaration (siehe @ref{Das Konfigurationssystem nutzen}). Jedes Dateisystem wird mit der
@code{file-system}-Form deklariert, etwa so:

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

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

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

@table @asis
@item @code{type}
Eine Zeichenkette, die den Typ des Dateisystems spezifiziert, z.B.@:
@code{"ext4"}.

@item @code{mount-point}
Der Einhängepunkt, d.h.@: der Pfad, an dem das Dateisystem eingebunden
werden soll.

@item @code{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 @file{/dev}-Knotens. Mit
Bezeichnungen und UUIDs können Sie Dateisysteme benennen, ohne den
Gerätenamen festzuschreiben@footnote{Beachten Sie: Obwohl es verführerisch
ist, mit @file{/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.}.

@findex file-system-label
Dateisystem-Bezeichnungen („Labels“) werden mit der Prozedur
@code{file-system-label} erzeugt und UUID-Kennungen werden mit @code{uuid}
erzeugt, während Knoten in @file{/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
@command{e2label} angezeigt wird:

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

@findex uuid
UUID-Kennungen werden mit der @code{uuid}-Form von ihrer Darstellung als
Zeichenkette (wie sie vom Befehl @command{tune2fs -l} angezeigt wird)
konvertiert@footnote{Die @code{uuid}-Form nimmt 16-Byte-UUIDs entgegen, wie
sie in @uref{https://tools.ietf.org/html/rfc4122, RFC@tie{}4122} 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.} wie
hier:

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

Wenn die Quelle eines Dateisystems ein zugeordnetes Gerät ist (siehe
@ref{Zugeordnete Geräte}), @emph{muss} sich das @code{device}-Feld auf den
zugeordneten Gerätenamen beziehen@tie{}– z.B.@:
@file{"/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.

@item @code{flags} (Vorgabe: @code{'()})
Eine Liste von Symbolen, die Einbinde-Schalter („mount flags“)
bezeichnen. Erkannt werden unter anderem @code{read-only} (nur lesbar),
@code{bind-mount} (Verzeichniseinbindung), @code{no-dev} (Zugang zu
besonderen Dateien verweigern), @code{no-suid} (setuid- und setgid-Bits
ignorieren), @code{no-atime} (Dateizugriffs-Zeitstempel @emph{nicht}
aktualisieren), @code{no-diratime} (das Gleiche ausschließlich für
Verzeichnisse), @code{strict-atime} (Dateizugriffs-Zeitstempel immer
aktualisieren), @code{lazy-time} (Zeitstempel nur auf zwischengespeicherten
Datei-Inodes im Arbeitsspeicher aktualisieren), @code{no-exec}
(Programmausführungen verweigern), @code{remount} (ein bereits eingebundenes
Dateisystem neu einbinden) und @code{shared} (für
Mehrfacheinhängungen). Siehe @ref{Mount-Unmount-Remount,,, libc,
Referenzhandbuch der GNU-C-Bibliothek} für mehr Informationen zu diesen
Einbinde-Schaltern.

@item @code{options} (Vorgabe: @code{#f})
Entweder @code{#f} oder eine Zeichenkette mit Einbinde-Optionen („mount
options“), die an den Dateisystemtreiber übergeben werden. Siehe
@ref{Mount-Unmount-Remount,,, libc, Referenzhandbuch der GNU-C-Bibliothek}
für Details.

Führen Sie @command{man 8 mount} aus, um die Einbinde-Optionen verschiedener
Dateisysteme zu sehen. Aber aufgepasst: Wenn dort von „vom Dateisystem
unabhängigen Einhängeoptionen“ die Rede ist, sind eigentlich Flags gemeint;
sie gehören in das oben beschriebene @code{flags}-Feld.

Die Prozeduren @code{file-system-options->alist} und
@code{alist->file-system-options} aus @code{(gnu system file-systems)}
können benutzt werden, um als assoziative Liste dargestellte
Dateisystemoptionen in eine Darstellung als Zeichenkette umzuwandeln und
umgekehrt.

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

@item @code{needed-for-boot?} (Vorgabe: @code{#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.

@item @code{check?} (Vorgabe: @code{#t})
Dieser boolesche Wert sagt aus, ob das Dateisystem vor dem Einbinden auf
Fehler hin geprüft werden soll. Feineinstellungen, wie und wann geprüft
wird, sind mit den folgenden Optionen möglich.

@item @code{skip-check-if-clean?} (Vorgabe: @code{#t})
Wenn es wahr ist, zeigt dieser Boolesche Ausdruck an, ob eine durch
@code{check?} ausgelöste Dateisystemüberprüfung direkt abbrechen darf, wenn
das Dateisystem als in Ordnung („clean“) markiert ist, also zuvor korrekt
ausgehangen wurde, so dass es keine Fehler enthalten dürfte.

Wenn Sie es auf falsch setzen, wird eine vollständige Konsistenzprüfung bei
jedem Start erzwungen, wenn @code{check?} auf wahr gesetzt ist. Das kann
sehr viel Zeit in Anspruch nehmen. Auf gesunden Systemen lassen Sie es
besser eingeschaltet, sonst kann die Verlässlichkeit sogar abnehmen!

Andererseits speichern Dateisysteme wie @code{fat} @emph{nicht}, ob der
Rechner ordentlich heruntergefahren wurde, deswegen wird diese Option für
sie ignoriert.

@item @code{repair} (Vorgabe: @code{'preen})
Wenn durch @code{check?} Fehler festgestellt wurden, kann es versuchen, das
Dateisystem zu reparieren, und das System danach normal starten. Mit dieser
Option legen Sie fest, wann und wie repariert werden soll.

Wenn es falsch ist, wird das Dateisystem möglichst unverändert
gelassen. Beim Überprüfen mancher Dateisysteme wie @code{jfs} können
trotzdem Schreibzugriffe auf das Gerät stattfinden, um die Aufzeichnungen
über Operationen (das „Journal“) zu wiederholen. Es wird @emph{keine}
Reparatur versucht.

Wenn es @code{#t} ist, wird versucht, alle gefundenen Fehler zu beheben. Auf
alle Rückfragen wird mit „yes“ geantwortet. Dadurch werden die meisten
Fehler behoben, aber es kann schiefgehen.

Wenn es @code{'preen} ist, werden nur solche Fehler behoben, wo auch ohne
menschliche Aufsicht nichts Schlimmes passieren kann. Was das genau heißt,
bleibt den Entwicklern des jeweiligen Dateisystems überlassen. Es kann auf
dasselbe hinauslaufen wie keine oder alle Fehler zu beheben.

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

@item @code{mount-may-fail?} (Vorgabe: @code{#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
@code{efivarfs} benutzt, einem Dateisystem, das nur auf EFI-/UEFI-Systemen
eingebunden werden kann.

@item @code{dependencies} (Vorgabe: @code{'()})
Dies ist eine Liste von @code{<file-system>}- oder
@code{<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:
@file{/sys/fs/cgroup} ist eine Abhängigkeit von @file{/sys/fs/cgroup/cpu}
und @file{/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 @ref{Zugeordnete Geräte}).

@item @code{shepherd-requirements} (Vorgabe: @code{'()})
Eine Liste von Symbolen, die Shepherd-Voraussetzungen benennen, die erfüllt
sein müssen, um dieses Dateisystem einzubinden.

Zum Beispiel würde für ein NFS-Dateisystem normalerweise @code{networking}
als Abhängigkeit angegeben. In manchen Situationen genügt das allerdings
@emph{nicht}, weil trotz einem als gestartet markierten @code{networking}
das Netzwerk vielleicht @emph{nicht} unbedingt bereits konfiguriert wurde
oder ordentlich funktioniert (zum Beispiel wenn
@code{dhcp-client-service-type} benutzt wird). In solchen Fällen kann es
erforderlich sein, dass Sie hier eine Abhängigkeit von einem eigenen
@code{network-online}-Dienst angeben. Ein Beispiel, wie Sie
@code{network-online} als einmalig ausgeführten („one-shot“) Shepherd-Dienst
implementieren, folgt:

@lisp
(simple-service 'network-online shepherd-root-service-type
  (list
   (shepherd-service
    (requirement '(networking))
    (provision '(network-online))
    (documentation "Wartet, bis das Netzwerk da ist.")
    (start #~(lambda _
               (let* ((cmd
                       "set -eux
c=0
while ! /run/setuid-programs/ping -qc1 -W1 example.org; do
	sleep 1
	[ \"$((c += 1))\" -lt 30 ] || exit 1  # Beschränkt die Wartezeit
")
                    (status (system cmd)))
               (= 0 (status:exit-val status)))))
    (one-shot? #t))))
@end lisp

Typically, file systems are mounted before most other Shepherd services are
started.  However, file systems with a non-empty shepherd-requirements field
are mounted after Shepherd services have begun.  Any Shepherd service that
depends on a file system with a non-empty shepherd-requirements field must
depend on it directly and not on the generic symbol @code{file-systems}.
@end table
@end deftp

@deffn {Prozedur} file-system-label Zeichenkette
Diese Prozedur kapselt die @var{Zeichenkette} in einer opaken
Dateisystembezeichnung:

@lisp
(file-system-label "home")
@result{} #<file-system-label "home">
@end lisp

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

Das Modul @code{(gnu system file-systems)} exportiert die folgenden
nützlichen Variablen.

@defvar %base-file-systems
Hiermit werden essenzielle Dateisysteme bezeichnet, die für normale Systeme
unverzichtbar sind, wie zum Beispiel @code{%pseudo-terminal-file-system} und
@code{%immutable-store} (siehe unten). Betriebssystemdeklaration sollten auf
jeden Fall mindestens diese enthalten.
@end defvar

@defvar %pseudo-terminal-file-system
Das als @file{/dev/pts} einzubindende Dateisystem. Es unterstützt über
@code{openpty} und ähnliche Funktionen erstellte @dfn{Pseudo-Terminals}
(siehe @ref{Pseudo-Terminals,,, libc, Referenzhandbuch der
GNU-C-Bibliothek}). Pseudo-Terminals werden von Terminal-Emulatoren wie
@command{xterm} benutzt.
@end defvar

@defvar %shared-memory-file-system
Dieses Dateisystem wird als @file{/dev/shm} eingebunden, um Speicher
zwischen Prozessen teilen zu können (siehe @ref{Memory-mapped I/O,
@code{shm_open},, libc, Referenzhandbuch der GNU-C-Bibliothek}).
@end defvar

@defvar %immutable-store
Dieses Dateisystem vollzieht eine Verzeichniseinbindung („bind mount“) des
@file{/gnu/store}, um ihn für alle Nutzer einschließlich des
Administratornutzers @code{root} nur lesbar zu machen, d.h.@: Schreibrechte
zu entziehen. Dadurch kann als @code{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.
@end defvar

@defvar %binary-format-file-system
Das @code{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
@code{binfmt.ko} geladen wurde.
@end defvar

@defvar %fuse-control-file-system
Das @code{fusectl}-Dateisystem, womit „unprivilegierte“ Nutzer ohne
besondere Berechtigungen im User Space FUSE-Dateisysteme einbinden und
aushängen können. Dazu muss das Kernel-Modul @code{fuse.ko} geladen sein.
@end defvar

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

@deffn {Prozedur} uuid Zeichenkette [Typ]
Liefert eine eindeutige UUID (Unique Identifier) als opakes Objekt des
angegebenen @var{Typ}s (ein Symbol), indem die @var{Zeichenkette}
verarbeitet wird:

@lisp
(uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")
@result{} #<<uuid> type: dce bv: …>

(uuid "1234-ABCD" 'fat)
@result{} #<<uuid> type: fat bv: …>
@end lisp

Als @var{Typ} kann entweder @code{dce}, @code{iso9660}, @code{fat},
@code{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.
@end deffn


@menu
* Btrfs-Dateisystem::        Btrfs-Dateisystem
@end menu

@node Btrfs-Dateisystem
@subsection 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:

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

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

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

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 @command{grub-mkconfig}, der bei GRUB mitgelieferte Befehl zur
Erzeugung von Konfigurationsdateien, aus @file{/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 @file{/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.:

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

Deswegen muss der Name des Unterlaufwerks dem @file{/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:

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

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 @code{subvol}-Option auf entweder @code{/rootfs/gnu/store} oder
@code{rootfs/gnu/store} verwenden.

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

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

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
@code{subvol}-Option übergeben wird. Eine Möglichkeit wäre, das
„guix-store“-Unterlaufwerk als @file{/gnu/store} über eine solche
Dateisystemdeklaration einzubinden:

@lisp
(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"))
@end lisp

@node Zugeordnete Geräte
@section Zugeordnete Geräte

@cindex Gerätezuordnung
@cindex zugeordnete Geräte
Der Linux-Kernel unterstützt das Konzept der @dfn{Gerätezuordnung}: Ein
blockorientiertes Gerät wie eine Festplattenpartition kann einem neuen Gerät
@dfn{zugeordnet} werden, gewöhnlich unter @code{/dev/mapper/}, wobei das
neue Gerät durchlaufende Daten zusätzlicher Verarbeitung unterzogen
werden@footnote{Beachten Sie, dass mit GNU@tie{}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 @emph{übersetzt}. Hurd
implementiert zugeordnete Geräte genau wie Dateisysteme mit dem generischen
@dfn{Übersetzer}-Mechanismus (siehe @ref{Translators,,, hurd,
Referenzhandbuch von GNU Hurd}).}. 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
@dfn{umgewandelt} wird, um ein neues Gerät zu bilden; zum Beispiel entstehen
auch RAID-Geräte aus einem @dfn{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 @code{mapped-device}-Form
deklariert, die wie folgt definiert ist; Beispiele folgen weiter unten.

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

@table @code
@item source
Es handelt sich entweder um eine Zeichenkette, die den Namen eines
zuzuordnenden blockorientierten Geräts angibt, wie @code{"/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.

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

@item targets
Diese Liste von Zeichenketten gibt die Namen der neuen zugeordneten Geräte
an, wenn es mehrere davon gibt. Das Format ist mit @var{target} identisch.

@item type
Dies muss ein @code{mapped-device-kind}-Objekt sein, das angibt, wie die
Quelle @var{source} dem Ziel @var{target} zugeordnet wird.

@item arguments
This is a list of arguments specific to @var{type} that are passed to its
@code{open}, @code{close}, and @code{check} procedures.

As an example, @code{luks-device-mapping} supports keyword arguments---see
below for details.
@end table
@end deftp

@defvar luks-device-mapping
Hiermit wird ein blockorientiertes Gerät mit LUKS verschlüsselt, mit Hilfe
des Befehls @command{cryptsetup} aus dem gleichnamigen Paket. Dazu wird das
Linux-Kernel-Modul @code{dm-crypt} vorausgesetzt.

The following options may be passed @i{via} the @code{arguments} field of a
mapped device:

@table @code
@item #:key-file
Wenn Sie eine Schlüsseldatei angeben, wird zum Entsperren wenn möglich
zunächst die Schlüsseldatei hergenommen. Der Vorteil davon ist, dass Sie
kein Passwort eintippen müssen. Damit können Sie beispielsweise RAID-Arrays
beim Booten automatisch entsperren. Wenn das Entsperren mit der
Schlüsseldatei fehlschlägt, wird noch das Entsperren per Passwort versucht
werden. Die Schlüsseldatei liegt @emph{nicht} im Store; sie muss zum
Zeitpunkt des Entsperrungsversuchs an der angegebenen Stelle zu finden sein.

@lisp
;; Die folgende Definition ist gleichbedeutend mit dem Befehl:
;;   cryptsetup open --key-file /crypto.key /dev/sdb1 data
(mapped-device
 (source "/dev/sdb1")
 (target "data")
 (type luks-device-mapping)
 (arguments '(#:key-file "/crypto.key")))
@end lisp

@item #:allow-discards?
Mit @code{allow-discards?} wird die Nutzung von TRIM-Steuerbefehlen auf dem
zugrunde liegenden Gerät ermöglicht. Das ist nützlich auf
@abbr{SSD-Laufwerken, Solid-State-Drives}. Der Nachteil ist aber, dass die
Informationssicherheit beeinträchtigt werden kann, weil Operationen auf dem
Dateisystem so das physische Gerät beeinflussen. Sie können weitergehende
Informationen in der Beschreibung der Befehlszeilenoption
@code{--allow-discards} auf der Handbuchseite @code{cryptsetup-open(8)}
erfahren.

@item #:extra-options
List of additional command-line options for the @code{cryptsetup open}
command.  See the @code{cryptsetup-open(8)} man page for a list of supported
options.

For example, here is how you could specify the
@option{--perf-no_read_workqueue} and @option{--perf-no_write_workqueue}
options, along with @option{--allow-discards}:

@lisp
(mapped-device
  (source "/dev/sdb1")
  (target "data")
  (type luks-device-mapping)
  (arguments '(#:allow-discards? #t
               #:extra-options
               ("--perf-no_read_workqueue"
                "--perf-no_write_workqueue"))))
@end lisp

@end table
@end defvar

@defvar raid-device-mapping
Dies definiert ein RAID-Gerät, das mit dem Befehl @code{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.@:
@code{raid456} für RAID-4, RAID-5 oder RAID-6, oder @code{raid10} für
RAID-10.
@end defvar

@cindex LVM, Logical Volume Manager (Verwaltung logischer Datenträger)
@defvar lvm-device-mapping
Hiermit wird ein oder mehrere logische Datenträger („Logical Volumes“) für
den @uref{https://www.sourceware.org/lvm2/, Logical Volume Manager (LVM)}
für Linux definiert. Die Datenträgergruppe („Volume Group“) wird durch den
Befehl @command{vgchange} aus dem @code{lvm2}-Paket aktiviert.
@end defvar

@cindex Laufwerksverschlüsselung
@cindex LUKS
Das folgende Beispiel gibt eine Zuordnung von @file{/dev/sda3} auf
@file{/dev/mapper/home} mit LUKS an@tie{}– dem
@url{https://gitlab.com/cryptsetup/cryptsetup,Linux Unified Key Setup},
einem Standardmechanismus zur Plattenverschlüsselung. Das Gerät
@file{/dev/mapper/home} kann dann als @code{device} einer
@code{file-system}-Deklaration benutzt werden (siehe @ref{Dateisysteme}).

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

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

@example
cryptsetup luksUUID /dev/sda3
@end example

und wie folgt benutzen:

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

@cindex Swap-Verschlüsselung
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
@ref{Swap-Speicher} oder im Abschnitt @ref{Vor der Installation,,Disk
Partitioning}.

Ein RAID-Gerät als Verbund der Partitionen @file{/dev/sda1} und
@file{/dev/sdb1} kann wie folgt deklariert werden:

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

Das Gerät @file{/dev/md0} kann als @code{device} in einer
@code{file-system}-Deklaration dienen (siehe @ref{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:

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

Die Geräte @file{/dev/mapper/vg0-alpha} und @file{/dev/mapper/vg0-beta}
können dann im @code{device}-Feld einer @code{file-system}-Deklaration
verwendet werden (siehe @ref{Dateisysteme}).

@node Swap-Speicher
@section Swap-Speicher
@cindex Swap-Speicher

Swap-Speicher, wie man ihn oft nennt, ist ein Bereich auf der Platte, wohin
Speicherseiten verdrängt werden können. Als Seitenaustausch (englisch
„Paging“) bezeichnet man das Verfahren, wie der für die Speicherverwaltung
zuständige Prozess (d.h.@: der Linux-Kernel oder der „Default Pager“ in
Hurd) entscheiden kann, manche Speicherseiten aus dem Arbeitsspeicher (RAM),
die einem laufenden Prozess zugewiesen sind, ohne gerade benutzt zu werden,
stattdessen auf der Platte zu speichern. Dadurch wird Arbeitsspeicher frei,
wodurch mehr wertvoller schneller Speicher verfügbar wird; die Daten darin
werden in den Swap-Speicher ausgelagert. Wenn das Programm auf eben diese
Speicherseite zuzugreifen versucht, lädt der Speicherverwaltungsprozess die
Daten zurück in den Speicher, damit das Programm sie benutzen kann.

Häufig begegnet man der falschen Vorstellung, Swap nütze nur dann etwas,
wenn das System wenig Arbeitsspeicher zur Verfügung hat. Doch benutzen
Kernels oft allen Arbeitsspeicher als Zwischenspeicher für Plattenzugriffe,
um Ein- und Ausgaben zu beschleunigen. Deswegen steht durch den Austausch
ungenutzter Teile des Arbeitsspeichers mehr RAM für diese Art von Caching
zur Verfügung.

Wenn Sie genauer wissen wollen, wie Arbeitsspeicher aus Sicht eines
monolithisch aufgebauten Kernels verwaltet wird, siehe @ref{Memory Concepts,
Speicherkonzepte,, libc, Referenzhandbuch der GNU-C-Bibliothek}.

Der Linux-Kernel unterstützt Swap-Partitionen und Swap-Dateien: Erstere
reservieren eine ganze Plattenpartition für den Seitenaustausch, wohingegen
Zweitere dafür eine Datei aus dem Dateisystem einsetzen (der
Dateisystemtreiber muss sie unterstützen). Auf vergleichbaren Systemen haben
beide die gleiche Leistung, also sollte man sich für das entscheiden, was es
einem leichter macht. Partitionen sind „einfacher“ und brauchen keine
Unterstützung durch das Dateisystem, aber man muss sie schon beim
Formatieren der Platte zuweisen (außer man nutzt logische
Datenträger). Dateien hingegen kann man jederzeit anlegen oder löschen.

@cindex Ruhezustand
@cindex Suspend to Disk
Auch ist Swap-Speicher notwendig, damit das System in den @dfn{Ruhezustand}
wechseln kann (man spricht auch von @dfn{Suspend to Disk}). Dabei wird der
Systemzustand aus dem Arbeitsspeicher in den Swap-Speicher ausgelagert,
bevor der Rechner herunterfährt, so dass er beim nächsten Start der Maschine
wiederhergestellt werden kann. Der Ruhezustand benötigt höchstens so viel
wie die halbe Größe des Arbeitsspeichers als konfigurierter
Swap-Speicher. Es ist erforderlich, dass der Linux-Kernel die Information
über zur Wiederherstellung zu nutzenden Swap-Speicher schon beim Booten
mitgeteilt bekommt (über ein Kernel-Argument). Wenn eine Swap-Datei benutzt
wird, muss deren Versatz gegenüber dem sie beinhaltenden Gerät ebenso von
vornherein dem Kernel übergeben werden; dieser Wert muss erneuert werden,
wenn die Datei als Swap-Speicher neu initialisiert wird, weil z.B.@: Sie
ihre Größe geändert haben.

Vorsicht, Swap-Speicher wird beim Herunterfahren nicht genullt. Sensible
Daten (wie Passwörter) können sich darin befinden, wenn deren Speicherseiten
verdrängt wurden. Daher sollten Sie in Betracht ziehen, Ihren Swap-Speicher
auf ein verschlüsseltes Gerät zu legen (siehe @ref{Zugeordnete Geräte}).

@deftp {Datentyp} swap-space
Objekte dieses Typs repräsentieren Swap-Speicher. Sie weisen folgende
Komponenten auf:

@table @asis
@item @code{target}
Welches Gerät oder welche Datei verwendet werden soll, angegeben entweder
über die UUID, über ein @code{file-system-label}-Objekt mit der Bezeichnung
oder über eine Zeichenkette wie in der Definition eines
@code{file-system}-Objekts für ein Dateisystem (siehe @ref{Dateisysteme}).

@item @code{dependencies} (Vorgabe: @code{'()})
Eine Liste von @code{file-system}-Objekten oder
@code{mapped-device}-Objekten, die vorausgesetzt werden, damit der Speicher
verfügbar ist. Achtung: Genau wie bei @code{file-system}-Objekten gilt auch
für die Abhängigkeiten im @code{dependencies}-Feld, dass zum Hochfahren des
Systems notwendige Abhängigkeiten, die beim Start der Anwendungsebene („User
Space“) eingebunden werden, nicht durch Shepherd verwaltet werden, sondern
weggefiltert werden.

@item @code{priority} (Vorgabe: @code{#f})
Wird nur beim Linux-Kernel unterstützt. Entweder @code{#f}, damit
@emph{keine} Priorität festgelegt wird, oder eine ganze Zahl zwischen 0 und
32767. Der Kernel wird erst den Swap-Speicher mit der höheren Priorität für
den Seitenaustausch benutzen und bei gleicher Priorität im Rundlauf wechseln
(„Round-Robin-Verfahren“). Swap-Speicher ohne festgelegte Priorität wird
später als priorisierter verwendet, in der angegebenen Reihenfolge ohne
Round Robin.

@item @code{discard?} (Vorgabe: @code{#f})
Wird nur beim Linux-Kernel unterstützt. Wenn es wahr ist, benachrichtigt der
Kernel die Steuereinheit (Controller) der Platte, welche Seiten verworfen
wurden, zum Beispiel mit der TRIM-Operation auf SSD-Speicher.

@end table
@end deftp

Hier sind einige Beispiele:

@lisp
(swap-space (target (uuid "4dab5feb-d176-45de-b287-9b0a6e4c01cb")))
@end lisp

Die Swap-Partition mit der angegebenen UUID verwenden. Sie können die UUID
einer Linux-Swap-Partition erfahren, indem Sie @command{swaplabel
@var{Gerät}} ausführen, wobei @var{Gerät} der Dateiname unter @file{/dev}
für die Partition ist.

@lisp
(swap-space
  (target (file-system-label "swap"))
  (dependencies mapped-devices))
@end lisp

Die Swap-Partition mit der Bezeichnung @code{swap} verwenden. Die
Bezeichnung können Sie finden, nachdem all die zugeordneten Geräte aus
@var{mapped-devices} geöffnet wurden. Auch hier können Sie mittels
@command{swaplabel}-Befehls die Bezeichnung einer Linux-Swap-Partition
einsehen und ändern.

Nun folgt ein anspruchsvolleres Beispiel. Sie sehen auch den entsprechenden
Teil zu @code{file-systems} aus der Deklaration eines
@code{operating-system}.

@lisp
(file-systems
  (list (file-system
          (device (file-system-label "root"))
          (mount-point "/")
          (type "ext4"))
        (file-system
          (device (file-system-label "btrfs"))
          (mount-point "/btrfs")
          (type "btrfs"))))

(swap-devices
  (list
    (swap-space
      (target "/btrfs/swapfile")
      (dependencies (filter (file-system-mount-point-predicate "/btrfs")
                            file-systems)))))
@end lisp

Die Datei @file{/btrfs/swapfile} als Swap-Speicher benutzen, die abhängig
ist von dem als  @file{/btrfs} eingebundenen Dateisystem. Sie sehen, wie wir
mit Guiles @code{filter}-Prozedur das Dateisystem auf elegante Weise
auswählen!

@lisp
(swap-devices
  (list
    (swap-space
      (target "/dev/mapper/my-swap")
      (dependencies mapped-devices))))

(kernel-arguments
  (cons* "resume=/dev/mapper/my-swap"
         %default-kernel-arguments))
@end lisp

Obiges Schnipsel im @code{operating-system} einer Betriebssystemdeklaration
aktiviert das zugeordnete Gerät @file{/dev/mapper/my-swap} (was aus einem
verschlüsselten Gerät kommen kann) als Swap-Speicher und teilt dem Kernel
über das Kernel-Argument @code{resume} mit, dass es für den Ruhezustand
benutzt werden soll (siehe @ref{„operating-system“-Referenz},
@code{kernel-arguments}).

@lisp
(swap-devices
  (list
    (swap-space
      (target "/swapfile")
      (dependencies (filter (file-system-mount-point-predicate "/")
                            file-systems)))))

(kernel-arguments
  (cons* "resume=/dev/sda3"        ;Gerät, das /swapfile enthält
         "resume_offset=92514304"  ;Versatz, den /swapfile darauf hat
         %default-kernel-arguments))
@end lisp

Das zweite Schnipsel eines @code{operating-system} zeigt, wie man die
Swap-Datei @file{/swapfile} für den Ruhezustand benutzen kann, indem dem
Kernel die Partition, auf der sie liegt, (im @code{resume}-Argument) und ihr
Versatz auf dieser Partition (im @code{resume_offset}-Argument) mitgeteilt
werden. Letzteren Wert können Sie der Ausgabe des Befehls @command{filefrag
-e} entnehmen; er ist die erste Zahl, die gleich unter dem Spaltenkopf
@code{physical_offset} steht (mit dem zweiten Befehl wird der Wert direkt
ausgelesen):

@smallexample
$ sudo filefrag -e /swapfile
Filesystem type is: ef53
File size of /swapfile is 2463842304 (601524 blocks of 4096 bytes)
 ext:     logical_offset:        physical_offset: length:   expected: flags:
   0:        0..    2047:   92514304..  92516351:   2048:
…
$ sudo filefrag -e /swapfile | grep '^ *0:' | cut -d: -f3 | cut -d. -f1
   92514304
@end smallexample

@node Benutzerkonten
@section Benutzerkonten

@cindex Benutzer
@cindex Konten
@cindex Benutzerkonten
Benutzerkonten und Gruppen werden allein durch die
@code{operating-system}-Deklaration des Betriebssystems verwaltet. Sie
werden mit den @code{user-account}- und @code{user-group}-Formen angegeben:

@lisp
(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"))
@end lisp

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

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

Beim Hochfahren oder nach Abschluss von @command{guix system reconfigure}
stellt das System sicher, dass nur die in der
@code{operating-system}-Deklaration angegebenen Benutzerkonten und Gruppen
existieren, mit genau den angegebenen Eigenschaften. Daher gehen durch
direkten Aufruf von Befehlen wie @command{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.

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

@table @asis
@item @code{name}
Der Name des Benutzerkontos.

@item @code{group}
@cindex Gruppen
Dies ist der Name (als Zeichenkette) oder die Bezeichnung (als Zahl) der
Benutzergruppe, zu der dieses Konto gehört.

@item @code{supplementary-groups} (Vorgabe: @code{'()})
Dies kann optional als Liste von Gruppennamen angegeben werden, zu denen
dieses Konto auch gehört.

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

@item @code{comment} (Vorgabe: @code{""})
Ein Kommentar zu dem Konto, wie etwa der vollständige Name des
Kontoinhabers.

Beachten Sie, dass Benutzer den für ihr Benutzerkonto hinterlegten echten
Namen beliebig ändern können, @emph{außer} es handelt sich um
„System“-Benutzerkonten. Den in @file{/etc/passwd} gespeicherten Namen
können sie mit dem Befehl @command{chfn} ändern. Wenn sie das tun, hat der
gewählte Name Vorrang vor dem vom Systemadministrator auserkorenen
Namen. Rekonfigurieren ändert den Namen @emph{nicht}.

@item @code{home-directory}
Der Name des Persönlichen Verzeichnisses („Home“-Verzeichnis) für dieses
Konto.

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

@item @code{shell} (Vorgabe: Bash)
Ein G-Ausdruck, der den Dateinamen des Programms angibt, das dem Benutzer
als Shell dienen soll (siehe @ref{G-Ausdrücke}). Auf die Programmdatei der
Bash-Shell würden Sie zum Beispiel so verweisen:

@lisp
(file-append bash "/bin/bash")
@end lisp

@noindent
…@: und so auf die Programmdatei von Zsh:

@lisp
(file-append zsh "/bin/zsh")
@end lisp

@item @code{system?} (Vorgabe: @code{#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.

@anchor{user-account-password}
@cindex Passwort, für Benutzerkonten
@item @code{password} (Vorgabe: @code{#f})
Normalerweise lassen Sie dieses Feld auf @code{#f} und initialisieren
Benutzerpasswörter als @code{root} mit dem @command{passwd}-Befehl. Die
Benutzer lässt man ihr eigenes Passwort dann mit @command{passwd}
ändern. Mit @command{passwd} festgelegte Passwörter bleiben natürlich beim
Neustarten und beim Rekonfigurieren erhalten.

Wenn Sie aber @emph{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 @code{crypt} benutzen.

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

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

@quotation Anmerkung
Der Hash dieses initialen Passworts wird in einer Datei im @file{/gnu/store}
abgelegt, auf die alle Benutzer Lesezugriff haben, daher ist Vorsicht
geboten, wenn Sie diese Methode verwenden.
@end quotation

Siehe @ref{Passphrase Storage,,, libc, Referenzhandbuch der
GNU-C-Bibliothek} für weitere Informationen über Passwortverschlüsselung und
@ref{Encryption,,, guile, Referenzhandbuch zu GNU Guile} für Informationen
über die Prozedur @code{crypt} in Guile.

@end table
@end deftp

@cindex Gruppen
Benutzergruppen-Deklarationen sind noch einfacher aufgebaut:

@lisp
(user-group (name "students"))
@end lisp

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

@table @asis
@item @code{name}
Der Name der Gruppe.

@item @code{id} (Vorgabe: @code{#f})
Der Gruppenbezeichner (eine Zahl). Wird er als @code{#f} angegeben, wird
automatisch eine neue Zahl reserviert, wenn die Gruppe erstellt wird.

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

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

@end table
@end deftp

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

@defvar %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“.
@end defvar

@defvar %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.
@end defvar

@cindex containers, subordinate IDs
The Linux kernel also implements @dfn{subordinate user and group IDs}, or
``subids'', which are used to map the ID of a user and group to several IDs
inside separate name spaces---inside ``containers''.
@xref{subordinate-user-group-ids, the subordinate user and group ID
service}, for information on how to configure it.

@node Tastaturbelegung
@section Tastaturbelegung

@cindex Tastaturbelegung
@cindex Keymap
Um anzugeben, was jede Taste auf Ihrer Tastatur tut, müssen Sie angeben,
welche @dfn{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.

@cindex Tastaturbelegung, Definition
Die Informationen über Ihre Tastaturbelegung werden an drei Stellen
gebraucht:

@itemize
@item
Der @emph{Bootloader} muss auslesen können, welche Tastaturbelegung Sie
benutzen möchten (siehe @ref{Bootloader-Konfiguration,
@code{keyboard-layout}}). Das ist praktisch, wenn Sie zum Beispiel die
Passphrase Ihrer verschlüsselten Wurzelpartition mit der richtigen
Tastaturbelegung eintippen wollen.

@item
Der @emph{Kernel des Betriebssystems}, Linux, braucht die Information, damit
die Konsole richtig eingestellt ist (siehe @ref{„operating-system“-Referenz,
@code{keyboard-layout}}).

@item
Der @emph{grafische Anzeigeserver}, meistens ist das Xorg, hat auch seine
eigene Konfiguration der Tastaturbelegung (siehe @ref{X Window,
@code{keyboard-layout}}).
@end itemize

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.

@cindex XKB, Tastaturbelegungen
Tastaturbelegungen werden durch Verbundsobjekte repräsentiert, die mit der
Prozedur @code{keyboard-layout} aus dem Modul @code{(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.

@deffn {Prozedur} keyboard-layout Name [Variante] [#:model] [#:options '()]
Liefert eine neue Tastaturbelegung mit dem angegebenen @var{Name}n in der
@var{Variante}.

Der @var{Name} muss eine Zeichenkette wie @code{"fr"} sein und die
@var{Variante} eine Zeichenkette wie @code{"bepo"} oder
@code{"nodeadkeys"}. Siehe das Paket @code{xkeyboard-config} für
Informationen, welche Optionen gültig sind.
@end deffn

Hier sind ein paar Beispiele:

@lisp
;; 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")
@end lisp

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

@cindex Tastaturbelegung, Konfiguration
Sagen wir, Sie würden gerne die türkische Tastaturbelegung für Ihr gesamtes
System@tie{}– Bootloader, Konsole und Xorg@tie{}– verwenden. Dann würde Ihre
Systemkonfiguration so aussehen:

@findex set-xorg-configuration
@lisp
;; 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)
                (targets '("/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)))
@end lisp

Im obigen Beispiel beziehen wir uns für GRUB und Xorg einfach auf das
@code{keyboard-layout}-Feld, was wir darüber definiert haben, wir könnten
aber auch eine andere Tastaturbelegung angeben. Die Prozedur
@code{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 @emph{Voreinstellung}
für die Tastaturbelegung ausgewählt werden kann, die das System annimmt,
wenn es startet, aber zur Laufzeit kann sie geändert werden:

@itemize
@item
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.

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

@example
setxkbmap us dvorak
@end example

@item
Mit dem Befehl @code{loadkeys} ändern Sie die für die Linux-Konsole geltende
Tastaturbelegung. Allerdings ist zu beachten, dass @code{loadkeys}
@emph{nicht} die Kategorisierung der Tastaturbelegungen von XKB benutzt. Der
Befehl, um die französische Bépo-Belegung zu laden, wäre folgender:

@example
loadkeys fr-bepo
@end example
@end itemize

@node Locales
@section Locales

@cindex Locale
Eine @dfn{Locale} legt die kulturellen Konventionen einer bestimmten Sprache
und Region auf der Welt fest (siehe @ref{Locales,,, libc, Referenzhandbuch
der GNU-C-Bibliothek}). Jede Locale hat einen Namen, der typischerweise von
der Form @code{@var{Sprache}_@var{Gebiet}.@var{Kodierung}}@tie{}– z.B.@:
benennt @code{fr_LU.utf8} die Locale für französische Sprache mit den
kulturellen Konventionen aus Luxemburg unter Verwendung der UTF-8-Kodierung.

@cindex Locale-Definition
Normalerweise werden Sie eine standardmäßig zu verwendende Locale für die
Maschine vorgeben wollen, indem Sie das @code{locale}-Feld der
@code{operating-system}-Deklaration verwenden (siehe @ref{„operating-system“-Referenz, @code{locale}}).

Die ausgewählte Locale wird automatisch zu den dem System bekannten
@dfn{Locale-Definitionen} hinzugefügt, falls nötig, und ihre Kodierung wird
aus dem Namen hergeleitet@tie{}– z.B.@: wird angenommen, dass
@code{bo_CN.utf8} als Kodierung @code{UTF-8} verwendet. Zusätzliche
Locale-Definitionen können im Feld @code{locale-definitions} vom
@code{operating-system} festgelegt werden@tie{}– 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:

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

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

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

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

Die @code{locale-definition}-Form wird vom Modul @code{(gnu system locale)}
zur Verfügung gestellt.  Details folgen unten.

@deftp {Datentyp} locale-definition
Dies ist der Datentyp einer Locale-Definition.

@table @asis

@item @code{name}
Der Name der Locale. Siehe @ref{Locale Names,,, libc, Referenzhandbuch der
GNU-C-Bibliothek} für mehr Informationen zu Locale-Namen.

@item @code{source}
Der Name der Quelle der Locale. Typischerweise ist das der Teil
@code{@var{Sprache}_@var{Gebiet}} des Locale-Namens.

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

@end table
@end deftp

@defvar %default-locale-definitions
Eine Liste häufig benutzter UTF-8-Locales, die als Vorgabewert des
@code{locale-definitions}-Feldes in @code{operating-system}-Deklarationen
benutzt wird.

@cindex Locale-Name
@cindex Normalisiertes Codeset in Locale-Namen
Diese Locale-Definitionen benutzen das @dfn{normalisierte Codeset} für den
Teil des Namens, der nach dem Punkt steht (siehe @ref{Using gettextized
software, normalisiertes Codeset,, libc, Referenzhandbuch der
GNU-C-Bibliothek}). Zum Beispiel ist @code{uk_UA.utf8} enthalten, dagegen
ist etwa @code{uk_UA.UTF-8} darin @emph{nicht} enthalten.
@end defvar

@subsection Kompatibilität der Locale-Daten

@cindex Inkompatibilität, von Locale-Daten
@code{operating-system}-Deklarationen verfügen über ein
@code{locale-libcs}-Feld, um die GNU@tie{}libc-Pakete anzugeben, die zum
Kompilieren von Locale-Deklarationen verwendet werden sollen (siehe
@ref{„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.

@c See <https://sourceware.org/ml/libc-alpha/2015-09/msg00575.html>
@c and <https://lists.gnu.org/archive/html/guix-devel/2015-08/msg00737.html>.
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
@emph{terminiert}, statt einfach die inkompatiblen Locale-Daten zu
ignorieren@footnote{Versionen 2.23 von GNU@tie{}libc und neuere werden
inkompatible Locale-Daten nur mehr überspringen, was schon einmal eine
Verbesserung ist.}. Ähnlich kann ein an libc 2.22 gebundenes Programm die
meisten, aber nicht alle, Locale-Daten von libc 2.21 lesen (Daten zu
@env{LC_COLLATE} sind aber zum Beispiel inkompatibel); somit schlagen
Aufrufe von @code{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
@env{GUIX_LOCPATH} entsprechend definieren (siehe @ref{locales-and-locpath,
@env{GUIX_LOCPATH} und Locale-Pakete}).

Trotzdem ist es am besten, wenn die systemweiten Locale-Daten unter
@file{/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@tie{}– was auf einem Mehrbenutzersystem ganz besonders
wichtig ist. Dazu kann der Administrator des Systems mehrere libc-Pakete im
@code{locale-libcs}-Feld vom @code{operating-system} angeben:

@lisp
(use-package-modules base)

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

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
@file{/run/current-system/locale} hat.


@node Dienste
@section Dienste

@cindex Systemdienste
Ein wichtiger Bestandteil des Schreibens einer
@code{operating-system}-Deklaration ist das Auflisten der
@dfn{Systemdienste} und ihrer Konfiguration (siehe @ref{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@tie{}–
wie das Konfigurieren des Netzwerkzugangs.

Guix hat eine weit gefasste Definition, was ein „Dienst“ ist (siehe
@ref{Dienstkompositionen}), aber viele Dienste sind solche, die von
GNU@tie{}Shepherd verwaltet werden (siehe @ref{Shepherd-Dienste}). Auf
einem laufenden System kann der @command{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 @ref{Jump
Start,,, shepherd, The GNU Shepherd Manual}). Zum Beispiel:

@example
# herd status
@end example

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

@example
# 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.
@end example

Die Unterbefehle @command{start}, @command{stop} und @command{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:

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

@cindex configuration, Aktion bei Shepherd-Diensten
@cindex Konfigurationsdatei, bei Shepherd-Diensten
Für einige Dienste wird mit @command{herd configuration} der Name der
Konfigurationsdatei des Dienstes ausgegeben. Das ist sinnvoll, wenn Sie die
benutzte Konfigurationsdatei untersuchen möchten:

@example
# herd configuration sshd
/gnu/store/…-sshd_config
@end example

Die folgenden Abschnitte dokumentieren die verfügbaren Dienste, die in einer
@code{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::             Alte Protokolle archivieren und löschen.
* Netzwerkeinrichtung::      Netzwerkschnittstellen verbinden.
* Netzwerkdienste::          Firewall, 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.
* Dateisuch-Dienste::        Um nach Dateien suchen zu können.
* 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.
* High Availability Services::  High availability services.
* Zertifikatsdienste::       TLS-Zertifikate via Let’s Encrypt.
* DNS-Dienste::              DNS-Daemons.
* VNC-Dienste::              VNC-Daemons.
* VPN-Dienste::              VPN-Daemons.
* Network File System::      Dienste mit Bezug zum Netzwerkdateisystem.
* Samba-Dienste::            Dienste zu Samba.
* Kontinuierliche Integration::  Cuirass- und Laminar-Dienste.
* Dienste zur Stromverbrauchsverwaltung::  Den Akku schonen, etc.
* 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.
@end menu

@node Basisdienste
@subsection Basisdienste

Das Modul @code{(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.

@defvar %base-services
Diese Variable enthält eine Liste von Basis-Diensten, die man auf einem
System vorzufinden erwartet (siehe @ref{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 @code{services}-Feld für die Dienste von
@code{operating-system}-Deklarationen. Normalerweise werden Sie, wenn Sie
ein Betriebssystem anpassen, Dienste an die @code{%base-services}-Liste
anhängen, wie hier gezeigt:

@lisp
(append (list (service avahi-service-type)
              (service openssh-service-type))
        %base-services)
@end lisp
@end defvar

@defvar special-files-service-type
Dieser Dienst richtet „besondere Dateien“ wie @file{/bin/sh} ein; eine
Instanz des Dienstes ist Teil der @code{%base-services}.

Der mit @code{special-files-service-type}-Diensten assoziierte Wert muss
eine Liste von zweielementigen Listen sein, deren erstes Element eine
„besondere Datei“ und deren zweites Element deren Zielpfad ist. Der
Vorgabewert ist:

@cindex @file{/bin/sh}
@cindex @file{sh}, in @file{/bin}
@lisp
`(("/bin/sh" ,(file-append bash "/bin/sh"))
  ("/usr/bin/env" ,(file-append coreutils "/bin/env")))
@end lisp

@cindex @file{/usr/bin/env}
@cindex @file{env}, in @file{/usr/bin}
Wenn Sie zum Beispiel auch @code{/bin/bash} zu Ihrem System hinzufügen
möchten, können Sie den Wert ändern auf:

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

Da dieser Dienst Teil der @code{%base-services} ist, können Sie
@code{modify-services} benutzen, um die Liste besonderer Dateien abzuändern
(siehe @ref{Service-Referenz, @code{modify-services}}). Die leichte
Alternative, um eine besondere Datei hinzuzufügen, ist über die Prozedur
@code{extra-special-file} (siehe unten).
@end defvar

@deffn {Prozedur} extra-special-file Datei Ziel
Das @var{Ziel} als „besondere Datei“ @var{Datei} verwenden.

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

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

This procedure is meant for @code{/bin/sh}, @code{/usr/bin/env} and similar
targets.  In particular, use for targets under @code{/etc} might not work as
expected if the target is managed by Guix in other ways.

Die besonderen Dateien bleiben auf Ihrem System bestehen, auch nachdem Sie
den @code{extra-special-file}-Aufruf schon aus Ihrer Systemkonfiguration
entfernt und das System rekonfiguriert haben. Sie müssen die besonderen
Dateien manuell entfernen.
@end deffn

@defvar host-name-service-type
Diensttyp für einen Dienst, der den Rechnernamen (den „Host“-Namen des
Rechners) systemweit festlegt. Als Wert muss eine Zeichenkette angegeben
werden. Vorgegeben ist, dass dieser Dienst in einem @code{operating-system}
enthalten ist (siehe
@ref{operating-system-essential-services,@code{essential-services}}).
@end defvar

@defvar 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 @code{kbd}-Paket zur
Verfügung gestellten Schriftart oder ein beliebiges gültiges Argument für
@command{setfont} dienen. Ein Beispiel:

@lisp
`(("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
@end lisp
@end defvar

@defvar hosts-service-type
Der Typ des Dienstes, um Einträge in @file{/etc/hosts} festzulegen. Andere
Dienste können ihn erweitern, indem sie eine Liste von
@code{host}-Verbundsobjekten übergeben.

Das folgende Beispiel zeigt, wie man zwei Einträge zu @file{/etc/hosts}
hinzufügt:

@c TRANSLATORS: The domain names below SHOULD NOT be translated.
@c They're domains reserved for use in documentation. (RFC6761 Section 6.5)
@c The addresses used are explained in RFC3849 and RFC5737.
@lisp
(simple-service 'add-extra-hosts
                hosts-service-type
                (list (host "192.0.2.1" "example.com"
                            '("example.net" "example.org"))
                      (host "2001:db8::1" "example.com"
                            '("example.net" "example.org"))))
@end lisp

@quotation Anmerkung
@cindex @file{/etc/hosts}, vorgegebene Einträge
Vorgegeben ist, dass @file{/etc/hosts} folgende Einträge enthält:
@example
127.0.0.1 localhost @var{Rechnername}
::1       localhost @var{Rechnername}
@end example

Auf den meisten Installationen will man genau das. Wenn Sie allerdings einen
Grund haben, die vorgegebenen Einträge zu ändern, können Sie sie innerhalb
von @code{operating-system} mit @code{modify-services} ändern (siehe
@ref{Service-Referenz,@code{modify-services}}).

Folgendes Beispiel zeigt, wie sich verhindern lässt, dass der eingestellte
@var{Rechnername} dasselbe wie @code{localhost} bedeutet.
@lisp
(operating-system
  ;; …

  (essential-services
   (modify-services
     (operating-system-default-essential-services this-operating-system)
     (hosts-service-type config => (list
                                     (host "127.0.0.1" "localhost")
                                     (host "::1"       "localhost"))))))
@end lisp
@end quotation
@end defvar


@deffn {Prozedur} host @var{Adresse} @var{kanonischer-Rechnername} [@var{Alias-Namen}]
Liefert einen neuen Eintrag für einen Rechnernamen für @var{Adresse} als
@var{kanonischer-Rechnername}, wenn Sie wollen mit weiteren
@var{Alias-Namen}.

@var{Adresse} muss eine Zeichenkette sein, die eine gültige IPv4- oder
IPv6-Adresse angibt. @var{kanonischer-Rechnername} und die Zeichenketten in
der Liste @var{Alias-Namen} müssen gültige Rechnernamen sein.
@end deffn

@defvar login-service-type
Diensttyp für einen Dienst, der die Benutzeranmeldung auf der Konsole
möglich macht. Sein Wert ist ein @code{<login-configuration>}-Objekt.
@end defvar

@deftp {Datentyp} login-configuration
Der Datentyp, der die Konfiguration der Benutzeranmeldung repräsentiert und
unter anderem die beim Anmelden angezeigte Mitteilung des Tages („Message of
the Day“) festlegt.

@table @asis

@item @code{motd}
@cindex Message of the Day
Ein dateiartiges Objekt, das die „Message of the Day“ enthält.

@item @code{allow-empty-passwords?} (Vorgabe: @code{#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.

@end table
@end deftp

@defvar mingetty-service-type
Diensttyp, der Mingetty ausführt, eine Implementierung der Anmeldung auf der
virtuellen Konsole. Der Wert dieses Dienstes ist ein
@code{<mingetty-configuration>}-Objekt.
@end defvar

@deftp {Datentyp} mingetty-configuration
Dieser Datentyp repräsentiert die Konfiguration von Mingetty. Sie legt unter
anderem die Konsole (das „tty“) fest, auf der Mingetty laufen soll.

@table @asis
@item @code{tty}
Der Name der Konsole, auf der diese Mingetty-Instanz läuft@tie{}– z.B.@:
@code{"tty1"}.

@item @code{auto-login} (Vorgabe: @code{#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 @code{#f}, so muss zur Anmeldung ein Benutzername und ein
Passwort eingegeben werden.

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

@item @code{login-pause?} (Vorgabe: @code{#f})
Ist es auf @code{#t} gesetzt, sorgt es in Verbindung mit @var{auto-login}
dafür, dass der Benutzer eine Taste drücken muss, ehe eine Login-Shell
gestartet wird.

@item @code{clear-on-logout?} (Vorgabe: @code{#t})
When set to @code{#t}, the screen will be cleared before showing the login
prompt.  The field name is bit unfortunate, since it controls clearing also
before the initial login, not just after a logout.

@item @code{delay} (Vorgabe: @code{#f})
When set to a number, sleep that many seconds after startup.

@item @code{print-issue} (default: @code{#t})
When set to @code{#t}, write out a new line and the content of
@file{/etc/issue}.  Value of @code{'no-nl} can be used to suppress the new
line.

@item @code{print-hostname} (default: @code{#t})
When set to @code{#t}, print the host name before the login prompt.  The
host name is printed up to the first dot.  Can be set to @code{'long} to
print the full host name.

@item @code{nice} (Vorgabe: @code{#f})
When set to a number, change the process priority using @code{nice}.

@item @code{working-directory} (default: @code{#f})
When set to a string, change into that directory before calling the login
program.

@item @code{root-directory} (default: @code{#f})
When set to a string, use this directory at the process's root directory.

@item @code{shepherd-requirement}
List of shepherd requirements.  Unless you know what you are doing, it is
recommended to extend the default list instead of overriding it.

As an example, when using auto-login on a system with elogind, it is
necessary to wait on the @code{'dbus-system} service:

@lisp
(modify-services %base-services
  (mingetty-service-type config =>
                         (mingetty-configuration
                          (inherit config)
                          ;; Automatically log in as "guest".
                          (auto-login "guest")
                          (shepherd-requirement
                           (cons 'dbus-system
                                 (mingetty-configuration-shepherd-requirement
                                  config))))))
@end lisp

@item @code{mingetty} (Vorgabe: @var{mingetty})
Welches Mingetty-Paket benutzt werden soll.

@end table
@end deftp

@defvar agetty-service-type
Diensttyp eines Dienstes, der agetty ausführt, was Anmeldungen auf einer
virtuellen oder seriellen Konsole implementiert. Der Wert dieses Dienstes
ist ein @code{<agetty-configuration>}-Objekt.
@end defvar

@deftp {Datentyp} agetty-configuration
Dieser Datentyp repräsentiert die Konfiguration von agetty. Sie legt unter
anderem die Konsole (das „tty“) fest, auf der agetty laufen
soll@footnote{Siehe die Handbuchseite @code{agetty(8)} für mehr
Informationen.}.

@table @asis
@item @code{tty}
Der Name der Konsole, auf der diese Instanz von agetty läuft, als
Zeichenkette@tie{}– z.B.@: @code{"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
@code{agetty.tty} festgelegt wurde, der Gerätename daraus für agetty
extrahiert und benutzt.

Andernfalls wird agetty, falls auf der Kernel-Befehlszeile eine Option
@code{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.

@item @code{baud-rate} (Vorgabe: @code{#f})
Eine Zeichenkette, die aus einer kommagetrennten Liste von einer oder
mehreren Baud-Raten besteht, absteigend sortiert.

@item @code{term} (Vorgabe: @code{#f})
Eine Zeichenkette, die den Wert enthält, der für die Umgebungsvariable
@env{TERM} benutzt werden soll.

@item @code{eight-bits?} (Vorgabe: @code{#f})
Steht dies auf @code{#t}, wird angenommen, dass das TTY 8-Bit-korrekt ist,
so dass die Paritätserkennung abgeschaltet wird.

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

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

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

@item @code{remote?} (Vorgabe: @code{#f})
Ist dies auf @code{#t} gesetzt, wird in Verbindung mit @var{host} eine
Befehlszeilenoption @code{-r} für einen falschen Rechnernamen („Fakehost“)
in der Befehlszeile des mit @var{login-program} angegebenen Anmeldeprogramms
übergeben.

@item @code{flow-control?} (Vorgabe: @code{#f})
Ist dies auf @code{#t} gesetzt, wird Hardware-Flusssteuerung (RTS/CTS)
aktiviert.

@item @code{no-issue?} (Vorgabe: @code{#f})
Ist dies auf @code{#t} gesetzt, wird der Inhalt der Datei @file{/etc/issue}
@emph{nicht} angezeigt, bevor die Anmeldeaufforderung zu sehen ist.

@item @code{init-string} (Vorgabe: @code{#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.

@item @code{no-clear?} (Vorgabe: @code{#f})
Ist dies auf @code{#t} gesetzt, wird agetty den Bildschirm @emph{nicht}
löschen, bevor es die Anmeldeaufforderung anzeigt.

@item @code{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 @command{login} aus dem Shadow-Werkzeugsatz
verwendet wird.

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

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

@item @code{skip-login?} (Vorgabe: @code{#f})
Ist dies auf @code{#t} gesetzt, wird der Benutzer nicht aufgefordert, einen
Anmeldenamen einzugeben. Dies kann zusammen mit dem @var{login-program}-Feld
benutzt werden, um nicht standardkonforme Anmeldesysteme zu benutzen.

@item @code{no-newline?} (Vorgabe: @code{#f})
Ist dies auf @code{#t} gesetzt, wird @emph{kein} Zeilenumbruch ausgegeben,
bevor die Datei @file{/etc/issue} ausgegeben wird.

@c Is this dangerous only when used with login-program, or always?
@item @code{login-options} (Vorgabe: @code{#f})
Dieses Feld akzeptiert eine Zeichenkette mit den Befehlszeilenoptionen für
das Anmeldeprogramm. Beachten Sie, dass bei einem selbst gewählten
@var{login-program} ein böswilliger Nutzer versuchen könnte, als
Anmeldenamen etwas mit eingebetteten Befehlszeilenoptionen anzugeben, die
vom Anmeldeprogramm interpretiert werden könnten.

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

@item @code{chroot} (Vorgabe: @code{#f})
Wechselt die Wurzel des Dateisystems auf das angegebene Verzeichnis. Dieses
Feld akzeptiert einen Verzeichnispfad als Zeichenkette.

@item @code{hangup?} (Vorgabe: @code{#f})
Mit dem Linux-Systemaufruf @code{vhangup} auf dem angegebenen Terminal
virtuell auflegen.

@item @code{keep-baud?} (Vorgabe: @code{#f})
Ist dies auf @code{#t} gesetzt, wird versucht, die bestehende Baud-Rate
beizubehalten. Die Baud-Raten aus dem Feld @var{baud-rate} werden benutzt,
wenn agetty ein @key{BREAK}-Zeichen empfängt.

@item @code{timeout} (Vorgabe: @code{#f})
Ist dies auf einen ganzzahligen Wert gesetzt, wird terminiert, falls kein
Benutzername innerhalb von @var{timeout} Sekunden eingelesen werden konnte.

@item @code{detect-case?} (Vorgabe: @code{#f})
Ist dies auf @code{#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 @emph{keine} Unicode-Zeichen unterstützt
werden.

@item @code{wait-cr?} (Vorgabe: @code{#f})
Wenn dies auf @code{#t} gesetzt ist, wird gewartet, bis der Benutzer oder
das Modem einen Wagenrücklauf („Carriage Return“) oder einen Zeilenvorschub
(„Linefeed“) absendet, ehe @file{/etc/issue} oder eine Anmeldeaufforderung
angezeigt wird. Dies wird typischerweise zusammen mit dem Feld
@var{init-string} benutzt.

@item @code{no-hints?} (Vorgabe: @code{#f})
Ist es auf @code{#t} gesetzt, werden @emph{keine} Hinweise zu den
Feststelltasten Num-Taste, Umschaltsperre („Caps Lock“) und Rollen-Taste
(„Scroll Lock“) angezeigt.

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

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

@item @code{erase-characters} (Vorgabe: @code{#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.

@item @code{kill-characters} (Vorgabe: @code{#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.

@item @code{chdir} (Vorgabe: @code{#f})
Dieses Feld akzeptiert eine Zeichenkette, die einen Verzeichnispfad angibt,
zu dem vor der Anmeldung gewechselt wird.

@item @code{delay} (Vorgabe: @code{#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.

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

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

@item @code{shepherd-requirement} (Vorgabe: @code{'()})
Mit dieser Option können zusätzliche Shepherd-Anforderungen für die
einzelnen @code{'term-}*-Shepherd-Dienste festgelegt werden (zum Beispiel
@code{'syslogd}).

@end table
@end deftp

@defvar kmscon-service-type
Diensttyp für
@uref{https://www.freedesktop.org/wiki/Software/kmscon,kmscon}, was das
Anmelden auf virtuellen Konsolen ermöglicht. Der Wert des Dienstes mit
diesem Typ ist ein @code{<kmscon-configuration>}-Objekt.
@end defvar

@deftp {Datentyp} kmscon-configuration
Dieser Datentyp repräsentiert die Konfiguration von Kmscon, die unter
anderem angibt, auf welchem TTY es ausgeführt werden soll.

@table @asis
@item @code{virtual-terminal}
Der Name der Konsole, auf der diese Kmscon läuft@tie{}– z.B.@:
@code{"tty1"}.

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

@item @code{login-arguments} (Vorgabe: @code{'("-p")})
Eine Liste der Argumente, die an @command{login} übergeben werden sollen.

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

@item @code{hardware-acceleration?} (Vorgabe: #f)
Ob Hardware-Beschleunigung verwendet werden soll.

@item @code{font-engine} (Vorgabe: @code{"pango"})
Welcher Schriftartentreiber in Kmscon benutzt wird.

@item @code{font-size} (Vorgabe: @code{12})
Welche Schriftgröße in Kmscon benutzt wird.

@item @code{keyboard-layout} (Vorgabe: @code{#f})
Wenn es auf @code{#f} gesetzt ist, benutzt Kmscon die voreingestellte
Tastaturbelegung, also normalerweise US English („QWERTY“) für eine
PC-Tastatur mit 105 Tasten.

Andernfalls muss hier ein @code{keyboard-layout}-Objekt stehen, das angibt,
welche Tastaturbelegung aktiv sein soll. Siehe @ref{Tastaturbelegung} für
mehr Informationen, wie die Tastaturbelegung angegeben werden kann.

@item @code{kmscon} (Vorgabe: @var{kmscon})
Das Kmscon-Paket, das benutzt werden soll.

@end table
@end deftp

@cindex @abbr{nscd, Name Service Cache Daemon}
@defvar nscd-service-type
Dies ist der Diensttyp für den @abbr{nscd, Name Service Cache Daemon} aus
der libc. Der Wert des Dienstes ist ein @code{<nscd-configuration>}-Objekt.

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

@table @code
@item invalidate
@cindex nscd, Ungültigmachen des Zwischenspeichers
@cindex Zwischenspeicher ungültig machen, nscd
Dies macht den angegebenen Zwischenspeicher ungültig. Wenn Sie zum Beispiel:

@example
herd invalidate nscd hosts
@end example

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

@item statistics
Wenn Sie @command{herd statistics nscd} ausführen, werden Ihnen
Informationen angezeigt, welche Ihnen Informationen über den nscd-Zustand
und die Zwischenspeicher angezeigt.
@end table
@end defvar

@deftp {Datentyp} nscd-configuration
Dieser Datentyp repräsentiert die Konfiguration des @abbr{nscd, Name Service
Cache Daemon}.

@table @asis

@item @code{name-services} (Vorgabe: @code{'()})
Liste von Paketen, die @dfn{Namensdienste} bezeichnen, die für den nscd
sichtbar sein müssen, z.B.@: @code{(list @var{nss-mdns})}.

@item @code{glibc} (Vorgabe: @var{glibc})
Ein Paket-Objekt, das die GNU-C-Bibliothek angibt, woraus der
@command{nscd}-Befehl genommen werden soll.

@item @code{log-file} (Vorgabe: @code{#f})
Name of the nscd log file.  Debugging output goes to that file when
@code{debug-level} is strictly positive, or to standard error if it is
@code{#f}.  Regular messages are written to syslog when @code{debug-level}
is zero, regardless of the value of @code{log-file}.

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

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

@end table
@end deftp

@deftp {Datentyp} nscd-cache
Ein Datentyp, der eine Zwischenspeicher-Datenbank von nscd mitsamt ihren
Parametern definiert.

@table @asis

@item @code{Datenbank}
Dies ist ein Symbol, was den Namen der Datenbank repräsentiert, die
zwischengespeichert werden soll. Gültige Werte sind @code{passwd},
@code{group}, @code{hosts} und @code{services}, womit jeweils die
entsprechende NSS-Datenbank bezeichnet wird (siehe @ref{NSS Basics,,, libc,
Referenzhandbuch der GNU-C-Bibliothek}).

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

@item @code{check-files?} (Vorgabe: @code{#t})
Ob auf Änderungen an den der @var{database} entsprechenden Dateien reagiert
werden soll.

Wenn @var{database} zum Beispiel @code{hosts} ist, wird, wenn dieses Feld
gesetzt ist, nscd Änderungen an @file{/etc/hosts} beobachten und
berücksichtigen.

@item @code{persistent?} (Vorgabe: @code{#t})
Ob der Zwischenspeicher dauerhaft auf der Platte gespeichert werden soll.

@item @code{shared?} (Vorgabe: @code{#t})
Ob der Zwischenspeicher zwischen den Nutzern geteilt werden soll.

@item @code{max-database-size} (Vorgabe: 32@tie{}MiB)
Die Maximalgröße des Datenbank-Zwischenspeichers in Bytes.

@c XXX: 'suggested-size' and 'auto-propagate?' seem to be expert
@c settings, so leave them out.

@end table
@end deftp

@defvar %nscd-default-caches
Liste von @code{<nscd-cache>}-Objekten, die von der vorgegebenen
@code{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@tie{}– oftmals befindet sich das
Ergebnis einer Anfrage nach einem Rechnernamen bereits im lokalen
Zwischenspeicher und externe Namens-Server müssen nicht miteinbezogen
werden.
@end defvar

@cindex syslog, with external syslogd
@cindex logging, syslog
@defvar syslog-service-type
Type of the service that runs the syslog daemon (@command{syslogd}), whose
value is a @code{<syslog-configuration>} object (see below).

@quotation Anmerkung
Dieser Dienst ist redundant und größtenteils abgelöst durch
@code{shepherd-system-log-service-type} (siehe @ref{shepherd-system-log,
Shepherd Systemprotokoll @code{system-log}}).
@end quotation
@end defvar

Wenn eine geänderte @code{syslog-configuration} nach dem Rekonfigurieren
Ihres Systems in Kraft treten soll, sollten Sie bevorzugt die
@samp{reload}-Aktion benutzen, statt den Dienst neu zu starten, weil viele
Dienste von Syslog abhängen und das auch viele Dienste wie die
Anmeldeverwaltung neu starten lassen würde:

@example
# herd reload syslog
@end example

Das sorgt dafür, dass der schon laufende @command{syslogd}-Prozess seine
Konfiguration neu lädt.

@deftp {Datentyp} syslog-configuration
Dieser Datentyp repräsentiert die Konfiguration des syslog-Daemons.

@table @asis
@item @code{syslogd} (Vorgabe: @code{#~(string-append #$inetutils "/libexec/syslogd")})
Welcher Syslog-Daemon benutzt werden soll.

@item @code{config-file} (Vorgabe: @code{%default-syslog.conf})
Die zu benutzende syslog-Konfigurationsdatei. Siehe @ref{syslogd
invocation,,, inetutils, GNU Inetutils} für weitere Informationen über die
Syntax der Konfiguration.

@item @code{extra-options} (Vorgabe: @code{'()})
List of extra command-line options for @command{syslog}.

@end table
@end deftp

@defvar guix-service-type
Dies ist der Typ für den Dienst, der den Erstellungs-Daemon
@command{guix-daemon} ausführt (siehe @ref{Aufruf des guix-daemon}). Als Wert
muss ein @code{guix-configuration}-Verbundsobjekt verwendet werden, wie
unten beschrieben.
@end defvar

@anchor{guix-configuration-type}
@deftp {Datentyp} guix-configuration
Dieser Datentyp repräsentiert die Konfiguration des Erstellungs-Daemons von
Guix. Siehe @ref{Aufruf des guix-daemon} für weitere Informationen.

@table @asis
@item @code{guix} (Vorgabe: @var{guix})
Das zu verwendende Guix-Paket. Siehe @ref{Anpassung des systemweiten Guix},
um zu erfahren, wie Sie ein Paket zusammen mit Kanälen voreinstellen.

@cindex unprivileged @command{guix-daemon}
@cindex rootless @command{guix-daemon}
@item @code{privileged?} (default: @code{#t})
Whether to run @command{guix-daemon} as root.

When true, @command{guix-daemon} runs with root privileges and build
processes run under unprivileged user accounts as specified by
@code{build-group} and @code{build-accounts} (see below); when false,
@command{guix-daemon} run as the @code{guix-daemon} user, which is
unprivileged, and so do build processes.  The unprivileged or ``rootless''
mode can reduce the impact of some classes of vulnerabilities that could
affect the daemon.

The default is currently @code{#t} (@command{guix-daemon} runs with root
privileges) but may eventually be changed to @code{#f}.

@quotation Warnung
When changing this option, @file{/gnu/store}, @file{/var/guix}, and
@file{/etc/guix} have their ownership automatically changed by the
@code{guix-ownership} service to either the @code{guix-daemon} user or the
@code{root} user (@pxref{unprivileged-daemon-migration}).

Das kann eine Weile dauern, besonders wenn der Store groß ist. Es kann nicht
unterbrochen werden und @command{guix-daemon} kann nicht benutzt werden, bis
die Änderung abgeschlossen ist.
@end quotation

@xref{Einrichten der Erstellungsumgebung}, for more information on the two ways to run
@command{guix-daemon}.

@item @code{build-group} (Vorgabe: @code{"guixbuild"})
Der Name der Gruppe, zu der die Erstellungs-Benutzerkonten gehören.

@item @code{build-accounts} (Vorgabe: @code{10})
Die Anzahl zu erzeugender Erstellungs-Benutzerkonten.

@item @code{chroot?} (default: @code{'default})
The value should be one of @code{#t} or @code{#f}, in which case chroot is
enabled or disabled, respectively; or it should be @code{'default}, which
amounts to @code{#f} in Docker containers (so that they can be run in
non-privileged mode)  or @code{#t} otherwise.

@item @code{authorize-key?} (Vorgabe: @code{#t})
@cindex Substitute, deren Autorisierung
Ob die unter @code{authorized-keys} aufgelisteten Substitutschlüssel
autorisiert werden sollen@tie{}– vorgegeben ist, den von
@code{@value{SUBSTITUTE-SERVER-1}} und @code{@value{SUBSTITUTE-SERVER-2}} zu
autorisieren (siehe @ref{Substitute}).

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

@quotation Anmerkung
Wenn Sie ein System mit auf wahr gesetztem @code{authorize-key?} starten
oder dahin rekonfigurieren, wird eine Sicherungskopie der bestehenden
@file{/etc/guix/acl} als @file{/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 @file{/etc/guix/acl}, „in place“, noch
möglich war.
@end quotation

@vindex %default-authorized-guix-keys
@item @code{authorized-keys} (Vorgabe: @code{%default-authorized-guix-keys})
Die Liste der Dateien mit autorisierten Schlüsseln, d.h.@: eine Liste von
Zeichenketten als G-Ausdrücke (siehe @ref{Aufruf von guix archive}). Der
vorgegebene Inhalt ist der Schlüssel von @code{@value{SUBSTITUTE-SERVER-1}}
und @code{@value{SUBSTITUTE-SERVER-2}} (siehe @ref{Substitute}). Siehe im
Folgenden @code{substitute-urls} für ein Beispiel, wie Sie sie ändern
können.

@item @code{use-substitutes?} (Vorgabe: @code{#t})
Ob Substitute benutzt werden sollen.

@item @code{substitute-urls} (Vorgabe: @code{%default-substitute-urls})
Die Liste der URLs, auf denen nach Substituten gesucht wird, wenn nicht
anders angegeben.

Wenn Sie zum Beispiel gerne Substitute von @code{guix.example.org}
zusätzlich zu @code{@value{SUBSTITUTE-SERVER-1}} laden würden, müssen Sie
zwei Dinge tun: Erstens @code{guix.example.org} zu den
@code{substitute-urls} hinzufügen und zweitens dessen Signierschlüssel
autorisieren, nachdem Sie ihn hinreichend geprüft haben (siehe
@ref{Substitut-Server autorisieren}). Mit der Konfiguration unten wird das
erledigt:

@lisp
(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)))
@end lisp

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

@item @code{generate-substitute-key?} (Vorgabe: @code{#t})
Ob ein @dfn{Schlüsselpaar für Substitute} als
@file{/etc/guix/signing-key.pub} und @file{/etc/guix/signing-key.sec}
erzeugt werden soll, wenn noch keines da ist.

Mit dem Schlüsselpaar werden Store-Objekte exportiert, z.B.@: bei
@command{guix publish} (siehe @ref{Aufruf von guix publish}) oder
@command{guix archive} (siehe @ref{Aufruf von guix archive}). Es zu erzeugen
dauert einige Sekunden, wenn genug Entropie vorrätig ist, und ist auch nur
einmal nötig, aber z.B.@: auf virtuellen Maschinen, die so etwas
@emph{nicht} brauchen, schalten Sie es vielleicht lieber aus, wenn die
zusätzliche Zeit beim Systemstart ein Problem darstellt.

@anchor{guix-configuration-channels}
@item @code{channels} (Vorgabe: @code{#f})
Eine Liste der Kanäle, die in @file{/etc/guix/channels.scm} genannt werden
sollen, von wo sie @command{guix pull} nach Vorgabe ausliest (siehe
@ref{Aufruf von guix pull}):

@quotation Anmerkung
Wenn Sie ein System rekonfigurieren, wird eine Sicherungskopie der
bestehenden @file{/etc/guix/channels.scm} als
@file{/etc/guix/channels.scm.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 @file{/etc/guix/channels.scm}, „in place“, noch möglich war.
@end quotation

@item @code{max-silent-time} (Vorgabe: @code{3600})
@itemx @code{timeout} (Vorgabe: @code{(* 3600 24)})
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.

@item @code{log-compression} (Vorgabe: @code{'gzip})
Die für Erstellungsprotokolle zu benutzende Kompressionsmethode@tie{}–
entweder @code{gzip}, @code{bzip2} oder @code{none}.

@item @code{discover?} (Vorgabe: @code{#f})
Ob im lokalen Netzwerk laufende Substitutserver mit mDNS und DNS-SD
ermittelt werden sollen oder nicht.

@anchor{guix-configuration-build-machines}
@item @code{build-machines} (Vorgabe: @code{#f})
In diesem Feld muss entweder @code{#f} stehen oder eine Liste von
G-Ausdrücken, die zu einem @code{build-machine}-Verbundsobjekt oder zu einer
Liste von @code{build-machine}-Verbundsobjekten ausgewertet werden (siehe
@ref{Auslagern des Daemons einrichten}).

Wenn es @code{#f} ist, bleibt die Datei @file{/etc/guix/machines.scm}
unberührt. Ansonsten wird die Liste der G-Ausdrücke in
@file{/etc/guix/machines.scm} geschrieben. Wenn dort bereits eine vorherige
Datei vorgefunden wird, wird eine Sicherungskopie von ihr in
@file{/etc/guix/machines.scm.bak} angelegt. So können Sie die
Erstellungsmaschinen, an die Sie auslagern möchten, direkt in die
Betriebssystemdeklaration schreiben, etwa so:

@lisp
(guix-configuration
  (build-machines
    (list #~(build-machine (name "foo.example.org") …)
          #~(build-machine (name "bar.example.org") …))))
@end lisp

Weitere Erstellungsmaschinen können über den
@code{guix-extension}-Mechanismus hinzugefügt werden (siehe unten).

@item @code{extra-options} (Vorgabe: @code{'()})
Eine Liste zusätzlicher Befehlszeilenoptionen zu @command{guix-daemon}.

@item @code{log-file} (Vorgabe: @code{"/var/log/guix-daemon.log"})
Die Datei, in die die Standardausgabe und die Standardfehlerausgabe von
@command{guix-daemon} geschrieben werden.

@cindex HTTP-Proxy, für @code{guix-daemon}
@cindex Proxy, für HTTP-Zugriffe durch @code{guix-daemon}
@item @code{http-proxy} (Vorgabe: @code{#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 @code{set-http-proxy}-Aktion aufrufen, wodurch er neu
gestartet wird.

@example
herd set-http-proxy guix-daemon http://localhost:8118
@end example

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

@example
herd set-http-proxy guix-daemon
@end example

@item @code{tmpdir} (Vorgabe: @code{#f})
Ein Verzeichnispfad, der angibt, wo @command{guix-daemon} seine Erstellungen
durchführt.

@item @code{environment} (Vorgabe: @code{'()})
Welche Umgebungsvariablen beim Aufruf des Daemons gesetzt sein sollen, als
Liste von Zeichenketten der Form @code{Schlüssel=Wert}.

@item @code{socket-directory-permissions} (Vorgabe: @code{#o755})
Welche Dateiberechtigungen an das Verzeichnis @file{/var/guix/daemon-socket}
vergeben werden sollen. Hiermit, sowie mit @code{socket-directory-group} und
@code{socket-directory-user}, kann festgelegt werden, wer sich mit dem
Erstellungs-Daemon über dessen Unix-Socket verbinden
kann. TCP-Socket-Verbindungen sind hiervon @emph{nicht} betroffen.

@item @code{socket-directory-user} (Vorgabe: @code{#f})
@itemx @code{socket-directory-group} (Vorgabe: @code{#f})
Benutzer und Gruppe, der das Verzeichnis @file{/var/guix/daemon-socket}
gehören soll, oder @code{#f}, um Benutzer und Gruppe beim Administrator root
zu belassen.

@end table
@end deftp

@deftp {Datentyp} guix-extension
Dieser Datentyp repräsentiert die Parameter des Erstellungs-Daemons von
Guix, die erweiterbar sind. Ein Objekt dieses Typs kann als
Diensterweiterung für Guix verwendet werden. Siehe @ref{Dienstkompositionen}
für weitere Informationen.

@table @asis
@item @code{authorized-keys} (Vorgabe: @code{'()})
Eine Liste dateiartiger Objekte, wobei jedes Listenelement einen
öffentlichen Schlüssel enthält.

@item @code{substitute-urls} (Vorgabe: @code{'()})
Eine Liste von Zeichenketten, die jeweils eine URL mit Substituten
enthalten.

@item @code{build-machines} (Vorgabe: @code{'()})
Eine Liste von G-Ausdrücken, die zu @code{build-machine}-Verbundsobjekten
oder zu einer Liste von @code{build-machine}-Verbundsobjekten ausgewertet
werden (siehe @ref{Auslagern des Daemons einrichten}).

Mithilfe dieses Feldes kann ein Dienst geschrieben werden, durch den neue
Erstellungsmaschinen hinzugefügt werden, an die Erstellungen durch den
Daemon ausgelagert werden sollen. Das ist nützlich für Dienste wie die des
Typs @code{hurd-vm-service-type}, womit eine virtuelle GNU/Hurd-Maschine
direkt zum Auslagern eingerichtet wird (siehe @ref{hurd-vm,
@code{hurd-vm-service-type}}).

@item @code{chroot-directories} (Vorgabe: @code{'()})
Eine Liste von dateiartigen Objekten oder Zeichenketten, die Verzeichnisse
anzeigen, die im Erstellungs-Daemon zusätzlich nutzbar sind.
@end table
@end deftp

@defvar udev-service-type
Diensttyp des Dienstes, um udev auszuführen, was zur Laufzeit Gerätedateien
ins Verzeichnis @file{/dev} einfügt. Sein Wert ist ein
@code{<udev-configuration>}-Objekt.

Weil es einen Unterschied macht, welchen Dateinamen eine udev-Regel bzw.@:
eine Hardwarebeschreibungsdatei trägt, ist es notwendig, nicht nur einfache
dateiartige Objekte mit Regeln darin anzugeben, wo der Name ignoriert wird,
sondern die dateiartigen Objekte für Verzeichnisse zu benutzen, wo sich
optional Regeln unter @file{lib/udev/rules.d} und sich optional
Hardwaredateien unter @file{lib/udev/hwdb.d} befinden. So ist es auch
möglich, den Dienst mit ganzen Paketen zu konfigurieren, die Regeln und
hwdb-Dateien enthalten.

Der @code{udev-service-type} kann mit dateiartigen Objekten, die dieser
Hierarchie folgen, @emph{erweitert} werden. Um sie einfach zu erzeugen, gibt
es die Prozeduren @code{udev-rule} und @code{file->udev-rule}, um
udev-Regeln bereitzustellen, sowie @code{udev-hardware} und
@code{file->udev-hardware}, um Hardwarebeschreibungsdateien bereitzustellen.

Innerhalb der Betriebssystemdeklaration kann der Diensttyp mit den
Prozeduren @code{udev-rules-service} and @code{udev-hardware-service}
erweitert werden.
@end defvar

@deftp {Datentyp} udev-configuration
Der Datentyp, der die Konfiguration von udev repräsentiert.

@table @code
@item udev (Vorgabe: @code{eudev}) (Typ: dateiartig)
Das Paketobjekt des udev-Dienstes. Zur Laufzeit wird dieses Paket benutzt
und ist kompiliert für das Zielsystem. Um den Hardware-Index @file{hwdb.bin}
zu erstellen, wird das für das aktuelle System kompilierte Paket auch beim
Erzeugen der Systemdefinition benutzt.

@item debug? (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Whether to enable debug output.  The debug output is written to the system
log, @file{/var/log/messages}.

@item rules (default: @code{'()}) (type: list-of-file-like)
Liste von dateiartigen Objekten mit udev-Regeln in einem Unterverzeichnis.

@item hardware (Vorgabe: @code{'()}) (Typ: Liste-von-Dateiartigen)
Liste von dateiartigen Objekten mit udev-Hardwarebeschreibungsdateien in
einem Unterverzeichnis.

@end table
@end deftp

@deffn {Prozedur} udev-rule @var{Dateiname} @var{Inhalt}
Liefert eine udev-Regeldatei mit dem angegebenen @var{Dateiname}n, in der
die vom Literal @var{Inhalt} definierten Regeln stehen.

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

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

@deffn {Prozedur} udev-hardware @var{Dateiname} @var{Inhalt}
Liefert eine udev-Hardwarebeschreibungsdatei mit dem angegebenen
@var{Dateiname}n, in der die Hardwareinformationen @var{Inhalt} stehen.
@end deffn

@deffn {Prozedur} udev-rules-service @var{Name} @var{Regeln} [#:groups '()]
Liefert einen Dienst, der den Dienst vom Typ @code{udev-service-type} um die
@var{Regeln} erweitert und den Dienst vom Typ @code{account-service-type} um
die unter @code{#:groups} angegebenen Systembenutzergruppen. Dazu wird ein
Diensttyp @code{@var{name}-udev-rules} für den einmaligen Gebrauch erzeugt,
den der zurückgelieferte Dienst instanziiert.

Hier zeigen wir, wie damit @code{udev-service-type} um die vorher definierte
Regel @code{%beispiel-udev-rule} erweitert werden kann.

@lisp
(operating-system
 ;; …
 (services
   (cons (udev-rules-service 'usb-ding %beispiel-udev-rule)
         %desktop-services)))
@end lisp
@end deffn

@deffn {Prozedur} udev-hardware-service @var{Name} @var{Hardware}
Liefert einen Dienst, der den Dienst vom Typ @code{udev-service-type} um die
@var{Hardware} erweitert. Sein Dienstname ist
@code{@var{name}-udev-hardware}.
@end deffn

@deffn {Prozedur} file->udev-rule @var{Dateiname} @var{Datei}
Liefert eine Datei mit udev-Regeln mit dem angegebenen @var{Dateiname}n, in
der alle in der @var{Datei}, einem dateiartigen Objekt, definierten Regeln
stehen.

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

@lisp
(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"))))))
@end lisp
@end deffn

Weil auch Guix-Paketdefinitionen unter den @var{rules} aufgeführt werden
können, um die udev-Regeln um diejenigen Definitionen zu ergänzen, die im
Unterverzeichnis @file{lib/udev/rules.d} des jeweiligen Pakets aufgeführt
sind, hätten wir statt des bisherigen Beispiels zu @var{file->udev-rule}
also auch das Paket @var{android-udev-rules} benutzen können, das in Guix im
Modul @code{(gnu packages android)} vorhanden ist.

@deffn {Prozedur} file->udev-hardware @var{Dateiname} @var{Datei}
Liefert eine udev-Hardwarebeschreibungsdatei mit dem angegebenen
@var{Dateiname}n, in der alle in der @var{Datei}, einem dateiartigen Objekt,
definierten Regeln stehen.
@end deffn

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

@lisp
(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)))
@end lisp

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

@defvar %random-seed-file
Der Name der Datei, in der einige zufällige Bytes vom
@var{urandom-seed-service} abgespeichert werden, um sie nach einem Neustart
von dort als Startwert für @file{/dev/urandom} auslesen zu können. Als
Vorgabe wird @file{/var/lib/random-seed} verwendet.
@end defvar

@cindex Maus
@cindex gpm
@defvar gpm-service-type
Dieser Typ wird für den Dienst verwendet, der GPM ausführt, den
@dfn{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 @code{gpm-configuration} sein
(siehe unten). Dieser Dienst gehört @emph{nicht} zu den
@code{%base-services}.
@end defvar

@deftp {Datentyp} gpm-configuration
Repräsentiert die Konfiguration von GPM.

@table @asis
@item @code{options} (Vorgabe: @code{%default-gpm-options})
Befehlszeilenoptionen, die an @command{gpm} übergeben werden. Die
vorgegebenen Optionen weisen @command{gpm} an, auf Maus-Ereignisse auf der
Datei @file{/dev/input/mice} zu lauschen. Siehe @ref{Command Line,,, gpm,
gpm manual} für weitere Informationen.

@item @code{gpm} (Vorgabe: @code{gpm})
Das GPM-Paket, was benutzt werden soll.

@end table
@end deftp

@anchor{guix-publish-service-type}
@defvar guix-publish-service-type
Dies ist der Diensttyp für @command{guix publish} (siehe @ref{Aufruf von guix publish}). Sein Wert muss ein @code{guix-publish-configuration}-Objekt sein,
wie im Folgenden beschrieben.

Hierbei wird angenommen, dass @file{/etc/guix} bereits ein mit @command{guix
archive --generate-key} erzeugtes Schlüsselpaar zum Signieren enthält (siehe
@ref{Aufruf von guix archive}). Falls nicht, wird der Dienst beim Starten
fehlschlagen.
@end defvar

@deftp {Datentyp} guix-publish-configuration
Der Datentyp, der die Konfiguration des „@code{guix publish}“-Dienstes
repräsentiert.

@table @asis
@item @code{guix} (Vorgabe: @code{guix})
Das zu verwendende Guix-Paket.

@item @code{port} (Vorgabe: @code{80})
Der TCP-Port, auf dem auf Verbindungen gelauscht werden soll.

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

@item @code{advertise?} (Vorgabe: @code{#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 @code{guix-configuration}) diese Instanz von
@command{guix publish} entdecken und Substitute darüber beziehen.

@item @code{compression} (Vorgabe: @code{'(("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 @emph{beiden}, sowohl lzip auf Stufe 7 und gzip auf Stufe 9, zu
komprimieren, schreiben Sie:

@lisp
'(("lzip" 7) ("gzip" 9))
@end lisp

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 @ref{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.

@item @code{nar-path} (Vorgabe: @code{"nar"})
Der URL-Pfad, unter dem „Nars“ zum Herunterladen angeboten werden. Siehe
@ref{Aufruf von guix publish, @option{--nar-path}} für Details.

@item @code{cache} (Vorgabe: @code{#f})
Wenn dies @code{#f} ist, werden Archive nicht zwischengespeichert, sondern
erst bei einer Anfrage erzeugt. Andernfalls sollte dies der Name eines
Verzeichnisses sein@tie{}– z.B.@: @code{"/var/cache/guix/publish"}@tie{}–,
in das @command{guix publish} fertige Archive und Metadaten
zwischenspeichern soll. Siehe @ref{Aufruf von guix publish, @option{--cache}}
für weitere Informationen über die jeweiligen Vor- und Nachteile.

@item @code{workers} (Vorgabe: @code{#f})
Ist dies eine ganze Zahl, gibt es die Anzahl der Worker-Threads an, die zum
Zwischenspeichern benutzt werden; ist es @code{#f}, werden so viele benutzt,
wie es Prozessoren gibt. Siehe @ref{Aufruf von guix publish,
@option{--workers}} für mehr Informationen.

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

@item @code{ttl} (Vorgabe: @code{#f})
Wenn dies eine ganze Zahl ist, bezeichnet sie die @dfn{Time-to-live} als die
Anzahl der Sekunden, die heruntergeladene veröffentlichte Archive
zwischengespeichert werden dürfen. Siehe @ref{Aufruf von guix publish,
@option{--ttl}} für mehr Informationen.

@item @code{negative-ttl} (Vorgabe: @code{#f})
Wenn dies eine ganze Zahl ist, bezeichnet sie die @dfn{Time-to-live} für
erfolglose (negative) Suchen, als Anzahl der Sekunden. Siehe @ref{Aufruf von guix publish, @option{--negative-ttl}} für mehr Informationen.
@end table
@end deftp

@defvar rngd-service-type
Diensttyp des Dienstes, um das @command{rngd}-Programm aus den
@code{rng-tools} auszuführen. Sein Wert ist ein
@code{<rngd-configuration>}-Objekt.
@end defvar

@deftp {Datentyp} rngd-configuration
Datentyp, der die Konfiguration von rngd repräsentiert.

@table @asis
@item @code{rng-tools} (Vorgabe: @code{rng-tools}) (Typ: dateiartig)
Paketobjekt mit dem @command{rngd}-Programm aus den @code{rng-tools}.

@item @code{device} (Vorgabe: @var{"/dev/hwrng"}) (Typ: Zeichenkette)
Der Pfad zum Gerät, das zum Entropie-Pool des Kernels hinzugefügt werden
soll. Dieser Dienst wird fehlschlagen, falls das mit @var{device}
bezeichnete Gerät nicht existiert.<

@end table
@end deftp

@cindex Sitzungs-Limits
@cindex ulimit
@cindex Priorität
@cindex Echtzeit
@cindex jackd
@cindex nofile
@cindex offene Dateideskriptoren
@anchor{pam-limits-service-type}
@defvar pam-limits-service-type
Diensttyp des Dienstes, der eine Konfigurationsdatei für das
@uref{http://linux-pam.org/Linux-PAM-html/sag-pam_limits.html,
@code{pam_limits}-Modul} installiert. Der Wert des Dienstes ist eine Liste
von @code{pam-limits-entry}-Werten, die benutzt werden können, um
@code{ulimit}-Limits und @code{nice}-Prioritäten für Benutzersitzungen
festzulegen. Vorgegeben ist, dass der Wert die leere Liste ist.

Die folgenden Limit-Definitionen setzen zwei harte und weiche Limits für
alle Anmeldesitzungen für Benutzer in der @code{realtime}-Gruppe.

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

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:

@lisp
(service pam-limits-service-type
         (list
          (pam-limits-entry "*" 'both 'nofile 100000)))
@end lisp

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
@emph{nicht} größer als der Höchstwert des Systems ist, der in der Datei
@file{/proc/sys/fs/file-max} zu finden ist, denn sonst könnten sich Benutzer
@emph{nicht} mehr anmelden. Weitere Informationen über Schranken im
Pluggable Authentication Module (PAM) bekommen Sie, wenn Sie die
Handbuchseite im @code{linux-pam}-Paket lesen.
@end defvar

@defvar greetd-service-type
@uref{https://git.sr.ht/~kennylevinsen/greetd, @code{greetd}} ist ein
minimaler und flexibler Daemon zur Anmeldeverwaltung, der @emph{nicht}
voraussetzt, dass zu startende Programme außergewöhnliche Anforderungen
erfüllen müssen.

Wenn Sie etwas von der Shell in einer virtuellen Konsole aufrufen können,
dann kann greetd das auch aufrufen. Wenn dem Programm ein einfaches
JSON-basiertes Protokoll zur Interprozesskommunikation beigebracht werden
kann, kann es für die Anmeldung verwendet werden als „Greeter“.

@code{greetd-service-type} steuert die Infrastruktur bei, um Nutzer
anzumelden. Dazu gehört:

@itemize @bullet
@item
@code{greetd}-PAM-Dienst

@item
Eine besondere Variation von @code{pam-mount}, mit der das
@code{XDG_RUNTIME_DIR}-Verzeichnis eingebunden wird
@end itemize

Hier ist ein Beispiel, wie Sie von @code{mingetty-service-type} auf
@code{greetd-service-type} umsteigen können und wie verschiedene Terminals
eingerichtet werden könnten:

@lisp
  (append
   (modify-services %base-services
     ;; greetd-service-type bringt uns den PAM-Dienst von "greetd"
     (delete login-service-type)
     ;; und er kann mingetty-service-type ersetzen
     (delete mingetty-service-type))
   (list
    (service greetd-service-type
             (greetd-configuration
              (terminals
               (list
                ;; wir haben die Wahl, welches Terminal anfangs aktiv sein soll
                (greetd-terminal-configuration (terminal-vt "1") (terminal-switch #t))
                ;; wir bestimmen, ob in der Umgebung XDG_RUNTIME_DIR gesetzt wird
                ;; und können sogar eigene Umgebungsvariable vorgeben
                (greetd-terminal-configuration
                 (terminal-vt "2")
                 (default-session-command
                   (greetd-agreety-session
                    (command
                     (greetd-user-session
                      (extra-env '(("MEINE_VAR" . "1")))
                      (xdg-env? #f))))))
                ;; wir können eine andere Shell als wie vorgegeben bash benutzen
                (greetd-terminal-configuration
                 (terminal-vt "3")
                 (default-session-command
                   (greetd-agreety-session
                    (command
                     (greetd-user-session
                      (command (file-append zsh "/bin/zsh"))
                      (command-args '("-l"))
                      (extra-env '(("MEINE_VAR" . "1")))
                      (xdg-env? #f))))))
                ;; wir können jeden ausführbaren Befehl zum Greeter machen
                (greetd-terminal-configuration
                 (terminal-vt "4")
                 (default-session-command (program-file "nichts-tun-greeter" #~(exit))))
                (greetd-terminal-configuration (terminal-vt "5"))
                (greetd-terminal-configuration (terminal-vt "6"))))))
    ;; mingetty-service-type kann auch parallel benutzt werden;
    ;; wenn man das will, sollte man (delete login-service-type)
    ;; oben weglassen
    #| (service mingetty-service-type (mingetty-configuration (tty "tty8"))) |#))
@end lisp
@end defvar

@deftp {Datentyp} greetd-configuration
Das Verbundsobjekt mit der Konfiguration des @code{greetd-service-type}.
@table @asis

@item @code{motd}
Ein dateiartiges Objekt, das die „Message of the Day“ enthält.

@item @code{allow-empty-passwords?} (Vorgabe: @code{#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.

@item @code{terminals} (Vorgabe: @code{'()})
Eine Liste von @code{greetd-terminal-configuration} für jedes Terminal, für
das @code{greetd} gestartet werden soll.

@item @code{greeter-supplementary-groups} (Vorgabe: @code{'()})
Die Liste der Gruppen, zu denen das Benutzerkonto @code{greeter} hinzugefügt
werden soll. Zum Beispiel:
@lisp
(greeter-supplementary-groups '("seat" "video"))
@end lisp
Beachten Sie, diese Aktion schlägt fehl, wenn es die Gruppe @code{seat}
nicht gibt.
@end table
@end deftp

@deftp {Datentyp} greetd-terminal-configuration
Verbundsobjekt zur Konfiguration des greetd-Daemons auf einem der Terminals.

@table @asis
@item @code{greetd} (Vorgabe: @code{greetd})
Das zu verwendende greetd-Paket.

@item @code{extra-shepherd-requirement} (Vorgabe: @code{'()})
Mit dieser Option können Sie als eine Liste von Symbolen @emph{zusätzliche}
Shepherd-Dienste benennen, von welchen dieser Dienst abhängen
soll. Beispielsweise geben Sie hier @code{'seatd} oder @code{'elogind} an,
wenn es sich bei der Terminal-Sitzung um einen grafischen Greeter handelt.

@item @code{config-file-name}
Welchen Namen die Konfigurationsdatei des greetd-Daemons bekommen soll. Im
Allgemeinen wird er automatisch aus dem Wert von @code{terminal-vt}
abgeleitet.

@item @code{log-file-name}
Welchen Namen die Protokolldatei des greetd-Daemons bekommen soll. Im
Allgemeinen wird er automatisch aus dem Wert von @code{terminal-vt}
abgeleitet.

@item @code{terminal-vt} (Vorgabe: @samp{"7"})
Auf welchem virtuellen Terminal das hier läuft. Wir empfehlen, ein
bestimmtes VT zu wählen und Konflikte zu vermeiden.

@item @code{terminal-switch} (Vorgabe: @code{#f})
Ob dieses Terminal beim Start von @code{greetd} aktiv gemacht werden soll.

@item @code{source-profile?} (Vorgabe: @code{#t})
Ob @file{/etc/profile} und @file{~/.profile} mit @code{source} geladen
werden sollen, wenn die Dateien existieren.

@item @code{initial-session-user} (default: @samp{#f})
The user to use for running the initial session, if any.

@item @code{initial-session-command} (default: @code{#f})
The command to run the first time the greeter starts up, to auto-login.  For
that to be useful, you should also set @code{initial-session-user}.  Then,
greetd will automatically log in with that user and execute that command.
When you eventually log out again, the regular greeter will appear.

@item @code{default-session-user} (Vorgabe: @samp{"greeter"})
Mit welchem Benutzerkonto der Greeter ausgeführt werden soll.

@item @code{default-session-command} (Vorgabe: @code{(greetd-agreety-session)})
Dafür können Sie entweder eine @code{greetd-agreety-session}, eine
@code{greetd-wlgreet-sway-session} oder eine
@code{greetd-gtkgreet-sway-session} angeben oder ein dateiartiges Objekt als
Greeter benutzen.

@end table
@end deftp

@deftp {Datentyp} greetd-user-session
Verbundsobjekt für die Konfiguration des Befehls für die
Benutzersitzung. Für Greeter muss der Benutzerbefehl auf die eine oder
andere Weise angegeben werden. @code{greetd-user-session} bietet einen
gemeinsamen Befehl dafür. Benutzer sollten POSIX-Shellbefehle wie
@command{bash} bevorzugen, die eine richtige Benutzerterminalshell, eine
Fensterverwaltung oder Desktop-Arbeitsumgebung mit deren eigenem Mechanismus
starten können, zum Beispiel über @file{~/.bashrc} im Fall von Bash.

@table @asis
@item @code{command} (Vorgabe: @code{(file-append bash "/bin/bash")})
Der bei erfolgreicher Anmeldung durch @command{agreety} auszuführende
Befehl.

@item @code{command-args} (Vorgabe: @code{'("-l")})
Die Befehlszeilenargumente, die an den @code{command}-Befehl übergeben
werden.

@item @code{extra-env} (Vorgabe: @code{'()})
Zusätzliche Umgebungsvariable, die bei der Anmeldung gesetzt werden sollen.

@item @code{xdg-session-type} (Vorgabe: @code{"tty"})
Welchen Wert @code{XDG_SESSION_TYPE} haben soll. Die Benutzerumgebung kann
sich abhängig von diesem Wert anders einrichten (normalerweise über
@file{.bashrc} oder Ähnliches).

@item @code{xdg-env?} (Vorgabe: @code{#t})
Wenn es auf wahr steht, werden @code{XDG_RUNTIME_DIR} und
@code{XDG_SESSION_TYPE} gesetzt, bevor @code{command} ausgeführt wird. Es
ist zu bedenken, dass die Variablen in @code{extra-env} sofort anschließend
gesetzt werden und somit Vorrang haben.

@end table
@end deftp

@deftp {Datentyp} greetd-agreety-session
Verbundstyp zur Konfiguration des greetd-Greeters agreety.

@table @asis
@item @code{agreety} (Vorgabe: @code{greetd})
Das Paket mit dem Befehl @command{agreety}.

@item @code{command} (Vorgabe: @code{(greetd-user-session)})
Der bei erfolgreicher Anmeldung durch @command{agreety} auszuführende
Befehl, als Instanz von @code{greetd-user-session}.

@end table
@end deftp

@deftp {Datentyp} greetd-wlgreet-configuration
Allgemeiner Verbundstyp zur Konfiguration des greetd-Greeters wlgreet.

@table @asis
@item @code{output-mode} (Vorgabe: @code{"all"})
Was für die Option @code{outputMode} in die TOML-Konfigurationsdatei
eingetragen wird.

@item @code{scale} (Vorgabe: @code{1})
Was für die Option @code{scale} in die TOML-Konfigurationsdatei eingetragen
wird.

@item @code{background} (Vorgabe: @code{'(0 0 0 0.9)})
Eine RGBA-Liste, die die Hintergrundfarbe der Anmeldeaufforderung angibt.

@item @code{headline} (Vorgabe: @code{'(1 1 1 1)})
Eine RGBA-Liste, die die Farbe der Titelzeile in der Benutzeroberfläche
angibt.

@item @code{prompt} (Vorgabe: @code{'(1 1 1 1)})
Eine RGBA-Liste, die die Farbe von Aufforderungen in der Benutzeroberfläche
angibt.

@item @code{prompt-error} (Vorgabe: @code{'(1 1 1 1)})
Eine RGBA-Liste, die die Farbe von Fehlern in der Benutzeroberfläche angibt.

@item @code{border} (Vorgabe: @code{'(1 1 1 1)})
Eine RGBA-Liste, die die Farbe von Umrandungen in der Benutzeroberfläche
angibt.

@end table
@end deftp

@deftp {Datentyp} greetd-wlgreet-sway-session
Verbundstyp zur auf Sway bezogenen Konfiguration des greetd-Greeters
wlgreet.

@table @asis
@item @code{wlgreet-session} (Vorgabe: @code{(greetd-wlgreet-session)})
Ein Verbundsobjekt vom Typ @code{greetd-wlgreet-session}, das die allgemeine
wlgreet-Konfiguration enthält, zusätzlich zur auf Sway bezogenen
@code{greetd-wlgreet-sway-session}.

@item @code{sway} (Vorgabe: @code{sway})
Das Paket mit dem Befehl @command{sway}.

@item @code{sway-configuration} (Vorgabe: #f)
Ein dateiartiges Objekt, das eine Sway-Konfigurationsdatei enthält, die dem
Pflichtteil der Konfiguration vorangestellt wird.

@item @code{wlgreet} (Vorgabe: @code{wlgreet})
Das Paket mit dem Befehl @command{wlgreet}.

@item @code{wlgreet-configuration} (Vorgabe: @code{(greetd-wlgreet-configuration)})
Die Konfiguration von @code{wlgreet}, repräsentiert als
@code{greetd-wlgreet-configuration}.

@item @code{command} (Vorgabe: @code{(greetd-user-session)})
Der bei erfolgreicher Anmeldung durch @command{wlgreet} auszuführende
Befehl, als Instanz von @code{greetd-user-session}.

@end table

Hier ist ein Beispiel, wie Sie greetd unter Verwendung von wlgreet und Sway
konfigurieren können:

@lisp
  (greetd-configuration
   ;; Der grafische Greeter braucht zusätzliche Gruppenzugehörigkeiten.
   (greeter-supplementary-groups (list "video" "input" "seat"))
   (terminals
    (list (greetd-terminal-configuration
           ;; Sway braucht den seatd-Dienst.
           (extra-shepherd-requirement '(seatd))
           (terminal-vt "1")
           (terminal-switch #t)
           (default-session-command
            (greetd-wlgreet-sway-session
             (sway-configuration
              ;; Optional weitere Sway-Konfigurationen.
              (local-file "sway-greetd.conf"))))))))
@end lisp
@end deftp

@deftp {Datentyp} greetd-gtkgreet-sway-session
Verbundstyp zur Konfiguration des greetd-Greeters gtkgreet. Er wird wie
folgt benutzt:

@lisp
  (greetd-configuration
   ;; Der grafische Greeter braucht zusätzliche Gruppenzugehörigkeiten.
   (greeter-supplementary-groups (list "video" "input" "seat"))
   (terminals
    (list (greetd-terminal-configuration
           ;; Sway braucht den seatd-Dienst.
           (extra-shepherd-requirement '(seatd))
           (terminal-vt "1")
           (terminal-switch #t)
           (default-session-command
            (greetd-gtkgreet-sway-session
             (command
              (greetd-user-session
               ;; Optional wird an .bashrc signalisiert, dass wir gerne den
               ;; Wayland-Compositor hätten.
               (xdg-session-type "wayland")))))))))
@end lisp

@table @asis
@item @code{sway} (Vorgabe: @code{sway})
Das Paket mit den Befehlen @command{sway} und @command{swaymsg}.

@item @code{sway-configuration} (Vorgabe: @code{#f})
Zusätzliche dateiartige Konfiguration für Sway, die eingebunden wird, bevor
der Greeter ausgeführt wird.

@item @code{gtkgreet} (Vorgabe: @code{gtkgreet})
Das Paket mit dem Befehl @command{gtkgreet}.

@item @code{gtkgreet-style} (Vorgabe: @code{#f})
Zusätzliche dateiartige CSS-Stylesheet, um das Aussehen von GTK anzupassen.

@item @code{command} (Vorgabe: @code{(greetd-user-session)})
Der bei erfolgreicher Anmeldung durch @command{gtkgreet} auszuführende
Befehl, als Instanz von @code{greetd-user-session}.

@end table
@end deftp

@node Geplante Auftragsausführung
@subsection Geplante Auftragsausführung

@cindex cron
@cindex Planen von Aufträgen
Oft müssen Sie Systemaufgaben wiederholt laufen lassen. Dazu können Sie
Shepherds @dfn{Timer} verwenden oder den früheren, etwas weniger
vielseitigen mcron-Dienst.

@subsubsection Shepherd-Timer

@cindex Timer, Shepherd
@cindex Shepherd-Timer
Shepherd ermöglicht, Aufträge (sogenannte „Jobs“) wiederholt ausführen zu
lassen, indem Sie @dfn{Timer} definieren, eine besondere Art von Dienst. Ein
Shepherd-Timer kann wie andere Shepherd-Dienste definiert werden, aber mit
bestimmten @code{start}- und @code{stop}-Methoden (siehe @ref{Shepherd-Dienste}):

@lisp
;; Wir definieren einen Timer, auf ausführlich.
(shepherd-service
 (provision '(updatedb))
 (requirement '(user-processes))
 (modules '((shepherd service timer)))
 (start #~(make-timer-constructor
           ;; Täglich um 3 Uhr morgens (in Vixie-cron-Syntax).
           (cron-string->calendar-event "0 3 * * *")
           (command '(#$(file-append findutils "/bin/updatedb")))
           #:wait-for-termination? #t))
 (stop #~(make-timer-destructor))
 (documentation "'updatedb' immer wieder wiederholen.")
 (actions (list shepherd-trigger-action)))
@end lisp

Das ist ganz schön viel zu schreiben, aber es gibt dafür auch eine
gleichbedeutende kurze Schreibweise:

@lisp
;; Gleichbedeutenden Timer definieren in kurz.
(shepherd-timer '(updatedb) "0 3 * * *"
                #~(#$(file-append findutils "/bin/updatedb"))
                #:requirement '(user-processes))
@end lisp

Diese Prozedur ist folgendermaßen definiert:

@anchor{shepherd-timer-procedure}
@deffn {Procedure} shepherd-timer @var{provision} @var{schedule} @
         @var{command} [#:requirement '()] @ [#:documentation
%default-timer-documentation] Return a Shepherd service with the given
@var{provision} periodically running @var{command}, a list-valued gexp,
according to @var{schedule}, a string in Vixie cron syntax or a gexp
providing a Shepherd calendar event.  @var{documentation} is the string that
appears when running @code{herd doc @var{service}}.
@end deffn

The example below shows how to define a timer and to add it to your
operating system configuration.

@lisp
(use-modules (gnu))
(use-service-modules shepherd)
(use-package-modules base)

(define updatedb-timer
  ;; Run 'updatedb' at 3AM everyday.
  (shepherd-timer '(updatedb)
                  "0 3 * * *"  ;Vixie cron syntax
                  #~(#$(file-append findutils "/bin/updatedb")
                     "--prunepaths=/tmp /var/tmp /gnu/store")
                  #:requirement '(user-processes)))

(define garbage-collection-timer
  ;; Run 'guix gc' everyday at 5AM.
  (shepherd-timer '(garbage-collection)
                  #~(calendar-event #:hours '(5) #:minutes '(0))
                  #~("/run/current-system/profile/bin/guix"
                     "gc" "-F" "10G")
                  #:requirement '(guix-daemon)))

(operating-system
  ;; …

  ;; Extend the Shepherd service with additional timers
  ;; using 'simple-service'.
  (services (cons (simple-service 'my-timers
                                   shepherd-root-service-type
                                   (list garbage-collection-timer
                                         updatedb-timer))
                  %base-services)))
@end lisp

The resulting system contains these two services, which can be inspected
with @command{herd status}.  They can also be triggered manually:

@example
herd trigger garbage-collection
@end example

Siehe @ref{Timers,,, shepherd, Handbuch von GNU Shepherd} für weitere
Informationen zu Shepherd-Timern.

@anchor{mcron-service}
@subsubsection Mcron

@cindex mcron
Alternativ enthält das Modul @code{(gnu services mcron)} eine Schnittstelle
zu GNU@tie{}mcron, einem Daemon, der gemäß einem vorher festgelegten
Zeitplan Aufträge ausführt (siehe @ref{Top,,, mcron,
GNU@tie{}mcron}). GNU@tie{}mcron ist ähnlich zum traditionellen
@command{cron}-Daemon aus Unix; der größte Unterschied ist, dass mcron in
Guile Scheme implementiert ist. Es bietet insgesamt weniger Komfort als
Shepherd-Timer: einzelne Aufträge können @emph{nicht} von bestimmten
Shepherd-Diensten abhängen, protokolliert wird nur grob (in einer Datei für
alle Aufträge), die Aufträge kann man dort @emph{nicht} untersuchen,
anpassen oder manuell auslösen.

@quotation Anmerkung
Aus den oben genannten Gründen empfehlen wir, dass Sie Shepherd-Timer
verwenden statt mcron, wenn Sie Aufgaben wiederholen müssen.
@end quotation

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

@lisp
(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 ()
           (system* (string-append #$findutils "/bin/updatedb")
                    "--prunepaths=/tmp /var/tmp /gnu/store"))
         "updatedb"))

(define garbage-collector-job
  ;; Jeden Tag 5 Minuten nach Mitternacht Müll sammeln gehen.
  ;; Die Aktion 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)))
@end lisp

@quotation Tipp
Wenn Sie die Aktion einer Auftragsspezifikation als eine Prozedur angeben,
sollten Sie ausdrücklich einen Namen für den Auftrag im dritten Argument
angeben, wie oben im Beispiel zum @code{updatedb-job} gezeigt. Andernfalls
wird für den Auftrag nur „Lambda function“ in der Ausgabe von @command{herd
schedule mcron} angezeigt, was viel zu wenig Aussagekraft hat!
@end quotation

@quotation Tipp
Benutzen Sie @emph{nicht} die Guile-Prozeduren @code{execl}, @code{execle}
oder @code{execlp} in Auftragsspezifikationen, sonst wäre mcron nicht in der
Lage, auszugeben, mit welchem Status der Auftrag abgeschlossen wurde.
@end quotation

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

@lisp
(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")))))))
@end lisp

Siehe @ref{Guile Syntax, mcron-Auftragsspezifikationen,, mcron,
GNU@tie{}mcron} 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 @code{schedule} des
Dienstes visualisieren lassen, welche mcron-Aufträge als Nächstes ausgeführt
werden:

@example
# herd schedule mcron
@end example

@noindent
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:

@example
# herd schedule mcron 10
@end example

@defvar mcron-service-type
Dies ist der Diensttyp des @code{mcron}-Dienstes. Als Wert verwendet er ein
@code{mcron-configuration}-Objekt.

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

@c Generated via (generate-documentation) at the bottom of (gnu services
@c mcron).
@c %start of fragment
@deftp {Datentyp} mcron-configuration
Verfügbare @code{mcron-configuration}-Felder sind:

@table @asis
@item @code{mcron} (Vorgabe: @code{mcron}) (Typ: dateiartig)
Welches mcron-Paket benutzt werden soll.

@item @code{jobs} (Vorgabe: @code{'()}) (Typ: Liste-von-G-Ausdrücken)
Dies muss eine Liste von G-Ausdrücken sein (siehe @ref{G-Ausdrücke}), die
jeweils einer mcron-Auftragsspezifikation (der Spezifikation eines „Jobs“)
entsprechen (siehe @ref{Syntax, mcron-Auftragsspezifikationen,,
mcron,GNU@tie{}mcron}).

@item @code{log?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Lässt Protokolle auf die Standardausgabe schreiben.

@item @code{log-file} (Vorgabe: @code{"/var/log/mcron.log"}) (Typ: Zeichenkette)
Der Ort der Protokolldatei.

@item @code{log-format} (Vorgabe: @code{"~1@@*~a ~a: ~a~%"}) (Typ: Zeichenkette)
Eine Formatzeichenkette gemäß @code{(ice-9 format)} für die
Protokollnachrichten. Mit dem Vorgabewert werden Nachrichten in der Form
@samp{@var{Prozesskennung} @var{Name}: @var{Nachricht}} geschrieben (siehe
@ref{Invoking mcron, Aufrufen von mcron,, mcron,GNU@tie{}mcron}). Außerdem
schreibt GNU@tie{}Shepherd vor jeder Nachricht einen Zeitstempel.

@item @code{date-format} (Typ: Vielleicht-Zeichenkette)
Formatzeichenkette gemäß @code{(srfi srfi-19)} für das Datum.

@end table
@end deftp
@c %end of fragment

@node Log-Rotation
@subsection Log-Rotation

@cindex Log-Rotation
@cindex Protokollierung
Protokolldateien wie die in @file{/var/log} neigen dazu, bis ins Unendliche
zu wachsen, deshalb ist es eine gute Idee, sie von Zeit zu Zeit zu
@dfn{rotieren}@tie{}– d.h.@: ihren Inhalt in separaten Dateien zu
archivieren, welche optional auch komprimiert werden. Das Modul @code{(gnu
services admin)} stellt eine Schnittstelle zum von Shepherd mitgelieferten
Protokollrotationsdienst bereit (siehe @ref{Log Rotation Service,,,
shepherd, Handbuch von GNU Shepherd Manual}).

Dieser Protokollrotationsdienst wird als @code{log-rotation-service-type}
zur Verfügung gestellt, der ein
@code{log-rotation-configuration}-Verbundsobjekt als dessen Wert
entgegennimmt. In der Vorgabeeinstellung stellt er @code{log-rotation}
bereit, als „zeitgesteuerter Dienst“ (Timer) von Shepherd, der regelmäßig
läuft@tie{}– vorgegeben ist einmal pro Woche. Die von Shepherd-Diensten
erzeugten Protokollfateien erfasst er automatisch und externe
Protokolldateien kann man ihn auch verwalten lassen. Es ist wie immer
möglich, den Dienst zu untersuchen, um zu sehen, wann er laufen wird:

@example
$ sudo herd status log-rotation
Status von log-rotation:
  Es läuft seit Mo 09 Dez 2024 15:27:47 CET (vor 2 Tagen).
  …

Bevorstehende Timer-Alarme:
  So 15 Dez 2024 22:00:00 CET (in 4 Tagen)
  So 22 Dez 2024 22:00:00 CET (in 11 Tagen)
  So 29 Dez 2024 22:00:00 CET (in 18 Tagen)
@end example

Sie können außerdem mit @command{herd files log-rotation} Dateien auflisten,
die rotiert werden sollen, und mit @command{herd trigger log-rotation} eine
Rotation manuell auslösen.

Dieser Dienst gehört zu den @code{%base-services} und ist somit als aktiv
vorgegeben, mit den vorgegebenen Einstellungen.

@defvar log-rotation-service-type
This is the type of the log rotation service.  Its associated value must be
a @code{log-rotation-configuration} record, as discussed below.
@end defvar

@c %start of fragment
@anchor{log-rotation-configuration}

@deftp {Data Type} log-rotation-configuration
Available @code{log-rotation-configuration} fields are:

@table @asis
@item @code{provision} (default: @code{(log-rotation)}) (type: list-of-symbols)
The name(s) of the log rotation Shepherd service.

@item @code{requirement} (default: @code{(user-processes)}) (type: list-of-symbols)
Dependencies of the log rotation Shepherd service.

@item @code{calendar-event} (type: gexp)
Gexp containing the @dfn{calendar event} when log rotation occurs.
@xref{Timers,,,shepherd,The GNU Shepherd Manual}, for more information on
calendar events.

@item @code{external-log-files} (default: @code{()}) (type: list-of-strings)
List of file names, external log files that should also be rotated.

@item @code{compression} (default: @code{zstd}) (type: gexp-or-symbol)
The compression method used for rotated log files, one of @code{'none},
@code{'gzip}, and @code{'zstd}.  Alternatively, it can be a gexp that
evaluates to a procedure; that procedure gets called with the file to be
rotated.

@item @code{expiry} (type: gexp-or-integer)
Age in seconds after which a log file is deleted.

@item @code{size-threshold} (type: gexp-or-integer)
Size in bytes below which a log file is @emph{not} rotated.

@end table

@end deftp


@c %end of fragment

Manche Protokolldateien müssen einfach nur regelmäßig gelöscht werden, wenn
sie alt geworden sind, ohne Sonderfälle und ohne Archivierung. Das trifft
auf Erstellungsprotokolle zu, die @command{guix-daemon} unter
@file{/var/log/guix/drvs} vorhält (siehe @ref{Aufruf des guix-daemon}). Der
Dienst @code{log-cleanup} kann diesen Anwendungsfall übernehmen. Zum
Beispiel ist Folgendes Teil der @code{%base-services} (siehe @ref{Basisdienste}):

@lisp
;; Regelmäßig alte Erstellungsprotokolle löschen.
(service log-cleanup-service-type
         (log-cleanup-configuration
          (directory "/var/log/guix/drvs")))
@end lisp

Dadurch sammeln sich Erstellungsprotokolle @emph{nicht} bis in alle Ewigkeit
an.

@defvar log-cleanup-service-type
Der Diensttyp des Dienstes, um alte Protokolldateien zu löschen. Sein Wert
muss ein @code{log-cleanup-configuration}-Verbundsobjekt sein, wie im
Folgenden beschrieben.
@end defvar

@deftp {Datentyp} log-cleanup-configuration
Der Datentyp repräsentiert die Konfiguration, um Protokolldateien zu
löschen.

@table @asis
@item @code{directory}
Der Name des Verzeichnisses mit den Protokolldateien.

@item @code{expiry} (Vorgabe: @code{(* 6 30 24 3600)})
Nach wie vielen Sekunden eine Datei für die Löschung vorgesehen ist (sechs
Monate nach Vorgabe).

@item @code{schedule} (Vorgabe: @code{"30 12 01,08,15,22 * *"})
Schedule of the log cleanup job written either as a string in traditional
cron syntax or as a gexp representing a Shepherd calendar event
(@pxref{Timers,,, shepherd, The GNU Shepherd Manual}).
@end table
@end deftp

@cindex Protokolle, Anonymisierung
@subheading Anonip-Dienst

Anonip ist ein Datenschutz-Filter, der IP-Adressen aus den Protokollen von
Web-Servern entfernt. Mit diesem Dienst wird eine FIFO erzeugt und jede
Zeile, die in diese hinein geschrieben wird, wird mit anonip gefiltert und
das gefilterte Protokoll in eine Zieldatei übertragen.

Folgendes Beispiel zeigt, wie die FIFO
@file{/var/run/anonip/https.access.log} eingerichtet wird und die gefilterte
Protokolldatei @file{/var/log/anonip/https.access.log} geschrieben wird.

@lisp
(service anonip-service-type
         (anonip-configuration
           (input  "/var/run/anonip/https.access.log")
           (output "/var/log/anonip/https.access.log")))
@end lisp

Richten Sie Ihren Web-Server so ein, dass er seine Protokolle in die FIFO
unter @file{/var/run/anonip/https.access.log} schreibt, und Sie finden die
anonymisierte Protokolldatei in @file{/var/web-logs/https.access.log} vor.

@deftp {Datentyp} anonip-configuration
Dieser Datentyp repräsentiert die Konfiguration von anonip. Zu ihm gehören
folgende Parameter:

@table @asis
@item @code{anonip} (Vorgabe: @code{anonip})
Das anonip-Paket, das benutzt werden soll.

@item @code{input}
Der Dateiname der zu verarbeitenden Eingabeprotokolldatei. Durch den Dienst
wird eine FIFO erzeugt, die diesen Namen trägt. Der Web-Server sollte seine
Protokolle in diese FIFO hinein schreiben.

@item @code{output}
The file name of the processed log file.  This file is subject to log
rotation @i{via} the Shepherd's log rotation service (@pxref{Log-Rotation}).
@end table

Die folgenden optionalen Einstellungen können Sie angeben:

@table @code
@item debug?
Print debug messages when @code{#true}.

@item skip-private?
Wenn das auf @code{#true} gesetzt ist, werden Adressen in privaten
Adressbereichen @emph{nicht} verborgen.

@item column
Eine bei 1 beginnende Spaltennummer. Es werden IP-Adressen in der
angegebenen Spalte verarbeitet (die Vorgabe ist Spalte 1).

@item replacement
Durch welche Zeichenkette ersetzt wird, wenn die IP-Adresse @emph{nicht}
erkannt wird; zum Beispiel @code{"0.0.0.0"}.

@item ipv4mask
Anzahl der Bits, die in IPv4-Adressen verborgen werden.

@item ipv6mask
Anzahl der Bits, die in IPv6-Adressen verborgen werden.

@item increment
Die IP-Adresse wird um diese Zahl erhöht. Vorgegeben ist null.

@item delimiter
Welche Zeichenkette der Trenner im Protokoll ist.

@item regex
Ein regulärer Ausdruck zur Erkennung von IP-Adressen. Er kann statt
@code{column} benutzt werden.
@end table
@end deftp


@node Netzwerkeinrichtung
@subsection Netzwerkeinrichtung

Durch das Modul @code{(gnu services networking)} werden Dienste zum
Konfigurieren der Netzwerkschnittstellen und zum Einrichten der
Netzwerkverbindung Ihrer Maschine bereitgestellt. Die Dienste decken
unterschiedliche Arten ab, wie Sie Ihre Maschine einrichten können: Sie
können eine statische Netzwerkkonfiguration einrichten, einen Client für das
Dynamic Host Configuration Protocol (DHCP) benutzen oder Daemons wie
NetworkManager oder Connman einsetzen, mit denen der gesamte Vorgang
automatisch abläuft, automatisch auf Änderungen an der Verbindung reagiert
wird und eine abstrahierte Benutzerschnittstelle bereitgestellt wird.

Auf einem Laptop sind NetworkManager und Connman bei weitem die
komfortabelsten Optionen, darum enthalten die vorgegebenen Dienste für
Desktop-Arbeitsumgebungen NetworkManager (siehe @ref{Desktop-Dienste,
@code{%desktop-services}}). Für einen Server, eine virtuelle Maschine oder
einen Container sind eine statische Netzwerkkonfiguration oder ein
schlichter DHCP-Client meist angemessener.

Dieser Abschnitt beschreibt die verschiedenen Dienste zur
Netzwerkeinrichtung, die Ihnen zur Verfügung stehen, angefangen bei der
statischen Netzwerkkonfiguration.

@defvar static-networking-service-type
Dies ist der Diensttyp für statisch konfigurierte
Netzwerkschnittstellen. Sein Wert muss eine Liste von
@code{static-networking}-Verbundsobjekten sein. Jedes deklariert eine Menge
von Adressen, Routen und Links, wie im Folgenden gezeigt.

@cindex Netzwerkadapter (NIC)
@cindex Netzwerkkarte (NIC)
Hier sehen Sie die einfachst mögliche Konfiguration, die nur über eine
einzelne Netzwerkkarte („Network Interface Controller“, NIC) eine Verbindung
nur für IPv4 herstellt.

@lisp
;; Statische Netzwerkkonfiguration mit einer Netzwerkkarte, nur IPv4.
(service static-networking-service-type
         (list (static-networking
                (addresses
                 (list (network-address
                        (device "eno1")
                        (value "10.0.2.15/24"))))
                (routes
                 (list (network-route
                        (destination "default")
                        (gateway "10.0.2.2"))))
                (name-servers '("10.0.2.3")))))
@end lisp

Obiges Code-Schnipsel kann ins @code{services}-Feld Ihrer
Betriebssystemkonfiguration eingetragen werden (siehe @ref{Das Konfigurationssystem nutzen}), um Ihre Maschine mit 10.0.2.15 als ihre IP-Adresse
zu versorgen mit einer 24-Bit-Netzmaske für das lokale Netzwerk@tie{}– also
dass jede 10.0.2.@var{x}-Adresse im lokalen Netzwerk (LAN)
ist. Kommunikation mit Adressen außerhalb des lokalen Netzwerks wird über
10.0.2.2 geleitet. Rechnernamen werden über Anfragen ans Domain Name System
(DNS) an 10.0.2.3 aufgelöst.
@end defvar

@deftp {Datentyp} static-networking
Dieser Datentyp repräsentiert eine statische Netzwerkkonfiguration.

Folgendes Beispiel zeigt, wie Sie die Konfiguration einer Maschine
deklarieren, die nur über eine einzelne Netzwerkkarte („Network Interface
Controller“, NIC), die als @code{eno1} verfügbar ist, über eine IPv4-Adresse
und eine IPv6-Adresse verbunden ist:

@lisp
;; Netzwerkkonfiguration mit einer Netzwerkkarte, IPv4 + IPv6.
(static-networking
 (addresses (list (network-address
                   (device "eno1")
                   (value "10.0.2.15/24"))
                  (network-address
                   (device "eno1")
                   (value "2001:123:4567:101::1/64"))))
 (routes (list (network-route
                (destination "default")
                (gateway "10.0.2.2"))
               (network-route
                (destination "default")
                (gateway "2020:321:4567:42::1"))))
 (name-servers '("10.0.2.3")))
@end lisp

Wenn Sie mit dem Befehl @command{ip} aus dem
@uref{https://wiki.linuxfoundation.org/networking/iproute2,
@code{iproute2}-Paket} von Linux-basierten Systemen vertraut sind, sei
erwähnt, dass obige Deklaration gleichbedeutend damit ist, wenn Sie dies
eingeben:

@example
ip address add 10.0.2.15/24 dev eno1
ip address add 2001:123:4567:101::1/64 dev eno1
ip route add default via inet 10.0.2.2
ip route add default via inet6 2020:321:4567:42::1
@end example

Führen Sie für mehr Informationen @command{man 8 ip} aus. Alteingesessene
GNU/Linux-Nutzer werden sicherlich wissen, wie sie das mit
@command{ifconfig} und @command{route} machen, aber wir ersparen es Ihnen.

Für den Datentyp stehen folgende Felder zur Verfügung:

@table @asis
@item @code{addresses}
@itemx @code{links} (Vorgabe: @code{'()})
@itemx @code{routes} (Vorgabe: @code{'()})
Die Liste der @code{network-address}-, @code{network-link}- und
@code{network-route}-Verbundsobjekte für dieses Netzwerk (siehe unten).

@item @code{name-servers} (Vorgabe: @code{'()})
Die Liste der IP-Adressen (als Zeichenketten) der DNS-Server. Diese
IP-Adressen werden in @file{/etc/resolv.conf} geschrieben.

@item @code{provision} (Vorgabe: @code{'(networking)})
Wenn dies ein wahrer Wert ist, bezeichnet dies die Liste von Symbolen für
den Shepherd-Dienst, der dieser Netzwerkkonfiguration entspricht.

@item @code{requirement} (Vorgabe: @code{'()})
Die Liste der Shepherd-Dienste, von denen dieser abhängt.
@end table
@end deftp

@deftp {Datentyp} network-address
Dieser Datentyp repräsentiert die IP-Adresse einer Netzwerkschnittstelle.

@table @code
@item device
Der Name der Netzwerkschnittstelle, die für diese Adresse benutzt
wird@tie{}– z.B.@: @code{"eno1"}.

@item value
Die eigentliche IP-Adresse und Netzwerkmaske in
@uref{https://de.wikipedia.org/wiki/Classless_Inter-Domain_Routing,
CIDR-Notation} als Zeichenkette.

Zum Beispiel bezeichnet @code{"10.0.2.15/24"} die IPv4-Adresse 10.0.2.15 auf
einem Subnetzwerk, dessen erste 24 Bit gleich sind@tie{}– alle
10.0.2.@var{x}-Adressen befinden sich im selben lokalen Netzwerk

@item ipv6?
Ob mit @code{value} eine IPv6-Adresse angegeben wird. Vorgegeben ist, dies
automatisch festzustellen.
@end table
@end deftp

@deftp {Datentyp} network-route
Dieser Datentyp steht für eine Netzwerkroute.

@table @asis
@item @code{destination}
Das Ziel der Route (als Zeichenkette) entweder mit einer IP-Adresse und
Netzwerkmaske oder @code{"default"} zum Einstellen der Vorgaberoute.

@item @code{source} (Vorgabe: @code{#f})
Die Quelle der Route.

@item @code{device} (Vorgabe: @code{#f})
Welches Gerät für diese Route benutzt wird@tie{}– z.B.@: @code{"eno2"}.

@item @code{ipv6?} (Vorgabe: automatisch)
Ob es sich um eine IPv6-Route handelt. Das vorgegebene Verhalten ist, dies
automatisch anhand des Eintrags in @code{destination} oder @code{gateway} zu
bestimmen.

@item @code{gateway} (Vorgabe: @code{#f})
Die IP-Adresse des Netzwerkzugangs (als Zeichenkette), über die der
Netzwerkverkehr geleitet wird.
@end table
@end deftp

@deftp {Datentyp} network-link
Der Datentyp für einen Netzwerk-Link (Link ist englisch für eine Verbindung,
siehe @ref{Link,,, guile-netlink, Guile-Netlink-Handbuch}). Beim Hochfahren
werden mit Netzwerk-Links echte oder virtuelle Ethernet-Verbindungen
aufgebaut oder verändert. Solche Ethernet-Links können anhand eines Namens
im @var{name}-Feld oder einer MAC-Adresse im Feld @var{mac-address}
bezeichnet werden. Wenn eine virtuelle Schnittstelle erzeugt werden soll,
müssen die Felder @var{name} und @var{type} angegeben werden.

@table @code
@item name
Der Name des Links@tie{}– z.B.@: @code{"v0p0"} (Vorgabe: @code{#f}).

@item type
Eine Zeichenkette, die für den Typ des Links steht@tie{}– z.B.@:
@code{'veth} (Vorgabe: @code{#f}).

@item mac-address
Die MAC-Adresse für den Link@tie{}– z.B.@: @code{"98:11:22:33:44:55"}
(Vorgabe: @code{#f}).

@item arguments
Eine Liste der Argumente für diesen Link-Typ.
@end table
@end deftp

Als Nutzungsszenario betrachten wir einen Server, der mit einer
Netzwerkschnittstelle mit mehreren Ports ausgestattet ist. Diese Ports sind
mit einem Switch verbunden, der Link-Bündelung unterstützt (siehe
@uref{https://de.wikipedia.org/wiki/Link_Aggregation, link aggregation},
auch bekannt als Bonding oder NIC-Teaming). Der Switch verwendet
Port-Kanäle, um mehrere physische Schnittstellen zu einer logischen
Schnittstelle zusammenzufassen, die eine höhere Bandbreite, Lastverteilung
und Link-Redundanz bietet. Wenn ein Port zu einer LAG („link aggregation
group“) hinzugefügt wird, erbt er die Eigenschaften des Port-Kanals. Zu den
Eigenschaften gehören VLAN-Zugehörigkeit, Trunk-Status und weitere.

Ein @uref{https://de.wikipedia.org/wiki/Virtual_Local_Area_Network, VLAN}
(oder virtuelles lokales Netzwerk) ist ein logisches Netzwerk, das von
anderen VLANs auf demselben physischen Netzwerk isoliert ist. Damit kann
Netzwerkverkehr getrennt verarbeitet werden, die Sicherheit verbessert
werden und die Netzwerkadministration erleichtert werden.

Mit all diesem Wissen können wir etwa unser statisches Netzwerk am Server
konfigurieren, indem wir zwei bestehende Netzwerke nach dem 802.3ad-Schema
bündeln und zusätzlich eine VLAN-Schnittstelle mit Id 1055 hinzufügen. Wir
teilen unserer VLAN-Schnittstelle eine statische IP zu.

@lisp
(static-networking
 (links (list (network-link
               (name "bond0")
               (type 'bond)
               (arguments '((mode . "802.3ad")
                            (miimon . 100)
                            (lacp-active . "on")
                            (lacp-rate . "fast"))))

              (network-link
               (mac-address "98:11:22:33:44:55")
               (arguments '((master . "bond0"))))

              (network-link
               (mac-address "98:11:22:33:44:56")
               (arguments '((master . "bond0"))))

              (network-link
               (name "bond0.1055")
               (type 'vlan)
               (arguments '((id . 1055)
                            (link . "bond0"))))))
 (addresses (list (network-address
                   (value "192.168.1.4/24")
                   (device "bond0.1055")))))
@end lisp

@cindex Loopback-Gerät
@defvar %loopback-static-networking
Dies ist das @code{static-networking}-Verbundsobjekt, das für das
„Loopback-Gerät“ @code{lo} steht, mit IP-Adressen 127.0.0.1 und ::1, was den
Shepherd-Dienst @code{loopback} zur Verfügung stellt.
@end defvar

@cindex Netzwerkanbindung, für QEMU
@cindex QEMU, Netzwerkanbindung
@defvar %qemu-static-networking
Dies ist das @code{static-networking}-Verbundsobjekt, das für eine
Netzwerkeinrichtung mit QEMUs als Nutzer ausgeführtem Netzwerkstapel
(„User-Mode Network Stack“) auf dem Gerät @code{eth0} steht (siehe
@ref{Using the user mode network stack,,, qemu, QEMU-Dokumentation}).
@end defvar

@cindex DHCP, Netzwerkdienst
@defvar dhcp-client-service-type
Dies ist der Diensttyp für den Dienst, der @var{dhclient} ausführt, den
Client des ISC für das „Dynamic Host Configuration Protocol“ (DHCP).
@end defvar

@deftp {Datentyp} dhcp-client-configuration
Der Datentyp, der die Konfiguration des Dienstes für den ISC-DHCP-Client
repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @code{isc-dhcp})
Das ISC-DHCP-Client-Paket, was benutzt werden soll.

@item @code{interfaces} (Vorgabe: @code{'all})
Geben Sie entweder @code{'all} an oder die Liste der Namen der
Schnittstellen, auf denen der ISC-DHCP-Client lauschen soll@tie{}– z.B.@:
@code{'("eno1")}.

Wenn es auf @code{'all} gesetzt ist, wird der ISC-DHCP-Client auf allen
verfügbaren Netzwerkschnittstellen außer „loopback“, die aktiviert werden
können, lauschen. Andernfalls lauscht der ISC-DHCP-Client nur auf den
angegebenen Schnittstellen.

@item @code{config-file} (Vorgabe: @code{#f})
Die Konfigurationsdatei für den ISC-DHCP-Client.

@item @code{version} (Vorgabe: @code{"4"})
The DHCP protocol version to use, as a string.  Accepted values are
@code{"4"} or @code{"6"} for DHCPv4 or DHCPv6, respectively, as well as
@code{"4o6"}, for DHCPv4 over DHCPv6 (as specified by RFC 7341).

@item @code{shepherd-requirement} (Vorgabe: @code{'()})
@itemx @code{shepherd-provision} (Vorgabe: @code{'(networking)})
Mit dieser Option können Sie als eine Liste von Symbolen zusätzliche
Shepherd-Dienste benennen, von welchen dieser Dienst abhängen
soll. Beispielsweise geben Sie hier @code{'wpa-supplicant} oder @code{'iwd}
an, wenn Sie Ihren Rechner gegenüber verschlüsselten WLAN- oder
Ethernet-Netzwerken authentisieren müssen.

Ebenso können Sie mit @code{shepherd-provision} eine Liste von Namen von
Shepherd-Diensten angeben (als Symbole), die durch diesen Dienst
bereitgestellt werden. Sie könnten vom Vorgabewert abweichen wollen, wenn
Sie mehrere ISC-DHCP-Clients auszuführen planen, von denen nur einer den
Shepherd-Dienst @code{networking} bereitstellt.
@end table
@end deftp

@cindex DHCPCD, Netzwerkdienst

@defvar dhcpcd-service-type
This the type for a service running @command{dhcpcd}, a @acronym{DHCP,
Dynamic Host Configuration Protocol} client that can be used as a
replacement for the historical ISC client supported by
@code{dhcp-client-service-type}.

Its value must be a @code{dhcpcd-configuration} record, as described below.
As an example, consider the following setup which runs @command{dhcpcd} with
a local @acronym{DNS, Domain Name System} resolver:

@lisp
(service dhcpcd-service-type
  (dhcpcd-configuration
    (option '("rapid_commit" "interface_mtu"))
    (no-option '("nd_rdnss"
                 "dhcp6_name_servers"
                 "domain_name_servers"
                 "domain_name"
                 "domain_search"))
    (static '("domain_name_servers=127.0.0.1"))
    (no-hook '("hostname"))))
@end lisp
@end defvar


@c %start of fragment

@deftp {Data Type} dhcpcd-configuration
Available @code{dhcpcd-configuration} fields are:

@table @asis
@item @code{interfaces} (default: @code{()}) (type: list)
List of networking interfaces---e.g., @code{"eth0"}---to start a DHCP client
for.  If no interface is specified (i.e., the list is empty) then
@command{dhcpcd} discovers available Ethernet interfaces, that can be
configured, automatically.

@item @code{command-arguments} (default: @code{("-q" "-q")}) (type: list)
List of additional command-line options.

@item @code{host-name} (default: @code{""}) (type: maybe-string)
Host name to send via DHCP, defaults to the current system host name.

@item @code{duid} (default: @code{""}) (type: maybe-string)
DHCPv4 clients require a unique client identifier, this option uses the
DHCPv6 Unique Identifier as a DHCPv4 client identifier as well.  For more
information, refer to @uref{https://www.rfc-editor.org/rfc/rfc4361,RFC 4361}
and @code{dhcpcd.conf(5)}.

@item @code{persistent?} (default: @code{#t}) (type: boolean)
When true, automatically de-configure the interface when @command{dhcpcd}
exits.

@item @code{option} (default: @code{("rapid_commit" "domain_name_servers" "domain_name" "domain_search" "host_name" "classless_static_routes" "interface_mtu")}) (type: list-of-strings)
List of options to request from the server.

@item @code{require} (default: @code{("dhcp_server_identifier")}) (type: list-of-strings)
List of options to require in responses.

@item @code{slaac} (default: @code{"private"}) (type: maybe-string)
Interface identifier used for SLAAC generated IPv6 addresses.

@item @code{no-option} (default: @code{()}) (type: list-of-strings)
List of options to remove from the message before it's processed.

@item @code{no-hook} (default: @code{()}) (type: list-of-strings)
List of hook script which should not be invoked.

@item @code{static} (default: @code{()}) (type: list-of-strings)
DHCP client can request different options from a DHCP server, through
@code{static} it is possible to configure static values for selected
options.  For example, @code{"domain_name_servers=127.0.0.1"}.

@item @code{vendor-class-id} (Typ: Vielleicht-Zeichenkette)
Set the DHCP Vendor Class (e.g., @code{MSFT}).  For more information, refer
to @uref{https://www.rfc-editor.org/rfc/rfc2132#section-9.13,RFC 2132}.

@item @code{client-id} (type: maybe-string)
Use the interface hardware address or the given string as a client
identifier, this is mutually exclusive with the @code{duid} option.

@item @code{extra-content} (type: maybe-string)
Extra content to append to the configuration as-is.

@item @code{shepherd-provision} (Vorgabe: @code{'(networking)}) (Typ: Liste-von-Symbolen)
Eine Liste von Symbolen, die von diesem Dienst angebotene Shepherd-Dienste
angeben.

@item @code{shepherd-requirement} (default: @code{()}) (type: list-of-symbols)
Eine Liste von Symbolen, die andere Shepherd-Dienste angeben, von denen
dieser Dienst abhängen soll.

@end table

@end deftp


@c %end of fragment

@cindex NetworkManager

@defvar network-manager-service-type
Dies ist der Diensttyp für den
@uref{https://wiki.gnome.org/Projects/NetworkManager,
NetworkManager-Dienst}. Der Wert dieses Diensttyps ist ein
@code{network-manager-configuration}-Verbundsobjekt.

Dieser Dienst gehört zu den @code{%desktop-services} (siehe @ref{Desktop-Dienste}).
@end defvar

@deftp {Datentyp} network-manager-configuration
Datentyp, der die Konfiguration von NetworkManager repräsentiert.

@table @asis
@item @code{network-manager} (Vorgabe: @code{network-manager})
Das zu verwendende NetworkManager-Paket.

@item @code{shepherd-requirement} (default: @code{'(wireless-daemon)})
This option can be used to provide a list of symbols naming Shepherd
services that this service will depend on. The default
@code{'wireless-daemon} is provided by @code{'wpa-supplicant-service-type}
and @code{'iwd-service-type}.  Make sure you have one of these
configured. Note, that @code{%desktop-services} already include
@code{wpa-supplicant-service-type}.

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

@table @samp
@item default
NetworkManager aktualisiert @code{resolv.conf}, damit sie die Nameserver
enthält, die von zurzeit aktiven Verbindungen benutzt werden.

@item dnsmasq
NetworkManager führt @code{dnsmasq} als lokal zwischenspeichernden
Nameserver aus und aktualisiert @code{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 @command{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 @ref{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
@ref{Web-Dienste}). Sie können sich damit auch über SSH mit der virtuellen
Maschine verbinden (siehe @ref{Netzwerkdienste,
@code{openssh-service-type}}). Um eine Wirt-nach-Gast-Verbindung
einzurichten, führen Sie einmal diesen Befehl aus:

@example
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
@end example

Danach geben Sie bei jedem Start Ihrer virtuellen QEMU-Maschine (siehe
@ref{Guix in einer VM starten}) die Befehlszeilenoption @option{-nic
tap,ifname=tap0,script=no,downscript=no} an @command{qemu-system-…} mit.

@item none
NetworkManager verändert @code{resolv.conf} nicht.
@end table

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

@item @code{extra-configuration-files} (default: @code{'()})
A list of two-element lists; the first element of each list is a file name
(as a string), and the second is a file-like object.  Used to specify
configuration files which will be added to the
@file{/etc/NetworkManager/conf.d}.  NetworkManager will read additional
configuration from this directory.  For details on configuration file
precedence and the configuration file format, see @samp{man 5
NetworkManager.conf}.

For example, to add two files named @file{001-basic.conf} and
@file{002-unmanaged.conf}:

@lisp
(service network-manager-service-type
         (network-manager-configuration
          (extra-configuration-files
           `(("001-basic.conf" ,(local-file "basic.conf"))
             ("002-unmanaged.conf" ,(plain-file "constructed-unmanaged.conf"
                                                "\
[keyfile]
unmanaged-devices=interface-name:wlo1_ap\n"))))))
@end lisp

@end table
@end deftp

@cindex Connman
@defvar connman-service-type
Mit diesem Diensttyp wird @url{https://01.org/connman,Connman} ausgeführt,
ein Programm zum Verwalten von Netzwerkverbindungen.

Sein Wert muss ein @code{connman-configuration}-Verbundsobjekt wie im
folgenden Beispiel sein:

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

Weiter unten werden Details der @code{connman-configuration} erklärt.
@end defvar

@deftp {Datentyp} connman-configuration
Datentyp, der die Konfiguration von Connman repräsentiert.

@table @asis
@item @code{connman} (Vorgabe: @var{connman})
Das zu verwendende Connman-Paket.

@item @code{shepherd-requirement} (Vorgabe: @code{'()})
Mit dieser Option können Sie als eine Liste von Symbolen zusätzliche
Shepherd-Dienste benennen, von welchen dieser Dienst abhängen
soll. Beispielsweise geben Sie hier @code{'wpa-supplicant} oder @code{'iwd}
an, wenn Sie Ihren Rechner gegenüber verschlüsselten WLAN- oder
Ethernet-Netzwerken authentisieren müssen.

@item @code{disable-vpn?} (Vorgabe: @code{#f})
Falls dies auf wahr gesetzt ist, wird Connmans VPN-Plugin deaktiviert.

@item @code{general-configuration} (Vorgabe: @code{(connman-general-configuration)})
Die nach @file{main.conf} serialisierte Konfiguration, die mit
@option{--config} an @command{connmand} übergeben werden wird.

@end table
@end deftp

@c %start of fragment

@deftp {Datentyp} connman-general-configuration
Verfügbare @code{connman-general-configuration}-Felder sind:

@table @asis
@item @code{input-request-timeout} (Typ: Vielleicht-Zahl)
Bestimmt die Zeitspanne, in der angefragte Eingaben getätigt werden
müssen. Vorgegeben sind 120 Sekunden. Wird z.B.@: eine Passphraseneingabe
angefordert, ist sie irgendwann nicht mehr gültig. Mit dieser Einstellung
können Sie die Zeitspanne verlängern, wenn es für die Benutzerführung bei
Ihnen angemessener ist.

@item @code{browser-launch-timeout} (Typ: Vielleicht-Zahl)
Set browser launch timeout.  Default is 300 seconds.  The request for
launching a browser for portal pages will timeout after certain amount of
time.  Use this setting to increase the value in case of different user
interface designs.

@item @code{background-scanning?} (Typ: Vielleicht-Boolescher-Ausdruck)
Enable background scanning.  Default is true.  If wifi is disconnected, the
background scanning will follow a simple back off mechanism from 3s up to 5
minutes.  Then, it will stay in 5 minutes unless user specifically asks for
scanning through a D-Bus call.  If so, the mechanism will start again from
3s.  This feature activates also the background scanning while being
connected, which is required for roaming on wifi.  When
@code{background-scanning?} is false, ConnMan will not perform any scan
regardless of wifi is connected or not, unless it is requested by the user
through a D-Bus call.

@item @code{use-gateways-as-timeservers?} (Typ: Vielleicht-Boolescher-Ausdruck)
Assume that service gateways also function as timeservers.  Default is
false.

@item @code{fallback-timeservers} (Typ: Vielleicht-Liste)
List of Fallback timeservers.  These timeservers are used for NTP sync when
there are no timeservers set by the user or by the service, and when
@code{use-gateways-as-timeservers?} is @code{#f}.  These can contain a mixed
combination of fully qualified domain names, IPv4 and IPv6 addresses.

@item @code{fallback-nameservers} (Typ: Vielleicht-Liste)
List of fallback nameservers appended to the list of nameservers given by
the service.  The nameserver entries must be in numeric format, host names
are ignored.

@item @code{default-auto-connect-technologies} (Typ: Vielleicht-Liste)
Liste der Technologien, die ohne weitere Einstellung für automatisches
Aufbauen einer Verbindung vorgesehen sind. Vorgegeben ist, dass es, wenn
kein Eintrag gemacht wird, bei @code{"ethernet"}, @code{"wifi"} und
@code{"cellular"} vorgesehen ist. Für eine automatische Verbindung muss ein
Dienst aber vorher eingerichtet und gespeichert worden sein.

@item @code{default-favourite-technologies} (Typ: Vielleicht-Liste)
Liste der Technologien, die ohne weitere Einstellung bevorzugt
werden. Vorgegeben ist, dass, wenn kein Eintrag gemacht wird,
@code{"ethernet"} bevorzugt wird. Über Dienste dieser Technologie wird
selbst dann eine Verbindung aufgebaut, wenn sie @emph{nicht} vorher
eingerichtet und gespeichert wurden.

@item @code{always-connected-technologies} (Typ: Vielleicht-Liste)
Liste der Technologien, über die eine Verbindung aufgebaut wird, egal welche
Technologien Vorrang haben (@code{auto-connect?} @code{#t}). Vorgegeben ist,
dass diese Funktion deaktiviert ist, wenn Sie sie nicht ausdrücklich
aktivieren..

@item @code{preferred-technologies} (Typ: Vielleicht-Liste)
Liste, in welcher Reihenfolge Technologien vorrangig verbunden werden
sollen, geordnet von der mit dem meisten Vorrang absteigend. Mit den
Diensten der jeweiligen Technologie wird nacheinander in der angegebenen
Reihenfolge eine Verbindung versucht, bis eine Verbindung hergestellt werden
kann oder alles fehlgeschlagen ist. Wenn ein Dienst einer vorrangigen
Technologie den Zustand ‚ready‘ hat, wird die Vorgaberoute über ihn laufen
gegenüber weniger vorrangigen Typen in der Liste mit Status ‚ready‘ oder
gegenüber nicht vorrangigen Typen. Ein Dienst mit Zustand ‚online‘ hat die
Vorgaberoute gegenüber nicht vorrangigen Typen oder weniger vorrangigen
Typen.

@item @code{network-interface-blacklist} (Typ: Vielleicht-Liste)
List of blacklisted network interfaces.  Found interfaces will be compared
to the list and will not be handled by ConnMan, if their first characters
match any of the list entries.  Default value is @code{"vmnet"},
@code{"vboxnet"}, @code{"virbr"}, @code{"ifb"}.

@item @code{allow-hostname-updates?} (Typ: Vielleicht-Boolescher-Ausdruck)
Allow ConnMan to change the system hostname.  This can happen for example if
we receive DHCP hostname option.  Default value is @code{#t}.

@item @code{allow-domainname-updates?} (Typ: Vielleicht-Boolescher-Ausdruck)
Allow connman to change the system domainname.  This can happen for example
if we receive DHCP domainname option.  Default value is @code{#t}.

@item @code{single-connected-technology?} (Typ: Vielleicht-Boolescher-Ausdruck)
Keep only a single connected technology at any time.  When a new service is
connected by the user or a better one is found according to
preferred-technologies, the new service is kept connected and all the other
previously connected services are disconnected.  With this setting it does
not matter whether the previously connected services are in 'online' or
'ready' states, the newly connected service is the only one that will be
kept connected.  A service connected by the user will be used until going
out of network coverage.  With this setting enabled applications will notice
more network breaks than normal.  Note this options can't be used with
VPNs.  Default value is @code{#f}.

@item @code{tethering-technologies} (Typ: Vielleicht-Liste)
List of technologies that are allowed to enable tethering.  The default
value is @code{"wifi"}, @code{"bluetooth"}, @code{"gadget"}.  Only those
technologies listed here are used for tethering.  If one wants to tether
ethernet, then add @code{"ethernet"} in the list.  Note that if ethernet
tethering is enabled, then a DHCP server is started on all ethernet
interfaces.  Tethered ethernet should never be connected to corporate or
home network as it will disrupt normal operation of these networks.  Due to
this ethernet is not tethered by default.  Do not activate ethernet
tethering unless you really know what you are doing.

@item @code{persistent-tethering-mode?} (Typ: Vielleicht-Boolescher-Ausdruck)
Restore earlier tethering status when returning from offline mode,
re-enabling a technology, and after restarts and reboots.  Default value is
@code{#f}.

@item @code{enable-6to4?} (Typ: Vielleicht-Boolescher-Ausdruck)
Automatically enable anycast 6to4 if possible.  This is not recommended, as
the use of 6to4 will generally lead to a severe degradation of connection
quality.  See RFC6343.  Default value is @code{#f} (as recommended by
RFC6343 section 4.1).

@item @code{vendor-class-id} (Typ: Vielleicht-Zeichenkette)
Set DHCP option 60 (Vendor Class ID) to the given string.  This option can
be used by DHCP servers to identify specific clients without having to rely
on MAC address ranges, etc.

@item @code{enable-online-check?} (Typ: Vielleicht-Boolescher-Ausdruck)
Enable or disable use of HTTP GET as an online status check.  When a service
is in a READY state, and is selected as default, ConnMan will issue an HTTP
GET request to verify that end-to-end connectivity is successful.  Only then
the service will be transitioned to ONLINE state.  If this setting is false,
the default service will remain in READY state.  Default value is @code{#t}.

@item @code{online-check-ipv4-url} (Typ: Vielleicht-Zeichenkette)
IPv4 URL used during the online status check.  Please refer to the README
for more detailed information.  Default value is
@uref{http://ipv4.connman.net/online/status.html}.

@item @code{online-check-ipv6-url} (Typ: Vielleicht-Zeichenkette)
IPv6 URL used during the online status check.  Please refer to the README
for more detailed information.  Default value is
@uref{http://ipv6.connman.net/online/status.html}.

@item @code{online-check-initial-interval} (Typ: Vielleicht-Zahl)
Range of intervals between two online check requests.  Please refer to the
README for more detailed information.  Default value is @samp{1}.

@item @code{online-check-max-interval} (Typ: Vielleicht-Zahl)
Range of intervals between two online check requests.  Please refer to the
README for more detailed information.  Default value is @samp{1}.

@item @code{enable-online-to-ready-transition?} (Typ: Vielleicht-Boolescher-Ausdruck)
WARNING: This is an experimental feature.  In addition to
@code{enable-online-check} setting, enable or disable use of HTTP GET to
detect the loss of end-to-end connectivity.  If this setting is @code{#f},
when the default service transitions to ONLINE state, the HTTP GET request
is no more called until next cycle, initiated by a transition of the default
service to DISCONNECT state.  If this setting is @code{#t}, the HTTP GET
request keeps being called to guarantee that end-to-end connectivity is
still successful.  If not, the default service will transition to READY
state, enabling another service to become the default one, in replacement.
Default value is @code{#f}.

@item @code{auto-connect-roaming-services?} (Typ: Vielleicht-Boolescher-Ausdruck)
Automatically connect roaming services.  This is not recommended unless you
know you won't have any billing problem.  Default value is @code{#f}.

@item @code{address-conflict-detection?} (Typ: Vielleicht-Boolescher-Ausdruck)
Enable or disable the implementation of IPv4 address conflict detection
according to RFC5227.  ConnMan will send probe ARP packets to see if an IPv4
address is already in use before assigning the address to an interface.  If
an address conflict occurs for a statically configured address, an IPv4LL
address will be chosen instead (according to RFC3927).  If an address
conflict occurs for an address offered via DHCP, ConnMan sends a DHCP
DECLINE once and for the second conflict resorts to finding an IPv4LL
address.  Default value is @code{#f}.

@item @code{localtime} (Typ: Vielleicht-Zeichenkette)
Path to localtime file.  Defaults to @file{/etc/localtime}.

@item @code{regulatory-domain-follows-timezone?} (Typ: Vielleicht-Boolescher-Ausdruck)
Enable regulatory domain to be changed along timezone changes.  With this
option set to true each time the timezone changes the first present ISO3166
country code is read from @file{/usr/share/zoneinfo/zone1970.tab} and set as
regulatory domain value.  Default value is @code{#f}.

@item @code{resolv-conf} (Typ: Vielleicht-Zeichenkette)
Path to resolv.conf file.  If the file does not exist, but intermediate
directories exist, it will be created.  If this option is not set, it tries
to write into @file{/var/run/connman/resolv.conf} if it fails
(@file{/var/run/connman} does not exist or is not writeable).  If you do not
want to update resolv.conf, you can set @file{/dev/null}.

@end table

@end deftp

@cindex WPA-Supplikant
@defvar wpa-supplicant-service-type
Dies ist der Diensttyp, um @url{https://w1.fi/wpa_supplicant/,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.
@end defvar

@deftp {Datentyp} wpa-supplicant-configuration
Repräsentiert die Konfiguration des WPA-Supplikanten.

Sie hat folgende Parameter:

@table @asis
@item @code{wpa-supplicant} (Vorgabe: @code{wpa-supplicant})
Das WPA-Supplicant-Paket, was benutzt werden soll.

@item @code{shepherd-requirement} (default: @code{(user-processes loopback syslogd)}
Die Liste der Dienste, die vor dem WPA-Supplikanten bereits gestartet sein
sollen.

@item @code{shepherd-provision} (default: @code{(wpa-supplicant wireless-daemon)}) (type: list-of-symbols)
The name(s) of the service.

@item @code{dbus?} (Vorgabe: @code{#t})
Ob auf Anfragen auf D-Bus gelauscht werden soll.

@item @code{pid-file} (Vorgabe: @code{"/var/run/wpa_supplicant.pid"})
Wo die PID-Datei abgelegt wird.

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

@item @code{config-file} (Vorgabe: @code{#f})
Optionale Konfigurationsdatei.

@item @code{extra-options} (Vorgabe: @code{'()})
Liste zusätzlicher Befehlszeilenoptionen, die an den Daemon übergeben
werden.
@end table
@end deftp

@cindex iwd, iNet Wireless Daemon
@defvar iwd-service-type
Dies ist der Diensttyp, um iwd, den @uref{https://iwd.wiki.kernel.org/, iNet
Wireless Daemon}, auszuführen. Dabei handelt es sich um einen Daemon, der
notwendig ist, um sich gegenüber verschlüsselten WLAN-Netzwerken zu
authentisieren.
@end defvar

@quotation Warnung
By default @code{iwd} removes and re-creates interfaces it manages.  It
doesn't play nicely with @code{dhcp-client-service-type} that enumerates
wireless interfaces before starting the Shepherd service.  Use either
@code{dhcpcd-service-type} or the @code{iwd}'s built-in DHCP client (see
@code{enable-network-configuration} option below).
@end quotation

@quotation Warnung
@code{iwd-service-type} conflicts with @code{wpa-supplicant-service-type}.
Make sure only one is configured.
@end quotation

@c %start of fragment

@deftp {Data Type} iwd-configuration
Available @code{iwd-configuration} fields are:

@table @asis
@item @code{iwd} (default: @code{iwd}) (type: file-like)
The IWD package to use.

@item @code{interfaces} (default: @code{()}) (type: list-of-strings)
If this is set, it must specify @dfn{glob patterns} matching network
interfaces that IWD will control.

@item @code{ignored-interfaces} (default: @code{()}) (type: list-of-strings)
If this is set, it must specify @dfn{glob patterns} matching network
interfaces that IWD will not manage.

@item @code{phys} (default: @code{()}) (type: list-of-strings)
If this is set, it must specify @dfn{glob patterns} matching network PHYs
names that IWD will control.

@item @code{ignored-phys} (default: @code{()}) (type: list-of-strings)
If this is set, it must specify @dfn{glob patterns} matching network PHYs
names that IWD will not manage.

@item @code{shepherd-requirement} (default: @code{()}) (type: list-of-symbols)
Shepherd requirements the service should depend on.

@item @code{shepherd-provision} (default: @code{(iwd wireless-daemon)}) (type: list-of-symbols)
The name(s) of the service.

@item @code{config} (type: iwd-settings)
Configuration settings.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} iwd-settings
Available @code{iwd-settings} fields are:

@table @asis
@item @code{general} (type: iwd-general-settings)
General settings.

@item @code{network} (default: @code{(iwd-network-settings)}) (type: maybe-iwd-network-settings)
Network settings.

@item @code{scan} (type: maybe-iwd-scan-settings)
Scan settings.

@item @code{extra-config} (default: @code{()}) (type: list-of-strings)
Extra configuration values to append to the IWD configuration file.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} iwd-general-settings
Available @code{iwd-general-settings} fields are:

@table @asis
@item @code{enable-network-configuration?} (default: @code{#f}) (type: boolean)
Setting this option to true enables @code{iwd} to configure the network
interfaces with the IP addresses.

@item @code{extra-options} (default: @code{()}) (type: alist)
An association list of option symbols/strings to string values to be
appended to the General settings group.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} iwd-network-settings
Available @code{iwd-network-settings} fields are:

@table @asis
@item @code{enable-ipv6?} (default: @code{#t}) (type: boolean)
Sets the global default that tells @code{iwd} whether it should configure
IPv6 addresses and routes

@item @code{name-resolving-service} (default: @code{none}) (type: resolving-service)
Configures a DNS resolution method used by the system.

@item @code{extra-options} (default: @code{()}) (type: alist)
An association list of option symbols/strings to string values to be
appended to the Network settings group.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} iwd-scan-settings
Available @code{iwd-scan-settings} fields are:

@table @asis
@item @code{disable-periodic-scan?} (default: @code{#f}) (type: boolean)
Setting this option to @code{#t} will prevent @code{iwd} from issuing the
periodic scans for the available networks while disconnected.

@item @code{initial-periodic-scan-interval} (default: @code{10}) (type: number)
The initial periodic scan interval upon disconnect (in seconds).

@item @code{maximum-periodic-scan-interval} (default: @code{300}) (type: number)
The maximum periodic scan interval (in seconds).

@item @code{disable-roaming-scan?} (default: @code{#f}) (type: boolean)
Setting this option to @code{#t} will prevent @code{iwd} from trying to scan
when roaming decisions are activated.

@item @code{extra-options} (default: @code{()}) (type: alist)
An association list of option symbols/strings to string values to be
appended to the Scan settings group.

@end table

@end deftp


@c %end of fragment

@cindex ModemManager
Manche Netzwerkgeräte wie Modems brauchen eine besondere Behandlung, worauf
die folgenden Dienste abzielen.

@defvar modem-manager-service-type
Dies ist der Diensttyp für den
@uref{https://wiki.gnome.org/Projects/ModemManager,
ModemManager-Dienst}. Der Wert dieses Diensttyps ist ein
@code{modem-manager-configuration}-Verbundsobjekt.

Dieser Dienst gehört zu den @code{%desktop-services} (siehe @ref{Desktop-Dienste}).
@end defvar

@deftp {Datentyp} modem-manager-configuration
Repräsentiert die Konfiguration vom ModemManager.

@table @asis
@item @code{modem-manager} (Vorgabe: @code{modem-manager})
Das ModemManager-Paket, was benutzt werden soll.

@end table
@end deftp

@cindex USB_ModeSwitch
@cindex Modeswitching

@defvar usb-modeswitch-service-type
Dies ist der Diensttyp für den
@uref{https://www.draisberghof.de/usb_modeswitch/,
USB_ModeSwitch-Dienst}. Der Wert dieses Diensttyps ist ein
@code{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 @code{%desktop-services} (siehe @ref{Desktop-Dienste}).
@end defvar

@deftp {Datentyp} usb-modeswitch-configuration
Der Datentyp, der die Konfiguration von USB_ModeSwitch repräsentiert.

@table @asis
@item @code{usb-modeswitch} (Vorgabe: @code{usb-modeswitch})
Das USB_ModeSwitch-Paket, das die Programmdateien für das Modeswitching
enthält.

@item @code{usb-modeswitch-data} (Vorgabe: @code{usb-modeswitch-data})
Das Paket, in dem die Gerätedaten und die udev-Regeldatei stehen, die
USB_ModeSwitch benutzt.

@item @code{config-file} (Vorgabe: @code{#~(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 @file{/var/log} abschaltet. Wenn @code{#f} festgelegt
wird, wird keine Konfigurationsdatei benutzt.

@end table
@end deftp


@node Netzwerkdienste
@subsection Netzwerkdienste

Das im vorherigen Abschnitt besprochene Modul @code{(gnu services
networking)} stellt auch Dienste für fortgeschrittene Netzwerkeinrichtungen
zur Verfügung, etwa um einen DHCP-Dienst für andere anzubieten, Pakete mit
iptables oder nftables zu filtern, einen WLAN-Zugangspunkt mit
@command{hostapd} verfügbar zu machen, den „Superdaemon“ @command{inetd}
auszuführen und noch mehr. In diesem Abschnitt werden sie beschrieben.

@defvar 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
@code{<dhcpd-configuration>} bereitstellen. Zum Beispiel so:

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

@deftp {Datentyp} dhcpd-configuration
@table @asis
@item @code{package} (Vorgabe: @code{isc-dhcp})
Das Paket, das den DHCP-Daemon zur Verfügung stellt. Von diesem Paket wird
erwartet, dass es den Daemon unter dem Pfad @file{sbin/dhcpd} relativ zum
Verzeichnis der Paketausgabe bereitstellt. Das vorgegebene Paket ist
@uref{https://www.isc.org/dhcp/, der DHCP-Server vom ISC}.
@item @code{config-file} (Vorgabe: @code{#f})
Die Konfigurationsdatei, die benutzt werden soll. Sie @emph{muss} angegeben
werden und wird an @code{dhcpd} mittels seiner Befehlszeilenoption
@code{-cf} übergeben. Ein beliebiges „dateiartiges“ Objekt kann dafür
angegeben werden (siehe @ref{G-Ausdrücke, dateiartige Objekte}). Siehe
@code{man dhcpd.conf} für Details, welcher Syntax die Konfigurationsdatei
genügen muss.
@item @code{version} (Vorgabe: @code{"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
@code{-4}, @code{-6} und @code{-4o6} von @code{dhcpd}. Siehe @code{man
dhcpd} für Details.
@item @code{run-directory} (Vorgabe: @code{"/run/dhcpd"})
Das zu benutzende Laufzeit-Verzeichnis („run“-Verzeichnis). Wenn der Dienst
aktiviert wird, wird dieses Verzeichnis erzeugt, wenn es noch nicht
existiert.
@item @code{pid-file} (Vorgabe: @code{"/run/dhcpd/dhcpd.pid"})
Die zu benutzende PID-Datei. Dieses Feld entspricht der Befehlszeilenoption
@code{-pf} von @code{dhcpd}. Siehe @code{man dhcpd} für Details.
@item @code{interfaces} (Vorgabe: @code{'()})
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 @code{dhcpd}-Aufruf beim Starten des Daemons
angehängt. Es ist unter Umständen @emph{nicht} nötig, hier Schnittstellen
ausdrücklich anzugeben; siehe @code{man dhcpd} für Details.
@end table
@end deftp

@cindex hostapd-Dienst, für WLAN-Zugangspunkte (Access Points)
@cindex WLAN-Zugangspunkte (Access Points), hostapd-Dienst
@defvar hostapd-service-type
Dies ist der Diensttyp für den @uref{https://w1.fi/hostapd/,
hostapd-Daemon}, mit dem ein WLAN-Zugangspunkt (ein „Access Point“ gemäß
IEEE 802.11) und Authentifizierungsserver eingerichtet werden kann. Sein
zugewiesener Wert muss eine @code{hostapd-configuration} sein wie im
folgenden Beispiel:

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

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

@table @asis
@item @code{package} (Vorgabe: @code{hostapd})
Das zu benutzende hostapd-Paket.

@item @code{interface} (Vorgabe: @code{"wlan0"})
Die Netzwerkschnittstelle, auf der der WLAN-Zugangspunkt betrieben wird.

@item @code{ssid}
Die SSID (@dfn{Service Set Identifier}), eine das Netzwerk identifizierende
Zeichenkette.

@item @code{broadcast-ssid?} (Vorgabe: @code{#t})
Ob diese SSID allgemein sichtbar sein soll.

@item @code{channel} (Vorgabe: @code{1})
Der zu verwendende WLAN-Kanal.

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

@item @code{extra-settings} (Vorgabe: @code{""})
Weitere Einstellungen, die wie sie sind an die Konfigurationsdatei von
hostapd angehängt werden. Siehe
@uref{https://w1.fi/cgit/hostap/plain/hostapd/hostapd.conf} für eine
Referenz der Konfigurationsdatei.
@end table
@end deftp

@defvar 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
@uref{https://www.kernel.org/doc/html/latest/networking/mac80211_hwsim/mac80211_hwsim.html,
@code{mac80211_hwsim}-Modul} in den Linux-Kernel und startet hostapd, um ein
Pseudo-WLAN-Netzwerk vorzutäuschen, das nach Vorgabe als @code{wlan0}
sichtbar ist.

Der Wert des Dienstes ist ein @code{hostapd-configuration}-Verbundsobjekt.
@end defvar


@cindex iptables
@defvar 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:

@lisp
(service iptables-service-type
         (iptables-configuration
          (ipv4-rules (plain-file "iptables.rules" "*filter
:INPUT ACCEPT
:FORWARD ACCEPT
:OUTPUT ACCEPT
-A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j 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 -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp --dport 22 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp6-port-unreachable
COMMIT
"))))
@end lisp
@end defvar

@deftp {Datentyp} iptables-configuration
Repräsentiert die iptables-Konfiguration.

@table @asis
@item @code{iptables} (Vorgabe: @code{iptables})
Das zu benutzende iptables-Paket, das @code{iptables-restore} und
@code{ip6tables-restore} zur Verfügung stellt.
@item @code{ipv4-rules} (Vorgabe: @code{%iptables-accept-all-rules})
Die zu benutzenden iptables-Regeln. Diese werden an @code{iptables-restore}
übergeben. Als Regeln kann jedes „dateiartige“ Objekt angegeben werden
(siehe @ref{G-Ausdrücke, dateiartige Objekte}).
@item @code{ipv6-rules} (Vorgabe: @code{%iptables-accept-all-rules})
Die zu benutzenden ip6tables-Regeln. Diese werden an
@code{ip6tables-restore} übergeben. Als Regeln kann jedes „dateiartige“
Objekt angegeben werden (siehe @ref{G-Ausdrücke, dateiartige Objekte}).
@end table
@end deftp

@cindex nftables
@cindex firewall, nftables
@defvar nftables-service-type
Mit diesem Diensttyp richten Sie eine Konfiguration von nftables
ein. nftables ist als Projekt ein Teil von Netfilter mit dem Ziel, den
Aufbau aus iptables, ip6tables, arptables und ebtables zu ersetzen. Es
stellt einen neuen Rahmen für Netzwerkpaketfilter bereit sowie ein neues
Werkzeug @command{nft} auf Anwendungsebene und eine Kompatibilitätsschicht
für iptables. Dieser Dienst wird zusammen mit
@code{%default-nftables-ruleset} ausgeliefert, einem vorgegebenen Satz von
Regeln, der alle eingehenden Verbindungen außer auf dem SSH-Port 22 (TCP)
ablehnt. Um ihn zu benutzen, schreiben Sie einfach:

@lisp
(service nftables-service-type)
@end lisp
@end defvar

@c %start of fragment

@deftp {Datentyp} nftables-configuration
Available @code{nftables-configuration} fields are:

@table @asis
@item @code{package} (default: @code{nftables}) (type: file-like)
The @code{nftables} package to use.

@item @code{debug-levels} (type: maybe-list-of-debug-levels)
A list of debug levels, for enabling debugging output.  Valid debug level
values are the @samp{scanner}, @samp{parser}, @samp{eval}, @samp{netlink},
@samp{mnl}, @samp{proto-ctx}, @samp{segtree} or @samp{all} symbols.

@item @code{ruleset} (type: file-like)
A file-like object containing the complete nftables ruleset.  The default
ruleset rejects all incoming connections except those to TCP port 22, with
connections from the loopback interface are allowed.

@end table

@end deftp


@c %end of fragment

@cindex NTP (Network Time Protocol), Dienst
@cindex ntpd, Dienst für den Network-Time-Protocol-Daemon
@cindex Echtzeituhr
@defvar ntp-service-type
Dies ist der Typ des Dienstes, der den @command{ntpd}-Daemon für das
@uref{https://www.ntp.org, Network Time Protocol}, 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 @code{ntpd-configuration}-Objekt, wie im
Folgenden beschrieben.
@end defvar

@deftp {Datentyp} ntp-configuration
Der Datentyp für die Dienstkonfiguration des NTP-Dienstes.

@table @asis
@item @code{servers} (Vorgabe: @code{%ntp-servers})
Dies ist die Liste der Server (@code{<ntp-server>}-Verbundsobjekte), mit
denen @command{ntpd} synchronisiert wird. Siehe die Definition des
@code{ntp-server}-Datentyps weiter unten.

@item @code{allow-large-adjustment?} (Vorgabe: @code{#t})
Hiermit wird festgelegt, ob @command{ntpd} die Uhr beim ersten Umstellen um
mehr als 1.000 Sekunden ändern darf.

@item @code{ntp} (Vorgabe: @code{ntp})
Das NTP-Paket, was benutzt werden soll.
@end table
@end deftp

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

@deftp {Datentyp} ntp-server
Der Datentyp, der die Konfiguration eines NTP-Servers repräsentiert.

@table @asis
@item @code{type} (Vorgabe: @code{'server})
Die Art des NTP-Servers als Symbol, entweder @code{'pool}, @code{'server},
@code{'peer}, @code{'broadcast} oder @code{'manycastclient}.

@item @code{address}
Die Adresse des Servers als Zeichenkette.

@item @code{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
@option{iburst} und @option{prefer} sowie @option{version} 3 und eine
@option{maxpoll}-Zeit von 16 Sekunden benutzen soll.

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

@cindex OpenNTPD
@defvar openntpd-service-type
Hiermit wird @command{ntpd}, der Network-Time-Protocol-Daemon (NTP-Daemon),
ausgeführt, in seiner @uref{http://www.openntpd.org,
OpenNTPD-Implementierung}. Der Daemon sorgt dafür, dass die Systemuhr mit
den Uhren der eingestellten Server synchron bleibt.

@lisp
(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/"))))

@end lisp
@end defvar

@defvar %openntpd-servers
Diese Variable bezeichnet eine Liste von Serveradressen, die in
@code{%ntp-servers} definiert sind.
@end defvar

@deftp {Datentyp} openntpd-configuration
@table @asis
@item @code{openntpd} (Vorgabe: @code{openntpd})
Das zu benutzende openntpd-Paket.
@item @code{listen-on} (Vorgabe: @code{'("127.0.0.1" "::1")})
Eine Liste von lokalen IP-Adressen oder Rechnernamen („Host“-Namen), auf
denen der ntpd-Daemon lauschen soll.
@item @code{query-from} (Vorgabe: @code{'()})
Eine Liste von lokalen IP-Adressen, die der ntpd-Daemon für ausgehende
Anfragen benutzen soll.
@item @code{sensor} (Vorgabe: @code{'()})
Hiermit geben Sie eine Liste von Zeitdifferenz-Sensorgeräten an, die ntpd
benutzen soll. @code{ntpd} wird auf jeden Sensor lauschen, der auch
tatsächlich existiert, und solche, die nicht existieren, ignorieren. Siehe
die @uref{https://man.openbsd.org/ntpd.conf, Dokumentation beim Anbieter}
für weitere Informationen.
@item @code{server} (Vorgabe: @code{'()})
Hiermit geben Sie eine Liste von IP-Adressen oder Rechnernamen von
NTP-Servern an, mit denen synchronisiert werden soll.
@item @code{servers} (Vorgabe: @code{%openntp-servers})
Hiermit geben Sie eine Liste von IP-Adressen oder Rechnernamen von NTP-Pools
an, mit denen synchronisiert werden soll.
@item @code{constraint-from} (Vorgabe: @code{'()})
@code{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.
@item @code{constraints-from} (Vorgabe: @code{'()})
Wie bei @code{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 @code{ntpd} den Median von allen als Beschränkung.
@end table
@end deftp

@cindex inetd
@defvar inetd-service-type
Dieser Dienst führt den @command{inetd}-Daemon aus (siehe @ref{inetd
invocation,,, inetutils, GNU Inetutils}). @command{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 @code{inetd-configuration}-Objekt. Im
folgenden Beispiel wird der @command{inetd}-Daemon konfiguriert, um den
eingebauten @command{echo}-Dienst sowie einen SMTP-Dienst anzubieten, wobei
letzterer SMTP-Kommunikation über SSH an einen Server @code{smtp-server}
über einen vom @code{rechnername}n bezeichneten Zugang („Gateway“)
weiterleitet:

@lisp
(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")))))))
@end lisp

Siehe unten für mehr Details über @code{inetd-configuration}.
@end defvar

@deftp {Datentyp} inetd-configuration
Datentyp, der die Konfiguration von @command{inetd} repräsentiert.

@table @asis
@item @code{program} (Vorgabe: @code{(file-append inetutils "/libexec/inetd")})
Das @command{inetd}-Programm, das benutzt werden soll.

@item @code{entries} (Vorgabe: @code{'()})
Eine Liste von @command{inetd}-Diensteinträgen. Jeder Eintrag sollte von
einem @code{inetd-entry}-Konstruktor erzeugt werden.
@end table
@end deftp

@deftp {Datentyp} inetd-entry
Datentyp, der einen Eintrag in der @command{inetd}-Konfiguration
repräsentiert. Jeder Eintrag entspricht einem Socket, auf dem
@command{inetd} auf Anfragen lauscht.

@table @asis
@item @code{node} (Vorgabe: @code{#f})
Optional sollte hier als Zeichenkette eine kommagetrennte Liste lokaler
Adressen angegeben werden, die @command{inetd} benutzen soll, wenn er
stellvertretend für den angegebenen Dienst lauscht. Siehe @ref{Configuration
file,,, inetutils, GNU Inetutils} für eine vollständige Beschreibung aller
Optionen.
@item @code{name}
Eine Zeichenkette. Dieser Name muss einem Eintrag in @code{/etc/services}
entsprechen.
@item @code{socket-type}
Entweder @code{'stream}, @code{'dgram}, @code{'raw}, @code{'rdm} oder
@code{'seqpacket}.
@item @code{protocol}
Eine Zeichenkette, die einem Eintrag in @code{/etc/protocols} entsprechen
muss.
@item @code{wait?} (Vorgabe: @code{#t})
Ob @command{inetd} warten soll, bis der Server beendet ist, bevor es wieder
auf neue Anfragen an den Dienst lauscht.
@item @code{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.@: @code{"benutzer"}, @code{"benutzer:gruppe"} oder
@code{"benutzer.gruppe"}.
@item @code{program} (Vorgabe: @code{"internal"})
Das Serverprogramm, das die Anfragen bedienen soll, oder @code{"internal"},
wenn @command{inetd} einen eingebauten Dienst verwenden soll.
@item @code{arguments} (Vorgabe: @code{'()})
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 @command{inetd}
eingebauten Diensten muss dieser Eintrag auf @code{'()} oder
@code{'("internal")} gesetzt sein.
@end table

Siehe @ref{Configuration file,,, inetutils, GNU Inetutils} für eine mehr ins
Detail gehende Erörterung jedes Konfigurationsfeldes.
@end deftp

@cindex opendht, Netzwerkdienst für eine verteilte Hashtabelle (Distributed Hash Table)
@cindex dhtproxy, Nutzung mit Jami
@defvar opendht-service-type
Dieser Diensttyp dient dazu, einen @uref{https://opendht.net,
OpenDHT-Knoten}, @command{dhtnode}, zu betreiben. Mit dem Daemon kann ein
eigener Proxy-Dienst für die verteilte Hashtabelle (Distributed Hash Table,
DHT) angeboten werden, den man in Jami und anderen Anwendungen angeben kann,
damit sie sich darüber verbinden.

@quotation Wichtig
Wenn Sie den OpenDHT-Proxy-Server nutzen, sollten die für ihn „sichtbaren“
IP-Adressen der Clients auch anderen Netzwerkteilnehmern gegenüber
erreichbar sein. In der Praxis ist es am besten, den Proxy-Server auf einem
Rechner mit öffentlich zugänglicher IP-Adresse außerhalb Ihres privaten
Netzwerks zu betreiben. Wenn Sie den Proxy-Server zum Beispiel im privaten
lokalen Netzwerk mit IPv4 zugänglich machen würden und dann mittels
Portweiterleitung für die Außenwelt zugänglich machten, funktioniert das
vielleicht bei externen Netzwerkteilnehmern, aber für die Geräte im lokalen
Netzwerk des Proxys würde anderen OpenDHT-Knoten nur deren private Adresse
mitgeteilt, womit sie keine Verbindung aufbauen können.
@end quotation

Der Wert dieses Dienstes ist ein @code{opendht-configuration}-Objekt, wie im
Folgenden beschrieben.
@end defvar

@c The fields documentation has been auto-generated using the
@c configuration->documentation procedure from
@c (gnu services configuration).
@deftp {Datentyp} opendht-configuration
Verfügbare @code{opendht-configuration}-Felder sind:

@table @asis
@item @code{opendht} (Vorgabe: @code{opendht}) (Typ: dateiartig)
Zu benutzendes @code{opendht}-Paket.

@item @code{peer-discovery?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ob sich der Knoten am Multicast-Mechanismus zum Finden lokaler
Netzwerkteilnehmer beteiligen soll.

@item @code{enable-logging?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ob Protokollnachrichten über syslog geschrieben werden sollen. Weil es so
ausführlich ist, ist es nach Vorgabe deaktiviert.

@item @code{debug?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ob Protokollnachrichten der Fehlersuch-Ausführlichkeitsstufe aktiviert
werden sollen. Diese Option wirkt sich @emph{nicht} aus, wenn
Protokollierung ganz abgeschaltet ist.

@item @code{bootstrap-host} (Vorgabe: @code{"bootstrap.jami.net:4222"}) (Typ: Vielleicht-Zeichenkette)
Der Rechnername des Knotens, über den eine erste Verbindung ins
OpenDHT-Netzwerk aufgebaut wird. Es kann eine bestimmte Portnummer angegeben
werden, indem als Suffix @code{:PORT} angehängt wird. Vorgegeben ist, den
Bootstrap-Knoten von Jami zu benutzen, aber man kann jeden Rechnernamen
eines Knotens angeben. Es ist auch möglich, Bootstrapping zu deaktivieren,
indem man dies ausdrücklich auf den Wert @code{%unset-value} festlegt.

@item @code{port} (Vorgabe: @code{4222}) (Typ: Vielleicht-Zahl)
An welchen UDP-Port sich der OpenDHT-Knoten binden soll. Wird er
@emph{nicht} angegeben, wird ein verfügbarer Port automatisch ausgewählt.

@item @code{proxy-server-port} (Typ: Vielleicht-Zahl)
Einen Proxy-Server auf dem angegebenen Port lauschen lassen.

@item @code{proxy-server-port-tls} (Typ: Vielleicht-Zahl)
Einen Proxy-Server auf dem angegebenen Port auf TLS-Verbindungen lauschen
lassen.

@end table
@end deftp

@cindex Tor
@defvar tor-service-type
Diensttyp für den Dienst, der den @uref{https://torproject.org, Tor-Daemon}
für anonyme Netzwerkrouten ausführt. Der Dienst benutzt für seine
Konfiguration ein @code{<tor-configuration>}-Verbundsobjekt. Vorgegeben ist,
dass der Tor-Daemon als „unprivilegierter“ Nutzer @code{tor} ausgeführt
wird, einem Mitglied der @code{tor}-Benutzergruppe ohne besondere
Berechtigungen.

@cindex Onion-Dienste, für Tor
Dienste diesen Typs können von anderen Diensten erweitert werden, um
@dfn{Onion-Dienste} festzulegen (zusätzlich zu denen, die bereits in
@code{tor-configuration} festgelegt wurden). Ein Beispiel:

@lisp
(simple-service 'my-extra-onion-service tor-service-type
                (list (tor-onion-service-configuration
                        (name "extra-onion-service")
                        (mapping '((80 "127.0.0.1:8080"))))))
@end lisp
@end defvar

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

@item @code{config-file} (Vorgabe: @code{(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 @code{tor} über dessen Befehlszeilenoption
@code{-f} übergeben. Hier kann jedes „dateiartige“ Objekt (siehe
@ref{G-Ausdrücke, dateiartige Objekte}) angegeben werden. Siehe @code{man
tor} für Details zur Syntax der Konfigurationsdatei.

@item @code{hidden-services} (Vorgabe: @code{'()})
Die Liste der zu benutzenden „Onion-Dienste“ als
@code{<tor-onion-service-configuration>}-Verbundsobjekte. Für jeden
Onion-Dienst, den Sie in dieser Liste eintragen, werden automatisch
entsprechende Einstellungen zur vorgefertigten Konfigurationsdatei
hinzugefügt.

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

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

@item @code{control-socket?} (Vorgabe: @code{#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 @code{#t} angegeben, nimmt Tor Steuerungsbefehle
auf dem Unix-Socket @file{/var/run/tor/control-sock} entgegen, auf den
Mitglieder der @code{tor}-Benutzergruppe Schreibzugriff bekommen.

@item @code{transport-plugins} (default: @code{'()})
The list of @code{<tor-transport-plugin>} records to use.  For any transport
plugin you include in this list, appropriate configuration line to enable
transport plugin will be automatically added to the default configuration
file.

@item @code{auto-start?} (Vorgabe: @code{#t})
Whether or not to start the Tor daemon on boot.

@end table
@end deftp

@cindex Onion-Dienst, Tor
@deftp {Datentyp} tor-onion-service-configuration
Datentyp, der die Konfiguration eines @dfn{Onion-Dienstes} von Tor
repräsentiert. Siehe @url{https://community.torproject.org/onion-services/,
die Dokumentation des Tor-Projekts} für weitere Informationen. Verfügbare
@code{tor-onion-service-configuration}-Felder sind:

@table @asis
@item @code{name} (Typ: Zeichenkette)
Ein Name für diesen Onion-Dienst. Dadurch wird ein Verzeichnis
@file{/var/lib/tor/hidden-services/@var{Name}} erstellt, worin sich in der
Datei @file{hostname} der @indicateurl{.onion}-Rechnername („Host“-Name) des
Onion-Dienstes befindet.

@item @code{mapping} (Typ: Assoziative-Liste)
Eine assoziative Liste, wie Ports zu Adressen zugeordnet werden. Mit diesem
Beispiel:
@lisp
'((22 "127.0.0.1:22")
  (80 "127.0.0.1:8080"))
@end lisp
werden Ports 22 und 80 des Onion-Dienstes den lokalen Ports 22 und 8080
zugeordnet.

@end table
@end deftp

@cindex pluggable transports, tor
@deftp {Data Type} tor-transport-plugin
Data type representing a Tor pluggable transport plugin in
@code{tor-configuration}.  Plugguble transports are programs that disguise
Tor traffic, which can be useful in case Tor is censored.  See the the Tor
project's @url{https://tb-manual.torproject.org/circumvention/,
documentation} and @url{https://spec.torproject.org/pt-spec/index.html,
specification} for more information.

Each transport plugin corresponds either to @code{ClientTransportPlugin ...}
or to @code{ServerTransportPlugin ...} line in the default configuration
file, see @command{man tor}.  Available @code{tor-transport-plugin} fields
are:

@table @asis
@item @code{role} (default: @code{'client})
This must be either @code{'client} or @code{'server}.  Otherwise, an error
is raised.  Set the @code{'server} value if you want to run a bridge to help
censored users connect to the Tor network, see
@url{https://community.torproject.org/relay/setup/bridge/, the Tor project's
bridge guide}.  Set the @code{'client} value if you want to connect to
somebody else's bridge, see @url{https://bridges.torproject.org/, the Tor
project's ``Get Bridges'' page}.  In both cases the required additional
configuration should be provided via @code{#:config-file} option of
@code{tor-configuration}.
@item @code{protocol} (default: @code{"obfs4"})
A string that specifies a pluggable transport protocol.
@item @code{program}
This must be a ``file-like'' object or a string pointing to the pluggable
transport plugin executable.  This option allows the Tor daemon run inside
the container to access the executable and all the references (e.g. package
dependencies) attached to it.
@end table

Suppose you would like Tor daemon to use obfs4 type obfuscation and to
connect to Tor network via obfs4 bridge (a nonpublic Tor relay with support
for obfs4 type obfuscation). Then you may go to
@url{https://bridges.torproject.org/, https://bridges.torproject.org/} and
get there a couple of bridge lines (each starts with @code{obfs4 ...})  and
use these lines in tor-service-type configuration as follows:
@lisp
(service tor-service-type
	 (tor-configuration
	  (config-file (plain-file "torrc"
				   "\
UseBridges 1
Bridge obfs4 ...
Bridge obfs4 ..."))
	  (transport-plugins
	   (list (tor-transport-plugin
		  (program (file-append lyrebird "/bin/lyrebird")))))))
@end lisp
@end deftp

Das Modul @code{(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.

@defvar rsync-service-type
Dies ist der Diensttyp für den @uref{https://rsync.samba.org, rsync-Daemon},
er benutzt ein @command{rsync-configuration}-Verbundsobjekt wie in diesem
Beispiel:

@lisp
;; Zwei Verzeichnisse über rsync exportieren.  Wie vorgegeben
;; lauscht rsync auf allen Netzwerkschnittstellen.
(service rsync-service-type
         (rsync-configuration
           (modules (list (rsync-module
                            (name "musik")
                            (file-name "/srv/zik")
                            (read-only? #f))
                          (rsync-module
                            (name "filme")
                            (file-name "/home/charlie/filme"))))))
@end lisp

Siehe unten für Details zur @code{rsync-configuration}.
@end defvar

@deftp {Datentyp} rsync-configuration
Datentyp, der die Konfiguration für den @code{rsync-service} repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @var{rsync})
Zu benutzendes @code{rsync}-Paket.

@item @code{address} (Vorgabe: @code{#f})
Auf welcher IP-Adresse @command{rsync} auf eingehende Verbindungen
lauscht. Wird nichts angegeben, wird auf allen verfügbaren Adressen
gelauscht.

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

@item @code{pid-file} (Vorgabe: @code{"/var/run/rsyncd/rsyncd.pid"})
Der Name der Datei, in die @command{rsync} seine PID schreibt.

@item @code{lock-file} (Vorgabe: @code{"/var/run/rsyncd/rsyncd.lock"})
Der Name der Datei, die @command{rsync} als seine Sperrdatei verwendet.

@item @code{log-file} (Vorgabe: @code{"/var/log/rsyncd.log"})
Der Name der Datei, in die @command{rsync} seine Protokolle schreibt.

@item @code{user} (Vorgabe: @code{"root"})
Das Benutzerkonto, dem der @code{rsync}-Prozess gehören soll.

@item @code{group} (Vorgabe: @code{"root"})
Die Benutzergruppe des @code{rsync}-Prozesses.

@item @code{uid} (Vorgabe: @code{"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 @code{root} läuft.

@item @code{gid} (Vorgabe: @code{"rsyncd"})
Benutzergruppenname oder Gruppenidentifikator („Group-ID“), mit dem auf das
Modul zugegriffen wird.

@item @code{modules} (Vorgabe: @code{%default-modules})
Liste von „Modulen“@tie{}– d.h.@: Verzeichnissen, die mit rsync exportiert
werden. Jedes Element muss ein @code{rsync-module}-Verbund sein, wie nun
beschrieben wird.
@end table
@end deftp

@deftp {Datentyp} rsync-module
Dies ist der Datentyp für rsync-„Module“.  Ein Modul ist ein Verzeichnis,
das über das rsync-Protokoll exportiert wird.  Die verfügbaren Felder sind
wie folgt:

@table @asis
@item @code{name}
Der Modulname.  Dieser ist der Name, der in URLs benutzt wird.  Zum
Beispiel, wenn das Modul @code{musik} heißt, wird die entsprechende URL
@code{rsync://host.example.org/musik} sein.

@item @code{file-name}
Der Name des Verzeichnisses, das exportiert wird.

@item @code{comment} (Vorgabe: @code{""})
Kommentar, der mit dem Modul verbunden ist.  Clientbenutzerschnittstellen
dürfen das anzeigen, wenn sie die Liste der verfügbaren Module bekommen.

@item @code{read-only?} (Vorgabe: @code{#t})
Ob der Client Dateien hochladen können soll. Wenn dies falsch ist, wird das
Hochladen autorisiert werden, wenn die Berechtigungen dort, wo der Daemon
läuft, es erlauben.

@item @code{chroot?} (Vorgabe: @code{#t})
Wenn es auf wahr steht, wechselt der rsync-Daemon das Wurzelverzeichnis in
das Verzeichnis des Moduls, bevor er Dateiübertragungen mit dem Client
unternimmt. Das ist besser für die Sicherheit, aber es geht nur, wenn rsync
als Administratornutzer root läuft.

@item @code{timeout} (Vorgabe: @code{300})
Wie viele Sekunden ein Prozess untätig bleiben darf, bis eine Verbindung zum
Client getrennt wird.
@end table
@end deftp

@cindex Syncthing, Dienst zur Synchronisierung von Dateien
@cindex Sicherung von Dateien, Syncthing
Das Modul @code{(gnu services syncthing)} bietet die folgenden Dienste an:
@cindex syncthing

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.

@defvar syncthing-service-type
Dies ist der Diensttyp für den @uref{https://syncthing.net/,
syncthing-Daemon}, er benutzt ein
@command{syncthing-configuration}-Verbundsobjekt wie in diesem Beispiel:

@lisp
(service syncthing-service-type
         (syncthing-configuration (user "alice")))
@end lisp

@quotation Anmerkung
Dieser Dienst ist auch mit Guix Home erhältlich, wo er einfach mit Ihren
Benutzerrechten ausgeführt wird (siehe @ref{Persönliche Netzwerkdienste,
@code{home-syncthing-service-type}}).
@end quotation

Siehe unten für Details zur @code{syncthing-configuration}.
@end defvar

@deftp {Datentyp} syncthing-configuration
Datentyp, der die Konfiguration für den @code{syncthing-service-type}
repräsentiert.

@table @asis
@item @code{syncthing} (Vorgabe: @var{syncthing})
Zu benutzendes @code{syncthing}-Paket.

@item @code{arguments} (Vorgabe: @var{'()})
Liste der Befehlszeilenoptionen, die an das @code{syncthing}-Programm
übergeben werden.

@item @code{logflags} (Vorgabe: @var{0})
Die Summe aus den Protokollierungsoptionen, siehe die
@uref{https://docs.syncthing.net/users/syncthing.html#cmdoption-logflags,
Dokumentation von Syncthing zu logflags}.

@item @code{user} (Vorgabe: @var{#f})
Das Benutzerkonto, mit dem der Syncthing-Dienst ausgeführt wird. Es wird
vorausgesetzt, dass der angegebene Benutzer existiert.

@item @code{group} (Vorgabe: @var{"users"})
Die Gruppe, mit der der Syncthing-Dienst ausgeführt wird. Es wird
vorausgesetzt, dass die angegebene Gruppe existiert.

@item @code{home} (Vorgabe: @var{#f})
Sets the @code{HOME} variable for the Syncthing daemon.  The default is
@file{$HOME} of the specified Syncthing @code{user}.

@item @code{config-file} (default: @var{#f})
Either a file-like object that resolves to a Syncthing configuration XML
file, or a @code{syncthing-config-file} record (see below).  If set to
@code{#f}, Guix will not try to generate a config file, and Syncthing will
generate a default configuration which will not be touched on reconfigure.
Specifying this in a system service moves Syncthing's common configuration
and data directory (@code{--home} in
@uref{https://docs.syncthing.net/users/syncthing.html}) to
@file{/var/lib/syncthing-<user>}.

When used as a home service, syncthing configuration will be populated in
@file{~/.local/state/syncthing/}.  Old Syncthing installs may have files in
@file{$XDG_CONFIG_HOME/syncthing/} (usually @file{~/.config/syncthing/}),
which will override configuration in @file{~/.local/state/syncthing} managed
by this service.  In such cases, you should move the contents of
@file{$XDG_CONFIG_HOME/syncthing/} into @file{~/.local/state/syncthing/}.

@end table
@end deftp

This section documents a subset of the Syncthing configuration
options—specifically those related to Guix or those affecting how your
computer will connect to other computers over the network (such as Syncthing
relays or discovery servers).  The configuration is fully documented in the
upstream @uref{https://docs.syncthing.net/users/config.html, Syncthing
config documentation}; camelCase there is converted to kebab-case here.  If
you are migrating from a Syncthing-managed configuration to one managed by
Guix, you can check what changes were introduced by @code{diff}ing the
respective @file{config.xml} files.  Note that you will need to add
whitespace with 4-space indentation to the file generated by Guix, using the
@code{xmllint} program from the @code{libxml2} package like so:

@example
XMLLINT_INDENT="    " xmllint --format /path/to/new/config.xml | diff /path/to/old/config.xml -
@end example

When generating a configuration file through Guix, you can still temporarily
modify Syncthing from the GUI or through @code{introducer} and
@code{autoAcceptFolders} mechanisms, but such changes will be reset on
reconfigure.

@deftp {Data Type} syncthing-config-file
Data type representing the configuration file read by the Syncthing daemon.

@table @asis
@item @code{folders} (default: @code{(list (syncthing-folder (id "default") (label "Default Folder") (path "~/Sync")))}
The default here is the same as Syncthing's default.  The value should be a
list of @code{syncthing-folder}s.

@item @code{devices} (default: @code{'()}
This should be a list of @code{syncthing-device}s.  Guix will automatically
add any devices specified in any `folders' to this list.  There are
instances when you want to connect to a device despite not (initially)
sharing any folders (such as a device with autoAcceptFolders).  In such
instances, you should specify those devices here.  If multiple versions of
the same device (as determined by comparing device ID) are discovered, the
one in this list is prioritized.  Otherwise, the first instance in the first
folder is used.

@item @code{gui-enabled?} (default: @code{#t})
By default, any user on the computer can access the GUI and make changes to
Syncthing.  If you leave this enabled, you should probably set
@code{gui-user} and @code{gui-password} (see below).

@item @code{gui-tls?} (default: @code{#f})
@item @code{gui-debugging?} (default: @code{#f})
@item @code{gui-send-basic-authorization-prompt?} (default: @code{#f})
@item @code{gui-address} (default: @code{"127.0.0.1:8384"})
@item @code{gui-user} (default: @code{#f})
@item @code{gui-password} (default: @code{#f})
A bcrypt hash of the GUI password.  Remember that this will be globally
exposed in @file{/gnu/store}.

@item @code{gui-apikey} (default: @code{#f})
You must specify this to use the Syncthing REST interface.  This key is kept
in @file{/gnu/store} and is accessible to all users of the system.

@item @code{gui-theme} (default: @code{"default"})
@item @code{ldap-enabled?} (default: @code{#f})
@item @code{ldap-address} (default: @code{""})
@item @code{ldap-bind-dn} (default: @code{""})
@item @code{ldap-transport} (default: @code{""})
@item @code{ldap-insecure-skip-verify} (default: @code{""})
@item @code{ldap-search-base-dn} (default: @code{""})
@item @code{ldap-search-filter} (default: @code{""})
@item @code{listen-address} (default: @code{"default"})
@item @code{global-announce-server} (default: @code{"default"})
@item @code{global-announce-enabled?} (default: @code{#t})
Global discovery servers can be used to help connect devices at unknown IP
addresses by storing the last known IP address.

@item @code{local-announce-enabled?} (default: @code{#t})
This makes devices find each other very easily on the same LAN.  Often, this
will allow you to just plug an Ethernet between two devices, or connect one
device to the other's hotspot and start syncing.

@item @code{local-announce-port} (default: @code{21027})
@item @code{local-announce-mac-address} (default: @code{"[ff12::8384]:21027"})
@item @code{max-send-kbps} (default: @code{0})
@item @code{max-receive-kbps} (default: @code{0})
@item @code{reconnection-interval-seconds} (default: @code{60})
@item @code{relays-enabled?} (default: @code{#t})
This option allows your Syncthing instance to use a global network of
@uref{https://docs.syncthing.net/users/relaying.html, relays} to enable
syncing between devices when all other methods fail.  As always, Syncthing
traffic is encrypted in transport and the relays are unable to decrypt it.

@item @code{relay-reconnect-interval-minutes} (default: @code{10})
@item @code{start-browser?} (default: @code{#t})
@item @code{nat-enabled?} (default: @code{#t})
@item @code{nat-lease-minutes} (default: @code{60})
@item @code{nat-renewal-minutes} (default: @code{30})
@item @code{nat-timeout-seconds} (default: @code{10})
@item @code{usage-reporting-accepted} (default: @code{0})
Options whose names begin with `usage-reporting-' control usage reporting.
Set to -1 to disable, or to a positive value to enable.  The default (0)
disables reporting, but causes a usage reporting consent prompt to be
displayed in the Syncthing GUI.

@item @code{usage-reporting-seen} (default: @code{0})
@item @code{usage-reporting-unique-id} (default: @code{""})
@item @code{usage-reporting-url} (default: @code{"https://data.syncthing.net/newdata"})
@item @code{usage-reporting-post-insecurely?} (default: @code{#f})
@item @code{usage-reporting-initial-delay-seconds} (default: @code{1800})
@item @code{auto-upgrade-interval-hours} (default: @code{12})
@item @code{upgrade-to-pre-releases?} (default: @code{#f})
@item @code{keep-temporaries-hours} (default: @code{24})
@item @code{cache-ignored-files?} (default: @code{#f})
@item @code{progress-update-interval-seconds} (default: @code{5})
@item @code{limit-bandwidth-in-lan?} (default: @code{#f})
@item @code{min-home-disk-free-unit} (default: @code{"%"})
@item @code{min-home-disk-free} (default: @code{1})
@item @code{releases-url} (default: @code{"https://upgrades.syncthing.net/meta.json"})
@item @code{overwrite-remote-device-names-on-connect?} (default: @code{#f})
@item @code{temp-index-min-blocks} (default: @code{10})
@item @code{unacked-notification-id} (default: @code{"authenticationUserAndPassword"})
@item @code{traffic-class} (default: @code{0})
@item @code{set-low-priority?} (default: @code{#t})
@item @code{max-folder-concurrency} (default: @code{0})
@item @code{crash-reporting-url} (default: @code{"https://crash.syncthing.net/newcrash"})
@item @code{crash-reporting-enabled?} (default: @code{#t})
@item @code{stun-keepalive-start-seconds} (default: @code{180})
@item @code{stun-keepalive-min-seconds} (default: @code{20})
@item @code{stun-server} (default: @code{"default"})
@item @code{database-tuning} (default: @code{"auto"})
@item @code{max-concurrent-incoming-request-kib} (default: @code{0})
@item @code{announce-lan-addresses?} (default: @code{#t})
@item @code{send-full-index-on-upgrade?} (default: @code{#f})
@item @code{connection-limit-enough} (default: @code{0})
@item @code{connection-limit-max} (default: @code{0})
@item @code{insecure-allow-old-tls-versions?} (default: @code{#f})
@item @code{connection-priority-tcp-lan} (default: @code{10})
@item @code{connection-priority-quic-lan} (default: @code{20})
@item @code{connection-priority-tcp-wan} (default: @code{30})
@item @code{connection-priority-quic-wan} (default: @code{40})
@item @code{connection-priority-relay} (default: @code{50})
@item @code{connection-priority-upgrade-threshold} (default: @code{0})
@item @code{default-folder} (default: @code{(syncthing-folder (label ""))})
@itemx @code{default-device} (default: @code{(syncthing-device (id ""))})
@itemx @code{default-ignores} (default: @code{"")})
Options whose names begin with `default-' above do not affect folders and
devices added through the Guix configuration interface.  They will, however,
affect folders and devices that are added through the Syncthing GUI, by an
@code{introducer}, or a device with @code{auto-accept-folders}.
@end table
@end deftp

@deftp {Data Type} syncthing-folder
Data type representing a folder to be synchronized.

@table @asis
@item @code{id} (Vorgabe: @code{#f})
This ID cannot match the ID of any other folder on this device.  If left
unspecified, it will default to the label (see below).

@item @code{label}
A human readable label for the folder.

@item @code{path}
The path at which to store this folder.

@item @code{type} (default: @code{"sendreceive"})
@item @code{rescan-interval-seconds} (default: @code{3600})
@item @code{file-system-watcher-enabled?} (default: @code{#t})
@item @code{file-system-watcher-delay-seconds} (default: @code{10})
@item @code{file-system-watcher-timeout-seconds} (default: @code{0})
@item @code{ignore-permissions?} (default: @code{#f})
@item @code{auto-normalize?} (default: @code{#t})
@item @code{devices} (default: @code{'()})
This should be a list of other Syncthing devices.  You do not need to
specify the current device.  Each device can be listed as a a
@code{syncthing-device} record or a @code{syncthing-folder-device} record if
you want files to be encrypted on disk.  See below.

@item @code{filesystem-type} (default: @code{"basic"})
@item @code{min-disk-free-unit} (default: @code{"%"})
@item @code{min-disk-free} (default: @code{1})
@item @code{versioning-type} (default: @code{#f})
@item @code{versioning-file-system-path} (default: @code{""})
@item @code{versioning-file-system-type} (default: @code{"basic"})
@item @code{versioning-cleanup-interval-seconds} (default: @code{3600})
@item @code{versioning-cleanout-days} (default: @code{#f})
@item @code{versioning-keep} (default: @code{#f})
@item @code{versioning-max-age} (default: @code{#f})
@item @code{versioning-command} (default: @code{#f})
@item @code{copiers} (default: @code{0})
@item @code{puller-max-pending-kib} (default: @code{0})
@item @code{hashers} (default: @code{0})
@item @code{order} (default: @code{"random"})
@item @code{ignore-delete?} (default: @code{#f})
@item @code{scan-progress-interval-seconds} (default: @code{0})
@item @code{puller-pause-seconds} (default: @code{0})
@item @code{max-conflicts} (default: @code{10})
@item @code{disable-sparse-files?} (default: @code{#f})
@item @code{disable-temp-indexes?} (default: @code{#f})
@item @code{paused?} (default: @code{#f})
@item @code{weak-hash-threshold-percentage} (default: @code{25})
@item @code{marker-name} (default: @code{".stfolder"})
@item @code{copy-ownership-from-parent?} (default: @code{#f})
@item @code{mod-time-window-seconds} (default: @code{0})
@item @code{max-concurrent-writes} (default: @code{2})
@item @code{disable-fsync?} (default: @code{#f})
@item @code{block-pull-order} (default: @code{"standard"})
@item @code{copy-range-method} (default: @code{"standard"})
@item @code{case-sensitive-file-system?} (default: @code{#f})
@item @code{junctions-as-dirs?} (default: @code{#f})
@item @code{sync-ownership?} (default: @code{#f})
@item @code{send-ownership?} (default: @code{#f})
@item @code{sync-xattrs?} (default: @code{#f})
@item @code{send-xattrs?} (default: @code{#f})
@item @code{xattr-filter-max-single-entry-size} (default: @code{1024})
@item @code{xattr-filter-max-total-size} (default: @code{4096})
@end table
@end deftp

@deftp {Data Type} syncthing-device
Data type representing a device to synchronize folders with.

@table @asis
@item @code{id}
A long hash representing the keys generated by Syncthing on the first
launch.  You can obtain this from the Syncthing GUI or by inspecting an
existing Syncthing configuration file.

@item @code{name} (default: @code{""})
A human readable device name for viewing in the GUI or in Scheme.

@item @code{compression} (default: @code{"metadata"})
@item @code{introducer?} (default: @code{#f})
@item @code{skip-introduction-removals?} (default: @code{#f})
@item @code{introduced-by} (default: @code{""})
@item @code{addresses} (default: @code{'("dynamic")})
List of addresses at which to search for this device.  When the special
value ``dynamic'' is included, Syncthing will search for the device locally
as well as via the Syncthing project's
@uref{https://docs.syncthing.net/users/security.html#global-discovery,
global discovery} servers.

@item @code{paused?} (default: @code{#f})
@item @code{auto-accept-folders?} (default: @code{#f})
@item @code{max-send-kbps} (default: @code{0})
@item @code{max-receive-kbps} (default: @code{0})
@item @code{max-request-kib} (default: @code{0})
@item @code{untrusted?} (default: @code{#f})
@item @code{remote-gui-port} (default: @code{0})
@item @code{num-connections} (default: @code{0})

@end table
@end deftp

@deftp {Data Type} syncthing-folder-device
This data type offers two folder-specific device options:
@code{introduced-by} and @code{encryption-password}.

@code{syncthing-folder-device} corresponds to the
@uref{https://docs.syncthing.net/users/config.html#config-option-folder.device,
`device'} option in the upstream `folder' element.

If you don't need to use these options, then you can just use
@code{syncthing-device} instead of @code{syncthing-folder-device} in the
@code{devices} field of a @code{syncthing-folder} instance.

@table @asis
@item @code{device}
The @code{syncthing-device} for which this configuration applies.

@item @code{introduced-by} (default: @code{""})
The name of the device that "introduced" our device to the device sharing
this folder.  This is only used when "introduced" devices are removed by the
introducer.  See @uref{https://docs.syncthing.net/users/introducer.html,
Syncthing introductions}.

@item @code{encryption-password} (default: @code{""})
The password used to encrypt data that is synchronized to untrusted devices.

Beware: specifying this field will include this password as plain text (not
encrypted) and globally visible in @file{/gnu/store/}.  If the
encryption-password is non-empty, then it will be used as a password to
encrypt file chunks as they are synchronized to untrusted devices.  For more
information on syncing to devices you don't totally trust, see Syncthing's
documentation on @uref{https://docs.syncthing.net/users/untrusted.html,
Untrusted (Encrypted) Devices}.  Note that data transfer is always encrypted
while in transport ("end-to-end encryption"), regardless of this setting.

@end table
@end deftp

Here is a more complex example configuration for illustrative purposes:

@lisp
(service syncthing-service-type
         (let ((laptop (syncthing-device (id "VHOD2D6-...-7XRMDEN")))
               (desktop (syncthing-device (id "64SAZ37-...-FZJ5GUA")
                                          (addresses '("tcp://example.com"))))
               (bob-desktop (syncthing-device (id "KYIMEGO-...-FT77EAO"))))
           (syncthing-configuration
            (user "alice")
            (config-file
             (syncthing-config-file
               (folders (list (syncthing-folder
                               (label "some-files")
                               (path "~/data")
                               (devices (list desktop laptop)))
                              (syncthing-folder
                               (label "critical-files")
                               (path "~/secrets")
                               (devices
                                (list desktop
                                      laptop
                                      (syncthing-folder-device
                                       (device bob-desktop)
                                       (encryption-password "mypassword"))))))))))))
@end lisp


Des Weiteren bietet das Modul @code{(gnu services ssh)} die folgenden
Dienste an.
@cindex SSH
@cindex SSH-Server
@defvar openssh-service-type
Dies ist der Diensttyp für den @uref{http://www.openssh.org,
OpenSSH-Secure-Shell-Daemon}, @command{sshd}. Sein Wert muss ein
@code{openssh-configuration}-Verbundsobjekt wie in diesem Beispiel sein:

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

Siehe unten für Details zur @code{openssh-configuration}.

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

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

@deftp {Datentyp} openssh-configuration
Dies ist der Verbundstyp für die Konfiguration von OpenSSHs @command{sshd}.

@table @asis
@item @code{openssh} (Vorgabe: @var{openssh})
Das zu benutzende OpenSSH-Paket.

@item @code{pid-file} (Vorgabe: @code{"/var/run/sshd.pid"})
Der Name der Datei, in die @command{sshd} seine PID schreibt.

@item @code{port-number} (Vorgabe: @code{22})
Der TCP-Port, auf dem @command{sshd} auf eingehende Verbindungen lauscht.

@item @code{max-connections} (Vorgabe: @code{200})
Harte Grenze, wie viele Client-Verbindungen gleichzeitig möglich sind,
durchgesetzt durch den im inetd-Stil startenden Shepherd-Dienst (siehe
@ref{Service De- and Constructors, @code{make-inetd-constructor},, shepherd,
The GNU Shepherd Manual}).

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

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

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

@item @code{public-key-authentication?} (Vorgabe: @code{#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 @file{~/.ssh/authorized_keys}
gespeichert. Dies wird nur für Protokollversion 2 benutzt.

@item @code{x11-forwarding?} (Vorgabe: @code{#f})
Wenn dies auf wahr gesetzt ist, ist das Weiterleiten von Verbindungen an
grafische X11-Clients erlaubt@tie{}– mit anderen Worten funktionieren dann
die @command{ssh}-Befehlszeilenoptionen @option{-X} und @option{-Y}.

@item @code{allow-agent-forwarding?} (Vorgabe: @code{#t})
Ob Weiterleitung an den SSH-Agenten zugelassen werden soll.

@item @code{allow-tcp-forwarding?} (Vorgabe: @code{#t})
Ob Weiterleitung von TCP-Kommunikation zugelassen werden soll.

@item @code{gateway-ports?} (Vorgabe: @code{#f})
Ob Ports als Zugang für eingehende Verbindungen („Gateway-Ports“)
weitergeleitet werden dürfen.

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

@item @code{use-pam?} (Vorgabe: @code{#t})
Aktiviert die Pluggable-Authentication-Module-Schnittstelle. Wenn es auf
@code{#t} gesetzt ist, wird dadurch PAM-Authentisierung über
@code{challenge-response-authentication?} und
@code{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
@code{challenge-response-authentication?} oder
@code{password-authentication?} deaktivieren.

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

@item @code{subsystems} (Vorgabe: @code{'(("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 @command{internal-sftp} implementiert einen SFTP-Server im selben
Prozess. Alternativ kann man den @command{sftp-server}-Befehl angeben:
@lisp
(service openssh-service-type
         (openssh-configuration
          (subsystems
           `(("sftp" ,(file-append openssh "/libexec/sftp-server"))))))
@end lisp

@item @code{accepted-environment} (Vorgabe: @code{'()})
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 @code{AcceptEnv} in @code{man
sshd_config}.

Mit diesem Beispiel können SSH-Clients die Umgebungsvariable @env{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.

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

@item @code{authorized-keys} (Vorgabe: @code{'()})
@cindex Autorisierte Schlüssel, SSH
@cindex SSH, autorisierte Schlüssel
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

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

@noindent
die angegebenen öffentlichen Schlüssel für die Benutzerkonten @code{rekado},
@code{chris} und @code{root} registriert.

Weitere autorisierte Schlüssel können als @code{service-extension}
hinzugefügt werden.

Beachten Sie, dass das hier neben @file{~/.ssh/authorized_keys} @emph{ohne}
sich zu stören benutzt werden kann.

@item @code{generate-host-keys?} (Vorgabe: @code{#t})
Ob Schlüsselpaare für den Rechner mit @command{ssh-keygen -A} unter
@file{/etc/ssh} erzeugt werden sollen, wenn es noch keine gibt.

Das Erzeugen von Schlüsselpaaren dauert nur ein paar Sekunden, wenn genug
Entropie vorrätig ist, und findet nur einmal statt. Wenn Sie es z.B.@: auf
einer virtuellen Maschine @emph{nicht} brauchen, etwa weil Sie die
Rechnerschlüssel schon von anderswo bekommen und die zusätzliche Zeit beim
Systemstart ein Problem ist, schalten Sie es vielleicht lieber aus.

@item @code{log-level} (Vorgabe: @code{'info})
Dieses Symbol gibt die Stufe der Protokollierung an: @code{quiet}
(schweigsam), @code{fatal}, @code{error}, @code{info}, @code{verbose}
(ausführlich), @code{debug} (Fehlersuche) etc. Siehe die Handbuchseite für
@file{sshd_config} für die vollständige Liste der Stufenbezeichnungen.

@item @code{extra-content} (Vorgabe: @code{""})
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:

@lisp
(openssh-configuration
  (extra-content "\
Match Address 192.168.0.1
  PermitRootLogin yes"))
@end lisp

@end table
@end deftp

@defvar dropbear-service-type
Diensttyp des Dienstes, um den
@uref{https://matt.ucc.asn.au/dropbear/dropbear.html,Dropbear-SSH-Daemon}
auszuführen. Sein Wert ist ein @code{<dropbear-configuration>}-Objekt.

Wenn Sie zum Beispiel einen Dropbear-Dienst angeben möchten, der auf Port
1234 lauscht:

@lisp
(service dropbear-service-type (dropbear-configuration
                                 (port-number 1234)))
@end lisp
@end defvar

@deftp {Datentyp} dropbear-configuration
Dieser Datentyp repräsentiert die Konfiguration eines Dropbear-SSH-Daemons.

@table @asis
@item @code{dropbear} (Vorgabe: @var{dropbear})
Das zu benutzende Dropbear-Paket.

@item @code{port-number} (Vorgabe: 22)
Die Portnummer des TCP-Ports, auf dem der Daemon auf eingehende Verbindungen
wartet.

@item @code{syslog-output?} (Vorgabe: @code{#t})
Ob eine Ausgabe für Syslog aktiviert sein soll.

@item @code{pid-file} (Vorgabe: @code{"/var/run/dropbear.pid"})
Der Dateiname der PID-Datei des Daemons.

@item @code{root-login?} (Vorgabe: @code{#f})
Ob Anmeldungen als Administratornutzer @code{root} möglich sein sollen.

@item @code{allow-empty-passwords?} (Vorgabe: @code{#f})
Ob leere Passwörter zugelassen sein sollen.

@item @code{password-authentication?} (Vorgabe: @code{#t})
Ob passwortbasierte Authentisierung zugelassen sein soll.
@end table
@end deftp

@cindex AutoSSH
@defvar autossh-service-type
Dies ist der Diensttyp für das @uref{https://www.harding.motd.ca/autossh,
AutoSSH-Programm}, das eine Kopie von @command{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
@command{autossh} aus dem Paket @code{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 @file{~/.ssh/config}-Datei des AutoSSH
ausführenden Benutzers.

Um zum Beispiel einen Dienst anzugeben, der autossh mit dem Benutzerkonto
@code{pino} ausführt und alle lokalen Verbindungen auf Port @code{8081} an
@code{entfernt:8081} über einen SSH-Tunnel durchzureichen, fügen Sie
folgenden Aufruf in das @code{services}-Feld des Betriebssystems ein:

@lisp
(service autossh-service-type
         (autossh-configuration
          (user "pino")
          (ssh-options (list "-T" "-N" "-L" "8081:localhost:8081" "entfernt.net"))))
@end lisp
@end defvar

@deftp {Datentyp} autossh-configuration
Dieser Datentyp repräsentiert die Konfiguration des AutoSSH-Dienstes.

@table @asis

@item @code{user} (Vorgabe: @code{"autossh"})
Das Benutzerkonto, mit dem der AutoSSH-Dienst ausgeführt wird. Es wird
vorausgesetzt, dass der angegebene Benutzer existiert.

@item @code{poll} (Vorgabe: @code{600})
Gibt an, wie oft die Verbindung geprüft wird („Poll Time“), in Sekunden.

@item @code{first-poll} (Vorgabe: @code{#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
@code{poll} angegebenen Regelmäßigkeit durchgeführt. Wenn dies auf @code{#f}
gesetzt ist, erfährt die erste Verbindungsprüfung keine Sonderbehandlung,
sondern benutzt die gleichen Zeitabstände, die auch mit @code{poll}
festgelegt wurden.

@item @code{gate-time} (Vorgabe: @code{30})
Gibt an, wie viele Sekunden lang eine SSH-Verbindung aktiv sein muss, bis
sie als erfolgreich angesehen wird.

@item @code{log-level} (Vorgabe: @code{1})
Die Protokollierungsstufe. Sie entspricht den bei Syslog verwendeten Stufen,
d.h.@: @code{0} verschweigt die meisten Ausgaben, während @code{7} die
gesprächigste Stufe ist.

@item @code{max-start} (Vorgabe: @code{#f})
Wie oft SSH (neu) gestartet werden darf, bevor AutoSSH aufgibt und sich
beendet. Steht dies auf @code{#f}, gibt es keine Begrenzung und AutoSSH kann
endlos neu starten.

@item @code{message} (Vorgabe: @code{""})
Welche Nachricht beim Prüfen von Verbindungen an die zurückkommende
Echo-Nachricht angehängt werden soll.

@item @code{port} (Vorgabe: @code{"0"})
Welche Ports zum Überprüfen der Verbindung benutzt werden. Steht dies auf
@code{"0"}, werden keine Überprüfungen durchgeführt. Steht es auf
@code{"@var{n}"} für eine positive ganze Zahl @var{n}, werden die Ports
@var{n} und @var{n}+1 zum Überwachen der Verbindung eingesetzt, wobei auf
Port @var{n} Daten dafür gesendet werden und Port @code{n+1} deren Echo
empfangen soll. Steht es auf @code{"@var{n}:@var{m}"} für positive ganze
Zahlen @var{n} und @var{m}, werden Ports @var{n} und @var{m} zur Überprüfung
eingesetzt, wozu Port @var{n} zum Senden der Prüfdaten eingesetzt wird und
Port @var{m} das Echo empfängt.

@item @code{ssh-options} (Vorgabe: @code{'()})
Die Liste der Befehlszeilenargumente, die an @command{ssh} weitergegeben
werden sollen, wenn es ausgeführt wird. Die Befehlszeilenoptionen
@option{-f} und @option{-M} sind AutoSSH vorbehalten; sie anzugeben, führt
zu undefiniertem Verhalten.

@end table
@end deftp

@cindex WebSSH
@defvar webssh-service-type
Dies ist der Diensttyp für das Programm
@uref{https://webssh.huashengdun.org/, WebSSH}, das einen webbasierten
SSH-Client ausführt. WebSSH kann von Hand aus der Befehlszeile heraus
aufgerufen werden, indem man Argumente an die Binärdatei @command{wssh} aus
dem Paket @code{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 @code{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
@code{services}-Feld des Betriebssystems ein:

@lisp
(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))))))))
@end lisp
@end defvar

@deftp {Datentyp} webssh-configuration
Repräsentiert die Konfiguration für den Dienst @code{webssh-service}.

@table @asis
@item @code{package} (Vorgabe: @code{webssh})
Zu benutzendes @code{webssh}-Paket.

@item @code{user-name} (Vorgabe: @code{"webssh"})
Der Benutzername oder der Benutzeridentifikator (d.h.@: die „User-ID“), mit
dem Dateiübertragungen zum und vom Modul stattfinden sollen.

@item @code{group-name} (Vorgabe: @code{"webssh"})
Benutzergruppenname oder Gruppenidentifikator („Group-ID“), mit dem auf das
Modul zugegriffen wird.

@item @code{address} (Vorgabe: @code{#f})
Die IP-Adresse, auf der @command{webssh} auf eingehende Verbindungen
lauscht.

@item @code{port} (Vorgabe: @code{8888})
Der TCP-Port, auf dem @command{webssh} auf eingehende Verbindungen lauscht.

@item @code{policy} (Vorgabe: @code{#f})
Die Verbindungsrichtlinie @code{reject} setzt voraus, dass erlaubte Rechner
in @var{known-hosts} eingetragen werden.

@item @code{known-hosts} (Vorgabe: @code{'()})
Eine Liste der Rechner, die für eine SSH-Verbindung aus @command{webssh}
zugelassen sind.

@item @code{log-file} (Vorgabe: @file{"/var/log/webssh.log"})
Der Name der Datei, in die @command{webssh} seine Protokolle schreibt.

@item @code{log-level} (Vorgabe: @code{#f})
Das Protokollierungsniveau.

@end table
@end deftp

@defvar block-facebook-hosts-service-type
Dieser Dienst fügt eine Liste bekannter Facebook-Rechner in die Datei
@file{/etc/hosts} ein (siehe @ref{Host Names,,, libc, Referenzhandbuch der
GNU-C-Bibliothek}). Jede Zeile enthält einen Eintrag, der einen bekannten
Servernamen des Facebook-Online-Dienstes@tie{}– z.B.@:
@code{www.facebook.com}@tie{}– zu IPv4- und IPv6-Adressen umdeutet, die
nirgendwohin geroutet werden können.

Dieser Mechanismus kann verhindern, dass lokal laufende Programme, wie
z.B.@: Web-Browser, auf Facebook zugreifen.
@end defvar

Das Modul @code{(gnu services avahi)} stellt die folgende Definition zur
Verfügung.

@defvar avahi-service-type
Dieser Dienst führt den @command{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
@uref{https://avahi.org/}). Sein Wert muss ein
@code{avahi-configuration}-Verbundsobjekt sein@tie{}– siehe unten.

Dieser Dienst erweitert den Name Service Cache Daemon (nscd), damit er
@code{.local}-Rechnernamen mit
@uref{https://0pointer.de/lennart/projects/nss-mdns/, nss-mdns} auflösen
kann. Siehe @ref{Name Service Switch} für Informationen zur Auflösung von
Rechnernamen.

Des Weiteren wird das @var{avahi}-Paket zum Systemprofil hinzugefügt, damit
Befehle wie @command{avahi-browse} einfach benutzt werden können.
@end defvar

@deftp {Datentyp} avahi-configuration
Dieser Datentyp repräsentiert die Konfiguration von Avahi.

@table @asis

@item @code{host-name} (Vorgabe: @code{#f})
Wenn dies auf etwas anderes als @code{#f} gesetzt ist, wird es anderen als
Rechnername für diese Maschine mitgeteilt, andernfalls wird der tatsächliche
Rechnername anderen mitgeteilt.

@item @code{publish?} (Vorgabe: @code{#t})
Wenn es auf wahr gesetzt ist, dürfen Rechnernamen und Avahi-Dienste über das
Netzwerk mitgeteilt werden (als Broadcast).

@item @code{publish-workstation?} (Vorgabe: @code{#t})
Wenn es auf wahr gesetzt ist, teilt @command{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:

@example
avahi-browse _workstation._tcp
@end example

@item @code{wide-area?} (Vorgabe: @code{#f})
Wenn dies auf wahr gesetzt ist, ist DNS-SD über „Unicast DNS“ aktiviert.

@item @code{ipv4?} (Vorgabe: @code{#t})
@itemx @code{ipv6?} (Vorgabe: @code{#t})
Mit diesen Feldern wird festgelegt, ob IPv4-/IPv6-Sockets verwendet werden.

@item @code{domains-to-browse} (Vorgabe: @code{'()})
Dies ist eine Liste von Domänen, die durchsucht werden.
@end table
@end deftp

@defvar openvswitch-service-type
Dies ist der Diensttyp des @uref{https://www.openvswitch.org,
Open-vSwitch-Dienstes}, der als Wert ein
@code{openvswitch-configuration}-Objekt hat.
@end defvar

@deftp {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.

@table @asis
@item @code{package} (Vorgabe: @var{openvswitch})
Das Paketobjekt vom Open vSwitch.

@end table
@end deftp

@defvar pagekite-service-type
Dies ist der Diensttyp für den @uref{https://memcached.org/,
PageKite-Dienst}, 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 @code{pagekite-configuration}-Verbundsobjekt.

Hier ist ein Beispiel, wodurch die lokal laufenden HTTP- und SSH-Daemons
zugänglich gemacht werden:

@lisp
(service pagekite-service-type
         (pagekite-configuration
           (kites '("http:@@kitename:localhost:80:@@kitesecret"
                    "raw/22:@@kitename:localhost:22:@@kitesecret"))
           (extra-file "/etc/pagekite.rc")))
@end lisp
@end defvar

@deftp {Datentyp} pagekite-configuration
Der Datentyp, der die Konfiguration von PageKite repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @var{pagekite})
Paketobjekt von PageKite.

@item @code{kitename} (Vorgabe: @code{#f})
PageKite-Name, um sich gegenüber dem Vordergrundserver zu authentisieren.

@item @code{kitesecret} (Vorgabe: @code{#f})
Das gemeinsame Geheimnis, das eine Authentisierung gegenüber dem
Vordergrundserver ermöglicht. Wahrscheinlich sollten Sie es besser als Teil
von @code{extra-file} angeben.

@item @code{frontend} (Vorgabe: @code{#f})
Eine Verbindung zum angegebenen PageKite-Vordergrundserver herstellen statt
zu dem Dienst von @uref{https://pagekite.net,,pagekite.net}.

@item @code{kites} (Vorgabe: @code{'("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 @code{protokoll:kitename:rechnername:port:geheimnis} anzugeben.

@item @code{extra-file} (Vorgabe: @code{#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.

@end table
@end deftp

@defvar yggdrasil-service-type
Der Diensttyp, um eine Verbindung mit dem
@uref{https://yggdrasil-network.github.io/, Yggdrasil-Netzwerk}
herzustellen, einer frühen Implementierungsstufe eines völlig
Ende-zu-Ende-verschlüsselten IPv6-Netzwerks.

@quotation
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
@uref{https://yggdrasil-network.github.io/2018/07/28/addressing.html}
@end quotation

Übergeben Sie einen Wert vom Typ @code{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 @file{/etc/yggdrasil-private.conf} definiert (dies ist die Vorgabe
für @code{config-file}).

@lisp
;; 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
               ))
@end lisp
@example
# Beispielinhalt für /etc/yggdrasil-private.conf
@{
  # Ihr privater Signierschlüssel. Geben Sie ihn NICHT weiter!
  PrivateKey: 5c750…
@}
@end example
@end defvar

@deftp {Datentyp} yggdrasil-configuration
Repräsentiert die Konfiguration von Yggdrasil.

@table @asis
@item @code{package} (Vorgabe: @code{yggdrasil})
Paketobjekt von Yggdrasil.

@item @code{json-config} (Vorgabe: @code{'()})
Der Inhalt von @file{/etc/yggdrasil.conf}. Er wird mit
@file{/etc/yggdrasil-private.conf} zusammengelegt. Beachten Sie, dass diese
Einstellungen im Guix-Store gespeichert werden, auf den alle Nutzer Zugriff
haben. @strong{Speichern Sie dort nicht Ihre privaten Schlüssel}. Siehe die
Ausgabe von @code{yggdrasil -genconf} für eine kurze Übersicht über gültige
Schlüssel und ihre Vorgabewerte.

@item @code{autoconf?} (Vorgabe: @code{#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.

@item @code{log-level} (Vorgabe: @code{'info})
Wie detailliert die Protokolle sein sollen. Schreiben Sie @code{'debug} für
einen höheren Detailgrad.

@item @code{log-to} (Vorgabe: @code{'stdout})
Wohin Protokolle geschickt werden. Die Vorgabe ist, dass der Dienst ein
Protokoll seiner Standardausgabe in @file{/var/log/yggdrasil.log}
schreibt. Die Alternative ist @code{'syslog}, wodurch die Ausgabe an den
laufenden syslog-Dienst geschickt wird.

@item @code{config-file} (Vorgabe: @code{"/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 @code{#f} zum
Deaktivieren. In dieser Datei festgelegte Optionen haben Vorrang vor
@code{json-config}. Tragen Sie anfangs die Ausgabe von @code{yggdrasil
-genconf} ein. Um eine statische Adresse zu benutzen, löschen Sie alles
außer der Option PrivateKey.

@end table
@end deftp

@cindex IPFS
@defvar ipfs-service-type
Der Diensttyp, um sich mit dem @uref{https://ipfs.io,IPFS-Netzwerk} zu
verbinden, einem weltweiten, versionierten, von einem Netzwerkteilnehmer zum
anderen („peer-to-peer“) verteilten Dateisystem. Geben Sie ein
@code{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:

@lisp
(service ipfs-service-type
         (ipfs-configuration
          (gateway "/ip4/127.0.0.1/tcp/8880")
          (api "/ip4/127.0.0.1/tcp/8881")))
@end lisp
@end defvar

@deftp {Datentyp} ipfs-configuration
Repräsentiert die Konfiguration des IPFS.

@table @asis
@item @code{package} (Vorgabe: @code{go-ipfs})
Paketobjekt von IPFS.

@item @code{gateway} (Vorgabe: @code{"/ip4/127.0.0.1/tcp/8082"})
Die Adresse des Netzwerkzugangs im Format einer Multiadresse
(„multiaddress“).

@item @code{api} (Vorgabe: @code{"/ip4/127.0.0.1/tcp/5001"})
Die Adresse des API-Endpunkts im Format einer Multiadresse („multiaddress“).
@end table
@end deftp

@cindex keepalived
@defvar keepalived-service-type
Dies ist der Diensttyp für die Software @uref{https://www.keepalived.org/,
Keepalived} für virtuelle Router, @command{keepalived}. Sein Wert muss ein
@code{keepalived-configuration}-Verbundsobjekt sein, wie in diesem Beispiel
für die Maschine erster Wahl (Master):

@lisp
(service keepalived-service-type
         (keepalived-configuration
           (config-file (local-file "keepalived-master.conf"))))
@end lisp

Dabei enthält @file{keepalived-master.conf}:

@example
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
  @}
@}
@end example

Für die Ersatzmaschine (Backup):

@lisp
(service keepalived-service-type
         (keepalived-configuration
          (config-file (local-file "keepalived-backup.conf"))))
@end lisp

Dort enthält @file{keepalived-backup.conf}:

@example
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
  @}
@}
@end example
@end defvar

@node Unbeaufsichtigte Aktualisierungen
@subsection Unbeaufsichtigte Aktualisierungen

@cindex unbeaufsichtigte Aktualisierungen
@cindex Aktualisierungen, unbeaufsichtigt
Das Modul @code{(gnu services admin)} stellt einen Dienst zum Durchführen
@emph{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:

@itemize
@item
Aktualisierungen sind transaktionell: Entweder ist die Aktualisierung
erfolgreich oder sie schlägt fehl, aber Sie können sich nicht in einem
Systemzustand „dazwischen“ wiederfinden.
@item
Ein Protokoll über die Aktualisierungen liegt vor@tie{}– Sie können es mit
@command{guix system list-generations} einsehen@tie{}– 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.
@item
Der Code für Kanäle wird authentifiziert, wodurch Sie sich sicher sein
können, dass Sie nur unverfälschten Code ausführen (siehe @ref{Kanäle}).
@item
@command{guix system reconfigure} verweigert ein Herabstufen auf alte
Versionen; das macht @dfn{Herabstufungsangriffe} („Downgrade Attacks“)
unmöglich.
@end itemize

Um unbeaufsichtigte Aktualisierungen einzurichten, fügen Sie eine Instanz
des Diensttyps @code{unattended-upgrade-service-type} wie im folgenden
Beispiel zur Liste Ihrer Betriebssystemdienste hinzu:

@lisp
(service unattended-upgrade-service-type)
@end lisp

Durch die Vorgabeeinstellungen hat dies wöchentliche Aktualisierungen zur
Folge, jeden Sonntag um Mitternacht. Sie müssen keine
Betriebssystemkonfigurationsdatei angeben:
@file{/run/current-system/configuration.scm} wird benutzt, wodurch immer
Ihre letzte Konfiguration weiter verwendet wird@tie{}– siehe den
@ref{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
@command{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 @command{guix system describe} ausführen. Um
Fehlschläge zu untersuchen, schauen Sie in die Protokolldatei für
unbeaufsichtigte Aktualisierungen (siehe unten).

@defvar unattended-upgrade-service-type
Dies ist der Diensttyp für unbeaufsichtigte Aktualisierungen. Damit wird ein
Shepherd-Timer eingerichtet (siehe @ref{Geplante Auftragsausführung}), der
@command{guix system reconfigure} mit der neuesten Version der angegebenen
Kanäle ausführt.

Sein Wert muss ein @code{unattended-upgrade-configuration}-Verbundsobjekt
sein (siehe unten).
@end defvar

@deftp {Datentyp} unattended-upgrade-configuration
Dieser Datentyp repräsentiert die Konfiguration des Dienstes für
unbeaufsichtigte Aktualisierungen. Folgende Felder stehen zur Verfügung:

@table @asis
@item @code{schedule} (Vorgabe: @code{"30 01 * * 0"})
This is the schedule of upgrades, expressed as a string in traditional cron
syntax or as a gexp evaluating to a Shepherd calendar event
(@pxref{Timers,,, shepherd, The GNU Shepherd Manual}).

@item @code{channels} (Vorgabe: @code{#~%default-channels})
Dieser G-Ausdruck gibt an, welche Kanäle für die Aktualisierung benutzt
werden sollen (siehe @ref{Kanäle}). Nach Vorgabe wird die Spitze des
offiziellen @code{guix}-Kanals benutzt.

@item @code{operating-system-file} (Vorgabe: @code{"/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
@file{/run/current-system/configuration.scm} zu verweisen, zum Beispiel weil
sich diese mit @code{local-file} oder Ähnlichem auf weitere Dateien wie
öffentliche SSH-Schlüssel, andere Konfigurationsdateien usw.@: bezieht. Dann
empfehlen wir, etwas wie hier zu schreiben:

@lisp
(unattended-upgrade-configuration
  (operating-system-file
    (file-append (local-file "." "config-dir" #:recursive? #t)
                 "/config.scm")))
@end lisp

Das bewirkt, dass das ganze aktuelle Verzeichnis in den Store importiert
wird und Bezug auf die @file{config.scm} darin genommen wird. So
funktioniert die Nutzung von @code{local-file} in @file{config.scm} wie
erwartet. Siehe @ref{G-Ausdrücke} für Informationen zu @code{local-file}
und @code{file-append}.

@item @code{operating-system-expression} (Vorgabe: @code{#f})
In diesem Feld können Sie einen Ausdruck angeben, der zu dem Betriebssystem
auswertet, auf das aktualisiert werden soll. Wenn hier kein Wert angegeben
wird, wird der Wert des Feldes @code{operating-system-file} benutzt.

@lisp
(unattended-upgrade-configuration
  (operating-system-expression
    #~(@@ (guix system install) installation-os)))
@end lisp

@item @code{reboot?} (default: @code{#f})
This field specifies whether the system should reboot after completing an
unattended upgrade.

When @code{reboot?} is @code{#t}, services are not restarted before
rebooting.  This means that the value for @code{services-to-restart} is
ignored.  The updated services will be started after the system reboots.

@item @code{services-to-restart} (default: @code{'(unattended-upgrade)})
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
@command{herd restart} tun würde. Dadurch wird sichergestellt, dass die
neueste Version läuft@tie{}– bedenken Sie, dass @command{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 @command{herd status} aus, um herauszufinden, welche Dienste Sie
neu starten lassen können. Siehe @ref{Dienste} für allgemeine Informationen
über Dienste. Oft würde man Dienste wie unter anderem @code{ntpd} und
@code{ssh-daemon} neu starten lassen.

Nach Vorgabe wird der @code{unattended-upgrade}-Dienst neu
gestartet. Dadurch wird beim nächsten Mal sicherlich die neueste Version des
Auftrags für unbeaufsichtigte Aktualisierungen benutzt.

@item @code{system-expiration} (Vorgabe: @code{(* 3 30 24 3600)})
Nach wie vielen Sekunden Systemgenerationen auslaufen. Systemgenerationen,
die dieses Alter überschritten haben, werden über @command{guix system
delete-generations} gelöscht, nachdem eine Aktualisierung abgeschlossen
wurde.

@quotation 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 @command{guix gc} ausführt.
@end quotation

@item @code{maximum-duration} (Vorgabe: @code{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.

@item @code{log-file} (Vorgabe: @code{"/var/log/unattended-upgrade.log"})
Die Datei, in die über unbeaufsichtigte Aktualisierungen Protokoll geführt
wird.
@end table
@end deftp

@node X Window
@subsection X Window

@cindex X11
@cindex X Window System
@cindex Anmeldeverwaltung
Unterstützung für das grafische Anzeigesystem X Window@tie{}– insbesondere
Xorg@tie{}– wird vom Modul @code{(gnu services xorg)} zur Verfügung
gestellt. Beachten Sie, dass es @emph{keine} @code{xorg-service}-Prozedur
gibt, sondern der X-Server durch eine Software zur @dfn{Anmeldeverwaltung}
gestartet wird (ein „Login Manager“). Vorgegeben ist, dass zur
Anzeigenverwaltung der GNOME Display Manager (GDM) benutzt wird.

@cindex GDM
@cindex GNOME, Anmeldeverwaltung
@anchor{gdm}
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.

@cindex Fensterverwaltung
Um X11 zu benutzen, müssen Sie ein Programme zur @dfn{Fensterverwaltung}
(„Window-Manager“) oder mehrere davon installieren@tie{}– zum Beispiel die
Pakete @code{windowmaker} oder @code{openbox}@tie{}–, vorzugsweise indem Sie
sie in das @code{packages}-Feld Ihrer Betriebssystemdefinition eintragen
(siehe @ref{„operating-system“-Referenz, global sichtbare Pakete}).

GDM hat auch Unterstützung für Wayland: Es kann selbst als Wayland-Client
statt mit X11 gestartet werden und Wayland-Sitzungen starten. Die Vorgabe
ist, dass Wayland unterstützt wird. Um die Wayland-Unterstützung zu
deaktivieren, setzen Sie @code{wayland?} auf @code{#f} in der
@code{gdm-configuration}.

@defvar gdm-service-type
Dies ist der Diensttyp für den @uref{https://wiki.gnome.org/Projects/GDM/,
GNOME Desktop Manager}, GDM, ein Programm zur Verwaltung grafischer
Anzeigeserver, das grafische Benutzeranmeldungen durchführt. Sein Wert muss
eine @code{gdm-configuration} sein (siehe unten).

@cindex Sitzungstypen
GDM liest die in den @file{.desktop}-Dateien in
@file{/run/current-system/profile/share/xsessions} (bei X11-Sitzungen) und
nach @file{/run/current-system/profile/share/wayland-sessions} (bei
Wayland-Sitzungen) befindlichen @dfn{Sitzungstypen} ein und stellt diese
seinen Nutzern zur Auswahl auf dem Anmeldebildschirm. Pakete wie
@code{gnome}, @code{xfce}, @code{i3} und @code{sway} stellen
@file{.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 @file{~/.xsession}-Dateien berücksichtigt. Wenn es
vorhanden ist, muss @file{~/.xsession} eine ausführbare Datei sein, die ein
Programm zur Fensterverwaltung und/oder andere X-Clients startet.
@end defvar

@deftp {Datentyp} gdm-configuration
@table @asis
@item @code{auto-login?} (Vorgabe: @code{#f})
@itemx @code{default-user} (Vorgabe: @code{#f})
Wenn @code{auto-login?} falsch ist, zeigt GDM einen Anmeldebildschirm an.

Wenn @code{auto-login?} wahr ist, meldet GDM automatisch den in
@code{default-user} angegebenen voreingestellten Benutzer an.

@item @code{auto-suspend?} (Vorgabe: @code{#t})
Wenn es wahr ist, wird GDM automatisch das System in den Bereitschaftsmodus
schalten, bis wieder jemand persönlich anwesend ist und es aus dem
Arbeitsspeicher (RAM) wieder aufwecken kann. Wenn geplant ist, die Maschine
für entfernte Sitzungen oder SSH zu benutzen, sollte es auf falsch gesetzt
werden, damit GDM nicht entfernte Sitzungen unterbricht oder die
Verfügbarkeit der Maschine stört.

@item @code{debug?} (Vorgabe: @code{#f})
Wenn es wahr ist, schreibt GDM Informationen zur Fehlersuche in sein
Protokoll.

@item @code{gnome-shell-assets} (Vorgabe: …)
Liste der GNOME-Shell-„Assets“, die GDM benötigt, d.h.@: Symbolthema,
Schriftarten etc.

@item @code{xorg-configuration} (Vorgabe: @code{(xorg-configuration)})
Xorg-Server für grafische Oberflächen konfigurieren.

@item @code{x-session} (Vorgabe: @code{(xinitrc)})
Das Skript, das vor dem Starten einer X-Sitzung ausgeführt werden soll.

@item @code{xdmcp?} (Vorgabe: @code{#f})
Wenn dies auf wahr gesetzt ist, wird das X Display Manager Control Protocol
(XDMCP) aktiviert. Sie sollten es nur in vertrauenswürdigen Umgebungen
aktivieren, denn das Protokoll ist @emph{nicht} sicher. Wenn es aktiviert
ist, lauscht GDM auf XDMCP-Anfragen auf UDP-Port 177.

@item @code{dbus-daemon} (Vorgabe: @code{dbus-daemon-wrapper})
Der Dateiname der ausführbaren Datei des @code{dbus-daemon}-Programms.

@item @code{gdm} (Vorgabe: @code{gdm})
Das GDM-Paket, was benutzt werden soll.

@item @code{wayland?} (Vorgabe: @code{#t})
Wenn es wahr ist, wird Wayland in GDM aktiviert. Das ist nötig, um
Wayland-Sitzungen zu benutzen.

@item @code{wayland-session} (Vorgabe: @code{gdm-wayland-session-wrapper})
Das Wrapper-Skript für Wayland-Sitzungen, was benutzt werden soll. Es ist
notwendig, um die Umgebung zu starten.
@end table
@end deftp

@defvar slim-service-type
Dies ist der Diensttyp für die schlanke grafische Anmeldungsverwaltung SLiM
für X11.

Wie GDM liest SLiM die in @file{.desktop}-Dateien beschriebenen
Sitzungstypen aus und ermöglicht es Nutzern, eine Sitzung darunter im
Anmeldebildschirm durch Drücken von @kbd{F1} auszuwählen. Auch
@file{~/.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.

@lisp
(use-modules (gnu services)
             (gnu services desktop)
             (gnu services xorg))

(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)))))
@end lisp

@end defvar

@deftp {Datentyp} slim-configuration
Datentyp, der die Konfiguration des @code{slim-service-type} repräsentiert.

@table @asis
@item @code{allow-empty-passwords?} (Vorgabe: @code{#t})
Ob Anmeldungen mit leeren Passwörtern möglich sein sollen.

@item @code{gnupg?} (Vorgabe: @code{#f})
Wenn dies aktiviert ist, wird durch @code{pam-gnupg} automatisch versucht,
die GPG-Schlüssel des Nutzers über @code{gpg-agent} mit dem Anmeldepasswort
zu entsperren. Für jeden Schlüssel, der entsperrt werden soll, müssen Sie
den Keygrip, der den Schlüssel bezeichnet, in @file{~/.pam-gnupg} schreiben;
er kann mit @code{gpg -K --with-keygrip} erfragt werden. Damit das
funktioniert, müssen Sie Presetting von Passphrasen aktivieren, indem Sie
@code{allow-preset-passphrase} in @file{~/.gnupg/gpg-agent.conf} hinzufügen.

@item @code{auto-login?} (Vorgabe: @code{#f})
@itemx @code{default-user} (Vorgabe: @code{""})
Wenn @code{auto-login?} falsch ist, zeigt SLiM einen Anmeldebildschirm an.

Wenn @code{auto-login?} wahr ist, meldet SLiM automatisch den in
@code{default-user} angegebenen voreingestellten Benutzer an.

@item @code{theme} (Vorgabe: @code{%default-slim-theme})
@itemx @code{theme-name} (Vorgabe: @code{%default-slim-theme-name})
Das grafische Thema, was benutzt werden soll, mit seinem Namen.

@item @code{auto-login-session} (Vorgabe: @code{#f})
Wenn es wahr ist, muss es den Namen der ausführbaren Datei angeben, die als
voreingestellte Sitzung gestartet werden soll@tie{}– z.B.@:
@code{(file-append windowmaker "/bin/windowmaker")}.

Wenn es falsch ist, wird eine von einer der @file{.desktop}-Dateien in
@code{/run/current-system/profile} und @code{~/.guix-profile} beschriebenen
Sitzungen benutzt.

@quotation Anmerkung
Sie müssen mindestens ein Fensterverwaltungsprogramm in das Systemprofil
oder Ihr Benutzerprofil installieren, ansonsten können Sie sich, sofern
@code{auto-login-session} falsch ist, nicht anmelden.
@end quotation

@item @code{xorg-configuration} (Vorgabe: @code{(xorg-configuration)})
Xorg-Server für grafische Oberflächen konfigurieren.

@item @code{display} (Vorgabe: @code{":0"})
Die Anzeige, auf welcher der Xorg-Server für grafische Oberflächen gestartet
werden soll.

@item @code{vt} (Vorgabe: @code{"vt7"})
Das virtuelle Terminal, auf dem der Xorg-Server für grafische Oberflächen
gestartet werden soll.

@item @code{xauth} (Vorgabe: @code{xauth})
Das XAuth-Paket, das benutzt werden soll.

@item @code{shepherd} (Vorgabe: @code{shepherd})
Das Shepherd-Paket, das benutzt wird, wenn @command{halt} und
@command{reboot} aufgerufen werden.

@item @code{sessreg} (Vorgabe: @code{sessreg})
Das sessreg-Paket, das zum Registrieren der Sitzung benutzt werden soll.

@item @code{slim} (Vorgabe: @code{slim})
Das zu benutzende SLiM-Paket.
@end table
@end deftp

@defvar %default-theme
@defvarx %default-theme-name
Das vorgegebene Thema für das Aussehen von SLiM mit seinem Namen.
@end defvar


@cindex Anmeldeverwaltung
@cindex X11-Anmeldung
@defvar sddm-service-type
Dies ist der Typ des Dienstes, mit dem die
@uref{https://github.com/sddm/sddm,SDDM-Anzeigenverwaltung} gestartet
wird. Sein Wert muss ein @code{sddm-configuration}-Verbundsobjekt sein
(siehe unten).

Hier ist ein Beispiel für seine Verwendung:

@lisp
(service sddm-service-type
         (sddm-configuration
           (auto-login-user "alice")
           (auto-login-session "xfce.desktop")))
@end lisp
@end defvar

@deftp {Datentyp} sddm-configuration
Dieser Datentyp repräsentiert die Konfiguration der
SDDM-Anmeldeverwaltung. Die verfügbaren Felder sind:

@table @asis
@item @code{sddm} (Vorgabe: @code{sddm})
Das SDDM-Paket, was benutzt werden soll.

@quotation Anmerkung
In SDDM die Version Qt6 vorgegeben. Wenn Sie weiterhin ein Qt5-Thema
benutzen möchten, müssen Sie dies auf @code{sddm-qt5} setzen.
@end quotation

@item @code{display-server} (Vorgabe: "x11")
Einen Anzeigeserver auswählen, der für den Anmeldebildschirm verwendet
werden soll. Zulässige Werte sind @samp{"x11"} oder @samp{"wayland"}.

@item @code{numlock} (Vorgabe: "on")
Gültige Werte sind @samp{"on"}, @samp{"off"} oder @samp{"none"}.

@item @code{halt-command} (Vorgabe: @code{#~(string-append #$shepherd "/sbin/halt")})
Der Befehl, der zum Anhalten des Systems ausgeführt wird.

@item @code{reboot-command} (Vorgabe: @code{#~(string-append #$shepherd "/sbin/reboot")})
Der Befehl, der zum Neustarten des Systems ausgeführt wird.

@item @code{theme} (Vorgabe: "maldives")
Welches Thema für das Aussehen benutzt werden soll. Mit SDDM mitgelieferte
Themen sind @samp{"elarun"}, @samp{"maldives"} und @samp{"maya"}.

@item @code{themes-directory} (Vorgabe: "/run/current-system/profile/share/sddm/themes")
Verzeichnis, wo Themen gefunden werden können.

@item @code{faces-directory} (Vorgabe: "/run/current-system/profile/share/sddm/faces")
Verzeichnis, wo Avatarbilder gefunden werden können.<

@item @code{default-path} (Vorgabe: "/run/current-system/profile/bin")
Welcher PATH voreingestellt sein soll.

@item @code{minimum-uid} (Vorgabe: 1000)
Der kleinste Benutzeridentifikator (UID), mit dem Benutzer in SDDM angezeigt
werden und sich anmelden können.

@item @code{maximum-uid} (Vorgabe: 2000)
Der größte Benutzeridentifikator (UID), mit dem Benutzer in SDDM angezeigt
werden.<

@item @code{remember-last-user?} (Vorgabe: #t)
Den zuletzt ausgewählten Benutzer voreinstellen.

@item @code{remember-last-session?} (Vorgabe: #t)
Die zuletzt ausgewählte Sitzung voreinstellen.

@item @code{hide-users} (Vorgabe: "")
Benutzernamen, die in SDDM @emph{nicht} sichtbar sein sollen.

@item @code{hide-shells} (Vorgabe: @code{#~(string-append #$shadow "/sbin/nologin")})
Benutzerkonten, für die als Shell eine davon eingestellt ist, wird SDDM
@emph{nicht} anzeigen.

@item @code{session-command} (Vorgabe: @code{#~(string-append #$sddm "/share/sddm/scripts/wayland-session")})
Das Skript, das vor dem Starten einer Wayland-Sitzung ausgeführt werden
soll.

@item @code{sessions-directory} (Vorgabe: "/run/current-system/profile/share/wayland-sessions")
Verzeichnis, das nach .desktop-Dateien zum Starten von Wayland-Sitzungen
durchsucht wird.

@item @code{xorg-configuration} (Vorgabe: @code{(xorg-configuration)})
Xorg-Server für grafische Oberflächen konfigurieren.

@item @code{xauth-path} (Vorgabe: @code{#~(string-append #$xauth "/bin/xauth")})
Pfad von xauth.

@item @code{xephyr-path} (Vorgabe: @code{#~(string-append #$xorg-server "/bin/Xephyr")})
Pfad von Xephyr.

@item @code{xdisplay-start} (Vorgabe: @code{#~(string-append #$sddm "/share/sddm/scripts/Xsetup")})
Skript, das nach dem Starten vom Xorg-Server ausgeführt wird.

@item @code{xdisplay-stop} (Vorgabe: @code{#~(string-append #$sddm "/share/sddm/scripts/Xstop")})
Skript, das vor dem Stoppen vom Xorg-Server ausgeführt wird.

@item @code{xsession-command} (Vorgabe: @code{xinitrc})
Das Skript, das vor dem Starten einer X-Sitzung ausgeführt werden soll.

@item @code{xsessions-directory} (Vorgabe: "/run/current-system/profile/share/xsessions")
Verzeichnis, das nach .desktop-Dateien zum Starten von X-Sitzungen
durchsucht wird.<

@item @code{minimum-vt} (Vorgabe: 7)
Das kleinste virtuelle Terminal, das benutzt werden darf.

@item @code{auto-login-user} (Vorgabe: "")
Das Benutzerkonto, mit dem man automatisch angemeldet wird. Wenn es leer
ist, gibt es keine automatische Anmeldung.

@item @code{auto-login-session} (Vorgabe: "")
Gibt den Namen der @file{.desktop}-Datei an, die bei automatischer Anmeldung
für die Sitzung verwendet wird, oder eine leere Zeichenkette.

@item @code{relogin?} (Vorgabe: #f)
Ob nach dem Abmelden neu angemeldet werden soll.

@end table
@end deftp

@cindex LightDM, grafische Anmeldeverwaltung
@cindex Anzeigenverwaltung, LightDM
@anchor{lightdm}
@defvar lightdm-service-type
Dies ist der Typ des Dienstes, mit dem die
@url{https://github.com/canonical/lightdm,LightDM-Anzeigenverwaltung}
ausgeführt wird. Sein Wert muss ein
@code{lightdm-configuration}-Verbundsobjekt sein. Dieses wird weiter unten
beschrieben. LightDM zeichnet sich dadurch aus, dass er mit TigerVNC
integriert ist und man so leichten Fernzugriff über das XDMCP-Protokoll
einrichten kann, so dass man von außen mit einem entfernten Rechner eine
Sitzung anmelden kann.

Für die Grundeinstellung geben Sie einfach an:

@lisp
(service lightdm-service-type)
@end lisp

Ein zielgerichteteres Beispiel wäre etwa, die VNC-Fähigkeit und weitere
Funktionalitäten zusammen mit ausführlicher Protokollierung zu
aktivieren. Das ginge so:

@lisp
(service lightdm-service-type
         (lightdm-configuration
          (allow-empty-passwords? #t)
          (xdmcp? #t)
          (vnc-server? #t)
          (vnc-server-command
           (file-append tigervnc-server "/bin/Xvnc"
                        "  -SecurityTypes None"))
          (seats
           (list (lightdm-seat-configuration
                  (name "*")
                  (user-session "ratpoison"))))))
@end lisp
@end defvar

@c The LightDM service documentation can be auto-generated via the
@c 'generate-doc' procedure at the bottom of the (gnu services lightdm)
@c module.
@c %start of fragment
@deftp {Datentyp} lightdm-configuration
Verfügbare @code{lightdm-configuration}-Felder sind:

@table @asis
@item @code{lightdm} (Vorgabe: @code{lightdm}) (Typ: dateiartig)
Das zu benutzende lightdm-Paket.

@item @code{allow-empty-passwords?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ob man sich auch bei Benutzerkonten, die ein leeres Passwort haben, anmelden
kann.

@item @code{debug?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ausführliche Ausgaben schreiben.

@item @code{xorg-configuration} (Typ: xorg-configuration)
Eine Konfiguration des Xorg-Servers, aus der das Start-Skript für den
Xorg-Server erzeugt wird. Sie können für jeden Seat mit dem Feld
@code{xserver-command} des @code{<lightdm-seat-configuration>}-Verbunds
genauere Einstellungen vornehmen, wenn Sie möchten.

@item @code{greeters} (Typ: Liste-von-„greeter-configuration“)
Die LightDM-Greeter-Konfigurationen, welche die zu benutzenden Greeter
festlegen.

@item @code{seats} (Typ: Liste-von-„seat-configuration“)
Die Konfigurationen der „Seats“. Ein Seat in LightDM entspricht ungefähr
einem Benutzer.

@item @code{xdmcp?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ob ein XDMCP-Server auf UDP-Port 177 lauschen soll.

@item @code{xdmcp-listen-address} (Typ: Vielleicht-Zeichenkette)
Der Rechnername oder die IP-Adresse, wofür der XDMCP-Server auf eingehende
Verbindungen lauscht. Wird nichts angegeben, wird auf allen verfügbaren
Rechnernamen bzw.@: IP-Adressen gelauscht.

@item @code{vnc-server?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ob ein VNC-Server gestartet werden soll.

@item @code{vnc-server-command} (Typ: dateiartig)
Welcher Xvnc-Befehl für den VNC-Server benutzt werden soll. So können
zusätzliche, anderweitig unerreichbare Optionen dem Befehl mitgegeben
werden. Zum Beispiel können Sie dessen Sicherheitsmaßnahmen abschalten:

@lisp
(vnc-server-command (file-append tigervnc-server "/bin/Xvnc"
                                 " -SecurityTypes None" ))
@end lisp

Oder Sie können eine Passwortdatei für den klassischen (unsicheren)
Authentifizierungsmechanismus VncAuth festlegen:

@lisp
(vnc-server-command (file-append tigervnc-server "/bin/Xvnc"
                                 " -PasswordFile /var/lib/lightdm/.vnc/passwd"))
@end lisp

Die Passwortdatei sollte man manuell erzeugen mit dem Befehl
@command{vncpasswd}. Beachten Sie, dass LightDM neue Sitzungen für
VNC-Nutzer anlegt, deshalb müssen sich diese genauso authentisieren wie
lokale Benutzer.

@item @code{vnc-server-listen-address} (Typ: Vielleicht-Zeichenkette)
Auf welchem Rechnernamen oder welcher IP-Adresse der VNC-Server auf
eingehende Verbindungen lauscht. Wird nichts angegeben, wird auf allen
Rechnernamen und Adressen gelauscht.

@item @code{vnc-server-port} (Vorgabe: @code{5900}) (Typ: Zahl)
Die TCP-Portnummer, auf der der VNC-Server lauschen soll.

@item @code{extra-config} (Vorgabe: @code{'()}) (Typ: Liste-von-Zeichenketten)
Zusätzliche Konfigurationswerte, die an LightDMs Konfigurationsdatei
angehängt werden.

@end table
@end deftp


@c %end of fragment
@c %start of fragment

@deftp {Datentyp} lightdm-gtk-greeter-configuration
Verfügbare @code{lightdm-gtk-greeter-configuration}-Felder sind:

@table @asis
@item @code{lightdm-gtk-greeter} (Vorgabe: @code{lightdm-gtk-greeter}) (Typ: dateiartig)
Das „lightdm-gtk-greeter“-Paket, was benutzt werden soll.

@item @code{assets} (Vorgabe: @code{(adwaita-icon-theme gnome-themes-extra hicolor-icon-theme)}) (Typ: Liste-von-Dateiartigen)
Die Liste von Paketen, die zum Greeter dazugehören, z.B.@: Pakete mit
Symbolthemen, die deren Aussehen bestimmen.

@item @code{theme-name} (Vorgabe: @code{"Adwaita"}) (Typ: Zeichenkette)
Der Name des zu benutzenden Themas.

@item @code{icon-theme-name} (Vorgabe: @code{\"Adwaita\"}) (Typ: Zeichenkette)
Der Name des zu benutzenden Symbolthemas.

@item @code{cursor-theme-name} (Vorgabe: @code{\"Adwaita\"}) (Typ: Zeichenkette)
Der Name des zu benutzenden Zeigerthemas.

@item @code{cursor-theme-size} (Vorgabe: @code{16}) (Typ: Zahl)
Die Größe, die für das Zeigerthema benutzt wird.

@item @code{allow-debugging?} (Typ: Vielleicht-Boolescher-Ausdruck)
Setzen Sie es auf #t, wenn Sie die Fehlersuch-Ausführlichkeitsstufe
aktivieren möchten.

@item @code{background} (Typ: dateiartig)
Welches Hintergrundbild benutzt werden soll.

@item @code{at-spi-enabled?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Funktionen zur Barrierefreiheit aktivieren. Dazu wird AT-SPI bereitgestellt,
eine Schnittstelle für Assistenzprogramme (Assistive Technology Service
Provider Interface).

@item @code{a11y-states} (Vorgabe: @code{(contrast font keyboard reader)}) (Typ: Liste-von-Barrierefreiheiten
Welche Funktionen zur Barrierefreiheit aktiviert sein sollen. Erwartet wird
eine Liste von Symbolen.

@item @code{reader} (Typ: Vielleicht-dateiartig)
Der Befehl, um einen Bildschirmleser zu starten.

@item @code{extra-config} (Vorgabe: @code{'()}) (Typ: Liste-von-Zeichenketten)
Zusätzliche Konfigurationswerte, die an die Konfigurationsdatei des LightDM
GTK Greeter angehängt werden.

@end table
@end deftp

@c %end of fragment
@c %start of fragment

@deftp {Datentyp} lightdm-seat-configuration
Verfügbare @code{lightdm-seat-configuration}-Felder sind:

@table @asis
@item @code{name} (Typ: Seat-Name)
Der Name des Seats. Wenn ein Sternchen (*) im Namen des Seats angegeben
wird, wirkt sich die Seat-Konfiguration auf alle passenden Seat-Namen aus.

@item @code{user-session} (Typ: Vielleicht-Zeichenkette)
Welche Sitzung voreingestellt wird. Der Name der Sitzung muss eine in
Kleinbuchstaben geschriebene Zeichenkette sein wie @code{"gnome"},
@code{"ratpoison"} und so weiter.

@item @code{type} (Vorgabe: @code{local}) (Typ: Seat-Typ)
Um welchen Typ von Seat es sich handelt, entweder lokal (@code{local}) oder
als Fernverbindung (@code{xremote}).

@item @code{autologin-user} (Typ: Vielleicht-Zeichenkette)
Der Name des Benutzers, als der man automatisch angemeldet wird.

@item @code{greeter-session} (Vorgabe: @code{lightdm-gtk-greeter}) (Typ: Greeter-Sitzung)
Welche Greeter-Sitzung geöffnet werden soll, angegeben als Symbol. Derzeit
wird nur @code{lightdm-gtk-greeter} unterstützt.

@item @code{xserver-command} (Typ: Vielleicht-dateiartig)
Welcher Xorg-Server-Befehl ausgeführt wird.

@item @code{session-wrapper} (Typ: dateiartig)
Der xinitrc-Wrapper für die Sitzung.

@item @code{extra-config} (Vorgabe: @code{'()}) (Typ: Liste-von-Zeichenketten)
Zusätzliche Konfigurationswerte, die an den Abschnitt zur Konfiguration des
Seats angehängt werden.

@end table
@end deftp
@c %end of fragment


@cindex Xorg, Konfiguration
@deftp {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, LightDM oder SLiM
gestartet wird. Deswegen wird aus der Konfiguration dieser
Anzeigenverwaltungen ein @code{xorg-configuration}-Verbundsobjekt
konstruiert.

@table @asis
@item @code{modules} (Vorgabe: @code{%default-xorg-modules})
Dies ist eine Liste von @dfn{Modulpaketen}, die vom Xorg-Server geladen
werden@tie{}– z.B.@: @code{xf86-video-vesa}, @code{xf86-input-libinput} und
so weiter.

@item @code{fonts} (Vorgabe: @code{%default-xorg-fonts})
Dies ist eine Liste von Verzeichnissen mit Schriftarten, die zum
Schriftartensuchpfad („Font Path“) des Servers hinzugefügt werden.

@item @code{drivers} (Vorgabe: @code{'()})
Dies muss entweder die leere Liste sein@tie{}– in diesem Fall wird durch
Xorg automatisch ein Grafiktreiber ausgewählt@tie{}– oder eine Liste von
Treibernamen, die in dieser Reihenfolge durchprobiert werden@tie{}– z.B.@:
@code{'("modesetting" "vesa")}.

@item @code{resolutions} (Vorgabe: @code{'()})
Wenn @code{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@tie{}– z.B.@: @code{'((1024 768)
(640 480))}.

@cindex Tastaturbelegung, für Xorg
@cindex Keymap, für Xorg
@item @code{keyboard-layout} (Vorgabe: @code{#f})
Wenn es auf @code{#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 @code{keyboard-layout}-Objekt stehen, das angibt,
welche Tastaturbelegung aktiv sein soll, während Xorg läuft. Siehe
@ref{Tastaturbelegung} für mehr Informationen, wie die Tastaturbelegung
angegeben werden kann.

@item @code{extra-config} (Vorgabe: @code{'()})
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.

@item @code{server} (Vorgabe: @code{xorg-server})
Dieses Paket stellt den Xorg-Server zur Verfügung.

@item @code{server-arguments} (Vorgabe: @code{%default-xorg-server-arguments})
Dies ist die Liste der Befehlszeilenargumente, die an den X-Server übergeben
werden. Die Vorgabe ist @code{-nolisten tcp}.
@end table
@end deftp

@deffn {Prozedur} set-xorg-configuration Konfiguration [login-manager-service-type]
Benennt, welche @var{Konfiguration} die Anmeldeverwaltung (vom Typ
@var{login-manager-service-type}) benutzen soll, als ein
@code{<xorg-configuration>}-Verbundsobjekt.

Da die Xorg-Konfiguration in die Konfiguration der Anmeldeverwaltung
eingebettet ist@tie{}– z.B.@: in einer @code{gdm-configuration}@tie{}–,
bietet diese Prozedur eine Kurzschreibweise zum Ändern der
Xorg-Konfiguration.
@end deffn

@deffn {Prozedur} xorg-start-command [Konfiguration]
Hier wird ein @code{startx}-Skript geliefert, in welchem die Module,
Schriftarten usw.@: verfügbar sind, die in der @var{Konfiguration} angegeben
wurden. Das Ergebnis soll anstelle von @code{startx} benutzt werden.

Normalerweise wird der X-Server von der Anmeldeverwaltung gestartet.
@end deffn

@deffn {Prozedur} xorg-start-command-xinit [Konfiguration]
Hier wird ein @code{startx}-Skript geliefert, in welchem die Module,
Schriftarten usw.@: verfügbar sind, die in der @var{Konfiguration} angegeben
wurden. Das Ergebnis soll anstelle von @code{startx} benutzt werden und kann
durch den Benutzer in einem TTY aufgerufen werden, nachdem er sich
angemeldet hat. Im Gegensatz zu @code{xorg-start-command} ruft dieses Skript
xinit auf. Deshalb kann man es gut aus einem TTY aufrufen. Dieses Skript
kann mit Hilfe von @code{startx-command-service-type} oder
@code{home-startx-command-service-type} als @code{startx} verfügbar gemacht
werden. Wenn Sie eine Arbeitsumgebung eingerichtet haben, ist diese Prozedur
vermutlich unnötig.
@end deffn


@defvar screen-locker-service-type
Diensttyp für einen Dienst, der ein Paket mit einem Programm zum Sperren des
Bildschirms oder einem Bildschirmschoner zur Menge der privilegierten
Programme hinzufügt und/oder einen PAM-Eintrag dafür hinzufügt. Der Wert
dieses Diensttyps ist ein @code{<screen-locker-configuration>}-Objekt.

Vorgegeben ist hier zwar, das Programm sowohl zu einem privilegierten
Programm zu machen als auch einen PAM-Eintrag anzulegen, aber diese beiden
Methoden sind redundant. Einige Bildschirmsperrprogramme können sogar nicht
ausgeführt werden, wenn PAM eingerichtet und @code{setuid} auf der Anwendung
gesetzt ist. In diesem Fall können Sie @code{using-setuid?} auf @code{#f}
setzen.

Zum Beispiel macht

@lisp
(service screen-locker-service-type
         (screen-locker-configuration
           (name "xlock")
           (program (file-append xlockmore "/bin/xlock"))))
@end lisp

das gute alte XlockMore benutzbar.

Swaylock zum Beispiel kann nicht ausgeführt werden, wenn PAM-Unterstützung
einkompiliert und setuid an ist. Deaktivieren Sie also setuid:

@lisp
(service screen-locker-service-type
         (screen-locker-configuration
           (name "swaylock")
           (program (file-append swaylock "/bin/swaylock"))
           (using-pam? #t)
           (using-setuid? #f)))
@end lisp

@end defvar

@deftp {Datentyp} screen-locker-configuration
Verfügbare @code{screen-locker-configuration}-Felder sind:

@table @asis
@item @code{name} (Typ: Zeichenkette)
Der Name des Programms zum Sperren des Bildschirms.

@item @code{program} (Typ: dateiartig)
An welchem Pfad sich die ausführbare Datei befindet, die den Bildschirm
sperrt. Anzugeben ist ein G-Ausdruck.

@item @code{allow-empty-password?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ob leere Passwörter zugelassen sein sollen.

@item @code{using-pam?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Ob ein PAM-Eintrag hinzugefügt werden soll.

@item @code{using-setuid?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Ob das Programm als setuid-Programm eingerichtet werden soll.

@end table

@end deftp

@defvar startx-command-service-type
Fügt @command{startx} zum Systemprofil hinzu, wodurch es in @env{PATH}
eingetragen wird.

Der Wert dieses Dienstes ist ein @code{<xorg-configuration>}-Objekt. das an
die Prozedur @code{xorg-start-command-xinit} übergeben wird, welche das
benutzte @command{startx} erzeugt. Der Vorgabewert ist
@code{(xorg-configuration)}.
@end defvar


@node Druckdienste
@subsection Druckdienste

@cindex Druckerunterstützung mit CUPS
Das Modul @code{(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
@code{cups-service}-Dienst in die Betriebssystemdefinition ein.

@defvar 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:
@lisp
(service cups-service-type)
@end lisp
@end defvar

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 @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
@code{epson-inkjet-printer-escpr}-Paket und für HP-Drucker über das
@code{hplip-minimal}-Paket aktivieren. Sie können das auf diese Weise gleich
machen (dazu müssen Sie vorher angeben, dass das Modul @code{(gnu packages
cups)} benutzt werden soll):

@lisp
(service cups-service-type
         (cups-configuration
           (web-interface? #t)
           (extensions
             (list cups-filters epson-inkjet-printer-escpr hplip-minimal))))
@end lisp

@quotation Anmerkung
Wenn Sie die Qt5-basierte grafische Benutzeroberfläche benutzen möchten, die
dem hplip-Paket beiliegt, sollten Sie das @code{hplip}-Paket installieren,
entweder in die Konfigurationsdatei Ihres Betriebssystems oder für Ihr
Benutzerkonto.
@end quotation

Im Folgenden sehen Sie die verfügbaren Konfigurationsparameter. Vor jeder
Parameterdefinition wird ihr Typ angegeben, zum Beispiel steht
@samp{Zeichenketten-Liste foo} für einen Parameter @code{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
@code{cupsd.conf}-Datei von einem anderen System weiterbenutzen möchten;
siehe das Abschnittsende für mehr Details.

@c The following documentation was initially generated by
@c (generate-documentation) in (gnu services cups).  Manually maintained
@c documentation is better, so we shouldn't hesitate to edit below as
@c needed.  However if the change you want to make to this documentation
@c can be done in an automated way, it's probably easier to change
@c (generate-documentation) than to make it below and have to deal with
@c the churn as CUPS updates.


Die verfügbaren @code{cups-configuration}-Felder sind:

@deftypevr {@code{cups-configuration}-Parameter} „package“ cups
Das CUPS-Paket.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} „package“-Liste extensions (Vorgabe: @code{(list brlaser cups-filters epson-inkjet-printer-escpr foomatic-filters hplip-minimal splix)})
Treiber und andere Erweiterungen für das CUPS-Paket.
@end deftypevr

@deftypevr {@code{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 @code{files-configuration} sind:

@deftypevr {@code{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 @code{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 @code{syslog} bewirkt, dass Protokolleinträge an
den Systemprotokolldaemon geschickt werden. Der Servername darf in
Dateinamen als die Zeichenkette @code{%s} angegeben werden, so kann etwa
@code{/var/log/cups/%s-access_log} angegeben werden.

Die Vorgabe ist @samp{"/var/log/cups/access_log"}.
@end deftypevr

@deftypevr {@code{files-configuration}-Parameter} Dateiname cache-dir
Wo CUPS zwischengespeicherte Daten ablegen soll.

Die Vorgabe ist @samp{"/var/cache/cups"}.
@end deftypevr

@deftypevr {@code{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 @samp{"0640"}.
@end deftypevr

@deftypevr {@code{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 @code{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 @code{syslog} bewirkt, dass Protokolleinträge an
den Systemprotokolldaemon geschickt werden. Der Servername darf in
Dateinamen als die Zeichenkette @code{%s} angegeben werden, so kann etwa
@code{/var/log/cups/%s-error_log} angegeben werden.

Die Vorgabe ist @samp{"/var/log/cups/error_log"}.
@end deftypevr

@deftypevr {@code{files-configuration}-Parameter} Zeichenkette fatal-errors
Gibt an, bei welchen Fehlern das Druckplanungsprogramm terminieren soll. Die
Zeichenketten für die Arten sind:

@table @code
@item none
Keine Fehler führen zur Beendigung.

@item all
Jeder der im Folgenden aufgeführten Fehler terminiert den Druckplaner.

@item browse
Fehler bei der Suche während der Initialisierung terminieren den
Druckplaner, zum Beispiel wenn keine Verbindung zum DNS-SD-Daemon aufgebaut
werden kann.

@item config
Syntaxfehler in der Konfigurationsdatei terminieren den Druckplaner.

@item listen
Fehler beim Lauschen oder Portfehler (entsprechend der Direktiven „Listen“
oder „Port“) terminieren den Druckplaner; ausgenommen sind Fehler bei IPv6
auf Loopback- oder @code{any}-Adressen.

@item log
Fehler beim Erzeugen von Protokolldateien terminieren den Druckplaner.

@item 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.
@end table

Die Vorgabe ist @samp{"all -browse"}.
@end deftypevr

@deftypevr {@code{files-configuration}-Parameter} Boolescher-Ausdruck file-device?
Gibt an, welches Pseudogerät für neue Druckerwarteschlangen benutzt werden
kann. Die URI @uref{file:///dev/null} wird immer zugelassen.

Vorgegeben ist @samp{#f}.
@end deftypevr

@deftypevr {@code{files-configuration}-Parameter} Zeichenkette group
Gibt Namen oder Identifikator der Benutzergruppe an, die zum Ausführen von
externen Programmen verwendet wird.

Die Vorgabe ist @samp{"lp"}.
@end deftypevr

@deftypevr {@code{files-configuration}-Parameter} Zeichenkette log-file-group
Gibt Namen oder Identifikator der Benutzergruppe an, mit der
Protokolldateien gespeichert werden.

Die Vorgabe ist @samp{"lpadmin"}.
@end deftypevr

@deftypevr {@code{files-configuration}-Parameter} Zeichenkette log-file-perm
Gibt die Berechtigungen für alle Protokolldateien an, die das
Planungsprogramm schreibt.

Die Vorgabe ist @samp{"0644"}.
@end deftypevr

@deftypevr {@code{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 @code{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 @code{syslog} bewirkt, dass Protokolleinträge an
den Systemprotokolldaemon geschickt werden. Der Servername darf in
Dateinamen als die Zeichenkette @code{%s} angegeben werden, so kann etwa
@code{/var/log/cups/%s-page_log} angegeben werden.

Die Vorgabe ist @samp{"/var/log/cups/page_log"}.
@end deftypevr

@deftypevr {@code{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 @code{remroot}.

Die Vorgabe ist @samp{"remroot"}.
@end deftypevr

@deftypevr {@code{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 @samp{"/var/spool/cups"}.
@end deftypevr

@deftypevr {@code{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 @code{relaxed} („locker“) oder
@code{strict} („strikt“). Diese Direktive wird zurzeit nur auf macOS
benutzt/unterstützt.

Die Vorgabe ist @samp{strict}.
@end deftypevr

@deftypevr {@code{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:
@file{.crt}-Dateien für PEM-kodierte Zertifikate und zugehörige
@file{.key}-Dateien für PEM-kodierte private Schlüssel.

Die Vorgabe ist @samp{"/etc/cups/ssl"}.
@end deftypevr

@deftypevr {@code{files-configuration}-Parameter} Dateiname server-root
Gibt das Verzeichnis an, das die Serverkonfigurationsdateien enthält.

Die Vorgabe ist @samp{"/etc/cups"}.
@end deftypevr

@deftypevr {@code{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 @samp{#f}.
@end deftypevr

@deftypevr {@code{files-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste system-group
Gibt die Benutzergruppe(n) an, die als die @code{@@SYSTEM}-Gruppen für die
Authentisierung benutzt werden können.
@end deftypevr

@deftypevr {@code{files-configuration}-Parameter} Dateiname temp-dir
Gibt das Verzeichnis an, in das temporäre Dateien gespeichert werden.

Die Vorgabe ist @samp{"/var/spool/cups/tmp"}.
@end deftypevr

@deftypevr {@code{files-configuration}-Parameter} Zeichenkette user
Gibt den Benutzernamen oder -identifikator an, mit dessen Benutzerkonto
externe Programme ausgeführt werden.

Die Vorgabe ist @samp{"lp"}.
@end deftypevr

@deftypevr {@code{files-configuration}-Parameter} Zeichenkette set-env
Legt die angegebene Umgebungsvariable auf einen Wert (englisch „Value“)
fest, die an Kindprozesse übergeben wird.

Die Vorgabe ist @samp{"variable value"}.
@end deftypevr
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Zugriffsprotokollstufe access-log-level
Gibt an, mit welcher Detailstufe das Protokoll in der AccessLog-Datei
geführt wird. Bei der Stufe @code{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 @code{actions} wird protokolliert, wenn Druckaufträge eingereicht,
gehalten, freigegeben, geändert oder abgebrochen werden sowie alles, was bei
@code{config} Protokollierung auslöst. Bei der Stufe @code{all} wird jede
Anfrage protokolliert.

Die Vorgabe ist @samp{actions}.
@end deftypevr

@deftypevr {@code{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 @samp{#f}.
@end deftypevr

@deftypevr {@code{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.

Vorgegeben ist @samp{(list "_cups" "_print" "_universal")}, wodurch den
Netzwerk-Clients mitgeteilt wird, dass sowohl Teilen zwischen CUPS als auch
IPP Everywhere, AirPrint und Mopria unterstützt werden.
@end deftypevr

@deftypevr {@code{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 @samp{dnssd}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Boolescher-Ausdruck browse-web-if?
Gibt an, ob die Weboberfläche von CUPS anderen mitgeteilt wird.

Vorgegeben ist @samp{#f}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Boolescher-Ausdruck browsing?
Gibt an, ob geteilte Drucker bei Druckersuchen mitgeteilt werden.

Vorgegeben ist @samp{#f}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Voreingestelle-Authentifizierungsart default-auth-type
Gibt an, wie man nach Voreinstellung authentifiziert wird.

Die Vorgabe ist @samp{Basic}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Voreingestellte-Verschlüsselung default-encryption
Gibt an, ob für authentifizierte Anfragen Verschlüsselung benutzt wird.

Die Vorgabe ist @samp{Required}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Zeichenkette default-language
Gibt an, welche Sprache für Text und Weboberfläche voreingestellt benutzt
werden soll.

Die Vorgabe ist @samp{"en"}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Zeichenkette default-paper-size
Gibt das voreingestellte Papierformat für neue Druckwarteschlangen an. Bei
@samp{"Auto"} wird eine der Locale entsprechende Voreinstellung gewählt,
während bei @samp{"None"} kein Papierformat voreingestellt ist. Verfügbare
Formatbezeichnungen sind typischerweise @samp{"Letter"} oder @samp{"A4"}.

Die Vorgabe ist @samp{"Auto"}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Zeichenkette default-policy
Gibt die voreingestellte Zugriffsrichtlinie an, die benutzt werden soll.

Die Vorgabe ist @samp{"default"}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Boolescher-Ausdruck default-shared?
Gibt an, ob lokale Drucker nach Voreinstellung geteilt werden sollen.

Die Vorgabe ist @samp{#t}.
@end deftypevr

@deftypevr {@code{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 @samp{30}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Fehlerrichtlinie error-policy
Gibt an, wie beim Auftreten eines Fehlers verfahren werden soll. Mögliche
Werte sind @code{abort-job}, wodurch der fehlgeschlagene Druckauftrag
verworfen wird, @code{retry-job}, wodurch der Druckauftrag später erneut
versucht wird, @code{retry-current-job}, wodurch der fehlgeschlagene
Druckauftrag sofort erneut versucht wird, und @code{stop-printer}, wodurch
der Drucker angehalten wird.

Die Vorgabe ist @samp{stop-printer}.
@end deftypevr

@deftypevr {@code{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 @samp{0}.
@end deftypevr

@deftypevr {@code{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 @samp{0}.
@end deftypevr

@deftypevr {@code{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
@code{double} lässt @code{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 @code{#t} oder @code{double},
wenn es unbedingt notwendig ist.

Vorgegeben ist @samp{#f}.
@end deftypevr

@deftypevr {@code{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 @samp{30}.
@end deftypevr

@deftypevr {@code{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 @code{retry-job} oder @code{retry-current-job} ist.

Die Vorgabe ist @samp{30}.
@end deftypevr

@deftypevr {@code{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 @code{retry-job}
oder @code{retry-current-job} ist.

Die Vorgabe ist @samp{5}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Boolescher-Ausdruck keep-alive?
Gibt an, ob HTTP-„keep-alive“ für Verbindungen unterstützt wird.

Die Vorgabe ist @samp{#t}.
@end deftypevr

@deftypevr {@code{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 @samp{0}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Mehrzeilige-Zeichenketten-Liste listen
Lauscht auf den angegebenen Schnittstellen auf Verbindungen. Gültige Werte
haben die Form @var{Adresse}:@var{Port}, wobei die @var{Adresse} entweder
eine von eckigen Klammern umschlossene IPv6-Adresse, eine IPv4-Adresse oder
@code{*} 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.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} „location-access-controls“-Liste location-access-controls
Gibt eine Liste zusätzlicher Zugriffssteuerungen („Access Controls“) an.

Verfügbare @code{location-access-controls}-Felder sind:

@deftypevr {@code{location-access-controls}-Parameter} Dateiname path
Gibt den URI-Pfad an, für den die Zugriffssteuerung gilt.
@end deftypevr

@deftypevr {@code{location-access-controls}-Parameter} Zugriffssteuerungs-Liste access-controls
Zugriffssteuerungen für jeden Zugriff auf diesen Pfad, im selben Format wie
die @code{access-controls} bei @code{operation-access-control}.

Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{location-access-controls}-Parameter} „method-access-controls“-Liste method-access-controls
Zugriffssteuerungen für methodenspezifische Zugriffe auf diesen Pfad.

Die Vorgabe ist @samp{'()}.

Verfügbare @code{method-access-controls}-Felder sind:

@deftypevr {@code{method-access-controls}-Parameter} Boolescher-Ausdruck reverse?
Falls dies @code{#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 @samp{#f}.
@end deftypevr

@deftypevr {@code{method-access-controls}-Parameter} Methoden-Liste methods
Methoden, für die diese Zugriffssteuerung gilt.

Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{method-access-controls}-Parameter} Zugriffssteuerungs-Liste access-controls
Zugriffssteuerungsdirektiven als eine Liste von Zeichenketten. Jede
Zeichenkette steht für eine Direktive wie z.B.@: @samp{"Order allow,deny"}.

Die Vorgabe ist @samp{'()}.
@end deftypevr
@end deftypevr
@end deftypevr

@deftypevr {@code{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 @samp{100}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Protokollstufe log-level
Gibt die Stufe der Protokollierung in die ErrorLog-Datei an. Der Wert
@code{none} stoppt alle Protokollierung, während @code{debug2} alles
protokollieren lässt.

Die Vorgabe ist @samp{info}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Protokollzeitformat log-time-format
Gibt das Format von Datum und Uhrzeit in Protokolldateien an. Der Wert
@code{standard} lässt ganze Sekunden ins Protokoll schreiben, während bei
@code{usecs} Mikrosekunden protokolliert werden.

Die Vorgabe ist @samp{standard}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Nichtnegative-ganze-Zahl max-clients
Gibt die Maximalzahl gleichzeitig bedienter Clients an, die vom Planer
zugelassen werden.

Die Vorgabe ist @samp{100}.
@end deftypevr

@deftypevr {@code{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 @samp{100}.
@end deftypevr

@deftypevr {@code{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 @samp{9999}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Nichtnegative-ganze-Zahl max-hold-time
Gibt die maximale Zeitdauer an, die ein Druckauftrag im Haltezustand
@code{indefinite} bleiben darf, bevor er abgebrochen wird. Ein Wert von 0
deaktiviert ein Abbrechen gehaltener Druckaufträge.

Die Vorgabe ist @samp{0}.
@end deftypevr

@deftypevr {@code{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 @emph{nicht}
beschränkt.

Die Vorgabe ist @samp{500}.
@end deftypevr

@deftypevr {@code{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 @code{max-jobs}-viele
Druckaufträge pro Drucker zu.

Die Vorgabe ist @samp{0}.
@end deftypevr

@deftypevr {@code{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 @code{max-jobs}-viele
Druckaufträge pro Benutzer zu.

Die Vorgabe ist @samp{0}.
@end deftypevr

@deftypevr {@code{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 @samp{10800}.
@end deftypevr

@deftypevr {@code{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 @samp{1048576}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Nichtnegative-ganze-Zahl max-subscriptions
Gibt die Maximalzahl gleichzeitiger Benachrichtigungs-Subskriptionen an, die
noch zugelassen wird. Wenn Sie es auf @samp{0} setzen, wird die Anzahl
Benachrichtigungsanmeldungen @emph{nicht} beschränkt.

Die Vorgabe ist @samp{0}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Nichtnegative-ganze-Zahl max-subscriptions-per-job
Gibt die Maximalzahl gleichzeitiger Benachrichtigungs-Subskriptionen an, die
pro Druckauftrag zugelassen werden. Ein Wert von @samp{0} lässt bis zu
@code{max-subscriptions}-viele Benachrichtigungsanmeldungen pro Druckauftrag
zu.

Die Vorgabe ist @samp{0}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Nichtnegative-ganze-Zahl max-subscriptions-per-printer
Gibt die Maximalzahl gleichzeitiger Benachrichtigungs-Subskriptionen an, die
pro Drucker zugelassen werden. Ein Wert von @samp{0} lässt bis zu
@code{max-subscriptions}-viele Benachrichtigungsanmeldungen pro Drucker zu.

Die Vorgabe ist @samp{0}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Nichtnegative-ganze-Zahl max-subscriptions-per-user
Gibt die Maximalzahl gleichzeitiger Benachrichtigungs-Subskriptionen an, die
pro Benutzer zugelassen werden. Ein Wert von @samp{0} lässt bis zu
@code{max-subscriptions}-viele Benachrichtigungsanmeldungen pro Benutzer zu.

Die Vorgabe ist @samp{0}.
@end deftypevr

@deftypevr {@code{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 @samp{900}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Umgebungsvariable environment-variables
Übergibt die angegebene(n) Umgebungsvariable(n) an Kindprozesse, als Liste
von Zeichenketten.

Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} „policy-configuration“-Liste policies
Gibt die benannten Zugriffssteuerungsrichtlinien an.

Verfügbare @code{policy-configuration}-Felder sind:

@deftypevr {@code{policy-configuration}-Parameter} Zeichenkette name
Der Name der Richtlinie.
@end deftypevr

@deftypevr {@code{policy-configuration}-Parameter} Zeichenkette job-private-access
Gibt eine Zugriffsliste der privaten Werte eines Druckauftrags
an. @code{@@ACL} wird auf die Werte von requesting-user-name-allowed oder
requesting-user-name-denied des Druckers abgebildet. @code{@@OWNER} wird auf
den Besitzer des Druckauftrags abgebildet. @code{@@SYSTEM} wird auf die
Gruppen abgebildet, die im @code{system-group}-Feld der
@code{files-configuration} aufgelistet sind, aus der die Datei
@code{cups-files.conf(5)} erzeugt wird. Zu den anderen möglichen Elementen
der Zugriffsliste gehören Namen bestimmer Benutzerkonten und
@code{@@@var{Benutzergruppe}}, was für Mitglieder einer bestimmten
Benutzergruppe steht. Die Zugriffsliste kann auch einfach als @code{all}
oder @code{default} festgelegt werden.

Die Vorgabe ist @samp{"@@OWNER @@SYSTEM"}.
@end deftypevr

@deftypevr {@code{policy-configuration}-Parameter} Zeichenkette job-private-values
Gibt die Liste der Druckauftragswerte an, die geschützt werden sollten, oder
@code{all}, @code{default} oder @code{none}.

Die Vorgabe ist @samp{"job-name job-originating-host-name
job-originating-user-name phone"}.
@end deftypevr

@deftypevr {@code{policy-configuration}-Parameter} Zeichenkette subscription-private-access
Gibt eine Zugriffsliste für die privaten Werte eines Abonnements
an. @code{@@ACL} wird auf die Werte von requesting-user-name-allowed oder
requesting-user-name-denied des Druckers abgebildet. @code{@@OWNER} wird auf
den Besitzer des Druckauftrags abgebildet. @code{@@SYSTEM} wird auf die
Gruppen abgebildet, die im @code{system-group}-Feld der
@code{files-configuration} aufgelistet sind, aus der die Datei
@code{cups-files.conf(5)} erzeugt wird. Zu den anderen möglichen Elementen
der Zugriffsliste gehören Namen bestimmer Benutzerkonten und
@code{@@@var{Benutzergruppe}}, was für Mitglieder einer bestimmten
Benutzergruppe steht. Die Zugriffsliste kann auch einfach als @code{all}
oder @code{default} festgelegt werden.

Die Vorgabe ist @samp{"@@OWNER @@SYSTEM"}.
@end deftypevr

@deftypevr {@code{policy-configuration}-Parameter} Zeichenkette subscription-private-values
Gibt die Liste der Druckauftragswerte an, die geschützt werden sollten, oder
@code{all}, @code{default} oder @code{none}.

Die Vorgabe ist @samp{"notify-events notify-pull-method notify-recipient-uri
notify-subscriber-user-name notify-user-data"}.
@end deftypevr

@deftypevr {@code{policy-configuration}-Parameter} „operation-access-controls“-Liste access-controls
Zugriffssteuerung durch IPP-Betrieb.

Die Vorgabe ist @samp{'()}.
@end deftypevr
@end deftypevr

@deftypevr {@code{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 @samp{86400}.
@end deftypevr

@deftypevr {@code{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 @code{#t} bleibt der Druckauftragsverlauf so lange erhalten,
bis die MaxJobs-Beschränkung erreicht wurde.

Die Vorgabe ist @samp{#t}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Kommagetrennte-Zeichenketten-Liste-oder-#f ready-paper-sizes
Gibt eine Liste möglicher Papierformate an, die als bereitstehend gemeldet
werden, also geladen sind. Die tatsächliche Liste wird nur diejenigen
Formate umfassen, die der jeweilige Drucker unterstützt.

Beim vorgegebenen Wert @code{#f} verhält sich CUPS anders: Es benutzt
@samp{(list \"Letter\" \"Legal\" \"Tabloid\" \"4x6\" \"Env10\")}, wenn das
Papierformat \"Letter\" voreingestellt ist, und benutzt andernfalls
@samp{(list \"A3\" \"A4\" \"A5\" \"A6\" \"EnvDL\")}.
@end deftypevr

@deftypevr {@code{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 @samp{30}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Zeichenkette server-admin
Gibt die E-Mail-Adresse des Serveradministrators an.

Die Vorgabe ist @samp{"root@@localhost.localdomain"}.
@end deftypevr

@deftypevr {@code{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 @code{*} 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 @code{*} zu benutzen.

Die Vorgabe ist @samp{*}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Zeichenkette server-name
Gibt den vollständigen Rechnernamen („Fully-Qualified Host Name“) des
Servers an.

Die Vorgabe ist @samp{"localhost"}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Server-Tokens server-tokens
Gibt an, welche Informationen in der Server-Kopfzeile von HTTP-Antworten
vorkommen. @code{None} deaktiviert die Server-Kopfzeile. @code{ProductOnly}
liefert @code{CUPS}. @code{Major} liefert @code{CUPS 2}. @code{Minor}
liefert @code{CUPS 2.0}. @code{Minimal} liefert @code{CUPS 2.0.0}. @code{OS}
liefert @code{CUPS 2.0.0 (@var{uname})}, wobei @var{uname} die Ausgabe des
Befehls @code{uname} ist. @code{Full} liefert @code{CUPS 2.0.0 (@var{uname})
IPP/2.0}.

Die Vorgabe ist @samp{Minimal}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Mehrzeilige-Zeichenketten-Liste ssl-listen
Lauscht auf den angegebenen Schnittstellen auf verschlüsselte
Verbindungen. Gültige Werte haben die Form @var{Adresse}:@var{Port}, wobei
die @var{Adresse} entweder eine von eckigen Klammern umschlossene
IPv6-Adresse, eine IPv4-Adresse oder @code{*} ist; letztere steht für alle
Adressen.

Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{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 @code{Allow} („erlauben“) zu
verwenden, und es erhöht die Sicherheit, Optionen mit @code{Deny}
(„verweigern“) zu benutzen. Die Option @code{AllowRC4} aktiviert die
128-Bit-RC4-Cipher-Suites, die manche alten Clients brauchen. Die Option
@code{AllowSSL3} aktiviert SSL v3.0, das manche alte Clients brauchen, die
TLS v1.0 nicht implementieren. Die Option @code{DenyCBC} deaktiviert alle
CBC-Cipher-Suites. Die Option @code{DenyTLS1.0} deaktiviert Unterstützung
für TLS v1.0@tie{}– dadurch wird TLS v1.1 zur kleinsten noch unterstützten
Protokollversion.

Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Boolescher-Ausdruck strict-conformance?
Gibt an, ob das Druckplanungsprogramm von Clients fordert, dass sie sich
strikt an die IPP-Standards halten.

Vorgegeben ist @samp{#f}.
@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Nichtnegative-ganze-Zahl timeout
Gibt die Zeitbeschränkung für HTTP-Anfragen an, in Sekunden.

Die Vorgabe ist @samp{900}.

@end deftypevr

@deftypevr {@code{cups-configuration}-Parameter} Boolescher-Ausdruck web-interface?
Gibt an, ob die Weboberfläche zur Verfügung gestellt wird.

Vorgegeben ist @samp{#f}.
@end deftypevr

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 @code{cupsd.conf}, die
Sie verwenden möchten. In diesem Fall können Sie eine
@code{opaque-cups-configuration} als die Konfiguration eines
@code{cups-service-type} übergeben.

Verfügbare @code{opaque-cups-configuration}-Felder sind:

@deftypevr {@code{opaque-cups-configuration}-Parameter} „package“ cups
Das CUPS-Paket.
@end deftypevr

@deftypevr {@code{opaque-cups-configuration}-Parameter} Zeichenkette cupsd.conf
Der Inhalt der Datei @code{cupsd.conf} als eine Zeichenkette.
@end deftypevr

@deftypevr {@code{opaque-cups-configuration}-Parameter} Zeichenkette cups-files.conf
Der Inhalt der Datei @code{cups-files.conf} als eine Zeichenkette.
@end deftypevr

Wenn Ihre @code{cupsd.conf} und @code{cups-files.conf} zum Beispiel in
Zeichenketten mit dem entsprechenden Namen definiert sind, könnten Sie auf
diese Weise einen CUPS-Dienst instanziieren:

@lisp
(service cups-service-type
         (opaque-cups-configuration
           (cupsd.conf cupsd.conf)
           (cups-files.conf cups-files.conf)))
@end lisp


@node Desktop-Dienste
@subsection Desktop-Dienste

Das Modul @code{(gnu services desktop)} stellt Dienste zur Verfügung, die
meistens bei „Desktop“-Einrichtungen für grafische Nutzung praktisch
sind@tie{}– also auf einer Maschine mit einem grafischem Anzeigeserver,
vielleicht mit einer grafischen Benutzeroberfläche, usw. Im Modul werden
auch Dienste definiert, die bestimmte Arbeitsumgebungen wie GNOME, Xfce oder
MATE bereitstellen.

Um es einfacher zu machen, definiert das Modul auch eine Variable mit
denjenigen Diensten, die man auf einer Maschine mit einer grafischen
Umgebung und Netzwerkunterstützung erwarten würde:

@defvar %desktop-services
Dies ist eine Liste von Diensten, die @code{%base-services} ergänzt und
weitere Dienste hinzufügt oder bestehende anpasst, um für eine normale
„Desktop“-Nutzung geeignet zu sein.

Insbesondere wird eine grafische Anmeldeverwaltung hinzugefügt (siehe @ref{X Window, @code{gdm-service-type}}), ebenso Programme zur Bildschirmsperre,
ein Werkzeug zur Netzwerkverwaltung (siehe @ref{Netzwerkdienste,
@code{network-manager-service-type}}) mit Unterstützung für Modems (siehe
@ref{Netzwerkdienste, @code{modem-manager-service-type}}),
Energieverbrauchs- und Farbverwaltungsdienste, Anmeldungs- und
Sitzungsverwaltung über @code{elogind}, der Berechtigungsdienst Polkit, der
Ortungsdienst GeoClue, der AccountsService-Daemon, mit dem autorisierte
Benutzer Systempasswörter ändern können, ein NTP-Client (siehe
@ref{Netzwerkdienste}) und der Avahi-Daemon.
@end defvar

Die @code{%desktop-services}-Variable kann als das @code{services}-Feld
einer @code{operating-system}-Deklaration genutzt werden (siehe
@ref{„operating-system“-Referenz, @code{services}}).

Daneben können die folgenden Prozeduren eine Arbeitsumgebung (oder mehrere!)
zu einem System hinzufügen.

@itemize
@item @code{gnome-desktop-service-type} fügt GNOME hinzu,
@item @code{plasma-desktop-service-type} fügt KDE Plasma hinzu,
@item @code{enlightenment-desktop-service-type} fügt Enlightenment hinzu,
@item @code{lxqt-desktop-service-type} fügt LXQt hinzu,
@item @code{mate-desktop-service-type} fügt MATE hinzu,
@item @code{xfce-desktop-service-type} fügt Xfce hinzu.
@end itemize

Diese Dienste fügen „Metapakete“ wie @code{gnome} oder @code{plasma} ins
Systemprofil ein. Die meisten richten auch andere nützliche Dienste ein, was
Pakete nicht bewirken können.

Zum Beispiel können so erhöhte Berechtigungen an eine begrenzte Zahl
besonderer Systemschnittstellen und Programme verliehen werden, damit
Hilfsprogramme zur Anpassung der Hintergrundbeleuchtung, des
Energieverbrauchs, zum Sperren des Bildschirms oder andere zugehörige
Funktionen wie erwartet laufen.

@defvar gnome-desktop-service-type
Dies ist der Typ des Dienstes, der die @uref{https://www.gnome.org,
GNOME-Arbeitsumgebung} bereitstellt. Sein Wert ist ein
@code{gnome-desktop-configuration}-Objekt (siehe unten).

Dieser Dienst fügt das @code{gnome}-Paket zum Systemprofil hinzu und
erweitert Polkit um die von @code{gnome-settings-daemon} benötigten
Aktionen.
@end defvar

@deftp {Datentyp} gnome-desktop-configuration
Verbundsobjekt für die Konfiguration der GNOME-Arbeitsumgebung. Verfügbare
@code{gnome-desktop-configuration}-Felder sind:

@table @asis
@item @code{core-services} (Typ: Liste-von-Paketen)
A list of packages that the GNOME Shell and applications may rely on.

@item @code{shell} (Typ: Liste-von-Paketen)
Eine Liste von Paketen, die die GNOME Shell bilden, ohne Anwendungen.

@item @code{utilities} (Typ: Liste-von-Paketen)
Eine Liste von Paketen, die als Anwendungen aufgesetzt auf der GNOME Shell
dienen.

@item @code{gnome} (Typ: Vielleicht-Paket)
Einst war dieses Feld die einzige Konfigurationsmöglichkeit und darin wurde
ein GNOME-Metapaket festgelegt, das systemweit installiert wurde. Weil
dieses Metapaket weder eigenen Quellcode noch die eigentlichen Pakete
enthielt, sondern sie lediglich propagiert hatte. wurde es für veraltet
erklärt.

@item @code{extra-packages} (Typ: Liste-von-Paketen)
Eine Liste GNOME-bezogener Pakete, die auch hinzugenommen werden
sollen. Dieses Feld ist dafür vorgesehen, dass Benutzer ihre eigenen Pakete
eintragen, die für ihre GNOME-Erfahrung dazugehören sollen. Beachten Sie,
dass hier schon Pakete im Vorgabewert stehen, die manche (die meisten?)
GNOME-Nutzer verlangen werden.

@item @code{udev-ignorelist} (Vorgabe: @code{'()}) (Typ: Liste-von-Zeichenketten)
A list of regular expressions denoting udev rules or hardware file names
provided by any package that should not be installed.  By default, every
udev rule and hardware file specified by any package referenced in the other
fields are installed.

@item @code{polkit-ignorelist} (Vorgabe: @code{'()}) (Typ: Liste-von-Zeichenketten)
A list of regular expressions denoting polkit rules provided by any package
that should not be installed.  By default, every polkit rule added by any
package referenced in the other fields are installed.

@item @code{keyring} (Typ: gnome-keyring-configuration-oder-#f)
Ein <gnome-keyring-configuration>-Verbundsobjekt, um den GNOME-Schlüsselbund
besser ins System zu integrieren. Siehe die Dokumentation zum
@code{gnome-keyring-service-type} für mehr Informationen. Wenn Sie lieber
auf die Integration des GNOME-Schlüsselbunds verzichten möchten, können Sie
dies auf @code{#f} setzen.

@end table
@end deftp

@defvar plasma-desktop-service-type
Dies ist der Typ des Dienstes, mit dem die Arbeitsumgebung
@uref{https://kde.org/plasma-desktop/, Plasma} nutzbar gemacht wird. Sein
Wert ist ein @code{plasma-desktop-configuration}-Objekt (siehe unten).

Dieser Dienst fügt das Paket @code{plasma} ins Systemprofil ein.
@end defvar

@deftp {Datentyp} plasma-desktop-configuration
Verbundstyp für Einstellungen zur Plasma-Arbeitsumgebung.

@table @asis
@item @code{plasma} (Vorgabe: @code{plasma})
Das Plasma-Paket, das benutzt werden soll.
@end table
@end deftp

@defvar xfce-desktop-service-type
Der Typ des Dienstes, um die @uref{https://xfce.org/, Xfce-Arbeitsumgebung}
auszuführen. Sein Wert ist ein @code{xfce-desktop-configuration}-Objekt
(siehe unten).

Dieser Dienst fügt das Paket @code{xfce} zum Systemprofil hinzu und
erweitert Polkit, damit @code{thunar} befähigt wird, das Dateisystem aus
einer Benutzersitzung heraus mit Administratorrechten zu bearbeiten, nachdem
sich der Benutzer mit dem Administratorpasswort authentisiert hat.

Bedenken Sie, dass @code{xfce4-panel} und seine Plugin-Pakete in dasselbe
Profil installiert werden sollten, um sicherzugehen, dass sie kompatibel
sind. Wenn Sie diesen Dienst benutzen, sollten Sie zusätzliche Plugins
(@code{xfce4-whiskermenu-plugin}, @code{xfce4-weather-plugin} usw.) ins
@code{packages}-Feld Ihres @code{operating-system} eintragen.
@end defvar

@deftp {Datentyp} xfce-desktop-configuration
Verbundstyp für Einstellungen zur Xfce-Arbeitsumgebung.

@table @asis
@item @code{xfce} (Vorgabe: @code{xfce})
Das Xfce-Paket, was benutzt werden soll.
@end table
@end deftp

@defvar mate-desktop-service-type
Dies ist der Typ des Dienstes, um die @uref{https://mate-desktop.org/,
MATE-Arbeitsumgebung} auszuführen. Sein Wert ist ein
@code{mate-desktop-configuration}-Objekt (siehe unten).

Dieser Dienst fügt das Paket @code{mate} ins Systemprofil ein und erweitert
Polkit um die Aktionen aus dem @code{mate-settings-daemon}.
@end defvar

@deftp {Datentyp} mate-desktop-configuration
Verbundstyp für die Einstellungen der MATE-Arbeitsumgebung.

@table @asis
@item @code{mate} (Vorgabe: @code{mate})
Das MATE-Paket, was benutzt werden soll.
@end table
@end deftp

@defvar lxqt-desktop-service-type
Dies ist der Typ des Dienstes, um die @uref{https://lxqt-project.org,
LXQt-Arbeitsumgebung} auszuführen. Sein Wert ist ein
@code{lxqt-desktop-configuration}-Objekt (siehe unten).

Dieser Dienst fügt das Paket @code{lxqt} ins Systemprofil ein.
@end defvar

@deftp {Datentyp} lxqt-desktop-configuration
Verbundstyp für Einstellungen zur LXQt-Arbeitsumgebung.

@table @asis
@item @code{lxqt} (Vorgabe: @code{lxqt})
Das LXQT-Paket, was benutzt werden soll.
@end table
@end deftp

@defvar sugar-desktop-service-type
Dies ist der Typ des Dienstes, um die @uref{https://www.sugarlabs.org,
Sugar-Arbeitsumgebung} auszuführen. Sein Wert ist ein
@code{sugar-desktop-configuration}-Objekt (siehe unten).

Dieser Dienst fügt das Paket @code{sugar} ins Systemprofil ein und außerdem
fügt er alle gewählten Sugar-Aktivitäten ein. Bei den Vorgabeeinstellungen
werden nur wenige Aktivitäten eingefügt.
@end defvar

@deftp {Datentyp} sugar-desktop-configuration
Verbundstyp für Einstellungen zur Sugar-Arbeitsumgebung.

@table @asis
@item @code{sugar} (Vorgabe: @code{sugar})
Das zu verwendende Sugar-Paket.
@item @code{gobject-introspection} (Vorgabe: @code{gobject-introspection})
Welches @code{gobject-introspection}-Paket benutzt werden soll. Mit dem
Paket wird der Zugriff auf Bibliotheken ermöglicht, die installiert werden,
weil Sugar-Aktivitäten von ihnen abhängen.
@item @code{activities} (Vorgabe: @code{(list sugar-help-activity)})
Welche Sugar-Aktivitäten installiert werden.
@end table
@end deftp

Folgendes Beispiel stellt dar, wie die Sugar-Arbeitsumgebung mitsamt einiger
nützlicher Aktivitäten eingerichtet werden kann:

@lisp
(use-modules (gnu))
(use-package-modules sugar)
(use-service-modules desktop)
(operating-system
  …
  (services (cons* (service sugar-desktop-service-type
                            (sugar-desktop-configuration
                              (activities (list sugar-browse-activity
                                                sugar-help-activity
                                                sugar-jukebox-activity
                                                sugar-typing-turtle-activity))))
                   %desktop-services))
  …)
@end lisp

@defvar enlightenment-desktop-service-type
Liefert einen Dienst, der das @code{enlightenment}-Paket zum Systemprofil
hinzufügt und D-Bus mit den Aktionen aus @code{efl} erweitert.
@end defvar

@deftp {Datentyp} enlightenment-desktop-service-configuration
@table @asis
@item @code{enlightenment} (Vorgabe: @code{enlightenment})
Das Enlightenment-Paket, was benutzt werden soll.
@end table
@end deftp

Weil die Desktopdienste GNOME, Xfce und MATE so viele Pakete ins System
mitnehmen, gehören diese nicht zu den Vorgaben in der
@code{%desktop-services}-Variablen. Um GNOME, Xfce oder MATE hinzuzufügen,
benutzen Sie einfach @code{cons} zum Anhängen an die
@code{%desktop-services} im @code{services}-Feld Ihrer
@code{operating-system}-Deklaration:

@lisp
(use-modules (gnu))
(use-service-modules desktop)
(operating-system
  …
  ;; cons* fügt Elemente zur Liste hinzu, die in seinem letzten Argument
  ;; übergeben wird.
  (services (cons* (service gnome-desktop-service-type)
                   (service xfce-desktop-service-type)
                   %desktop-services))
  …)
@end lisp

Diese Arbeitsumgebungen stehen dann im grafischen Anmeldefenster zur
Auswahl.

Die eigentlichen Dienstdefinitionen, die in @code{%desktop-services} stehen
und durch @code{(gnu services dbus)} und @code{(gnu services desktop)} zur
Verfügung gestellt werden, werden im Folgenden beschrieben.

@defvar dbus-root-service-type
Diensttyp für einen Dienst, der den Systembus von D-Bus
ausführt@footnote{@uref{https://dbus.freedesktop.org/, D-Bus} ist eine
Einrichtung zur Interprozesskommunikation. Deren Systembus wird benutzt,
damit Systemdienste miteinander kommunizieren können und damit sie bei
systemweiten Ereignissen benachrichtigt werden können.}.

Der Wert dieses Dienstes ist ein @code{<dbus-configuration>}-Verbundsobjekt.
@end defvar

@deftp {Datentyp} dbus-configuration
Datentyp, der die Konfiguration vom @code{dbus-root-service-type}
repräsentiert.

@table @asis
@item @code{dbus} (Vorgabe: @code{dbus}) (Typ: dateiartig)
Paketobjekt für dbus.

@item @code{services} (Vorgabe: @code{'()}) (Typ: Assoziative-Liste)
Liste von Paketen, die ein Verzeichnis @file{etc/dbus-1/system.d} mit
zusätzlichen D-Bus-Konfigurations- und Richtliniendateien enthalten. Damit
zum Beispiel der Avahi-Daemon den Systembus benutzen kann, muss
@var{services} gleich @code{(list avahi)} sein.

@item @code{verbose?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Wenn es auf @code{#t} gesetzt ist, wird beim Start von D-Bus dessen
Umgebungsvariable @samp{DBUS_VERBOSE} für ausführliche Protokollierung auf
@samp{1} gesetzt. Damit das auch etwas bewirkt, muss für @var{dbus} ein
D-Bus-Paket mit Unterstützung dafür angegeben werden, etwa
@code{dbus-verbose}. Das ausführliche Protokoll finden Sie in
@file{/var/log/dbus-daemon.log}.

@end table
@end deftp

@subsubheading Elogind

@uref{https://github.com/elogind/elogind, Elogind} ist ein Anmelde- und
Sitzungsdaemon, der zudem die meisten Energieereignisse auf Systemebene in
einem Rechner behandelt, wie etwa ein Versetzen des Systems in Bereitschaft,
wenn der Rechner zugeklappt wird, oder ein Herunterfahren beim Drücken des
Stromschalters.

Auch stellt er eine D-Bus-Schnittstelle bereit, über die ausgelesen werden
kann, welche Benutzer angemeldet sind und welche Sitzungen sie geöffnet
haben, und außerdem das System in Bereitschaft versetzt werden kann, der
Bereitschaftsmodus unterdrückt werden kann, das System neu gestartet werden
kann und anderes.

@defvar elogind-service-type
Dies ist der Diensttyp, um @command{elogind}, einen Anmelde- und
Sitzungsdaemon, auszuführen. Der Wert dieses Diensttyps ist ein
@code{<elogind-configuration>}-Objekt.
@end defvar

@c Auto-generated via (configuration->documentation 'elogind-configuration).
@c %start of fragment

@deftp {Datentyp} elogind-configuration
Available @code{elogind-configuration} fields are:

@table @asis
@item @code{elogind} (Vorgabe: @code{elogind}) (Typ: dateiartig)
The elogind package to use.

@item @code{system-sleep-hook-files} (default: @code{()}) (type: list-of-file-likes)
A list of executables (file-like objects) that will be installed into the
@file{/etc/elogind/system-sleep} hook directory.  See `Hook directories' in
the @samp{loginctl(1)} man page for more information.

@item @code{system-shutdown-hook-files} (default: @code{()}) (type: list-of-file-likes)
A list of executables (file-like objects) that will be installed into the
@file{/etc/elogind/system-shutdown/} hook directory.

@item @code{allow-power-off-interrupts?} (default: @code{#f}) (type: maybe-boolean)
Whether the executables in elogind's hook directories (see above) can cause
a power-off action to be cancelled (interrupted) by printing an appropriate
error message to stdout.

@item @code{allow-suspend-interrupts?} (default: @code{#f}) (type: maybe-boolean)
Likewise as the @code{allow-power-off-interrupts?} option, but for the
suspend action.

@item @code{broadcast-power-off-interrupts?} (default: @code{#f}) (type: maybe-boolean)
Whether an interrupt of a power-off action is broadcasted.

@item @code{broadcast-suspend-interrupts?} (default: @code{#f}) (type: maybe-boolean)
Whether an interrupt of a suspend action is broadcasted.

@item @code{kill-user-processes?} (Vorgabe: @code{#f}) (Typ: Vielleicht-Boolescher-Ausdruck)
Whether the processes of a user should be killed when the user logs out.

@item @code{kill-only-users} (type: maybe-list-of-user-names)
Usernames whose processes should be killed, regardless the value of
@code{kill-user-processes?}.

@item @code{kill-exclude-users} (default: @code{("root")}) (type: maybe-list-of-user-names)
Usernames whose processes should @emph{not} be killed, regardless the value
of @code{kill-user-processes?}.

@item @code{inhibit-delay-max-seconds} (Vorgabe: @code{5}) (Typ: Vielleicht-Nichtnegative-ganze-Zahl)
The maximum time a system shutdown or sleep request is delayed due to an
inhibitor lock of type delay being active before the inhibitor is ignored
and the operation executes anyway.

@item @code{handle-power-key} (default: @code{poweroff}) (type: maybe-action)
The action done when the power key is pressed.  The compiled default is
@code{'poweroff}.

@item @code{handle-suspend-key} (default: @code{suspend}) (type: maybe-action)
The action done when the suspend key is pressed.  The

@item @code{handle-hibernate-key} (default: @code{hibernate}) (type: maybe-action)
The action done when the hibernate key is pressed.

@item @code{handle-lid-switch} (default: @code{suspend}) (type: maybe-action)
The action done when the lid is closed.

@item @code{handle-lid-switch-docked} (default: @code{ignore}) (type: maybe-action)
The action done when the lid is closed and the device docked.

@item @code{handle-lid-switch-external-power} (default: @code{suspend}) (type: maybe-action)
The action done when the lid is closed and the device is externally powered.

@item @code{power-key-ignore-inhibited?} (default: @code{#f}) (type: maybe-boolean)
Whether to ignore high-level inhibitor locks (shutdown, reboot, sleep or
idle) when the power key is pressed.

@item @code{suspend-key-ignore-inhibited?} (Vorgabe: @code{#f}) (Typ: Vielleicht-Boolescher-Ausdruck)
Whether to ignore high-level inhibitor locks (shutdown, reboot, sleep or
idle) when the suspend key is pressed.

@item @code{hibernate-key-ignore-inhibited?} (Vorgabe: @code{#f}) (Typ: Vielleicht-Boolescher-Ausdruck)
Whether to ignore high-level inhibitor locks (shutdown, reboot, sleep or
idle) when the hibernate key is pressed.

@item @code{lid-switch-ignore-inhibited?} (Vorgabe: @code{#f}) (Typ: Vielleicht-Boolescher-Ausdruck)
Whether to ignore high-level inhibitor locks (shutdown, reboot, sleep or
idle) when the lid is closed.

@item @code{holdoff-timeout-seconds} (Vorgabe: @code{30}) (Typ: Vielleicht-Nichtnegative-ganze-Zahl)
Specifies the number of seconds after system startup or system resume during
which elogind will hold off on reacting to lid events.

@item @code{idle-action} (default: @code{ignore}) (type: maybe-action)
Action to take when the system is idle.

@item @code{idle-action-seconds} (type: maybe-non-negative-integer)
The delay after which the action configured in @code{idle-action} is taken
after the system is idle.

@item @code{runtime-directory-size-percent} (type: maybe-percent)
Set the size limit, in percent, on the @env{XDG_RUNTIME_DIR} runtime
directory for each user who logs in.  This specifies the per-user size limit
relative to the amount of physical @acronym{RAM,read access memory}.  This
value takes precedence over that specified via
@code{runtime-directory-size}.

@item @code{runtime-directory-size} (type: maybe-non-negative-integer)
Set the size limit, in bytes, on the @env{XDG_RUNTIME_DIR} runtime directory
for each user who logs in.

@item @code{remove-ipc?} (Vorgabe: @code{#t}) (Typ: Vielleicht-Boolescher-Ausdruck)
Whether @acronym{IPC,inter-process communication} objects belonging to the
user shall be removed when the user fully logs out.

@item @code{suspend-state} (default: @code{(mem standby freeze)}) (type: maybe-list-of-suspend-states)
The suspend state values to be write to @file{/sys/power/state} by elogind
when suspending the system.  They will be tried in turn, until one is
written without error.

@item @code{suspend-mode} (type: maybe-list-of-suspend-modes)
The suspend mode values to write to @file{/sys/power/mem_sleep} by elogind
when suspending the system.

@item @code{suspend-estimation-seconds} (default: @code{3600}) (type: maybe-non-negative-integer)
Cause the RTC alarm to wake the system after the specified time span to
measure the system battery capacity level and estimate the battery
discharging rate, which is used for estimating the time span until the
system battery charge level goes down to 5%.  This option is only used by
elogind when using the @code{'suspend-then-hibernate} action.

@item @code{hibernate-mode} (default: @code{(platform shutdown)}) (type: maybe-list-of-hibernation-modes)
The hibernation mode values to write to @file{/sys/power/disk} by elogind
when hibernating the system.

@item @code{hibernate-delay-seconds} (Typ: Vielleicht-Nichtnegative-ganze-Zahl)
The amount of time the system spends in suspend mode before the system is
automatically put into hibernate mode.

@item @code{hibernate-state} (type: maybe-list-of-strings)
Diese Option ist veraltet und wird demnächst verschwinden.

@item @code{hybrid-sleep-state} (type: maybe-list-of-strings)
Diese Option ist veraltet und wird demnächst verschwinden.

@item @code{hybrid-sleep-mode} (type: maybe-list-of-strings)
Diese Option ist veraltet und wird demnächst verschwinden.

@end table

@end deftp


@c %end of fragment

@defvar accountsservice-service-type
Diensttyp für einen Dienst, der AccountsService ausführt. Dabei handelt es
sich um einen Systemdienst, mit dem verfügbare Benutzerkonten aufgelistet
und deren Passwörter geändert werden können, und Ähnliches. AccountsService
arbeitet mit PolicyKit zusammen, um es Benutzern ohne besondere
Berechtigungen zu ermöglichen, ihre Systemkonfiguration zu ändern. Siehe
@uref{https://www.freedesktop.org/wiki/Software/AccountsService/, den
Webauftritt von AccountsService} für weitere Informationen.

Der Wert dieses Dienstes ist ein dateiartiges Objekt; vorgegeben ist
@code{accountsservice} (das Paketobjekt für AccountsService).
@end defvar

@defvar polkit-service-type
Diensttyp für einen Dienst, der
@url{https://www.freedesktop.org/wiki/Software/polkit/, Polkit} zur
Verwaltung von Berechtigungen ausführt, wodurch Systemadministratoren auf
strukturierte Weise den Zugang zu „privilegierten“ Operationen gewähren
können, die erweiterte Berechtigungen erfordern. Indem der Polkit-Dienst
angefragt wird, kann eine mit Berechtigungen ausgestattete Systemkomponente
die Information erhalten, ob normalen Benutzern Berechtigungen gewährt
werden dürfen. Zum Beispiel kann einer normalen Nutzerin die Berechtigung
gegeben werden, das System in den Bereitschaftsmodus zu versetzen, unter der
Voraussetzung, dass sie lokal vor Ort angemeldet ist.

Der Wert dieses Dienstes muss ein @code{<polkit-configuration>}-Objekt sein.
@end defvar

@c TODO: Document <polkit-configuration>, preferably by refactoring this to use
@c       define-configuration and generating documentation from it.

@defvar polkit-wheel-service
Dieser Dienst richtet die @code{wheel}-Benutzergruppe als Administratoren
für den Polkit-Dienst ein. Der Zweck davon ist, dass Benutzer in der
@code{wheel}-Benutzergruppe nach ihren eigenen Passwörtern gefragt werden
statt dem Passwort des Administratornutzers @code{root}, wenn sie
administrative Tätigkeiten durchführen, ähnlich dem, wie sich @code{sudo}
verhält.
@end defvar

@defvar upower-service-type
Typ des Dienstes, der @uref{https://upower.freedesktop.org/,
@command{upowerd}} ausführt, ein Programm zur systemweiten Überwachung des
Energieverbrauchs und der Akkuladung. Er hat die angegebenen
Konfigurationseinstellungen.

Er implementiert die D-Bus-Schnittstelle
@code{org.freedesktop.UPower}. Insbesondere wird UPower auch von GNOME
benutzt.
@end defvar

@deftp {Datentyp} upower-configuration
Repräsentiert die Konfiguration von UPower.

@table @asis

@item @code{upower} (Vorgabe: @var{upower})
Das Paket, das für @code{upower} benutzt werden soll.

@item @code{watts-up-pro?} (Vorgabe: @code{#f})
Aktiviert das Watts-Up-Pro-Gerät.

@item @code{poll-batteries?} (Vorgabe: @code{#t})
Aktiviert das regelmäßige Abfragen des Kernels bezüglich Änderungen am Stand
der Akku-Ladung.

@item @code{ignore-lid?} (Vorgabe: @code{#f})
Ignorieren, ob der Rechner zugeklappt ist. Das kann gewünscht sein, wenn
Auf- und Zuklappen nicht richtig erkannt werden.

@item @code{use-percentage-for-policy?} (Vorgabe: @code{#t})
Ob sich die Richtlinie am Akku-Ladestand in Prozent statt an der
verbleibenden Zeit orientieren soll. Eine Richtlinie, die den Prozentstand
als Orientierung nimmt, ist in der Regel zuverlässiger.

@item @code{percentage-low} (Vorgabe: @code{20})
Wenn @code{use-percentage-for-policy?} auf @code{#t} gesetzt ist, wird
hiermit der Prozentstand festgelegt, ab dem der Akku-Ladestand als niedrig
gilt.

@item @code{percentage-critical} (Vorgabe: @code{5})
Wenn @code{use-percentage-for-policy?} auf @code{#t} gesetzt ist, wird
hiermit der Prozentstand festgelegt, ab dem der Akku-Ladestand als kritisch
gilt.

@item @code{percentage-action} (Vorgabe: @code{2})
Wenn @code{use-percentage-for-policy?} auf @code{#t} gesetzt ist, wird
hiermit der Prozentstand festgelegt, ab dem Maßnahmen eingeleitet werden.

@item @code{time-low} (Vorgabe: @code{1200})
Wenn @code{use-percentage-for-policy?} auf @code{#f} gesetzt ist, wird
hiermit die verbleibende Zeit in Sekunden festgelegt, ab der der
Akku-Ladestand als niedrig gilt.

@item @code{time-critical} (Vorgabe: @code{300})
Wenn @code{use-percentage-for-policy?} auf @code{#f} gesetzt ist, wird
hiermit die verbleibende Zeit in Sekunden festgelegt, ab der der
Akku-Ladestand als kritisch gilt.

@item @code{time-action} (Vorgabe: @code{120})
Wenn @code{use-percentage-for-policy?} auf @code{#f} gesetzt ist, wird
hiermit die verbleibende Zeit in Sekunden festgelegt, ab der Maßnahmen
eingeleitet werden.

@item @code{critical-power-action} (Vorgabe: @code{'hybrid-sleep})
Welche Maßnahme eingeleitet wird, wenn die @code{percentage-action} oder
@code{time-action} erreicht wurde (je nachdem, wie
@code{use-percentage-for-policy?} eingestellt wurde).

Mögliche Werte sind:

@itemize @bullet
@item
@code{'power-off}

@item
@code{'hibernate}

@item
@code{'hybrid-sleep}.
@end itemize

@end table
@end deftp

@defvar udisks-service-type
Diensttyp für den Dienst für
@uref{https://udisks.freedesktop.org/docs/latest/, UDisks}, einen Daemon zur
@dfn{Datenträgerverwaltung}, der Benutzeroberflächen mit Benachrichtigungen
und Möglichkeiten zum Einbinden und Aushängen von Datenträgern versorgt. Zu
den Programmen, die mit UDisks kommunizieren, gehört der Befehl
@command{udisksctl}, der Teil von UDisks ist, sowie GNOME Disks. Beachten
Sie, dass Udisks über den Befehl @command{mount} funktioniert; man kann
damit also nur die Dateisystemwerkzeuge benutzen, die ins Systemprofil
installiert sind. Wenn Sie also NTFS-Dateisysteme zum Lesen und Schreiben
öffnen können möchten, müssen Sie @code{ntfs-3g} systemweit installiert
haben.

Der Wert dieses Dienstes muss ein @code{<udisks-configuration>}-Objekt sein.
@end defvar

@deftp {Datentyp} udisks-configuration
Datentyp, der die Konfiguration vom @code{udisks-service-type}
repräsentiert.

@table @asis
@item @code{udisks} (Vorgabe: @code{udisks}) (Typ: dateiartig)
Paketobjekt von UDisks.

@end table
@end deftp

@defvar gvfs-service-type
Type for the service that provides virtual file systems for GIO
applications, which enables support for @code{trash://}, @code{ftp://},
@code{sftp://} and many other location schemas in file managers like
Nautilus (GNOME Files) and Thunar.

Der Wert dieses Dienstes muss ein @code{<gvfs-configuration>}-Objekt sein.
@end defvar

@deftp {Datentyp} gvfs-configuration
Datentyp, der die Konfiguration vom @code{gvfs-service-type} repräsentiert.

@table @asis
@item @code{gvfs} (Vorgabe: @code{gvfs}) (Typ: dateiartig)
Paketobjekt für GVfs.

@end table
@end deftp

@defvar colord-service-type
Dies ist der Typ des Dienstes, der @command{colord} ausführt. Dabei handelt
es sich um einen Systemdienst mit einer D-Bus-Schnittstelle, um die
Farbprofile von Ein- und Ausgabegeräten wie Bildschirmen oder Scannern zu
verwalten. Insbesondere wird colord vom grafischen
GNOME-Farbverwaltungswerkzeug benutzt. Siehe
@uref{https://www.freedesktop.org/software/colord/, den Webauftritt von
colord} für weitere Informationen.
@end defvar

@cindex Scanner, Zugriff auf
@defvar sane-service-type
Mit diesem Dienst wird Zugriff auf Scanner über
@uref{http://www.sane-project.org, SANE} möglich, indem er die nötigen
udev-Regeln und zusätzliche Backends installiert. Er ist Teil von
@code{%desktop-services} (siehe @ref{Desktop-Dienste}) und verwendet in den
Vorgabeeinstellungen das Paket @code{sane-backends} (siehe unten) für die
Hardwareunterstützung.
@end defvar

@deftp {Data Type} sane-configuration
Data type representing the configuration for SANE.

@table @asis

@item @code{sane} (default: @code{sane})
Package containing SANE library.

@item @code{backends} (default: @code{(sane-backends)})
List of packages with pluggable SANE backends:

@itemize @bullet
@item
@code{sane-backends}: The default backend collection which supports many
recent scanners,

@item
@code{sane-airscan}: A backend that enables network scanners supporting eSCL
(Apple) or WSD, (Microsoft) protocols

@item
@code{hplip}: A backend containing drivers for older Hewlett-Packard
scanners,

@item
@code{utsushi}: A backend containing drivers for older Epson devices.

@end itemize

@end table
@end deftp

Um weitere Scanner-Backends auf einem System zu benutzen, das auf den
@code{%desktop-services} aufbaut, können Sie @code{modify-services} benutzen
(siehe @ref{Service-Referenz, @code{modify-services}}), etwa so:

@lisp
(use-modules (gnu))
(use-service-modules
  …
  desktop)
(use-package-modules
  …
  scanner)

(define %my-desktop-services
  ;; Alternative Diensteliste wie %desktop-services mit Unterstützung
  ;; für mehr Scanner.
  (modify-services %desktop-services
    (sane-service-type _ =>
      (sane-configuration
        (backends (list sane-backends sane-airscan))))))

(operating-system
  …
  (services %my-desktop-services))
@end lisp

@deffn {Prozedur} geoclue-application Name [#:allowed? #t] [#:system? #f] [#:users '()]
Liefert eine Konfiguration, mit der eine Anwendung auf Ortungsdaten von
GeoClue zugreifen kann. Als @var{Name} wird die Desktop-ID der Anwendung
angegeben, ohne die Pfadkomponente mit @code{.desktop}-Endung. Wenn
@var{allowed?} wahr ist, hat die Anwendung standardmäßig Zugriff auf
Ortungsinformationen. Der boolesche Wert @var{system?} zeigt an, ob die
Anwendung eine Systemkomponente ist oder nicht. Zum Schluss wird für
@var{users} eine Liste von Benutzeridentifikatoren (UIDs) aller
Benutzerkonten angegeben, für die diese Anwendung Zugriff auf
Ortungsinformationen gewährt bekommt. Eine leere Benutzerliste bedeutet,
dass dies für alle Benutzer gewährt wird.
@end deffn

@defvar %standard-geoclue-applications
Die Standardliste wohlbekannter GeoClue-Anwendungskonfigurationen, mit der
das GNOME-Werkzeug für Datum und Uhrzeit die Berechtigung bekommt, den
aktuellen Ort abzufragen, um die Zeitzone festzulegen, und die Webbrowser
IceCat und Epiphany Ortsinformationen abfragen dürfen. IceCat und Epiphany
fragen beide zuerst beim Benutzer nach, bevor sie einer Webseite gestatten,
den Ort des Benutzer abzufragen.
@end defvar

@defvar geoclue-service-type
Diensttyp für einen Dienst, der den Ortungsdienst
@url{https://wiki.freedesktop.org/www/Software/GeoClue/, GeoClue}
ausführt. Dieser Dienst bietet eine D-Bus-Schnittstelle an, mit der
Anwendungen Zugriff auf den physischen Ort eines Benutzers anfragen können,
und optional Informationen in Online-Ortsdatenbanken eintragen können.

Der Wert dieses Dienstes muss ein @code{<geoclue-configuration>}-Objekt
sein.
@end defvar

@c TODO: Document <geoclue-configuration>, preferably by refactoring this to use
@c       define-configuration and generating documentation from it.

@defvar iio-sensor-proxy-service-type
Type for the service that runs
@uref{https://gitlab.freedesktop.org/hadess/iio-sensor-proxy, IIO sensor
proxy}, a daemon that proxies low-level sensor data from Industrial I/O
(IIO) devices into a D-Bus interface.  It enables user-space applications,
such as desktop environments like GNOME and KDE, and services like GeoClue,
to access data from various sensors commonly found in devices like
ultrabooks and 2-in-1s.  This allows for:

@itemize @bullet
@item
Automatic screen rotation based on accelerometer data.
@item
Ambient brightness adjustment using light sensor data.
@item
Compass/direction information for location services (via GeoClue).
@end itemize

The value for this service is a @code{<iio-sensor-proxy-configuration>}
object.
@end defvar

@deftp {Data Type} iio-sensor-proxy-configuration
Data type representing the configuration for
@code{iio-sensor-proxy-service-type}.

@table @asis
@item @code{iio-sensor-proxy} (default: @code{iio-sensor-proxy}) (type: file-like)
Package object of iio-sensor-proxy.

@end table
@end deftp

@defvar bluetooth-service-type
Dies ist der Diensttyp für das System zum @uref{https://bluez.org/,
Linux-Bluetooth-Protokollstapel} (BlueZ), das die Konfigurationsdatei
@file{/etc/bluetooth/main.conf} erzeugt. Der Wert für diesen Diensttyp ist
ein @command{bluetooth-configuration}-Verbundsobjekt wie in diesem Beispiel:

@lisp
(service bluetooth-service-type)
@end lisp

Siehe unten für Details zur @code{bluetooth-configuration}.
@end defvar

@deftp {Datentyp} bluetooth-configuration
Repräsentiert die Konfiguration für den @code{bluetooth-service-type}.

@table @asis
@item @code{bluez} (Vorgabe: @code{bluez})
Zu benutzendes @code{bluez}-Paket.

@item @code{name} (Vorgabe: @code{"BlueZ"})
Welchen Namen Sie für den Adapter als Voreinstellung geben.

@item @code{class} (Vorgabe: @code{#x000000})
Welche Geräteklasse Sie als Voreinstellung geben. Nur die Bits für „major
device class“ und „minor device class“ werden beachtet.

@item @code{discoverable-timeout} (Vorgabe: @code{180})
Wie lange der Adapter erkennbar bleiben soll („discoverable mode“), bevor
die Erkennbarkeit endet. Der Wert wird in Sekunden angegeben.

@item @code{always-pairable?} (Vorgabe: @code{#f})
Koppeln von Geräten immer zulassen, so dass kein Agent registriert sein
muss.

@item @code{pairable-timeout} (Vorgabe: @code{0})
Wie lange Koppeln möglich sein soll („pairable mode“), bevor die
Erkennbarkeit endet. Der Wert wird in Sekunden angegeben.

@item @code{device-id} (Vorgabe: @code{#f})
Dieses Gerät mit dieser Geräteidentifikatorbezugsquelle („vendor id source“,
d.h.@: Assigner), Geräteidentifikator, Produkt- sowie Versionsinformationen
im Device-ID-Profil ausweisen. Die Werte für @var{assigner}, @var{VID},
@var{PID} und @var{version} werden durch ":" getrennt.

Mögliche Werte sind:

@itemize @bullet
@item
@code{#f}, um nichts festzulegen.

@item
@code{"assigner:1234:5678:abcd"}, wobei @var{assigner} entweder @code{usb}
ist (die Voreinstellung) oder @code{bluetooth}.

@end itemize

@item @code{reverse-service-discovery?} (Vorgabe: @code{#t})
Bluetooth-Dienste auf Geräten erkennen, die sich mit unserem Gerät
verbinden. Bei BR/EDR braucht man diese Option eigentlich nur für den
Qualifizierungsprozess, weil der BITE-Tester in manchen Testfällen etwas
gegen inverses SDP hat; bei LE wird hiermit die Funktion als GATT-Client
deaktiviert, was sinnvoll ist, wenn unser System nur als Peripheriegerät
eingesetzt wird.

@item @code{name-resolving?} (Vorgabe: @code{#t})
Namensauflösung bei Gerätesuche („Inquiry“) aktivieren. Legen Sie es auf
@code{#f} fest, wenn Sie die Namen der entfernten Geräte nicht brauchen und
Erkennungszyklen beschleunigen möchten.

@item @code{debug-keys?} (Vorgabe: @code{#f})
Ob „debug link keys“ für die Laufzeit persistent gespeichert
werden. Vorgegeben ist @code{#f}; sie bleiben also nur gültig, solange die
Verbindung mit ihnen anhält.

@item @code{controller-mode} (Vorgabe: @code{'dual})
Schränkt die Controller auf das angegebene Transportprotokoll ein. Bei
@code{'dual} werden sowohl BR/EDR als auch LE benutzt (wenn die Hardware sie
unterstützt).

Mögliche Werte sind:

@itemize @bullet
@item
@code{'dual}

@item
@code{'bredr}

@item
@code{'le}

@end itemize

@item @code{multi-profile} (Vorgabe: @code{'off})
Unterstützung für Multi Profile Specification aktivieren. Hiermit kann
eingestellt werden, ob ein System nur in Konfigurationen von Multiple
Profiles Single Device (MPSD) laufen kann oder sowohl mit Konfigurationen in
Multiple Profiles Single Device (MPSD) als auch Konfigurationen in Multiple
Profiles Multiple Devices (MPMD) umgehen kann.

Mögliche Werte sind:

@itemize @bullet
@item
@code{'off}

@item
@code{'single}

@item
@code{'multiple}

@end itemize

@item @code{fast-connectable?} (Vorgabe: @code{#f})
Dauerhaft eine beschleunigte Verbindung („Fast Connectable“) bei Adaptern,
die sie unterstützen, ermöglichen. Ist dies aktiviert, können sich andere
Geräte schneller mit unserem verbinden, jedoch steigt der
Stromverbrauch. Diese Funktion steht nur auf Kernel-Version 4.1 und neuer
vollständig zur Verfügung.

@item @code{privacy} (Vorgabe: @code{'off})
Die Voreinstellung zur Verfolgbarkeit.

@itemize @bullet
@item
@code{'off}: Nicht privat stellen.

@item
@code{'network/on}: Ein Gerät nimmt nur Mitteilungen („advertising packets“)
von anderen Geräten an, die private Adressen enthalten. Mit manchen alten
Geräten funktioniert das vielleicht nicht, weil es voraussetzt, dass für
alles RPA(s) benutzt werden.

@item
@code{'device}: Auf „device privacy mode“ gestellte Geräte schützen nur vor
Nachverfolgbarkeit des jeweiligen Geräts, aber wenn Mitteilungen von anderen
Geräten deren Identity Address preisgeben, werden sie genauso akzeptiert wie
eine private Adresse. Das gilt auch bei anderen Geräten, die in der
Vergangenheit ihre IRK mitgeteilt hatten.

@end itemize

Des Weiteren gibt es folgende Möglichkeiten, wenn @var{controller-mode} auf
@code{'dual} gesetzt ist:

@itemize @bullet
@item
@code{'limited-network}: Limited Discoverable Mode für Mitteilungen
einsetzen, wodurch wie bei BR/EDR die Identity Address mitgeteilt wird, wenn
das Gerät erkennbar ist, aber Network Privacy Mode beim Scannen nach Geräten
gilt.

@item
@code{'limited-network}: Limited Discoverable Mode für Mitteilungen
einsetzen, wodurch wie bei BR/EDR die Identity Address mitgeteilt wird, wenn
das Gerät erkennbar ist, aber Device Privacy Mode beim Scannen nach Geräten
gilt.

@end itemize

@item @code{just-works-repairing} (Vorgabe: @code{'never})
Wie auf einen vom anderen Gerät ausgelösten JUST-WORKS-Vorgang reagiert
werden soll.  Bei @code{'always} wird das andere Gerät akzeptiert, bei
@code{'never} abgelehnt und bei @code{'confirm} nachgefragt.

Mögliche Werte sind:
@itemize @bullet
@item
@code{'never}

@item
@code{'confirm}

@item
@code{'always}

@end itemize

@item @code{temporary-timeout} (Vorgabe: @code{30})
Wie lange ein temporäres Gerät koppelbar bleibt. Der Wert wird in Sekunden
angegeben. Bei @code{0} läuft die Zeit nie aus.

@item @code{refresh-discovery?} (Vorgabe: @code{#t})
Zulassen, dass das Gerät eine SDP-Anfrage schickt, um bekannte Dienste zu
ermitteln, sobald eine Verbindung hergestellt wurde.

@item @code{experimental} (Vorgabe: @code{#f})
Experimentelle Funktionen und Schnittstellen bereitstellen. Sie können auch
als Liste von UUIDs angegeben werden.

Mögliche Werte sind:

@itemize @bullet
@item
@code{#t}

@item
@code{#f}

@item
@code{(list (uuid <uuid-1>) (uuid <uuid-2>) …)}.
@end itemize

Die Liste der möglichen UUIDs:
@itemize @bullet
@item
@code{d4992530-b9ec-469f-ab01-6c481c47da1c}: BlueZ Experimental Debug,

@item
@code{671b10b5-42c0-4696-9227-eb28d1b049d6}: BlueZ Experimental Simultaneous
Central and Peripheral,

@item
@code{15c0a148-c273-11ea-b3de-0242ac130004}: BlueZ Experimental LL privacy,

@item
@code{330859bc-7506-492d-9370-9a6f0614037f}: BlueZ Experimental Bluetooth
Quality Report,

@item
@code{a6695ace-ee7f-4fb9-881a-5fac66c629af}: BlueZ Experimental Offload
Codecs.
@end itemize

@item @code{remote-name-request-retry-delay} (Vorgabe: @code{300})
Wie lange nach einer fehlgeschlagenen Namensauflösung @emph{keine} erneute
Auflösung des Namens des anderen Geräts versucht werden soll.

@item @code{page-scan-type} (Vorgabe: @code{#f})
Auf welche Art die Erkennung („Scan“) von Verbindungsversuchen („Paging“)
bei BR/EDR durchgeführt wird.

@item @code{page-scan-interval} (Vorgabe: @code{#f})
Aktivitätsintervall zwischen Anfängen von Erkennungsphasen von
Verbindungsversuchen bei BR/EDR.

@item @code{page-scan-window} (Vorgabe: @code{#f})
Aktivitätsfenster jeder Erkennungsphase von Verbindungsversuchen bei BR/EDR.

@item @code{inquiry-scan-type} (Vorgabe: @code{#f})
Auf welche Art die Erkennung von Gerätesuchen („Inquiry“) bei BR/EDR
durchgeführt wird.

@item @code{inquiry-scan-interval} (Vorgabe: @code{#f})
Aktivitätsintervall zwischen Anfängen von Erkennungsphasen von Gerätesuchen
bei BR/EDR.

@item @code{inquiry-scan-window} (Vorgabe: @code{#f})
Aktivitätsfenster jeder Erkennungsphase von Gerätesuchen bei BR/EDR.

@item @code{link-supervision-timeout} (Vorgabe: @code{#f})
Zeitbegrenzung, ab der eine inaktive Verbindung bei BR/EDR als getrennt
gilt.

@item @code{page-timeout} (Vorgabe: @code{#f})
Zeitbegrenzung, ab der ein unbeantworteter Verbindungsversuch bei BR/EDR als
gescheitert gilt.

@item @code{min-sniff-interval} (Vorgabe: @code{#f})
Minimale Intervalllänge im Sniff-Modus bei BR/EDR.

@item @code{max-sniff-interval} (Vorgabe: @code{#f})
Maximale Intervalllänge im Sniff-Modus bei BR/EDR.

@item @code{min-advertisement-interval} (Vorgabe: @code{#f})
Minimale Intervalllänge zwischen Mitteilungen bei LE (nur für Legacy
Advertisement).

@item @code{max-advertisement-interval} (Vorgabe: @code{#f})
Maximale Intervalllänge zwischen Mitteilungen bei LE (nur für Legacy
Advertisement).

@item @code{multi-advertisement-rotation-interval} (Vorgabe: @code{#f})
Wenn verschiedene Mitteilungen ausgegeben werden, mit welchem Intervall
dazwischen rotiert wird, bei LE.

@item @code{scan-interval-auto-connect} (Vorgabe: @code{#f})
Intervall zwischen Anfängen von Erkennungsphasen bei passiven Erkennungen
zur Unterstützung für autonome Verbindung, bei LE.

@item @code{scan-window-auto-connect} (Vorgabe: @code{#f})
Länge jedes Erkennungsfensters bei passiven Erkennungen zur Unterstützung
für autonome Verbindung, bei LE.

@item @code{scan-interval-suspend} (Vorgabe: @code{#f})
Intervall zwischen Anfängen von Erkennungsphasen bei aktiven Erkennungen zur
Unterstützung für Wake-from-Suspend, bei LE.

@item @code{scan-window-suspend} (Vorgabe: @code{#f})
Länge jedes Erkennungsfensters bei aktiven Erkennungen zur Unterstützung für
Wake-from-Suspend, bei LE.

@item @code{scan-interval-discovery} (Vorgabe: @code{#f})
Intervall zwischen Anfängen von Erkennungsphasen bei aktiven Erkennungen von
sich mitteilenden Geräten, bei LE.

@item @code{scan-window-discovery} (Vorgabe: @code{#f})
Länge jedes Erkennungsfensters bei aktiven Erkennungen von sich mitteilenden
Geräten, bei LE.

@item @code{scan-interval-adv-monitor} (Vorgabe: @code{#f})
Intervall zwischen Anfängen von Erkennungsphasen bei passiven Erkennungen
zur Unterstützung der Advertisement-Monitor-Programmschnittstellen, bei LE.

@item @code{scan-window-adv-monitor} (Vorgabe: @code{#f})
Länge jedes Erkennungsfensters bei passiven Erkennungen zur Unterstützung
der Advertisement-Monitor-Programmschnittstellen, bei LE.

@item @code{scan-interval-connect} (Vorgabe: @code{#f})
Intervall zwischen Anfängen von Erkennungsphasen beim Verbindungsaufbau.

@item @code{scan-window-connect} (Vorgabe: @code{#f})
Länge jedes Erkennungsfensters beim Verbindungsaufbau.

@item @code{min-connection-interval} (Vorgabe: @code{#f})
Kleinstes gewünschtes Intervall für eine Verbindung, bei LE. Demgegenüber
hat Vorrang, wenn ein Wert über die Schnittstelle Load Connection Parameters
bestimmt wird.

@item @code{max-connection-interval} (Vorgabe: @code{#f})
Größtes gewünschtes Intervall für eine Verbindung, bei LE. Demgegenüber hat
Vorrang, wenn ein Wert über die Schnittstelle Load Connection Parameters
bestimmt wird.

@item @code{connection-latency} (Vorgabe: @code{#f})
Gewünschte Latenz für eine Verbindung, bei LE. Demgegenüber hat Vorrang,
wenn ein Wert über die Schnittstelle Load Connection Parameters bestimmt
wird.

@item @code{connection-supervision-timeout} (Vorgabe: @code{#f})
Gewünschte Zeitbegrenzung, ab der eine inaktive Verbindung als getrennt
gilt, bei LE. Demgegenüber hat Vorrang, wenn ein Wert über die Schnittstelle
Load Connection Parameters bestimmt wird.

@item @code{autoconnect-timeout} (Vorgabe: @code{#f})
Gewünschte Zeitbegrenzung für autonome Verbindungsversuche, bei
LE. Demgegenüber hat Vorrang, wenn ein Wert über die Schnittstelle Load
Connection Parameters bestimmt wird.

@item @code{adv-mon-allowlist-scan-duration} (Vorgabe: @code{300})
Dauer der Erkennungsphasen für Geräte auf der Liste erlaubter Geräte bei
verzahnten Arten der Erkennungsphase („Interleaving Scan“). Wird nur bei
Erkennungsphasen für Advertisement Monitors benutzt. Gemessen in
Millisekunden.

@item @code{adv-mon-no-filter-scan-duration} (Vorgabe: @code{500})
Dauer der Erkennungsphasen für ungefiltert alle Geräte bei verzahnten Arten
der Erkennungsphase („Interleaving Scan“). Wird nur bei Erkennungsphasen für
Advertisement Monitors benutzt. Gemessen in Millisekunden.

@item @code{enable-adv-mon-interleave-scan?} (Vorgabe: @code{#t})
Verzahnte Arten der Erkennungsphasen für Advertisement Monitors benutzen,
was beim Energiesparen hilft.

@item @code{cache} (Vorgabe: @code{'always})
GATT-Attribute-Zwischenspeicher.

Mögliche Werte sind:
@itemize @bullet
@item
@code{'always}: Immer Attribute zwischenspeichern, selbst von nicht
gekoppelten Geräten. So klappt die Zusammenarbeit mit Geräten am besten, die
Dauer für eine erneute Verbindung bleibt konsistent und man kann
Benachrichtigungen für alle Geräte nachvollziehen.

@item
@code{'yes}: Nur für gekoppelte Geräte deren Attribute speichern.

@item
@code{'no}: Niemals Attribute zwischenspeichern.
@end itemize

@item @code{key-size} (Vorgabe: @code{0})
Kleinste von diesem Gerät eingeforderte Schlüsselgröße („Encryption Key
Size“), um auf die gesicherten Charakteristika zuzugreifen.

Mögliche Werte sind:
@itemize @bullet
@item
@code{0}: Keine Anforderungen.

@item
@code{7 <= N <= 16}
@end itemize

@item @code{exchange-mtu} (Vorgabe: @code{517})
Wie groß die „Exchange MTU“ für GATT sein soll. Mögliche Werte sind:

@itemize @bullet
@item
@code{23 <= N <= 517}
@end itemize

@item @code{att-channels} (Vorgabe: @code{3})
Anzahl der ATT-Kanäle. Mögliche Werte sind:

@itemize @bullet
@item
@code{1}: EATT ist deaktiviert.

@item
@code{2 <= N <= 5}
@end itemize

@item @code{session-mode} (Vorgabe: @code{'basic})
Für AVDTP der Modus des L2CAP-Signaling-Kanals.

Mögliche Werte sind:

@itemize @bullet
@item
@code{'basic}: L2CAP Basic Mode benutzen.

@item
@code{'ertm}: L2CAP Enhanced Retransmission Mode benutzen.
@end itemize

@item @code{stream-mode} (Vorgabe: @code{'basic})
Für AVDTP der Modus des L2CAP Transport Channel.

Mögliche Werte sind:

@itemize @bullet
@item
@code{'basic}: L2CAP Basic Mode benutzen.

@item
@code{'streaming}: L2CAP Streaming Mode benutzen.
@end itemize

@item @code{reconnect-uuids} (Vorgabe: @code{'()})
Als die ReconnectUUIDs definieren Sie diejenigen Dienste entfernter Geräte,
mit denen eine neue Verbindung aufgebaut werden soll, wenn die Verbindung
abreißt (durch „link supervision timeout“, d.h.@: die Zeitbegrenzung, ab der
eine inaktive Verbindung als getrennt gilt). Im Policy-Plugin sollte eine
vernünftige Voreinstellung zu finden sein. Die Liste hier hat Vorrang. Wenn
Sie die leere Liste angeben, werden Verbindungen @emph{nicht} neu aufgebaut.

Mögliche Werte sind:

@itemize @bullet
@item
@code{'()}

@item
@code{(list (uuid <uuid-1>) (uuid <uuid-2>) …)}.
@end itemize

@item @code{reconnect-attempts} (Vorgabe: @code{7})
Wie oft bei einem Verbindungsverlust versucht werden soll, eine neue
Verbindung aufzubauen. Für den Wert 0 wird Neuverbinden deaktiviert.

@item @code{reconnect-intervals} (Vorgabe: @code{'(1 2 4 8 16 32 64)})
Definiert eine Liste von Zeitintervallen in Sekunden, wie lange nach jedem
Versuch gewartet wird. Wenn die in @var{reconnect-attempts} festgelegte
Anzahl Versuche größer ist als die Liste der Zeitintervalle lang ist, wird
das letzte Intervall wiederholt, bis alle Versuche ausgeschöpft sind.

@item @code{auto-enable?} (Vorgabe: @code{#f})
Ob alle erkannten Controller sofort aktiviert werden sollen. Dazu zählen
Adapter, die beim Hochfahren schon verfügbar sind, wie auch Adapter, die
später erst eingesteckt werden.

@item @code{resume-delay} (Vorgabe: @code{2})
Audio-Geräte, die durch einen Ruhezustand getrennt wurden, werden beim
Aufwecken neu verbunden. Mit @var{resume-delay} wird festgelegt, wie lange
nach dem Aufwecken des Controllers mit einem Neuverbindungsversuch gewartet
wird. Wenn mit der Neuverbindung länger gewartet wird, gibt es weniger
Probleme mit gleichzeitig genutztem WLAN. Der Wert wird in Sekunden
angegeben.

@item @code{rssi-sampling-period} (Vorgabe: @code{#xFF})
Voreinstellung für die RSSI-Abtastperiode. Sie wird benutzt, wenn ein Client
einen Advertisement Monitor registriert und die RSSISamplingPeriod
@emph{nicht} vorgibt.

Mögliche Werte sind:
@itemize @bullet
@item
@code{#x0}: Alle Mitteilungen melden.

@item
@code{N = #xXX}: Mitteilungen alle N x 100 msec melden (aus dem Bereich:
#x01 to #xFE)

@item
@code{#xFF}: In der Beobachtungsphase nur eine Mitteilung pro Gerät melden.
@end itemize

@end table
@end deftp

@defvar gnome-keyring-service-type
Dies ist der Typ des Dienstes, der den
@uref{https://wiki.gnome.org/Projects/GnomeKeyring, GNOME-Schlüsselbund}
bereitstellt. Sein Wert ist ein @code{gnome-keyring-configuration}-Objekt
(siehe unten). Wir weisen darauf hin, dass Sie diesen Dienst @emph{nicht}
benutzen müssen, wenn Sie @code{gnome-desktop-service-type} benutzen, was
ihn einbindet.

Dieser Dienst fügt das @code{gnome-keyring}-Paket zum Systemprofil hinzu und
erweitert PAM um Einträge zur Nutzung von @code{pam_gnome_keyring.so},
wodurch der Schlüsselbund von Nutzern entsperrt wird, wenn sie sich
anmelden, und passwd auch das Passwort des Schlüsselbunds festlegt.
@end defvar

@deftp {Datentyp} gnome-keyring-configuration
Verbundsobjekt für die Konfiguration des GNOME-Schlüsselbunddienstes.

@table @asis
@item @code{keyring} (Vorgabe: @code{gnome-keyring})
Welches GNOME-Schlüsselbund-Paket benutzt werden soll.

@item @code{pam-services}
Eine Liste von Paaren aus @code{(@var{Dienst} . @var{Typ})}, die zu
erweiternde PAM-Dienste bezeichnen. Dabei steht @var{Dienst} für den Namen
eines bestehenden Dienstes, der erweitert werden soll, und als @var{Typ}
kann @code{login} oder @code{passwd} angegeben werden.

Wenn @code{login} angegeben wird, wird ein optionales
@code{pam_gnome_keyring.so} zum Auth-Block ohne Argumente und zum
Session-Block mit @code{auto_start} hinzugefügt. Wenn @code{passwd}
angegeben wird, wird ein optionales @code{pam_gnome_keyring.so} zum
Password-Block ohne Argumente hinzugefügt.

Der vorgegebene Inhalt ist „gdm-password“ mit dem Wert @code{login} und
„passwd“ mit dem Wert @code{passwd}.
@end table
@end deftp

@defvar kwallet-service-type
This is the type of the service that adds the
@uref{https://invent.kde.org/plasma/kwallet-pam, KWallet keyring}.  Its
value is a @code{kwallet-configuration} object (see below).  Note that,
contrary to @code{gnome-desktop-service-type}, which includes the respective
keyring for that service, @code{gnome-keyring-service-type},
@code{plasma-desktop-service-type} does not include
@code{kwallet-service-type}.

This service adds the @code{kwallet-pam} package to the system profile and
extends PAM with entries using @code{pam_kwallet5.so}.  It can unlock the
user's login keyring or set their password with @command{passwd} at the time
they log in.
@end defvar

@deftp {Data Type} kwallet-configuration
Verbundsobjekt für die Konfiguration des KWallet-Schlüsselbunddienstes.

@table @asis
@item @code{keyring} (default: @code{kwallet-pam})
Welches KWallet-Schlüsselbund-Paket benutzt werden soll.

@item @code{pam-services}
Eine Liste von Paaren aus @code{(@var{Dienst} . @var{Typ})}, die zu
erweiternde PAM-Dienste bezeichnen. Dabei steht @var{Dienst} für den Namen
eines bestehenden Dienstes, der erweitert werden soll, und als @var{Typ}
kann eines der Symbole @code{login} oder @code{passwd} angegeben werden.

Wenn @code{login} angegeben wird, wird ein optionales @code{pam_kwallet5.so}
zum Auth-Block ohne Argumente und zum Session-Block mit @code{auto_start}
hinzugefügt. Wenn @code{passwd} angegeben wird, wird ein optionales
@code{pam_kwallet5.so} zum Password-Block ohne Argumente hinzugefügt.

By default, it takes for value an alist associating the @code{"sddm"} key
with the @code{'login} value, and the @code{"passwd"} key with the
@code{'passwd} value.
@end table
@end deftp

@defvar seatd-service-type
@uref{https://sr.ht/~kennylevinsen/seatd/, seatd} ist ein minimaler Daemon
zur Sitzungsverwaltung.

Sitzungsverwaltung bedeutet, dass der Zugriff auf gemeinsame Geräte (Grafik,
Eingabegeräte) vermittelt wird, ohne dass die Anwendungen, die zugreifen
wollen, Administratorrechte brauchen.

@lisp
(append
  (list
   ;; damit seatd läuft
   (service seatd-service-type))

  ;; normalerweise zusammen mit %base-services
  %base-services)

@end lisp

@code{seatd} funktioniert über einen Unix-Socket. Dabei stellt
@code{libseat} den clientseitigen Teil des Protokolls bereit. Wenn
Anwendungen über @code{seatd} Zugriff auf die gemeinsamen Ressourcen
brauchen (z.B.@: @code{sway}), dann müssen sie Zugriff auf diesen Socket
haben. Um das zu bewerkstelligen, kann man das Benutzerkonto, mit dem sie
laufen, zur Gruppe hinzufügen, der der Socket von @code{seatd} gehört (in
der Regel die Gruppe „seat“). Das geht so:

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

Je nachdem, wie Sie das System einrichten, müssen Sie nicht nur normale
Benutzer, sondern auch Systembenutzerkonten, zu dieser Gruppe
hinzufügen. Zum Beispiel verlangen manche greetd-Greeter, dass Grafik zur
Verfügung steht, also müssen auch diese Benutzerkonten das mit seatd
aushandeln können.

@end defvar

@deftp {Datentyp} seatd-configuration
Verbundsobjekt für die Konfiguration des seatd-Daemon-Dienstes.

@table @asis
@item @code{seatd} (Vorgabe: @code{seatd})
Das zu benutzende seatd-Paket.

@item @code{group} (Vorgabe: @samp{"seat"})
Die Gruppe, die den seatd-Socket besitzt.

@item @code{socket} (Vorgabe: @samp{"/run/seatd.sock"})
Wo der seatd-Socket erzeugt wird.

@item @code{logfile} (Vorgabe: @samp{"/var/log/seatd.log"})
In welche Protokolldatei geschrieben wird.

@item @code{loglevel} (Vorgabe: @samp{"error"})
Die Protokollierungsstufe, wie ausführlich die Ausgaben ins Protokoll
sind. Mögliche Werte: @samp{"silent"} (keine Ausgaben), @samp{"error"} (nur
Fehler), @samp{"info"} und @samp{"debug"} (zur Fehlersuche).

@end table
@end deftp


@node Tondienste
@subsection Tondienste

@cindex Sound-Unterstützung
@cindex ALSA
@cindex PulseAudio, Sound-Unterstützung

Das Modul @code{(gnu services sound)} stellt einen Dienst zur Verfügung, um
das Advanced-Linux-Sound-Architecture-System (ALSA) zu konfigurieren, so
dass PulseAudio als bevorzugter ALSA-Ausgabetreiber benutzt wird.

@defvar alsa-service-type
Dies ist der Typ des Dienstes für das als @uref{https://alsa-project.org/,
Advanced Linux Sound Architecture (ALSA)} bekannte System, das die
Konfigurationsdatei @file{/etc/asound.conf} erzeugt. Der Wert für diesen
Diensttyp ist ein @command{alsa-configuration}-Verbundsobjekt wie in diesem
Beispiel:

@lisp
(service alsa-service-type)
@end lisp

Siehe die folgenden Details zur @code{alsa-configuration}.
@end defvar

@deftp {Datentyp} alsa-configuration
Repräsentiert die Konfiguration für den Dienst @code{alsa-service}.

@table @asis
@item @code{alsa-plugins} (Vorgabe: @var{alsa-plugins})
@code{alsa-plugins}-Paket, was benutzt werden soll.

@item @code{pulseaudio?} (Vorgabe: @var{#t})
Ob ALSA-Anwendungen transparent den @uref{https://www.pulseaudio.org/,
PulseAudio-Audioserver} benutzen sollen.

Wenn PulseAudio benutzt wird, können Sie gleichzeitig mehrere Anwendungen
mit Tonausgabe ausführen und sie unter anderem mit @command{pavucontrol}
einzeln einstellen.

@item @code{extra-options} (Vorgabe: @var{""})
Die Zeichenkette, die an die Datei @file{/etc/asound.conf} angehängt werden
soll.

@end table
@end deftp

Wenn einzelne Benutzer von ALSAs Systemkonfiguration abweichende
Einstellungen vornehmen möchten, können Sie das mit der Konfigurationsdatei
@file{~/.asoundrc} tun:

@example
# In Guix müssen wir den absoluten Pfad von Plugins angeben.
pcm_type.jack @{
  lib "/home/alice/.guix-profile/lib/alsa-lib/libasound_module_pcm_jack.so"
@}

# ALSA an jack weiterleiten:
# <http://jackaudio.org/faq/routing_alsa.html>.
pcm.rawjack @{
  type jack
  playback_ports @{
    0 system:playback_1
    1 system:playback_2
  @}

  capture_ports @{
    0 system:capture_1
    1 system:capture_2
  @}
@}

pcm.!default @{
  type plug
  slave @{
    pcm "rawjack"
  @}
@}
@end example

Siehe @uref{https://www.alsa-project.org/main/index.php/Asoundrc} für die
Details.

@defvar pulseaudio-service-type
Dies ist der Diensttyp für den @url{https://www.pulseaudio.org/,
PulseAudio-Soundserver}. Mit ihm können die Voreinstellungen systemweit
abgeändert werden. Dazu benutzen Sie eine @code{pulseaudio-configuration},
siehe unten.

@quotation Warnung
This service overrides per-user configuration files.  If you want PulseAudio
to honor configuration files in @file{~/.config/pulse}, you have to unset
the environment variables @env{PULSE_CONFIG} and @env{PULSE_CLIENTCONFIG} in
your @file{~/.bash_profile}.
@end quotation

@quotation Warnung
Dieser Dienst sorgt alleine noch nicht dafür, dass auf ihrer Maschine das
@code{pulseaudio}-Paket vorliegt. Er fügt bloß Konfigurationsdateien dafür
hinzu, wie im Folgenden beschrieben. Für den (zugegebenermaßen
unwahrscheinlichen) Fall, dass Ihnen ein @code{pulseaudio}-Paket fehlt,
möchten Sie es vielleicht durch den oben genannten @code{alsa-service-type}
aktivieren.
@end quotation
@end defvar

@deftp {Datentyp} pulseaudio-configuration
Repräsentiert die Konfiguration für den Dienst @code{pulseaudio-service}.

@table @asis
@item @code{client-conf} (Vorgabe: @code{'()})
Eine Liste der Einstellungen, die in @file{client.conf} vorgenommen
werden. Hierfür wird eine Liste von entweder Zeichenketten oder
Symbol-Wert-Paaren akzeptiert. Eine Zeichenkette wird so, wie sie ist,
eingefügt, mit einem Zeilenumbruch danach. Ein Paar wird als „Schlüssel =
Wert“ formatiert, auch hier gefolgt von einem Zeilenumbruch.

@item @code{daemon-conf} (Vorgabe: @code{'((flat-volumes . no))})
Eine Liste der Einstellungen, die in @file{daemon.conf} vorgenommen werden,
im gleichen Format wie @var{client-conf}.

@item @code{script-file} (Vorgabe: @code{(file-append pulseaudio "/etc/pulse/default.pa")})
Eine Datei mit dem als @file{default.pa} zu nutzenden Skript. Wenn Sie das
Feld @code{extra-script-files} von weiter unten benutzen, wird ans Ende des
angegebenen Skripts eine @code{.include}-Direktive angehängt, die auf
@file{/etc/pulse/default.pa.d} zeigt.

@item @code{extra-script-files} (Vorgabe: @code{'()})
Eine Liste dateiartiger Objekte, die zusätzliche PulseAudio-Skripte
definieren, die bei der Initialisierung des @command{pulseaudio}-Daemons
ausgeführt werden, nachdem das Hauptskript aus @code{script-file}
durchgelaufen ist. Die Skripte werden im Verzeichnis
@file{/etc/pulse/default.pa.d} abgelegt und sollten als
Dateinamenserweiterung ebenso @samp{.pa} haben. Eine Referenz der
verfügbaren Befehle bekommen Sie durch Ausführen von @command{man
pulse-cli-syntax}.

@item @code{system-script-file} (Vorgabe: @code{(file-append pulseaudio "/etc/pulse/system.pa")})
Welche Skriptdatei als @file{system.pa} verwendet werden soll.
@end table

Im folgenden Beispiel werden das Standard-PulseAudio-Kartenprofil, das
Standard-Ziel und die Standard-Quelle für eine alte
SoundBlaster-Audigy-Soundkarte eingerichtet:
@lisp
(pulseaudio-configuration
 (extra-script-files
  (list (plain-file "audigy.pa"
                    (string-append "\
set-card-profile alsa_card.pci-0000_01_01.0 \
  output:analog-surround-40+input:analog-mono
set-default-source alsa_input.pci-0000_01_01.0.analog-mono
set-default-sink alsa_output.pci-0000_01_01.0.analog-surround-40\n")))))
@end lisp

Wir merken an, dass @code{pulseaudio-service-type} zu
@code{%desktop-services} dazugehört. Wenn Ihre Betriebssystemdeklaration
also von einer der „Desktop“-Vorlagen abstammt, dann werden Sie das obige
Beispiel anpassen wollen, damit stattdessen der in @code{%desktop-services}
bestehende @code{pulseaudio-service-type}-Dienst modifiziert wird mit
@code{modify-services} (siehe @ref{Service-Referenz,
@code{modify-services}}) und kein neuer Dienst angelegt wird.

@end deftp

@defvar ladspa-service-type
This service sets the @var{LADSPA_PATH} variable, so that programs, which
respect it, e.g.@: PulseAudio, can load LADSPA plugins.

Das folgende Beispiel wird den Dienst so einrichten, dass Module aus dem
@code{swh-plugins}-Paket aktiviert werden:

@lisp
(service ladspa-service-type
         (ladspa-configuration (plugins (list swh-plugins))))
@end lisp

Siehe @uref{http://plugin.org.uk/ladspa-swh/docs/ladspa-swh.html} für die
Details.

@end defvar

@subsubheading Speaker Safety Daemon System Service

@uref{https://github.com/AsahiLinux/speakersafetyd, Speaker Safety Daemon}
is a user-space daemon that implements an analogue of the Texas Instruments
Smart Amp speaker protection model.  It can be used to protect the speakers
on Apple Silicon devices.

@defvar speakersafetyd-service-type
This is the type for the @code{speakersafetyd} system service, whose value
is a @command{speakersafetyd-configuration} record.

@lisp
(service speakersafetyd-service-type)
@end lisp

See below for details about @code{speakersafetyd-configuration}.
@end defvar

@c %start of fragment
@deftp {Data Type} speakersafetyd-configuration
Available @code{speakersafetyd-configuration} fields are:

@table @asis
@item @code{blackbox-directory} (default: @code{"/var/lib/speakersafetyd/blackbox"}) (type: string)
The directory to which blackbox files are written when the speakers are
getting too hot.  The blackbox files contain audio and debug information
which the developers of @code{speakersafetyd} might ask for when reporting
bugs.

@item @code{configuration-directory} (type: file-like)
The base directory as a G-expression (@pxref{G-Ausdrücke}) that contains
the configuration files of the speaker models.

@item @code{group} (default: @code{"speakersafetyd"}) (type: string)
The group to run the Speaker Safety Daemon as.

@item @code{log-file} (default: @code{"/var/log/speakersafetyd.log"}) (type: string)
The file name to the Speaker Safety Daemon log file.

@item @code{maximum-gain-reduction} (default: @code{7}) (type: integer)
Maximum gain reduction before panicking, useful for debugging.

@item @code{speakersafetyd} (default: @code{speakersafetyd}) (type: file-like)
The Speaker Safety Daemon package to use.

@item @code{user} (default: @code{"speakersafetyd"}) (type: string)
The user to run the Speaker Safety Daemon as.

@end table
@end deftp
@c %end of fragment

@node Dateisuch-Dienste
@subsection Dateisuch-Dienste

@cindex Datei suchen
@cindex Suche nach einer Datei
Die Dienste in diesem Abschnitt tragen Informationen in eine
@dfn{Dateidatenbank} ein, mit deren Hilfe Dateien auf Ihrer Maschine schnell
gefunden werden können. Diese Dienste werden vom Modul @code{(gnu services
admin)} zur Verfügung gestellt.

Als Erstes gibt es @code{file-database-service-type}, wodurch regelmäßig der
altehrwürdige Befehl @command{updatedb} aufgerufen wird (siehe @ref{Invoking
updatedb,,, find, GNU Findutils}). Durch den Befehl werden Dateinamen in
einer Datenbank gesammelt, die mit dem Befehl @command{locate} durchsucht
werden kann (siehe @ref{Invoking locate,,, find, GNU Findutils}) wie im
Beispiel hier:

@example
locate wichtige-notizen.txt
@end example

Sie können diesen Dienst mit seinen Vorgabeeinstellungen aktivieren, indem
Sie folgendes Schnipsel zu den Diensten in Ihrer Betriebssystemkonfiguration
eintragen:

@lisp
(service file-database-service-type)
@end lisp

Dann wird die Datenbank einmal pro Woche aktualisiert; dabei werden Dateien
aus @file{/gnu/store} ignoriert@tie{}– solche sucht man besser mit
@command{guix locate} (siehe @ref{Aufruf von guix locate}). Es ist Ihnen
natürlich auch möglich, eine eigene Konfiguration wie unten beschrieben
anzugeben.

@defvar file-database-service-type
Der Diensttyp des Dateidatenbank-Dienstes, der regelmäßig @command{updatedb}
aufruft. Sein Wert muss ein
@code{file-database-configuration}-Verbundsobjekt sein, wie im Folgenden
beschrieben.
@end defvar

@deftp {Datentyp} file-database-configuration
Der Verbundsdatentyp, der die Konfiguration von
@code{file-database-service-type} repräsentiert, mit den folgenden Feldern:

@table @asis
@item @code{package} (Vorgabe: @code{findutils})
Das Paket, dessen Befehl @command{updatedb} verwendet werden soll. Beispiele
solcher Pakete sind GNU@tie{}Findutils und Plocate.

@item @code{schedule} (Vorgabe: @code{%default-file-database-update-schedule})
This is the schedule of database updates, expressed as a string in
traditional cron syntax or as a gexp evaluating to a Shepherd calendar event
(@pxref{Timers,,, shepherd, The GNU Shepherd Manual}).

@item @code{excluded-directories} (Vorgabe: @code{%default-file-database-excluded-directories})
Eine Liste, welche Verzeichnisse @emph{nicht} in die Dateidatenbank
eingetragen werden sollen, als reguläre Ausdrücke. Vorgegeben ist,
@file{/tmp} und @file{/gnu/store} zu ignorieren; @file{/gnu/store} macht man
besser durch @command{guix locate} suchbar (siehe @ref{Aufruf von guix locate}). Diese Liste wird über die Befehlszeilenoption
@option{--prunepaths} an @command{updatedb} übergeben (siehe @ref{Invoking
updatedb,,, find, GNU@tie{}Findutils}).
@end table
@end deftp

Der zweite Dienst @code{package-database-service-type} macht Einträge in die
Datenbank für @command{guix locate}, mit der Sie nach Paketen suchen können,
die die angegebene Datei enthalten (siehe @ref{Aufruf von guix locate}). Über
den Dienst wird eine systemweite Datenbank regelmäßig aktualisiert, die
jedem, der auf dem System @command{guix locate} aufruft, zur Verfügung
steht. Um diesen Dienst mit seinen Vorgabeeinstellungen zu aktivieren, fügen
Sie folgendes Schnipsel zu den Diensten in Ihrer Betriebssystemkonfiguration
hinzu:

@lisp
(service package-database-service-type)
@end lisp

Dadurch wird @command{guix locate --update} einmal die Woche aufgerufen.

@defvar package-database-service-type
Dies ist der Diensttyp für regelmäßige Aktualisierungen von @command{guix
locate} (siehe @ref{Aufruf von guix locate}). Sein Wert muss ein
@code{package-database-configuration}-Verbundsobjekt sein, wie im Folgenden
gezeigt.
@end defvar

@deftp {Datentyp} package-database-configuration
Der Datentyp, um die regelmäßige Aktualisierung der Datenbank mit
Paketinformationen einzustellen. Er hat die folgenden Felder:

@table @asis
@item @code{package} (Vorgabe: @code{guix})
Das zu verwendende Guix-Paket.

@item @code{schedule} (Vorgabe: @code{%default-package-database-update-schedule})
This is the schedule of the periodic @command{guix locate --update} job,
expressed as a string in traditional cron syntax or as a gexp evaluating to
a Shepherd calendar event (@pxref{Timers,,, shepherd, The GNU Shepherd
Manual}).

@item @code{method} (Vorgabe: @code{'store})
Nach welcher Methode ausgewählt werden soll, welche Pakete in den Index
aufgenommn werden. Beim Vorgabewert @code{'store} wird eine eher
vollständige Datenbank unter größerer Auslastung von Prozessor und Ein- und
Ausgaben angelegt.

@item @code{channels} (Vorgabe: @code{#~%default-channels})
Ein G-Ausdruck, welche Kanäle beim Aktualisieren der Datenbank benutzt
werden sollen (siehe @ref{Kanäle}).
@end table
@end deftp


@node Datenbankdienste
@subsection Datenbankdienste

@cindex Datenbank
@cindex SQL
Das Modul @code{(gnu services databases)} stellt die folgenden Dienste zur
Verfügung.

@subsubheading PostgreSQL

@defvar postgresql-service-type
Der Diensttyp für den PostgreSQL-Datenbankserver. Sein Wert muss ein
gültiges @code{postgresql-configuration}-Objekt sein, wie unten
beschrieben. Das folgende Beispiel zeigt einen PostgreSQL-Dienst in seiner
Vorgabekonfiguration.

@lisp
(service postgresql-service-type
         (postgresql-configuration
          (postgresql postgresql)))
@end lisp

Wenn diese Dienste nicht starten können, ist vielleicht bereits ein
inkompatibler Datenbankverbund („Cluster“) in @var{data-directory}
vorhanden. Ändern Sie dann den Wert dafür (oder falls Sie den Verbund nicht
mehr brauchen, löschen Sie @var{data-directory} einfach) und starten Sie den
Dienst neu.

Nach Voreinstellung müssen sich normale Benutzerkonten des Guix-Systems, die
mit PostgreSQL kommunizieren, sogenannte „Peers“, zunächst
authentifizieren. Allerdings ist für das @code{postgres}-Benutzerkonto keine
Shell eingestellt (außer @code{allow-login?} ist @code{#t}), wodurch keine
@code{psql}-Befehle durch diesen Benutzer ausgeführt werden können. Um
@code{psql} benutzen zu können, können Sie sich vorläufig als der
@code{postgres}-Nutzer unter Angabe einer Shell anmelden, ein Konto für
einen PostgreSQL-Administrator (einen „Superuser“) mit demselben Namen wie
einer der Benutzer des Systems einrichten und dann die zugehörige Datenbank
erstellen.

@example
sudo -u postgres -s /bin/sh
createuser --interactive
createdb $BENUTZER_ANMELDENAME  # muss angepasst werden
@end example
@end defvar

@deftp {Datentyp} postgresql-configuration
Der Datentyp repräsentiert die Konfiguration für den
@code{postgresql-service-type}.

@table @asis
@item @code{postgresql}
Das PostgreSQL-Paket, was für diesen Dienst benutzt werden soll.

@item @code{port} (Vorgabe: @code{5432})
Der Port, auf dem PostgreSQL lauschen soll.

@item @code{locale} (Vorgabe: @code{"en_US.utf8"})
Welche Regions- und Spracheinstellung („Locale“) beim Erstellen des
Datenbankverbunds voreingestellt werden soll.

@item @code{config-file} (Vorgabe: @code{(postgresql-config-file)})
Aus welcher Konfigurationsdatei die Laufzeitkonfiguration von PostgreSQL
geladen werden soll. Vorgegeben ist, die Einstellungen aus einem
postgresql-config-file-Verbundsobjekt mit Vorgabewerten zu nehmen.

@item @code{log-directory} (Vorgabe: @code{"/var/log/postgresql"})
In welchem Verzeichnis die Ausgabe von @command{pg_ctl} in eine Datei namens
@code{"pg_ctl.log"} geschrieben wird. Diese Datei kann zum Beispiel dabei
helfen, Fehler in der Konfiguration von PostgreSQL zu finden.

@item @code{data-directory} (Vorgabe: @code{"/var/lib/postgresql/data"})
Das Verzeichnis, in dem die Daten gespeichert werden sollen.

@item @code{extension-packages} (Vorgabe: @code{'()})
@cindex PostgreSQL-Erweiterungspakete
Zusätzliche Erweiterungen werden aus den unter @var{extension-packages}
aufgeführten Paketen geladen. Erweiterungen sind zur Laufzeit verfügbar. Zum
Beispiel kann ein Nutzer den postgresql-service-Dienst wie in diesem
Beispiel konfigurieren, um eine geografische Datenbank mit Hilfe der
@code{postgis}-Erweiterung zu erzeugen:

@cindex postgis
@lisp
(use-package-modules databases geo)

(operating-system
  ...
  ;; postgresql is required to run `psql' but postgis is not required for
  ;; proper operation.
  (packages (cons* postgresql %base-packages))
  (services
    (cons*
      (service postgresql-service-type
               (postgresql-configuration
                (postgresql postgresql)
                (extension-packages (list postgis))))
      %base-services)))
@end lisp

Dann wird die Erweiterung sichtbar und Sie können eine leere geografische
Datenbak auf diese Weise initialisieren:

@example
psql -U postgres
> create database postgistest;
> \connect postgistest;
> create extension postgis;
> create extension postgis_topology;
@end example

Es ist nicht notwendig, dieses Feld für contrib-Erweiterungen wie hstore
oder dblink hinzuzufügen, weil sie bereits durch postgresql geladen werden
können. Dieses Feld wird nur benötigt, um Erweiterungen hinzuzufügen, die
von anderen Paketen zur Verfügung gestellt werden.

@item @code{create-account?} (Vorgabe: @code{#t})
Ob ein Benutzer und eine Benutzergruppe @code{postgres} angelegt werden
soll.

@item @code{allow-login?} (default: @code{#f})
Whether or not to allow login into the created account.

@item @code{home-directory} (default: @code{"/var/empty"})
The home directory of the user.  It is strongly advised to change this if
you set @code{allow-login?} to @code{#t}.

@item @code{uid} (Vorgabe: @code{#f})
Hier kann der Benutzeridentifikator (UID) für das Benutzerkonto des
@code{postgres}-Daemons ausdrücklich angegeben werden. Das brauchen Sie
normalerweise nicht, weil automatisch eine freie UID zugewiesen wird.

Eine Situation, in der die Option doch hilfreich sein kann, ist, wenn
@var{data-directory} auf einer Netzwerkfreigabe liegt, die eingebunden wird.

@item @code{gid} (Vorgabe: @code{#f})
Hier kann der Gruppenidentifikator (GID) für die Benutzergruppe des
@code{postgres}-Daemons ausdrücklich angegeben werden.

@end table
@end deftp

@deftp {Datentyp} postgresql-config-file
Der Datentyp, der die Konfigurationsdatei von PostgreSQL repräsentiert. Wie
im folgenden Beispiel gezeigt, kann er benutzt werden, um die Konfiguration
von PostgreSQL anzupassen. Es sei darauf hingewiesen, dass Sie jeden
beliebigen G-Ausdruck oder Dateinamen anstelle dieses Verbunds angeben
können, etwa wenn Sie lieber eine bestehende Konfigurationsdatei benutzen
möchten.

@lisp
(service postgresql-service-type
         (postgresql-configuration
          (config-file
           (postgresql-config-file
            (log-destination "stderr")
            (hba-file
             (plain-file "pg_hba.conf"
                         "
local	all	all			trust
host	all	all	127.0.0.1/32 	md5
host	all	all	::1/128 	md5"))
            (extra-config
             '(("session_preload_libraries"     "auto_explain")
               ("random_page_cost"              2)
               ("auto_explain.log_min_duration" "100 ms")
               ("work_mem"                      "500 MB")
               ("logging_collector"             #t)
               ("log_directory"                 "/var/log/postgresql")))))))
@end lisp

@table @asis
@item @code{log-destination} (Vorgabe: @code{"syslog"})
Welche Protokollierungsmethode für PostgreSQL benutzt werden soll. Hier
können mehrere Werte kommagetrennt angegeben werden.

@item @code{hba-file} (Vorgabe: @code{%default-postgres-hba})
Ein Dateiname oder G-Ausdruck für die Konfiguration der Authentifizierung
durch den Server („Host-based Authentication“).

@item @code{ident-file} (Vorgabe: @code{%default-postgres-ident})
Ein Dateiname oder G-Ausdruck für die Konfiguration der
Benutzernamensabbildung („User name mapping“).

@item @code{socket-directory} (Vorgabe: @code{"/var/run/postgresql"})
Gibt an, in welchem Verzeichnis der oder die Unix-Socket(s) zu finden sind,
auf denen PostgreSQL auf Verbindungen von Client-Anwendungen lauscht. Ist
dies auf @code{""} gesetzt, so lauscht PostgreSQL auf gar keinem
Unix-Socket, so dass Verbindungen zum Server nur mit TCP/IP-Sockets
aufgebaut werden können.

Der Vorgabewert @code{#false} bedeutet, dass der voreingestellte Wert von
PostgreSQL benutzt wird. Derzeit ist die Voreinstellung @samp{/tmp}.

@item @code{extra-config} (Vorgabe: @code{'()})
Eine Liste zusätzlicher Schlüssel-Wert-Kombinationen, die in die
PostgreSQL-Konfigurationsdatei aufgenommen werden sollen. Jeder Eintrag in
der Liste muss eine Liste von Listen sein, deren erstes Element dem
Schlüssel entspricht und deren übrige Elemente die Werte angeben.

Als Werte können Zahlen, Boolesche Ausdrücke oder Zeichenketten dienen. Sie
werden auf die Parametertypen von PostgreSQL, @code{Boolean}, @code{String},
@code{Numeric}, @code{Numeric with Unit} und @code{Enumerated}, abgebildet,
die @uref{https://www.postgresql.org/docs/current/config-setting.html, hier}
beschrieben werden.

@end table
@end deftp

@defvar postgresql-role-service-type
Mit diesem Dienst können PostgreSQL-Rollen und -Datenbanken erzeugt werden,
nachdem der PostgreSQL-Dienst gestartet worden ist. Hier ist ein Beispiel,
wie man ihn benutzt.

@lisp
(service postgresql-role-service-type
            (postgresql-role-configuration
             (roles
              (list (postgresql-role
                     (name "test")
                     (create-database? #t))))))
@end lisp

Dieser Dienst kann mit weiteren Rollen erweitert werden, wie in diesem
Beispiel:

@lisp
(service-extension postgresql-role-service-type
                   (const (list
                           (postgresql-role
                            (name "alice")
                            (create-database? #t)))))
@end lisp
@end defvar

@deftp {Datentyp} postgresql-role
PostgreSQL verwaltet Zugriffsrechte auf Datenbanken mit dem
Rollenkonzept. Eine Rolle kann als entweder ein Datenbanknutzer oder eine
Gruppe von Datenbanknutzern verstanden werden, je nachdem, wie die Rolle
eingerichtet wurde. Rollen können Eigentümer von Datenbankobjekten sein (zum
Beispiel von Tabellen) und sie können anderen Rollen Berechtigungen auf
diese Objekte zuweisen oder steuern, wer auf welche Objekte Zugriff hat.

@table @asis
@item @code{name}
Der Rollenname.

@item @code{permissions} (Vorgabe: @code{'(createdb login)})
Die Liste der Berechtigungen der Rolle. Unterstützte Berechtigungen sind
@code{bypassrls}, @code{createdb}, @code{createrole}, @code{login},
@code{replication} und @code{superuser}.

@item @code{create-database?} (Vorgabe: @code{#f})
Ob eine Datenbank mit demselben Namen wie die Rolle erzeugt werden soll.

@item @code{password-file} (Vorgabe: @code{#f})
A string representing the path of a file that contains the password to be
set for the role.

@item @code{encoding} (Vorgabe: @code{"UTF8"})
Mit welchem Zeichensatz in der Datenbank Text gespeichert wird.

@item @code{collation} (Vorgabe: @code{"en_US.utf8"})
Nach welcher Reihenfolge Zeichenketten in der Locale sortiert werden.

@item @code{ctype} (Vorgabe: @code{"en_US.utf8"})
Nach welchen Vorgaben Zeichen in der Locale klassifiziert werden.

@item @code{template} (Vorgabe: @code{"template1"})
Welche Vorlage nach Voreinstellung kopiert wird, wenn neue Datenbanken
angelegt werden. Benutzen Sie @code{"template0"} für eine unveränderte
Datenbank ohne systemeigene Anpassungen.

@end table
@end deftp

@deftp {Datentyp} postgresql-role-configuration
Der Datentyp, der die Konfiguration des @var{postgresql-role-service-type}
repräsentiert.

@table @asis
@item @code{host} (Vorgabe: @code{"/var/run/postgresql"})
Mit welchem PostgreSQL-Host eine Verbindung hergestellt werden soll.

@item @code{log} (Vorgabe: @code{"/var/log/postgresql_roles.log"})
Der Dateiname der Protokolldatei.

@item @code{shepherd-requirement} (Vorgabe: @code{'(user-processes postgres)})

The Shepherd services dependencies to use.  Add extra dependencies to
@code{%default-postgresql-role-shepherd-requirement} to extend its value.

@item @code{roles} (Vorgabe: @code{'()})
Welche PostgreSQL-Rollen von Anfang an erzeugt werden sollen.
@end table
@end deftp

@subsubheading MariaDB/MySQL

@defvar mysql-service-type
Dies ist der Diensttyp für einen Datenbankserver zu MySQL oder
MariaDB@. Sein Wert ist ein @code{mysql-configuration}-Objekt, das das zu
nutzende Paket sowie verschiedene Einstellungen für den
@command{mysqld}-Daemon festlegt.
@end defvar

@deftp {Datentyp} mysql-configuration
Der Datentyp, der die Konfiguration des @var{mysql-service-type}
repräsentiert.

@table @asis
@item @code{mysql} (Vorgabe: @var{mariadb})
Das Paketobjekt des MySQL-Datenbankservers; es kann entweder @var{mariadb}
oder @var{mysql} sein.

Für MySQL wird bei der Aktivierung des Dienstes ein temporäres
Administratorpasswort („root“-Passwort) angezeigt. Für MariaDB ist das
„root“-Passwort leer.

@item @code{bind-address} (Vorgabe: @code{"127.0.0.1"})
Auf welcher IP-Adresse auf Verbindungen gelauscht wird. Benutzen Sie
@code{"0.0.0.0"}, wenn sich der Server an alle verfügbaren
Netzwerkschnittstellen binden soll.

@item @code{port} (Vorgabe: @code{3306})
Der TCP-Port, auf dem der Datenbankserver auf eingehende Verbindungen
lauscht.

@item @code{socket} (Vorgabe: @code{"/run/mysqld/mysqld.sock"})
Welche Socket-Datei für lokale Verbindungen (die also nicht über ein
Netzwerk laufen) benutzt wird.

@item @code{extra-content} (Vorgabe: @code{""})
Weitere Einstellungen für die Konfigurationsdatei @file{my.cnf}.

@item @code{extra-environment} (Vorgabe: @code{#~'()})
Welche Liste von Umgebungsvariablen dem @command{mysqld}-Prozess mitgegeben
wird.

@item @code{auto-upgrade?} (Vorgabe: @code{#t})
Ob nach dem Starten des Dienstes @command{mysql_upgrade} automatisch
ausgeführt werden soll. Das ist nötig, um das @dfn{Systemschema} nach
„großen“ Aktualisierungen auf den neuen Stand zu bringen (etwa beim Umstieg
von MariaDB 10.4 auf 10.5), aber Sie können es abschalten, wenn Sie das
lieber manuell vornehmen.

@end table
@end deftp

@subsubheading Memcached

@defvar memcached-service-type
Dies ist der Diensttyp für den @uref{https://memcached.org/,
Memcached-Dienst}, der einen verteilten Zwischenspeicher im Arbeitsspeicher
(einen „In-Memory-Cache“) zur Verfügung stellt. Der Wert dieses Dienstes ist
ein @code{memcached-configuration}-Objekt.
@end defvar

@lisp
(service memcached-service-type)
@end lisp

@deftp {Datentyp} memcached-configuration
Der Datentyp, der die Konfiguration von memcached repräsentiert.

@table @asis
@item @code{memcached} (Vorgabe: @code{memcached})
Das Memcached-Paket, das benutzt werden soll.

@item @code{interfaces} (Vorgabe: @code{'("0.0.0.0")})
Auf welchen Netzwerkschnittstellen gelauscht werden soll.

@item @code{tcp-port} (Vorgabe: @code{11211})
Der Port, auf dem Verbindungen akzeptiert werden.

@item @code{udp-port} (Vorgabe: @code{11211})
Der Port, auf dem UDP-Verbindungen akzeptiert werden. Ist der Wert 0, wird
@emph{nicht} auf einem UDP-Socket gelauscht.

@item @code{additional-options} (Vorgabe: @code{'()})
Zusätzliche Befehlszeilenoptionen, die an @code{memcached} übergeben werden.
@end table
@end deftp

@subsubheading Redis

@uref{https://redis.io/, Redis} is an in-memory data store used by millions
of developers as a cache, vector database, document database, streaming
engine, and message broker. Redis has built-in replication and different
levels of on-disk persistence. It supports complex data types (for example,
strings, hashes, lists, sets, sorted sets, and JSON), with atomic operations
defined on those data types.

@defvar redis-service-type
Type of the service that runs @command{redis}, an in-memory data store.  The
value for this service is a @code{<redis-configuration>} object.
@end defvar

@c %start of fragment

@deftp {Datentyp} redis-configuration
Available @code{redis-configuration} fields are:

@table @asis
@item @code{redis} (default: @code{redis}) (type: package)
Das zu benutzende Redis-Paket.

@item @code{bind} (default: @code{"127.0.0.1"}) (type: string)
Die Netzwerkschnittstelle, auf der gelauscht wird.

@item @code{port} (default: @code{6379}) (type: number)
Der Port, auf dem Verbindungen akzeptiert werden. Ist der Wert 0, wird das
Lauschen auf einem TCP-Socket deaktiviert.

@item @code{working-directory} (default: @code{"/var/lib/redis"}) (type: string)
Das Verzeichnis, in dem die Datenbank und damit zu tun habende Dateien
gespeichert werden.

@item @code{config-file} (type: maybe-string)
Default location for config file.

@end table

@end deftp


@c %end of fragment

@node Mail-Dienste
@subsection Mail-Dienste

@cindex Mail
@cindex email
Das Modul @code{(gnu services mail)} stellt Guix-Dienstdefinitionen für
E-Mail-Dienste zur Verfügung: IMAP-, POP3- und LMTP-Server sowie Mail
Transport Agents (MTAs). Jede Menge Akronyme! Auf diese Dienste wird in den
folgenden Unterabschnitten im Detail eingegangen.

@subsubheading Dovecot-Dienst

@defvar dovecot-service-type
Diensttyp für einen Dienst, der den IMAP-/POP3-/LMTP-Mailserver Dovecot
ausführt. Sein Wert ist ein @code{<dovecot-configuration>}-Objekt.
@end defvar

Normalerweise muss für Dovecot nicht viel eingestellt werden; das
vorgegebene Konfigurationsobjekt, das mit @code{(dovecot-configuration)}
erzeugt wird, wird genügen, wenn Ihre Mails in @code{~/Maildir} gespeichert
werden. Ein selbstsigniertes Zertifikat wird für durch TLS geschützte
Verbindungen generiert, aber Dovecot lauscht nach Vorgabe auch auf
unverschlüsselten Ports. Es gibt jedoch eine Reihe von Optionen, die
Mail-Administratoren unter Umständen ändern müssen, was Guix@tie{}– wie auch
bei anderen Diensten@tie{}– mit einer einheitlichen Scheme-Schnittstelle
möglich macht.

Um zum Beispiel anzugeben, dass sich Mails in @code{maildir~/.mail}
befinden, würde man den Dovecot-Dienst wie folgt instanziieren:

@lisp
(service dovecot-service-type
         (dovecot-configuration
           (mail-location "maildir:~/.mail")))
@end lisp

Im Folgenden sehen Sie die verfügbaren Konfigurationsparameter. Jeder
Parameterdefinition ist ihr Typ vorangestellt; zum Beispiel bedeutet
@samp{Zeichenketten-Liste foo}, dass der Parameter @code{foo} als eine Liste
von Zeichenketten angegeben werden sollte. Es ist auch möglich, die
Konfiguration als Zeichenkette anzugeben, wenn Sie eine alte
@code{dovecot.conf}-Datei haben, die Sie von einem anderen System übernehmen
möchten; am Ende finden Sie mehr Details dazu.

@c The following documentation was initially generated by
@c (generate-documentation) in (gnu services mail).  Manually maintained
@c documentation is better, so we shouldn't hesitate to edit below as
@c needed.  However if the change you want to make to this documentation
@c can be done in an automated way, it's probably easier to change
@c (generate-documentation) than to make it below and have to deal with
@c the churn as dovecot updates.

Verfügbare @code{dovecot-configuration}-Felder sind:

@deftypevr {@code{dovecot-configuration}-Parameter} „package“ dovecot
Das Dovecot-Paket.
@end deftypevr

@deftypevr {@code{dovecot-configuration} parameter} package-list extensions
A list of additional Dovecot plugin packages to make available at
runtime. During service activation, the @file{lib/dovecot} directory from
each specified package is combined with Dovecot's core modules into a
unified module directory.

For example, to enable Sieve filtering:

@lisp
(extensions (list dovecot-pigeonhole))
@end lisp

Each package in the list must provide its modules at @file{lib/dovecot}, as
this is where @code{make-dovecot-moduledir} expects to find its
extensions. The service combines these directories to create a unified
module structure.

The default value is an empty list, providing only core Dovecot
functionality.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Kommagetrennte-Zeichenketten-Liste listen
Eine Liste der IPs oder der Rechnernamen („Hosts“), auf denen auf
Verbindungen gelauscht wird. @samp{*} bedeutet, auf allen
IPv4-Schnittstellen zu lauschen; @samp{::} lässt auf allen
IPv6-Schnittstellen lauschen. Wenn Sie nicht der Vorgabe entsprechende Ports
oder komplexere Einstellungen festlegen möchten, sollten Sie die Adress- und
Portfelder des @samp{inet-listener} beim jeweiligen Dienst anpassen, für den
Sie sich interessieren.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} „protocol-configuration“-Liste protocols
Die Liste der Protokolle, die angeboten werden sollen. Zu den verfügbaren
Protokollen gehören @samp{imap}, @samp{pop3} und @samp{lmtp}.

Verfügbare @code{protocol-configuration}-Felder sind:

@deftypevr {@code{protocol-configuration}-Parameter} Zeichenkette name
Der Name des Protokolls.
@end deftypevr

@deftypevr {@code{protocol-configuration}-Parameter} Zeichenkette auth-socket-path
Der Pfad des UNIX-Sockets zum Hauptauthentifizierungsserver, um Benutzer zu
finden. Er wird von imap (für geteilte Benutzer) und lda benutzt. Die
Vorgabe ist @samp{"/var/run/dovecot/auth-userdb"}.
@end deftypevr

@deftypevr {@code{protocol-configuration}-Parameter} Boolescher-Ausdruck imap-metadata?
Ob die Erweiterung @code{IMAP METADATA}, definiert in
@uref{https://tools.ietf.org/html/rfc5464,RFC@tie{}5464}, aktiviert werden
soll, mit der Clients einem Postfach („Mailbox“) nutzereigene Metadaten und
Annotationen über IMAP zuweisen und sie abfragen können.

Wenn dies @samp{#t} ist, müssen Sie auch über das Feld
@code{mail-attribute-dict} das zu nutzende Dictionary (eine
Schlüssel-Wert-Datenbank) angeben.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{protocol-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste managesieve-notify-capabilities
Welche NOTIFY-Capabilitys an Clients gemeldet werden, die sich mit dem
ManageSieve-Dienst verbinden, bevor sie sich authentisiert haben. Sie dürfen
sich von den Capabilitys unterscheiden, die angemeldeten Nutzern angeboten
werden. Wenn dieses Feld leer gelassen wird, wird nach Vorgabe alles
angegeben, was der Sieve-Interpretierer unterstützt.

Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{protocol-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste managesieve-sieve-capability
Welche SIEVE-Capabilitys an Clients gemeldet werden, die sich mit dem
ManageSieve-Dienst verbinden, bevor sie sich authentisiert haben. Sie dürfen
sich von den Capabilitys unterscheiden, die angemeldeten Nutzern angeboten
werden. Wenn dieses Feld leer gelassen wird, wird nach Vorgabe alles
angegeben, was der Sieve-Interpretierer unterstützt.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@deftypevr {@code{protocol-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste mail-plugins
Leerzeichengetrennte Liste der zu ladenden Plugins.
@end deftypevr

@deftypevr {@code{protocol-configuration}-Parameter} Nichtnegative-ganze-Zahl mail-max-userip-connections
Die Maximalzahl der IMAP-Verbindungen, die jeder Nutzer von derselben
IP-Adresse aus benutzen kann. @emph{Anmerkung}: Beim Vergleichen des
Benutzernamens wird Groß- und Kleinschreibung unterschieden. Die Vorgabe ist
@samp{10}.
@end deftypevr

@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} „service-configuration“-Liste services
Die Liste der zu aktivierenden Dienste. Zu den verfügbaren Diensten gehören
@samp{imap}, @samp{imap-login}, @samp{pop3}, @samp{pop3-login}, @samp{auth}
und @samp{lmtp}.

Verfügbare @code{service-configuration}-Felder sind:

@deftypevr {@code{service-configuration}-Parameter} Zeichenkette kind
Die Dienstart (englisch „kind“). Zu den gültigen Werten gehören
@code{director}, @code{imap-login}, @code{pop3-login}, @code{lmtp},
@code{imap}, @code{pop3}, @code{auth}, @code{auth-worker}, @code{dict},
@code{tcpwrap}, @code{quota-warning} oder alles andere.
@end deftypevr

@deftypevr {@code{service-configuration}-Parameter} „listener-configuration“-Liste listeners
„Listener“ für den Dienst, also Lauscher auf neue Verbindungen. Als Listener
kann entweder eine @code{unix-listener-configuration}, eine
@code{fifo-listener-configuration} oder eine
@code{inet-listener-configuration} angegeben werden. Die Vorgabe ist
@samp{'()}.

Verfügbare @code{unix-listener-configuration}-Felder sind:

@deftypevr {@code{unix-listener-configuration}-Parameter} Zeichenkette path
Der Pfad zur Datei, relativ zum Feld @code{base-dir}. Er wird auch als der
Abschnittsname verwendet.
@end deftypevr

@deftypevr {@code{unix-listener-configuration}-Parameter} Zeichenkette mode
Der Zugriffsmodus des Sockets. Die Vorgabe ist @samp{"0600"}.
@end deftypevr

@deftypevr {@code{unix-listener-configuration}-Parameter} Zeichenkette user
Der Benutzer, dem der Socket gehört. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{unix-listener-configuration}-Parameter} Zeichenkette group
Die Gruppe, der der Socket gehört. Die Vorgabe ist @samp{""}.
@end deftypevr


Verfügbare @code{fifo-listener-configuration}-Felder sind:

@deftypevr {@code{fifo-listener-configuration}-Parameter} Zeichenkette path
Der Pfad zur Datei, relativ zum Feld @code{base-dir}. Er wird auch als der
Abschnittsname verwendet.
@end deftypevr

@deftypevr {@code{fifo-listener-configuration}-Parameter} Zeichenkette mode
Der Zugriffsmodus des Sockets. Die Vorgabe ist @samp{"0600"}.
@end deftypevr

@deftypevr {@code{fifo-listener-configuration}-Parameter} Zeichenkette user
Der Benutzer, dem der Socket gehört. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{fifo-listener-configuration}-Parameter} Zeichenkette group
Die Gruppe, der der Socket gehört. Die Vorgabe ist @samp{""}.
@end deftypevr


Verfügbare @code{inet-listener-configuration}-Felder sind:

@deftypevr {@code{inet-listener-configuration}-Parameter} Zeichenkette protocol
Das Protokoll, auf das gelauscht wird.
@end deftypevr

@deftypevr {@code{inet-listener-configuration}-Parameter} Zeichenkette address
Die Adresse, auf der gelauscht wird. Bleibt das Feld leer, wird auf allen
Adressen gelauscht. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{inet-listener-configuration}-Parameter} Nichtnegative-ganze-Zahl port
Der Port, auf dem gelauscht werden soll.
@end deftypevr

@deftypevr {@code{inet-listener-configuration}-Parameter} Boolescher-Ausdruck ssl?
Ob für diesen Dienst SSL benutzt werden kann: @samp{yes} für ja, @samp{no}
für nein oder @samp{required} für „verpflichtend“. Die Vorgabe ist
@samp{#t}.
@end deftypevr

@end deftypevr

@deftypevr {@code{service-configuration}-Parameter} Nichtnegative-ganze-Zahl client-limit
Die maximale Anzahl gleichzeitiger Verbindungen mit Clients pro
Prozess. Sobald diese Anzahl von Verbindungen eingegangen ist, bewirkt das
Eingehen der nächsten Verbindung, dass Dovecot einen weiteren Prozess
startet. Ist sie auf 0 gesetzt, benutzt Dovecot stattdessen
@code{default-client-limit}.

Die Vorgabe ist @samp{0}.

@end deftypevr

@deftypevr {@code{service-configuration}-Parameter} Nichtnegative-ganze-Zahl service-count
Die Anzahl Verbindungen, die behandelt werden, bevor ein neuer Prozess
gestartet wird. Typischerweise sind die einzig sinnvollen Werte 0
(unbeschränkt) oder 1. 1 ist sicherer, aber 0 ist schneller. Siehe
<doc/wiki/LoginProcess.txt>. Die Vorgabe ist @samp{1}.

@end deftypevr

@deftypevr {@code{service-configuration}-Parameter} Nichtnegative-ganze-Zahl process-limit
Die maximale Anzahl von Prozessen, die für diesen Dienst existieren
können. Wenn sie auf 0 gesetzt ist, benutzt Dovecot stattdessen
@code{default-process-limit}.

Die Vorgabe ist @samp{0}.

@end deftypevr

@deftypevr {@code{service-configuration}-Parameter} Nichtnegative-ganze-Zahl process-min-avail
Die Anzahl der Prozesse, mit denen immer auf neue Verbindungen gewartet
wird. Die Vorgabe ist @samp{0}.
@end deftypevr

@deftypevr {@code{service-configuration}-Parameter} Nichtnegative-ganze-Zahl vsz-limit
Wenn Sie @samp{service-count 0} festlegen, müssen Sie hierfür wahrscheinlich
eine größere Zahl wählen. Die Vorgabe ist @samp{256000000}.
@end deftypevr

@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} dict-configuration dict
Die Wörterbuchkonfiguration, wie sie der
@code{dict-configuration}-Konstruktor erzeugt.

Verfügbare @code{dict-configuration}-Felder sind:

@deftypevr {@code{dict-configuration}-Parameter} Formlose-Felder entries
Eine Liste von Schlüssel-Wert-Paaren, die in diesem Wörterbuch enthalten
sein sollen. Die Vorgabe ist @samp{'()}.
@end deftypevr

@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} „passdb-configuration“-Liste passdbs
Eine Liste von Passwortdatenbankkonfigurationen, die jeweils mit dem
@code{passdb-configuration}-Konstruktor erzeugt werden.

Verfügbare @code{passdb-configuration}-Felder sind:

@deftypevr {@code{passdb-configuration}-Parameter} Zeichenkette driver
Der Treiber, den die Passwortdatenbank benutzen soll. Zu den gültigen Werten
gehören @samp{pam}, @samp{passwd}, @samp{shadow}, @samp{bsdauth} und
@samp{static}. Die Vorgabe ist @samp{"pam"}.
@end deftypevr

@deftypevr {@code{passdb-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste args
Leerzeichengetrennte Liste der Argumente an den
Passwortdatenbanktreiber. Die Vorgabe ist @samp{""}.
@end deftypevr

@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} „userdb-configuration“-Liste userdbs
Liste der Benutzerdatenbankkonfigurationen, die jeweils mit dem
@code{userdb-configuration}-Konstruktor erzeugt werden.

Verfügbare @code{userdb-configuration}-Felder sind:

@deftypevr {@code{userdb-configuration}-Parameter} Zeichenkette driver
Der Treiber, den die Benutzerdatenbank benutzen soll. Zu den gültigen Werten
gehören @samp{passwd} und @samp{static}. Die Vorgabe ist @samp{"passwd"}.
@end deftypevr

@deftypevr {@code{userdb-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste args
Leerzeichengetrennte Liste der Argumente an den
Benutzerdatenbanktreiber. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{userdb-configuration}-Parameter} Formlose-Argumente override-fields
Einträge, die Vorrang vor den Feldern aus passwd haben. Die Vorgabe ist
@samp{'()}.
@end deftypevr

@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} „plugin-configuration“ plugin-configuration
Die Plugin-Konfiguration, die vom @code{plugin-configuration}-Konstruktor
erzeugt wird.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} „namespace-configuration“-Liste namespaces
Liste der Namensräume. Jedes Objekt in der Liste wird durch den
@code{namespace-configuration}-Konstruktor erzeugt.

Verfügbare @code{namespace-configuration}-Felder sind:

@deftypevr {@code{namespace-configuration}-Parameter} Zeichenkette name
Der Name dieses Namensraums.
@end deftypevr

@deftypevr {@code{namespace-configuration}-Parameter} Zeichenkette type
Namensraum-Typ: @samp{private}, @samp{shared} oder @samp{public}. Die
Vorgabe ist @samp{"private"}.
@end deftypevr

@deftypevr {@code{namespace-configuration}-Parameter} Zeichenkette separator
Welche Trennzeichen in der Hierarchie von Namensräumen benutzt werden
sollen. Sie sollten denselben Trenner für alle Namensräume benutzen, sonst
führt es zu Verwirrung bei manchen Clients. Meistens ist @samp{/} eine gute
Wahl, die Voreinstellung ist allerdings abhängig vom darunterliegenden
Mail-Speicher-Format. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{namespace-configuration}-Parameter} Zeichenkette prefix
Das Präfix, das für Zugang auf diesen Namensraum angegeben werden muss. Es
muss für jeden Namensraum ein anderes gewählt werden. Ein Beispiel ist
@samp{Public/}. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{namespace-configuration}-Parameter} Zeichenkette location
Der physische Ort, an dem sich dieses Postfach („Mailbox“) befindet. Das
Format ist dasselbe wie beim Mail-Ort („mail location“), der auch als
Voreinstellung hierfür benutzt wird. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{namespace-configuration}-Parameter} Boolescher-Ausdruck inbox?
Es kann nur eine INBOX geben; hiermit wird festgelegt, zu welchem Namensraum
sie gehört. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{namespace-configuration}-Parameter} Boolescher-Ausdruck hidden?
Wenn der Namensraum versteckt ist, wird er Clients gegenüber @emph{nicht}
über die NAMESPACE-Erweiterung mitgeteilt. Wahrscheinlich möchten Sie auch
@samp{list? #f} festlegen. Das ist in erster Linie dann nützlich, wenn Sie
von einem anderen Server mit anderen Namensräumen umziehen, die Sie ersetzen
möchten, die aber trotzdem noch weiterhin funktionieren sollen. Zum Beispiel
können Sie versteckte Namensräume mit Präfixen @samp{~/mail/},
@samp{~%u/mail/} und @samp{mail/} anlegen. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{namespace-configuration}-Parameter} Boolescher-Ausdruck list?
Ob die Postfächer („Mailboxes“) unter diesem Namensraum mit dem LIST-Befehl
angezeigt werden können. Dadurch wird der Namensraum für Clients sichtbar,
die die NAMESPACE-Erweiterung nicht unterstützen. Mit dem besonderen Wert
@code{children} werden auch Kind-Postfächer aufgelistet, aber das
Namensraumpräfix verborgen. Die Vorgabe ist @samp{#t}.
@end deftypevr

@deftypevr {@code{namespace-configuration}-Parameter} Boolescher-Ausdruck subscriptions?
Die Abonnements werden im Namensraum selbst behandelt. Wenn es auf @code{#f}
gesetzt ist, werden sie im Elternnamensraum behandelt. Das leere Präfix
sollte hier immer @code{#t} haben. Die Vorgabe ist @samp{#t}.
@end deftypevr

@deftypevr {@code{namespace-configuration}-Parameter} „mailbox-configuration“-Liste mailboxes
Die Liste der in diesem Namensraum vordefinierten Postfächer. Die Vorgabe
ist @samp{'()}.

Verfügbare @code{mailbox-configuration}-Felder sind:

@deftypevr {@code{mailbox-configuration}-Parameter} Zeichenkette name
Der Name dieses Postfachs (dieser „Mailbox“).
@end deftypevr

@deftypevr {@code{mailbox-configuration}-Parameter} Zeichenkette auto
Bei @samp{create} wird dieses Postfach automatisch erzeugt. Bei
@samp{subscribe} wird dieses Postfach sowohl automatisch erzeugt als auch
automatisch abonniert. Die Vorgabe ist @samp{"no"}.
@end deftypevr

@deftypevr {@code{mailbox-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste special-use
Liste der @code{SPECIAL-USE}-Attribute von IMAP, wie sie im RFC 6154
festgelegt wurden. Gültige Werte sind @code{\All}, @code{\Archive},
@code{\Drafts}, @code{\Flagged}, @code{\Junk}, @code{\Sent} und
@code{\Trash}. Die Vorgabe ist @samp{'()}.
@end deftypevr

@end deftypevr

@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Dateiname base-dir
Das Basisverzeichnis, in dem Laufzeitdaten gespeichert werden. Die Vorgabe
ist @samp{"/var/run/dovecot/"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette login-greeting
Begrüßungsnachricht für Clients. Die Vorgabe ist @samp{"Dovecot ready."}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste login-trusted-networks
Die Liste der Netzwerkbereiche, denen vertraut wird. Für Verbindungen von
diesen IP-Adressen können abweichende IP-Adressen und Ports angegeben werden
(zur Protokollierung und zur
Authentifizierung). @samp{disable-plaintext-auth} wird für diese Netzwerke
außerdem ignoriert. Normalerweise würden Sie hier Ihre IMAP-Proxy-Server
eintragen. Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste login-access-sockets
Die Liste der Sockets zur Zugriffsprüfung beim Anmelden (z.B.@:
tcpwrap). Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck verbose-proctitle?
Ausführlichere Prozessnamen anzeigen (mit „ps“). Nach Voreinstellung werden
Benutzername und IP-Adresse angezeigt. Die Einstellung ist nützlich, wenn
man sehen können will, wer tatsächlich IMAP-Prozesse benutzt (z.B.@:
gemeinsam genutzte Postfächer oder wenn derselbe Benutzeridentifikator/„UID“
für mehrere Konten benutzt wird). Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck shutdown-clients?
Ob alle Prozesse erzwungen beendet werden sollen, wenn der
Haupt-Dovecot-Prozess terminiert. Ist dies auf @code{#f} gesetzt, kann
Dovecot aktualisiert werden, ohne dass bestehende Client-Verbindungen
zwangsweise geschlossen werden (jedoch kann das problematisch sein, wenn die
Aktualisierung z.B.@: eine Sicherheitslücke schließen soll). Die Vorgabe ist
@samp{#t}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl doveadm-worker-count
Ist dies @emph{nicht} null, werden Mail-Befehle über die angegebene Anzahl
von Verbindungen an den doveadm-Server geschickt, statt sie direkt im selben
Prozess auszuführen. Die Vorgabe ist @samp{0}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette doveadm-socket-path
Der UNIX-Socket oder das „Host:Port“-Paar, mit dem Verbindungen zum
doveadm-Server hergestellt werden. Die Vorgabe ist @samp{"doveadm-server"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste import-environment
Die Liste der Umgebungsvariablen, die beim Starten von Dovecot erhalten
bleiben und allen Kindprozessen davon mitgegeben werden. Sie können auch
„Schlüssel=Wert“-Paare angeben, um wie immer bestimmte Zuweisungen
festzulegen.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck disable-plaintext-auth?
Deaktiviert den LOGIN-Befehl und alle anderen
Klartext-Authentisierungsverfahren, solange kein SSL/TLS benutzt wird (die
LOGINDISABLED-Capability). Beachten Sie, dass, wenn die entfernte IP-Adresse
mit der lokalen IP-Adresse identisch ist (Sie sich also vom selben Rechner
aus verbinden), die Verbindung als sicher aufgefasst und
Klartext-Authentisierung möglich ist. Siehe auch die
„ssl=required“-Einstellung. Die Vorgabe ist @samp{#t}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl auth-cache-size
Die Größe des Zwischenspeichers für Authentifizierungen (z.B.@:
@samp{#e10e6}). Bei 0 ist er deaktiviert. Beachten Sie, dass für bsdauth,
PAM und vpopmail die Einstellung @samp{cache-key} festgelegt sein muss,
damit ein Zwischenspeicher benutzt wird. Die Vorgabe ist @samp{0}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette auth-cache-ttl
Wie lange Daten im Zwischenspeicher gültig bleiben („Time to live“). Nachdem
die TTL ausläuft, wird der zwischengespeicherte Eintrag nicht mehr benutzt,
@emph{außer} wenn eine Auflösung über die Hauptdatenbank zu einem internen
Fehler führt. Dovecot versucht zudem, Passwortänderungen automatisch zu
behandeln: Wenn die letzte Authentisierung erfolgreich war, diese jetzt aber
nicht, wird der Zwischenspeicher @emph{nicht} benutzt. Derzeit funktioniert
dies nur bei Klartext-Authentisierung. Die Vorgabe ist @samp{"1 hour"} für 1
Stunde.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette auth-cache-negative-ttl
TTL beim Zwischenspeichern negativer Ergebnisse („negative Hits“, z.B.@:
wenn der Benutzer nicht gefunden wurde oder das Passwort nicht stimmt). 0
deaktiviert das Zwischenspeichern davon vollständig. Die Vorgabe ist
@samp{"1 hour"} für 1 Stunde.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste auth-realms
Die Liste der Administrationsbereiche („Realms“) für
SASL-Authentisierungsmechanismen, die solche benötigen. Sie können dieses
Feld leer lassen, wenn Sie @emph{keine} Unterstützung für mehrere
Administrationsbereiche wollen. Viele Clients benutzen den ersten hier
aufgelisteten Administrationsbereich, also sollte der als Voreinstellung
gewünschte Bereich vorne stehen. Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette auth-default-realm
Der voreingestellte Administrationsbereich bzw.@: die Domain, falls keiner
angegeben wurde. Dies wird sowohl für SASL-Administrationsbereiche als auch
zum Anhängen von @@domain an den Benutzernamen bei Klartextanmeldungen
benutzt. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette auth-username-chars
Die Liste der in Benutzernamen zulässigen Zeichen. Wenn der vom Benutzer
angegebene Benutzername ein hier nicht aufgelistetes Zeichen enthält, wird
die Authentisierung automatisch abgelehnt. Dies dient bloß als eine weitere
Überprüfung, um zu gewährleisten, dass mögliche Schwachstellen bei der
Maskierung von Anführungszeichen in SQL-/LDAP-Datenbanken nicht ausgenutzt
werden können. Wenn Sie alle Zeichen zulassen möchten, setzen Sie dieses
Feld auf eine leere Zeichenkette. Die Vorgabe ist
@samp{"abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ01234567890.-_@@"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette auth-username-translation
Wie Zeichen in Benutzernamen ersetzt werden sollen, bevor der Name mit
Datenbanken aufgelöst wird. Der Wert besteht aus einer Reihe von Angaben,
welches Zeichen durch welches zu ersetzen ist. Zum Beispiel werden für
@samp{#@@/@@} die Zeichen @samp{#} und @samp{/} beide durch @samp{@@}
ersetzt. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette auth-username-format
Formatierungsanweisungen, die auf jeden Benutzernamen angewandt werden,
bevor er mit einer Datenbank aufgelöst wird. Sie können hierzu die
Standardvariablen verwenden, z.B.@: würde %Lu den Benutzernamen in
Kleinbuchstaben umschreiben („lowercase“), %n würde den Domainnamen
weglassen, wenn einer angegeben wurde, und @samp{%n-AT-%d} würde alle
@samp{@@} durch @samp{-AT-} ersetzen. Diese Übersetzung wird durchgeführt,
nachdem die Änderungen aus @samp{auth-username-translation} angewandt
wurden. Die Vorgabe ist @samp{"%Lu"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette auth-master-user-separator
Wenn Sie es für „Master“-Benutzer erlauben möchten, sich durch Angeben des
Master-Benutzernamens als Teil einer normalen Benutzernamens-Zeichenkette
als jemand anders anzumelden (also ohne Verwendung der Unterstützung davon
durch den SASL-Mechanismus), können Sie hier die Trennzeichen dazwischen
angeben. Das Format ist dann
<Benutzername><Trenner><Master-Benutzername>. UW-IMAP benutzt @samp{*} als
Trennzeichen, also könnte das eine gute Wahl sein. Die Vorgabe ist
@samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette auth-anonymous-username
Der Benutzername, der verwendet wird, wenn sich Benutzer mit dem
SASL-Mechanismus „ANONYMOUS“ anmelden. Die Vorgabe ist @samp{"anonymous"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl auth-worker-max-count
Die maximale Anzahl von dovecot-auth-Arbeiterprozessen. Diese werden
benutzt, um blockierende Anfragen an die Passwortdatenbank („passdb“) und an
die Benutzerdatenbank („userdb“) zu stellen (z.B.@: MySQL und PAM). Sie
werden automatisch erzeugt und gelöscht, je nachdem, wann sie gebraucht
werden. Die Vorgabe ist @samp{30}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette auth-gssapi-hostname
Der Rechnername, der in GSSAPI-Prinzipalnamen benutzt wird. Nach
Voreinstellung wird der durch gethostname() zurückgelieferte Name
verwendet. Benutzen Sie @samp{$ALL} (mit Anführungszeichen), damit alle
Einträge in der Schlüsseltabelle („Keytab“) akzeptiert werden. Die Vorgabe
ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette auth-krb5-keytab
Kerberos-Schlüsseltabelle („Keytab“), die für den GSSAPI-Mechanismus benutzt
werden soll. Wenn sie nicht angegeben wird, wird die Voreinstellung des
Systems benutzt (in der Regel @file{/etc/krb5.keytab}). Eventuell müssen Sie
den Auth-Dienst als Administratornutzer „root“ ausführen lassen, um
Lesezugriffe auf diese Datei zu ermöglichen. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck auth-use-winbind?
NTLM-Authentifizierung und GSS-SPNEGO-Authentifizierung mit dem
winbind-Daemon und dem @samp{ntlm-auth}-Hilfsprogramm von Samba
durchführen. Siehe <doc/wiki/Authentication/Mechanisms/Winbind.txt>. Die
Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Dateiname auth-winbind-helper-path
Der Pfad zur Binärdatei @samp{ntlm-auth} von Samba. Die Vorgabe ist
@samp{"/usr/bin/ntlm_auth"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette auth-failure-delay
Die Zeit, wie lange vor der Antwort auf eine fehlgeschlagene Authentisierung
gewartet wird. Die Vorgabe ist @samp{"2 secs"} für 2 Sekunden.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck auth-ssl-require-client-cert?
Es wird ein gültiges SSL-Client-Zertifikat verlangt, andernfalls schlägt die
Authentisierung fehl. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck auth-ssl-username-from-cert?
Ob der Benutzername aus dem SSL-Zertifikat des Clients ausgelesen werden
soll, indem @code{X509_NAME_get_text_by_NID()} benutzt wird, um den
Distinguished Name („DN“) als Gebräuchlicher Name („CommonName“) des
Zertifikatinhabers („Subject“) auszulesen. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste auth-mechanisms
Die Liste der erwünschten Authentisierungsmechanismen. Unterstützte
Mechanismen sind: @samp{plain}, @samp{login}, @samp{digest-md5},
@samp{cram-md5}, @samp{ntlm}, @samp{rpa}, @samp{apop}, @samp{anonymous},
@samp{gssapi}, @samp{otp}, @samp{skey} und @samp{gss-spnego}. Siehe auch die
Einstellung zu @samp{disable-plaintext-auth}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste director-servers
Die Liste der IP-Adressen oder Rechnernamen („Hostnames“) für alle
Direktorserver, einschließlich dieses Servers selbst. Ports können wie in
„IP:Port“ angegeben werden. Der voreingestellte Port ist derselbe wie der,
der beim @samp{inet-listener} des Direktordienstes benutzt wird. Die Vorgabe
ist @samp{'()}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste director-mail-servers
Die Liste der IP-Adressen oder Rechnernamen („Hostnames“), um alle
Hintergrund-Mailserver zu erreichen. Auch Bereiche können angegeben werden,
wie 10.0.0.10-10.0.0.30. Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette director-user-expire
Wie lange Benutzer zum selben Server weitergeleitet werden, sobald dieser
keine Verbindungen mehr hat. Die Vorgabe ist @samp{"15 min"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette director-username-hash
Wie der Benutzername umgeschrieben wird, bevor er gehasht wird. Zu den
sinnvollen Werten gehören %Ln, wenn der Nutzer sich mit oder ohne @@domain
anmelden kann, oder %Ld, wenn Postfächer innerhalb der Domain gemeinsam
genutzt werden. Die Vorgabe ist @samp{"%Lu"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette log-path
Die Protokolldatei, die für Fehlermeldungen benutzt werden soll. Bei
@samp{syslog} wird das Protokoll an syslog geschrieben, bei
@samp{/dev/stderr} an die Standardfehlerausgabe. Die Vorgabe ist
@samp{"syslog"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette info-log-path
Die Protokolldatei, die für Informationsmeldungen benutzt werden soll. Die
Voreinstellung ist @samp{log-path}. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette debug-log-path
Die Protokolldatei, die für Meldungen zur Fehlersuche benutzt werden
soll. Die Voreinstellung ist @samp{info-log-path}. Die Vorgabe ist
@samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette syslog-facility
Als welche Syslog-Einrichtung Protokolle an Syslog übermittelt werden
sollen. Falls Sie @samp{mail} hierbei @emph{nicht} benutzen wollen, eignen
sich normalerweise local0–local7. Andere Standardeinrichtungen werden auch
unterstützt. Die Vorgabe ist @samp{"mail"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck auth-verbose?
Ob gescheiterte Anmeldeversuche und die Gründe, warum diese nicht
erfolgreich waren, protokolliert werden sollen. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette auth-verbose-passwords
Ob bei falschen Passwörtern das versuchte falsche Passwort ins Protokoll
geschrieben werden soll. Gültige Werte sind "no" („nein“), "plain" (als
Klartext) und "sha1". Den SHA1-Hash zu speichern kann nützlich sein, um zu
erkennen, wenn jemand versucht, sehr viele Passwörter durchzuprobieren (ein
„Brute-Force“-Angriff) oder ob Benutzer einfach nur dasselbe Passwort immer
wieder probieren. Sie können auch nur die ersten n Zeichen des Wertes
protokollieren, indem Sie ":n" anhängen (z.B.@: sha1:6). Die Vorgabe ist
@samp{"no"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck auth-debug?
Ob zur Fehlersuche noch ausführlichere Protokolle geschrieben werden
sollen. Zum Beispiel werden SQL-Anfragen protokolliert. Die Vorgabe ist
@samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck auth-debug-passwords?
Ob bei falschen Passwörtern das versuchte falsche Passwort und das benutzte
Passwortschema ins Protokoll geschrieben werden soll, damit das Problem
untersucht werden kann. Wenn dies aktiviert wird, wird auch
@samp{auth-debug} aktiviert. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck mail-debug?
Ob die Fehlersuche beim Mail-Prozess ermöglicht werden soll. Dies kann Ihnen
dabei helfen, herauszufinden, warum Dovecot Ihre E-Mails nicht findet. Die
Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck verbose-ssl?
SSL-Fehler auf Protokollebene anzeigen. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette log-timestamp
Das Präfix für jede Zeile, die ins Protokoll geschrieben wird. %-Codes sind
im Format von strftime(3). Die Vorgabe ist @samp{"\"%b %d %H:%M:%S \""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste login-log-format-elements
Eine Liste der Elemente, die protokolliert werden sollen. Die Elemente,
deren Variablenwerte nicht leer sind, werden zu einer kommagetrennten
Zeichenkette zusammengefügt.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette login-log-format
Das Format des Anmeldeprogramms. %s umfasst die Zeichenkette
@samp{login-log-format-elements}, %$ enthält die Daten, die man
protokollieren lassen möchte. Die Vorgabe ist @samp{"%$: %s"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mail-log-prefix
Das Präfix, das Protokollen für Mailprozesse vorangestellt wird. Siehe
doc/wiki/Variables.txt für eine Liste der benutzbaren Variablen. Die Vorgabe
ist @samp{"\"%s(%u)<%@{pid@}><%@{session@}>: \""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette deliver-log-format
Welches Format zur Protokollierung von Mailzustellungen verwendet werden
soll. Sie können die folgenden Variablen benutzen:
@table @code
@item %$
Zustellungsstatusnachricht (z.B.@: @samp{saved to INBOX})
@item %m
Nachrichtenidentifikator („Message-ID“)
@item %s
Betreff („Subject“)
@item %f
Absendeadresse („From“)
@item %p
Physische Größe
@item %w
Virtuelle Größe.
@end table
Die Vorgabe ist @samp{"msgid=%m: %$"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mail-location
Wo die Postfächer (die „Mailboxes“) der Benutzer gespeichert sind. Die
Vorgabe ist die leere Zeichenkette, was bedeutet, dass Dovecot die
Postfächer automatisch zu finden versucht. Das funktioniert nur, wenn der
Nutzer bereits E-Mails gespeichert hat, also sollten Sie Dovecot den
vollständigen Pfad mitteilen.

Wenn Sie das mbox-Format benutzen, genügt es @emph{nicht}, den Pfad zur
INBOX-Datei (z.B.@: @file{/var/mail/%u}) anzugeben. Sie müssen Dovecot
@emph{auch} mitteilen, wo die anderen Postfächer gespeichert sind. Dieses
Verzeichnis nennt sich @emph{Wurzelmailverzeichnis} („Root Mail Directory“)
und es muss als erster Pfad in der @samp{mail-location}-Einstellung
angegeben werden.

Es gibt ein paar besondere Variable, die Sie verwenden können, z.B.:

@table @samp
@item %u
Benutzername
@item %n
Benutzerteil in Benutzer@@Domain; sonst dasselbe wie %u, wenn es keine
Domain gibt
@item %d
Domainteil in Benutzer@@Domain; sonst leer, wenn es keine Domain gibt
@item %h
Persönliches Verzeichnis
@end table

Siehe doc/wiki/Variables.txt für die vollständige Liste. Einige Beispiele:
@table @samp
@item maildir:~/Maildir
@item mbox:~/mail:INBOX=/var/mail/%u
@item mbox:/var/mail/%d/%1n/%n:INDEX=/var/indexes/%d/%1n/%
@end table
Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mail-uid
Systembenutzer und -gruppe, die benutzt werden sollen, um auf Mails
zuzugreifen. Wenn Sie mehrere Benutzerkonten verwenden, kann auch die
Benutzerdatenbank „userdb“ vorrangig verwendet werden, indem sie zu
Benutzer- oder Gruppenidentifikatoren (UIDs und GIDs) auflöst. Sie können
hier Zahlen oder Namen angeben. Siehe <doc/wiki/UserIds.txt>. Die Vorgabe
ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mail-gid

Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mail-privileged-group
Die Benutzergruppe, die zwischenzeitlich benutzt wird, um Operationen mit
besonderen Berechtigungen auszuführen. Derzeit wird dies nur mit dem
INBOX-Postfach benutzt, wenn dessen anfängliche Erzeugung oder Sperrung per
„Dotlocking“-Datei fehlschlägt. Typischerweise wird es auf @samp{"mail"}
gesetzt, damit Zugriffe auf @file{/var/mail} möglich sind. Die Vorgabe ist
@samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mail-access-groups
Mail-Prozessen Zugriff auf diese zusätzlichen Benutzergruppen
gewähren. Typischerweise werden sie benutzt, um gemeinsam genutzte
Postfächer („Mailboxes“) so einzurichten, dass alle aus der Gruppe zugreifen
können. Beachten Sie, dass es gefährlich sein kann, dies zu erlauben, wenn
Benutzer symbolische Verknüpfungen einrichten können (z.B.@: kann jeder,
wenn hier die @samp{mail}-Gruppe festgelegt wurde, @code{ln -s /var/mail
~/mail/var} benutzen, um die Postfächer der anderen zu löschen, oder
@code{ln -s /secret/shared/box ~/mail/mybox}, um sie zu lesen). Die Vorgabe
ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mail-attribute-dict
Der Ort, wo ein Dictionary (eine Schlüssel-Wert-Datenbank) zu finden ist,
mit dem IMAP-Metadaten gespeichert werden, entsprechend deren Definition im
@uref{https://tools.ietf.org/html/rfc5464, RFC@tie{}5464}.

Die IMAP-METADATA-Befehle stehen nur zur Verfügung, wenn in der
Protokollkonfiguration von „imap“ das Feld @code{imap-metadata?} auf
@samp{#t} gesetzt ist.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck mail-full-filesystem-access?
Clients vollen Dateisystemzugriff gestatten. Damit gibt es keine
Zugriffsüberprüfungen mehr, abgesehen von denen, die das Betriebssystem für
die aktiven Benutzer- und Gruppenidentifikatoren (UID und GID)
durchführt. Es ist sowohl für maildir- als auch mbox-Formate verwendbar und
Sie können dadurch für Namen von Postfächern („Mailboxes“) Präfixe wie
z.B.@: @file{/pfad/} oder @file{~benutzer/} wählen. Die Vorgabe ist
@samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck mmap-disable?
Überhaupt kein @code{mmap()} benutzen. Das ist erforderlich, wenn Sie Indexe
auf geteilten Dateisystemen speichern (wie NFS oder
Cluster-Dateisystemen). Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck dotlock-use-excl?
Ob sich Dovecot darauf verlassen kann, dass @samp{O_EXCL} funktioniert, wenn
es Sperrdateien als „Dotlock“ erstellt. NFS unterstützt @samp{O_EXCL} seit
Version 3, also sollte es heutzutage kein Problem mehr sein, dies als
Voreinstellung zu benutzen. Die Vorgabe ist @samp{#t}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mail-fsync
Wann fsync() oder fdatasync() aufgerufen werden soll:
@table @code
@item optimized
Wann immer es nötig ist, um keine wichtigen Daten zu verlieren
@item always
Praktisch bei z.B.@: NFS, wenn Schreibzugriffe mit @code{write()} verzögert
sind
@item never
Niemals benutzen (ist am schnellsten, aber Abstürze können zu Datenverlusten
führen)
@end table
Die Vorgabe ist @samp{"optimized"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck mail-nfs-storage?
Mails werden in NFS gespeichert. Setzen Sie dies auf ja, damit Dovecot
NFS-Zwischenspeicher zurückschreiben kann, wann immer es nötig ist. Wenn Sie
nur einen einzigen Mail-Server benutzen, brauchen Sie es @emph{nicht}. Die
Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck mail-nfs-index?
Ob die Index-Dateien für Mails auch in NFS gespeichert sind. Wenn dies auf
ja gesetzt ist, muss @samp{mmap-disable? #t} und @samp{fsync-disable? #f}
gesetzt sein. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette lock-method
Die Sperrmethode für Indexdateien. Die Alternativen sind fcntl, flock und
dotlock. Bei Dotlocking werden ein paar Tricks benutzt, die mehr Plattenein-
und -ausgaben als andere Sperrmethoden zur Folge haben. Für NFS-Benutzer
gilt: flock funktioniert nicht, also denken Sie bitte daran,
@samp{mmap-disable} zu ändern. Die Vorgabe ist @samp{"fcntl"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Dateiname mail-temp-dir
Das Verzeichnis, in dem LDA/LMTP zwischenzeitlich eingehende E-Mails >128 kB
speichert. Die Vorgabe ist @samp{"/tmp"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl first-valid-uid
Der Bereich, in dem die Benutzerkennungen („UIDs“) von sich bei Dovecot
anmeldenden Benutzern liegen müssen. Das dient hauptsächlich dazu,
sicherzustellen, dass sich Anwender nicht mit den Benutzerkonten von Daemons
oder sonstigen Systembenutzerkonten anmelden können. Beachten Sie, dass eine
Anmeldung als Administrator „root“ grundsätzlich vom Code des
Dovecot-Programms verboten wird und selbst dann @emph{nicht} möglich ist,
wenn Sie @samp{first-valid-uid} auf 0 setzen. Die Vorgabe ist @samp{500}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl last-valid-uid

Die Vorgabe ist @samp{0}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl first-valid-gid
Der Bereich, in dem die Gruppenkennungen („GIDs“) von sich bei Dovecot
anmeldenden Benutzern liegen müssen. Benutzerkonten, deren primäre Gruppe
keine gültige GID hat, können sich nicht anmelden. Wenn das Benutzerkonto zu
zusätzlichen Gruppen mit ungültiger GID gehört, werden diese
Gruppen-Berechtigungen von Dovecot wieder abgegeben. Die Vorgabe ist
@samp{1}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl last-valid-gid

Die Vorgabe ist @samp{0}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl mail-max-keyword-length
Die maximale zulässige Länge eines Mail-Schlüsselwort-Namens. Sie wirkt sich
nur aus, wenn Sie neue Schlüsselwörter anzulegen versuchen. Die Vorgabe ist
@samp{50}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Doppelpunktgetrennte-Dateinamen-Liste valid-chroot-dirs
Die Liste der Verzeichnisse, in die Mail-Prozesse per „chroot“ das
Wurzelverzeichnis wechseln können (d.h.@: für @file{/var/mail} wird auch ein
chroot nach @file{/var/mail/foo/bar} möglich). Diese Einstellung hat keinen
Einfluss auf @samp{login-chroot}, @samp{mail-chroot} oder
Authentifizierungs-„chroot“-Einstellungen. Wenn diese Einstellung leer
gelassen wird, werden chroots per @samp{/./} in Persönlichen Verzeichnissen
ignoriert. @emph{Warnung}: Fügen Sie niemals Verzeichnisse hinzu, die lokale
Benutzer verändern können, weil diese dann eventuell über eine
Rechteausweitung Administratorrechte an sich reißen können. In der Regel
sollte man ein solches Verzeichnis nur eintragen, wenn Nutzer keinen
Shell-Zugriff erhalten können. Siehe <doc/wiki/Chrooting.txt>. Die Vorgabe
ist @samp{'()}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mail-chroot
Das voreingestellte „chroot“-Verzeichnis für Mail-Prozesse. Es kann für
einzelne Nutzer in der Benutzerdatenbank außer Kraft gesetzt werden, indem
@samp{/./} als Teil der Angabe zum Persönlichen Verzeichnis des Benutzers
verwendet wird (z.B.@: lässt @samp{/home/./benutzer} das Wurzelverzeichnis
per „chroot“ nach @file{/home} wechseln). Beachten Sie, dass es in der Regel
@emph{nicht} unbedingt notwendig ist, Chrooting zu betreiben, weil Dovecot
es Benutzern ohnehin nicht erlaubt, auf Dateien außerhalb ihres
Mail-Verzeichnisses zuzugreifen. Wenn Ihren Persönlichen Verzeichnissen das
Chroot-Verzeichnis vorangestellt ist, sollten Sie @samp{/.}@: an
@samp{mail-chroot} anhängen. Siehe <doc/wiki/Chrooting.txt>. Die Vorgabe ist
@samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Dateiname auth-socket-path
Der UNIX-Socket-Pfad, unter dem der Hauptauthentifizierungsserver zu finden
ist, mit dem Nutzer gefunden werden können. Er wird von IMAP (für gemeinsame
Benutzerkonten) und von LDA benutzt. Die Vorgabe ist
@samp{"/var/run/dovecot/auth-userdb"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Dateiname mail-plugin-dir
Das Verzeichnis, in dem Mailplugins zu finden sind. Die Vorgabe ist
@samp{"/usr/lib/dovecot"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste mail-plugins
Die Liste der Plugins, die für alle Dienste geladen werden sollen. Plugins,
die nur für IMAP, LDA, etc.@: gedacht sind, werden in ihren eigenen
.conf-Dateien zu dieser Liste hinzugefügt. Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl mail-cache-min-mail-count
Die kleinste Anzahl an Mails in einem Postfach, bevor Aktualisierungen an
der Zwischenspeicherdatei vorgenommen werden. Damit kann das Verhalten von
Dovecot optimiert werden, um weniger Schreibzugriffe auf die Platte
durchzuführen, wofür allerdings mehr Lesezugriffe notwendig werden. Die
Vorgabe ist @samp{0}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mailbox-idle-check-interval
Während der IDLE-Befehl läuft, wird ab und zu im Postfach (der „Mailbox“)
nachgeschaut, ob es neue Mails oder andere Änderungen gibt. Mit dieser
Einstellung wird festgelegt, wie lange zwischen diesen Überprüfungen
höchstens gewartet wird. Dovecot kann auch dnotify, inotify und kqueue
benutzen, um sofort über Änderungen informiert zu werden. Die Vorgabe ist
@samp{"30 secs"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck mail-save-crlf?
Ob Mails mit CR+LF-Kodierung für Zeilenumbrüche statt einfacher LF
gespeichert werden sollen. Dadurch wird das Versenden dieser Mails den
Prozessor weniger beanspruchen, dies gilt besonders für den Systemaufruf
sendfile() unter Linux und FreeBSD@. Allerdings werden auch ein bisschen
mehr Ein- und Ausgaben auf der Platte notwendig, wodurch es insgesamt
langsamer werden könnte. Beachten Sie außerdem, dass andere Software, die
die mboxes/maildirs ausliest, mit den CRs falsch umgehen und Probleme
verursachen könnte. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck maildir-stat-dirs?
Nach Voreinstellung liefert der LIST-Befehl alle Einträge im Mailverzeichnis
(„Maildir“), die mit einem Punkt beginnen. Wenn diese Option aktiviert wird,
liefert Dovecot nur solche Einträge, die für Verzeichnisse stehen. Dazu wird
auf jedem Eintrag stat() aufgerufen, wodurch mehr Ein- und Ausgaben auf der
Platte anfallen. (Bei Systemen, die einen Struktureintrag
@samp{dirent->d_type} machen, ist diese Überprüfung unnötig, daher werden
dort nur Verzeichnisse geliefert, egal was hier eingestellt ist.) Die
Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck maildir-copy-with-hardlinks?
Ob zum Kopieren einer Nachricht statt einer Kopie so weit möglich harte
Verknüpfungen („Hard Links“) verwendet werden sollen. Dadurch wird das
System wesentlich weniger ausgelastet und Nebenwirkungen sind
unwahrscheinlich. Die Vorgabe ist @samp{#t}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck maildir-very-dirty-syncs?
Ob Dovecot annehmen darf, dass es der einzige MUA ist, der auf Maildir
zugreift. Dann wird das cur/-Verzeichnis nur bei unerwarteten Änderungen an
seiner mtime durchsucht oder wenn die Mail sonst nicht gefunden werden
kann. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste mbox-read-locks
Welche Sperrmethoden zum Sperren des mbox-Postfachs (der „Mailbox“) benutzt
werden. Es stehen vier Methoden zur Auswahl:

@table @code
@item dotlock
Hier wird eine Datei namens <Postfach>.lock erzeugt. Es handelt sich um die
älteste und am ehesten mit NFS verwendbare Lösung. Wenn Sie ein Verzeichnis
wie /var/mail/ benutzen, müssen die Benutzer Schreibzugriff darauf haben.
@item dotlock-try
Genau wie dotlock, aber wenn es mangels Berechtigungen fehlschlägt oder
nicht genug Plattenplatz verfügbar ist, wird einfach nicht gesperrt.
@item fcntl
Benutzen Sie diese Einstellung wenn möglich. Sie funktioniert auch mit NFS,
sofern lockd benutzt wird.
@item flock
Existiert vielleicht nicht auf allen Systemen. Funktioniert nicht mit NFS.
@item lockf
Existiert vielleicht nicht auf allen Systemen. Funktioniert nicht mit NFS.
@end table

Sie können mehrere Sperrmethoden angeben; wenn ja, dann ist deren
Reihenfolge entscheidend, um Verklemmungen („Deadlocks“) zu vermeiden, wenn
andere MTAs/MUAs auch mehrere Sperrmethoden benutzen. Manche Betriebssysteme
erlauben es nicht, manche davon gleichzeitig zu benutzen.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste mbox-write-locks

@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mbox-lock-timeout
Wie lange höchstens auf Sperren (irgendeiner Art) gewartet wird, bevor
abgebrochen wird. Die Vorgabe ist @samp{"5 mins"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mbox-dotlock-change-timeout
Wenn eine Dotlock-Sperrdatei existiert, das Postfach (die „Mailbox“) aber
auf keine Weise geändert wurde, wird die Sperrdatei nach der hier
angegebenen Zeit außer Kraft gesetzt. Die Vorgabe ist @samp{"2 mins"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck mbox-dirty-syncs?
Wenn sich das mbox-Postfach unerwartet ändert, müssen wir es gänzlich neu
einlesen, um herauszufinden, was sich geändert hat. Wenn die mbox groß ist,
kann das viel Zeit in Anspruch nehmen. Weil es sich bei der Änderung
meistens nur um eine neu angefügte Mail handelt, wäre es schneller, nur die
neuen Mails zu lesen. Wenn diese Einstellung hier aktiviert ist, arbeitet
Dovecot nach dem eben beschriebenen Prinzip, liest aber doch die ganze
mbox-Datei neu ein, sobald es etwas nicht wie erwartet vorfindet. Der
einzige wirkliche Nachteil bei dieser Einstellung ist, dass es Dovecot nicht
sofort erkennt, wenn ein anderer MUA die Statusindikatoren („Flags“)
ändert. Beachten Sie, dass eine komplette Synchronisation bei den Befehlen
SELECT, EXAMINE, EXPUNGE und CHECK durchgeführt wird. Die Vorgabe ist
@samp{#t}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck mbox-very-dirty-syncs?
Wie @samp{mbox-dirty-syncs}, aber ohne dass komplette Synchronisationen
selbst bei den Befehlen SELECT, EXAMINE, EXPUNGE oder CHECK durchgeführt
werden. Wenn dies hier aktiviert ist, wird @samp{mbox-dirty-syncs}
ignoriert. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck mbox-lazy-writes?
Ob das Schreiben von mbox-Kopfzeilen hinausgezögert wird, bis eine komplette
Schreibsynchronisation durchgeführt wird (bei den Befehlen EXPUNGE und
CHECK, und beim Schließen des Postfachs, d.h.@: der „Mailbox“). Das wird
besonders nützlich, wenn Clients POP3 verwenden, wo es oft vorkommt, dass
die Clients alle Mails löschen. Der Nachteil ist, dass Dovecots Änderungen
nicht sofort für andere MUAs sichtbar werden. Die Vorgabe ist @samp{#t}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl mbox-min-index-size
Wenn die Größe des mbox-Postfaches kleiner als die angegebene Größe (z.B.@:
100k) ist, werden keine Index-Dateien geschrieben. Wenn bereits eine
Index-Datei existiert, wird sie weiterhin gelesen und nur nicht
aktualisiert. Die Vorgabe ist @samp{0}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl mdbox-rotate-size
Die maximale Größe der dbox-Datei, bis sie rotiert wird. Die Vorgabe ist
@samp{10000000}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mdbox-rotate-interval
Das maximale Alter der dbox-Datei, bis sie rotiert wird. Typischerweise wird
es in Tagen angegeben. Der Tag beginnt um Mitternacht, also steht 1d für
heute, 2d für gestern, etc. 0 heißt, die Überprüfung ist abgeschaltet. Die
Vorgabe ist @samp{"1d"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck mdbox-preallocate-space?
Ob beim Erstellen neuer mdbox-Postfachdateien gleich am Anfang eine Datei
der Größe @samp{mdbox-rotate-size} vorab angelegt werden soll. Diese
Einstellung funktioniert derzeit nur mit Linux auf manchen Dateisystemen
(ext4, xfs). Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mail-attachment-dir
Postfächer in den Formaten sdbox und mdbox unterstützen es, Mail-Anhänge in
externen Dateien zu speichern, wodurch sie mit Einzelinstanz-Speicherung
(„Single-Instance Storage“) dedupliziert werden können. Andere
Hintergrundsysteme („Backends“) bieten dafür noch keine Unterstützung.

@emph{Warnung}: Diese Funktionalität wurde noch nicht ausgiebig
getestet. Benutzen Sie sie auf eigene Gefahr.

Das Wurzelverzeichnis, in dem Mail-Anhänge gespeichert werden. Wenn es leer
gelassen wird, ist es deaktiviert. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl mail-attachment-min-size
Anhänge, die kleiner sind als hier angegeben, werden @emph{nicht} extern
gespeichert. Es ist auch möglich, ein Plugin zu schreiben, das externes
Speichern bestimmter Anhänge deaktiviert. Die Vorgabe ist @samp{128000}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mail-attachment-fs
Ein Dateisystemhintergrundprogramm, mit dem Anhänge gespeichert werden:
@table @code
@item posix
Dovecot führt keine Einzelinstanzspeicherung durch (aber das Dateisystem
kann so leichter selbst deduplizieren)
@item sis posix
Einzelinstanzspeicherung wird durch einen sofortigen Byte-für-Byte-Vergleich
beim Speichern umgesetzt
@item sis-queue posix
Einzelinstanzspeicherung mit verzögertem Vergleich und Deduplizierung.
@end table
Die Vorgabe ist @samp{"sis posix"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette mail-attachment-hash
Welches Hash-Format die Dateinamen von Anhängen bestimmt. Sie können
beliebigen Text und Variable beifügen: @code{%@{md4@}}, @code{%@{md5@}},
@code{%@{sha1@}}, @code{%@{sha256@}}, @code{%@{sha512@}},
@code{%@{size@}}. Es können auch nur Teile der Variablen benutzt werden,
z.B.@: liefert @code{%@{sha256:80@}} nur die ersten 80 Bits. Die Vorgabe ist
@samp{"%@{sha1@}"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl default-process-limit

Die Vorgabe ist @samp{100}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl default-client-limit

Die Vorgabe ist @samp{1000}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl default-vsz-limit
Die vorgegebene Beschränkung der VSZ („Virtual Memory Size“, virtuelle
Speichergröße) für Dienstprozesse. Dies ist hauptsächlich dafür gedacht,
Prozessen, die ein Speicherleck aufweisen, rechtzeitig Einhalt zu gebieten
und sie abzuwürgen, bevor sie allen Speicher aufbrauchen. Die Vorgabe ist
@samp{256000000}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette default-login-user
Der Anmeldebenutzer, der intern von Anmeldeprozessen benutzt wird. Der
Anmeldebenutzer ist derjenige Benutzer im Dovecot-System, dem am wenigsten
Vertrauen zugeschrieben wird. Er sollte auf überhaupt nichts Zugriff
haben. Die Vorgabe ist @samp{"dovenull"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette default-internal-user
Der interne Benutzer, der von Prozessen ohne besondere Berechtigungen
benutzt wird. Er sollte sich vom Anmeldebenutzer unterscheiden, damit
Anmeldeprozesse keine anderen Prozesse stören können. Die Vorgabe ist
@samp{"dovecot"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette ssl?
SSL/TLS-Unterstützung: yes für ja, no für nein, oder required, wenn SSL/TLS
verpflichtend benutzt werden muss. Siehe <doc/wiki/SSL.txt>. Die Vorgabe ist
@samp{"required"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette ssl-cert
Das PEM-kodierte X.509-SSL/TLS-Zertifikat (der öffentliche Schlüssel). Die
Vorgabe ist @samp{"</etc/dovecot/default.pem"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette ssl-key
Der PEM-kodierte private Schlüssel für SSL/TLS@. Der Schlüssel wird
geöffnet, bevor Administratorrechte abgegeben werden, damit niemand außer
dem Administratornutzer „root“ Lesezugriff auf die Schlüsseldatei hat. Die
Vorgabe ist @samp{"</etc/dovecot/private/default.pem"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette ssl-key-password
Wenn die Schlüsseldatei passwortgeschützt ist, geben Sie hier das Passwort
an. Alternativ können Sie es angeben, wenn sie Dovecot starten, indem Sie es
mit dem Parameter -p übergeben. Da die Konfigurationsdatei oftmals allgemein
lesbar ist, möchten Sie es vielleicht in einer anderen Datei ablegen. Die
Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette ssl-ca
Die PEM-kodierte Zertifikatsautorität, die als vertrauenswürdig eingestuft
wird. Legen Sie sie nur dann fest, wenn Sie @samp{ssl-verify-client-cert?
#t} setzen möchten. Die Datei sollte das oder die Zertifikat(e) der
Zertifikatsautorität („Certificate Authority“, kurz CA) enthalten, gefolgt
von den entsprechenden Zertifikatsperrlisten (CRLs), z.B.@: @samp{ssl-ca
</etc/ssl/certs/ca.pem}. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck ssl-require-crl?
Ob die Prüfung der Client-Zertifikate gegen die Zertifikatsperrlisten (CRLs)
erfolgreich sein muss. Die Vorgabe ist @samp{#t}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck ssl-verify-client-cert?
Ob der Client gebeten wird, ein Zertifikat zu schicken. Wenn Sie es auch
verpflichtend machen wollen, setzen Sie @samp{auth-ssl-require-client-cert?
#t} im Autorisierungsabschnitt. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette ssl-cert-username-field
Welches Feld im Zertifikat den Benutzernamen angibt. In der Regel wählt man
den Gebräuchlichen Namen „commonName“ oder den Eindeutigen Identifikator
„x500UniqueIdentifier“ als Benutzernamen, wenn man Client-Zertifikate
benutzt. Sie müssen dann auch @samp{auth-ssl-username-from-cert? #t}
setzen. Die Vorgabe ist @samp{"commonName"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette ssl-min-protocol
Die kleinste Version des SSL-Protokolls, die noch akzeptiert werden
soll. Die Vorgabe ist @samp{"TLSv1"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette ssl-cipher-list
Welche SSL-Ciphers benutzt werden dürfen. Die Vorgabe ist
@samp{"ALL:!kRSA:!SRP:!kDHd:!DSS:!aNULL:!eNULL:!EXPORT:!DES:!3DES:!MD5:!PSK:!RC4:!ADH:!LOW@@STRENGTH"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette ssl-crypto-device
Das SSL-Verschlüsselungsgerät („Crypto Device“), das benutzt werden
soll. Gültige Werte bekommen Sie gezeigt, wenn Sie „openssl engine“
ausführen. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette postmaster-address
An welche Adresse Mails versandt werden sollen, die über die Zurückweisung
einer Mail informieren. %d wird zur Domain des Empfängers umgeschrieben. Die
Vorgabe ist @samp{"postmaster@@%d"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette hostname
Der Rechnername, der an mehreren Stellen in versandten E-Mails (z.B.@: im
Nachrichtenidentifikator „Message-Id“) und in LMTP-Antworten benutzt
wird. Die Voreinstellung entspricht dem wirklichen Rechnernamen des
Systems. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck quota-full-tempfail?
Ob bei einem Nutzer, der sein Kontingent überschreitet, ein temporärer
Fehler gemeldet werden soll, statt Nachrichten zurück zu versenden (zu
„bouncen“). Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Dateiname sendmail-path
Welche Binärdatei zum Versenden von Mails benutzt werden soll. Die Vorgabe
ist @samp{"/usr/sbin/sendmail"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette submission-host
Wenn dieses Feld nicht leer ist, werden Mails an den SMTP-Server auf dem
angegebenen „Rechner[:Port]“ statt an sendmail geschickt. Die Vothabe ist
@samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette rejection-subject
Die Betreffkopfzeile („Subject:“), die für Mails benutzt werden soll, die
über die Zurückweisung einer Mail informieren. Sie können dieselben
Variablen wie beim hierunter beschriebenen Zurückweisungsgrund
@samp{rejection-reason} benutzen. Die Vorgabe ist @samp{"Rejected: %s"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette rejection-reason
Die menschenlesbare Fehlermeldung in Mails, die über die Zurückweisung einer
Mail informieren. Sie können diese Variablen benutzen:

@table @code
@item %n
CRLF-Zeilenumbruch
@item %r
Begründung („Reason“)
@item %s
Ursprünglicher Betreff („Subject“)
@item %t
Empfänger („To“)
@end table
Die Vorgabe ist @samp{"Your message to <%t> was automatically
rejected:%n%r"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette recipient-delimiter
Trennzeichen zwischen dem eigentlichen Lokalteil („local-part“) und
Detailangaben in der E-Mail-Adresse. Die Vorgabe ist @samp{"+"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette lda-original-recipient-header
Aus welcher Kopfzeile die Adresse des Ursprünglichen Empfängers (SMTPs „RCPT
TO:“-Adresse) genommen wird, wenn sie nicht anderweitig eingetragen
ist. Wird die Befehlszeilenoption @option{-a} von dovecot-lda angegeben, hat
sie Vorrang vor diesem Feld. Oft wird die Kopfzeile X-Original-To hierfür
verwendet. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck lda-mailbox-autocreate?
Ob ein nicht existierendes Postfach (eine „Mailbox“) automatisch erzeugt
werden soll, wenn eine Mail darin abgespeichert wird. Die Vorgabe ist
@samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Boolescher-Ausdruck lda-mailbox-autosubscribe?
Ob automatisch erzeugte Postfächer („Mailboxes“) auch automatisch abonniert
werden sollen. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Nichtnegative-ganze-Zahl imap-max-line-length
Die maximale Länge einer IMAP-Befehlszeile. Manche Clients erzeugen sehr
lange Befehlszeilen bei riesigen Postfächern, daher müssen Sie diesen Wert
gegebenenfalls anheben, wenn Sie Fehlermeldungen wie „Too long argument“
oder „IMAP command line too large“ häufig sehen. Die Vorgabe ist
@samp{64000}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette imap-logout-format
Formatzeichenkette für das Abmelden bei IMAP:
@table @code
@item %i
Gesamtzahl vom Client empfangener Bytes
@item %o
Gesamtzahl zum Client versandter Bytes
@end table
Siehe @file{doc/wiki/Variables.txt} für eine Liste aller Variablen, die Sie
benutzen können. Die Vorgabe ist @samp{"in=%i out=%o deleted=%@{deleted@}
expunged=%@{expunged@} trashed=%@{trashed@} hdr_count=%@{fetch_hdr_count@}
hdr_bytes=%@{fetch_hdr_bytes@} body_count=%@{fetch_body_count@}
body_bytes=%@{fetch_body_bytes@}"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette imap-capability
Ersetzt die Antworten auf IMAP-CAPABILITY-Anfragen. Wenn der Wert mit „+“
beginnt, werden die angegebenen Capabilitys zu den voreingestellten
hinzugefügt (z.B.@: +XFOO XBAR). Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette imap-idle-notify-interval
Wie lange zwischen „OK Still here“-Benachrichtigungen gewartet wird, wenn
der Client auf IDLE steht. Die Vorgabe ist @samp{"2 mins"}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette imap-id-send
ID-Feldnamen und -werte, die an Clients versandt werden sollen. Wenn * als
der Wert angegeben wird, benutzt Dovecot dafür den voreingestellten
Wert. Die folgenden Felder verfügen derzeit über voreingestellte Werte:
name, version, os, os-version, support-url, support-email. Die Vorgabe ist
@samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette imap-id-log
Welche vom Client übermittelten ID-Felder protokolliert werden. * bedeutet
alle. Die Vorgabe ist @samp{""}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste imap-client-workarounds
Maßnahmen, um verschiedene Fehler in Clients zu umgehen:

@table @code
@item delay-newmail
Benachrichtigungen über neue Mails mit EXISTS/RECENT nur als Antwort auf
NOOP- und CHECK-Befehle versenden. Manche Clients ignorieren diese
ansonsten, zum Beispiel OSX Mail (<v2.1). Outlook Express verhält sich noch
problematischer, denn ohne diese Maßnahme können dem Anwender
Fehlermeldungen wie „Die Nachricht steht nicht mehr auf dem Server zur
Verfügung“ („Message no longer in server“) angezeigt werden. Beachten Sie,
dass OE6 auch mit dieser Maßnahme immer noch Probleme macht, wenn die
Synchronisation auf „nur Kopfzeilen“ („Headers Only“) eingestellt ist.

@item tb-extra-mailbox-sep
Thunderbird kommt aus irgendeinem Grund durcheinander bei LAYOUT=fs (mbox
und dbox) und fügt überzählige @samp{/}-Suffixe an Postfachnamen
(„Mailbox“-Namen) an. Mit dieser Maßnahme ignoriert Dovecot zusätzliche
@samp{/}, statt sie als ungültige Postfachnamen zu behandeln.

@item tb-lsub-flags
Ob \Noselect-Flags für LSUB-Antworten mit LAYOUT=fs (z.B.@: mbox) geliefert
werden. Dadurch merkt Thunderbird, dass man Postfächer nicht auswählen kann,
und zeigt sie ausgegraut an, statt erst nach einiger Zeit eine Fehlermeldung
einzublenden, sie seien nicht auswählbar.
@end table
Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{dovecot-configuration}-Parameter} Zeichenkette imap-urlauth-host
Welcher Rechner in vom Client übermittelten URLAUTH-URLs zugelassen
wird. Bei „*“ wird jeder zugelassen. Die Vorgabe ist @samp{""}.
@end deftypevr


Uff! Das waren viele Konfigurationsoptionen. Das Schöne daran ist aber, dass
Guix eine vollständige Schnittstelle für alles bietet, was man in Dovecots
Konfigurationssprache ausdrücken kann. Damit können Sie Konfigurationen
nicht nur auf schöne Art aufschreiben, sondern kann auch reflektiven Code
schreiben, der Konfigurationen aus Scheme heraus auslesen und umschreiben
kann.

Vielleicht haben Sie aber auch einfach schon eine @code{dovecot.conf}, die
Sie mit Guix zum Laufen bringen möchten. In diesem Fall können Sie eine
@code{opaque-dovecot-configuration} im @code{#:config}-Parameter an
@code{dovecot-service} übergeben. Wie der Name schon sagt, bietet eine opake
Konfiguration keinerlei Unterstützung für Reflexion.

Verfügbare @code{opaque-dovecot-configuration}-Felder sind:

@deftypevr {@code{opaque-dovecot-configuration}-Parameter} „package“ dovecot
Das Dovecot-Paket.
@end deftypevr

@deftypevr {@code{opaque-dovecot-configuration}-Parameter} Zeichenkette string
Der Inhalt der @code{dovecot.conf} als eine Zeichenkette.
@end deftypevr

Wenn Ihre @code{dovecot.conf} zum Beispiel nur aus der leeren Zeichenkette
bestünde, könnten Sie einen Dovecot-Dienst wie folgt instanziieren:

@lisp
(dovecot-service #:config
                 (opaque-dovecot-configuration
                  (string "")))
@end lisp

@subsubheading OpenSMTPD-Dienst

@defvar opensmtpd-service-type
Dies ist der Diensttyp des @uref{https://www.opensmtpd.org,
OpenSMTPD-Dienstes}, dessen Wert ein @code{opensmtpd-configuration}-Objekt
sein sollte, wie in diesem Beispiel:

@lisp
(service opensmtpd-service-type
         (opensmtpd-configuration
           (config-file (local-file "./my-smtpd.conf"))))
@end lisp
@end defvar

@deftp {Datentyp} opensmtpd-configuration
Datentyp, der die Konfiguration von opensmtpd repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @var{opensmtpd})
Das Paketobjekt des SMTP-Servers OpenSMTPD.

@item @code{shepherd-requirement} (Vorgabe: @code{'()})
Mit dieser Option können Sie als eine Liste von Symbolen zusätzliche
Shepherd-Dienste benennen, von welchen dieser Dienst abhängen
soll. Beispielsweise geben Sie hier @code{'networking} an, damit OpenSMTPD
auch auf anderen Schnittstellen als Loopback lauschen kann.

@item @code{config-file} (Vorgabe: @code{%default-opensmtpd-config-file})
Ein dateiartiges Objekt der OpenSMTPD-Konfigurationsdatei, die benutzt
werden soll. Nach Vorgabe lauscht OpenSMTPD auf der
Loopback-Netzwerkschnittstelle und ist so eingerichtet, dass Mail von
Nutzern und Daemons auf der lokalen Maschine sowie E-Mails an entfernte
Server versandt werden können. Führen Sie @command{man smtpd.conf} aus, wenn
Sie mehr erfahren möchten.

@item @code{log-file} (default: @code{"/var/log/mail.log"})
The file location for the OpenSMTPD log file.  Logging occurs in the
foreground via the Shepherd, i.e. OpenSMTPD does not detach.  When set to
@code{#f} OpenSMTPD will instead detach and log to the syslog.

@item @code{setgid-commands?} (Vorgabe: @code{#t})
Dadurch werden die folgenden Befehle setgid als @code{smtpq}, damit sie
ausgeführt werden können: @command{smtpctl}, @command{sendmail},
@command{send-mail}, @command{makemap}, @command{mailq} und
@command{newaliases}. Siehe @ref{Privilegierte Programme} für mehr Informationen
zu setgid-Programmen.
@end table
@end deftp

@subsubheading Exim-Dienst

@cindex Mail Transfer Agent (MTA)
@cindex MTA (Mail Transfer Agent)
@cindex SMTP

@defvar exim-service-type
Dies ist der Diensttyp für den Mail Transfer Agent (MTA) namens
@uref{https://exim.org, Exim}, dessen Wert ein
@code{exim-configuration}-Objekt sein sollte, wie in diesem Beispiel:

@lisp
(service exim-service-type
         (exim-configuration
           (config-file (local-file "./my-exim.conf"))))
@end lisp
@end defvar

Um einen Dienst vom Typ @code{exim-service-type} zu benutzen, müssen Sie
auch einen Dienst @code{mail-aliases-service-type} in Ihrer
@code{operating-system}-Deklaration stehen haben (selbst wenn darin keine
Alias-Namen eingerichtet sind).

@deftp {Datentyp} exim-configuration
Der Datentyp, der die Konfiguration von Exim repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @var{exim})
Das Paketobjekt des Exim-Servers.

@item @code{config-file} (Vorgabe: @code{#f})
Ein dateiartiges Objekt der Exim-Konfigurationsdatei. Wenn sein Wert
@code{#f} ist, wird die vorgegebene Konfigurationsdatei aus dem als
@code{package} angegebenen Paket benutzt. Die sich ergebende
Konfigurationsdatei wird geladen, nachdem die Konfigurationsvariablen
@code{exim_user} und @code{exim_group} gesetzt wurden.

@end table
@end deftp

@subsubheading Getmail-Dienst

@cindex IMAP
@cindex POP

@defvar getmail-service-type
Dies ist der Diensttyp des Mail-Retrievers
@uref{http://pyropus.ca/software/getmail/, Getmail}, der als Wert ein
@code{getmail-configuration}-Objekt hat.
@end defvar

Verfügbare @code{getmail-configuration}-Felder sind:

@deftypevr {@code{getmail-configuration}-Parameter} Zeichenkette name
Ein Symbol, das den getmail-Dienst identifiziert.

Die Vorgabe ist @samp{"unset"}.

@end deftypevr

@deftypevr {@code{getmail-configuration}-Parameter} „package“ package
Das getmail-Paket, das benutzt werden soll.

@end deftypevr

@deftypevr {@code{getmail-configuration}-Parameter} Zeichenkette user
Das Benutzerkonto, mit dem getmail ausgeführt wird.

Die Vorgabe ist @samp{"getmail"}.

@end deftypevr

@deftypevr {@code{getmail-configuration}-Parameter} Zeichenkette group
Die Benutzergruppe, mit der getmail ausgeführt wird.

Die Vorgabe ist @samp{"getmail"}.

@end deftypevr

@deftypevr {@code{getmail-configuration}-Parameter} Zeichenkette directory
Welches getmail-Verzeichnis benutzt werden soll.

Die Vorgabe ist @samp{"/var/lib/getmail/default"}.

@end deftypevr

@deftypevr {@code{getmail-configuration}-Parameter} „getmail-configuration-file“ rcfile
Die zu benutzende getmail-Konfigurationsdatei.

Verfügbare @code{getmail-configuration-file}-Felder sind:

@deftypevr {@code{getmail-configuration-file}-Parameter} „getmail-retriever-configuration“ retriever
Von welchem E-Mail-Konto Mails bezogen werden sollen und wie auf dieses
zugegriffen werden kann.

Verfügbare @code{getmail-retriever-configuration}-Felder sind:

@deftypevr {@code{getmail-retriever-configuration}-Parameter} Zeichenkette type
Welche Art von Mail-Retriever benutzt werden soll. Zu den gültigen Werten
gehören @samp{passwd} und @samp{static}.

Die Vorgabe ist @samp{"SimpleIMAPSSLRetriever"}.

@end deftypevr

@deftypevr {@code{getmail-retriever-configuration}-Parameter} Zeichenkette server
Der Benutzername, mit dem man sich beim Mailserver anmeldet.

Die Vorgabe ist @samp{unset}.

@end deftypevr

@deftypevr {@code{getmail-retriever-configuration}-Parameter} Zeichenkette username
Der Benutzername, mit dem man sich beim Mailserver anmeldet.

Die Vorgabe ist @samp{unset}.

@end deftypevr

@deftypevr {@code{getmail-retriever-configuration}-Parameter} Nichtnegative-ganze-Zahl port
Die Portnummer, mit der eine Verbindung hergestellt wird.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{getmail-retriever-configuration}-Parameter} Zeichenkette password
Einträge, die Vorrang vor den Feldern aus passwd haben.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{getmail-retriever-configuration}-Parameter} Liste password-command
Einträge, die Vorrang vor den Feldern aus passwd haben.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@deftypevr {@code{getmail-retriever-configuration}-Parameter} Zeichenkette keyfile
Der Schlüssel im PEM-Format, der für das Aufbauen der TLS-Verbindung genutzt
werden soll.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{getmail-retriever-configuration}-Parameter} Zeichenkette certfile
Die Zertifikatsdatei im PEM-Format, die für das Aufbauen der TLS-Verbindung
genutzt werden soll.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{getmail-retriever-configuration}-Parameter} Zeichenkette ca-certs
Welche Zertifikate von Zertifikatsautoritäten („CA Certificates“) benutzt
werden sollen.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{getmail-retriever-configuration}-Parameter} Parameter-Assoziative-Liste extra-parameters
Weitere Parameter für den Retriever.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@end deftypevr

@deftypevr {@code{getmail-configuration-file}-Parameter} „getmail-destination-configuration“ destination
Was mit geholten Nachrichten geschehen soll.

Verfügbare @code{getmail-destination-configuration}-Felder sind:

@deftypevr {@code{getmail-destination-configuration}-Parameter} Zeichenkette type
Die Art des Empfängers der Mail. Zu den gültigen Werten gehören
@samp{Maildir}, @samp{Mboxrd} und @samp{MDA_external}.

Die Vorgabe ist @samp{unset}.

@end deftypevr

@deftypevr {@code{getmail-destination-configuration}-Parameter} Zeichenkette-oder-Dateiartiges-Objekt path
Entspricht der path-Option für den Mailempfänger („Destination“). Was
hiermit bewirkt wird, hängt von der gewählten Empfängerart ab.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{getmail-destination-configuration}-Parameter} Parameter-Assoziative-Liste extra-parameters
Weitere Empfängerparameter.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@end deftypevr

@deftypevr {@code{getmail-configuration-file}-Parameter} „getmail-options-configuration“ options
getmail konfigurieren.

Verfügbare @code{getmail-options-configuration}-Felder sind:

@deftypevr {@code{getmail-options-configuration}-Parameter} Nichtnegative-ganze-Zahl verbose
Wenn es auf @samp{0} gesetzt ist, wird getmail nur Warnungen und Fehler
ausgeben. Ein Wert von @samp{1} bedeutet, dass Meldungen über das Holen und
Löschen von Nachrichten ausgegeben werden. Wenn es auf @samp{2} gesetzt ist,
wird getmail Meldungen über jede durchgeführte Aktion ausgeben.

Die Vorgabe ist @samp{1}.

@end deftypevr

@deftypevr {@code{getmail-options-configuration}-Parameter} Boolescher-Ausdruck read-all
Wenn es auf wahr gesetzt ist, wird getmail alle verfügbaren Nachrichten
holen. Andernfalls wird es nur solche Nachrichten holen, die es nicht
bereits gesehen hat.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{getmail-options-configuration}-Parameter} Boolescher-Ausdruck delete
Wenn es auf wahr gesetzt ist, werden Mitteilungen vom Server gelöscht,
nachdem sie erfolgreich geholt und zugestellt wurden. Andernfalls werden
Nachrichten auf dem Server gelassen.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{getmail-options-configuration}-Parameter} Nichtnegative-ganze-Zahl delete-after
Getmail wird nach der hier angegebenen Anzahl von Tagen Nachrichten löschen,
die es gesehen hat, wenn sie zugestellt wurden. Dadurch werden Nachrichten
diese Anzahl von Tagen lang auf dem Server gelassen, nachdem sie zugestellt
wurden. Ein Wert von @samp{0} deaktiviert diese Funktionalität.

Die Vorgabe ist @samp{0}.

@end deftypevr

@deftypevr {@code{getmail-options-configuration}-Parameter} Nichtnegative-ganze-Zahl delete-bigger-than
Nachrichten, die größer als die angegebene Anzahl von Bytes sind, nach dem
Holen löschen, selbst wenn die Optionen delete und delete-after abgeschaltet
sind. Ein Wert von @samp{0} deaktiviert diese Funktionalität.

Die Vorgabe ist @samp{0}.

@end deftypevr

@deftypevr {@code{getmail-options-configuration}-Parameter} Nichtnegative-ganze-Zahl max-bytes-per-session
Nachrichten, die höchstens die angegebene Anzahl von Bytes groß sind, vor
dem Beenden der Serversitzung von dort holen. Ein Wert von @samp{0}
deaktiviert diese Funktionalität.

Die Vorgabe ist @samp{0}.

@end deftypevr

@deftypevr {@code{getmail-options-configuration}-Parameter} Nichtnegative-ganze-Zahl max-message-size
@emph{Keine} Nachrichten holen, deren Größe die angegebene Anzahl von Bytes
überschreitet. Ein Wert von @samp{0} deaktiviert diese Funktionalität.

Die Vorgabe ist @samp{0}.

@end deftypevr

@deftypevr {@code{getmail-options-configuration}-Parameter} Boolescher-Ausdruck delivered-to
Wenn dies auf wahr gesetzt ist, fügt getmail eine Delivered-To-Kopfzeile an
die Nachrichten an.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{getmail-options-configuration}-Parameter} Boolescher-Ausdruck received
Wenn dies gesetzt ist, fügt getmail eine Received-Kopfzeile an die
Nachrichten an.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{getmail-options-configuration}-Parameter} Zeichenkette message-log
Getmail wird seine Aktionen in die genannte Datei protokollieren. Wenn als
Wert @samp{""} angegeben wird, wird diese Funktionalität deaktiviert.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{getmail-options-configuration}-Parameter} Boolescher-Ausdruck message-log-syslog
Wenn es auf wahr gesetzt ist, wird getmail ein Protokoll seiner Aktionen an
den Systemprotokolldienst übergeben.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{getmail-options-configuration}-Parameter} Boolescher-Ausdruck message-log-verbose
Wenn dies auf wahr gesetzt ist, wird getmail Informationen über @emph{nicht}
geholte Nachrichten und den jeweiligen Grund dafür sowie Anfang und Ende des
Holvorgangs in Informationszeilen protokollieren.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{getmail-options-configuration}-Parameter} Parameter-Assoziative-Liste extra-parameters
Weitere geltende Optionen.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@end deftypevr

@end deftypevr

@deftypevr {@code{getmail-configuration}-Parameter} Liste idle
Eine Liste der Postfächer, für die getmail beim Server auf
Benachrichtigungen wegen neuer Mails warten soll. Diese Funktionalität setzt
voraus, dass der Server die IDLE-Erweiterung unterstützt.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@deftypevr {@code{getmail-configuration}-Parameter} Liste environment-variables
Umgebungsvariable, die für getmail gelten sollen.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@subsubheading Dienst für Mail-Alias-Namen

@cindex E-Mail-Alias-Namen
@cindex Alias-Namen, für E-Mail-Adressen

@defvar mail-aliases-service-type
Das ist der Typ des Dienstes, der @code{/etc/aliases} zur Verfügung stellt,
wo festgelegt wird, wie Mail-Nachrichten an Benutzer des Systems geliefert
werden.

@lisp
(service mail-aliases-service-type
         '(("postmaster" "bob")
           ("bob" "bob@@example.com" "bob@@example2.com")))
@end lisp
@end defvar

Die Konfiguration für einen Dienst vom Typ @code{mail-aliases-service-type}
ist eine assoziative Liste, die angibt, wie beim System ankommende
Mail-Nachrichten zuzustellen sind. Jeder Eintrag hat die Form @code{(Alias
Adressen ...)}, wobei das @code{Alias} den lokalen Alias-Namen angibt und
@code{Adressen} angibt, wo die Mail-Nachrichten für diesen Benutzer ankommen
sollen.

Die Alias-Namen müssen nicht als Benutzerkonten auf dem lokalen System
existieren. Im Beispiel oben muss es also keinen Eintrag für
@code{postmaster} unter den @code{user-accounts} in der
@code{operating-system}-Deklaration geben, um die @code{postmaster}-Mails an
@code{bob} weiterzuleiten (von wo diese dann an @code{bob@@example.com} und
@code{bob@@example2.com} weitergeschickt würden).

@subsubheading GNU-Mailutils-IMAP4-Daemon
@cindex GNU-Mailutils-IMAP4-Daemon

@defvar imap4d-service-type
Dies ist der Diensttyp für den IMAP4-Daemon aus den GNU Mailutils (siehe
@ref{imap4d,,, mailutils, GNU Mailutils Manual}), dessen Wert ein
@code{imap4d-configuration}-Objekt sein sollte, wie in diesem Beispiel:

@lisp
(service imap4d-service-type
         (imap4d-configuration
           (config-file (local-file "imap4d.conf"))))
@end lisp
@end defvar

@deftp {Datentyp} imap4d-configuration
Datentyp, der die Konfiguration von @command{imap4d} repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @code{mailutils})
Das Paket, das @command{imap4d} zur Verfügung stellt.

@item @code{config-file} (Vorgabe: @code{%default-imap4d-config-file})
Dateiartiges Objekt der zu nutzenden Konfigurationsdatei. Nach Vorgabe
lauscht IMAP4D auf TCP-Port 143 vom lokalen Rechner @code{localhost}. Siehe
@ref{Conf-imap4d,,, mailutils, GNU Mailutils Manual} für Details.

@end table
@end deftp

@subsubheading Radicale-Dienst
@cindex CalDAV
@cindex CardDAV

@defvar radicale-service-type
This is the type of the @uref{https://radicale.org, Radicale} CalDAV/CardDAV
server whose value should be a @code{radicale-configuration}.  The default
configuration matches the @uref{https://radicale.org/v3.html#configuration,
upstream documentation}.
@end defvar

@deftp {Datentyp} radicale-configuration
Data type representing the configuration of @command{radicale}.  Available
@code{radicale-configuration} fields are:

@table @asis
@item @code{package} (default: @code{radicale}) (type: package)
Package that provides @command{radicale}.

@item @code{auth} (default: @code{'()}) (type: radicale-auth-configuration)
Configuration for auth-related variables.

@deftp {Data Type} radicale-auth-configuration
Data type representing the @code{auth} section of a @command{radicale}
configuration file.  Available @code{radicale-auth-configuration} fields
are:

@table @asis
@item @code{type} (default: @code{'none}) (type: symbol)
The method to verify usernames and passwords.  Options are @code{none},
@code{htpasswd}, @code{remote-user}, and @code{http-x-remote-user}.  This
value is tied to @code{htpasswd-filename} and @code{htpasswd-encryption}.

@item @code{htpasswd-filename} (default: @code{"/etc/radicale/users"}) (type: file-name)
Path to the htpasswd file.  Use htpasswd or similar to generate this file.

@item @code{htpasswd-encryption} (default: @code{'md5}) (type: symbol)
Encryption method used in the htpasswd file.  Options are @code{plain},
@code{bcrypt}, and @code{md5}.

@item @code{delay} (default: @code{1}) (type: non-negative-integer)
Average delay after failed login attempts in seconds.

@item @code{realm} (default: @code{"Radicale - Password Required"}) (type: string)
Message displayed in the client when a password is needed.

@end table

@end deftp

@item @code{encoding} (default: @code{'()}) (type: radicale-encoding-configuration)
Configuration for encoding-related variables.

@deftp {Data Type} radicale-encoding-configuration
Data type representing the @code{encoding} section of a @command{radicale}
configuration file.  Available @code{radicale-encoding-configuration} fields
are:

@table @asis
@item @code{request} (default: @code{'utf-8}) (type: symbol)
Encoding for responding requests.

@item @code{stock} (default: @code{'utf-8}) (type: symbol)
Encoding for storing local collections.

@end table

@end deftp

@item @code{headers-file} (default: none) (type: file-like)
Custom HTTP headers.

@item @code{logging} (default: @code{'()}) (type: radicale-logging-configuration)
Configuration for logging-related variables.

@deftp {Data Type} radicale-logging-configuration
Data type representing the @code{logging} section of a @command{radicale}
configuration file.  Available @code{radicale-logging-configuration} fields
are:

@table @asis
@item @code{level} (default: @code{'warning}) (type: symbol)
Set the logging level.  One of @code{debug}, @code{info}, @code{warning},
@code{error}, or @code{critical}.

@item @code{mask-passwords?} (default: @code{#t}) (type: boolean)
Whether to include passwords in logs.

@end table

@end deftp

@item @code{rights} (default: @code{'()}) (type: radicale-rights-configuration)
Configuration for rights-related variables.  This should be a
@code{radicale-rights-configuration}.

@deftp {Data Type} radicale-rights-configuration
Data type representing the @code{rights} section of a @command{radicale}
configuration file.  Available @code{radicale-rights-configuration} fields
are:

@table @asis
@item @code{type} (default: @code{'owner-only}) (type: symbol)
Backend used to check collection access rights.  The recommended backend is
@code{owner-only}.  If access to calendars and address books outside the
home directory of users is granted, clients won't detect these collections
and will not show them to the user.  Choosing any other method is only
useful if you access calendars and address books directly via URL.  Options
are @code{authenticate}, @code{owner-only}, @code{owner-write}, and
@code{from-file}.

@item @code{file} (default: @code{""}) (type: file-name)
File for the rights backend @code{from-file}.

@end table

@end deftp

@item @code{server} (default: @code{'()}) (type: radicale-server-configuration)
Configuration for server-related variables.  Ignored if WSGI is used.

@deftp {Data Type} radicale-server-configuration
Data type representing the @code{server} section of a @command{radicale}
configuration file.  Available @code{radicale-server-configuration} fields
are:

@table @asis
@item @code{hosts} (default: @code{(list "localhost:5232")}) (type: list-of-ip-addresses)
List of IP addresses that the server will bind to.

@item @code{max-connections} (default: @code{8}) (type: non-negative-integer)
Maximum number of parallel connections.  Set to 0 to disable the limit.

@item @code{max-content-length} (default: @code{100000000}) (type: non-negative-integer)
Maximum size of the request body in bytes.

@item @code{timeout} (default: @code{30}) (type: non-negative-integer)
Socket timeout in seconds.

@item @code{ssl?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Whether to enable transport layer encryption.

@item @code{certificate} (default: @code{"/etc/ssl/radicale.cert.pem"}) (type: file-name)
Path of the SSL certificate.

@item @code{key} (default: @code{"/etc/ssl/radicale.key.pem"}) (type: file-name)
Path to the private key for SSL.  Only effective if @code{ssl?} is
@code{#t}.

@item @code{certificate-authority} (default: @code{""}) (type: file-name)
Path to CA certificate for validating client certificates.  This can be used
to secure TCP traffic between Radicale and a reverse proxy.  If you want to
authenticate users with client-side certificates, you also have to write an
authentication plugin that extracts the username from the certificate.

@end table

@end deftp

@item @code{storage} (default: @code{'()}) (type: radicale-storage-configuration)
Configuration for storage-related variables.

@deftp {Data Type} radicale-storage-configuration
Data type representing the @code{storage} section of a @command{radicale}
configuration file.  Available @code{radicale-storage-configuration} fields
are:

@table @asis
@item @code{type} (default: @code{'multifilesystem}) (type: symbol)
Backend used to store data.  Options are @code{multifilesystem} and
@code{multifilesystem-nolock}.

@item @code{filesystem-folder} (default: @code{"/var/lib/radicale/collections"}) (type: file-name)
Folder for storing local collections.  Created if not present.

@item @code{max-sync-token-age} (default: @code{2592000}) (type: non-negative-integer)
Delete sync-tokens that are older than the specified time in seconds.

@item @code{hook} (default: @code{""}) (type: string)
Command run after changes to storage.

@end table

@end deftp

@item @code{web-interface?} (default: @code{#t}) (type: boolean)
Whether to use Radicale's built-in web interface.

@end table

@end deftp

@subsubheading Rspamd-Dienst
@cindex email
@cindex Spam

@defvar rspamd-service-type
Dies ist der Diensttyp des Spamfiltersystems @uref{https://rspamd.com/,
Rspamd}, der als Wert ein @code{rspamd-configuration}-Objekt hat.
@end defvar

@c %start of fragment

@deftp {Datentyp} rspamd-configuration
Verfügbare @code{rspamd-configuration}-Felder sind:

@table @asis
@item @code{package} (Vorgabe: @code{rspamd}) (Typ: dateiartig)
Das Paket, das rspamd zur Verfügung stellt.

@item @code{config-file} (Vorgabe: @code{%default-rspamd-config-file}) (Typ: dateiartig)
File-like object of the configuration file to use.  By default all workers
are enabled except fuzzy and they are bound to their usual ports, e.g
localhost:11334, localhost:11333 and so on

@item @code{local.d-files} (Vorgabe: @code{'()}) (Typ: Verzeichnisbaum)
Die Konfigurationsdateien, die in local.d platziert werden, angegeben als
eine Liste von zweielementigen Listen, deren erstes Element der dort zu
benutzende Dateiname ist und deren zweites Element ein dateiartiges Objekt
ist. Die in diesen Dateien hinterlegten Einstellungen ergänzen die
Vorgabeeinstellungen.

@item @code{override.d-files} (Vorgabe: @code{'()}) (Typ: Verzeichnisbaum)
Die Konfigurationsdateien, die in override.d platziert werden, angegeben als
eine Liste von zweielementigen Listen, deren erstes Element der dort zu
benutzende Dateiname ist und deren zweites Element ein dateiartiges Objekt
ist. Die in diesen Dateien hinterlegten Einstellungen haben Vorrang vor den
Vorgabeeinstellungen.

@item @code{user} (Vorgabe: @code{%default-rspamd-account}) (Typ: Benutzerkonto)
Das Benutzerkonto, mit dem rspamd ausgeführt wird.

@item @code{group} (Vorgabe: @code{%default-rspamd-group}) (Typ: Benutzergruppe)
Die Benutzergruppe, mit der rspamd ausgeführt wird.

@item @code{debug?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Die Ausgabe von Informationen zur Fehlersuche erzwingen.

@item @code{insecure?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ob ignoriert werden soll, wenn das Benutzerkonto für Worker-Komponenten
erhöhte Berechtigungen hat.

@item @code{skip-template?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ob Platzhalter mit der Template-Engine Jinja erkannt werden.

@item @code{shepherd-requirements} (default: @code{(user-processes loopback)}) (type: list-of-symbols)
Eine Liste von Symbolen, die andere Shepherd-Dienste angeben, von denen
dieser Dienst abhängen soll.

@end table

@end deftp


@c %end of fragment

@node Kurznachrichtendienste
@subsection Kurznachrichtendienste

@cindex Messaging
@cindex Jabber
@cindex XMPP
Das Modul @code{(gnu services messaging)} stellt Guix-Dienstdefinitionen für
Kurznachrichtendienste, d.h.@: „Instant Messaging“, zur Verfügung. Zurzeit
werden folgende Dienste unterstützt:

@subsubheading Prosody-Dienst

@defvar prosody-service-type
Dies ist der Diensttyp für den @uref{https://prosody.im,
XMPP-Kommunikationsserver Prosody}. Sein Wert muss ein
@code{prosody-configuration}-Verbundsobjekt wie in diesem Beispiel sein:

@lisp
(service prosody-service-type
         (prosody-configuration
          (modules-enabled (cons* "groups" "mam" %default-modules-enabled))
          (int-components
           (list
            (int-component-configuration
             (hostname "conference.example.net")
             (plugin "muc")
             (mod-muc (mod-muc-configuration)))))
          (virtualhosts
           (list
            (virtualhost-configuration
             (domain "example.net"))))))
@end lisp

Siehe im Folgenden Details über die @code{prosody-configuration}.

@end defvar

Prosody kann mit den Vorgabeeinstellungen ohne viel weitere Konfiguration
benutzt werden. Nur ein @code{virtualhosts}-Feld wird gebraucht: Es legt die
Domain fest, um die sich Prosody kümmert.

Sie können die Korrektheit der generierten Konfigurationsdatei überprüfen,
indem Sie den Befehl @code{prosodyctl check} ausführen.

Prosodyctl hilft auch dabei, Zertifikate aus dem
@code{letsencrypt}-Verzeichnis zu importieren, so dass das
@code{prosody}-Benutzerkonto auf sie Zugriff hat. Siehe
@url{https://prosody.im/doc/letsencrypt}.

@example
prosodyctl --root cert import /etc/certs
@end example

Im Folgenden finden Sie die verfügbaren Konfigurationsparameter. Jeder
Parameterdefinition ist ihr Typ vorangestellt; zum Beispiel bedeutet
@samp{Zeichenketten-Liste foo}, dass der Parameter @code{foo} als Liste von
Zeichenketten angegeben werden sollte. Typangaben, die mit
@code{Vielleicht-} beginnen, stehen für Parameter, die in
@code{prosody.cfg.lua} @emph{nicht} vorkommen, falls deren Wert @emph{nicht}
angegeben wurde.

Sie können die Konfiguration auch als eine Zeichenkette festlegen, wenn Sie
über eine alte @code{prosody.cfg.lua}-Datei verfügen, die Sie von einem
anderen System übernehmen möchten; siehe das Ende dieses Abschnitts für
Details.

Der Typ @code{Dateiobjekt} bezeichnet hierbei entweder ein dateiartiges
Objekt (siehe @ref{G-Ausdrücke, dateiartige Objekte}) oder einen
Dateinamen.

@c The following documentation was initially generated by
@c (generate-documentation) in (gnu services messaging).  Manually maintained
@c documentation is better, so we shouldn't hesitate to edit below as
@c needed.  However if the change you want to make to this documentation
@c can be done in an automated way, it's probably easier to change
@c (generate-documentation) than to make it below and have to deal with
@c the churn as Prosody updates.

Verfügbare @code{prosody-configuration}-Felder sind:

@deftypevr {@code{prosody-configuration}-Parameter} „package“ prosody
Das Prosody-Paket.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Dateiname data-path
Der Ort, wo sich Prosodys Verzeichnis zum Speichern von Daten befinden
soll. Siehe @url{https://prosody.im/doc/configure}. Die Vorgabe ist
@samp{"/var/lib/prosody"}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Dateiobjekt-Liste plugin-paths
Zusätzliche Plugin-Verzeichnisse. Plugins werden der Reihe nach in allen
festgelegten Pfaden gesucht. Siehe
@url{https://prosody.im/doc/plugins_directory}. Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Dateiname certificates
Jeder virtuellte Rechner und jede Komponente braucht ein Zertifikat, mit dem
Clients und Server ihre Identität sicher verifizieren können. Prosody lädt
automatisch Zertifikate bzw.@: Schlüssel aus dem hier angegebenen
Verzeichnis. Die Vorgabe ist @samp{"/etc/prosody/certs"}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Zeichenketten-Liste admins
Dies ist eine Liste der Benutzerkonten, die auf diesem Server
Administratoren sind. Beachten Sie, dass Sie die Benutzerkonten noch separat
als Nutzer erzeugen lassen müssen. Siehe @url{https://prosody.im/doc/admins}
and @url{https://prosody.im/doc/creating_accounts}. Ein Beispiel:
@code{(admins '("user1@@example.com" "user2@@example.net"))} Die Vorgabe ist
@samp{'()}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Boolescher-Ausdruck use-libevent?
Die Nutzung von libevent aktivieren, damit bessere Leistungsfähigkeit auch
unter hoher Last gewährleistet wird. Siehe
@url{https://prosody.im/doc/libevent}. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Modul-Liste modules-enabled
Die Liste der Module, die Prosody beim Starten lädt. Es sucht nach
@code{mod_modulename.lua} im Plugin-Verzeichnis, also sollten Sie
sicherstellen, dass es dort auch existiert. Dokumentation über Module können
Sie hier finden: @url{https://prosody.im/doc/modules}. Die Vorgabe ist
@samp{'("roster" "saslauth" "tls" "dialback" "disco" "carbons" "private"
"blocklist" "vcard" "version" "uptime" "time" "ping" "pep" "register"
"admin_adhoc")}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Zeichenketten-Liste modules-disabled
@samp{"offline"}, @samp{"c2s"} und @samp{"s2s"} werden automatisch geladen,
aber wenn Sie sie deaktivieren möchten, tragen Sie sie einfach in die Liste
ein. Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Dateiobjekt groups-file
Der Pfad zu einer Textdatei, in der gemeinsame Gruppen definiert
werden. Wenn dieser Pfad leer ist, dann tut @samp{mod_groups} nichts. Siehe
@url{https://prosody.im/doc/modules/mod_groups}. Die Vorgabe ist
@samp{"/var/lib/prosody/sharedgroups.txt"}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Boolescher-Ausdruck allow-registration?
Ob nach Voreinstellung @emph{keine} neuen Benutzerkonten angelegt werden
können, aus Sicherheitsgründen. Siehe
@url{https://prosody.im/doc/creating_accounts}. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Vielleicht-„ssl-configuration“ ssl
Dies ist der Teil der Einstellungen, der mit SSL/TLS zu tun hat. Der
Großteil davon ist deaktiviert, damit die Voreinstellungen von Prosody
verwendet werden. Wenn Sie diese Optionen hier nicht völlig verstehen,
sollten Sie sie @emph{nicht} in Ihrer Konfiguration verwenden. Es passiert
leicht, dass Sie die Sicherheit Ihres Servers absenken, indem Sie sie falsch
benutzen. Siehe @url{https://prosody.im/doc/advanced_ssl_config}.

Verfügbare @code{ssl-configuration}-Felder sind:

@deftypevr {@code{ssl-configuration}-Parameter} Vielleicht-Zeichenkette protocol
Dadurch wird entschieden, was für ein Handshake benutzt wird.
@end deftypevr

@deftypevr {@code{ssl-configuration}-Parameter} Vielleicht-Dateiname key
Der Pfad zur Datei mit Ihrem privaten Schlüssel.
@end deftypevr

@deftypevr {@code{ssl-configuration}-Parameter} Vielleicht-Dateiname certificate
Der Pfad zur Datei mit Ihrem Zertifikat.
@end deftypevr

@deftypevr {@code{ssl-configuration}-Parameter} Dateiobjekt capath
Der Pfad zum Verzeichnis, das die Wurzelzertifikate enthält, die Prosody zur
Verifikation der Zertifikate entfernter Server benutzen soll. Die Vorgabe
ist @samp{"/etc/ssl/certs"}.
@end deftypevr

@deftypevr {@code{ssl-configuration}-Parameter} Vielleicht-Dateiobjekt cafile
Der Pfad zu einer Datei, in der Wurzelzertifikate enthalten sind, denen
Prosody vertrauen soll. Er verhält sich ähnlich wie @code{capath}, aber alle
Zertifikate stehen hintereinander in der Datei.
@end deftypevr

@deftypevr {@code{ssl-configuration}-Parameter} Vielleicht-Zeichenketten-Liste verify
Eine Liste von Verifikationsoptionen. (Die meisten bilden auf die
@code{set_verify()}-Flags von OpenSSL ab.)
@end deftypevr

@deftypevr {@code{ssl-configuration}-Parameter} Vielleicht-Zeichenketten-Liste options
Eine Liste allgemeiner Optionen, die mit SSL/TLS zu tun haben. Diese bilden
auf OpenSSLs @code{set_options()} ab. Eine vollständige Liste der in LuaSec
verfügbaren Optionen finden Sie im Quellcode von LuaSec.
@end deftypevr

@deftypevr {@code{ssl-configuration}-Parameter} Vielleicht-Nichtnegative-ganze-Zahl depth
Wie lange eine Kette von Zertifikatsautoritäten („Certificate Authorities“)
nach einem passenden Wurzelzertifikat durchsucht wird, dem vertraut wird.
@end deftypevr

@deftypevr {@code{ssl-configuration}-Parameter} Vielleicht-Zeichenkette ciphers
Eine Zeichenkette mit OpenSSL-Ciphers. Damit wird ausgewählt, welche Ciphers
Prosody seinen Clients anbietet, und in welcher Reihenfolge.
@end deftypevr

@deftypevr {@code{ssl-configuration}-Parameter} Vielleicht-Dateiname dhparam
Ein Pfad zu einer Datei, in der Parameter für
Diffie-Hellman-Schlüsselaustausche stehen. Sie können so eine Datei mit
diesem Befehl erzeugen: @code{openssl dhparam -out
/etc/prosody/certs/dh-2048.pem 2048}
@end deftypevr

@deftypevr {@code{ssl-configuration}-Parameter} Vielleicht-Zeichenkette curve
Die Kurve, die für Diffie-Hellman mit elliptischen Kurven verwendet werden
soll. Prosodys Voreinstellung ist @samp{"secp384r1"}.
@end deftypevr

@deftypevr {@code{ssl-configuration}-Parameter} Vielleicht-Zeichenketten-Liste verifyext
Eine Liste von zusätzlichen Verifikationsoptionen.
@end deftypevr

@deftypevr {@code{ssl-configuration}-Parameter} Vielleicht-Zeichenkette password
Das Passwort fÜr verschlüsselte private Schlüssel.
@end deftypevr

@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Boolescher-Ausdruck c2s-require-encryption?
Ob alle Verbindungen von Client zu Server zwangsweise verschlüsselt sein
müssen. Siehe @url{https://prosody.im/doc/modules/mod_tls}. Die Vorgabe ist
@samp{#f}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Zeichenketten-Liste disable-sasl-mechanisms
Welche Mechanismen niemals angeboten werden. Siehe
@url{https://prosody.im/doc/modules/mod_saslauth}. Die Vorgabe ist
@samp{'("DIGEST-MD5")}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Zeichenketten-Liste insecure-sasl-mechanisms
Welche Mechanismen bei unverschlüsselten Verbindungen @emph{nicht} angeboten
werden. Siehe @url{https://prosody.im/doc/modules/mod_saslauth}. Die Vorgabe
ist @samp{'("PLAIN" "LOGIN")}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Boolescher-Ausdruck s2s-require-encryption?
Ob alle Verbindungen von Server zu Server zwangsweise verschlüsselt sein
müssen. Siehe @url{https://prosody.im/doc/modules/mod_tls}. Die Vorgabe ist
@samp{#f}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Boolescher-Ausdruck s2s-secure-auth?
Ob Verschlüsselung und Zertifikatsauthentifizierung verpflichtend
durchgeführt werden müssen. Das bietet das ideale Maß an Sicherheit, jedoch
müssen dann auch die Server, mit denen Sie kommunizieren, Verschlüsselung
unterstützen @emph{und} gültige Zertifikate vorweisen, denen Sie auch
vertrauen. Siehe @url{https://prosody.im/doc/s2s#security}. Die Vorgabe ist
@samp{#f}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Zeichenketten-Liste s2s-insecure-domains
Viele Server bieten keine Unterstützung für Verschlüsselung oder ihre
Zertifikate sind ungültig oder selbstsigniert. Hier können Sie Domains
eintragen, die von der Pflicht zur Authentisierung mit Zertifikaten
ausgenommen werden. Diese werden dann über DNS authentifiziert. Siehe
@url{https://prosody.im/doc/s2s#security}. Die Vorgabe ist @samp{'()}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Zeichenketten-Liste s2s-secure-domains
Selbst wenn Sie @code{s2s-secure-auth?} deaktiviert lassen, können Sie noch
immer gültige Zertifikate bei manchen Domains verlangen, indem Sie diese
hier auflisten. Siehe @url{https://prosody.im/doc/s2s#security}. Die Vorgabe
ist @samp{'()}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Zeichenkette authentication
Wählen Sie aus, welcher Hintergrunddienst („Provider“) zur Authentifizierung
benutzt werden soll. Das vorgegebene System speichert Passwörter im Klartext
ab und benutzt dafür den in Prosody eingestellten Datenspeicher, um
Authentifizierungsdaten zu speichern. Wenn Sie Ihrem Server kein Vertrauen
entgegenbringen, siehe
@url{https://prosody.im/doc/modules/mod_auth_internal_hashed} für
Informationen, wie Sie den gehashten Hintergrunddienst benutzen. Siehe auch
@url{https://prosody.im/doc/authentication}. Die Vorgabe ist
@samp{"internal_plain"}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Vielleicht-Zeichenkette log
Hiermit werden die Protokollierungsoptionen festgelegt. Fortgeschrittene
Protokollierungskonfigurationen werden vom Prosody-Dienst noch nicht
unterstützt. Siehe @url{https://prosody.im/doc/logging}. Die Vorgabe ist
@samp{"*syslog"}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Dateiname pidfile
Die Datei, in der Prosodys Prozessidentifikator („PID“) abgelegt wird. Siehe
@url{https://prosody.im/doc/modules/mod_posix}. Die Vorgabe ist
@samp{"/var/run/prosody/prosody.pid"}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Vielleicht-Nichtnegative-ganze-Zahl http-max-content-size
Die maximal zulässige Größe des HTTP-Rumpfs (in Bytes).
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Vielleicht-Zeichenkette http-external-url
Manche Module machen auf verschiedene Arten ihre eigene URL verfügbar. Diese
URL setzt sich aus dem benutzten Protokoll, Rechnernamen und Port
zusammen. Wenn Prosody hinter einem Proxy ausgeführt wird, ist die
öffentliche URL stattdessen die @code{http-external-url}. Siehe
@url{https://prosody.im/doc/http#external_url}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} „virtualhost-configuration“-Liste virtualhosts
Der Name eines Rechners („Host“) in Prosody bezeichnet eine Domain, auf der
Benutzerkonten angelegt werden können. Wenn Sie zum Beispiel möchten, dass
Nutzer Adressen haben wie @samp{"john.smith@@example.com"}, dann müssen Sie
einen Rechnernamen @samp{"example.com"} hinzufügen. Alle Optionen in dieser
Liste gelten nur für diesen Rechnernamen.

@quotation Anmerkung
Die Bezeichnung @emph{virtueller} Rechnername wird in der Konfiguration
verwendet, damit es nicht zu Verwechslungen mit dem tatsächlichen physischen
Rechner kommt, auf dem Prosody installiert ist. Eine einzelne
Prosody-Instanz kann mehrere Domains bedienen, jede definiert mit ihrem
eigenen VirtualHost-Eintrag in der Konfiguration von Prosody. Im Gegensatz
dazu hätte ein Server, der nur eine Domain anbietet, nur einen einzigen
VirtualHost-Eintrag.

Siehe @url{https://prosody.im/doc/configure#virtual_host_settings}.
@end quotation

Verfügbare @code{virtualhost-configuration}-Felder sind:

Alle folgenden Felder, wie sie auch die @code{prosody-configuration} hat:
@code{admins}, @code{use-libevent?}, @code{modules-enabled},
@code{modules-disabled}, @code{groups-file}, @code{allow-registration?},
@code{ssl}, @code{c2s-require-encryption?}, @code{disable-sasl-mechanisms},
@code{insecure-sasl-mechanisms}, @code{s2s-require-encryption?},
@code{s2s-secure-auth?}, @code{s2s-insecure-domains},
@code{s2s-secure-domains}, @code{authentication}, @code{log},
@code{http-max-content-size}, @code{http-external-url}, @code{raw-content},
und außerdem:
@deftypevr {@code{virtualhost-configuration}-Parameter} Zeichenkette domain
Die Domain, auf der man Prosody erreichen soll.
@end deftypevr

@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} „int-component-configuration“-Liste int-components
Komponenten sind zusätzliche Dienste auf einem Server, die Clients zur
Verfügung stehen. Sie sind normalerweise auf einer Subdomain des
Hauptservers verfügbar (wie zum Beispiel
@samp{"mycomponent.example.com"}). Beispiele für Komponenten könnten Server
für Chaträume, Benutzerverzeichnisse oder Zugänge („Gateways“) zu anderen
Protokollen sein.

Interne Komponenten werden über Prosody-spezifische Plugins
implementiert. Um eine interne Komponente hinzuzufügen, tragen Sie einfach
das @code{hostname}-Feld für den Rechnernamen und die Plugins ein, die Sie
für die Komponente benutzen möchten.

Siehe @url{https://prosody.im/doc/components}. Die Vorgabe ist @samp{'()}.

Verfügbare @code{int-component-configuration}-Felder sind:

Alle folgenden Felder, wie sie auch die @code{prosody-configuration} hat:
@code{admins}, @code{use-libevent?}, @code{modules-enabled},
@code{modules-disabled}, @code{groups-file}, @code{allow-registration?},
@code{ssl}, @code{c2s-require-encryption?}, @code{disable-sasl-mechanisms},
@code{insecure-sasl-mechanisms}, @code{s2s-require-encryption?},
@code{s2s-secure-auth?}, @code{s2s-insecure-domains},
@code{s2s-secure-domains}, @code{authentication}, @code{log},
@code{http-max-content-size}, @code{http-external-url}, @code{raw-content},
und außerdem:
@deftypevr {@code{int-component-configuration}-Parameter} Zeichenkette hostname
Der Rechnername für diese Komponente.
@end deftypevr

@deftypevr {@code{int-component-configuration}-Parameter} Zeichenkette plugin
Das Plugin, das Sie für diese Komponente benutzen möchten.
@end deftypevr

@deftypevr {@code{int-component-configuration}-Parameter} Vielleicht-„mod-muc-configuration“ mod-muc
Multi-User Chat (MUC) ist der Name von Prosodys Modul, womit Sie
Chaträume/Konferenzen für XMPP-Benutzer anbieten lassen können.

Allgemeine Informationen über das Einrichten und Benutzen von
Multi-User-Chaträumen können Sie in der Dokumentation über Chaträume finden
(@url{https://prosody.im/doc/chatrooms}), die Sie lesen sollten, wenn Ihnen
XMPP-Chaträume neu sind.

Siehe auch @url{https://prosody.im/doc/modules/mod_muc}.

Verfügbare @code{mod-muc-configuration}-Felder sind:

@deftypevr {@code{mod-muc-configuration}-Parameter} Zeichenkette name
Der Name, der in Antworten auf die Diensteermittlung benutzt. Die Vorgabe
ist @samp{"Prosody Chatrooms"}.
@end deftypevr

@deftypevr {@code{mod-muc-configuration}-Parameter} Zeichenkette-oder-Boolescher-Ausdruck restrict-room-creation
Für @samp{#t} können nur Administratoren neue Chaträume anlegen. Andernfalls
kann jeder einen Raum anlegen. Der Wert @samp{"local"} schränkt das Anlegen
neuer Räume auf solche Nutzer ein, die zur Eltern-Domain des Dienstes
gehören. Z.B.@: kann @samp{user@@example.com} Räume auf
@samp{rooms.example.com} anlegen. Für den Wert @samp{"admin"} können nur
Dienstadministratoren Chaträume anlegen. Die Vorgabe ist @samp{#f}.
@end deftypevr

@deftypevr {@code{mod-muc-configuration}-Parameter} Nichtnegative-ganze-Zahl max-history-messages
Die Maximalzahl der Nachrichten aus dem Chat-Verlauf, die an ein Mitglied
nachversandt werden, das gerade erst dem Raum beigetreten ist. Die Vorgabe
ist @samp{20}.
@end deftypevr

@end deftypevr

@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} „ext-component-configuration“-Liste ext-components
Externe Komponenten benutzen XEP-0114, das von den meisten eigenständigen
Komponenten unterstützt wird. Um eine externe Komponente hinzuzufügen,
tragen Sie einfach den Rechnernamen ins @code{hostname}-Feld ein. Siehe
@url{https://prosody.im/doc/components}. Die Vorgabe ist @samp{'()}.

Verfügbare @code{ext-component-configuration}-Felder sind:

Alle folgenden Felder, wie sie auch die @code{prosody-configuration} hat:
@code{admins}, @code{use-libevent?}, @code{modules-enabled},
@code{modules-disabled}, @code{groups-file}, @code{allow-registration?},
@code{ssl}, @code{c2s-require-encryption?}, @code{disable-sasl-mechanisms},
@code{insecure-sasl-mechanisms}, @code{s2s-require-encryption?},
@code{s2s-secure-auth?}, @code{s2s-insecure-domains},
@code{s2s-secure-domains}, @code{authentication}, @code{log},
@code{http-max-content-size}, @code{http-external-url}, @code{raw-content},
und außerdem:
@deftypevr {@code{ext-component-configuration}-Parameter} Zeichenkette component-secret
Das Passwort, das die Komponente für die Anmeldung benutzt.
@end deftypevr

@deftypevr {@code{ext-component-configuration}-Parameter} Zeichenkette hostname
Der Rechnername für diese Komponente.
@end deftypevr

@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Nichtnegative-ganze-Zahl-Liste component-ports
Der/Die Port(s), wo Prosody auf Verbindungen zu Komponenten lauscht. Die
Vorgabe ist @samp{'(5347)}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Zeichenkette component-interface
Die Schnittstelle, auf der Prosody auf Verbindungen zu Komponenten
lauscht. Die Vorgabe ist @samp{"127.0.0.1"}.
@end deftypevr

@deftypevr {@code{prosody-configuration}-Parameter} Vielleicht-Roher-Inhalt raw-content
„Roher Inhalt“, der so, wie er ist, an die Konfigurationsdatei angefügt
wird.
@end deftypevr

Möglicherweise möchten Sie einfach nur eine bestehende
@code{prosody.cfg.lua} zum Laufen bringen. In diesem Fall können Sie ein
@code{opaque-prosody-configuration}-Verbundsobjekt als der Wert des
@code{prosody-service-type} übergeben. Wie der Name schon sagt, bietet eine
opake Konfiguration keinerlei Unterstützung für Reflexion. Verfügbare
@code{opaque-prosody-configuration}-Felder sind:

@deftypevr {@code{opaque-prosody-configuration}-Parameter} „package“ prosody
Das Prosody-Paket.
@end deftypevr

@deftypevr {@code{opaque-prosody-configuration}-Parameter} Zeichenkette prosody.cfg.lua
Der Inhalt, der als @code{prosody.cfg.lua} benutzt werden soll.
@end deftypevr

Wenn Ihre @code{prosody.cfg.lua} zum Beispiel nur aus der leeren
Zeichenkette bestünde, könnten Sie einen Prosody-Dienst wie folgt
instanziieren:

@lisp
(service prosody-service-type
         (opaque-prosody-configuration
          (prosody.cfg.lua "")))
@end lisp

@c end of Prosody auto-generated documentation

@subsubheading BitlBee-Dienst

@cindex IRC (Internet Relay Chat)
@cindex IRC-Zugang („Gateway“)
@url{https://bitlbee.org,BitlBee} ist ein Zugang („Gateway“), der eine
IRC-Schnittstelle für verschiedene Kurznachrichtenprotokolle wie XMPP
verfügbar macht.

@defvar bitlbee-service-type
Dies ist der Diensttyp für den
@url{https://bitlbee.org,BitlBee-IRC-Zugangsdaemon} (englisch „IRC Gateway
Daemon“). Sein Wert ist eine @code{bitlbee-configuration} (siehe unten).

Damit BitlBee auf Port 6667 vom lokalen Rechner („localhost“) lauscht, fügen
Sie diese Zeile zu Ihrem „services“-Feld hinzu:

@lisp
(service bitlbee-service-type)
@end lisp
@end defvar

@deftp {Datentyp} bitlbee-configuration
Dies ist die Konfiguration für BitlBee. Sie hat folgende Felder:

@table @asis
@item @code{interface} (Vorgabe: @code{"127.0.0.1"})
@itemx @code{port} (Vorgabe: @code{6667})
Lauscht auf der Netzwerkschnittstelle, die der als @var{interface}
angegebenen IP-Adresse entspricht, auf dem angegebenen @var{port}.

Wenn als @var{interface} @code{127.0.0.1} angegeben wurde, können sich nur
lokale Clients verbinden; bei @code{0.0.0.0} können die Verbindungen von
jeder Netzwerkschnittstelle aus hergestellt werden.

@item @code{bitlbee} (Vorgabe: @code{bitlbee})
Das zu benutzende BitlBee-Paket.

@item @code{plugins} (Vorgabe: @code{'()})
Die Liste zu verwendender Plugin-Pakete@tie{}– z.B.@:
@code{bitlbee-discord}.

@item @code{extra-settings} (Vorgabe: @code{""})
Ein Konfigurationsschnipsel, das wortwörtlich in die
BitlBee-Konfigurationsdatei eingefügt wird.
@end table
@end deftp

@subsubheading ngIRCd service

@cindex IRCd, Internet Relay Chat daemon
@cindex IRC daemon service
@cindex IRC server service
@cindex IRC (Internet Relay Chat)

@url{https://ngircd.barton.de/, ngIRCd}, is a lightweight @acronym{IRCd,
Internet Relay Chat daemon}, which can be used to host your own IRC server.

@defvar ngircd-service-type
The service type for ngIRCd.  Its value is a @code{ngircd-configuration}
object, documented below.

In its most simple form, the service can be used with its default
configuration, like this:

@lisp
(service ngircd-service-type)
@end lisp

A slightly more complex example configuration could look like:

@lisp
(service ngircd-service-type
         (ngircd-configuration
          (channels
           (list (ngircd-channel
                  (name "#fruits")
                  (topic "All things fruits -- veggies are off-topic"))))
          (operators
           (list (ngircd-operator
                  (name "mikan")
                  (password "tomatoes-are-fruits/carrots-are-not"))))))
@end lisp
@end defvar

@c To regenerate the rest of this section documentation, use the
@c `ngircd-generate-documentation' procedure in
@c (gnu services messaging).
@c %start of fragment

@deftp {Data Type} ngircd-configuration
Available @code{ngircd-configuration} fields are:

@table @asis
@item @code{ngircd} (default: @code{ngircd}) (type: file-like)
The @code{ngircd} package to use.

@item @code{debug?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Turn on debugging messages.

@item @code{shepherd-requirement} (default: @code{(user-processes networking)}) (type: list-of-symbols)
Shepherd requirements the service should depend on.

@item @code{global} (type: ngircd-global)
A ngircd-global record object used to specify global options.

@item @code{limits} (type: maybe-ngircd-limits)
The ngircd-limits record object used to specify limits options.

@item @code{options} (type: ngircd-options)
The ngircd-options record object used to specify optional features and
configuration options.

@item @code{ssl} (type: maybe-ngircd-ssl)
The ngircd-ssl record object used to specify the SSL-related options.

@item @code{operators} (type: maybe-list-of-ngircd-operators)
A list of ngircd-operator record objects used to specify the operators.

@item @code{servers} (type: maybe-list-of-ngircd-servers)
A list of ngircd-server record objects used to specify other remote servers
to connect to.

@item @code{channels} (type: maybe-list-of-ngircd-channels)
A list of ngircd-channels record objects specifying pre-defined channels to
be created by the server when starting up.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} ngircd-global
Available @code{ngircd-global} fields are:

@table @asis
@item @code{name} (Typ: Vielleicht-Zeichenkette)
Server name in the IRC network.  This is an individual name of the IRC
server, it is not related to the DNS host name.  It must be unique in the
IRC network and must contain at least one dot (@samp{.}) character.  When
not set, ngIRCd tries to deduce a valid IRC server name from the local host
name.

@item @code{admin-info-1} (type: maybe-string)
First administrator information.

@item @code{admin-info-2} (type: maybe-string)
Second administrator information.

@item @code{admin-email} (type: maybe-string)
Email to reach administrators.

@item @code{help-file} (type: maybe-file-like)
File-like containing the ngIRCd help text.

@item @code{info} (type: maybe-string)
Info text of the server.  This will be shown by WHOIS and LINKS requests for
example.

@item @code{listen} (default: @code{("::" "0.0.0.0")}) (type: list-of-strings)
A list of IP address on which the server should listen.  By default it
listens on all configured IP addresses and interfaces.

@item @code{motd-file} (type: file-like)
Text file with the @i{message of the day} (MOTD).  This message will be
shown to all users connecting to the server.

@item @code{motd-phrase} (type: maybe-string)
A simple phrase (<127 chars) to use if you don't want to use a MOTD file.

@item @code{network} (type: maybe-string)
The name of the IRC network to which this server belongs.  This name is
optional, should only contain ASCII characters, and can't contain spaces.
It is only used to inform clients.

@item @code{password} (type: maybe-string)
Global password or all users needed to connect to the server.  By default,
no password is required.  PAM must be disabled for this option to have an
effect.

@item @code{pid-file} (default: @code{"/run/ngircd/ngircd.pid"}) (type: string)
The file name where the PID of ngIRCd should be written after it starts.

@item @code{ports} (default: @code{(6667)}) (type: list-of-ports)
Port number(s) on which the server should listen for @emph{unencrypted}
connections.

@item @code{server-uid} (default: @code{"ngircd"}) (type: string-or-number)
The user that the @command{ngircd} command should run as.

@item @code{server-gid} (default: @code{"ngircd"}) (type: string-or-number)
The group that the @command{ngircd} command should run as.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} ngircd-limits
Available @code{ngircd-limits} fields are:

@table @asis
@item @code{connect-retry} (default: @code{60}) (type: maybe-number)
The number of seconds the server should wait before re-attempting to
establish a link to not yet (or no longer) connected servers.

@item @code{max-connections} (default: @code{0}) (type: maybe-number)
Maximum number of simultaneous in- and outbound connections the server is
allowed to accept.  There is no limit by default.

@item @code{max-connections-ip} (default: @code{5}) (type: maybe-number)
Maximum number of simultaneous connections from a single IP address that the
server will accept.  This configuration options lowers the risk of denial of
service attacks (DoS).  Set to 0 to remove the limit.

@item @code{max-joins} (default: @code{10}) (type: maybe-number)
Maximum number of channels a user can be member of.  Set to 0 to remove the
limit.

@item @code{max-list-size} (default: @code{100}) (type: maybe-number)
Maximum number of channels returned in response to a LIST command.

@item @code{ping-timeout} (default: @code{120}) (type: maybe-number)
Number of seconds of inactivity after which the server will send a PING to
the peer to test whether it is alive or not.

@item @code{pong-timeout} (default: @code{20}) (type: maybe-number)
If a client fails to answer a PING with a PONG within this amount of
seconds, it will be disconnected by the server.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} ngircd-options
Available @code{ngircd-options} fields are:

@table @asis
@item @code{allowed-channel-types} (default: @code{"#&+"}) (type: maybe-string)
List of allowed channel types (channel prefixes) for newly created channels
on the local server.  By default, all supported channel types are allowed.

@item @code{allow-remote-oper?} (default: @code{#f}) (type: maybe-boolean)
If this option is active, IRC operators connected to remote servers are
allowed to control this local server using administrative commands, for
example like CONNECT, DIE, SQUIT, etc.

@item @code{connect-ipv4?} (default: @code{#t}) (type: maybe-boolean)
Set to @code{#f} to prevent ngIRCd from connecting to other IRC servers
using the IPv4 protocol, allowed by default.

@item @code{connect-ipv6?} (default: @code{#t}) (type: maybe-boolean)
Set to @code{#f} to prevent ngIRCd from connecting to other IRC servers
using the IPv6 protocol, allowed by default.

@item @code{dns?} (default: @code{#t}) (type: maybe-boolean)
Set to @code{#f} to disable DNS lookups when clients connect.  If you
configure the daemon to connect to other servers, ngIRCd may still perform a
DNS lookup if required.

@item @code{more-privacy?} (default: @code{#f}) (type: maybe-boolean)
Set this to @code{#t} to have ngIRCd censor user idle time, logon time as
well as the PART/QUIT messages (that sometimes used to inform everyone about
which client software is being used).  WHOWAS requests are also silently
ignored, and NAMES output doesn't list any clients for non-members.  This
option is most useful when ngIRCd is being used together with anonymizing
software such as TOR or I2P and one does not wish to make it too easy to
collect statistics on the users.

@item @code{notice-before-registration?} (default: @code{#f}) (type: maybe-boolean)
Normally ngIRCd doesn't send any messages to a client until it is
registered.  Enable this option to let the daemon send @samp{NOTICE *}
messages to clients while connecting.

@item @code{oper-can-use-mode?} (default: @code{#f}) (type: maybe-boolean)
Should IRC Operators be allowed to use the MODE command even if they are
not(!) channel-operators?

@item @code{oper-chan-p-auto-op?} (default: @code{#t}) (type: maybe-boolean)
Should IRC Operators get AutoOp (+o) in persistent (+P) channels?

@item @code{oper-server-mode?} (default: @code{#f}) (type: maybe-boolean)
If @code{open-can-use-mode?} is @code{#t}, this may lead the compatibility
problems with servers that run the ircd-irc2 software.  This option masks
mode requests by non-chanops as if they were coming from the server.  Only
enable this if you have ircd-irc2 servers in your IRC network.

@item @code{pam?} (default: @code{#f}) (type: boolean)
Set to @code{#t} to enable calls to the PAM library at runtime; all users
connecting without password are allowed to connect, all passwords given will
fail.  Users identified without PAM are registered with a tilde (@samp{~})
prepended to their user name.  This defaults to @code{#f} in Guix because
the service runs as an unprivileged user and thus cannot authenticate other
users via the @code{pam_unix} PAM module.

@item @code{pam-is-optional?} (default: @code{#f}) (type: maybe-boolean)
Set to @code{#t} to make PAM authentication optional, causing clients not
sending a password to still be able to connect, but won't become identified
and keep the tilder (@samp{~}) character prepended to their supplied user
name.

@item @code{require-auth-ping?} (default: @code{#f}) (type: maybe-boolean)
Set to @code{#t} to have ngIRCd send an authentication PING when a new
client connects, and register this client only after receiving the
corresponding PONG reply.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} ngircd-ssl
Available @code{ngircd-ssl} fields are:

@table @asis
@item @code{cert-file} (type: maybe-string)
SSL certificate file of the private server key.

@item @code{key-file} (type: maybe-string)
File name of the SSL Server Key to be used for SSL connections, which is
required for SSL/TLS support.

@item @code{ca-file} (default: @code{"/etc/ssl/certs/ca-certificates.crt"}) (type: maybe-string)
A file listing all the certificates of the trusted Certificate Authorities.

@item @code{ports} (type: maybe-list-of-ports)
Like the global configuration's @code{port} option, except that ngIRCd will
expect incoming connections to be SSL/TLS encrypted.  Common port numbers
for SSL-encrypted IRC are 6669 and 6697.

@item @code{cipher-list} (type: maybe-string)
The GnuTLS cipher suites allowed for SSL/TLS connections, a value such as
@code{"SECURE128:-VERS-SSL3.0"}.  Refer to @samp{man 3 gnutls_priority_init}
for details.

@item @code{dh-file} (type: maybe-file-like)
A file-like containing the Diffie-Hellman parameters, which can be created
with GnuTLS via @samp{certtool --generate-dh-params}.  If this file is not
present, the Diffie-Hellman parameters will be computed on startup, which
may take some time.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} ngircd-operator
Available @code{ngircd-operator} fields are:

@table @asis
@item @code{name} (Typ: Zeichenkette)
ID of the operator (may be different of the nickname).

@item @code{password} (type: string)
Password of the IRC operator.

@item @code{mask} (type: maybe-string)
Mask that is to be checked before an /OPER for this account is accepted, for
example: @code{"nick!ident@@*.example.com"}.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} ngircd-server
Available @code{ngircd-server} fields are:

@table @asis
@item @code{name} (Typ: Zeichenkette)
IRC name of the remote server.

@item @code{host} (type: string)
Internet host name (or IP address) of the peer.

@item @code{my-password} (type: string)
Own password for this connection.  This password has to be configured as
@code{peer-password} on the other server and must not have @samp{:} as first
character.

@item @code{peer-password} (type: string)
Foreign password for this connection.  This password has to be configured as
@code{my-password} on the other server.

@item @code{bind} (type: maybe-string)
IP address to use as source IP for the outgoing connection.  The default is
to let the operating system decide.

@item @code{port} (Typ: Vielleicht-Port)
Port of the remote server to which ngIRCd should connect (active).  If no
port is assigned to a configured server, the daemon only waits for incoming
connections (passive, which is the default).

@item @code{group} (type: maybe-number)
Group of this server.

@item @code{passive?} (default: @code{#f}) (type: maybe-boolean)
Set to @code{#t} to disable automatic connection even if the port value is
specified.

@item @code{ssl-connect?} (default: @code{#f}) (type: maybe-boolean)
Set to @code{#t} to enforce the use of TLS to connect to the remote server.

@item @code{ssl-verify?} (default: @code{#t}) (type: maybe-boolean)
Set to @code{#f} to disable the verification of the TLS certificate
presented by the remote server.  This can be useful if the remote server
uses a self-signed certificate.  Beware that this degrades security by
enabling man-in-the-middle attacks, as the @emph{remote site is not verified
at all}.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} ngircd-channel
Available @code{ngircd-channel} fields are:

@table @asis
@item @code{name} (Typ: Zeichenkette)
Name of the channel, including channel prefix ("#" or "&").

@item @code{topic} (type: maybe-string)
Topic for this channel.

@item @code{modes} (type: maybe-list-of-strings)
Initial channel modes, as used in MODE commands.  Modifying lists (ban list,
invite list, exception list) is supported.  If multiple MODE strings are
specified, they are evaluated in the order listed (left to right).

@item @code{key-file} (type: maybe-file-like)
Path and file name of a ngIRCd key file containing individual channel keys
for different users.  Refer to @samp{man 5 ngircd.conf} for more details.

@end table

@end deftp


@c %end of fragment

@subsubheading Pounce Service

@cindex IRC (Internet Relay Chat)
@cindex bouncer, IRC
@cindex Bounced Network Connection, BNC
@url{https://git.causal.agency/pounce/about/, pounce} is a multi-client,
TLS-only IRC bouncer.  It maintains a persistent connection to an IRC
server, acting as a proxy and buffer for a number of clients.

@defvar pounce-service-type
This is the service type for the pounce IRC bouncer.  Its value is a
@code{pounce-configuration} configuration instance, which is documented
below.

@cindex IRC bouncer configuration for Libera.Chat
@cindex Libera.Chat, IRC bouncer configuration
The following example configures pounce to act as an IRC bouncer for the
@url{https://libera.chat, Libera.Chat} server, using @acronym{CertFP, client
certificate fingerprint} authentication to avoid leaking a sensitive
password to the publicly readable store.  The equally sensitive TLS
certificate file should be created in-place or transferred using a secure
means such as SSH, prior to deploying the service.  The service activation
will ensure the ownership and permissions of the certificate/key files are
set correctly.  In the below example, it is placed at
@file{/etc/pounce/libera.pem} on the target machine.  Pounce itself can be
used to generate a TLS certificate, using the @samp{pounce -g libera.pem}
command, which concatenates both the private key and the public certificate
in the specified file name.  For more information regarding CertFP
authentication, refer to @samp{man pounce} or the Libera.Chat guide at
@url{https://libera.chat/guides/certfp}.

@lisp
(service pounce-service-type
         (pounce-configuration
          (host "irc.libera.chat")
          (client-cert "/etc/pounce/libera.pem")
          (nick "hannah")
          (join (list "#gnu" "#guix" "#guile" "#hurd"))))
@end lisp

Once deployed on the target machine, pounce will act as an IRC server
listening for TLS connections on the 6697 TCP port of the @samp{localhost}
address of that machine.  By default, a self-signed certificate for pounce
is created at @file{/var/lib/pounce/.config/pounce/localhost.cert}.  If you
plan to expose the bouncer to the public Internet, it is advisable to use a
@acronym{CA, Certificate Authority}-signed certificate, as can be obtained
using a certificate service (@pxref{Zertifikatsdienste}), so that IRC
clients can verify the certificate out of the box.  If you instead plan to
connect to the bouncer strictly via a secure connection, for example using a
@acronym{VPN, Virtual Private Network} or @acronym{SSH, Secure Shell}, then
it is acceptable to simply let your IRC client trust the auto-generated,
self-signed pounce certificate or even disable TLS certificate verification
in your client.

@cindex IRC bouncer configuration for OFTC
@cindex OFTC, IRC bouncer configuration
To connect to a second server, a second pounce instance is needed, taking
care to specify the @code{provision} field of its
@code{pounce-configuration} to avoid a name clash with the previous service,
along with a distinct @code{local-port} and @code{log-file}.  The following
example shows how to configure another bouncer, this time for the
@url{https://www.oftc.net, OFTC} IRC server.  Like in the previous example,
CertFP authentication is used, which can be configured similarly.  For more
details about using CertFP with the OFTC IRC server, refer to
@url{https://www.oftc.net/NickServ/CertFP/}.

@lisp
(service pounce-service-type
         (pounce-configuration
          (shepherd-provision '(pounce-oftc))
          (local-port 6698)
          (log-file "/var/log/pounce-oftc.log")
          (host "irc.oftc.net")
          (client-cert "/etc/pounce/oftc.pem")
          (nick "sena")
          (join (list "#gcc" "#glibc"))))
@end lisp

@end defvar

@c Auto-generated via (configuration->documentation 'pounce-configuration).
@c %start of fragment

@deftp {Data Type} pounce-configuration
Available @code{pounce-configuration} fields are:

@table @asis
@item @code{pounce} (default: @code{pounce}) (type: file-like)
The @code{pounce} package to use.

@item @code{shepherd-provision} (default: @code{(pounce)}) (type: list-of-symbols)
The name(s) of the service.

@item @code{shepherd-requirement} (default: @code{(user-processes networking)}) (type: list-of-symbols)
Shepherd requirements the service should depend on.

@item @code{log-file} (default: @code{"/var/log/pounce.log"}) (type: string)
The log file name to use.

@item @code{verbose?} (type: maybe-boolean)
When true, log IRC messages to standard output.

@item @code{local-host} (default: @code{"localhost"}) (type: maybe-string)
The host to bind to.

@item @code{local-port} (default: @code{6697}) (type: maybe-port)
The port to bind to.

@item @code{local-ca} (type: maybe-string)
Require clients to authenticate using a TLS client certificate either
contained in or signed by a certificate in the file loaded from
@code{local-ca}, a file name.  The file is reloaded when the SIGUSR1 signal
is received.

@item @code{local-cert} (type: maybe-string)
File name of the TLS certificate to load.  The file is reloaded when the
SIGUSR1 signal is received.  Unless specified, a self-signed certificate is
generated at @file{/var/lib/pounce/.config/pounce/@var{host}.pem}, where
@var{host} corresponds to the value of the @code{local-host} field.

@item @code{local-priv} (type: maybe-string)
File name of the private TLS key to load.  Unless specified, a key is
generated at @file{/var/lib/pounce/.config/pounce/@var{host}.key}, where
@var{host} corresponds to the value of the @code{local-host} field.

@item @code{local-pass} (type: maybe-string)
Require the server password pass for clients to connect.  The pass string
must be hashed using @samp{pounce -x}.

@item @code{size} (default: @code{4096}) (type: maybe-power-of-two)
Set the number of messages contained in the buffer to @var{size}.  This sets
the maximum number of recent messages which can be relayed to a reconnecting
client.  The size must be a power of two.

@item @code{bind} (type: maybe-string)
Host to bind the @emph{source} address to when connecting to the server.  To
connect from any address over IPv4 only, use @samp{0.0.0.0}.  To connect
from any address over IPv6 only, use @samp{::}.

@item @code{host} (type: string)
The host name to connect to.

@item @code{port} (Typ: Vielleicht-Port)
The port number to connect to.

@item @code{pass} (type: maybe-string)
Password to use to log in with the server.  The password must have been
hashed via the @samp{pounce -x} command.

@item @code{join} (type: maybe-list-of-strings)
The list of channels to join.

@item @code{mode} (Typ: Vielleicht-Zeichenkette)
The user mode.

@item @code{user} (Typ: Vielleicht-Zeichenkette)
To set the username.  The default username is the same as the nickname.

@item @code{nick} (default: @code{"pounce"}) (type: maybe-string)
Set nickname to @var{nick}.

@item @code{real} (type: maybe-string)
Set the real name.  The default is @code{nick}.

@item @code{away} (type: maybe-string)
The away status to use when no clients are connected and no other away
status has been set.

@item @code{quit} (type: maybe-string)
The message to use when quitting.

@item @code{no-names?} (type: maybe-boolean)
Do not request @samp{NAMES} for each channel when a client connects.  This
avoids already connected clients receiving unsolicited responses but
prevents new clients from populating user lists.

@item @code{queue-interval} (default: @code{200}) (type: maybe-number)
Set the server send queue interval in milliseconds.  The queue is used to
send automated messages from pounce to the server.  Messages from clients
are sent to the server directly.

@item @code{trust} (type: maybe-string)
File name of a certificate to trust.  When used, server name verification is
disabled.

@item @code{client-cert} (type: maybe-string)
The file name of the TLS client.  If the private key is in a separate file,
it is loaded with @code{client-priv}.  With @code{sasl-external?},
authenticate using SASL EXTERNAL.  Certificates can be generated with
@samp{pounce -g}.  For more details, refer to ``Generating Client
Certificates'' in @samp{man 1 pounce}.

@item @code{client-priv} (type: maybe-string)
The file name of the TLS client private key.

@item @code{sasl-plain} (type: maybe-pair)
A pair of the username and password in plain text to authenticate using SASL
PLAIN.  Since this method requires the account password in plain text, it is
recommended to use CertFP instead with @code{sasl-external}.

@item @code{sasl-external?} (type: maybe-boolean)
Authenticate using SASL EXTERNAL, also known as CertFP.  The TLS client
certificate is loaded from @code{client-cert}.

@end table

@end deftp


@c %end of fragment

@subsubheading Quassel-Dienst

@cindex IRC (Internet Relay Chat)
@url{https://quassel-irc.org/,Quassel} ist ein verteilter IRC-Client, was
bedeutet, dass sich ein oder mehr Clients mit dem zentralen Kern verbinden
und die Verbindung wieder trennen können.

@defvar quassel-service-type
Dies ist der Diensttyp für den Daemon zum IRC-Hintergrundsystem („Backend“)
@url{https://quassel-irc.org/,Quassel}. Sein Wert ist eine
@code{quassel-configuration} (siehe unten).
@end defvar

@deftp {Datentyp} quassel-configuration
Die Konfiguration für Quassel mit den folgenden Feldern:

@table @asis
@item @code{quassel} (Vorgabe: @code{quassel})
Das zu verwendende Quassel-Paket.

@item @code{interface} (Vorgabe: @code{"::,0.0.0.0"})
@item @code{port} (Vorgabe: @code{4242})
Lauscht auf der/den Netzwerkschnittstelle(n), die den in der kommagetrennten
@var{interface}-Liste festgelegten IPv4- oder IPv6-Schnittstellen
entsprechen, auf dem angegebenen @var{port}.

@item @code{loglevel} (Vorgabe: @code{"Info"})
Die gewünschte Detailstufe der Protokollierung. Akzeptiert werden die Werte
Debug (ausführlich zur Fehlersuche), Info, Warning (nur Warnungen und
Fehler) und Error (nur Fehler).
@end table
@end deftp

@subsubheading Snuik Service

@cindex irc-bot
@cindex snuik
The @uref{https://gitlab.com/janneke/snuik, Snuik IRC bot} can be run as a
daemon to aid talking to users that are currently offline.  With the
@code{(gnu services messaging)} service, you can configure it by adding a
@code{snuik-service-type} service to the @code{services} field of your
operating system declaration.

@defvar snuik-service-type
This is the type of the Snuik service, whose value is a
@code{snuik-configuration} object.
@end defvar

Here is an example of a service and its configuration:

@lisp
(service snuik-service-type
         (snuik-configuration
          (password-file "/var/run/snuik/.password.snuik")
          (channels '("#bootstrappable"
                      "#dezyne"
                      "#guix-risc-v"
                      "#lilypond"))))
@end lisp

@deftp {Data Type} snuik-configuration
Available @code{snuik-configuration} fields are:

@table @asis
@item @code{snuik} (default: @code{snuik}) (type: package)
The Snuik package to use.

@item @code{server} (default: @code{"irc.libera.chat"})
The IRC server to connect to.

@item @code{port} (default: @code{6665}) (type: integer)
Port number used by the IRC server.

@item @code{nick} (default: @code{"snuik"}) (type: string)
The nickname for snuik to use.

@item @code{password} (default: @code{#f}) (type: string)
The password to use when logging in.

@item @code{password-file} (default: @code{".password.<nick>})
The file to read the password from to use when logging in.

@item @code{channels} (default: @code{'("##botchat")})
The channels for snuik to join, a list of strings.

@item @code{extra-options} (Vorgabe: @code{'()})
Extra options will be passed to @command{snuik}, please run @command{snuik
--help } for more information.

@end table
@end deftp

@subsubheading Mosquitto Service

@url{https://mosquitto.org/,Mosquitto} is a lightweight message broker that
implements the MQTT protocol versions 5.0, 3.1.1 and 3.1.  It is suitable
for use on all devices from low power single board computers to full
servers.

@defvar mosquitto-service-type
This is the service type for the @url{https://mosquitto.org/,Mosquitto} MQTT
broker.  Its value is a @code{mosquitto-configuration} (see below).
@end defvar

@deftp {Data Type} mosquitto-configuration
This is the configuration for Mosquitto, with the following fields:

@table @asis
@item @code{package} (default: @code{mosquitto})
The Mosquitto package to use.

@item @code{config-file} (Vorgabe: @code{#f})
The Mosquitto configuration file as a file-like object or the value
@code{#f} to use the default configuration.

@item @code{user} (default: @code{"mosquitto"})
Owner of the broker process.

@item @code{group} (default: @code{"mosquitto"})
Owner's group of the broker process.
@end table
@end deftp

@subsubheading Mollysocket Service

@url{https://github.com/mollyim/mollysocket,Mollysocket} is a UnifiedPush
provider for the messaging app @url{https://molly.im,Molly}, a fork of
Signal.

@defvar mollysocket-service-type
The Mollysocket service.  Takes @code{mollysocket-configuration} as its
value.  By default, this service listens on port 8020 for any Molly client.
@end defvar

@deftp {Data Type} mollysocket-configuration
The configuration for Mollysocket, with the following fields:

@table @asis
@item @code{package} (default: @code{mollysocket})
The Mollysocket package to use.

@item @code{host} (default: @code{"0.0.0.0"})
Address for the webserver to listen on. It is recommended that this be set
to localhost, and instead configure a TLS-supporting reverse proxy in front
of it.

@item @code{port} (default: @code{8020})
Port for the webserver to listen on.

@item @code{webserver} (default: @code{#t})
Whether the webserver sould be enabled. If disabled, the server is
considered to be in airgapped mode, and clients must be configured likewise.

@item @code{allowed-endpoints} (default: @code{'("*")})
Allowlist of UnifiedPush distributor endpoints, represented as IP addresses
or domain names. Addresses on the local network must be specified
explicitly.

@item @code{allowed-uuids} (default: @code{'("*")})
Allowlist of Signal account UUIDs.

@item @code{db} (default: @code{"/var/lib/mollysocket/db.sqlite"})
Path to the Mollysocket database. Will be created if it doesn't exist.

@item @code{vapid-key-file} (default: @code{"/var/lib/mollysocket/vapid.key"})
Path to the VAPID key used to authorize requests to the UnifiedPush
distributor.  Will be created if it doesn't exist.
@end table
@end deftp

@node Telefondienste
@subsection Telefondienste

@cindex Telefonie, Dienste
Das Modul @code{(gnu services telephony)} stellt Guix-Dienstdefinitionen für
Telefoniedienste zur Verfügung. Zurzeit werden folgende Dienste unterstützt:

@subsubheading Jami

@defvar jami-service-type
Der Diensttyp, um Jami als Dienst auszuführen. Als sein Wert muss ein
@code{jami-configuration}-Objekt angegeben werden, wie unten beschrieben. In
diesem Abschnitt wird erklärt, wie Sie einen Server für Jami einrichten, mit
dem Video- oder Audiokonferenzen bereitgestellt werden können, neben anderen
Nutzungsmöglichkeiten. Das folgende Beispiel zeigt, wie Jami-Kontenarchive
(Sicherungskopien) automatisch eingerichtet werden:

@lisp
(service jami-service-type
         (jami-configuration
          (accounts
           (list (jami-account
                  (archive "/etc/jami/unverschlüsseltes-konto-1.gz"))
                 (jami-account
                  (archive "/etc/jami/unverschlüsseltes-konto-2.gz"))))))
@end lisp

Wenn etwas für das @code{accounts}-Feld angegeben wird, werden die
Jami-Kontendateien des Dienstes unter @file{/var/lib/jami} bei jedem
Neustart des Dienstes neu erzeugt.

Jami-Konten und die zugehörigen Archive mit Sicherungskopien können mit dem
Jami-Client @code{jami} oder auch mit dem Client @code{jami-gnome} angelegt
werden. Die Konten sollten @emph{nicht} mit einem Passwort geschützt werden,
aber es ist ratsam, sie nur für den Administratornutzer @samp{root} lesbar
zu machen.

Im nächsten Beispiel sehen Sie, wie deklariert wird, dass nur manche
Kontakte mit einem bestimmten Konto kommunizieren dürfen:

@lisp
(service jami-service-type
         (jami-configuration
          (accounts
           (list (jami-account
                  (archive "/etc/jami/unverschlüsseltes-konto-1.gz")
                  (peer-discovery? #t)
                  (rendezvous-point? #t)
                  (allowed-contacts
                   '("1dbcb0f5f37324228235564b79f2b9737e9a008f"
                     "2dbcb0f5f37324228235564b79f2b9737e9a008f")))))))
@end lisp

In diesem Modus können nur die als @code{allowed-contacts} deklarierten
Kontakte eine Kommunikation mit diesem Jami-Konto einleiten. So etwas kann
zum Beispiel benutzt werden, um Konten als „Treffpunkt“ zur Erstellung von
privaten Videokonferenzräumen einzurichten.

Um dem Systemadministrator die volle Kontrolle über von deren System
angebotene Konferenzen zu geben, unterstützt der Jami-Dienst die folgenden
Aktionen:

@example sh
# herd doc jami list-actions
(list-accounts
 list-account-details
 list-banned-contacts
 list-contacts
 list-moderators
 add-moderator
 ban-contact
 enable-account
 disable-account)
@end example

Das Ziel ist, mit den obigen Aktionen die für die Moderation wertvollsten
Aktionen zur Verfügung zu stellen; wir versuchen @emph{nicht}, die gesamte
Programmierschnittstelle von Jami abzudecken. Benutzer, die aus Guile heraus
mit dem Jami-Daemon interagieren möchten, interessieren sich vielleicht für
das Modul @code{(gnu build jami-service)}, womit die obigen
Shepherd-Aktionen implementiert wurden.

@c TODO: This should be auto-generated from the doc already defined on
@c the shepherd-actions themselves in (gnu services telephony).
Die Aktionen @code{add-moderator} und @code{ban-contact} nehmen den
@emph{Fingerabdruck} (einen 40-zeichigen Hash) als erstes Argument und einen
Konto-Fingerabdruck oder Benutzernamen als zweites Argument an.

@example sh
# herd add-moderator jami 1dbcb0f5f37324228235564b79f2b9737e9a008f \
  f3345f2775ddfe07a4b0d95daea111d15fbc1199

# herd list-moderators jami
Moderators for account f3345f2775ddfe07a4b0d95daea111d15fbc1199:
  - 1dbcb0f5f37324228235564b79f2b9737e9a008f

@end example

Im Fall von @code{ban-contact} ist das zweite Benutzernamen-Argument
optional; wenn Sie es weglassen, wird das Konto gegenüber allen Jami-Konten
gesperrt.

@example sh
# herd ban-contact jami 1dbcb0f5f37324228235564b79f2b9737e9a008f

# herd list-banned-contacts jami
Banned contacts for account f3345f2775ddfe07a4b0d95daea111d15fbc1199:
  - 1dbcb0f5f37324228235564b79f2b9737e9a008f

@end example

Gesperrten Kontakten werden auch ihre Moderatorrechte entzogen.

Die Aktion @code{disable-account} ermöglicht es, ein Konto gänzlich vom
Netzwerk abzutrennen, also unerreichbar zu machen. Dagegen bewirkt
@code{enable-account} das Gegenteil. Sie nehmen einen einzelnen
Kontobenutzernamen oder -fingerabdruck als erstes Argument:

@example sh
# herd disable-account jami f3345f2775ddfe07a4b0d95daea111d15fbc1199

# herd list-accounts jami
The following Jami accounts are available:
  - f3345f2775ddfe07a4b0d95daea111d15fbc1199 (dummy) [disabled]

@end example

Die Aktion @code{list-account-details} zeigt die Parameter jedes Kontos
ausführlich im Recutils-Format an, d.h.@: der Befehl @command{recsel} kann
benutzt werden, um die relevanten Konten auszuwählen (siehe @ref{Selection
Expressions,,,recutils, Handbuch der GNU recutils}). Beachten Sie, dass
anstelle der Punkt-Zeichen (@samp{.}) in den Schlüsseln der Kontoparameter
Unterstriche (@samp{_}) angezeigt werden, um den Anforderungen des
Recutils-Formats zu genügen. Folgendes Beispiel zeigt, wie man den
Fingerabdruck jedes im Treffpunktmodus befindlichen Kontos angezeigt
bekommt:

@example sh
# herd list-account-details jami | \
  recsel -p Account.username -e 'Account.rendezVous ~ "true"'
Account_username: f3345f2775ddfe07a4b0d95daea111d15fbc1199
@end example

Die anderen Aktionen sollten selbsterklärend sein.

Nun folgt eine vollständige Übersicht über die verfügbaren
Konfigurationsoptionen.
@end defvar

@c TODO: Ideally, the following fragments would be auto-generated at
@c build time, so that they needn't be manually duplicated.
@c Auto-generated via (configuration->documentation 'jami-configuration)
@deftp {Datentyp} jami-configuration
Verfügbare @code{jami-configuration}-Felder sind:

@table @asis
@item @code{libjami} (Vorgabe: @code{libjami}) (Typ: „package“)
Das Jami-Daemon-Paket, was benutzt werden soll.

@item @code{dbus} (Vorgabe: @code{dbus-for-jami}) (Typ: „package“)
Das D-Bus-Paket, mit dem die benötigte D-Bus-Sitzung gestartet wird.

@item @code{nss-certs} (Vorgabe: @code{nss-certs}) (Typ: „package“)
Das nss-certs-Paket, was die TLS-Zertifikate bereitstellt.

@item @code{enable-logging?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Ob Protokollierung in Syslog aktiviert sein soll.

@item @code{debug?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ob Meldungen der Fehlersuch-Ausführlichkeitsstufe aktiviert sein sollen.

@item @code{auto-answer?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ob Anrufe erzwungen automatisch entgegengenommen werden sollen.

@item @code{accounts} (Typ: Vielleicht-„jami-account“-Liste)
Eine Liste der Jami-Konten, die jedes Mal (neu) eingerichtet werden, wenn
der Jami-Daemon-Dienst startet. Wenn Sie dieses Feld angeben, werden die
Kontoverzeichnisse unter @file{/var/lib/jami/} bei jedem Start des Dienstes
aufs Neue erzeugt, was einen konsistenten Zustand gewährleistet.

@end table

@end deftp

@c Auto-generated via (configuration->documentation 'jami-account)
@deftp {Datentyp} jami-account
Verfügbare @code{jami-account}-Felder sind:

@table @asis
@item @code{archive} (Typ: Zeichenkette-oder-„computed-file“)
Der Dateiname des Kontenarchivs mit den Sicherungskopien des Kontos. Damit
werden die Konten neu eingerichtet, sobald der Dienst startet. Das
Kontenarchiv muss @emph{unverschlüsselt} sein. Es wird dringend empfohlen,
diese Dateien nur für den Administratornutzer @samp{root} lesbar zu machen
(sie also @emph{nicht} im Store zu speichern), damit die darin enthaltenen
geheimen Schlüssel des Jami-Kontos nicht bekannt werden.

@item @code{allowed-contacts} (Typ: Vielleicht-Kontofingerabdruck-Liste)
Die Liste der erlaubten Kontakte des Kontos in Form deren 40@tie{}Zeichen
langen Fingerabdrucks. Nachrichten und eingehende Anrufe von Konten, die in
der Liste fehlen, werden abgewiesen. Wenn keine Liste angegeben wird, wird
die gesamte Konfiguration des Kontenarchivs als Kontakte und für öffentliche
eingehende Anrufe und Nachrichten zugelassen, was normalerweise bedeutet,
dass jeder Kontakt mit dem Konto kommunizieren kann.

@item @code{moderators} (Typ: Vielleicht-Kontofingerabdruck-Liste)
Die Liste der Kontakte, die Moderationsrecht (andere Nutzer sperren,
stummschalten usw.) in Treffpunkt-Konferenzen („Rendezvous“) haben. Kontakte
werden in Form ihres 40@tie{}Zeichen langen Fingerabdrucks angegeben. Wird
nichts festgelegt, werden Moderationsrechte an die gesamte Konfiguration des
Kontenarchivs übertragen, was normalerweise bedeutet, dass jeder die
Moderatorrolle einnehmen kann.

@item @code{rendezvous-point?} (Typ: Vielleicht-Boolescher-Ausdruck)
Ob das Konto im Treffpunktmodus (Rendezvous-Modus) arbeiten soll. In diesem
Modus werden alle eingehenden Audio-/Videoanrufe in eine Konferenz
gemischt. Wenn nichts angegeben wird, gilt der Wert im Kontenarchiv.

@item @code{peer-discovery?} (Typ: Vielleicht-Boolescher-Ausdruck)
Ob sich der Jami-Daemon am Multicast-Mechanismus zum Finden lokaler
Netzwerkteilnehmer beteiligen soll. Damit werden andere OpenDHT-Knoten im
lokalen Netzwerk erkannt, wodurch die Kommunikation zwischen Geräten in
einem solchen Netzwerk aufrechterhalten werden kann, selbst wenn die
Internetverbindung verloren geht. Wenn nichts angegeben wird, gilt der Wert
im Kontenarchiv.

@item @code{bootstrap-hostnames} (Typ: Vielleicht-Zeichenketten-Liste)
Eine Liste von Rechnernamen oder IP-Adressen, die auf OpenDHT-Knoten
verweisen, über die beim Start eine Verbindung zum OpenDHT-Netzwerk
aufgebaut wird. Wenn nichts angegeben wird, gilt der Wert im Kontenarchiv.

@item @code{name-server-uri} (Typ: Vielleicht-Zeichenkette)
Die URI des zu nutzenden Namens-Servers, mit dem der Konto-Fingerabdruck
eines registrierten Nutzers erfragt werden kann.

@end table

@end deftp

@subsubheading Mumble-Server

@cindex Mumble
@cindex Murmur
@cindex Internettelefonie-Server (VoIP)
Dieser Abschnitt beschreibt, wie Sie einen Server für
@uref{https://mumble.info, Mumble} einrichten und ausführen. (Die
Server-Komponente war ehemals bekannt unter dem Namen Murmur.)

@defvar mumble-server-service-type

Der Diensttyp, um einen Mumble-Server zu betreiben. Sein Wert muss ein
@code{mumble-server-configuration}-Objekt sein. Folgendes ist enthalten.
@end defvar

@deftp {Datentyp} mumble-server-configuration
Der Diensttyp für den Mumble-Server. Eine Beispielkonfiguration kann so
aussehen:

@lisp
(service mumble-server-service-type
         (mumble-server-configuration
          (welcome-text
            "Willkommen zu diesem mit Guix betriebenen Mumble-Server!")
          (cert-required? #t) ;Anmeldungen mit Textpasswort deaktivieren
          (ssl-cert "/etc/certs/mumble.example.com/fullchain.pem")
          (ssl-key "/etc/certs/mumble.example.com/privkey.pem")))
@end lisp

Nachdem Sie Ihr System rekonfiguriert haben, können Sie das Passwort des
Administratornutzers @code{SuperUser} auf dem Mumble-Server mit Hilfe des
Befehls von Hand festlegen, der Ihnen in der Aktivierungsphase des
Mumble-Servers angezeigt wird.

Es wird empfohlen, ein normales Mumble-Benutzerkonto zu registrieren und mit
Administrator- oder Moderatorrechten auszustatten. Sie können auch das
Clientprogramm @code{mumble} benutzen, um sich als neuer normaler Benutzer
anzumelden und zu registrieren, und sich dann abmelden. Im nächsten Schritt
melden Sie sich mit dem Benutzernamen @code{SuperUser} mit dem vorher
festgelegten @code{SuperUser}-Passwort an und statten Ihren registrierten
Mumble-Benutzer mit Administrator- oder Moderatorrechten aus oder erzeugen
ein paar Kanäle.

Verfügbare @code{mumble-server-configuration}-Felder sind:

@table @asis
@item @code{package} (Vorgabe: @code{mumble})
Das Paket, das @code{bin/mumble-server} enthält.

@item @code{user} (Vorgabe: @code{"mumble-server"})
Der Benutzer, der den Mumble-Server ausführt.

@item @code{group} (Vorgabe: @code{"mumble-server"})
Die Gruppe des Benutzers, der den Mumble-Server ausführt.

@item @code{port} (Vorgabe: @code{64738})
Der Port, auf dem der Server lauschen wird.

@item @code{welcome-text} (Vorgabe: @code{""})
Der Willkommenstext, der an Clients geschickt wird, sobald sie eine
Verbindung aufgebaut haben.

@item @code{server-password} (Vorgabe: @code{""})
Das Passwort, das Clients eingeben müssen, um sich verbinden zu können.

@item @code{max-users} (Vorgabe: @code{100})
Die Maximalzahl von Nutzern, die gleichzeitig mit dem Server verbunden sein
können.

@item @code{max-user-bandwidth} (Vorgabe: @code{#f})
Wie viele Stimmdaten ein Benutzer pro Sekunde versenden kann.

@item @code{database-file} (Vorgabe: @code{"/var/lib/mumble-server/db.sqlite"})
Der Dateiname der SQLite-Datenbank. Das Benutzerkonto für den Dienst wird
Besitzer des Verzeichnisses.

@item @code{log-file} (Vorgabe: @code{"/var/log/mumble-server/mumble-server.log"})
Der Dateiname der Protokolldatei. Das Benutzerkonto für den Dienst wird
Besitzer des Verzeichnisses.

@item @code{autoban-attempts} (Vorgabe: @code{10})
Wie oft sich ein Benutzer innerhalb des in @code{autoban-timeframe}
angegebenen Zeitrahmens verbinden kann, ohne automatisch für die in
@code{autoban-time} angegebene Zeit vom Server verbannt zu werden.

@item @code{autoban-timeframe} (Vorgabe: @code{120})
Der Zeitrahmen für automatisches Bannen in Sekunden.

@item @code{autoban-time} (Vorgabe: @code{300})
Wie lange in Sekunden ein Client gebannt wird, wenn er die
Autobann-Beschränkungen überschreitet.

@item @code{opus-threshold} (Vorgabe: @code{100})
Der Prozentanteil der Clients, die Opus unterstützen müssen, bevor der
Opus-Audiocodec verwendet wird.

@item @code{channel-nesting-limit} (Vorgabe: @code{10})
Wie tief Kanäle höchstens ineinander verschachtelt sein können.

@item @code{channelname-regex} (Vorgabe: @code{#f})
Eine Zeichenkette in Form eines regulären Ausdrucks von Qt, zu dem
Kanalnamen passen müssen.

@item @code{username-regex} (Vorgabe: @code{#f})
Eine Zeichenkette in Form eines regulären Ausdrucks von Qt, zu dem
Nutzernamen passen müssen.

@item @code{text-message-length} (Vorgabe: @code{5000})
Wie viele Bytes ein Benutzer höchstens in einer Textchatnachricht
verschicken kann.

@item @code{image-message-length} (Vorgabe: @code{(* 128 1024)})
Wie viele Bytes ein Benutzer höchstens in einer Bildnachricht verschicken
kann.

@item @code{cert-required?} (Vorgabe: @code{#f})
Falls dies auf @code{#t} gesetzt ist, werden Clients abgelehnt, die sich
bloß mit Passwörtern authentisieren. Benutzer müssen den
Zertifikatsassistenten abgeschlossen haben, bevor sie sich verbinden können.

@item @code{remember-channel?} (Vorgabe: @code{#f})
Ob sich @code{mumble-server} für jeden Nutzer den Kanal merken soll, auf dem
er sich zuletzt befunden hat, als er die Verbindung getrennt hat, so dass er
wieder auf dem gemerkten Kanal landet, wenn er dem Server wieder beitritt.

@item @code{allow-html?} (Vorgabe: @code{#f})
Ob HTML in Textnachrichten, Nutzerkommentaren und Kanalbeschreibungen
zugelassen wird.

@item @code{allow-ping?} (Vorgabe: @code{#f})
Wenn es auf wahr gesetzt ist, wird an nicht angemeldete Anwender die
momentane Benutzerzahl, die maximale Benutzerzahl und die maximale
Bandbreite pro Benutzer übermittelt. Im Mumble-Client werden diese
Informationen im Verbinden-Dialog angezeigt.

Wenn diese Einstellung deaktiviert ist, wird der Server nicht in der
öffentlichen Serverliste aufgeführt.

@item @code{bonjour?} (Vorgabe: @code{#f})
Ob der Server im lokalen Netzwerk anderen über das Bonjour-Protokoll
mitgeteilt werden soll.

@item @code{send-version?} (Vorgabe: @code{#f})
Ob die @code{mumble-server}-Serverversion Clients gegenüber in Ping-Anfragen
mitgeteilt werden soll.

@item @code{log-days} (Vorgabe: @code{31})
Mumble führt in der Datenbank Protokolle, auf die über entfernte
Prozeduraufrufe („Remote Procedure Calls“, kurz RPC) zugegriffen werden
kann. Nach Vorgabe bleiben diese 31 Tage lang erhalten, aber sie können
diese Einstellung auf 0 setzen, damit sie ewig gespeichert werden, oder auf
-1, um @emph{keine} Protokolle in die Datenbank zu schreiben.

@item @code{obfuscate-ips?} (Vorgabe: @code{#t})
Ob IP-Adressen in Protokollen anonymisiert werden sollen, um die
Privatsphäre von Nutzern zu schützen.

@item @code{ssl-cert} (Vorgabe: @code{#f})
Der Dateiname des SSL-/TLS-Zertifikats, das für verschlüsselte Verbindungen
benutzt werden soll.

@lisp
(ssl-cert "/etc/certs/example.com/fullchain.pem")
@end lisp
@item @code{ssl-key} (Vorgabe: @code{#f})
Dateipfad zum privaten Schlüssel für SSL, was für verschlüsselte
Verbindungen benutzt wird.
@lisp
(ssl-key "/etc/certs/example.com/privkey.pem")
@end lisp

@item @code{ssl-dh-params} (Vorgabe: @code{#f})
Dateiname einer PEM-kodierten Datei mit Diffie-Hellman-Parametern für die
SSL-/TLS-Verschlüsselung. Alternativ setzen Sie ihn auf
@code{"@@ffdhe2048"}, @code{"@@ffdhe3072"}, @code{"@@ffdhe4096"},
@code{"@@ffdhe6144"} oder @code{"@@ffdhe8192"}, wodurch die mitgelieferten
Parameter aus RFC 7919 genutzt werden.

@item @code{ssl-ciphers} (Vorgabe: @code{#f})
Die Option @code{ssl-ciphers} wählt aus, welche Cipher-Suites zur Verwendung
in SSL/TLS verfügbar sein sollen.

Diese Option wird in der
@uref{https://www.openssl.org/docs/apps/ciphers.html#CIPHER-LIST-FORMAT,
OpenSSL-Notation für Cipher-Listen} angegeben.

Es wird empfohlen, dass Sie Ihre Cipher-Zeichenkette mit „openssl ciphers
<Zeichenkette>“ prüfen, bevor Sie sie hier einsetzen, um ein Gefühl dafür zu
bekommen, was für eine Cipher-Suite sie damit bekommen. Nachdem Sie diese
Option festgelegt haben, wird empfohlen, dass Sie das Protokoll Ihres
Mumble-Servers durchsehen und sicherstellen, dass Mumble auch wirklich die
Cipher-Suites benutzt, die Sie erwarten.

@quotation Anmerkung
Änderungen hieran können die Rückwärtskompatibilität Ihres Mumble-Servers
beeinträchtigen; dadurch kann es für ältere Mumblie-Clients unmöglich
werden, sich damit zu verbinden.
@end quotation

@item @code{public-registration} (Vorgabe: @code{#f})
Hier muss ein
@code{<mumble-server-public-registration-configuration>}-Verbundsobjekt oder
@code{#f} angegeben werden.

Sie können Ihren Server optional in die öffentliche Serverliste eintragen
lassen, die der Mumble-Client @code{mumble} beim Start anzeigt. Sie können
Ihren Server nicht registrieren, wenn Sie ein @code{server-password}
festgelegt oder @code{allow-ping} auf @code{#f} gesetzt haben.

Es könnte ein paar Stunden dauern, bis er in der öffentlichen Liste zu
finden ist.

@item @code{file} (Vorgabe: @code{#f})
Optional kann hier eine vorrangig benutzte alternative Konfiguration
festgelegt werden.
@end table
@end deftp

@deftp {Datentyp} mumble-server-public-registration-configuration
Konfiguration für das öffentliche Registrieren eines
@code{mumble-server}-Dienstes.

@table @asis
@item @code{name}
Dies ist ein Anzeigename für Ihren Server. Er ist nicht zu verwechseln mit
dem Rechnernamen („Hostname“).

@item @code{password}
Ein Passwort, um Ihre Registrierung zu identifizieren. Nachfolgende
Aktualisierungen müssen dasselbe Passwort benutzen. Verlieren Sie Ihr
Passwort nicht.

@item @code{url}
Dies sollte ein Link mit @code{http://} oder @code{https://} auf Ihren
Webauftritt sein.

@item @code{hostname} (Vorgabe: @code{#f})
Nach Vorgabe wird Ihr Server über seine IP-Adresse aufgeführt. Wenn dies
gesetzt ist, wird er stattdessen mit diesem Rechnernamen verknüpft.
@end table
@end deftp

@quotation Hinweis: Folgendes wird demnächst verschwinden
Aus historischen Gründen werden alle oben genannten
@code{mumble-server}-Prozeduren auch unter dem Namenspräfix @code{murmur-}
exportiert. Sie sollten für die Zukunft auf @code{mumble-server-} umsteigen.
@end quotation

@node Dateientauschdienste
@subsection Dateientauschdienste

Im Modul @code{(gnu services file-sharing)} werden Dienste bereitgestellt,
die beim Übertragen von Dateien zwischen Netzwerkteilnehmern untereinander
helfen („peer-to-peer“).

@subsubheading Transmission-Daemon-Dienst

@uref{https://transmissionbt.com/, Transmission} ist ein vielseitiger
BitTorrent-Client, der eine Vielzahl grafischer und befehlszeilenbasierter
Benutzeroberflächen bereitstellt. Ein Dienst vom Typ
@code{transmission-daemon-service-type} macht die Variante für die Nutzung
ohne Oberfläche zugänglich, nämlich @command{transmission-daemon}, als ein
Systemdienst, mit dem Benutzer Dateien über BitTorrent teilen können, selbst
wenn sie gerade nicht angemeldet sind.

@defvar transmission-daemon-service-type
Der Diensttyp für den BitTorrent-Client „Transmission Daemon“. Sein Wert
muss ein @code{transmission-daemon-configuration}-Verbundsobjekt wie in
diesem Beispiel sein:

@lisp
(service transmission-daemon-service-type
         (transmission-daemon-configuration
          ;; Zugriff auf die Steuerungsschnittstelle über
          ;; entfernte Prozeduraufrufe (Remote Procedure Calls)
          (rpc-authentication-required? #t)
          (rpc-username "transmission")
          (rpc-password
           (transmission-password-hash
            "transmission" ; gewünschtes Passwort
            "uKd1uMs9"))   ; beliebiges „Salt“

          ;; Anfragen von diesem Rechner und Rechnern im
          ;; lokalen Netzwerk erlauben
          (rpc-whitelist-enabled? #t)
          (rpc-whitelist '("::1" "127.0.0.1" "192.168.0.*"))

          ;; Während der Arbeitszeit die Bandbreite begrenzen
          (alt-speed-down (* 1024 2)) ;   2 MB/s
          (alt-speed-up 512)          ; 512 kB/s

          (alt-speed-time-enabled? #t)
          (alt-speed-time-day 'weekdays)
          (alt-speed-time-begin
           (+ (* 60 8) 30))           ; 8:30 morgens
          (alt-speed-time-end
           (+ (* 60 (+ 12 5)) 30))))  ; 5:30 nachmittags@tie{}/ abends
@end lisp
@end defvar

Sobald der Dienst gestartet wurde, können Benutzer mit dem Daemon über seine
Webschnittstelle interagieren (auf @code{http://localhost:9091/}) oder indem
sie das Werkzeug @command{transmission-remote} auf der Befehlszeile
aufrufen. Es ist Teil des Pakets @code{transmission}. (Emacs-Nutzer möchten
vielleicht einen Blick auf das Paket @code{emacs-transmission} werfen.)
Beide kommunizieren mit dem Daemon über seine Schnittstelle für entfernte
Prozeduraufrufe (Remote Procedure Calls, RPC), was nach Vorgabe jedem Nutzer
auf dem System zur Verfügung steht. Sie könnten das ändern wollen, indem Sie
die Einstellungen @code{rpc-authentication-required?}, @code{rpc-username}
und @code{rpc-password} anpassen, wie oben gezeigt und im Folgenden
beschrieben.

Als Wert für @code{rpc-password} muss ein Passwort in der Art angegeben
werden, die Transmission-Clients erzeugen und nutzen. Sie können es aus
einer bestehenden Datei @file{settings.json} exakt kopieren, wenn bereits
ein anderer Transmission-Client benutzt wurde. Andernfalls können Sie mit
den Prozeduren @code{transmission-password-hash} und
@code{transmission-random-salt} aus diesem Modul einen geeigneten Hash-Wert
bestimmen.

@deffn {Prozedur} transmission-password-hash Passwort Salt
Liefert eine Zeichenkette mit dem Hash von @var{Passwort} zusammen mit dem
@var{Salt} in dem Format, das Clients für Transmission für deren
@code{rpc-password}-Einstellung erkennen.

Das @var{Salt} muss eine acht Zeichen lange Zeichenkette sein. Die Prozedur
@code{transmission-random-salt} kann benutzt werden, um einen geeigneten
Salt-Wert zufällig zu erzeugen.
@end deffn

@deffn {Prozedur} transmission-random-salt
Liefert eine Zeichenkette mit einem zufälligen, acht Zeichen langen
Salt-Wert von der Art, wie sie Clients für Transmission erzeugen und
benutzen. Sie ist dafür geeignet, an die Prozedur
@code{transmission-password-hash} übergeben zu werden.
@end deffn

Diese Prozeduren sind aus einer über den Befehl @command{guix repl}
gestarteten Guile-REPL heraus zugänglich (siehe @ref{Aufruf von guix repl}). Sie eignen sich dafür, einen zufälligen Salt-Wert zu bekommen, der
als der zweite Parameter an „transmission-password-hash“ übergeben werden
kann. Zum Beispiel:

@example
$ guix repl
scheme@@(guix-user)> ,use (gnu services file-sharing)
scheme@@(guix-user)> (transmission-random-salt)
$1 = "uKd1uMs9"
@end example

Alternativ kann ein vollständiger Passwort-Hash in einem einzigen Schritt
erzeugt werden:

@example
scheme@@(guix-user)> (transmission-password-hash "transmission"
(transmission-random-salt))
$2 = "@{c8bbc6d1740cd8dc819a6e25563b67812c1c19c9VtFPfdsX"
@end example

Die sich ergebende Zeichenkette kann so, wie sie ist, als der Wert von
@code{rpc-password} eingesetzt werden. Dadurch kann das Passwort geheim
gehalten werden, selbst in einer Betriebssystemkonfiguration.

Vom Daemon heruntergeladene Torrent-Dateien sind nur für die Benutzer in der
Benutzergruppe „transmission“ direkt zugänglich. Sie haben auf das in der
Einstellung @code{download-dir} angegebene Verzeichnis nur Lesezugriff (und
auf das in @code{incomplete-dir} angegebene Verzeichnis, sofern
@code{incomplete-dir-enabled?} auf @code{#t} gesetzt ist). Heruntergeladene
Dateien können in beliebige Verzeichnisse verschoben oder ganz gelöscht
werden, indem Sie @command{transmission-remote} mit den
Befehlszeilenoptionen @code{--move} zum Verschieben und
@code{--remove-and-delete} zum Löschen benutzen.

Wenn die Einstellung @code{watch-dir-enabled?} auf @code{#t} gesetzt ist,
haben die Benutzer in der Gruppe „transmission“ auch die Möglichkeit,
@file{.torrent}-Dateien in dem über @code{watch-dir} angegebenen Verzeichnis
zu platzieren. Dadurch fügt der Daemon die entsprechenden Torrents
hinzu. (Mit der Einstellung @code{trash-original-torrent-files?} wird
festgelegt, ob der Daemon diese Dateien löschen soll, wenn er mit ihnen
fertig ist.)

Manche der Einstellungen des Daemons können zeitweilig über
@command{transmission-remote} und ähnliche Werkzeuge geändert werden. Sie
können solche Änderungen rückgängig machen, indem Sie die
@code{reload}-Aktion des Dienstes aufrufen. Dann lädt der Daemon seine
Einstellungen neu von der Platte:

@example
# herd reload transmission-daemon
@end example

Die vollständige Menge der Einstellmöglichkeiten finden Sie in der
Definition des Datentyps @code{transmission-daemon-configuration}.

@deftp {Datentyp} transmission-daemon-configuration
Dieser Datentyp repräsentiert die Einstellungen für den
Transmission-Daemon. Sie entsprechen direkt den Einstellungen, die Clients
für Transmission aus deren Datei @file{settings.json} erkennen können.
@end deftp

@c The following documentation was initially generated by
@c (generate-transmission-daemon-documentation) in (gnu services
@c file-sharing).  Manually maintained documentation is better, so we
@c shouldn't hesitate to edit below as needed.  However if the change
@c you want to make to this documentation can be done in an automated
@c way, it's probably easier to change (generate-documentation) than to
@c make it below and have to deal with the churn as Transmission Daemon
@c updates.

@c %start of fragment

Verfügbare @code{transmission-daemon-configuration}-Felder sind:

@deftypevr {@code{transmission-daemon-configuration}-Parameter} „package“ transmission
Das Transmission-Paket, das benutzt werden soll.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl stop-wait-period
Wie viele Sekunden gewartet werden soll, wenn der Dienst für
@command{transmission-daemon} gestoppt wird, bis dieser sich beendet, bevor
sein Prozess erzwungen beendet wird. Dadurch wird dem Daemon etwas Zeit
gegeben, seine Daten in Ordnung zu bringen und seinen Trackern ein letztes
Mal Bescheid zu geben, wenn er herunterfährt. Auf langsamen Rechnern oder
Rechnern mit einer langsamen Netzwerkanbindung könnte es besser sein, diesen
Wert zu erhöhen.

Die Vorgabe ist @samp{10}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Zeichenkette download-dir
Das Verzeichnis, wohin Torrent-Dateien heruntergeladen werden.

Die Vorgabe ist @samp{"/var/lib/transmission-daemon/downloads"}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck incomplete-dir-enabled?
Wenn es @code{#t} ist, werden Dateien in @code{incomplete-dir}
zwischengespeichert, während ihr Torrent heruntergeladen wird, und nach
Abschluss des Torrents nach @code{download-dir} verschoben. Andernfalls
werden Dateien für alle Torrents gleich in @code{download-dir} gespeichert
(einschließlich derer, bei denen das Herunterladen noch im Gange ist).

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Vielleicht-Zeichenkette incomplete-dir
In welchem Verzeichnis die Dateien bei noch nicht abgeschlossenem
Herunterladen zwischengespeichert werden, falls
@code{incomplete-dir-enabled?} auf @code{#t} gesetzt ist.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} umask umask
Die Dateimodusmaske, mit der heruntergeladene Dateien erzeugt werden. (Siehe
die Handbuchseite von @command{umask} für mehr Informationen.)

Die Vorgabe ist @samp{18}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck rename-partial-files?
Wenn es @code{#t} ist, wird an die Namen teilweise heruntergeladener Dateien
„.part“ angehängt.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Zuweisungsmodus preallocation
Auf welche Art vorab Speicher für heruntergeladene Dateien zugewiesen werden
soll. Entweder @code{none} (gar nicht), @code{fast} (schnell) bzw.@:
gleichbedeutend @code{sparse} (dünnbesetzt/kompakt) oder @code{full}
(gänzlich). Bei @code{full} fragmentiert die Platte am wenigsten, aber es
dauert länger, die Datei zu erzeugen.

Vorgegeben ist @samp{fast}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck watch-dir-enabled?
Ist es @code{#t}, wird das in @code{watch-dir} angegebene Verzeichnis
beobachtet, ob dort neue @file{.torrent}-Dateien eingefügt werden. Die darin
beschriebenen Torrents werden automatisch hinzugefügt (und die
ursprünglichen Dateien werden entfernt, wenn
@code{trash-original-torrent-files?} auf @code{#t} steht).

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Vielleicht-Zeichenkette watch-dir
Welches Verzeichnis beobachtet wird, ob dort neue @file{.torrent}-Dateien
eingefügt werden, die neu hinzuzufügende Torrents anzeigen, falls
@code{watch-dir-enabled} auf @code{#t} steht.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck trash-original-torrent-files?
Wenn es @code{#t} ist, werden @file{.torrent}-Dateien aus dem beobachteten
Verzeichnis gelöscht, sobald ihr Torrent hinzugefügt worden ist (siehe
@code{watch-directory-enabled?}).

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck speed-limit-down-enabled?
Wenn es @code{#t} ist, wird die Geschwindigkeit beim Herunterladen durch den
Daemon durch die in @code{speed-limit-down} angegebene Rate beschränkt.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl speed-limit-down
Die standardmäßige globale Höchstgeschwindigkeit für das Herunterladen, in
Kilobyte pro Sekunde.

Die Vorgabe ist @samp{100}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck speed-limit-up-enabled?
Wenn es @code{#t} ist, wird die Geschwindigkeit des Daemons beim Hochladen
durch die in @code{speed-limit-up} eingestellte Rate beschränkt.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl speed-limit-up
Die standardmäßige globale Höchstgeschwindigkeit für das Hochladen, in
Kilobyte pro Sekunde.

Die Vorgabe ist @samp{100}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck alt-speed-enabled?
Wenn es @code{#t} ist, gelten die alternativen Höchstgeschwindigkeiten
@code{alt-speed-down} und @code{alt-speed-up} (statt @code{speed-limit-down}
und @code{speed-limit-up}, wenn sie aktiviert sind), um die
Bandbreitennutzung des Daemons einzuschränken. Sie können einen Plan
festlegen, zu welchen Zeiten in der Woche sie automatisch aktiviert werden;
siehe @code{alt-speed-time-enabled?}.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl alt-speed-down
Die alternative globale Höchstgeschwindigkeit für das Herunterladen, in
Kilobyte pro Sekunde.

Die Vorgabe ist @samp{50}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl alt-speed-up
Die alternative globale Höchstgeschwindigkeit für das Hochladen, in Kilobyte
pro Sekunde.

Die Vorgabe ist @samp{50}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck alt-speed-time-enabled?
Wenn es @code{#t} ist, werden die alternativen Höchstgeschwindigkeiten
@code{alt-speed-down} und @code{alt-speed-up} automatisch während bestimmter
Zeitperioden aktiviert, entsprechend der Einstellungen für
@code{alt-speed-time-day}, @code{alt-speed-time-begin} und
@code{alt-speed-time-end}.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Tage-Liste alt-speed-time-day
An welchen Wochentagen die alternative Höchstgeschwindigkeitsplanung benutzt
werden soll. Anzugeben ist entweder eine Liste der englischen Namen der
Wochentage (@code{sunday}, @code{monday} und so weiter) oder eines der
Symbole @code{weekdays} (unter der Woche), @code{weekends} (an Wochenenden)
oder @code{all}.

Die Vorgabe ist @samp{all}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl alt-speed-time-begin
Zu welcher Uhrzeit die alternativen Höchstgeschwindigkeiten in Kraft treten,
als Anzahl der Minuten seit Mitternacht.

Die Vorgabe ist @samp{540}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl alt-speed-time-end
Ab welcher Uhrzeit die alternativen Höchstgeschwindigkeiten nicht mehr
gelten, als Anzahl der Minuten seit Mitternacht.

Die Vorgabe ist @samp{1020}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Zeichenkette bind-address-ipv4
Auf welcher IP-Adresse auf Verbindungen von anderen Netzwerkteilnehmern
(Peers) gelauscht wird. Benutzen Sie „@code{0.0.0.0}“, wenn auf allen
verfügbaren IP-Adressen gelauscht werden soll.

Die Vorgabe ist @samp{"0.0.0.0"}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Zeichenkette bind-address-ipv6
Auf welcher IPv6-Adresse auf Verbindungen von anderen Netzwerkteilnehmern
(Peers) gelauscht wird. Benutzen Sie „@code{::}“, wenn auf allen verfügbaren
IPv6-Adressen gelauscht werden soll.

Die Vorgabe ist @samp{"::"}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck peer-port-random-on-start?
Wenn es @code{#t} ist, wählt der Daemon bei seinem Start einen Port mit
zufälliger Portnummer, auf dem er auf Verbindungen durch andere
Netzwerkteilnehmer lauscht. Die Nummer liegt zwischen (einschließlich) den
Angaben in @code{peer-port-random-low} und
@code{peer-port-random-high}. Ansonsten wird er auf dem in @code{peer-port}
angegebenen Port lauschen.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Portnummer peer-port-random-low
Die niedrigste Portnummer, die ausgewählt werden kann, wenn
@code{peer-port-random-on-start?} auf @code{#t} steht.

Die Vorgabe ist @samp{49152}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Portnummer peer-port-random-high
Die höchste Portnummer, die ausgewählt werden kann, wenn
@code{peer-port-random-on-start?} auf @code{#t} steht.

Die Vorgabe ist @samp{65535}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Portnummer peer-port
Auf welchem Port auf Verbindungsversuche anderer Netzwerkteilnehmer
gelauscht wird, wenn @code{peer-port-random-on-start?} auf @code{#f} steht.

Die Vorgabe ist @samp{51413}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck port-forwarding-enabled?
Wenn es @code{#t} ist, wird der Daemon versuchen, eine Weiterleitung
benötigter Ports beim Internetzugang (Gateway), an dem der Rechner
angeschlossen ist, automatisch über UPnP und NAT-PMP einzurichten.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Verschlüsselungsmodus encryption
Ob Verbindungen zu anderen Netzwerkteilnehmern (Peers) verschlüsselt werden
sollen; entweder @code{prefer-unencrypted-connections} (unverschlüsselte
Verbindungen bevorzugen), @code{prefer-encrypted-connections}
(verschlüsselte Verbindungen bevorzugen) oder
@code{require-encrypted-connections} (nur verschlüsselte Verbindungen
benutzen).

Die Vorgabe ist @samp{prefer-encrypted-connections}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Vielleicht-Zeichenkette peer-congestion-algorithm
Der Algorithmus zur TCP-Staukontrolle, der für Verbindungen zu anderen
Netzwerkteilnehmern (Peers) verwendet werden soll. Anzugeben ist eine
Zeichenkette, die das Betriebssystem für Aufrufe an @code{setsockopt}
zulässt. Wenn nichts angegeben wird, wird die Voreinstellung des
Betriebssystems angewandt.

Es ist anzumerken, dass der Kernel auf GNU/Linux-Systemen so konfiguriert
werden muss, dass Prozesse zur Nutzung eines nicht standardmäßigen
Algorithmus zur Staukontrolle berechtigt sind, andernfalls wird er solche
Anfragen mit „Die Operation ist nicht erlaubt“ ablehnen. Um die auf Ihrem
System verfügbaren und zur Nutzung freigegebenen Algorithmen zu sehen,
schauen Sie sich den Inhalt der Dateien
@file{tcp_available_congestion_control} und
@file{tcp_allowed_congestion_control} im Verzeichnis
@file{/proc/sys/net/ipv4} an.

Wenn Sie zum Beispiel den Transmission-Daemon zusammen mit dem
@uref{http://www-ece.rice.edu/networks/TCP-LP/,TCP-LP-Algorithmus} („TCP Low
Priority“) zur Staukontrolle benutzen möchten, müssen Sie Ihre
Kernelkonfiguration anpassen, damit Unterstützung für den Algorithmus
eingebaut wird. Anschließend müssen Sie Ihre Betriebssystemkonfiguration
anpassen, um dessen Nutzung zu erlauben, indem Sie einen Dienst des Typs
@code{sysctl-service-type} hinzufügen (bzw.@: die Konfiguration des
bestehenden Dienstes anpassen). Fügen Sie Zeilen ähnlich der folgenden
hinzu:

@lisp
(service sysctl-service-type
         (sysctl-configuration
          (settings
           ("net.ipv4.tcp_allowed_congestion_control" .
            "reno cubic lp"))))
@end lisp

Dann können Sie die Konfiguration des Transmission-Daemons aktualisieren zu

@lisp
(peer-congestion-algorithm "lp")
@end lisp

und das System rekonfigurieren, damit die Änderungen in Kraft treten.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} TCP-Type-Of-Service peer-socket-tos
Welcher Type-Of-Service in ausgehenden TCP-Paketen angefragt werden soll;
entweder @code{default}, @code{low-cost}, @code{throughput},
@code{low-delay} oder @code{reliability}.

Die Vorgabe ist @samp{default}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl peer-limit-global
Die globale Höchstgrenze für die Anzahl verbundener Netzwerkteilnehmer
(Peers).

Die Vorgabe ist @samp{200}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl peer-limit-per-torrent
Die Höchstgrenze pro Torrent für die Anzahl verbundener Netzwerkteilnehmer
(Peers).

Die Vorgabe ist @samp{50}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl upload-slots-per-torrent
An wie viele Netzwerkteilnehmer der Daemon höchstens für denselben Torrent
gleichzeitig Daten hochlädt.

Die Vorgabe ist @samp{14}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl peer-id-ttl-hours
Wie viele Stunden die jedem öffentlichen Torrent zugewiesene Peer-ID
höchstens benutzt wird, bevor sie neu erzeugt wird.

Die Vorgabe ist @samp{6}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck blocklist-enabled?
Wenn es @code{#t} ist, wird der Daemon in der Sperrliste vorkommende
Netzwerkteilnehmer ignorieren. Die Sperrliste lädt er von der
@code{blocklist-url} herunter.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Vielleicht-Zeichenkette blocklist-url
Die URL zu einer Filterliste zu sperrender Netzwerkteilnehmer (Peers) im
P2P-Plaintext-Format oder im eMule-@file{.dat}-Format. Sie wird regelmäßig
neu heruntergeladen und angewandt, wenn @code{blocklist-enabled?} auf
@code{#t} gesetzt ist.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck download-queue-enabled?
Wenn es @code{#t} ist, wird der Daemon höchstens @code{download-queue-size}
@emph{nicht} stillstehende Torrents gleichzeitig herunterladen.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl download-queue-size
Die Größe der Warteschlange herunterzuladender Torrents. Sie ist die
Höchstzahl @emph{nicht} stillstehender Torrents, die gleichzeitig
heruntergeladen werden, wenn @code{download-queue-enabled?} auf @code{#t}
gesetzt ist.

Die Vorgabe ist @samp{5}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck seed-queue-enabled?
Wenn es @code{#t} ist, wird der Daemon höchstens @code{seed-queue-size}
@emph{nicht} stillstehende Torrents gleichzeitig verteilen („seeden“).

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl seed-queue-size
Die Größe der Warteschlange zu verteilender Torrents. Sie ist die Höchstzahl
@emph{nicht} stillstehender Torrents, die gleichzeitig verteilt werden, wenn
@code{seed-queue-enabled?} auf @code{#t} gesetzt ist.

Die Vorgabe ist @samp{10}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck queue-stalled-enabled?
Wenn es @code{#t} ist, wird der Daemon solche Torrents als stillstehend
erachten, für die er in den letzten @code{queue-stalled-minutes} Minuten
@emph{keine} Daten geteilt hat, und diese bei Beachtung der Beschränkungen
in @code{download-queue-size} und @code{seed-queue-size} @emph{nicht}
berücksichtigen.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl queue-stalled-minutes
Für wie viele Minuten ein Torrent höchstens inaktiv sein darf, bevor er als
stillstehend gilt, sofern @code{queue-stalled-enabled?} auf @code{#t} steht.

Die Vorgabe ist @samp{30}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck ratio-limit-enabled?
Wenn es @code{#t} ist, werden Torrents, die verteilt („geseedet“) werden,
automatisch pausiert, sobald das in @code{ratio-limit} festgelegte
Verhältnis erreicht ist.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-rationale-Zahl ratio-limit
Das Verhältnis, ab dem ein Torrent, der verteilt wird, pausiert wird, wenn
@code{ratio-limit-enabled?} auf @code{#t} gesetzt ist.

Die Vorgabe ist @samp{2.0}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck idle-seeding-limit-enabled?
Wenn es @code{#t} ist, werden Torrents, die verteilt werden, automatisch
pausiert, sobald sie für @code{idle-seeding-limit} Minuten inaktiv waren.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl idle-seeding-limit
Wie viele Minuten ein Torrent, der verteilt wird, höchstens inaktiv sein
darf, bevor er pausiert wird, wenn @code{idle-seeding-limit-enabled?} auf
@code{#t} gesetzt ist.

Die Vorgabe ist @samp{30}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck dht-enabled?
Das @uref{http://bittorrent.org/beps/bep_0005.html,DHT-Protokoll} zum
Einsatz einer verteilten Hashtabelle (Distributed Hash Table, DHT) zur
Unterstützung trackerloser Torrents aktivieren.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck lpd-enabled?
@uref{https://en.wikipedia.org/wiki/Local_Peer_Discovery,Local Peer
Discovery} (LPD) aktivieren, d.h.@: Netzwerkteilnehmer im lokalen Netz
werden ermittelt, wodurch vielleicht weniger Daten über das öffentliche
Internet gesendet werden müssen.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck pex-enabled?
@uref{https://en.wikipedia.org/wiki/Peer_exchange,Peer Exchange} (PEX)
aktivieren, wodurch der Daemon weniger von externen Trackern abhängt und
vielleicht schneller ist.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck utp-enabled?
Das
@uref{http://bittorrent.org/beps/bep_0029.html,Mikro-Transport-Protokoll}
(uTP) aktivieren, damit BitTorrent-Datenverkehr andere Netzwerknutzungen im
lokalen Netzwerk weniger beeinträchtigt, die verfügbare Bandbreite aber
möglichst voll ausgeschöpft wird.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck rpc-enabled?
Wenn es @code{#t} ist, wird die Fernsteuerung des Daemons über die
Schnittstelle entfernter Prozeduraufrufe (Remote Procedure Call, RPC)
zugelassen. Dadurch kann man ihn über seine Weboberfläche, über den
Befehlszeilen-Client @command{transmission-remote} oder über ähnliche
Werkzeuge steuern.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Zeichenkette rpc-bind-address
Auf welcher IP-Adresse auf RPC-Verbindungen gelauscht wird. Benutzen Sie
„@code{0.0.0.0}“, wenn auf allen verfügbaren IP-Adressen gelauscht werden
soll.

Die Vorgabe ist @samp{"0.0.0.0"}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Portnummer rpc-port
Auf welchem Port auf RPC-Verbindungen gelauscht werden soll.

Die Vorgabe ist @samp{9091}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Zeichenkette rpc-url
Das Präfix für die Pfade in den URLs des RPC-Endpunkts.

Die Vorgabe ist @samp{"/transmission/"}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck rpc-authentication-required?
Wenn es @code{#t} ist, müssen sich Clients bei der RPC-Schnittstelle
authentifizieren (siehe @code{rpc-username} und
@code{rpc-password}). Anzumerken ist, dass dann die Liste erlaubter
Rechnernamen ignoriert wird (siehe @code{rpc-host-whitelist-enabled?}.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Vielleicht-Zeichenkette rpc-username
Welchen Benutzernamen Clients verwenden müssen, um über die
RPC-Schnittstelle zugreifen zu dürfen, wenn
@code{rpc-authentication-required?} auf @code{#t} gesetzt ist.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Vielleicht-Transmissionpasswort-Hash rpc-password
Welches Passwort Clients brauchen, um über die RPC-Schnittstelle zugreifen
zu dürfen, wenn @code{rpc-authentication-required?} auf @code{#t} gesetzt
ist. Es muss als Passwort-Hash im von Transmission-Clients erkannten Format
angegeben werden. Kopieren Sie es entweder aus einer bestehenden
@file{settings.json}-Datei oder lassen Sie es mit der Prozedur
@code{transmission-password-hash} erzeugen.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck rpc-whitelist-enabled?
Wenn es @code{#t} ist, werden RPC-Anfragen nur dann akzeptiert, wenn sie von
einer in @code{rpc-whitelist} angegebenen Adresse kommen.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Zeichenketten-Liste rpc-whitelist
Die Liste der IP- und IPv6-Adressen, von denen RPC-Anfragen angenommen
werden, wenn @code{rpc-whitelist-enabled?} auf @code{#t} gesetzt
ist. Hierbei kann @samp{*} als Platzhalter verwendet werden.

Die Vorgabe ist @samp{'("127.0.0.1" "::1")}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck rpc-host-whitelist-enabled?
Wenn es @code{#t} ist, werden RPC-Anfragen nur dann angenommen, wenn sie an
einen Rechnernamen aus der Liste @code{rpc-host-whitelist} adressiert
sind. Allerdings werden Anfragen an „localhost“ oder „localhost.“ oder eine
numerische Adresse immer angenommen, egal was hier eingestellt ist.

Anzumerken ist, dass diese Funktionalität ignoriert wird, wenn
@code{rpc-authentication-required?} auf @code{#t} gesetzt ist.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Zeichenketten-Liste rpc-host-whitelist
Die Liste der Rechnernamen, auf die der RPC-Server reagiert, wenn
@code{rpc-host-whitelist-enabled?} auf @code{#t} gesetzt ist.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Meldungsstufe message-level
Ab welcher Schwerestufe der Daemon Meldungen ins Protokoll (in
@file{/var/log/transmission.log}) aufnimmt, entweder @code{none} (gar
nicht), @code{error} (nur Fehler), @code{info} oder @code{debug}.

Die Vorgabe ist @samp{info}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck start-added-torrents?
Wenn es @code{#t} ist, werden Torrents gestartet, sobald sie hinzugefügt
wurden, ansonsten sind sie nach dem Hinzufügen im pausierten Zustand.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck script-torrent-done-enabled?
Wenn es @code{#t} ist, wird immer dann, wenn ein Torrent abgeschlossen
wurde, das durch @code{script-torrent-done-filename} angegebene Skript
aufgerufen.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Vielleicht-Dateiobjekt script-torrent-done-filename
Ein Dateiname oder ein dateiartiges Objekt eines Skripts, das nach Abschluss
eines Torrents aufgerufen werden soll, wenn
@code{script-torrent-done-enabled?} auf @code{#t} gesetzt ist.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck scrape-paused-torrents-enabled?
Wenn es @code{#t} ist, wird der Daemon selbst dann auf Trackern nach einem
Torrent suchen, wenn der Torrent pausiert ist.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Nichtnegative-ganze-Zahl cache-size-mb
Wie viele Megabyte Speicher für den im Arbeitsspeicher liegenden
Zwischenspeicher des Daemons reserviert werden sollen. Ein größerer Wert
kann eine höhere Leistung bedeuten, indem weniger oft auf die Platte
zugegriffen werden muss.

Die Vorgabe ist @samp{4}.

@end deftypevr

@deftypevr {@code{transmission-daemon-configuration}-Parameter} Boolescher-Ausdruck prefetch-enabled?
Wenn es @code{#t} ist, wird der Daemon versuchen, die Ein-/Ausgabeleistung
zu verbessern, indem er dem Betriebssystem Hinweise gibt, auf welche Daten
er wahrscheinlich als Nächstes zugreift, um den Anfragen anderer
Netzwerkteilnehmer nachzukommen.

Die Vorgabe ist @samp{#t}.

@end deftypevr


@c %end of fragment



@node Systemüberwachungsdienste
@subsection Systemüberwachungsdienste

@subsubheading Darkstat-Dienst
@cindex darkstat
Darkstat ist ein Netzwerkanalyseprogramm, das Pakete im Datenverkehr
aufzeichnet, Statistiken zur Netzwerknutzung berechnet und über HTTP
Berichte dazu bereitstellt.

@defvar darkstat-service-type
Dies ist der Diensttyp für den @uref{https://unix4lyfe.org/darkstat/,
darkstat-Dienst}. Sein Wert muss ein
@code{darkstat-configuration}-Verbundsobjekt sein, wie in diesem Beispiel:

@lisp
(service darkstat-service-type
         (darkstat-configuration
           (interface "eno1")))
@end lisp
@end defvar

@deftp {Datentyp} darkstat-configuration
Datentyp, der die Konfiguration von @command{darkstat} repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @code{darkstat})
Welches darkstat-Paket verwendet werden soll.

@item @code{interface}
Datenverkehr an der angegebenen Netzwerkschnittstelle mitschneiden.

@item @code{port} (Vorgabe: @code{"667"})
Bindet die Weboberfläche an den angegebenen Port.

@item @code{bind-address} (Vorgabe: @code{"127.0.0.1"})
Bindet die Weboberfläche an die angegebene Adresse.

@item @code{base} (Vorgabe: @code{"/"})
Geben Sie den Pfad der Basis-URL an. Das kann nützlich sein, wenn auf
@command{darkstat} über einen inversen Proxy („Reverse Proxy“) zugegriffen
wird.

@end table
@end deftp

@anchor{prometheus-node-exporter}
@subsubheading Prometheus-Node-Exporter-Dienst
@cindex prometheus-node-exporter

Der Prometheus-„Node-Exporter“ stellt Statistiken über Hardware und
Betriebssystem für das Prometheus-Systemüberwachungssystem bereit, die vom
Linux-Kernel geliefert werden. Dieser Dienst sollte auf allen physischen
Netzwerkknoten und virtuellen Maschinen installiert werden, für die eine
Überwachung ihrer Statistiken gewünscht wird.

@defvar prometheus-node-exporter-service-type
Dies ist der Diensttyp für den
@uref{https://github.com/prometheus/node_exporter/,
„prometheus-node-exporter“-Dienst}. Sein Wert muss ein
@code{prometheus-node-exporter-configuration}-Verbundsobjekt sein.

@lisp
(service prometheus-node-exporter-service-type)
@end lisp
@end defvar

@deftp {Datentyp} prometheus-node-exporter-configuration
Repräsentiert die Konfiguration von @command{node_exporter}.

@table @asis
@item @code{package} (Vorgabe: @code{go-github-com-prometheus-node-exporter})
Das Paket für den prometheus-node-exporter, was benutzt werden soll.

@item @code{web-listen-address} (Vorgabe: @code{":9100"})
Bindet die Weboberfläche an die angegebene Adresse.

@item @code{textfile-directory} (Vorgabe: @code{"/var/lib/prometheus/node-exporter"})
In dieses Verzeichnis können maschinenspezifische Metriken exportiert
werden. Hier hinein sollten Dateien mit Metriken im Textformat platziert
werden, die die Dateiendung @code{.prom} haben.

@item @code{extra-options} (Vorgabe: @code{'()})
Zusätzliche Befehlszeilenoptionen, die an den prometheus-node-exporter
übergeben werden sollen.

@end table
@end deftp

@anchor{vnstat}
@subsubheading vnStat-Netzwerkverkehrüberwachung
@cindex vnstat

vnStat ist ein Programm zur Überwachung des Netzwerkverkehrs. Es benutzt die
Statistiken, die der Kernel zu den Schnittstellen sammelt, statt den Verkehr
mitzuschneiden. Dadurch wird das System selbst bei einer hohen Datenrate des
Netzwerkverkehrs wenig belastet.

@defvar vnstat-service-type
Dies ist der Diensttyp für den Daemon von
@uref{https://humdi.net/vnstat/,vnStat}. Als Wert akzeptiert er eine
@code{vnstat-configuration}.

Das folgende Beispiel richtet den Dienst mit seinen Vorgabewerten ein:

@lisp
(service vnstat-service-type)
@end lisp
@end defvar

@c %start of fragment
@deftp {Datentyp} vnstat-configuration
Verfügbare @code{vnstat-configuration}-Felder sind:

@table @asis
@item @code{package} (Vorgabe: @code{vnstat}) (Typ: dateiartig)
Das vnstat-Paket.

@item @code{database-directory} (Vorgabe: @code{"/var/lib/vnstat"}) (Typ: Zeichenkette)
Gibt das Verzeichnis an, in dem die Datenbank gespeichert werden soll. Es
muss ein vollständiger Pfad angegeben werden; ein „/“ am Ende ist
freiwillig.

@item @code{5-minute-hours} (Vorgabe: @code{48}) (Typ: Vielleicht-Ganze-Zahl)
Wie lange Dateneinträge mit einer fünf Minuten genauen Auflösung gespeichert
bleiben. Hier legen Sie fest, für wie viele Stunden zurück Einträge
gespeichert werden. Setzen Sie dies auf @code{-1}, damit Einträge unbegrenzt
gespeichert bleiben, oder auf @code{0}, damit keine Daten mit dieser
Auflösung erfasst werden.

@item @code{64bit-interface-counters} (Vorgabe: @code{-2}) (Typ: Vielleicht-Ganze-Zahl)
Wie Zähler von Schnittstellen behandelt werden. Bei @code{1} wird für alle
Schnittstellen angenommen, dass sie auf Kernel-Seite 64-Bit-Zähler benutzen;
bei @code{0}, dass sie 32-Bit-Zähler benutzen. Bei @code{-1} wird die
frühere Logik aus alten Versionen benutzt, nach der für Zählerwerte, die in
32 Bit passen, angenommen wird, dass der Zähler 32 Bit hat, und bei größeren
wird ein 64-Bit-Zähler angenommen. Das kann zu falschen Ergebnissen führen,
wenn ein 64-Bit-Zähler auf einen Wert zurückgesetzt wird, für den 32 Bits
genügen. Setzen Sie dies auf @code{-2}, damit die Größe anhand von
Kernel-Datenstrukturen automatisch erkannt wird.

@item @code{always-add-new-interfaces?} (Vorgabe: @code{#t}) (Typ: Vielleicht-Boolescher-Ausdruck)
Ob neue Datenbankeinträge für Schnittstellen, die in der Datenbank noch
fehlen, automatisch angelegt werden sollen, selbst wenn die Datenbank beim
Starten des Daemons bereits existiert. Neue Datenbankeinträge werden
außerdem angelegt, wenn der schon laufende Daemon neue Schnittstellen
sieht. Die Pseudo-Schnittstellen @samp{lo}, @samp{lo0} und @samp{sit0}
werden dabei immer außen vor gelassen.

@item @code{bandwidth-detection?} (Vorgabe: @code{#t}) (Typ: Vielleicht-Boolescher-Ausdruck)
Ob versucht werden soll, den Wert für @var{max-bandwidth} automatisch für
jede beobachtete Schnittstelle zu finden. Hauptsächlich wird das nur bei
Ethernet-Schnittstellen unterstützt. @var{max-bandwidth} wird notfalls
benutzt, wenn die Erkennung fehlschlägt. Wenn die jeweilige Schnittstelle
mit @var{max-BW} konfiguriert wurde, wird keine Erkennung dafür
durchgeführt. In Linux ist die Erkennung bei tun-Schnittstellen
abgeschaltet, weil der Linux-Kernel immer 10 Mbit meldet, egal was die echte
Schnittstelle benutzt.

@item @code{bandwidth-detection-interval} (Vorgabe: @code{5}) (Typ: Vielleicht-Ganze-Zahl)
In wie viel Minuten Abstand die Erkennung möglicher Änderungen der
@var{max-bandwidth} für jede Schnittstelle durchgeführt werden soll, wenn
@var{bandwidth-detection} aktiv ist. Wenn Sie dies auf @code{0} setzen,
deaktivieren Sie es. Wertebereich: @samp{0}..@samp{30}

@item @code{boot-variation} (Vorgabe: @code{15}) (Typ: Vielleicht-Ganze-Zahl)
Wie viele Sekunden Abweichung bei jeder Datenbankaktualisierung zwischen der
vom Systemkernel gemeldeten Boot Time und der vorigen toleriert werden
sollen. Wertebereich: @samp{0}..@samp{300}

@item @code{check-disk-space?} (Vorgabe: @code{#t}) (Typ: Vielleicht-Boolescher-Ausdruck)
Ob vor dem Schreiben der Datenbank geprüft werden soll, ob zumindest etwas
Plattenplatz verfügbar ist.

@item @code{create-directories?} (Vorgabe: @code{#t}) (Typ: Vielleicht-Boolescher-Ausdruck)
Ob Verzeichnisse erstellt werden sollen, wenn deren konfigurierter Pfad
nicht existiert. Dazu gehört auch @var{database-directory}.

@item @code{daemon-group} (Typ: Vielleicht-Benutzergruppe)
Zu welcher Benutzergruppe der Daemon-Prozess wechseln soll, wenn er
gestartet wird. Benutzen Sie @code{%unset-value}, wenn sich seine Gruppe
nicht ändern soll.

@item @code{daemon-user} (Typ: Vielleicht-Benutzerkonto)
Zu welchem Benutzer der Daemon-Prozess wechseln soll, wenn er gestartet
wird. Benutzen Sie @code{%unset-value}, wenn sich das Benutzerkonto nicht
ändern soll.

@item @code{daily-days} (Vorgabe: @code{62}) (Typ: Vielleicht-Ganze-Zahl)
Wie lange Dateneinträge mit einer tagesgenauen Auflösung gespeichert
bleiben. Hier legen Sie fest, für wie viele Tage zurück Einträge gespeichert
werden. Setzen Sie dies auf @code{-1}, damit Einträge unbegrenzt gespeichert
bleiben, oder auf @code{0}, damit keine Daten mit dieser Auflösung erfasst
werden.

@item @code{database-synchronous} (Vorgabe: @code{-1}) (Typ: Vielleicht-Ganze-Zahl)
Ändert die Einstellung der „synchronous“-Option von SQLite, mit der Sie
steuern, wie aufwendig sichergestellt wird, dass ein Schreiben der Datenbank
auf die Platte vollzogen wurde, bevor andere Aktionen fortgeführt werden. Je
höher der Wert, desto umfassender wird Datensicherheit gewährleistet, auf
Kosten langsamerer Leistung. Für den Wert @code{0} wird das dem Dateisystem
überlassen. Für @code{-1} wird der Standardwert anhand der Einstellung
@var{database-write-ahead-logging?} für den Datenbankmodus bestimmt. Siehe
die Erklärungen in der SQLite-Dokumentation für Details zu den Werten von
@code{1} bis @code{3}. Wertebereich: @samp{-1}..@samp{3}

@item @code{database-write-ahead-logging?} (Vorgabe: @code{#f}) (Typ: Vielleicht-Boolescher-Ausdruck)
Ob Aktionen auf der SQLite-Datenbank erst protokolliert werden sollen, bevor
sie durchgeführt werden („Write-Ahead Logging“). Siehe die
SQLite-Dokumentation für genauere Erklärungen. Beachten Sie, dass alte
Versionen von SQLite dies bei Datenbanken nur mit Lesezugriff nicht
unterstützen.

@item @code{hourly-days} (Vorgabe: @code{4}) (Typ: Vielleicht-Ganze-Zahl)
Wie lange Dateneinträge mit einer stundengenauen Auflösung gespeichert
bleiben. Hier legen Sie fest, für wie viele Tage zurück Einträge gespeichert
werden. Setzen Sie dies auf @code{-1}, damit Einträge unbegrenzt gespeichert
bleiben, oder auf @code{0}, damit keine Daten mit dieser Auflösung erfasst
werden.

@item @code{log-file} (Typ: Vielleicht-Zeichenkette)
Gibt den Dateipfad mit Namen für die Protokolldatei an, wenn
@var{use-logging} auf @code{1} gesetzt ist.

@item @code{max-bandwidth} (Typ: Vielleicht-Ganze-Zahl)
Die maximale Bandbreite, gültig für alle Schnittstellen. Wenn der Verkehr
über eine Schnittstelle diesen Wert überschreitet, wird davon ausgegangen,
dass die Daten ungültig sind und sie werden abgelehnt. Setzen Sie dies auf
0, um die Funktion abzuschalten. Wertebereich: @samp{0}..@samp{50000}

@item @code{max-bw} (Typ: Vielleicht-Assoziative-Liste)
Genau wie @var{max-bandwidth}, aber hiermit können Begrenzungen für einzelne
Schnittstellen festgelegt werden. Anzugeben ist eine assoziative Liste von
Schnittstellen als Zeichenketten auf ganzzahlige Werte. Zum Beispiel:
@lisp
(max-bw `(("eth0" .  15000)
          ("ppp0" .  10000)))
@end lisp
@var{bandwidth-detection?} gilt auf allen Schnittstellen als abgeschaltet,
wo @var{max-bw} konfiguriert wurde. Wertebereich: @samp{0}..@samp{50000}

@item @code{monthly-months} (Vorgabe: @code{25}) (Typ: Vielleicht-Ganze-Zahl)
Wie lange Dateneinträge mit einer monatsgenauen Auflösung gespeichert
bleiben. Hier legen Sie fest, für wie viele Monate zurück Einträge
gespeichert werden. Setzen Sie dies auf @code{-1}, damit Einträge unbegrenzt
gespeichert bleiben, oder auf @code{0}, damit keine Daten mit dieser
Auflösung erfasst werden.

@item @code{month-rotate} (Vorgabe: @code{1}) (Typ: Vielleicht-Ganze-Zahl)
An welchem Tag im Monat ein neuer Monat beginnen soll. Normalerweise setzen
Sie es auf 1, aber andere Werte sind möglich, etwa um monatlich
abgerechneten Netzwerkverkehr zu überblicken, wenn der Abrechnungszeitraum
nicht am Monatsersten beginnt. Zum Beispiel werden beim Wert 7 die Tage im
Februar bis einschließlich 6.@: Februar noch zum Januar gezählt. Eine
Änderung an dieser Einstellung bewirkt @emph{keine} Neuberechnung bisheriger
Daten. Wertebereich: @samp{1}..@samp{28}

@item @code{month-rotate-affects-years?} (Vorgabe: @code{#f}) (Typ: Vielleicht-Boolescher-Ausdruck)
Ob sich die Einstellung für @var{month-rotate} auch auf jährliche Daten
auswirken soll. Dies ist nur von Bedeutung, wenn der Wert von
@var{month-rotate} größer als eins ist.

@item @code{offline-save-interval} (Vorgabe: @code{30}) (Typ: Vielleicht-Ganze-Zahl)
Mit wie vielen Minuten Abstand zwischengespeicherte Daten zu den
Schnittstellen in die Datei gespeichert werden sollen, wenn alle
beobachteten Schnittstellen vom Netz getrennt sind. Wertebereich:
@var{save-interval}..@samp{60}

@item @code{pid-file} (Vorgabe: @code{"/var/run/vnstatd.pid"}) (Typ: Vielleicht-Zeichenkette)
Gibt Pfad und Namen der PID-Datei an.

@item @code{poll-interval} (Vorgabe: @code{5}) (Typ: Vielleicht-Ganze-Zahl)
Mit wie vielen Sekunden Abstand die Schnittstellen auf Statusveränderungen
hin überprüft werden. Wertebereich: @samp{2}..@samp{60}

@item @code{rescan-database-on-save?} (Typ: Vielleicht-Boolescher-Ausdruck)
Ob neu hinzugefügte Schnittstellen automatisch aus der Datenbank erfasst
werden und mit der Beobachtung begonnen werden soll. Es wird alle
@var{save-interval} bzw.@: @var{offline-save-interval} Minuten neu geprüft,
je nach momentanem Aktivitätsstatus.

@item @code{save-interval} (Vorgabe: @code{5}) (Typ: Vielleicht-Ganze-Zahl)
Mit wie vielen Minuten Abstand zwischengespeicherte Daten zu den
Schnittstellen in eine Datei gespeichert werden. Wertebereich: (
@var{update-interval} / 60 )..@samp{60}

@item @code{save-on-status-change?} (Vorgabe: @code{#t}) (Typ: Vielleicht-Boolescher-Ausdruck)
Ob die zwischengespeicherten Daten zu den Schnittstellen außerdem in die
Datei gespeichert werden sollen, wenn eine Statusveränderung bei einer
Schnittstelle festgestellt wurde, d.h.@: wenn eine Schnittstelle vom Netz
getrennt oder verbunden wird.

@item @code{time-sync-wait} (Vorgabe: @code{5}) (Typ: Vielleicht-Ganze-Zahl)
Wie viele Minuten beim Starten des Daemons darauf gewartet werden soll, dass
sich die Systemuhr abgleicht, wenn die letzte Datenbankaktualisierung in der
Zukunft zu liegen scheint. Das kann für Systeme, die keine Echtzeituhr
(engl.@: „real-time clock“, RTC) haben, nötig sein, wenn sie erst einige
Zeit nach dem Hochfahren ihre Uhrzeit berichtigen. @code{0} = nicht
warten. Wertebereich: @samp{0}..@samp{60}

@item @code{top-day-entries} (Vorgabe: @code{20}) (Typ: Vielleicht-Ganze-Zahl)
Wie lange Dateneinträge mit Spitzentagen gespeichert bleiben. Hier legen Sie
fest, für wie viele Spitzentage Einträge gespeichert werden. Setzen Sie dies
auf @code{-1}, damit Einträge unbegrenzt gespeichert bleiben, oder auf
@code{0}, damit keine Daten mit dieser Auflösung erfasst werden.

@item @code{trafficless-entries?} (Vorgabe: @code{#t}) (Typ: Vielleicht-Boolescher-Ausdruck)
Ob Datenbankeinträge angelegt werden sollen, auch wenn kein Netzwerkverkehr
während des entsprechenden Zeitabschnitts stattgefunden hat.

@item @code{update-file-owner?} (Vorgabe: @code{#t}) (Typ: Vielleicht-Boolescher-Ausdruck)
Ob der Besitz von Dateien beim Start des Daemon-Prozesses übertragen werden
soll. Beim Start des Daemons wechseln lediglich die Datenbank, die
Protokolldatei und die PID-Datei den Besitzer, wenn die Felder für Benutzer
und Gruppe ( @var{daemon-user} bzw.@: @var{daemon-group} ) aktiviert sind
und die Dateien den falschen Besitzer haben. Bei einer manuellen Erzeugung
der Datenbank bewirkt diese Einstellung, dass der Besitzer des
Datenbankverzeichnisses auch für sie eingetragen wird, wenn das Verzeichnis
bereits existiert. Diese Einstellung bewirkt nur dann etwas, wenn der
Prozess mit dem root-Benutzer oder mit @command{sudo} gestartet wird.

@item @code{update-interval} (Vorgabe: @code{20}) (Typ: Vielleicht-Ganze-Zahl)
Mit wie vielen Sekunden Abstand die Daten zu den Schnittstellen aktualisiert
werden. Wertebereich: @var{poll-interval}..@samp{300}

@item @code{use-logging} (Vorgabe: @code{2}) (Typ: Vielleicht-Ganze-Zahl)
Ob eine Protokolldatei geschrieben werden soll. Akzeptierte Werte sind:
@code{0} = deaktiviert, @code{1} = Protokolldatei und @code{2} = syslog.

@item @code{use-utc?} (Typ: Vielleicht-Boolescher-Ausdruck)
Ob als Zeitzone UTC für alle Einträge genutzt werden soll. Wenn aktiviert,
benutzen alle zur Datenbank hinzugefügten Einträge UTC, egal welche Zeitzone
für das System eingestellt wurde. Wenn deaktiviert, wird die im System
eingestellte Zeitzone benutzt. Eine Änderung an dieser Einstellung bewirkt
keine Änderung bisheriger Daten.

@item @code{yearly-years} (Vorgabe: @code{-1}) (Typ: Vielleicht-Ganze-Zahl)
Wie lange Dateneinträge mit einer jahresgenauen Auflösung gespeichert
bleiben. Hier legen Sie fest, für wie viele Jahre zurück Einträge
gespeichert werden. Setzen Sie dies auf @code{-1}, damit Einträge unbegrenzt
gespeichert bleiben, oder auf @code{0}, damit keine Daten mit dieser
Auflösung erfasst werden.

@end table
@end deftp
@c %end of fragment

@subsubheading Zabbix-Server
@cindex Zabbix, Zabbix-Server
Zabbix ist ein hochleistungsfähiges Überwachungssystem, mit dem Daten von
vielen Quellen gesammelt in einer Web-Oberfläche zur Schau gestellt
werden. Alarm- und Berichtsfunktionen sind eingebaut; auch gibt es
@dfn{Vorlagen} für gängige Betriebssystemmetriken, unter anderem die
Netzwerk- und Prozessorauslastung sowie den Plattenplatzverbrauch.

In diesem Diensttyp steckt das zentrale Überwachungssystem von Zabbix. Zudem
brauchen Sie @ref{zabbix-front-end,@code{zabbix-front-end-service-type}}, um
Zabbix zu konfigurieren und Ergebnisse anzuzeigen, und vielleicht
@ref{zabbix-agent, @code{zabbix-agent-service-type}} auf den zu
überwachenden Maschinen (auch andere Datenquellen werden unterstützt wie
etwa @ref{prometheus-node-exporter, Prometheus Node Exporter}).

@defvar zabbix-server-service-type
Der Diensttyp des Zabbix-Server-Dienstes. Sein Wert muss ein
@code{zabbix-server-configuration}-Verbundsobjekt sein. Folgendes ist
enthalten.
@end defvar

@c %start of fragment

@deftp {Datentyp} zabbix-server-configuration
Verfügbare @code{zabbix-server-configuration}-Felder sind:

@table @asis
@item @code{zabbix-server} (Vorgabe: @code{zabbix-server}) (Typ: dateiartig)
Das zabbix-server-Paket.

@item @code{user} (Vorgabe: @code{"zabbix"}) (Typ: Zeichenkette)
Das Benutzerkonto, mit dem der Zabbix-Server ausgeführt wird.

@item @code{group} (Vorgabe: @code{"zabbix"}) (Typ: Zeichenkette)
Die Gruppe, mit der der Zabbix-Server ausgeführt wird.

@item @code{db-host} (Vorgabe: @code{"127.0.0.1"}) (Typ: Zeichenkette)
Rechnername der Datenbank.

@item @code{db-name} (Vorgabe: @code{"zabbix"}) (Typ: Zeichenkette)
Datenbankname.

@item @code{db-user} (Vorgabe: @code{"zabbix"}) (Typ: Zeichenkette)
Benutzerkonto der Datenbank.

@item @code{db-password} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Das Datenbankpasswort. Bitte benutzen Sie stattdessen @code{include-files}
mit @code{DBPassword=SECRET} in einer angegebenen Datei.

@item @code{db-port} (Vorgabe: @code{5432}) (Typ: Zahl)
Datenbank-Portnummer.

@item @code{log-type} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Gibt an, wohin Protokollnachrichten geschrieben werden.

@itemize @bullet

@item @code{system} - Syslog.

@item @code{file} - Die im @code{log-file}-Parameter angegebene Datei.

@item @code{console} - Standardausgabe.

@end itemize

@item @code{log-file} (Vorgabe: @code{"/var/log/zabbix/server.log"}) (Typ: Zeichenkette)
Protokolldateiname für den @code{file}-Parameter von @code{log-type}.

@item @code{pid-file} (Vorgabe: @code{"/var/run/zabbix/zabbix_server.pid"}) (Typ: Zeichenkette)
Name der PID-Datei.

@item @code{ssl-ca-location} (Vorgabe: @code{"/etc/ssl/certs/ca-certificates.crt"}) (Typ: Zeichenkette)
Der Ort mit den Dateien über die Zertifikatsautoritäten (Certificate
Authoritys, CAs) zur Prüfung der SSL-Serverzertifikate.

@item @code{ssl-cert-location} (Vorgabe: @code{"/etc/ssl/certs"}) (Typ: Zeichenkette)
Der Ort mit den SSL-Client-Zertifikaten.

@item @code{extra-options} (Vorgabe: @code{""}) (Typ: Zusatzoptionen)
Zusätzliche Optionen werden an die Zabbix-Server-Konfigurationsdatei
angehängt.

@item @code{include-files} (Vorgabe: @code{'()}) (Typ: Einzubindende-Dateien)
Sie können einzelne Dateien oder alle Dateien in einem Verzeichnis in die
Konfigurationsdatei einbinden.

@end table

@end deftp


@c %end of fragment

@anchor{zabbix-agent}
@subsubheading Zabbix-Agent
@cindex Zabbix, Zabbix-Agent

Der Zabbix-Agent sammelt Informationen über das laufende System zur
Überwachung mit dem Zabbix-Server. Einige Überprüfungen sind von vornherein
verfügbar; eigene können Sie über
@uref{https://www.zabbix.com/documentation/current/en/manual/config/items/userparameters,
@dfn{Benutzerparameter}} hinzufügen.

@defvar zabbix-agent-service-type
Der Diensttyp des Zabbix-Agent-Dienstes. Sein Wert muss ein
@code{zabbix-agent-configuration}-Verbundsobjekt sein. Folgendes ist
enthalten.
@end defvar

@c %start of fragment

@deftp {Datentyp} zabbix-agent-configuration
Verfügbare @code{zabbix-agent-configuration}-Felder sind:

@table @asis
@item @code{zabbix-agent} (Vorgabe: @code{zabbix-agentd}) (Typ: dateiartig)
Das zabbix-agent-Paket.

@item @code{user} (Vorgabe: @code{"zabbix"}) (Typ: Zeichenkette)
Das Benutzerkonto, mit dem der Zabbix-Agent ausgeführt wird.

@item @code{group} (Vorgabe: @code{"zabbix"}) (Typ: Zeichenkette)
Die Gruppe, mit der der Zabbix-Agent ausgeführt wird.

@item @code{hostname} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Der eindeutige Rechnername in richtiger Groß-/Kleinschreibung, der für
aktive Überprüfungen benötigt wird und dem im Server eingestellten
Rechnernamen entsprechen muss.

@item @code{log-type} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Gibt an, wohin Protokollnachrichten geschrieben werden.

@itemize @bullet
@item
@code{system} - Syslog.

@item @code{file} - Die Datei aus dem
@code{log-file}-Parameter.

@item @code{console} - Standardausgabe.

@end itemize

@item @code{log-file} (Vorgabe: @code{"/var/log/zabbix/agent.log"}) (Typ: Zeichenkette)
Protokolldateiname für den @code{file}-Parameter von @code{log-type}.

@item @code{pid-file} (Vorgabe: @code{"/var/run/zabbix/zabbix_agent.pid"}) (Typ: Zeichenkette)
Name der PID-Datei.

@item @code{server} (Vorgabe: @code{'("127.0.0.1")}) (Typ: Liste)
Die Liste der IP-Adressen, optional in CIDR-Notation angegeben, oder die
Rechnernamen von Zabbix-Servern und Zabbix-Proxys. Eingehende Verbindungen
werden nur dann angenommen, wenn sie von hier angegebenen Rechnern stammen.

@item @code{server-active} (Vorgabe: @code{'("127.0.0.1")}) (Typ: Liste)
Die Liste aus IP:Port-Paaren (oder Rechnername:Port-Paaren) von
Zabbix-Servern und Zabbix-Proxys für aktive Überprüfungen. Wenn kein Port
angegeben wurde, wird der Vorgabeport benutzt. Wenn dieser Parameter
@emph{nicht} angegeben wird, werden aktive Überprüfungen deaktiviert.

@item @code{extra-options} (Vorgabe: @code{""}) (Typ: Zusatzoptionen)
Zusätzliche Optionen werden an die Zabbix-Server-Konfigurationsdatei
angehängt.

@item @code{include-files} (Vorgabe: @code{'()}) (Typ: Einzubindende-Dateien)
Sie können einzelne Dateien oder alle Dateien in einem Verzeichnis in die
Konfigurationsdatei einbinden.

@end table

@end deftp


@c %end of fragment

@anchor{zabbix-front-end}
@subsubheading Zabbix-Frontend
@cindex Zabbix, Zabbix-Frontend

Mit dem Zabbix-Frontend wird eine Weboberfläche als Vordergrundsystem
(@dfn{Frontend}) für Zabbix bereitgestellt. Es kann auch auf einer anderen
Maschine als der Zabbix-Server laufen. Dieser Diensttyp beruht darauf, die
Dienste für @ref{PHP-FPM} und @ref{NGINX} mit der nötigen Konfiguration zum
Laden der Zabbix-Benutzeroberfläche zu erweitern.

@defvar zabbix-front-end-service-type
Dieser Diensttyp stellt das Zabbix-Web-Frontend als Vordergrundsystem zur
Verfügung. Sein Wert muss ein
@code{zabbix-front-end-configuration}-Verbundsobjekt sein wie hier gezeigt.
@end defvar

@c %start of fragment

@deftp {Datentyp} zabbix-front-end-configuration
Verfügbare @code{zabbix-front-end-configuration}-Felder sind:

@table @asis
@item @code{zabbix-server} (Vorgabe: @code{zabbix-server}) (Typ: dateiartig)
Das zabbix-server-Paket, das benutzt werden soll.

@item @code{nginx} (Vorgabe: @code{'()}) (Typ: Liste)
Liste von
@ref{nginx-server-configuration,@code{nginx-server-configuration}}-Blöcken
für das Zabbix-Frontend. Wenn es leer gelassen wird, lässt die
Vorgabeeinstellung auf Port 80 lauschen.

@item @code{db-host} (Vorgabe: @code{"localhost"}) (Typ: Zeichenkette)
Rechnername der Datenbank.

@item @code{db-port} (Vorgabe: @code{5432}) (Typ: Zahl)
Datenbank-Portnummer.

@item @code{db-name} (Vorgabe: @code{"zabbix"}) (Typ: Zeichenkette)
Datenbankname.

@item @code{db-user} (Vorgabe: @code{"zabbix"}) (Typ: Zeichenkette)
Benutzerkonto der Datenbank.

@item @code{db-password} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Das Datenbankpasswort. Bitte benutzen Sie stattdessen @code{db-secret-file}.

@item @code{db-secret-file} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Die Datei mit den Geheimnis-Informationen, die an die
@file{zabbix.conf.php}-Datei angehängt wird. Diese Datei enthält
Zugangsdaten für die Nutzung durch das Zabbix-Frontend. Es wird von Ihnen
erwartet, dass Sie sie manuell erzeugen.

@item @code{zabbix-host} (Vorgabe: @code{"localhost"}) (Typ: Zeichenkette)
Zabbix-Server-Rechnername.

@item @code{zabbix-port} (Vorgabe: @code{10051}) (Typ: Zahl)
Zabbix-Server-Port.

@end table

@end deftp


@c %end of fragment

@node Kerberos-Dienste
@subsection Kerberos-Dienste
@cindex Kerberos

Das @code{(gnu services kerberos)}-Modul stellt Dienste zur Verfügung, die
mit dem Authentifizierungsprotokoll @dfn{Kerberos} zu tun haben.

@subsubheading Krb5-Dienst

Programme, die eine Kerberos-Clientbibliothek benutzen, erwarten meist, dass
sich eine Konfigurationsdatei in @file{/etc/krb5.conf} befindet. Dieser
Dienst erzeugt eine solche Datei aus einer Definition, die in der
Betriebssystemdeklaration angegebenen wurde. Durch ihn wird kein Daemon
gestartet.

Keine „Schlüsseltabellen“-Dateien werden durch diesen Dienst zur Verfügung
gestellt@tie{}– Sie müssen sie ausdrücklich selbst anlegen. Dieser Dienst
funktioniert bekanntermaßen mit der MIT-Clientbibliothek
@code{mit-krb5}. Andere Implementierungen wurden nicht getestet.

@defvar krb5-service-type
Ein Diensttyp für Kerberos-5-Clients.
@end defvar

@noindent
Hier ist ein Beispiel, wie man ihn benutzt:
@lisp
(service krb5-service-type
         (krb5-configuration
          (default-realm "EXAMPLE.COM")
          (allow-weak-crypto? #t)
          (realms (list
                   (krb5-realm
                    (name "EXAMPLE.COM")
                    (admin-server "groucho.example.com")
                    (kdc "karl.example.com"))
                   (krb5-realm
                    (name "ARGRX.EDU")
                    (admin-server "kerb-admin.argrx.edu")
                    (kdc "keys.argrx.edu"))))))
@end lisp

@noindent
Dieses Beispiel stellt eine Client-Konfiguration für Kerberos@tie{}5 zur
Verfügung, mit der:
@itemize
@item Zwei Administrationsbereiche erkannt werden, nämlich: „EXAMPLE.COM“
und „ARGRX.EDU“, die beide verschiedene Administrationsserver und
Schlüsselverteilungszentren haben,
@item als Vorgabe der Administrationsbereich „EXAMPLE.COM“ verwendet wird,
falls der Administrationsbereich von Clients nicht ausdrücklich angegeben
wurde, und
@item auch Dienste angenommen werden, die nur Verschlüsselungstypen unterstützen, die bekanntermaßen schwach sind.
@end itemize

Die Typen @code{krb5-realm} und @code{krb5-configuration} haben viele
Felder. Hier werden nur die am häufigsten benutzten beschrieben. Eine
vollständige Liste und jeweils detailliertere Erklärungen finden Sie in der
Dokumentation von
@uref{https://web.mit.edu/kerberos/krb5-devel/doc/admin/conf_files/krb5_conf.html,,krb5.conf}
vom MIT.


@deftp {Datentyp} krb5-realm
@cindex Administrationsbereich, Kerberos
@table @asis
@item @code{name}
Dieses Feld enthält eine Zeichenkette, die den Namen des
Administrationsbereichs bezeichnet. Üblich ist, den vollständigen DNS-Namen
(„Fully Qualified DNS Name“) Ihrer Organisation nur in Großbuchstaben zu
benutzen.

@item @code{admin-server}
Dieses Feld enthält eine Zeichenkette, die den Rechner benennt, auf dem der
Administrationsserver läuft.

@item @code{kdc}
Dieses Feld enthält eine Zeichenkette, die das Schlüsselverteilungszentrum
für den Administrationsbereich angibt.
@end table
@end deftp

@deftp {Datentyp} krb5-configuration

@table @asis
@item @code{allow-weak-crypto?} (Vorgabe: @code{#f})
Wenn diese Option auf @code{#t} gesetzt ist, werden auch Dienste akzeptiert,
die nur Verschlüsselungsalgorithmen anbieten, die bekanntermaßen schwach
sind.

@item @code{default-realm} (Vorgabe: @code{#f})
Dieses Feld sollte eine Zeichenkette enthalten, die den voreingestellten
Kerberos-Administrationsbereich für den Client angibt. Sie sollten in diesem
Feld den Namen Ihres Kerberos-Administrationsbereichs eintragen. Wenn der
Wert @code{#f} ist, dann muss ein Administrationsbereich mit jedem
Kerberos-Prinzipal zusammen angegeben werden, wenn Programme wie
@command{kinit} aufgerufen werden.

@item @code{realms}
Hierin sollte eine nichtleere Liste von je einem @code{krb5-realm}-Objekt
pro Administrationsbereich stehen, auf den Clients zugreifen
können. Normalerweise hat einer davon ein @code{name}-Feld, das mit dem
@code{default-realm}-Feld übereinstimmt.
@end table
@end deftp


@subsubheading PAM-krb5-Dienst
@cindex pam-krb5

Der @code{pam-krb5}-Dienst ermöglicht es, bei der Anmeldung und
Passwortverwaltung Benutzer über Kerberos zu authentifizieren. Sie brauchen
diesen Dienst, damit Anwendungen, die PAM benutzen können, Nutzer über
Kerberos authentifizieren können.

@defvar pam-krb5-service-type
Ein Diensttyp für das PAM-Modul zu Kerberos@tie{}5.
@end defvar

@deftp {Datentyp} pam-krb5-configuration
Der Datentyp, der die Konfiguration des PAM-Moduls für Kerberos 5
repräsentiert. Dieser Typ hat die folgenden Parameter:
@table @asis
@item @code{pam-krb5} (Vorgabe: @code{pam-krb5})
Das pam-krb5-Paket, das benutzt werden soll.

@item @code{minimum-uid} (Vorgabe: @code{1000})
Der kleinste Benutzeridentifikator (UID), für den Authentifizierung über
Kerberos versucht werden soll. Lokale Benutzerkonten mit niedrigeren
Zahlwerten können sich nicht authentisieren und bekommen dazu keine Meldung
angezeigt.
@end table
@end deftp


@node LDAP-Dienste
@subsection LDAP-Dienste
@cindex LDAP

@subsubheading Authentisierung per LDAP mit nslcd
@cindex nslcd, LDAP-Dienst

Das Modul @code{(gnu services authentication)} stellt den Diensttyp
@code{nslcd-service-type} zur Verfügung, mit dem sich Benutzer gegenüber
einem LDAP-Server authentisieren können. Sie möchten dabei wahrscheinlich
nicht nur den Dienst konfigurieren, sondern auch @code{ldap} als einen
Namensdienst („Name Service“) für den Name Service Switch hinzufügen. Siehe
@ref{Name Service Switch} für Details.

Hier ist ein Beispiel für eine einfache Betriebssystemdeklaration mit einer
der Vorgabe entsprechenden Konfiguration des @code{nslcd-service-type} und
einer Konfiguration des Name Service Switch, die den
@code{ldap}-Namensdienst zuletzt prüft:

@lisp
(use-service-modules authentication)
(use-modules (gnu system nss))
…
(operating-system
  …
  (services
    (cons*
      (service nslcd-service-type)
      (service dhcp-client-service-type)
      %base-services))
  (name-service-switch
   (let ((services (list (name-service (name "db"))
                         (name-service (name "files"))
                         (name-service (name "ldap")))))
     (name-service-switch
      (inherit %mdns-host-lookup-nss)
      (password services)
      (shadow   services)
      (group    services)
      (netgroup services)
      (gshadow  services)))))
@end lisp

@c %start of generated documentation for nslcd-configuration

Verfügbare @code{nslcd-configuration}-Felder sind:

@deftypevr {@code{nslcd-configuration}-Parameter} „package“ nss-pam-ldapd
Das @code{nss-pam-ldapd}-Paket, was benutzt werden soll.

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zahl threads
Die Anzahl zu startender Threads, die Anfragen bearbeiten und LDAP-Abfragen
durchführen können. Jeder Thread öffnet eine separate Verbindung zum
LDAP-Server. Die Vorgabe ist, 5 Threads zu starten.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Zeichenkette uid
Gibt den Benutzeridentifikator an, unter dem der Daemon ausgeführt werden
soll.

Die Vorgabe ist @samp{"nslcd"}.

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Zeichenkette gid
Gibt den Gruppenidentifikator an, unter dem der Daemon ausgeführt werden
soll.

Die Vorgabe ist @samp{"nslcd"}.

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Protokolleinstellung log
Diese Einstellung steuert über eine Liste aus SCHEMA und STUFE, wie
protokolliert wird. Als SCHEMA-Argument darf entweder eines der Symbole
@samp{none} (keines) oder @samp{syslog} angegeben werden oder ein absoluter
Dateiname. Das Argument STUFE ist optional und legt die
Protokollierungsstufe fest. Die Protokollierungsstufe kann als eines der
folgenden Symbole angegeben werden: @samp{crit} (kritisch), @samp{error}
(Fehler), @samp{warning} (Warnung), @samp{notice} (Benachrichtigung),
@samp{info} (Information) oder @samp{debug} (Fehlersuche). Alle Mitteilungen
mit der angegebenen Protokollierungsstufe oder einer höheren werden
protokolliert.

Die Vorgabe ist @samp{'("/var/log/nslcd" info)}.

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Liste uri
Die Liste der LDAP-Server-URIs. Normalerweise wird nur der erste Server
benutzt; nachfolgende Server dienen als Ersatz.

Die Vorgabe ist @samp{'("ldap://localhost:389/")}.

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette ldap-version
Die zu benutzende Version des LDAP-Protokolls. Nach Vorgabe wird die höchste
Version benutzt, die von der LDAP-Bibliothek unterstützt wird.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette binddn
Gibt den „Distinguished Name“ an, der an den Verzeichnisserver („Directory
Server“) gebunden wird, um Einträge aufzulösen. Nach Vorgabe wird anonym
gebunden.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette bindpw
Gibt die Zugangsinformationen an, mit denen gebunden wird. Diese Einstellung
ist nur dann wirksam, wenn sie mit binddn benutzt wird.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette rootpwmoddn
Gibt den „Distinguished Name“ an, der benutzt wird, wenn der
Administratornutzer „root“ versucht, das Passwort eines Benutzers mit Hilfe
des PAM-Moduls zu verändern.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette rootpwmodpw
Gibt die Zugangsinformationen an, die benutzt werden, wenn der
Administratornutzer „root“ versucht, das Passwort eines Benutzers zu
verändern. Diese Einstellung ist nur dann wirksam, wenn sie mit rootpwmoddn
benutzt wird.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette sasl-mech
Gibt an, welcher SASL-Mechanismus benutzt werden soll, um Authentifizierung
über SASL durchzuführen.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette sasl-realm
Gibt den SASL-Administrationsbereich an, um Authentifizierungen über SASL
durchzuführen.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette sasl-authcid
Gibt die Authentisierungsidentität an, um Authentifizierungen über SASL
durchzuführen.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette sasl-authzid
Gibt die Autorisierungsidentität an, um Authentifizierungen über SASL
durchzuführen.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Boolescher-Ausdruck sasl-canonicalize?
Legt fest, ob der kanonische Rechnername („Hostname“) des LDAP-Servers
ermittelt werden soll. Wenn ja, wird die LDAP-Bibliothek eine inverse
Auflösung („Reverse Lookup“) des Rechnernamens durchführen. Die Vorgabe ist,
es der LDAP-Bibliothek zu überlassen, ob eine solche Überprüfung
durchgeführt wird.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette krb5-ccname
Legt den Namen für den Zwischenspeicher der GSS-API-Kerberos-Zugangsdaten
fest.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Zeichenkette base
Basis für die Verzeichnissuche.

Vorgegeben ist @samp{"dc=example,dc=com"}.

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Suchbereichs-Einstellung scope
Legt den Suchbereich fest als subtree (Teilbaum), onelevel (eine Ebene),
base (Basis) oder children (Kinder). Die Vorgabe für den Suchbereich ist
subtree; base ist fast nie geeignet für Namensdienstauflösungen; children
wird nicht auf allen Servern unterstützt.

Die Vorgabe ist @samp{'(subtree)}.

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Deref-Einstellung deref
Legt die Richtlinie für das Dereferenzieren von Alias-Namen fest. Die
vorgegebene Richtlinie ist, Alias-Namen niemals zu dereferenzieren.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Boolescher-Ausdruck referrals
Gibt an, ob Verweise („Referrals“) automatisch verfolgt werden sollen. Das
vorgegebene Verhalten ist, sie zu verfolgen.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Liste-von-Abbildungseinträgen maps
Diese Option ermöglicht es, eigene Attribute bei der Auflösung anstelle der
vorgegebenen RFC-2307-Attribute zu verwenden. Es ist eine Liste von
Abbildungen („Maps“), von denen jede aus dem Namen der Abbildung, dem
abzubildenden RFC-2307-Attribut und einem Anfrageausdruck besteht, mit dem
es anhand des Verzeichnisses aufgelöst wird.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Liste-von-Filtereinträgen filters
Eine Liste von Filtern, von denen jeder aus dem Namen einer Abbildung, auf
die sich der Filter auswirkt, und einem LDAP-Suchfilter-Ausdruck besteht.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zahl bind-timelimit
Gibt die Zeitbeschränkung in Sekunden an, wie lange eine Verbindung zum
Verzeichnisserver dauern darf. Die Vorgabe ist 10 Sekunden.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zahl timelimit
Gibt die Zeitbeschränkung (in Sekunden) an, wie lange auf eine Antwort vom
LDAP-Server gewartet wird. Ein Wert von null, was die Vorgabe ist, bewirkt,
dass beliebig lange gewartet wird, bis Suchen abgeschlossen sind.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zahl idle-timelimit
Gibt an, wie lange bei Inaktivität gewartet wird (in Sekunden), bis die
Verbindung zum LDAP-Server geschlossen wird. Die Vorgabe ist, dass es zu
keiner Zeitüberschreitung bei Verbindungen kommen kann.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zahl reconnect-sleeptime
Gibt die Anzahl an Sekunden an, wie lange „schlafend“ gewartet wird, wenn zu
@emph{keinem} LDAP-Server eine Verbindung hergestellt werden kann. Die
Vorgabe ist, zwischen dem ersten Fehlversuch und dem ersten neuen Versuch
1@tie{}Sekunde zu warten.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zahl reconnect-retrytime
Gibt an, nach wie viel Zeit der LDAP-Server als dauerhaft nicht verfügbar
angesehen wird. Sobald dieser Fall eintritt, wird eine Verbindungsaufnahme
nur noch einmal pro weiterem Ablauf dieser Zeitperiode versucht. Der
Vorgabewert beträgt 10@tie{}Sekunden.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-SSL-Einstellung ssl
Gibt an, ob SSL/TLS benutzt werden soll oder nicht (die Vorgabe ist, es
@emph{nicht} zu benutzen). Wenn 'start-tls angegeben wird, dann wird
StartTLS statt schlichtem LDAP über SSL benutzt.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-„tls-reqcert“-Einstellung tls-reqcert
Gibt an, welche Überprüfungen auf einem vom Server empfangenen Zertifikat
durchgeführt werden sollen. Die Bedeutung der Werte wird auf der
Handbuchseite zu ldap.conf(5) beschrieben.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette tls-cacertdir
Gibt das Verzeichnis an, das X.509-Zertifikate zur Authentifikation von
Kommunikationspartnern enthält. Dieser Parameter wird ignoriert, wenn Sie
GnuTLS benutzen lassen.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette tls-cacertfile
Gibt den Dateipfad zu dem X.509-Zertifikat zur Authentifikation von
Kommunikationspartnern an.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette tls-randfile
Gibt den Pfad zu einer Entropiequelle an. Dieser Parameter wird ignoriert,
wenn Sie GnuTLS benutzen lassen.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette tls-ciphers
Gibt als eine Zeichenkette an, welche Ciphers für TLS benutzt werden sollen.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette tls-cert
Gibt den Pfad zu der Datei an, die das lokale Zertifikat zur
TLS-Authentisierung als Client enthält.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette tls-key
Gibt den Pfad zu der Datei an, die den privaten Schlüssel zur
TLS-Authentisierung als Client enthält.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zahl pagesize
Geben Sie hier eine Zahl größer als 0 an, um beim LDAP-Server seitenweise
Antworten anzufordern, entsprechend RFC2696. Die Vorgabe (0) fordert alle
Ergebnisse auf einmal an.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-„ignore-users“-Einstellung nss-initgroups-ignoreusers
Diese Einstellung verhindert, dass für die angegebenen Benutzer die
Gruppenmitgliedschaft über LDAP aufgelöst wird. Alternativ kann der Wert
'all-local verwendet werden. Für diesen Wert erzeugt nslcd eine vollständige
Liste aller Nicht-LDAP-Benutzer, wenn es startet.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zahl nss-min-uid
Diese Einstellung lässt sicherstellen, dass LDAP-Benutzer, deren numerischer
Benutzeridentifikator kleiner als der angegebene Wert ist, ignoriert werden.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zahl nss-uid-offset
Diese Einstellung gibt einen Versatz an, der auf den numerischen
Benutzeridentifikator jedes LDAP-Nutzers aufaddiert wird. Damit können
Konflikte zwischen den Benutzeridentifikatoren lokaler Benutzerkonten und
LDAP vermieden werden.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zahl nss-gid-offset
Diese Einstellung gibt einen Versatz an, der auf den numerischen
Gruppenidentifikator jedes LDAP-Nutzers aufaddiert wird. Damit können
Konflikte zwischen den Gruppenidentifikatoren lokaler Gruppen und LDAP
vermieden werden.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Boolescher-Ausdruck nss-nested-groups
Wenn diese Einstellung aktiviert ist, können die Attribute einer Gruppe auch
wieder Verweise auf eine andere Gruppe sein. Attribute darin verschachtelter
(„nested“) Gruppen werden für die Gruppe auf höherer Ebene ebenfalls
zurückgeliefert und Elterngruppen werden zurückgeliefert, wenn nach den
Gruppen eines bestimmten Nutzers gesucht wird. Die Vorgabe ist, keine
zusätzlichen Suchen nach verschachtelten Gruppen durchzuführen.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Boolescher-Ausdruck nss-getgrent-skipmembers
Wenn diese Einstellung aktiviert ist, wird die Liste der Gruppenmitglieder
beim Auflösen von Gruppen nicht angefragt. Zu welchen Gruppen ein Benutzer
gehört, kann weiterhin angefragt werden, damit dem Benutzer bei der
Anmeldung wahrscheinlich dennoch die richtigen Gruppen zugeordnet werden.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Boolescher-Ausdruck nss-disable-enumeration
Wenn diese Einstellung aktiviert ist, scheitern Funktionen, die alle
Benutzer-/Gruppeneinträge aus dem Verzeichnis zu laden versuchen. Dadurch
kann die Auslastung von LDAP-Servern wesentlich reduziert werden, wenn es
eine große Anzahl von Benutzern und/oder Gruppen gibt. Diese Einstellung
wird für die meisten Konfigurationen @emph{nicht} empfohlen.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette validnames
Mit dieser Einstellung kann festgelegt werden, wie Benutzer- und
Gruppennamen vom System geprüft werden. Das angegebene Muster wird zur
Prüfung aller Benutzer- und Gruppennamen benutzt, die über LDAP angefragt
und zurückgeliefert werden.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Boolescher-Ausdruck ignorecase
Hiermit wird festgelegt, ob bei Suchen nach passenden Einträgen @emph{nicht}
auf Groß- und Kleinschreibung geachtet wird. Wenn Sie dies aktivieren,
könnte es zu Sicherheitslücken kommen, mit denen Autorisierungen umgangen
(„Authorization Bypass“) oder der nscd-Zwischenspeicher vergiftet werden
kann („Cache Poisoning“), was gezielte Überlastungen ermöglichen würde
(„Denial of Service“).

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Boolescher-Ausdruck pam-authc-ppolicy
Mit dieser Einstellung wird festgelegt, ob Passwortrichtliniensteuerung vom
LDAP-Server angefragt und behandelt wird, wenn Nutzer authentifiziert
werden.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette pam-authc-search
Nach Vorgabe führt nslcd eine LDAP-Suche nach jeder BIND-Operation (zur
Authentisierung) durch, um sicherzustellen, dass die BIND-Operation
erfolgreich durchgeführt wurde. Die vorgegebene Suche ist eine einfache
Überprüfung, ob der DN eines Benutzers existiert. Hier kann ein Suchfilter
angegeben werden, der stattdessen benutzt werden soll. Er sollte mindestens
einen Eintrag liefern.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette pam-authz-search
Diese Einstellung ermöglicht flexible Feineinstellungen an der
durchzuführenden Autorisierungsprüfung. Der angegebene Suchfilter wird
ausgeführt, woraufhin Zugriff gewährt wird, wenn mindestens ein Eintrag
passt, andernfall wird der Zugriff verweigert.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Vielleicht-Zeichenkette pam-password-prohibit-message
Wenn diese Einstellung festgelegt wurde, werden Passwortänderungen über
pam_ldap abgelehnt und dem Anwender wird stattdessen die festgelegte
Nachricht gezeigt. Die Nachricht kann benutzt werden, um den Anwender auf
alternative Methoden aufmerksam zu machen, wie er sein Passwort ändern kann.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{nslcd-configuration}-Parameter} Liste pam-services
Die Liste der PAM-Dienstnamen, für die eine LDAP-Authentisierung als
ausreichend gilt.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@c %end of generated documentation for nslcd-configuration


@subsubheading LDAP-Verzeichnis-Server
@cindex LDAP, Server

Das Modul @code{(gnu services ldap)} stellt den Diensttyp
@code{directory-server-service-type} zur Verfügung, mit dem eine Instanz
eines LDAP-Servers gestartet werden kann.

Hier sehen Sie eine Beispielkonfiguration für den
@code{directory-server-service-type}:

@lisp
(use-service-modules ldap)

…
(operating-system
  …
  (services
    (cons
      (service directory-server-service-type
               (directory-server-instance-configuration
                (slapd
                 (slapd-configuration
                  (root-password "@{PBKDF2_SHA256@}AAAgAG@dots{}ABSOLUTELYSECRET")))))
      %base-services)))
@end lisp

Das @code{root-password} sollte mit dem Hilfsprogramm @command{pwdhash}
erzeugt werden, das im Paket @code{389-ds-base} enthalten ist.

Beachten Sie, dass sich Änderungen an der Konfiguration des
Verzeichnis-Servers @emph{nicht} auf bestehende Instanzen auswirken. Die
Server-Daten werden Sie manuell sichern und wiederherstellen müssen. Nur
neue Instanzen eines Verzeichnis-Servers werden beim Rekonfigurieren des
Systems erzeugt.

@c %start of generated documentation for directory-server-instance-configuration
@deftp {Datentyp} directory-server-instance-configuration
Verfügbare @code{directory-server-instance-configuration}-Felder sind:

@table @asis
@item @code{package} (Vorgabe: @code{389-ds-base}) (Typ: dateiartig)
Das @code{389-ds-base}-Paket.

@item @code{config-version} (Vorgabe: @code{2}) (Typ: Zahl)
Gibt die Version des Formats der Konfigurationsdatei an. Wenn Sie eine
INF-Datei mit @command{dscreate} benutzen möchten, muss dieser Parameter auf
2 stehen.

@item @code{full-machine-name} (Vorgabe: @code{"localhost"}) (Typ: Zeichenkette)
Setzt den vollständigen Rechnernamen (FQDN) für das System.

@item @code{selinux} (Vorgabe: @code{#false}) (Typ: Boolescher-Ausdruck)
Ob SELinux bei der Installation dieser Instanz erkannt und berücksichtigt
werden soll. Wenn es auf @code{#true} gesetzt ist, wird durch
@command{dscreate} automatisch festgestellt, ob SELinux aktiviert ist.

@item @code{strict-host-checking} (Vorgabe: @code{#true}) (Typ: Boolescher-Ausdruck)
Gibt vor, ob durch den Server geprüft werden soll, dass die Einträge im
Parameter @code{full-machine-name} in beide Richtungen stimmen. Bei der
Installation dieser Instanz mit GSSAPI-Authentifizierung hinter einer
Lastverteilung (load balancer) sollten Sie diesen Parameter auf
@code{#false} setzen.

@item @code{systemd} (Vorgabe: @code{#false}) (Typ: Boolescher-Ausdruck)
Ob Funktionen für die systemd-Plattform bereitgestellt werden sollen. Wenn
dies auf @code{#true} gesetzt ist, wird durch @command{dscreate} automatisch
festgestellt, ob systemd installiert ist.

@item @code{slapd} (Typ: „slapd-configuration“)
Konfiguration von slapd.

@deftp {Datentyp} slapd-configuration
Verfügbare @code{slapd-configuration}-Felder sind:

@table @asis
@item @code{instance-name} (Vorgabe: @code{"localhost"}) (Typ: Zeichenkette)
Legt den Namen der Instanz fest. Sie können sich auf diesen Wert in anderen
Parametern dieser INF-Datei beziehen, indem Sie die Variable
@code{@{instance_name@}} benutzen. Beachten Sie, dass dieser Name nach der
Installation @emph{nicht} mehr geändert werden kann!

@item @code{user} (Vorgabe: @code{"dirsrv"}) (Typ: Zeichenkette)
Legt den Benutzernamen fest, den der @command{ns-slapd}-Prozess nach dem
Starten des Dienstes benutzen wird.

@item @code{group} (Vorgabe: @code{"dirsrv"}) (Typ: Zeichenkette)
Legt den Gruppennamen fest, den der @command{ns-slapd}-Prozess nach dem
Starten des Dienstes benutzen wird.

@item @code{port} (Vorgabe: @code{389}) (Typ: Zahl)
Setzt den TCP-Port, den die Instanz für LDAP-Verbindungen gebraucht.

@item @code{secure-port} (Vorgabe: @code{636}) (Typ: Zahl)
Setzt den TCP-Port, den die Instanz für TLS-gesicherte LDAP-Verbindungen
gebraucht (LDAPS).

@item @code{root-dn} (Vorgabe: @code{"cn=Directory Manager"}) (Typ: Zeichenkette)
Setzt den „Distinquished Name“ (DN) des Administratorkontos auf dieser
Instanz.

@item @code{root-password} (Vorgabe: @code{"@{invalid@}YOU-SHOULD-CHANGE-THIS"} (Typ: Zeichenkette)
Setzt das Passwort des im Parameter @code{root-dn} festgelegten Kontos. Sie
können für diesen Parameter entweder ein Passwort im Klartext angeben,
welches @command{dscreate} dann bei der Installation zu einem Hash machen
wird, oder Sie geben eine Zeichenkette @code{"@{algorithm@}Hash"} an, wie
das Werkzeug @command{pwdhash} eine liefert. Beachten Sie, dass das Angeben
eines Klartextpassworts ein Sicherheitsrisiko darstellt, wenn
unpriviligierte Nutzer die Möglichkeit haben, auf diese INF-Datei
zuzugreifen!

@item @code{self-sign-cert} (Vorgabe: @code{#true}) (Typ: Boolescher-Ausdruck)
Legt fest, ob bei der Einrichtung ein selbstsigniertes Zertifikat erzeugt
werden und TLS-Verschlüsselung aktiviert werden soll. Das ist ungeeignet für
den Einsatz in Produktivsystemen und macht es Administratoren lediglich
möglich, von der Installation an TLS zu benutzen. Sie können das
selbstsignierte Zertifikat durch ein von einer Zertifikatsautorität
ausgestelltes ersetzen.

@item @code{self-sign-cert-valid-months} (Vorgabe: @code{24}) (Typ: Zahl)
Legt die Anzahl der Monate fest, für die das ausgestellte selbstsignierte
Zertifikat gültig sein soll.

@item @code{backup-dir} (Vorgabe: @code{"/var/lib/dirsrv/slapd-@{instance_name@}/bak"}) (Typ: Zeichenkette)
In welchem Verzeichnis man Sicherungskopien dieser Instanz ablegt.

@item @code{cert-dir} (Vorgabe: @code{"/etc/dirsrv/slapd-@{instance_name@}"}) (Typ: Zeichenkette)
In welchem Verzeichnis die Datenbank für Network Security Services (NSS)
dieser Instanz liegt.

@item @code{config-dir} (Vorgabe: @code{"/etc/dirsrv/slapd-@{instance_name@}"}) (Typ: Zeichenkette)
In welchem Verzeichnis die Konfiguration dieser Instanz gespeichert wird.

@item @code{db-dir} (Vorgabe: @code{"/var/lib/dirsrv/slapd-@{instance_name@}/db"}) (Typ: Zeichenkette)
In welchem Verzeichnis die Datenbank dieser Instanz gespeichert wird.

@item @code{initconfig-dir} (Vorgabe: @code{"/etc/dirsrv/registry"}) (Typ: Zeichenkette)
Setzt, wo bei diesem Betriebssystem das Verzeichnis mit
rc-Konfigurationsdateien ist.

@item @code{ldif-dir} (Vorgabe: @code{"/var/lib/dirsrv/slapd-@{instance_name@}/ldif"}) (Typ: Zeichenkette)
In welchem Verzeichnis für diese Instanz LDIF-Dateien exportiert und
importiert werden.

@item @code{lock-dir} (Vorgabe: @code{"/var/lock/dirsrv/slapd-@{instance_name@}"}) (Typ: Zeichenkette)
In welchem Verzeichnis diese Instanz Sperren ablegt.

@item @code{log-dir} (Vorgabe: @code{"/var/log/dirsrv/slapd-@{instance_name@}"}) (Typ: Zeichenkette)
In welchem Verzeichnis diese Instanz Protokolle speichert.

@item @code{run-dir} (Vorgabe: @code{"/run/dirsrv"}) (Typ: Zeichenkette)
Legt das Verzeichnis für die PID dieser Instanz fest.

@item @code{schema-dir} (Vorgabe: @code{"/etc/dirsrv/slapd-@{instance_name@}/schema"}) (Typ: Zeichenkette)
In welchem Verzeichnis Schemata dieser Instanz liegen.

@item @code{tmp-dir} (Vorgabe: @code{"/tmp"}) (Typ: Zeichenkette)
In welchem Verzeichnis temporäre Dateien dieser Instanz liegen werden.
@end table
@end deftp

@item @code{backend-userroot} (Typ: „backend-userroot-configuration“)
Konfiguration für das userroot-Hintergrundsystem.

@deftp {Datentyp} backend-userroot-configuration
Verfügbare @code{backend-userroot-configuration}-Felder sind:

@table @asis
@item @code{create-suffix-entry?} (Vorgabe: @code{#false}) (Typ: Boolescher-Ausdruck)
Setzen Sie diesen Parameter auf @code{#true}, damit ein generischer
Wurzeleintrag für das Suffix in der Datenbank erzeugt wird.

@item @code{require-index?} (Vorgabe: @code{#false}) (Typ: Boolescher-Ausdruck)
Setzen Sie diesen Parameter auf @code{#true}, damit Suchen ohne Index in der
Datenbank verweigert werden.

@item @code{sample-entries} (Vorgabe: @code{"no"}) (Typ: Zeichenkette))
Setzen Sie diesen Parameter auf @code{"yes"}, damit die neueste Version von
Beispieleinträgen zur Datenbank hinzugefügt werden, oder geben Sie
@code{"001003006"} an für die Beispieleinträge der Version 1.3.6. Verwenden
Sie diese Option zum Beispiel zum Testen.

@item @code{suffix} (Typ: Vielleicht-Zeichenkette)
Legt das Wurzelsuffix in dieser Datenbank fest. Wenn Sie kein Suffixattribut
festlegen, wird beim Installationsprozess kein Hintergrundsystem/Suffix
angelegt. Sie können auch mehrere Hintergrundsystem/Suffix-Werte angeben,
indem Sie diesen Abschnitt wiederholt angeben.

@end table
@end deftp
@end table
@end deftp
@c end of generated documentation for directory-server

@node Web-Dienste
@subsection Web-Dienste

@cindex Web
@cindex WWW
@cindex HTTP
Das Modul @code{(gnu services web)} stellt den Apache-HTTP-Server, den
nginx-Webserver und auch einen fastcgi-Wrapperdienst bereit.

@subsubheading Apache-HTTP-Server

@defvar httpd-service-type
Diensttyp für den @uref{https://httpd.apache.org/,Apache-HTTP-Server}
@dfn{httpd}. Der Wert dieses Diensttyps ist ein
@code{httpd-configuration}-Verbund.

Es folgt ein einfaches Beispiel der Konfiguration.

@lisp
(service httpd-service-type
         (httpd-configuration
           (config
             (httpd-config-file
               (server-name "www.example.com")
               (document-root "/srv/http/www.example.com")))))
@end lisp

Andere Dienste können den @code{httpd-service-type} auch erweitern, um etwas
zur Konfiguration hinzuzufügen.

@lisp
(simple-service 'www.example.com-server httpd-service-type
                (list
                  (httpd-virtualhost
                    "*:80"
                    (list (string-join '("ServerName www.example.com"
                                         "DocumentRoot /srv/http/www.example.com")
                                       "\n")))))
@end lisp
@end defvar

Nun folgt eine Beschreibung der Verbundstypen @code{httpd-configuration},
@code{httpd-module}, @code{httpd-config-file} und @code{httpd-virtualhost}.

@deftp {Datentyp} httpd-configuration
Dieser Datentyp repräsentiert die Konfiguration des httpd-Dienstes.

@table @asis
@item @code{package} (Vorgabe: @code{httpd})
Das zu benutzende httpd-Paket.

@item @code{pid-file} (Vorgabe: @code{"/var/run/httpd"})
Die vom Shepherd-Dienst benutzte PID-Datei.

@item @code{config} (Vorgabe: @code{(httpd-config-file)})
Die vom httpd-Dienst zu benutzende Konfigurationsdatei. Vorgegeben ist ein
@code{httpd-config-file}-Verbundsobjekt, aber als Wert kann auch ein anderer
G-Ausdruck benutzt werden, der eine Datei erzeugt, zum Beispiel ein
@code{plain-file}. Es kann auch eine Datei außerhalb des Stores mit einer
Zeichenkette angegeben werden.

@end table
@end deftp

@deftp {Datentyp} httpd-module
Dieser Datentyp steht für ein Modul des httpd-Dienstes.

@table @asis
@item @code{name}
Der Name des Moduls.

@item @code{file}
Die Datei, in der das Modul steht. Sie kann relativ zum benutzten
httpd-Paket oder als absoluter Pfad einer Datei oder als ein G-Ausdruck für
eine Datei im Store angegeben werden, zum Beispiel @code{(file-append
mod-wsgi "/modules/mod_wsgi.so")}.

@end table
@end deftp

@defvar %default-httpd-modules
Eine vorgegebene Liste von @code{httpd-module}-Objekten.
@end defvar

@deftp {Datentyp} httpd-config-file
Dieser Datentyp repräsentiert eine Konfigurationsdatei für den httpd-Dienst.

@table @asis
@item @code{modules} (Vorgabe: @code{%default-httpd-modules})
Welche Module geladen werden sollen. Zusätzliche Module können hier
eingetragen werden oder durch eine zusätzliche Konfigurationsangabe geladen
werden.

Um zum Beispiel Anfragen nach PHP-Dateien zu behandeln, können Sie das Modul
@code{mod_proxy_fcgi} von Apache zusammen mit @code{php-fpm-service-type}
benutzen:

@lisp
(service httpd-service-type
         (httpd-configuration
          (config
           (httpd-config-file
            (modules (cons*
                      (httpd-module
                       (name "proxy_module")
                       (file "modules/mod_proxy.so"))
                      (httpd-module
                       (name "proxy_fcgi_module")
                       (file "modules/mod_proxy_fcgi.so"))
                      %default-httpd-modules))
            (extra-config (list "\
<FilesMatch \\.php$>
    SetHandler \"proxy:unix:/var/run/php-fpm.sock|fcgi://localhost/\"
</FilesMatch>"))))))
(service php-fpm-service-type
         (php-fpm-configuration
          (socket "/var/run/php-fpm.sock")
          (socket-group "httpd")))
@end lisp

@item @code{server-root} (Vorgabe: @code{httpd})
Die @code{ServerRoot} in der Konfigurationsdatei, vorgegeben ist das
httpd-Paket. Direktiven wie @code{Include} und @code{LoadModule} werden
relativ zur ServerRoot interpretiert.

@item @code{server-name} (Vorgabe: @code{#f})
Der @code{ServerName} in der Konfigurationsdatei, mit dem das Anfrageschema
(Request Scheme), der Rechnername (Hostname) und Port angegeben wird, mit
denen sich der Server identifiziert.

Es muss nicht als Teil der Server-Konfiguration festgelegt werden, sondern
kann auch in virtuellen Rechnern (Virtual Hosts) festgelegt
werden. Vorgegeben ist @code{#f}, wodurch kein @code{ServerName} festgelegt
wird.

@item @code{document-root} (Vorgabe: @code{"/srv/http"})
Das @code{DocumentRoot}-Verzeichnis, in dem sich die Dateien befinden, die
man vom Server abrufen kann.

@item @code{listen} (Vorgabe: @code{'("80")})
Die Liste der Werte für die @code{Listen}-Direktive in der
Konfigurationsdatei. Als Wert sollte eine Liste von Zeichenketten angegeben
werden, die jeweils die Portnummer, auf der gelauscht wird, und optional
auch die zu benutzende IP-Adresse und das Protokoll angeben.

@item @code{pid-file} (Vorgabe: @code{"/var/run/httpd"})
Hiermit wird die PID-Datei als @code{PidFile}-Direktive angegeben. Der Wert
sollte mit der @code{pid-file}-Datei in der @code{httpd-configuration}
übereinstimmen, damit der Shepherd-Dienst richtig konfiguriert ist.

@item @code{error-log} (Vorgabe: @code{"/var/log/httpd/error_log"})
Der Ort, an den der Server mit der @code{ErrorLog}-Direktive
Fehlerprotokolle schreibt.

@item @code{user} (Vorgabe: @code{"httpd"})
Der Benutzer, als der der Server durch die @code{User}-Direktive Anfragen
beantwortet.

@item @code{group} (Vorgabe: @code{"httpd"})
Die Gruppe, mit der der Server durch die @code{Group}-Direktive Anfragen
beantwortet.

@item @code{extra-config} (Vorgabe: @code{(list "TypesConfig etc/httpd/mime.types")})
Eine flache Liste von Zeichenketten und G-Ausdrücken, die am Ende der
Konfigurationsdatei hinzugefügt werden.

Alle Werte, mit denen dieser Dienst erweitert wird, werden an die Liste
angehängt.

@end table
@end deftp

@deftp {Datentyp} httpd-virtualhost
Dieser Datentyp repräsentiert einen Konfigurationsblock für einen virtuellen
Rechner (Virtual Host) des httpd-Dienstes.

Sie sollten zur zusätzlichen Konfiguration extra-config des httpd-Dienstes
hinzugefügt werden.

@lisp
(simple-service 'www.example.com-server httpd-service-type
                (list
                  (httpd-virtualhost
                    "*:80"
                    (list (string-join '("ServerName www.example.com"
                                          "DocumentRoot /srv/http/www.example.com")
                                       "\n")))))
@end lisp

@table @asis
@item @code{addresses-and-ports}
Adressen und Ports für die @code{VirtualHost}-Direktive.

@item @code{contents}
Der Inhalt der @code{VirtualHost}-Direktive. Er sollte als Liste von
Zeichenketten und G-Ausdrücken angegeben werden.

@end table
@end deftp

@anchor{NGINX}
@subsubheading NGINX

@defvar nginx-service-type
Diensttyp für den @uref{https://nginx.org/,NGinx-Webserver}. Der Wert des
Dienstes ist ein @code{<nginx-configuration>}-Verbundsobjekt.

Es folgt ein einfaches Beispiel der Konfiguration.

@lisp
(service nginx-service-type
         (nginx-configuration
           (server-blocks
             (list (nginx-server-configuration
                     (server-name '("www.example.com"))
                     (root "/srv/http/www.example.com"))))))
@end lisp

Außer durch direktes Hinzufügen von Server-Blöcken zur Dienstkonfiguration
kann der Dienst auch durch andere Dienste erweitert werden, um Server-Blöcke
hinzuzufügen, wie man im folgenden Beispiel sieht:

@lisp
(simple-service 'my-extra-server nginx-service-type
                (list (nginx-server-configuration
                        (root "/srv/http/extra-website")
                        (try-files (list "$uri" "$uri/index.html")))))
@end lisp
@end defvar

Beim Starten hat @command{nginx} seine Konfigurationsdatei noch nicht
gelesen und benutzt eine vorgegebene Datei, um Fehlermeldungen zu
protokollieren. Wenn er seine Konfigurationsdatei nicht laden kann, landen
Fehlermeldungen also dort. Nachdem die Konfigurationsdatei geladen ist,
werden Fehlerprotokolle nach Voreinstellung in die Datei geschrieben, die in
der Konfiguration angegeben ist. In unserem Fall können Sie Fehlermeldungen
beim Starten in @file{/var/run/nginx/logs/error.log} finden und nachdem die
Konfiguration eingelesen wurde, finden Sie sie in
@file{/var/log/nginx/error.log}. Letzterer Ort kann mit der
Konfigurationsoption @var{log-directory} geändert werden.

@deftp {Datentyp} nginx-configuration
Dieser Datentyp repräsentiert die Konfiguration von NGinx. Ein Teil der
Konfiguration kann hierüber und über die anderen zu Ihrer Verfügung
stehenden Verbundstypen geschehen, alternativ können Sie eine
Konfigurationsdatei mitgeben.

@table @asis
@item @code{nginx} (Vorgabe: @code{nginx})
Das zu benutzende nginx-Paket.

@item @code{shepherd-requirement} (Vorgabe: @code{'()})
Eine Liste von Symbolen, die angeben, von welchen anderen Shepherd-Diensten
der nginx-Dienst abhängen soll.

Das können Sie dann gebrauchen, wenn Sie wollen, dass @command{nginx} erst
dann gestartet wird, wenn Web-Server im Hintergrund oder
Protokollierungsdienste wie Anonip bereits gestartet wurden.

@item @code{log-directory} (Vorgabe: @code{"/var/log/nginx"})
In welches Verzeichnis NGinx Protokolldateien schreiben wird.

@item @code{log-format} (default: @code{'combined}) (type: symbol)
Logging format for the access log. Nginx defaults to the httpd-like format
named @code{'combined}.  Other formats can be defined using
@code{log-formats}.

@item @code{log-formats} (default: @code{'()})
A list of additional @dfn{log formats} to define, the elements should be of
type @code{<nginx-log-format-configuration>}.

@item @code{log-level} (Vorgabe: @code{'error}) (Typ: Symbol)
Logging level for the error log, which can be any of the following values:
@code{'debug}, @code{'info}, @code{'notice}, @code{'warn}, @code{'error},
@code{'crit}, @code{'alert}, or @code{'emerg}.

@item @code{run-directory} (Vorgabe: @code{"/var/run/nginx"})
In welchem Verzeichnis NGinx eine PID-Datei anlegen und temporäre Dateien
ablegen wird.

@item @code{server-blocks} (Vorgabe: @code{'()})
Eine Liste von @dfn{Server-Blöcken}, die in der erzeugten
Konfigurationsdatei stehen sollen. Die Elemente davon sollten den Typ
@code{<nginx-server-configuration>} haben.

Im folgenden Beispiel wäre NGinx so eingerichtet, dass Anfragen an
@code{www.example.com} mit Dateien aus dem Verzeichnis
@code{/srv/http/www.example.com} beantwortet werden, ohne HTTPS zu benutzen.
@lisp
(service nginx-service-type
         (nginx-configuration
           (server-blocks
             (list (nginx-server-configuration
                     (server-name '("www.example.com"))
                     (root "/srv/http/www.example.com"))))))
@end lisp

@item @code{upstream-blocks} (Vorgabe: @code{'()})
Eine Liste von @dfn{Upstream-Blöcken}, die in der erzeugten
Konfigurationsdatei stehen sollen. Ihre Elemente sollten den Typ
@code{<nginx-upstream-configuration>} haben.

Upstreams als @code{upstream-blocks} zu konfigurieren, kann hilfreich sein,
wenn es mit @code{locations} in @code{<nginx-server-configuration>}
verbunden wird. Das folgende Beispiel erzeugt eine Server-Konfiguration mit
einer Location-Konfiguration, bei der Anfragen als Proxy entsprechend einer
Upstream-Konfiguration weitergeleitet werden, wodurch zwei Server diese
beantworten können.

@lisp
(service
  nginx-service-type
  (nginx-configuration
    (server-blocks
      (list (nginx-server-configuration
              (server-name '("www.example.com"))
              (root "/srv/http/www.example.com")
              (locations
                (list
                  (nginx-location-configuration
                  (uri "/path1")
                  (body '("proxy_pass http://server-proxy;"))))))))
    (upstream-blocks
      (list (nginx-upstream-configuration
              (name "server-proxy")
              (servers (list "server1.example.com"
                             "server2.example.com")))))))
@end lisp

@item @code{file} (Vorgabe: @code{#f})
Wenn eine Konfigurationsdatei als @var{file} angegeben wird, dann wird diese
benutzt und @emph{keine} Konfigurationsdatei anhand der angegebenen
@code{log-directory}, @code{run-directory}, @code{server-blocks} und
@code{upstream-blocks} erzeugt. Trotzdem sollten diese Argumente bei einer
richtigen Konfiguration mit denen in der Datei @var{file} übereinstimmen,
damit die Verzeichnisse bei Aktivierung des Dienstes erzeugt werden.

Das kann nützlich sein, wenn Sie schon eine bestehende Konfigurationsdatei
haben oder das, was Sie brauchen, nicht mit anderen Teilen eines
nginx-configuration-Verbundsobjekts umgesetzt werden kann.

@item @code{server-names-hash-bucket-size} (Vorgabe: @code{#f})
Größe der Behälter (englisch „Buckets“) für die Hashtabelle der Servernamen;
vorgegeben ist @code{#f}, wodurch die Größe der Cache-Lines des Prozessors
verwendet wird.

@item @code{server-names-hash-bucket-max-size} (Vorgabe: @code{#f})
Maximale Behältergröße für die Hashtabelle der Servernamen.

@item @code{stream} (default: @code{#f})
@code{<nginx-stream-configuration>} object describing stream server
directives.

@item @code{modules} (Vorgabe: @code{'()})
Die Liste zu ladender dynamisch gebundener Module für nginx. Die dynamischen
Module sollten als Liste von Dateinamen ladbarer Module angegeben
werden. Zum Beispiel:

@lisp
(modules
 (list
  (file-append nginx-accept-language-module "\
/etc/nginx/modules/ngx_http_accept_language_module.so")
  (file-append nginx-lua-module "\
/etc/nginx/modules/ngx_http_lua_module.so")))
@end lisp

@item @code{lua-package-path} (Vorgabe: @code{'()})
Die Liste zu ladender nginx-Lua-Pakete. Hier sollte eine Liste von
Paketnamen ladbarer Lua-Module angegeben werden. Zum Beispiel:

@lisp
(lua-package-path (list lua-resty-core
                        lua-resty-lrucache
                        lua-resty-signal
                        lua-tablepool
                        lua-resty-shell))
@end lisp

@item @code{lua-package-cpath} (Vorgabe: @code{'()})
Die Liste zu ladender nginx-Lua-C-Pakete. Hier sollte eine Liste von
Paketnamen ladbarer Lua-C-Module angegeben werden. Zum Beispiel:

@lisp
(lua-package-cpath (list lua-resty-signal))
@end lisp

@item @code{global-directives} (Vorgabe: @code{'((events . ()))})
Assoziative Liste von globalen Direktiven für die oberste Ebene der
nginx-Konfiguration. Als Werte können wiederum assoziative Listen angegeben
werden.

@lisp
(global-directives
 `((worker_processes . 16)
   (pcre_jit . on)
   (events . ((worker_connections . 1024)))))
@end lisp

@item @code{extra-content} (Vorgabe: @code{""})
Zusätzlicher Inhalt, der an den @code{http}-Block angehängt wird. Sie können
entweder einen Wert angeben, der zu einer Zeichenkette heruntergebrochen
werden kann, oder eine Liste solcher Werte. Ersterer wird direkt eingefügt,
während Letzteren Leerraum zur Einrückung vorangestellt und ein
Zeilenumbruch angehängt wird. Verschachtelte Listen werden auf eine Zeile
entschachtelt.

@lisp
(extra-content "include /etc/nginx/custom-config.conf;")
(extra-content `("include /etc/nginx/custom-config.conf;"
                 ("include " ,%custom-config.conf ";")))
@end lisp

@end table
@end deftp

@deftp {Data Type} nginx-log-format-configuration
Data type representing the configuration of a custom Nginx log format.  This
type has the following parameters:

@table @asis
@item @code{name} (type: symbol)
The name of the log format as a symbol.

@item @code{escape} (default: @code{'default}) (type: symbol)
The mode used to escape values of variables in the format.  The supported
values are:

@itemize
@item @code{'default}, to escape all characters outside of the ASCII
      printable range.
@item @code{'json}, to escape all characters invalid in JSON strings.
@item @code{'none}, to disable escaping.
@end itemize

@item @code{format} (type: string)
The format as accepted by the @code{log_format} directive.

@end table
@end deftp

@anchor{nginx-server-configuration}
@deftp {Datentyp} nginx-server-configuration
Der Datentyp, der die Konfiguration eines nginx-Serverblocks
repräsentiert. Dieser Typ hat die folgenden Parameter:

@table @asis
@item @code{listen} (Vorgabe: @code{'("80" "443 ssl")})
Jede @code{listen}-Direktive legt Adresse und Port für eine IP fest oder
gibt einen Unix-Socket an, auf dem der Server Anfragen beantwortet. Es
können entweder sowohl Adresse als auch Port oder nur die Adresse oder nur
der Port angegeben werden. Als Adresse kann auch ein Rechnername
(„Hostname“) angegeben werden, zum Beispiel:

@lisp
'("127.0.0.1:8000" "127.0.0.1" "8000" "*:8000" "localhost:8000")
@end lisp

@item @code{server-name} (Vorgabe: @code{(list 'default)})
Eine Liste von Servernamen, die dieser Server repräsentiert. @code{'default}
repräsentiert den voreingestellten Server, der für Verbindungen verwendet
wird, die zu keinem anderen Server passen.

@item @code{root} (Vorgabe: @code{"/srv/http"})
Wurzelverzeichnis des Webauftritts, der über nginx abgerufen werden kann.

@item @code{locations} (Vorgabe: @code{'()})
Eine Liste von @dfn{nginx-location-configuration}- oder
@dfn{nginx-named-location-configuration}-Verbundsobjekten, die innerhalb des
Serverblocks benutzt werden.

@item @code{index} (Vorgabe: @code{(list "index.html")})
Index-Dateien, mit denen Anfragen nach einem Verzeichnis beantwortet
werden. Wenn @emph{keine} davon gefunden wird, antwortet Nginx mit der Liste
der Dateien im Verzeichnis.

@item @code{try-files} (Vorgabe: @code{'()})
Eine Liste der Dateien, bei denen in der angegebenen Reihenfolge geprüft
wird, ob sie existieren. @code{nginx} beantwortet die Anfrage mit der ersten
Datei, die es findet.

@item @code{ssl-certificate} (Vorgabe: @code{#f})
Wo das Zertifikat für sichere Verbindungen gespeichert ist. Sie sollten es
auf @code{#f} setzen, wenn Sie kein Zertifikat haben oder kein HTTPS
benutzen möchten.

@item @code{ssl-certificate-key} (Vorgabe: @code{#f})
Wo der private Schlüssel für sichere Verbindungen gespeichert ist. Sie
sollten ihn auf @code{#f} setzen, wenn Sie keinen Schlüssel haben oder kein
HTTPS benutzen möchten.

@item @code{server-tokens?} (Vorgabe: @code{#f})
Ob der Server Informationen über seine Konfiguration bei Antworten beilegen
soll.

@item @code{raw-content} (Vorgabe: @code{'()})
Eine Liste von Zeichenketten oder dateiartigen Objekten, die an den
Server-Block angehängt werden. Jedem Element wird Leerraum zur Einrückung
vorangestellt und ein Zeilenumbruch angehängt. Verschachtelte Listen werden
entschachtelt.

@end table
@end deftp

@deftp {Datentyp} nginx-upstream-configuration
Der Datentyp, der die Konfiguration eines nginx-@code{upstream}-Blocks
repräsentiert. Dieser Typ hat folgende Parameter:

@table @asis
@item @code{name}
Der Name dieser Servergruppe.

@item @code{servers}
Gibt die Adressen der Server in der Gruppe an. Die Adresse kann als
IP-Adresse (z.B.@: @samp{127.0.0.1}), Domänenname (z.B.@:
@samp{backend1.example.com}) oder als Pfad eines Unix-Sockets mit dem
vorangestellten Präfix @samp{unix:} angegeben werden. Wenn Adressen eine
IP-Adresse oder einen Domänennamen benutzen, ist der voreingestellte Port
80, aber ein abweichender Port kann auch explizit angegeben werden.

@item @code{extra-content}
Zusätzlicher Inhalt, welcher an den @code{upstream}-Block angehängt
wird. Sie können eine Zeichenkette, ein dateiartiges Objekt oder eine Liste
davon angeben. Bei einer Liste wird jedem Element Leerraum zur Einrückung
vorangestellt und ein Zeilenumbruch angehängt. Verschachtelte Listen werden
entschachtelt.

@lisp
(extra-content "include /etc/nginx/custom-config.conf;")
(extra-content `("include /etc/nginx/custom-config.conf;"
                 ("include " ,%custom-config.conf ";")))
@end lisp

@end table
@end deftp

@deftp {Datentyp} nginx-location-configuration
Der Datentyp, der die Konfiguration eines nginx-@code{location}-Blocks
angibt. Der Typ hat die folgenden Parameter:

@table @asis
@item @code{uri}
Die URI, die auf diesen Block passt.

@anchor{nginx-location-configuration body}
@item @code{body}
Der Rumpf des location-Blocks, der als eine Liste von Zeichenketten oder
dateiartigen Objekten angegeben werden muss. Jedem Element wird Leerraum zur
Einrückung vorangestellt und ein Zeilenumbruch angehängt. Verschachtelte
Listen werden entschachtelt.

Zum Beispiel können Anfragen an eine Upstream-Servergruppe weitergeleitet
werden, die mit einem @code{nginx-upstream-configuration}-Block angegeben
wurde, indem diese Direktive im Rumpf angegeben wird: @samp{(list
"proxy_pass http://upstream-name;")}.

@end table
@end deftp

@deftp {Datentyp} nginx-named-location-configuration
Der Datentyp repräsentiert die Konfiguration eines mit Namen versehenen
nginx-location-Blocks („Named Location Block“). Ein mit Namen versehener
location-Block wird zur Umleitung von Anfragen benutzt und nicht für die
normale Anfrageverarbeitung. Dieser Typ hat die folgenden Parameter:

@table @asis
@item @code{name}
Der Name, mit dem dieser location-Block identifiziert wird.

@item @code{body}
Siehe @ref{nginx-location-configuration body}, weil der Rumpf („Body“) eines
mit Namen versehenen location-Blocks wie ein
@code{nginx-location-configuration body} benutzt werden kann. Eine
Einschränkung ist, dass der Rumpf eines mit Namen versehenen location-Blocks
keine location-Blöcke enthalten kann.

@end table
@end deftp

@deftp {Data Type} nginx-stream-configuration
Data type representing the configuration file context in which stream
directives are specified.  This type has the following parameters:

@table @asis
@item @code{upstream-blocks} (Vorgabe: @code{'()})
Eine Liste von Upstream-Blöcken, die in der erzeugten Konfigurationsdatei
stehen sollen. Ihre Elemente sollten den Typ
@code{<nginx-upstream-configuration>} haben.

@item @code{server-blocks} (Vorgabe: @code{'()})
Eine Liste von Server-Blöcken, die in der erzeugten Konfigurationsdatei
stehen sollen. Die Elemente davon sollten den Typ
@code{<nginx-server-configuration>} haben.

@item @code{extra-content} (Vorgabe: @code{'()})
Zusätzlicher Inhalt, der an den @code{stream}-Block angehängt wird. Sie
können entweder einen Wert angeben, der zu einer Zeichenkette
heruntergebrochen werden kann, oder eine Liste solcher Werte. Ersterer wird
direkt eingefügt, während Letzteren Leerraum zur Einrückung vorangestellt
und ein Zeilenumbruch angehängt wird. Verschachtelte Listen werden auf eine
Zeile entschachtelt.

@end table
@end deftp

@subsubheading Varnish Cache
@cindex Varnish
Varnish ist ein schneller zwischenspeichernder Server, der zwischen
Web-Anwendungen und deren Endbenutzern sitzt. Er leitet Anfragen von Clients
weiter und lagert die URLs, auf die zugegriffen wird, in einen
Zwischenspeicher ein, damit bei mehreren Anfragen auf dieselbe Ressource nur
eine Anfrage an die Hintergrundanwendung gestellt wird.

@defvar varnish-service-type
Diensttyp für den Varnish-Daemon.
@end defvar

@deftp {Datentyp} varnish-configuration
Der Datentyp, der die Konfiguration des @code{varnish}-Dienstes
repräsentiert. Dieser Typ hat die folgenden Parameter:

@table @asis
@item @code{package} (Vorgabe: @code{varnish})
Das Varnish-Paket, was benutzt werden soll.

@item @code{name} (Vorgabe: @code{"default"})
Ein Name für diese Varnish-Instanz. Varnish wird ein Verzeichnis in
@file{/var/varnish/} mit diesem Namen erzeugen und dort temporäre Dateien
speichern. Wenn der Name mit einem Schrägstrich beginnt, wird er als
absoluter Verzeichnispfad interpretiert.

Übergeben Sie die Befehlszeilenoption @code{-n} an andere Varnish-Programme,
um sich mit der Instanz diesen Namens zu verbinden, z.B.@:
@command{varnishncsa -n default}.

@item @code{backend} (Vorgabe: @code{"localhost:8080"})
Welcher Hintergrunddienst benutzt werden soll. Diese Option wird ignoriert,
wenn @code{vcl} gesetzt ist.

@item @code{vcl} (Vorgabe: #f)
Das @dfn{VCL}-Programm (in der Varnish Configuration Language), das
ausgeführt werden soll. Ist dies auf @code{#f} gesetzt, fungiert Varnish als
Proxy für den Hintergrunddienst @code{backend} mit der voreingestellten
Konfiguration. Andernfalls muss dies ein dateiartiges Objekt mit gültiger
VCL-Syntax sein.

@c Varnish does not support HTTPS, so keep this URL to avoid confusion.
Um zum Beispiel mit VCL einen Spiegelserver für
@url{https://www.gnu.org,www.gnu.org} einzurichten, können Sie so etwas
benutzen:

@lisp
(define %gnu-mirror
  (plain-file "gnu.vcl"
              "vcl 4.1;
backend gnu @{ .host = \"www.gnu.org\"; @}"))

(operating-system
  ;; …
  (services (cons (service varnish-service-type
                           (varnish-configuration
                            (listen '(":80"))
                            (vcl %gnu-mirror)))
                  %base-services)))
@end lisp

Die Konfiguration einer bereits laufenden Varnish-Instanz kann mit dem
Programm @command{varnishadm} eingesehen und verändert werden.

Ziehen Sie die @url{https://varnish-cache.org/docs/,Varnish User Guide} und
das @url{https://book.varnish-software.com/4.0/,Varnish Book} zu Rate, wenn
Sie eine umfassende Dokumentation zu Varnish und seiner
Konfigurationssprache suchen.

@item @code{listen} (Vorgabe: @code{'("localhost:80")})
Liste der Adressen, auf denen Varnish lauschen soll.

@item @code{storage} (Vorgabe: @code{'("malloc,128m")})
Liste der Speicher-Hintergrunddienste („Storage Backends“), die von der VCL
aus benutzt werden können.

@item @code{parameters} (Vorgabe: @code{'()})
Liste der Laufzeitparameter von der Form @code{'(("Parameter" . "Wert"))}.

@item @code{extra-options} (Vorgabe: @code{'()})
Zusätzliche Argumente, die an den @command{varnishd}-Prozess übergeben
werden.

@end table
@end deftp

@subheading Whoogle Search
@cindex Whoogle Search

@uref{https://github.com/benbusby/whoogle-search, Whoogle Search} ist eine
selbstbetriebene, werbefreie, datenschutzfreundliche Meta-Suchmaschine, die
Suchergebnisse von Google sammelt und anzeigt. Sie können sie in ihren
Vorgabeeinstellungen konfigurieren, indem Sie diese Zeile in das Feld
@code{services} Ihrer Betriebssystemdeklaration eintragen:

@lisp
(service whoogle-service-type)
@end lisp

Dadurch wird Whoogle Search als lokaler Web-Server laufen, auf den Sie durch
Öffnen von @indicateurl{http://localhost:5000} in Ihrem Browser zugreifen
können. Die Referenz der Konfiguration folgt.

@defvar whoogle-service-type
Der Diensttyp des Whoogle-Search-Dienstes. Sein Wert muss ein
@code{whoogle-configuration}-Verbundsobjekt sein, siehe unten.
@end defvar

@deftp {Datentyp} whoogle-configuration
Der Datentyp repräsentiert die Konfiguration für den Whoogle-Search-Dienst.

@table @asis
@item @code{package} (Vorgabe: @code{whoogle-search})
Das zu verwendende Whoogle-Search-Paket.

@item @code{host} (Vorgabe: @code{"127.0.0.1"})
Die IP-Adresse des Rechners, auf dem Whoogle laufen wird.

@item @code{port} (Vorgabe: @code{5000})
Der Port, auf dem Whoogle zugänglich sein wird.

@item @code{environment-variables} (Vorgabe: @code{'()})
Eine Liste von Zeichenketten mit den Umgebungsvariablen, mit denen Sie
Einstellungen an Whoogle vornehmen. Sehen Sie in
@uref{https://github.com/benbusby/whoogle-search/blob/main/whoogle.template.env,
den Vorlagen für dessen Umgebungsvariable} nach, was zur Verfügung steht.

@end table
@end deftp

@subsubheading Patchwork
@cindex Patchwork
Patchwork ist ein System, um eingereichten Patches zu folgen. Es kann an
eine Mailing-Liste geschickte Patches sammeln und auf einer Web-Oberfläche
anzeigen.

@defvar patchwork-service-type
Diensttyp für Patchwork.
@end defvar

Es folgt ein Minimalbeispiel für einen Patchwork-Dienst, der auf der Domain
@code{patchwork.example.com} läuft.

@lisp
(service patchwork-service-type
         (patchwork-configuration
          (domain "patchwork.example.com")
          (settings-module
           (patchwork-settings-module
            (allowed-hosts (list domain))
            (default-from-email "patchwork@@patchwork.example.com")))
          (getmail-retriever-config
           (getmail-retriever-configuration
            (type "SimpleIMAPSSLRetriever")
            (server "imap.example.com")
            (port 993)
            (username "patchwork")
            (password-command
             (list (file-append coreutils "/bin/cat")
                   "/etc/getmail-patchwork-imap-password"))
            (extra-parameters
            '((mailboxes . ("Patches"))))))))

@end lisp

Der Patchwork-Dienst wird über drei Verbundsobjekte konfiguriert. Die
@code{<patchwork-configuration>} hat mit der Konfiguration von Patchwork
innerhalb des HTTPD-Dienstes zu tun.

Das @code{settings-module}-Feld innerhalb des
@code{<patchwork-configuration>}-Verbundsobjekts kann mit einem
@code{<patchwork-settings-module>}-Verbundsobjekt ausgefüllt werden, das ein
im Guix-Store angelegtes Einstellungsmodul beschreibt.

Für das @code{database-configuration}-Feld innerhalb des
@code{<patchwork-settings-module>} muss eine
@code{<patchwork-database-configuration>} benutzt werden.

@deftp {Datentyp} patchwork-configuration
Der Datentyp, der die Konfiguration des Patchwork-Dienstes
repräsentiert. Dieser Typ hat die folgenden Parameter:

@table @asis
@item @code{patchwork} (Vorgabe: @code{patchwork})
Welches Patchwork-Paket benutzt werden soll.

@item @code{domain}
Welche Domain für Patchwork benutzt werden soll. Sie findet Verwendung in
Patchworks virtuellen Rechner („Virtual Host“) für den HTTPD-Dienst.

@item @code{settings-module}
Das durch Patchwork benutzte Einstellungsmodul. Als eine Django-Anwendung
wird Patchwork mit einem Python-Modul konfiguriert, das die Einstellungen
speichert. Es kann entweder eine Instanz des
@code{<patchwork-settings-module>}-Verbundstyps sein, ein beliebiges anderes
Verbundsobjekt sein, das die Einstellungen im Store repräsentiert, oder ein
Verzeichnis außerhalb des Stores.

@item @code{static-path}  (Vorgabe: @code{"/static/"})
Der Pfad, auf dem der HTTPD-Dienst die statischen Dateien anbieten soll.

@item @code{getmail-retriever-config}
Das durch Patchwork benutzte
getmail-retriever-configuration-Verbundsobjekt. Getmail wird mit diesem Wert
konfiguriert. Die Mitteilungen werden mit Patchwork als Empfänger
zugestellt.

@end table
@end deftp

@deftp {Datentyp} patchwork-settings-module
Der Datentyp, der das Einstellungsmodul für Patchwork repräsentiert. Manche
dieser Einstellungen haben direkt mit Patchwork zu tun, andere beziehen sich
auf Django, dem Web-Framework auf dem Patchwork aufsetzt, oder dessen
Django-Rest-Framework-Bibliothek. Dieser Typ verfügt über die folgenden
Parameter:

@table @asis
@item @code{database-configuration} (Vorgabe: @code{(patchwork-database-configuration)})
Die für Patchwork benutzten Datenbankverbindungseinstellungen. Siehe den
@code{<patchwork-database-configuration>}-Verbundstyp für weitere
Informationen.

@item @code{secret-key-file} (Vorgabe: @code{"/etc/patchwork/django-secret-key"})
Patchwork benutzt als eine Django-Webanwendung einen geheimen Schlüssel, um
Werte kryptographisch zu signieren. Diese Datei sollte einen einzigartigen,
unvorhersehbaren Wert enthalten.

Wenn diese Datei nicht existiert, wird sie erzeugt und ein zufälliger Wert
wird durch den Shepherd-Dienst für patchwork-setup hineingeschrieben.

Diese Einstellung bezieht sich auf Django.

@item @code{allowed-hosts}
Eine Liste zulässiger Netzwerkschnittstellen (Hosts), auf denen dieser
Patchwork-Dienst antwortet. Sie sollte wenigstens die im
@code{<patchwork-configuration>}-Verbundsobjekt genannte Domain enthalten.

Dies ist eine Django-Einstellung.

@item @code{default-from-email}
Die E-Mail-Adresse, von der aus Patchwork nach Voreinstellung E-Mails
verschicken soll.

Dies ist eine Patchwork-Einstellung.

@item @code{static-url} (Vorgabe: @code{#f})
Die URL, über die statische Dokumente angeboten werden. Es kann eine
teilweise URL oder eine vollständige URL angegeben werden, aber sie muss auf
@code{/} enden.

Wenn der Vorgabewert benutzt wird, wird der @code{static-path}-Wert aus dem
@code{<patchwork-configuration>}-Verbundsobjekt benutzt.

Dies ist eine Django-Einstellung.

@item @code{admins} (Vorgabe: @code{'()})
Die E-Mail-Adressen, an die Details zu auftretenden Fehlern versendet
werden. Jeder Wert sollte eine zweielementige Liste mit dem Namen und der
E-Mail-Adresse sein.

Dies ist eine Django-Einstellung.

@item @code{debug?} (Vorgabe: @code{#f})
Ob Patchwork im Fehlersuchmodus („Debug Mode“) ausgeführt werden soll. Wenn
dies auf @code{#t} steht, werden detaillierte Fehlermeldungen angezeigt.

Dies ist eine Django-Einstellung.

@item @code{enable-rest-api?} (Vorgabe: @code{#t})
Ob Patchworks REST-Programmschnittstelle („REST-API“) aktiviert werden soll.

Dies ist eine Patchwork-Einstellung.

@item @code{enable-xmlrpc?} (Vorgabe: @code{#t})
Ob die XML-Programmschnittstelle für entfernte Prozeduraufrufe
(„XML-RPC-API“) aktiviert werden soll.

Dies ist eine Patchwork-Einstellung.

@item @code{force-https-links?} (Vorgabe: @code{#t})
Ob auf den Webseiten von Patchwork die Verweise auf andere Seiten HTTPS
verwenden sollen.

Dies ist eine Patchwork-Einstellung.

@item @code{extra-settings} (Vorgabe: @code{""})
Zusätzlicher Code, der am Ende des Patchwork-Einstellungsmoduls platziert
werden soll.

@end table
@end deftp

@deftp {Datentyp} patchwork-database-configuration
Der Datentyp, der die Datenbankkonfiguration für Patchwork repräsentiert.

@table @asis
@item @code{engine} (Vorgabe: @code{"django.db.backends.postgresql_psycopg2"})
Welcher Datenbanktreiber („Engine“) benutzt werden soll.

@item @code{name} (Vorgabe: @code{"patchwork"})
Der Name der zu benutzenden Datenbank.

@item @code{user} (Vorgabe: @code{"httpd"})
Der Benutzer, als der sich Patchwork mit der Datenbank verbindet.

@item @code{password} (Vorgabe: @code{""})
Das Passwort, das zum Herstellen einer Verbindung zur Datenbank verwendet
werden soll.

@item @code{host} (Vorgabe: @code{""})
Der Rechner, mit dem die Datenbankverbindung hergestellt wird.

@item @code{port} (Vorgabe: @code{""})
Der Port, auf dem sich Patchwork mit der Datenbank verbindet.

@end table
@end deftp

@subsubheading Mumi

@cindex Mumi, Weboberfläche für Debbugs
@cindex Debbugs, Mumi-Weboberfläche
@uref{https://codeberg.org/guix/mumi, Mumi} ist eine Weboberfläche für
Debbugs, einem System, um Fehlerberichte zu verwalten. Nach Vorgabe zeigt es
@uref{https://bugs.gnu.org, die bei GNU angebotene Debbugs-Instanz}. Mumi
ist ein Web-Server, er lädt aber auch E-Mails von Debbugs herunter und
indiziert diese.

@defvar mumi-service-type
Dies ist der Diensttyp für Mumi.
@end defvar

@deftp {Datentyp} mumi-configuration
Der Datentyp, der die Konfiguration des Mumi-Dienstes repräsentiert. Dieser
Typ hat die folgenden Felder:

@table @asis
@item @code{mumi} (Vorgabe: @code{mumi})
Das zu verwendende Mumi-Paket.

@item @code{data-directory} (default: @file{"/var/mumi/data"})
Data directory to store Debbugs data from upstream Debbugs instance.

@item @code{rsync-remote}
Remote rsync path from which to download Debbugs data.  The remote is polled
every 5 minutes, unless a previous instance of rsync is already running.

@item @code{rsync-flags} (Vorgabe: @code{'()})
Zusätzliche Befehlszeilenoptionen, die an @command{rsync} übergeben werden.

@item @code{mailer?} (Vorgabe: @code{#true})
Ob die Komponente zum Mailversand aktiviert sein soll oder nicht.

@item @code{sender}
Die E-Mail-Adresse, die bei Kommentaren als Absender angegeben wird.

@item @code{smtp}
Eine URI, um die SMTP-Einstellungen für Mailutils einzurichten. Hierfür
könnte etwas wie @code{sendmail:///path/to/bin/msmtp} angegeben werden, oder
eine beliebige andere URI, die von Mailutils unterstützt wird. Siehe
@ref{SMTP Mailboxes, SMTP-Postfächer,, mailutils, GNU@tie{}Mailutils}.

@item @code{Pakete}
List of @code{<mumi-package-configuration>} objects representing packages
configured on Mumi.

@end table
@end deftp

@deftp {Data Type} mumi-package-configuration
Data type representing the configuration of a package on Mumi.  This type
has the following fields:

@table @asis
@item @code{name}
Name of the package.

@item @code{display-name}
Display name used for this package in the web interface.

@item @code{debbugs-packages}
List of Debbugs packages this package refers to.

@item @code{bug-email-address}
Email address to send bug reports to.

@item @code{patch-email-address}
Email address to send patches to, if that is different from
@code{bug-email-address}.

@item @code{file-tags}
Association list mapping tags to filename regular expressions. Keys are tag
names, and values are lists of regular expressions.  For each entry of the
association list, the tag is applied if a filename referred to in a patch
matches any of the regular expressions.

@end table
@end deftp


@subsubheading FastCGI
@cindex fastcgi
@cindex fcgiwrap
FastCGI ist eine Schnittstelle zwischen den Anwendungen im Vordergrund
(„Front-End“) und Hintergrund („Back-End“) eines Webdienstes. Die Rolle, die
es ausübt, ist nicht mehr ganz aktuell, weil neue Webdienste im Allgemeinen
einfach über HTTP zwischen Vorder- und Hintergrund kommunizieren
sollten. Allerdings gibt es eine Menge von Hintergrunddiensten wie PHP oder
den optimierten Git-Repository-Zugang über HTTP, welche FastCGI benutzen,
also wird es auch in Guix unterstützt.

Um FastCGI zu benutzen, konfigurieren Sie den Webserver im Vordergrund
(z.B.@: nginx) so, dass er eine Teilmenge der Anfragen an die
fastcgi-Hintergrundanwendung weiterleitet, dass auf einem lokalen TCP- oder
Unix-Socket lauscht. Ein dazwischenliegendes @code{fcgiwrap}-Programm sitzt
zwischen dem eigentlichen Hintergrundprozess und dem Webserver. Vom
Vordergrund wird angezeigt, welches Hintergrundprogramm ausgeführt werden
soll. Diese Informationen werden an den @code{fcgiwrap}-Prozess übermittelt.

@defvar fcgiwrap-service-type
Ein Diensttyp für den @code{fcgiwrap}-FastCGI-Proxy.
@end defvar

@deftp {Datentyp} fcgiwrap-configuration
Der Datentyp, der die Konfiguration des @code{fcgiwrap}-Dienstes
repräsentiert. Dieser Typ hat die folgenden Parameter:
@table @asis
@item @code{package} (Vorgabe: @code{fcgiwrap})
Welches fcgiwrap-Paket benutzt werden soll.

@item @code{socket} (Vorgabe: @code{tcp:127.0.0.1:9000})
Der Socket, auf dem der @code{fcgiwrap}-Prozess lauschen soll, als eine
Zeichenkette. Gültige Werte für @var{socket} wären unter anderem
@code{unix:@var{/pfad/zum/unix/socket}},
@code{tcp:@var{vier.teile.gepunkt.et}:@var{Port}} und
@code{tcp6:[@var{IPv6-Adresse}]:Port}.

@item @code{user} (Vorgabe: @code{fcgiwrap})
@itemx @code{group} (Vorgabe: @code{fcgiwrap})
Die Benutzerkonten- und Gruppennamen als Zeichenketten, unter denen der
@code{fcgiwrap}-Prozess ausgeführt werden soll. Der @code{fastcgi}-Dienst
wird sicherstellen, dass, wenn der Nutzer den Benutzer- oder Gruppennamen
@code{fcgiwrap} verlangt, der entsprechende Benutzer und/oder Gruppe auch
auf dem System existiert.

Es ist möglich, einen FastCGI-gestützten Webdienst so zu konfigurieren, dass
er HTTP-Authentisierungsinformationen vom Vordergrundserver an das
Hintergrundsystem weiterreicht und es @code{fcgiwrap} möglich macht, den
Hintergrundprozess als ein entsprechender lokaler Nutzer auszuführen. Um dem
Hintergrundsystem diese Funktionalität anzubieten, lassen Sie
@code{fcgiwrap} als der Administratornutzer @code{root} mit selbiger Gruppe
ausführen. Beachten Sie, dass die Funktionalität auch auf dem
Vordergrundsystem erst eingerichtet werden muss.
@end table
@end deftp

@anchor{PHP-FPM}
@subsubheading PHP-FPM
@cindex php-fpm
PHP-FPM (FastCGI Process Manager) ist eine alternative
PHP-FastCGI-Implementierung, die über einige zusätzliche Funktionalitäten
verfügt, die für Webauftritte jeder Größe nützlich sind.

Zu diesen Funktionalitäten gehören:
@itemize @bullet
@item Prozesserzeugung nach Bedarf
@item Grundlegende Statistiken (ähnlich wie Apaches mod_status)
@item Fortschrittliche Prozessverwaltung mit sanftem Stoppen und Starten
@item Die Möglichkeit, Arbeiter-Threads mit verschiedenen UIDs, GIDs, Chroot- oder Umgebungseinstellungen zu starten
und mit verschiedener php.ini (als Ersatz für safe_mode)
@item Protokollierung der Standard- und Standardfehlerausgabe
@item Neustart im Notfall einer ungewollten Zerstörung des Befehlscode-Zwischenspeichers
@item Unterstützung für beschleunigtes Hochladen
@item Unterstützung für „langsames Protokollieren“ („slowlog“)
@item Verbesserungen gegenüber FastCGI, wie z.B.@: fastcgi_finish_request()@tie{}–
eine besondere Funktion, um eine Anfrage fertig abzuarbeiten und alle Daten
zu Ende zu verarbeiten, während etwas Zeitintensives abläuft
(Videokonvertierung, Statistikverarbeitung usw.)
@end itemize
…@: und vieles mehr.

@defvar php-fpm-service-type
Ein Diensttyp für @code{php-fpm}.
@end defvar

@deftp {Datentyp} php-fpm-configuration
Datentyp für die Konfiguration des php-fpm-Dienstes.
@table @asis
@item @code{php} (Vorgabe: @code{php})
Das zu benutzende PHP-Paket.
@item @code{socket} (Vorgabe: @code{(string-append "/var/run/php" (version-major (package-version php)) "-fpm.sock")})
Die Adresse, auf der FastCGI-Anfragen angenommen werden. Gültige Syntax
hierfür ist:
@table @asis
@item @code{"ip.ad.res.se:Port"}
Lässt auf einem TCP-Socket auf der angegebenen Adresse auf dem angegebenen
Port lauschen.
@item @code{"port"}
Lässt auf einem TCP-Socket auf allen Adressen auf dem angegebenen Port
lauschen.
@item @code{"/pfad/zum/unix/socket"}
Lässt auf einem Unix-Socket lauschen.
@end table

@item @code{user} (Vorgabe: @code{php-fpm})
Der Benutzer, dem die PHP-Arbeiterprozesse gehören werden.
@item @code{group} (Vorgabe: @code{php-fpm})
Die Gruppe für die Arbeiterprozesse.
@item @code{socket-user} (Vorgabe: @code{php-fpm})
Der Benutzer, der mit dem php-fpm-Socket kommunizieren kann.
@item @code{socket-group} (Vorgabe: @code{nginx})
Die Gruppe, die mit dem php-fpm-Socket kommunizieren kann.
@item @code{pid-file} (Vorgabe: @code{(string-append "/var/run/php" (version-major (package-version php)) "-fpm.pid")})
Der Prozessidentifikator des php-fpm-Prozesses wird in diese Datei
geschrieben, sobald der Dienst gestartet wurde.
@item @code{log-file} (Vorgabe: @code{(string-append "/var/log/php" (version-major (package-version php)) "-fpm.log")})
Wohin das Protokoll für den php-fpm-Hauptprozess geschrieben wird.
@item @code{process-manager} (Vorgabe: @code{(php-fpm-dynamic-process-manager-configuration)})
Detaillierte Einstellungen für die php-fpm-Prozessverwaltung. Sie müssen
eines der Folgenden sein:
@table @asis
@item @code{<php-fpm-dynamic-process-manager-configuration>}
@item @code{<php-fpm-static-process-manager-configuration>}
@item @code{<php-fpm-on-demand-process-manager-configuration>}
@end table
@item @code{display-errors} (Vorgabe: @code{#f})
Legt fest, ob PHP-Fehler und Warnungen an Clients geschickt und in ihren
Browsern angezeigt werden. Dies ist nützlich für lokale PHP-Entwicklung,
aber ein Sicherheitsrisiko für öffentliche Webauftritte, weil
Fehlermeldungen Passwörter und Passwortdaten offenlegen können.
@item @code{timezone} (Vorgabe: @code{#f})
Legt den Parameter @code{php_admin_value[date.timezone]} fest.
@item @code{workers-logfile} (Vorgabe: @code{(string-append "/var/log/php" (version-major (package-version php)) "-fpm.www.log")})
In dieser Datei werden @code{stderr}-Ausgaben von PHP-Arbeiterprozessen
protokolliert. Das Feld kann auf @code{#f} gesetzt werden, damit nicht
protokolliert wird.
@item @code{file} (Vorgabe: @code{#f})
Optional kann hier ein vorrangig benutzter Ersatz für die gesamte
Konfigurationsdatei angegeben werden. Sie können dafür die
@code{mixed-text-file}-Funktion oder einen absoluten Dateipfad verwenden.
@item @code{php-ini-file} (Vorgabe: @code{#f})
Hier können optional die PHP-Voreinstellungen geändert werden. Geben Sie
dazu eine beliebige Art von „dateiartigem“ Objekt an (siehe
@ref{G-Ausdrücke, dateiartige Objekte}). Sie können dafür die
@code{mixed-text-file}-Funktion oder einen absoluten Dateipfad verwenden.

Bei der Entwicklung mit dem lokalen Rechner bietet es sich an, die Zeit- und
Speicherbegrenzung erzeugter PHP-Prozesse anzuheben. Benutzen Sie dazu
folgndes Code-Schnipsel in Ihrer Betriebssystemkonfiguration:
@lisp
(define %local-php-ini
  (plain-file "php.ini"
              "memory_limit = 2G
max_execution_time = 1800"))

(operating-system
  ;; …
  (services (cons (service php-fpm-service-type
                           (php-fpm-configuration
                            (php-ini-file %local-php-ini)))
                  %base-services)))
@end lisp

Umfassende Dokumentation dazu, welche Direktiven Sie in der @file{php.ini}
verwenden dürfen, sollten Sie unter den
@url{https://www.php.net/manual/en/ini.core.php,php.ini-Kerndirektiven}
nachschlagen.
@end table
@end deftp

@deftp {Datentyp} php-fpm-dynamic-process-manager-configuration
Datentyp für die @emph{dynamische} Prozessverwaltung durch php-fpm. Bei der
@emph{dynamischen} Prozessverwaltung bleiben Arbeiterprozesse nach Abschluss
ihrer Aufgabe weiterhin erhalten, solange die konfigurierten Beschränkungen
eingehalten werden.
@table @asis
@item @code{max-children} (Vorgabe: @code{5})
Die maximale Anzahl an Arbeiterprozessen.
@item @code{start-servers} (Vorgabe: @code{2})
Wie viele Arbeiterprozesse gleich zu Beginn gestartet werden sollen.
@item @code{min-spare-servers} (Vorgabe: @code{1})
Wie viele untätige Arbeiterprozesse mindestens weiterhin vorgehalten bleiben
sollen.
@item @code{max-spare-servers} (Vorgabe: @code{3})
Wie viele untätige Arbeiterprozesse höchstens weiterhin vorgehalten bleiben
sollen.
@end table
@end deftp

@deftp {Datentyp} php-fpm-static-process-manager-configuration
Datentyp für die @emph{statische} Prozessverwaltung durch php-fpm. Bei der
@emph{statischen} Prozessverwaltung wird eine unveränderliche Anzahl an
Arbeiterprozessen erzeugt.
@table @asis
@item @code{max-children} (Vorgabe: @code{5})
Die maximale Anzahl an Arbeiterprozessen.
@end table
@end deftp

@deftp {Datentyp} php-fpm-on-demand-process-manager-configuration
Datentyp für die Prozessverwaltung @emph{nach Bedarf} durch php-fpm. Bei der
Prozessverwaltung @emph{nach Bedarf} werden Arbeiterprozesse erst erzeugt,
wenn Anfragen vorliegen.
@table @asis
@item @code{max-children} (Vorgabe: @code{5})
Die maximale Anzahl an Arbeiterprozessen.
@item @code{process-idle-timeout} (Vorgabe: @code{10})
Die Zeit in Sekunden, nach der ein Prozess ohne Anfragen erzwungen beendet
wird.
@end table
@end deftp


@deffn {Prozedur} nginx-php-location [#:nginx-package nginx] @
  [socket (string-append "/var/run/php" @
(version-major (package-version php)) "-fpm.sock")]
Eine Hilfsfunktion, mit der in kurzer Zeit PHP zu einer
@code{nginx-server-configuration} hinzugefügt werden kann.
@end deffn

Eine einfache Art, die Dienste für nginx mit PHP einzurichten, kann so
aussehen:
@lisp
(services (cons* (service dhcp-client-service-type)
                 (service php-fpm-service-type)
                 (service nginx-service-type
                          (nginx-server-configuration
                           (server-name '("example.com"))
                           (root "/srv/http/")
                           (locations
                            (list (nginx-php-location)))
                           (listen '("80"))
                           (ssl-certificate #f)
                           (ssl-certificate-key #f)))
                 %base-services))
@end lisp

@cindex cat-avatar-generator
Der Cat Avatar Generator („Katzenavatargenerator“) ist ein einfacher Dienst,
um die Nutzung von php-fpm in @code{Nginx} zu demonstrieren. Mit ihm können
Katzenavatarbilder aus einem Startwert („Seed“) heraus erzeugt werden, zum
Beispiel aus dem Hash der E-Mail-Adresse eines Benutzers.

@deffn {Prozedur} cat-avatar-generator-service @
       [#:cache-dir "/var/cache/cat-avatar-generator"] @
[#:package cat-avatar-generator] @
[#:configuration (nginx-server-configuration)]
Liefert ein nginx-server-configuration-Objekt, das von der in
@code{configuration} angegebenen Konfiguration erbt. Es erweitert die
Nginx-Konfiguration, indem es einen Server-Block hinzufügt, der die in
@code{package} angegebene Version vom cat-avatar-generator anbietet. Bei der
Ausführung wird dem cat-avatar-generator Zugriff auf sein in
@code{cache-dir} angegebenes Zwischenspeicherverzeichnis gewährt.
@end deffn

Eine einfache Konfiguration des cat-avatar-generator kann so aussehen:
@lisp
(services (cons* (cat-avatar-generator-service
                  #:configuration
                  (nginx-server-configuration
                    (server-name '("example.com"))))
                 ...
                 %base-services))
@end lisp

@subsubheading Hpcguix-web

@cindex hpcguix-web
Das Programm @uref{https://github.com/UMCUGenetics/hpcguix-web/,
hpcguix-web} ist eine anpassbare Weboberfläche, um Guix-Pakete zu suchen. Am
Anfang war es für Nutzer von Hochleistungs-Rechenclustern gedacht
(„High-Performance Computing“, kurz HPC).

@defvar hpcguix-web-service-type
Der Diensttyp für @code{hpcguix-web}.
@end defvar

@deftp {Datentyp} hpcguix-web-configuration
Datentyp für die Konfiguration des hpcguix-web-Dienstes.

@table @asis
@item @code{specs} (Vorgabe: @code{#f})
Entweder @code{#f} oder ein G-Ausdruck (siehe @ref{G-Ausdrücke}), der die
Konfiguration des hpcguix-web-Dienstes als
@code{hpcguix-web-configuration}-Verbundsobjekt festlegt. Die wichtigsten
Felder in diesem Verbundsobjekt sind:

@table @asis
@item @code{title-prefix} (Vorgabe: @code{"hpcguix | "})
Das Präfix der Webseitentitel.

@item @code{guix-command} (Vorgabe: @code{"guix"})
Welcher Befehl zum Aufrufen von @command{guix} in Beispielen auf den
HTML-Seiten dargestellt wird.

@item @code{package-filter-proc} (Vorgabe: @code{(const #t)})
Eine Prozedur, die festlegt, wie anzuzeigende Pakete gefiltert werden.

@item @code{package-page-extension-proc} (Vorgabe: @code{(const '())})
Erweiterungspaket für @code{hpcguix-web}.

@item @code{menu} (Vorgabe: @code{'()})
Zusätzlicher Eintrag auf der Menüseite.

@item @code{channels} (Vorgabe: @code{%default-channels})
Liste der Kanäle, aus denen die Paketliste erstellt wird (siehe
@ref{Kanäle}).

@item @code{package-list-expiration} (Vorgabe: @code{(* 12 3600)})
Nach wie viel Zeit in Sekunden die Paketliste aus den neuesten Instanzen der
angegebenen Kanäle neu erzeugt wird.
@end table

Siehe das Repository von hpcguix-web für ein
@uref{https://github.com/UMCUGenetics/hpcguix-web/blob/master/hpcweb-configuration.scm,
vollständiges Beispiel}.

@item @code{package} (Vorgabe: @code{hpcguix-web})
Das hpcguix-web-Paket, was benutzt werden soll.

@item @code{address} (Vorgabe: @code{"127.0.0.1"})
Die IP-Adresse, auf die gelauscht werden soll.

@item @code{port} (Vorgabe: @code{5000})
Die Portnummer, auf der gelauscht werden soll.
@end table
@end deftp

Eine typische Deklaration eines hpcguix-web-Dienstes sieht so aus:

@lisp
(service hpcguix-web-service-type
         (hpcguix-web-configuration
          (specs
           #~(hpcweb-configuration
              (title-prefix "Guix-HPC - ")
              (menu '(("/about" "ABOUT")))))))
@end lisp

@quotation Anmerkung
Der hpcguix-web-Dienst aktualisiert die Liste der Pakete, die er
veröffentlicht, periodisch, indem er die Kanäle über einen Git-„Pull“
lädt. Dazu muss er auf X.509-Zertifikate zugreifen, damit Git-Server
authentifiziert werden können, wenn mit diesen über HTTPS kommuniziert wird,
wofür der Dienst davon ausgeht, dass sich jene Zertifikate in
@file{/etc/ssl/certs} befinden.

Dass ein Zertifikatspaket, @code{nss-certs}, verwendet wird, ist als Teil
der @code{%base-packages} vorgegeben. Siehe @ref{X.509-Zertifikate} für
weitere Informationen zu X.509-Zertifikaten.
@end quotation

@subsubheading gmnisrv

@cindex gmnisrv
Das Programm @uref{https://git.sr.ht/~sircmpwn/gmnisrv, gmnisrv} ist ein
einfacher Server für das @uref{https://gemini.circumlunar.space/,
Gemini-Protokoll}.

@defvar gmnisrv-service-type
Dies ist der Diensttyp des gmnisrv-Dienstes, dessen Wert ein
@code{gmnisrv-configuration}-Objekt wie in diesem Beispiel sein sollte:

@lisp
(service gmnisrv-service-type
         (gmnisrv-configuration
           (config-file (local-file "./my-gmnisrv.ini"))))
@end lisp
@end defvar

@deftp {Datentyp} gmnisrv-configuration
Datentyp, der die Konfiguration von gmnisrv repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @var{gmnisrv})
Das Paketobjekt des gmnisrv-Servers.

@item @code{config-file} (Vorgabe: @code{%default-gmnisrv-config-file})
Ein dateiartiges Objekt mit der zu nutzenden
gmnisrv-Konfigurationsdatei. Die Vorgabekonfiguration lauscht auf Port 1965
und bietet die Dateien in @file{/srv/gemini} an. Zertifikate werden in
@file{/var/lib/gemini/certs} gespeichert. Führen Sie für mehr Informationen
@command{man gmnisrv} und @command{man gmnisrv.ini} aus.

@end table
@end deftp

@subsubheading Agate

@cindex agate
Das Programm @uref{gemini://qwertqwefsday.eu/agate.gmi, Agate}
(@uref{https://github.com/mbrubeck/agate, GitHub-Seite über HTTPS}) ist ein
einfacher Server für das @uref{https://gemini.circumlunar.space/,
Gemini-Protokoll}, der in Rust geschrieben ist.

@defvar agate-service-type
Dies ist der Diensttyp des agate-Dienstes, dessen Wert ein
@code{agate-configuration}-Objekt wie in diesem Beispiel sein sollte:

@lisp
(service agate-service-type
	 (agate-configuration
	   (content "/srv/gemini")
	   (certificates "/srv/gemini-certs")))
@end lisp

Das obige Beispiel steht für die minimalen Abänderungen, um Agate lauffähig
zu machen. Den Pfad zum Zertifikat und zum Schlüsselverzeichnis anzugeben,
ist auf jeden Fall nötig, denn das Gemini-Protokoll setzt standardmäßig TLS
voraus.

If the specified @code{certificates} path is writable by Agate, and contains
no valid pre-generated key and certificate, Agate will try to generate them
on the first start.  In this case you should pass at least one hostname
using the @code{hostnames} option.  If the specified directory is read-only,
key and certificate should be pre-generated by the user.

To obtain a certificate and a key in DER format, you could, for example, use
OpenSSL, running commands similar to the following example:

@example
openssl genpkey -out key.der -outform DER -algorithm RSA \
    -pkeyopt rsa_keygen_bits:4096
openssl req -x509 -key key.der -outform DER -days 3650 -out cert.der \
    -subj "/CN=example.com"
@end example

Of course, you'll have to replace @i{example.com} with your own domain name,
and then point the Agate configuration towards the path of the directory
with the generated key and certificate using the @code{certificates} option.

@end defvar

@deftp {Datentyp} agate-configuration
Der Datentyp, der die Konfiguration von Agate repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @code{agate})
Das Paketobjekt des Agate-Servers.

@item @code{content} (Vorgabe: @file{"/srv/gemini"})
Aus welchem Verzeichnis Agate Dateien anbieten soll.

@item @code{certificates} (default: @file{"/srv/gemini-certs"})
Root of the certificate directory. Must be filled in with a value from the
user.

@item @code{addresses} (default: @code{'("[::]:1965" "0.0.0.0:1965")})
Liste der Adressen, auf denen gelauscht werden soll.

@item @code{hostnames} (default: @code{'()})
Virtual hosts for the Gemini server. If multiple values are specified,
corresponding directory names should be present in the @code{content}
directory. Optional.

@item @code{languages} (default: @code{#f})
RFC-4646-Sprachcode(s) für Dokumente des Typs text/gemini. Optional.

@item @code{only-tls13?} (default: @code{#f})
Set to @code{#t} to disable support for TLSv1.2.

@item @code{serve-secret?} (Vorgabe: @code{#f})
Setzen Sie dies auf @code{#t}, um geheime Dateien (mit einem Punkt
beginnende Dateien und Verzeichnisse) anzubieten.

@item @code{central-configuration?} (default: @code{#f})
Set to @code{#t} to look for the .meta configuration file in the
@code{content} root directory and will ignore @code{.meta} files in other
directories

@item @code{ed25519?} (default: @code{#f})
Set to @code{#t} to generate keys using the Ed25519 signature algorithm
instead of the default ECDSA.

@item @code{skip-port-check?} (default: @code{#f})
Set to @code{#t} to skip URL port check even when a @code{hostname} is
specified.

@item @code{log-ip?} (Vorgabe: @code{#t})
Ob in die Protokolle auch IP-Adressen geschrieben werden sollen.

@item @code{user} (Vorgabe: @code{"agate"})
Besitzer des @code{agate}-Prozesses.

@item @code{group} (Vorgabe: @code{"agate"})
Gruppe des Besitzers des @code{agate}-Prozesses.

@item @code{log-file} (Vorgabe: @file{"/var/log/agate.log"})
Die Datei, in die die Protokollierung von Agate ausgegeben werden soll.

@end table
@end deftp

@subsubheading Miniflux

@cindex miniflux
The @uref{https://miniflux.app/, Miniflux} is a minimalist RSS feed reader
with a web interface.

Depending on the configuration, an initial administrator user can be
pre-created on startup. To enable this, @code{create-admin?} should be set
to @code{#t}, and both @code{admin-username-file} and
@code{admin-password-file} should point to files containing the username and
password, respectively. However, it is recommended to manually change the
password to a secure one via the web UI after the initial service startup.

@defvar miniflux-service-type
This is the type of the Miniflux service. Its value must be a
@code{miniflux-configuration} record as in this example:

@lisp
(service miniflux-service-type
         (miniflux-configuration
          (listen-address "0.0.0.0:8080")
          (base-url "http://my-news-source.test")
          (create-administrator-account? #t)
          (administrator-account-name "/var/miniflux/initial-admin-username")
          (administrator-account-password "/var/miniflux/initial-admin-password")))
@end lisp

The details of the @code{miniflux-configuration} record type are given
below.

@end defvar

@deftp {Data Type} miniflux-configuration
Available @code{miniflux-configuration} fields are:

@table @asis
@item @code{listen-address} (default: @code{"127.0.0.1:8080"}) (type: string)
Address to listen on.  Use absolute path like
@code{"/var/run/miniflux/miniflux.sock"} for a Unix socket.

@item @code{base-url} (default: @code{"http://127.0.0.1/"}) (type: string)
Base URL to generate HTML links and base path for cookies.

@item @code{create-administrator-account?} (default: @code{#f}) (type: boolean)
Create an initial administrator account.

@item @code{administrator-account-name} (type: maybe-string-or-file-path)
Initial administrator account name as a string or an absolute path to a file
with an account name inside.

@item @code{administrator-account-password} (type: maybe-string-or-file-path)
Initial administrator account password as a string or an absolute path to a
file with a password inside.

@item @code{run-migrations?} (default: @code{#t}) (type: boolean)
Run database migrations during application startup.

@item @code{database-url} (default: @code{"host=/var/run/postgresql"}) (type: string)
PostgreSQL connection string.

@item @code{user} (default: @code{"miniflux"}) (type: string)
User name for Postgresql and system account.

@item @code{group} (default: @code{"miniflux"}) (type: string)
Group for the system account.

@item @code{log-file} (default: @code{"/var/log/miniflux.log"}) (type: string)
Path to the log file.

@item @code{extra-settings} (type: maybe-list)
Extra configuration parameters as a list of strings.

@end table
@end deftp

@node High Availability Services
@subsection High Availability Services

@cindex Message broker
@cindex Message streaming
The @code{(gnu services high-availability)} module provides RabbitMQ message
broker service.

@anchor{RabbitMQ}
@subsubheading RabbitMQ

@defvar rabbitmq-service-type
Service type for the @uref{https://www.rabbitmq.com/,RabbitMQ} web server.
The value for this service type is a @code{<rabbitmq-configuration>} record.

Es folgt ein einfaches Beispiel der Konfiguration.

@lisp
(service rabbitmq-service-type
         (rabbitmq-configuration
           (rabbitmq-configuration
             (plugins '("rabbitmq_stream"
                        "rabbitmq_management"
                        "rabbitmq_prometheus")))))
@end lisp
@end defvar

At startup, RabbitMQ broker logs its initialization messages into
@file{/var/log/messages} file.  Once running, the logging messages can be
found in a logging file of a RabbitMQ node in @file{/var/log/rabbitmq}
directory.

@quotation Anmerkung
The default configuration of the RabbitMQ service enables the RabbitMQ
broker to accept connections only on loopback interfaces.  However, enabling
certain plugins may open ports on all network interfaces.  See also
@url{https://www.rabbitmq.com/docs/networking#ports, RabbitMQ Port Access}.
@end quotation

@deftp {Data Type} rabbitmq-configuration
This data type represents the configuration for RabbitMQ.

@table @asis
@item @code{rabbitmq} (default: @code{rabbitmq})
The RabbitMQ package to use.

@item @code{config-file} (default: @code{%default-rabbitmq-config-file})
Configuration file for the RabbitMQ broker. See also
@url{https://www.rabbitmq.com/docs/configure, RabbitMQ Configuration}.

@item @code{data-directory} (default: @code{"/var/lib/rabbitmq/data"})
Directory with RabbitMQ broker data - a schema database, message stores,
cluster member information, and other persistent node state.

@item @code{plugins} (Vorgabe: @code{'()})
A list of RabbitMQ plugins to enable.  View all available plugins using the
@command{rabbitmq-plugins list} command.

@end table
@end deftp

@node Zertifikatsdienste
@subsection Zertifikatsdienste

@cindex Web
@cindex HTTP, HTTPS
@cindex Let's Encrypt
@cindex TLS-Zertifikate
Das Modul @code{(gnu services certbot)} stellt einen Dienst zur Verfügung,
um automatisch ein gültiges TLS-Zertifikat von der Zertifikatsautorität
Let’s Encrypt zu beziehen. Mit diesen Zertifikaten können Informationen
sicher über HTTPS oder andere TLS-basierte Protokolle übertragen werden, im
Wissen, dass der Client die Authentizität des Servers überprüfen wird
können.

@url{https://letsencrypt.org/, Let’s Encrypt} macht das
@code{certbot}-Werkzeug verfügbar, mit dem der Zertifizierungsvorgang
automatisiert werden kann. Das Werkzeug erzeugt zunächst auf sichere Weise
einen Schlüssel auf dem Server und stellt dann eine Anfrage an die
Let’s-Encrypt-Zertifikatsautorität („Certificate Authority“, kurz CA), den
Schlüssel zu signieren. Die Zertifikatsautorität prüft mit einem
Challenge-Response-Protokoll, dass die Anfrage auch wirklich vom fraglichen
Rechner (auch „Host“ genannt) kommt, wozu der Server über HTTP seine Antwort
geben muss. Wenn dieses Protokoll erfolgreich befolgt wurde, signiert die
Zertifikatsautorität den Schlüssel, woraus sich ein Zertifikat
ergibt. Dieses Zertifikat ist eine begrenzte Zeit lang gültig, daher muss
der Server für eine andauernde Bereitstellung von TLS-Leistungen immer
wieder neu der Zertifikatsautorität eine Bitte um die Erneuerung der
Signatur zukommen lassen.

Mit dem certbot-Dienst wird dieser Prozess automatisiert. Er sorgt dafür,
dass am Anfang Schlüssel erzeugt werden und eine erste
Zertifizierungsanfrage an den Dienst von Let’s Encrypt gestellt
wird. Weiterhin ist das Challenge-/Response-Verfahren per Web-Server
integriert. Das Zertifikat wird auf die Platte geschrieben und automatisch
periodisch erneuert und bei der Erneuerung anfallende Aufgaben werden
erledigt (z.B.@: das Neuladen von Diensten und das Kopieren von Schlüsseln
mit entsprechenden Berechtigungen).

Certbot wird zweimal täglich zu einer zufälligen Minute der Stunde
ausgeführt. Es tut so lange nichts, bis eine Erneuerung Ihrer Zertifikate
fällig wird oder sie gesperrt wurden, durch regelmäßige Ausführung bekommen
Sie aber die Chance, dass Ihr Server am Netz bleibt, wenn Let’s Encrypt eine
Sperrung aus irgendeinem Grund anordnet.

Durch die Nutzung dieses Dienstes stimmen Sie dem „ACME Subscriber
Agreement“ zu, das Sie hier finden:
@url{https://acme-v02.api.letsencrypt.org/directory}.

@defvar certbot-service-type
Ein Diensttyp für den @code{certbot}-Client für Let’s Encrypt. Sein Wert
muss ein @code{certbot-configuration}-Verbundsobjekt wie in diesem Beispiel
sein:

@lisp
(service certbot-service-type
         (certbot-configuration
          (email "foo@@example.net")
          (certificates
           (list
            (certificate-configuration
             (domains '("example.net" "www.example.net")))
            (certificate-configuration
             (domains '("bar.example.net")))))))
@end lisp

Siehe unten für Details zur @code{certbot-configuration}.
@end defvar

@deftp {Datentyp} certbot-configuration
Datentyp, der die Konfiguration des @code{certbot}-Dienstes
repräsentiert. Dieser Typ verfügt über die folgenden Parameter:

@table @asis
@item @code{package} (Vorgabe: @code{certbot})
Das certbot-Paket, das benutzt werden soll.

@item @code{webroot} (Vorgabe: @code{/var/www})
Das Verzeichnis, aus dem heraus die Dateien für den
Challenge-/Response-Prozess von Let’s Encrypt angeboten werden sollen.

@item @code{certificates} (Vorgabe: @code{'()})
Eine Liste der @code{certificates-configuration}-Objekte, für die
Zertifikate und Anfragesignaturen erzeugt werden. Für jedes Zertifikat gibt
es einen @code{name}-Eintrag und mehrere @code{domains}.

@item @code{email} (Vorgabe: @code{#f})
Optional die E-Mail-Adresse, die als Kontakt für die Registrierung und das
Wiedererlangen dienen soll. Es wird empfohlen, sie anzugeben, weil Sie
darüber wichtige Mitteilungen über Ihr Konto und ausgestellte Zertifikate
mitbekommen können.

@item @code{server} (Vorgabe: @code{#f})
Optional eine andere URL des ACME-Servers. Wenn sie festgelegt wird, ersetzt
sie die Voreinstellung von Certbot, nämlich die URL des
Let’s-Encrypt-Servers.

@item @code{rsa-key-size} (Vorgabe: @code{2048})
Wie groß der RSA-Schlüssel sein soll.

@item @code{default-location} (Vorgabe: @i{siehe unten})
Die vorgegebene @code{nginx-location-configuration}. Weil @code{certbot}
„Challenges“ und „Responses“ anbieten muss, muss durch ihn ein Web-Server
ausgeführt werden können. Das tut er, indem er den @code{nginx}-Webdienst
mit einer @code{nginx-server-configuration} erweitert, die auf den
@var{domains} auf Port 80 lauscht und eine
@code{nginx-location-configuration} für den URI-Pfad-Teilraum
@code{/.well-known/} umfasst, der von Let’s Encrypt benutzt wird. Siehe
@ref{Web-Dienste} für mehr Informationen über diese
nginx-Konfigurationsdatentypen.

Anfragen an andere URL-Pfade werden mit der @code{default-location}
abgeglichen. Wenn sie angegeben wurde, wird sie zu jeder
@code{nginx-server-configuration} hinzugefügt.

Nach Vorgabe stellt die @code{default-location} eine Weiterleitung von
@code{http://@var{domain}/…} nach @code{https://@var{domain}/…} her. Sie
müssen dann nur noch festlegen, was Sie auf Ihrem Webauftritt über
@code{https} anbieten wollen.

Übergeben Sie @code{#f}, um keine @code{default-location} vorzugeben.
@end table
@end deftp

@deftp {Datentyp} certificate-configuration
Der Datentyp, der die Konfiguration eines Zertifikats repräsentiert. Dieser
Typ hat die folgenden Parameter:

@table @asis
@item @code{name} (Vorgabe: @i{siehe unten})
Dieser Name wird vom Certbot intern zum Aufräumen und in Dateipfaden
benutzt; er hat keinen Einfluss auf den Inhalt des erzeugten Zertifikats. Um
Zertifikatsnamen einzusehen, führen Sie @code{certbot certificates} aus.

Die Vorgabe ist die erste angegebene Domain.

@item @code{domains} (Vorgabe: @code{'()})
Die erste angegebene Domain wird als Name des Zertifikatseigentümers
(„Subject CN“) benutzt und alle Domains werden als alternative Namen
(„Subject Alternative Names“) auf dem Zertifikat stehen.

@item @code{challenge} (Vorgabe: @code{#f})
Welche Art von Challenge durch den Certbot ausgeführt wird. Wenn @code{#f}
angegeben wird, wird die HTTP-Challenge voreingestellt. Wenn ein Wert
angegeben wird, wird das Plugin benutzt, das auch bei manuellen Ausführungen
benutzt wird (siehe @code{authentication-hook}, @code{cleanup-hook} und die
Dokumentation unter @url{https://certbot.eff.org/docs/using.html#hooks}),
und Let’s Encrypt wird dazu berechtigt, die öffentliche IP-Adresse der
anfordernden Maschine in seinem Protokoll zu speichern.

@item @code{csr} (Vorgabe: @code{#f})
Der Dateiname der Zertifizierungsanfrage („Certificate Signing Request“,
CSR) im DER- oder PEM-Format. Wenn @code{#f} angegeben wird, wird kein
solches Argument an den Certbot übermittelt. Wenn ein Wert angegeben wird,
wird der Certbot ihn anstelle einer selbsterstellten CSR verwenden. Die in
@code{domains} genannten Domänen müssen dabei konsistent sein mit denen, die
in der CSR-Datei aufgeführt werden.

@item @code{authentication-hook} (Vorgabe: @code{#f})
Welcher Befehl in einer Shell zum Antworten auf eine Zertifikats-„Challenge“
einmalig ausgeführt wird. Für diesen Befehl wird die Shell-Variable
@code{$CERTBOT_DOMAIN} die Domain enthalten, für die sich der Certbot
authentisiert, @code{$CERTBOT_VALIDATION} enthält die
Validierungs-Zeichenkette und @code{$CERTBOT_TOKEN} enthält den Dateinamen
der bei einer HTTP-01-Challenge angefragten Ressource.

@item @code{cleanup-hook} (Vorgabe: @code{#f})
Command to be run in a shell once for each certificate challenge that have
been answered by the @code{authentication-hook}.  For this command, the
shell variables available in the @code{authentication-hook} script are still
available, and additionally @code{$CERTBOT_AUTH_OUTPUT} will contain the
standard output of the @code{authentication-hook} script.

@item @code{deploy-hook} (Vorgabe: @code{#f})
Welcher Befehl in einer Shell für jedes erfolgreich ausgestellte Zertifikat
einmalig ausgeführt wird. Bei diesem Befehl wird die Shell-Variable
@code{$RENEWED_LINEAGE} auf das Unterverzeichnis für die aktuelle
Konfiguration zeigen (zum Beispiel
@samp{"/etc/letsencrypt/live/example.com"}), in dem sich die neuen
Zertifikate und Schlüssel befinden. Die Shell-Variable
@code{$RENEWED_DOMAINS} wird eine leerzeichengetrennte Liste der erneuerten
Zertifikatsdomänen enthalten (zum Beispiel @samp{"example.com
www.example.com"}.

@item @code{dry-run?} (default: @code{#f})
Communicate with the ACME server but do not update certificates nor trigger
@code{deploy-hook}.  This is useful as a temporary setting to test the
challenge procedure, especially the @code{authentication-hook} and
@code{cleanup-hook} while working on them.  It's also a good idea to use the
Let's Encrypt staging server at
@url{https://acme-staging-v02.api.letsencrypt.org/directory} while testing,
which allows for higher rate limits, but with which @code{certbot} will
helpfully refuse to update certificates and recommend the @code{dry-run?}
option.  For example:

@lisp
(define %authentication-hook
  (program-file "authentication-hook"
    #~(let ((domain (getenv "CERTBOT_DOMAIN"))
            (token (getenv "CERTBOT_TOKEN")))
        (format #t "Hey, can you authenticate ~a with ~a for me?"
                domain token))))

(define %cleanup-hook
  (program-file "authentication-hook"
    #~(display "Bye")))

(service certbot-service-type
         (certbot-configuration
          (server "https://acme-staging-v02.api.letsencrypt.org/directory")
          (certificates
           (list
            (certificate-configuration
              (dry-run? #t)
              (authentication-hook %authentication-hook)
              (cleanup-hook %cleanup-hook)
              (domains '("example.net" "www.example.net")))))))
@end lisp

@item @code{start-self-signed?} (Vorgabe: @code{#t})
Ob bei der Aktivierung des Systems für den Anfang ein selbstsigniertes
Zertifikat erzeugt werden soll. Diese Option ist besonders geeignet, weil so
@code{nginx} schon in der Lage ist, zu starten, noch bevor @code{certbot}
ausgeführt wurde, denn @code{certbot} kann nur ausgeführt werden, wenn
@code{nginx} läuft und damit HTTP-Challenges beantwortet werden können.

@end table
@end deftp

Für jede @code{certificate-configuration} wird das Zertifikat in
@code{/etc/certs/@var{name}/fullchain.pem} und der Schlüssel in
@code{/etc/certs/@var{name}/privkey.pem} gespeichert.
@node DNS-Dienste
@subsection DNS-Dienste
@cindex DNS (Domain Name System)
@cindex Domain Name System (DNS)

Das Modul @code{(gnu services dns)} stellt Dienste zur Verfügung, die mit
dem @dfn{Domain Name System} (DNS) zu tun haben. Es bietet einen
Server-Dienst an, mit dem ein @emph{autoritativer} DNS-Server für mehrere
Zonen betrieben werden kann, jeweils als untergeordneter „Slave“ oder als
„Master“. Dieser Dienst benutzt @uref{https://www.knot-dns.cz/, Knot
DNS}. Außerdem wird ein zwischenspeichernder und weiterleitender DNS-Server
für das LAN bereitgestellt, der
@uref{http://www.thekelleys.org.uk/dnsmasq/doc.html, dnsmasq} benutzt.

@subsubheading Knot-Dienst

Eine Beispielkonfiguration eines autoritativen Servers für zwei Zonen, eine
„Master“, eine „Slave“, wäre:

@lisp
(define-zone-entries example.org.zone
;; Name TTL Class Type Data
  ("@@"  ""  "IN"  "A"  "127.0.0.1")
  ("@@"  ""  "IN"  "NS" "ns")
  ("ns" ""  "IN"  "A"  "127.0.0.1"))

(define master-zone
  (knot-zone-configuration
    (domain "example.org")
    (zone (zone-file
            (origin "example.org")
            (entries example.org.zone)))))

(define slave-zone
  (knot-zone-configuration
    (domain "plop.org")
    (dnssec-policy "default")
    (master (list "plop-master"))))

(define plop-master
  (knot-remote-configuration
    (id "plop-master")
    (address (list "208.76.58.171"))))

(operating-system
  ;; ...
  (services (cons* (service knot-service-type
                     (knot-configuration
                       (remotes (list plop-master))
                       (zones (list master-zone slave-zone))))
                   ;; ...
                   %base-services)))
@end lisp

@defvar knot-service-type
Dies ist der Diensttyp für den Knot-DNS-Server.

Knot DNS ist ein autoritativer DNS-Server, das heißt, er kann mehrere Zonen
bedienen, also mehrere Domainnamen, die Sie von einem Registrar kaufen
würden. Dieser Server ist kein „Resolver“,  er dient also nur zur Auflösung
von Namen, für die er autoritativ ist. Dieser Server kann so konfiguriert
werden, dass er Zonen als „Master“-Server oder als „Slave“-Server
bereitstellt, je nachdem, wie er für die jeweilige Zone eingestellt
ist. Server für „Slave“-Zonen erhalten ihre Daten von „Master“-Servern und
stellen mit ihnen einen autoritativen Server zur Verfügung. Für einen
„Resolver“ macht es keinen Unterschied, ob er Namen auflöst, indem er einen
„Master“ oder einen „Slave“ danach fragt.

Die folgenden Datentypen werden benutzt, um den Knot-DNS-Server zu
konfigurieren:
@end defvar

@deftp {Datentyp} knot-key-configuration
Datentyp, der einen Schlüssel repräsentiert. Dieser Typ hat die folgenden
Parameter:

@table @asis
@item @code{id} (Vorgabe: @code{""})
Ein Identifikator, mit dem sich andere Konfigurationsfelder auf diesen
Schlüssel beziehen können. IDs müssen eindeutig sein und dürfen @emph{nicht}
leer sein.

@item @code{algorithm} (Vorgabe: @code{#f})
Der Algorithmus, der benutzt werden soll. Wählen Sie zwischen @code{#f},
@code{'hmac-md5}, @code{'hmac-sha1}, @code{'hmac-sha224},
@code{'hmac-sha256}, @code{'hmac-sha384} und @code{'hmac-sha512}.

@item @code{secret} (Vorgabe: @code{""})
Was dabei der geheime Schlüssel sein soll.

@end table
@end deftp

@deftp {Datentyp} knot-acl-configuration
Datentyp, der die Konfiguration einer Zugriffssteuerungsliste („Access
Control List“, ACL) repräsentiert. Dieser Typ hat die folgenden Parameter:

@table @asis
@item @code{id} (Vorgabe: @code{""})
Ein Identifikator, mit dem sich andere Konfigurationsfelder auf diesen
Schlüssel beziehen können. IDs müssen eindeutig sein und dürfen @emph{nicht}
leer sein.

@item @code{address} (Vorgabe: @code{'()})
Eine geordnete Liste aus IP-Adresse, Netzwerk-Subnetzen oder
Netzwerkbereichen, die jeweils als Zeichenketten angegeben werden. Die
Anfrage muss zu einem davon passen. Ein leerer Wert bedeutet, dass die
Adresse nicht passen muss.

@item @code{key} (Vorgabe: @code{'()})
Eine geordnete Liste von Referenzen auf Schlüssel, die jeweils als
Zeichenketten angegeben werden. Die Zeichenkette muss zu einem
Schlüsselidentifikator passen, der in einem der
@code{knot-key-configuration}-Objekte definiert wurde. Wenn kein Schlüssel
angegeben wird, bedeutet das, dass kein Schlüssel zu dieser
Zugriffssteuerungsliste passen muss.

@item @code{action} (Vorgabe: @code{'()})
Eine geordete Liste der Aktionen, die von dieser Zugriffssteuerungsliste
zugelassen oder gesperrt werden. Mögliche Werte sind Listen aus null oder
mehr Elementen, die jeweils @code{'transfer}, @code{'notify} oder
@code{'update} sind.

@item @code{deny?} (Vorgabe: @code{#f})
Wenn dies auf wahr steht, werden mit der Zugriffssteuerungsliste
Einschränkungen festgelegt, d.h.@: aufgelistet Aktionen werden
gesperrt. Steht es auf falsch, werden aufgelistete Aktionen zugelassen.

@end table
@end deftp

@deftp {Datentyp} zone-entry
Datentyp, der einen Eintrag in einer Zonendatei repräsentiert. Dieser Typ
verfügt über die folgenden Parameter:

@table @asis
@item @code{name} (Vorgabe: @code{"@@"})
Der Name des Eintrags. @code{"@@"} bezieht sich auf den Ursprung der
Zone. Namen sind relativ zum Ursprung der Zone. Zum Beispiel bezieht sich in
einer Zone @code{example.org} der Eintrag @code{"ns.example.org"}
tatsächlich auf @code{ns.example.org.example.org}. Namen, die auf einen
Punkt enden, sind absolut. Das bedeutet, dass sich @code{"ns.example.org."}
auf @code{ns.example.org} bezieht.

@item @code{ttl} (Vorgabe: @code{""})
Wie lange dieser Eintrag zwischengespeichert werden darf, d.h.@: seine
„Time-To-Live“ (TTL). Ist sie nicht festgelegt, wird die voreingestellte TTL
benutzt.

@item @code{class} (Vorgabe: @code{"IN"})
Welche Klasse der Eintrag hat. Derzeit unterstützt Knot nur @code{"IN"} und
teilweise @code{"CH"}.

@item @code{type} (Vorgabe: @code{"A"})
Der Typ des Eintrags. Zu den üblichen Typen gehören A (für eine
IPv4-Adresse), AAAA (für eine IPv6-Adresse), NS (der Namens-Server) und MX
(„Mail eXchange“ für E-Mails). Viele andere Typen sind auch definiert.

@item @code{data} (Vorgabe: @code{""})
Die Daten, die im Eintrag stehen, zum Beispiel eine IP-Adresse bei einem
A-Eintrag oder ein Domain-Name bei einem NS-Eintrag. Bedenken Sie, dass
Domain-Namen relativ zum Ursprung angegeben werden, außer wenn sie auf einen
Punkt enden.

@end table
@end deftp

@deftp {Datentyp} zone-file
Datentyp, der den Inhalt einer Zonendatei repräsentiert. Dieser Typ verfügt
über die folgenden Parameter:

@table @asis
@item @code{entries} (Vorgabe: @code{'()})
Die Liste der Einträge. Für den SOA-Eintrag wird automatisch gesorgt, also
müssen Sie ihn nicht zur Liste der Einträge hinzufügen. In der Liste sollte
vermutlich ein Eintrag für Ihren primären autoritativen DNS-Server
stehen. Abgesehen vom direkten Aufzählen der Einträge können Sie
@code{define-zone-entries} verwenden, um ein Objekt zu definieren, worin
eine Liste von Einträgen leichter angegeben werden kann, und was sie dann im
@code{entries}-Feld des @code{zone-file} angeben können.

@item @code{origin} (Vorgabe: @code{""})
Der Name Ihrer Zone. Dieser Parameter darf nicht leer sein.

@item @code{ns} (Vorgabe: @code{"ns"})
Die Domain Ihres primären autoritativen DNS-Servers. Der Name wird relativ
zum Ursprung angegeben, außer wenn er auf einen Punkt endet. Dieser primäre
DNS-Server @emph{muss} verpflichtend einem NS-Eintrag in der Zone
entsprechen, dem eine IP-Adresse in der Liste der Einträge zugeordnet werden
muss.

@item @code{mail} (Vorgabe: @code{"hostmaster"})
Eine E-Mail-Adresse, unter der man Sie als für diese Zone Verantwortlichen
(„Besitzer“/„Owner“) kontaktieren kann. Sie wird zu @code{<mail>@@<origin>}
umgeschrieben.

@item @code{serial} (Vorgabe: @code{1})
Die Seriennummer der Zone. Da sie von sowohl „Slaves“ als auch „Resolvern“
benutzt wird, um bei Änderungen auf dem Laufenden zu bleiben, ist es
notwendig, dass sie @emph{niemals} kleiner gemacht wird. Erhöhen Sie sie,
wann immer Sie eine Änderung an Ihrer Zone durchführen.

@item @code{refresh} (Vorgabe: @code{(* 2 24 3600)})
Die Häufigkeit, wie oft Slaves eine Zonenübertragung („Zone Transfer“)
durchführen. Als Wert wird eine Anzahl von Sekunden angegeben. Sie kann über
eine Multiplikation oder mit @code{(string->duration)} angegeben werden.

@item @code{retry} (Vorgabe: @code{(* 15 60)})
Nach welcher Zeitperiode ein Slave versuchen wird, Kontakt mit seinem Master
aufzunehmen, wenn er ihn beim ersten Mal nicht erreichen kann.

@item @code{expiry} (Vorgabe: @code{(* 14 24 3600)})
Die Voreinstellung, welche TTL für Einträge verwendet werden
soll. Bestehende Einträge werden für höchstens diese Zeitspanne als korrekt
angesehen. Nach Ablauf dieser Zeitspanne werden „Resolver“ ihren
Zwischenspeicher als ungültig markieren und erneut prüfen, ob der Eintrag
noch existiert.

@item @code{nx} (Vorgabe: @code{3600})
Die voreingestellte TTL der @emph{nicht} existierenden Einträge. Sie stellt
normalerweise eine kurze Verzögerung dar, weil Sie möchten, dass neue
Domains für jeden schnell erkannt werden.

@end table
@end deftp

@deftp {Datentyp} knot-remote-configuration
Datentyp, der die Konfiguration eines entfernten Servers („Remote“)
repräsentiert. Dieser Typ verfügt über die folgenden Parameter:

@table @asis
@item @code{id} (Vorgabe: @code{""})
Ein Identifikator, mit dem man sich in anderen Konfigurationsfeldern auf
diesen entfernten Server („Remote“) beziehen kann. IDs müssen eindeutig sein
und dürfen @emph{nicht} leer sein.

@item @code{address} (Vorgabe: @code{'()})
Eine geordnete Liste der Empfänger-IP-Adressen. Adressen werden der Reihe
nach durchprobiert. Optional kann eine Portnummer nach dem Trennzeichen @@
angegeben werden, zum Beispiel als @code{(list "1.2.3.4"
"2.3.4.5@@53")}. Die Vorgabe ist 53.

@item @code{via} (Vorgabe: @code{'()})
Eine geordnete Liste der Quell-IP-Adressen. Eine leere Liste wird Knot eine
sinnvolle Quell-IP-Adresse auswählen lassen. Optional kann eine Portnummer
nach dem Trennzeichen @@ angegeben werden. Die Vorgabe wird zufällig
ausgewählt.

@item @code{key} (Vorgabe: @code{#f})
Ein Verweis auf einen Schlüssel („Key“), also eine Zeichenkette, die den
Identifikator eines Schlüssels enthält, der in einem
@code{knot-key-configuration}-Feld festgelegt wurde.

@end table
@end deftp

@deftp {Datentyp} knot-keystore-configuration
Datentyp, der einen Schlüsselspeicher („Keystore“) repräsentiert, um
DNSSEC-Schlüssel zu fassen. Dieser Typ verfügt über die folgenden Parameter:

@table @asis
@item @code{id} (Vorgabe: @code{""})
Der Identifikator des Schlüsselspeichers. Er darf nicht leer gelassen
werden.

@item @code{backend} (Vorgabe: @code{'pem})
Die Art von Hintergrundspeicher, in dem Schlüssel eingetragen werden. Sie
kann @code{'pem} oder @code{'pkcs11} sein.

@item @code{config} (Vorgabe: @code{"/var/lib/knot/keys/keys"})
Die Zeichenkette mit der Konfiguration des Hintergrundspeichers. Ein
Beispiel für die PKCS#11 ist @code{"pkcs11:token=knot;pin-value=1234
/gnu/store/…/lib/pkcs11/libsofthsm2.so"}. Für pem als Hintergrundspeicher
repräsentiert die Zeichenkette einen Pfad im Dateisystem.

@end table
@end deftp

@deftp {Datentyp} knot-policy-configuration
Datentyp, der die DNSSEC-Richtlinie repräsentiert. Knot DNS kann Ihre Zonen
automatisch signieren. Der Dienst kann Ihre Schlüssel automatisch erzeugen
und verwalten oder Schlüssel benutzen, die Sie selbst erzeugen.

DNSSEC wird in der Regel mit zwei Schlüsseln implementiert: Ein Schlüssel,
mit dem Schlüssel signiert werden („Key Signing Key“, KSK), signiert den
zweiten Schlüssel, einen Schlüssel, der Zonen signiert („Zone Signing Key“,
ZSK), mit dem die Zone signiert wird. Damit er als vertrauenswürdig
angesehen wird, muss der KSK in der Elternzone stehen (meistens ist das eine
Top-Level-Domain). Wenn Ihr Registrar DNSSEC unterstützt, müssen Sie ihm den
Hash Ihres KSK übermitteln, damit er einen DS-Eintrag für Ihre Zone
hinzufügen kann. Das passiert nicht automatisch und muss jedes Mal
wiederholt werden, wenn Sie Ihren KSK ändern.

Die Richtlinie legt auch fest, wie lange Ihre Schlüssel gültig
bleiben. Normalerweise kann der ZSK leicht geändert werden und benutzt
kryptografisch schwächere Funktionen (also niedrigere Parameter), damit
Einträge schnell signiert werden können, wodurch man sie oft verändern
kann. Der KSK setzt jedoch eine manuelle Interaktion mit dem Registrar
voraus, also werden sie weniger oft geändert und verwenden stärkere
Parameter, weil mit ihnen nur ein einziger Eintrag signiert wird.

Dieser Typ verfügt über die folgenden Parameter:

@table @asis
@item @code{id} (Vorgabe: @code{""})
Der Identifikator der Richtlinie. Er darf nicht leer sein.

@item @code{keystore} (Vorgabe: @code{"default"})
Eine Referenz auf einen Schlüsselspeicher („Keystore“), also eine
Zeichenkette, die den Identifikator eines Schlüsselspeichers enthält, der in
einem @code{knot-keystore-configuration}-Feld gespeichert ist. Der
Identifikator @code{"default"} sorgt dafür, dass der vorgegebene
Schlüsselspeicher verwendet wird (eine KASP-Datenbank, die durch diesen
Dienst eingerichtet wurde).

@item @code{manual?} (Vorgabe: @code{#f})
Ob Schlüssel manuell verwaltet werden sollen; andernfalls werden sie
automatisch verwaltet.

@item @code{single-type-signing?} (Vorgabe: @code{#f})
Wenn es auf @code{#t} steht, werden dieselben Schlüssel als KSK und ZSK
verwendet („Single-Type Signing Scheme“).

@item @code{algorithm} (Vorgabe: @code{"ecdsap256sha256"})
Ein Algorithmus für zum Signieren verwendete Schlüssel und ausgestellte
Signaturen.

@item @code{ksk-size} (Vorgabe: @code{256})
Die Länge des KSK@. Beachten Sie, dass dieser Wert für den vorgegebenen
Algorithmus korrekt ist, aber für andere Algorithmen @emph{nicht} sicher
wäre.

@item @code{zsk-size} (Vorgabe: @code{256})
Die Länge des ZSK@. Beachten Sie, dass dieser Wert für den vorgegebenen
Algorithmus korrekt ist, aber für andere Algorithmen @emph{nicht} sicher
wäre.

@item @code{dnskey-ttl} (Vorgabe: @code{'default})
Der TTL-Wert für DNSKEY-Einträge, die die Wurzel der Zone betreffen. Der
besondere Wert @code{'default} bedeutet, dass dieselbe TTL wie für den
SOA-Eintrag der Zone verwendet wird.

@item @code{zsk-lifetime} (Vorgabe: @code{(* 30 24 3600)})
Die Zeitspanne zwischen der Veröffentlichung eines ZSK und dem Anfang des
nächsten Schlüsselübergangs („Key Rollover“).

@item @code{propagation-delay} (Vorgabe: @code{(* 24 3600)})
Eine zusätzliche Verlängerung, die bei jedem Schritt im Schlüsselübergang
(„Key Rollover“) gewartet wird. Dieser Wert sollte hoch genug sein, damit in
dieser Zeit Daten vom Master-Server alle Slaves erreichen.

@item @code{rrsig-lifetime} (Vorgabe: @code{(* 14 24 3600)})
Wie lange neu ausgestellte Signaturen gültig bleiben.

@item @code{rrsig-refresh} (Vorgabe: @code{(* 7 24 3600)})
Wie lange im Voraus vor einem Auslaufen der Signatur diese Signatur erneuert
werden soll.

@item @code{nsec3?} (Vorgabe: @code{#f})
Ist es auf @code{#t} gesetzt, wird NSEC3 statt NSEC benutzt.

@item @code{nsec3-iterations} (Vorgabe: @code{5})
Wie oft zusätzlich gehasht werden soll.

@item @code{nsec3-salt-length} (Vorgabe: @code{8})
Wie lange das kryptografische „Salt“ sein soll, als Anzahl von Oktetten. Es
wird vor dem Hashen an den Namen des ursprünglichen Besitzers angehängt.

@item @code{nsec3-salt-lifetime} (Vorgabe: @code{(* 30 24 3600)})
Wie lange das neu ausgestellte Salt-Feld gültig bleiben soll.

@end table
@end deftp

@deftp {Datentyp} knot-zone-configuration
Datentyp, der eine durch Knot verfügbar gemachte Zone repräsentiert. Dieser
Typ verfügt über die folgenden Parameter:

@table @asis
@item @code{domain} (Vorgabe: @code{""})
Die Domain, die durch diese Konfiguration zur Verfügung gestellt wird. Sie
darf nicht leer sein.

@item @code{file} (Vorgabe: @code{""})
Die Datei, in der diese Zone abgespeichert wird. Dieser Parameter wird bei
Master-Zonen ignoriert. Bleibt er leer, wird die vom Domain-Namen abhängige
Voreinstellung benutzt.

@item @code{zone} (Vorgabe: @code{(zone-file)})
Der Inhalt der Zonendatei. Dieser Parameter wird bei Slave-Zonen
ignoriert. Er muss ein Verbundsobjekt vom Typ @code{zone-file} enthalten.

@item @code{master} (Vorgabe: @code{'()})
Eine Liste von als „Master“ geltenden entfernten Servern. Ist sie leer, ist
diese Zone ein Master, sonst ein Slave. Es handelt sich um eine Liste von
Identifikatoren entfernter Server („Remotes“).

@item @code{ddns-master} (Vorgabe: @code{#f})
Der vorrangige „Master“. Ist dies leer, wird hierfür der erste Master aus
der Liste der Master benutzt.

@item @code{notify} (Vorgabe: @code{'()})
Eine Liste der Identifikatoren von entfernten Slave-Servern („Remotes“).

@item @code{acl} (Vorgabe: @code{'()})
Eine Liste von Identifikatoren von Zugriffssteuerungslisten.

@item @code{semantic-checks?} (Vorgabe: @code{#f})
Wenn dies festgelegt ist, werden für die Zone mehr semantische Überprüfungen
durchgeführt.

@item @code{zonefile-sync} (Vorgabe: @code{0})
Wie lange nach einer Änderung der im Arbeitsspeicher zwischengespeicherten
Daten gewartet wird, bis die Daten auf die Platte geschrieben werden. Bei 0
werden sie sofort synchronisiert.

@item @code{zonefile-load} (Vorgabe: @code{#f})
Wie die in der Zonendatei gespeicherten Daten benutzt werden, wenn die Zone
geladen wird. Mögliche Werte sind:

@itemize
@item @code{#f} sorgt dafür, dass nach der Voreinstellung von Knot verfahren wird,
@item @code{'none} bewirkt, dass die Zonendatei überhaupt nicht benutzt wird,
@item @code{'difference} lässt den Unterschied zwischen den bereits vorliegenden
Daten und dem gespeicherten Inhalt der Zone berechnen, welcher dann zum
vorliegenden Zoneninhalt hinzugenommen wird,
@item @code{'difference-no-serial} für dasselbe wie bei @code{'difference},
aber die SOA-Seriennummer in der Zonendatei wird ignoriert und der Server
kümmert sich automatisch darum.
@item @code{'whole} lässt den ganzen Inhalt der Zone aus der Zonendatei auslesen.
@end itemize

@item @code{journal-content} (Vorgabe: @code{#f})
Wie in den Aufzeichnungen die Zone und Änderungen daran gespeichert werden
sollen. Mögliche Werte sind @code{'none}, um keine Aufzeichnungen zu führen,
@code{'changes}, um Änderungen zu speichern, und @code{'all}, wodurch der
gesamte Inhalt gespeichert wird. Für @code{#f} wird dieser Wert nicht
gesetzt, so dass der in Knot voreingestellte Wert benutzt wird.

@item @code{max-journal-usage} (Vorgabe: @code{#f})
Die maximale Größe, die Aufzeichnungen für die Wiederherstellbarkeit
(„Journal“) auf der Platte einnehmen können. Für @code{#f} wird dieser Wert
nicht gesetzt, so dass der in Knot voreingestellte Wert benutzt wird.

@item @code{max-journal-depth} (Vorgabe: @code{#f})
Wie viele Aufzeichnungen höchstens im Änderungsverlauf gespeichert
werden. Für @code{#f} wird dieser Wert nicht gesetzt, so dass der in Knot
voreingestellte Wert benutzt wird.

@item @code{max-zone-size} (Vorgabe: @code{#f})
Die maximale Größe der Zonendatei. Diese Beschränkung wird auf eingehende
Übertragungen und Aktualisierungen angewandt. Für @code{#f} wird dieser Wert
nicht gesetzt, so dass der in Knot voreingestellte Wert benutzt wird.

@item @code{dnssec-policy} (Vorgabe: @code{#f})
Ein Verweis auf ein @code{knot-policy-configuration}-Verbundsobjekt oder der
besondere Name @code{"default"}, um die Voreinstellung von Knot zu
verwenden. Wenn dies als der Wert @code{#f} angegeben wurde, findet in
dieser Zone kein Signieren mit DNSSEC statt.

@item @code{serial-policy} (Vorgabe: @code{'increment})
Eine Richtlinie; entweder @code{'increment} (Seriennummer hochzählen) oder
@code{'unixtime} (Unix-Zeitstempel verwenden).

@end table
@end deftp

@deftp {Datentyp} knot-configuration
Datentyp, der die Konfiguration von Knot repräsentiert. Dieser Typ verfügt
über die folgenden Parameter:

@table @asis
@item @code{knot} (Vorgabe: @code{knot})
Das Knot-Paket.

@item @code{run-directory} (Vorgabe: @code{"/var/run/knot"})
Das Laufzeit-Verzeichnis („run“-Verzeichnis). In diesem Verzeichnis werden
die PID-Datei mit dem Prozessidentifikator und Sockets gespeichert.

@item @code{includes} (Vorgabe: @code{'()})
Eine flache Liste von Zeichenketten oder dateiartigen Objekten, die oben in
der Konfigurationsdatei eingebunden werden müssen.

@cindex Geheimnisse, Knot-Dienst
Hiermit können Geheimnisse abseits von Guix’ Zuständigkeitsbereich
gespeichert werden. Zum Beispiel können Sie geheime Schlüssel so in einer
externen Datei speichern, die nicht von Guix verwaltet und daher auch nicht
von jedem in @file{/gnu/store} ausgelesen werden kann@tie{}– Sie können etwa
Ihre geheime Schlüsselkonfiguration in @file{/etc/knot/secrets.conf}
speichern und diese Datei dann zu Ihrer @code{includes}-Liste hinzufügen.

Sie können mit dem Schlüsselverwaltungsprogramm @code{keymgr} aus dem
Knot-Paket einen geheimen TSIG-Schlüssel erzeugen lassen (für
@code{nsupdate} und Zonentransfers). Beachten Sie, dass das Paket
@emph{nicht} automatisch durch den Dienst installiert wird. Das folgende
Beispiel zeigt, wie man einen neuen TSIG-Schlüssel erzeugen lässt:

@example
keymgr -t meingeheimnis > /etc/knot/secrets.conf
chmod 600 /etc/knot/secrets.conf
@end example

Außerdem sollten Sie bedenken, dass der erzeugte Schlüssel den Namen
@var{meingeheimnis} bekommt, dieser Name also auch im @var{key}-Feld des
@code{knot-acl-configuration}-Verbundsobjekts und an anderen Stellen
verwendet werden muss, wo auf den Schlüssel verwiesen wird.

Sie können die @code{includes} auch benutzen, um von der Guix-Schnittstelle
nicht unterstützte Einstellungen festzulegen.

@item @code{listen-v4} (Vorgabe: @code{"0.0.0.0"})
Eine IP-Adresse, auf der gelauscht werden soll.

@item @code{listen-v6} (Vorgabe: @code{"::"})
Eine IP-Adresse, auf der gelauscht werden soll.

@item @code{listen-port} (Vorgabe: @code{53})
Ein Port, auf dem gelauscht werden soll.

@item @code{keys} (Vorgabe: @code{'()})
Die Liste der @code{knot-key-configuration}-Objekte, die von dieser
Konfiguration benutzt werden sollen.

@item @code{acls} (Vorgabe: @code{'()})
Die Liste der @code{knot-acl-configuration}-Objekte, die von dieser
Konfiguration benutzt werden sollen.

@item @code{remotes} (Vorgabe: @code{'()})
Die Liste der @code{knot-remote-configuration}-Objekte, die von dieser
Konfiguration benutzt werden sollen.

@item @code{zones} (Vorgabe: @code{'()})
Die Liste der @code{knot-zone-configuration}-Objekte, die von dieser
Konfiguration benutzt werden sollen.

@end table
@end deftp

@subsubheading Knot-Resolver-Dienst

@defvar knot-resolver-service-type
Dies ist der Diensttyp des Knot-Resolver-Dienstes, dessen Wert ein
@code{knot-resolver-configuration}-Objekt wie in diesem Beispiel sein
sollte:

@lisp
(service knot-resolver-service-type
         (knot-resolver-configuration
           (kresd-config-file (plain-file "kresd.conf" "
net.listen('192.168.0.1', 5353)
user('knot-resolver', 'knot-resolver')
modules = @{ 'hints > iterate', 'stats', 'predict' @}
cache.size = 100 * MB
"))))
@end lisp

Weitere Informationen finden Sie in seinem
@url{https://knot-resolver.readthedocs.io/en/stable/config-overview.html,
Handbuch}.
@end defvar

@deftp {Datentyp} knot-resolver-configuration
Der Datentyp, der die Konfiguration von knot-resolver repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @var{knot-resolver})
Das Paketobjekt des Knot-DNS-Resolvers.

@item @code{kresd-config-file} (Vorgabe: %kresd.conf)
Dateiartiges Objekt der zu nutzenden kresd-Konfigurationsdatei. Nach Vorgabe
lauscht der Knot-Resolver auf @code{127.0.0.1} und @code{::1}.

@item @code{garbage-collection-interval} (Vorgabe: 1000)
Wie viele Millisekunden @code{kres-cache-gc} zwischen Bereinigungen seines
Zwischenspeichers wartet.

@end table
@end deftp


@subsubheading Dnsmasq-Dienst

@defvar dnsmasq-service-type
Dies ist der Diensttyp des dnsmasq-Dienstes, dessen Wert ein
@code{dnsmasq-configuration}-Objekt wie in diesem Beispiel sein sollte:

@lisp
(service dnsmasq-service-type
         (dnsmasq-configuration
           (no-resolv? #t)
           (servers '("192.168.1.1"))))
@end lisp

@code{dnsmasq-service-type} provides two actions:

@table @code
@item reload
Send a @code{SIGHUP} signal to @command{dnsmasq} to clear cache and reload
hosts files which triggers the following actions:

@itemize @bullet
@item
Clear the DNS cache
@item
Reload @file{/etc/hosts} and @file{/etc/ethers}
@item
Reload files specified by @option{--dhcp-hostsfile},
@option{--dhcp-hostsdir}, @option{--dhcp-optsfile}, @option{--dhcp-optsdir},
@option{--addn-hosts}, or @option{--hostsdir}
@item
Execute DHCP lease change scripts for all existing leases
@item
Reread @file{/etc/resolv.conf} (only if @option{--no-poll} is configured).
@end itemize

@quotation Anmerkung
The @code{SIGHUP} signal does not trigger a reload of the main configuration
file.
@end quotation

Ein Beispiel, wie Sie es verwenden:
@example
herd reload dnsmasq
@end example

@item stats
When @command{dnsmasq} receives a @code{SIGUSR1} signal, it writes
statistics to the system log including:

@itemize @bullet
@item
Cache size and number of evicted entries
@item
Cache hits, misses, and authoritative queries answered
@item
For each upstream server: queries sent and errors received
@item
TCP connection fork statistics.
@end itemize

Ein Beispiel, wie Sie es verwenden:
@example
herd stats dnsmasq
@end example
@end table

@end defvar

@deftp {Datentyp} dnsmasq-configuration
Repräsentiert die dnsmasq-Konfiguration.

@table @asis
@item @code{package} (Vorgabe: @var{dnsmasq})
Paketobjekt des dnsmasq-Servers.

@item @code{shepherd-provision} (default: @code{'(dnsmasq)})
@itemx @code{shepherd-requirement} (default: @code{'(user-processes networking)})
This option can be used to provide a list of Shepherd service names
(symbols) provided by this service.  You might want to change the default
value if you intend to run several @command{dnsmasq} instances.

Likewise, @code{shepherd-requirement} is a list of Shepherd service names
(symbols) that this service will depend on.

@item @code{pid-file} (default: @code{"/run/dnsmasq.pid"})
Specify an alternate path for dnsmasq to record its process-id in.

@item @code{no-hosts?} (Vorgabe: @code{#f})
Ist es auf wahr gesetzt, werden keine Rechnernamen („Hostnames“) aus
/etc/hosts ausgelesen.

@item @code{port} (Vorgabe: @code{53})
Der Port, auf dem gelauscht werden soll. Wird dies auf null gesetzt, werden
keinerlei DNS-Anfragen beantwortet und es bleiben nur DHCP- und/oder
TFTP-Funktionen.

@item @code{local-service?} (Vorgabe: @code{#t})
DNS-Anfragen nur von Rechnern akzeptieren, deren Adresse auf einem lokalen
Subnetz liegt, d.h.@: einem Subnetz, für dem auf dem Server eine
Schnittstelle existiert.

@item @code{listen-addresses} (Vorgabe: @code{'()})
Lässt auf den angegebenen IP-Adressen lauschen.

@item @code{resolv-file} (Vorgabe: @code{"/etc/resolv.conf"})
Aus welcher Datei die IP-Adresse der zu verwendenden Nameserver gelesen
werden soll.

@item @code{no-resolv?} (Vorgabe: @code{#f})
Wenn es auf wahr steht, wird das @var{resolv-file} nicht gelesen.

@item @code{forward-private-reverse-lookup?} (Vorgabe: @code{#t})
Wenn dies auf falsch gesetzt ist, werden inverse Namensauflösungen in
privaten IP-Adressbereichen wie „Domain existiert nicht“ beantwortet,
anstatt sie an vorgelagerte Server weiterzuleiten.

@item @code{query-servers-in-order?} (Vorgabe: @code{#f})
Wenn dies auf wahr gesetzt ist, wird dnsmasq die Server in genau der
Reihenfolge anfragen, in der sie in @var{servers} aufgeführt sind.

@item @code{servers} (Vorgabe: @code{'()})
Geben Sie die IP-Adresse von anzufragenden Servern direkt an.

@item @code{servers-file} (Vorgabe: @code{#f})
Hier können Sie eine Datei angeben, in der höhere DNS-Server stehen. Diese
Datei wird neu eingelesen, wenn dnsmasq ein SIGHUP bekommt. Es kann entweder
eine Zeichenkette oder ein dateiartiges Objekt angegeben werden.

@item @code{addresses} (Vorgabe: @code{'()})
Geben Sie in jedem Eintrag eine IP-Adresse an, die für jeden Rechner mit
einer der angegebenen Domains zurückgeliefert werden soll. Anfragen nach den
Domains werden niemals weitergegeben, sondern werden immer mit der
festgelegten IP-Adresse beantwortet.

Dies ist nützlich, um für Rechnernamen lokale Umleitungen einzurichten, wie
in diesem Beispiel:

@lisp
(service dnsmasq-service-type
         (dnsmasq-configuration
           (addresses
             '(; Weiterleitung auf lokalen Webserver.
               "/example.org/127.0.0.1"
               ; Weiterleitung einer Subdomain auf eine bestimmte IP.
               "/subdomain.example.org/192.168.1.42"))))
@end lisp

Beachten Sie, dass die Regeln in @file{/etc/hosts} Vorrang haben.

@item @code{cache-size} (Vorgabe: @code{150})
Bestimmt die Größe des Zwischenspeichers von dnsmasq. Wird die
Zwischenspeichergröße auf null festgelegt, wird kein Zwischenspeicher
benutzt.

@item @code{negative-cache?} (Vorgabe: @code{#t})
Ist dies auf falsch gesetzt, werden Negativergebnisse nicht
zwischengespeichert.

@item @code{cpe-id} (Vorgabe: @code{#f})
Wenn es festgelegt ist, wird dies als Endgerätebezeichnung
(„Customer-Premises Equipment Identifier“) in DNS-Anfragen übermittelt, die
an vorgelagerte Server weitergeleitet werden.

@item @code{tftp-enable?} (Vorgabe: @code{#f})
Ob der eingebaute TFTP-Server aktiviert werden soll.

@item @code{tftp-no-fail?} (Vorgabe: @code{#f})
Wenn dies wahr ist und der TFTP-Server nicht gestartet werden kann, gilt
dnsmasq trotzdem @emph{nicht} als fehlgeschlagen.

@item @code{tftp-single-port?} (Vorgabe: @code{#f})
Ob nur ein einzelner Port für TFTP benutzt werden soll.

@item @code{tftp-secure?} (Vorgabe: @code{#f})
Wenn dies wahr ist, kann nur auf solche Dateien zugegriffen werden, die dem
Benutzerkonto gehören, das den dnsmasq-Prozess ausführt.

Wird dnsmasq durch den Administratornutzer root ausgeführt, gelten andere
Regeln: @code{tftp-secure?} wirkt sich nicht aus, aber es kann nur auf
Dateien zugegriffen werden, auf die jeder Benutzer zugreifen darf (das
„world-readable bit“ ist gesetzt).

@item @code{tftp-max} (Vorgabe: @code{#f})
Wenn dies gesetzt ist, gibt es die Maximalzahl gleichzeitig zugelassener
Verbindungen an.

@item @code{tftp-mtu} (Vorgabe: @code{#f})
Wenn es gesetzt ist, gibt es die MTU für TFTP-Pakete an, also die
Maximalgröße für Netzwerkschnittstellen.

@item @code{tftp-no-blocksize?} (Vorgabe: @code{#f})
Steht es auf wahr, wird der TFTP-Server die Blockgröße @emph{nicht} mit dem
Client aushandeln.

@item @code{tftp-lowercase?} (Vorgabe: @code{#f})
Ob alle Dateinamen in TFTP-Anfragen in Kleinbuchstaben umgesetzt werden
sollen.

@item @code{tftp-port-range} (Vorgabe: @code{#f})
Wenn es gesetzt ist, wird jeder dynamische Port (einer pro Client) aus dem
angegebenen Bereich (@code{"<von>,<bis>"}) genommen.

@item @code{tftp-root} (Vorgabe: @code{/var/empty,lo})
Relativ zu welchem Verzeichnis die Dateien für die Übertragung per TFTP
gesucht werden. Wenn dies gesetzt ist, werden TFTP-Pfade, die @samp{..}
enthalten, abgelehnt, damit Clients keinen Zugriff auf Dateien außerhalb des
angegebenen Wurzelverzeichnisses haben. Absolute Pfade (solche, die mit
@samp{/} beginnen) sind erlaubt, aber sie müssen in der TFTP-Root
liegen. Wenn das optionale Argument @code{interface} angegeben wird, wird
das Verzeichnis nur für TFTP-Anfragen über diese Schnittstelle benutzt.

@item @code{tftp-unique-root} (Vorgabe: @code{#f})
Wenn es gesetzt ist, wird entsprechend die IP- oder Hardware-Adresse des
TFTP-Clients als eine Pfadkomponente ans Ende der TFTP-Root angehängt. Das
ist nur gültig, wenn eine TFTP-Root gesetzt ist und das Verzeichnis
existiert. Die Voreinstellung ist, die IP-Adresse anzuhängen (wie üblich als
punktgetrenntes Quadrupel).

Ist zum Beispiel @code{tftp-root} @samp{/tftp} und fragt Client
@samp{1.2.3.4} die Datei @file{meinedatei} an, dann wird effektiv als Pfad
@file{/tftp/1.2.3.4/meinedatei} abgerufen, wenn @file{/tftp/1.2.3.4}
existiert, oder @file{/tftp/meinedatei} andernfalls. Wird @samp{=mac}
angegeben, wird stattdessen die MAC-Adresse angehängt (in Kleinbuchstaben
und durch Striche getrennt, aufgefüllt mit der Ziffer null), z.B.@:
@samp{01-02-03-04-aa-bb}. Beachten Sie, dass MAC-Adressen nur aufgelöst
werden können, wenn sich der Client im lokalen Netzwerk befindet oder von
dnsmasq eine Adresse per DHCP zugewiesen bekommen hat.

@item @code{conf-file} (default: @code{'()})
File names of configuration files to use.  Strings and file-like objects are
accepted.

@item @code{conf-dir} (default: @code{#f})
Read all the files in the given directory as configuration files.  Support
for @command{dnsmasq} field extensions is not implemented; users can use
@code{computed-file} to build a directory of files instead.  The
configuration files are loaded in alphabetical order of file name.

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

@end table
@end deftp

@subsubheading Unbound Service

@defvar unbound-service-type
This is the type of the service to run @uref{https://www.unbound.net,
Unbound}, a validating, recursive, and caching DNS resolver.  Its value must
be a @code{unbound-configuration} object as in this example:

@lisp
(service unbound-service-type
         (unbound-configuration
          (forward-zone
           (list
            (unbound-zone
             (name ".")
             (forward-addr '("149.112.112.112#dns.quad9.net"
                             "2620:fe::9#dns.quad9.net"))
             (forward-tls-upstream #t))))))
@end lisp
@end defvar

@deftp {Data Type} unbound-configuration
Available @code{unbound-configuration} fields are:

@table @asis
@item @code{server} (type: unbound-server)
General options for the Unbound server.

@item @code{remote-control} (type: unbound-remote)
Remote control options for the daemon.

@item @code{forward-zone} (default: @code{()}) (type: list-of-unbound-zone)
A zone for which queries should be forwarded to another resolver.

@item @code{extra-content} (type: maybe-string)
Raw content to add to the configuration file.

@end table
@end deftp

@deftp {Data Type} unbound-server
Available @code{unbound-server} fields are:

@table @asis
@item @code{interface} (type: maybe-list-of-strings)
Interfaces listened on for queries from clients.

@item @code{hide-version} (type: maybe-boolean)
Refuse the version.server and version.bind queries.

@item @code{hide-identity} (type: maybe-boolean)
Refuse the id.server and hostname.bind queries.

@item @code{tls-cert-bundle} (type: maybe-string)
Certificate bundle file, used for DNS over TLS.

@item @code{extra-options} (default: @code{()}) (type: alist)
An association list of options to append.

@end table
@end deftp

@deftp {Data Type} unbound-remote
Available @code{unbound-remote} fields are:

@table @asis
@item @code{control-enable} (type: maybe-boolean)
Enable remote control.

@item @code{control-interface} (type: maybe-string)
IP address or local socket path to listen on for remote control.

@item @code{extra-options} (default: @code{()}) (type: alist)
An association list of options to append.

@end table
@end deftp

@deftp {Data Type} unbound-zone
Available @code{unbound-zone} fields are:

@table @asis
@item @code{name} (Typ: Zeichenkette)
Zone name.

@item @code{forward-addr} (type: maybe-list-of-strings)
IP address of server to forward to.

@item @code{forward-tls-upstream} (type: maybe-boolean)
Whether the queries to this forwarder use TLS for transport.

@item @code{extra-options} (default: @code{()}) (type: alist)
An association list of options to append.

@end table
@end deftp

@node VNC-Dienste
@subsection VNC-Dienste
@cindex VNC (Virtual Network Computing)
@cindex XDMCP (X Display Manager Control Protocol)

Im Modul @code{(gnu services vnc)} werden Dienste angeboten, die mit
@dfn{Virtual Network Computing} (VNC) zu tun haben, einer Technik, um
grafische Xorg-Anwendungen, die auf einer entfernten Maschine laufen, lokal
zu benutzen. Zusammen mit einer grafischen Anzeigenverwaltung, die das
@dfn{X Display Manager Control Protocol} unterstützt, wie etwa GDM (siehe
@ref{gdm}) oder LightDM (siehe @ref{lightdm}), kann man somit eine ganze
entfernte Desktop-Arbeitsumgebung auf den eigenen Rechner bringen, um eine
Mehrbenutzerumgebung herzustellen.

@subsubheading Xvnc

Xvnc ist ein VNC-Server, der einen eigenen X-Fensterserver startet. So lässt
er sich auf Servern ohne Bildschirm („headless server“) betreiben. Die
Xvnc-Implementierungen, die durch den @code{tigervnc-server} und
@code{turbovnc} bereitgestellt werden, sind auf Schnelligkeit und Effizienz
ausgerichtet.

@defvar xvnc-service-type

Ein Dienst des Diensttyps @code{xvnc-service-type} kann eingerichtet werden
mit einem @code{xvnc-configuration}-Verbundsobjekt, wie es nun beschrieben
wird. Über die folgende Konfiguration würde eine zweite, virtuelle Anzeige
auf einer entfernten Maschine verfügbar gemacht:
@end defvar

@lisp
(service xvnc-service-type
         (xvnc-configuration (display-number 10)))
@end lisp

Zu Demonstrationszwecken könnte man dann den Befehl @command{xclock} auf der
entfernten Maschine auf Anzeige Nummer 10 starten und ihn über den Befehl
@command{vncviewer} lokal anzeigen:
@example
# xclock auf der entfernten Maschine starten.
ssh -L5910:localhost:5910 @var{ihr-rechner} -- guix shell xclock \
    -- env DISPLAY=:10 xclock
# Über VNC darauf zugreifen.
guix shell tigervnc-client -- vncviewer localhost:5910
@end example

Die folgende Konfiguration setzt XDMCP und Inetd gemeinsam ein, damit
mehrere Benutzer gleichzeitig das entfernte System nutzen können und sich
grafisch über die GDM-Anzeigenverwaltung anmelden können:

@lisp
(operating-system
  […]
  (services (cons*
             […]
             (service xvnc-service-type (xvnc-configuration
                                         (display-number 5)
                                         (localhost? #f)
                                         (xdmcp? #t)
                                         (inetd? #t)))
             (modify-services %desktop-services
               (gdm-service-type config => (gdm-configuration
                                            (inherit config)
                                            (auto-suspend? #f)
                                            (xdmcp? #t)))))))
@end lisp

Eine entfernte Nutzerin könnte sich damit verbinden, indem sie den Befehl
@command{vncviewer} oder einen kompatiblen VNC-Client einsetzt und eine
Sitzung auf einer Arbeitsumgebung ihrer Wahl beginnt:
@example
vncviewer name-des-entfernten-rechners:5905
@end example

@quotation Warnung
Sofern sich Ihre Maschine @emph{nicht} in einer kontrollierten Umgebung
befindet, ist es aus Sicherheitsgründen ratsam, in der Konfiguration das
Feld @code{localhost?} des @code{xvnc-configuration}-Verbundsobjekts beim
vorgegebenen Wert @code{#t} zu belassen und den entfernten Rechner nur über
sichere Mittel wie eine SSH-Portweiterleitung zugänglich zu machen. Der
XDMCP-Port, UDP 177, sollte nach außen hin über eine Firewall gesperrt sein,
denn VNC ist @emph{kein} sicheres Protokoll und Anmeldedaten könnten im
Klartext verschickt werden.
@end quotation

@c Use (configuration->documentation 'xvnc-configuration) to regenerate
@c the documentation.
@c %start of fragment
@deftp {Datentyp} xvnc-configuration
Verfügbare @code{xvnc-configuration}-Felder sind:

@table @asis
@item @code{xvnc} (Vorgabe: @code{tigervnc-server}) (Typ: dateiartig)
Das Paket, das die Binärdatei Xvnc zur Verfügung stellt.

@item @code{display-number} (Vorgabe: @code{0}) (Typ: Zahl)
Die Nummer der Anzeige, um die sich Xvnc kümmert. Sie sollten eine Zahl
wählen, die der Xorg-Server @emph{nicht} bereits in Beschlag nimmt.

@item @code{geometry} (Vorgabe: @code{"1024x768"}) (Typ: Zeichenkette)
Die Ausmaße der Anzeige, die angelegt wird.

@item @code{depth} (Vorgabe: @code{24}) (Typ: Farbtiefe)
Die Pixeltiefe in Bits der anzulegenden Anzeige. Akzeptiert werden die Werte
16, 24 oder 32.

@item @code{port} (Typ: Vielleicht-Port)
Auf welchem Port auf Verbindungen durch VNC-Betrachter gelauscht wird. Wenn
keiner angegeben wird, ist 5900 plus der Anzeigennummer vorgegeben.

@item @code{ipv4?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Für eingehende und ausgehende Verbindungen IPv4 benutzen.

@item @code{ipv6?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Für eingehende und ausgehende Verbindungen IPv6 benutzen.

@item @code{password-file} (Typ: Vielleicht-Zeichenkette)
Welche Passwortdatei benutzt werden soll, wenn gewünscht. Schauen Sie sich
vncpasswd(1) an, um zu erfahren, wie Sie so eine Datei erzeugen lassen.

@item @code{xdmcp?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Stellt an den XDMCP-Server eine Sitzungsanfrage. Dadurch können sich
Benutzer an der Oberfläche der Anmeldeverwaltung für eine Desktop-Sitzung
anmelden. In einem Szenario mit mehreren Nutzern wird man außerdem die
Option @code{inetd?} aktivieren wollen, damit jede Verbindung zum VNC-Server
getrennt behandelt wird, statt sie zusammenzulegen.

@item @code{inetd?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Einen Dienst im Inetd-Stil benutzen. Dadurch wird der Xvnc-Server bei Bedarf
gestartet.

@item @code{frame-rate} (Vorgabe: @code{60}) (Typ: Zahl)
Wie viele Aktualisierungen höchstens pro Sekunde an jeden Client geschickt
werden.

@item @code{security-types} (Vorgabe: @code{'("None")}) (Typ: Sicherheitstypen)
Welche Sicherheitsschemata für eingehende Verbindungen zugelassen
sind. Vorgegeben ist "None" (keine), was sicher ist, weil Xvnc so
eingestellt ist, dass sich der Benutzer mit der Anzeigenverwaltung anmeldet
und nur lokale Verbindungen stattfinden. Als Wert akzeptiert wird eine
Teilmenge hiervon: ("None" "VncAuth" "Plain" "TLSNone" "TLSVnc" "TLSPlain"
"X509None" "X509Vnc")

@item @code{localhost?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Nur Verbindungen von derselben Maschine zulassen. Nach Vorgabe ist dies auf
wahr gesetzt (@code{#true}), weil das sicherer ist, denn man sollte ohnehin
nur Ports für sichere Verbindungsmethoden wie SSH freigeben.

@item @code{log-level} (Vorgabe: @code{30}) (Typ: Protokollstufe)
Die Protokollstufe als Zahl zwischen 0 und 100. Dabei bedeutet 100 die
ausführlichste Ausgabe. Protokollnachrichten werden an Syslog ausgegeben.

@item @code{extra-options} (Vorgabe: @code{'()}) (Typ: Zeichenketten)
Hiermit können zusätzliche Xvnc-Optionen angegeben werden, die über das
@code{<xvnc-configuration>}-Verbundsobjekt anderweitig unzugänglich sind.

@end table

@end deftp
@c %end of fragment

@node VPN-Dienste
@subsection VPN-Dienste
@cindex VPN (Virtual Private Network)
@cindex Virtual Private Network (VPN)

Das Modul @code{(gnu services vpn)} stellt Dienste zur Verfügung, die mit
@dfn{Virtual Private Networks} (VPNs) zu tun haben.

@subsubheading Bitmask

@defvar bitmask-service-type
Ein Diensttyp für den VPN-Client @uref{https://bitmask.net, Bitmask}. Damit
wird der Client systemweit verfügbar gemacht und dessen Polkit-Richtlinie
geladen. Beachten Sie, dass der Client nur mit einem laufenden polkit-agent
funktioniert, der entweder von Ihrer „Desktop“-Arbeitsumgebung oder von
Ihnen manuell gestartet wird.
@end defvar

@subsubheading OpenVPN

Hiermit wird ein @emph{Client}-Dienst angeboten, mit dem sich Ihre Maschine
mit einem VPN verbinden kann, sowie ein @emph{Server}-Dienst, mit dem Sie
auf Ihrer Maschine ein VPN betreiben
können. @code{openvpn-client-service-type} und
@code{openvpn-server-service-type} können beide gleichzeitig zum Einsatz
kommen.

@defvar openvpn-client-service-type
Diensttyp für einen Dienst, der den VPN-Daemon @command{openvpn} als Client
ausführt.

Der Wert dieses Dienstes muss ein
@code{<openvpn-client-configuration>}-Objekt sein.
@end defvar

@defvar openvpn-server-service-type
Diensttyp für einen Dienst, der den VPN-Daemon @command{openvpn} als Server
ausführt.

Der Wert dieses Dienstes muss ein
@code{<openvpn-server-configuration>}-Objekt sein.
@end defvar

@c %automatically generated documentation

@deftp {Datentyp} openvpn-client-configuration
Verfügbare @code{openvpn-client-configuration}-Felder sind:

@table @asis
@item @code{openvpn} (Vorgabe: @code{openvpn}) (Typ: dateiartig)
Das OpenVPN-Paket.

@item @code{pid-file} (Vorgabe: @code{"/var/run/openvpn/openvpn.pid"}) (Typ: Zeichenkette)
Die Datei für den Prozessidentifikator („PID“) von OpenVPN.

@item @code{proto} (Vorgabe: @code{udp}) (Typ: Protokoll)
Das Protokoll (UDP oder TCP), das benutzt werden soll, um einen
Kommunikationskanal zwischen Clients und Servern herzustellen.

@item @code{dev} (Vorgabe: @code{tun}) (Typ: Gerätetyp)
Der Gerätetyp, mit dem die VPN-Verbindung repräsentiert werden soll.

@item @code{ca} (Vorgabe: @code{"/etc/openvpn/ca.crt"}) (Typ: Vielleicht-Zeichenkette)
Die Zertifikatsautorität, mit der Verbindungen geprüft werden.

@item @code{cert} (Vorgabe: @code{"/etc/openvpn/client.crt"}) (Typ: Vielleicht-Zeichenkette)
Das Zertifikat der Maschine, auf der der Daemon läuft. Es sollte von der in
@code{ca} angegebenen Zertifikatsautorität signiert sein.

@item @code{key} (Vorgabe: @code{"/etc/openvpn/client.key"}) (Typ: Vielleicht-Zeichenkette)
Der Schlüssel der Maschine, auf der der Daemon läuft. Er muss der Schlüssel
zum in @code{cert} angegebenen Zertifikat sein.

@item @code{comp-lzo?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Ob der Kompressionsalgorithmus lzo benutzt werden soll.

@item @code{persist-key?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Die Schlüsseldateien nach Auftreten von SIGUSR1 oder --ping-restart
@emph{nicht} erneut einlesen.

@item @code{persist-tun?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Nach dem Auftreten von SIGUSR1 oder --ping-restart TUN/TAP-Geräte
@emph{nicht} schließen und wieder öffnen und auch keine Start-/Stop-Skripte
ausführen.

@item @code{fast-io?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
(Experimentell) Schreibzugriffe durch Datenverkehr bei TUN/TAP/UDP
optimieren, indem ein Aufruf von poll/epoll/select vor der Schreiboperation
eingespart wird.

@item @code{verbosity} (Vorgabe: @code{3}) (Typ: Zahl)
Ausführlichkeitsstufe.

@item @code{tls-auth} (Vorgabe: @code{#f}) (Typ: TLS-Clientauthentifizierung)
Eine weitere HMAC-Authentifizierung zusätzlich zum TLS-Steuerungskanal
einsetzen, um das System vor gezielten Überlastungsangriffen („Denial of
Service“) zu schützen.

@item @code{auth-user-pass} (Typ: Vielleicht-Zeichenkette)
Beim Server eine Authentisierung über Benutzername/Passwort durchführen. Die
Option nimmt eine Datei, welche Benutzername und Passwort auf zwei Zeilen
enthält. Benutzen Sie dafür @emph{kein} dateiartiges Objekt, weil es in den
Store eingelagert würde, wo es jeder Benutzer einsehen könnte.

@item @code{verify-key-usage?} (Vorgabe: @code{#t}) (Typ: Schlüsselnutzung)
Ob sichergestellt werden soll, dass das Server-Zertifikat auch über eine
Erweiterung („Extension“) verfügt, dass es für die Nutzung als Server gültig
ist.

@item @code{bind?} (Vorgabe: @code{#f}) (Typ: Binden)
Ob an immer dieselbe, feste lokale Portnummer gebunden wird.

@item @code{resolv-retry?} (Vorgabe: @code{#t}) (Typ: resolv-retry)
Ob, wenn die Server-Adresse nicht aufgelöst werden konnte, die Auflösung
erneut versucht wird.

@item @code{remote} (Vorgabe: @code{'()}) (Typ: Liste-von-„openvpn-remote“)
Eine Liste entfernter Server, mit denen eine Verbindung hergestellt werden
soll.

@deftp {Datentyp} openvpn-remote-configuration
Verfügbare @code{openvpn-remote-configuration}-Felder sind:

@table @asis
@item @code{name} (Vorgabe: @code{"my-server"}) (Typ: Zeichenkette)
Der Servername.

@item @code{port} (Vorgabe: @code{1194}) (Typ: Zahl)
Die Portnummer, auf der der Server lauscht.

@end table

@end deftp

@end table

@end deftp

@c %end of automatic openvpn-client documentation

@c %automatically generated documentation

@deftp {Datentyp} openvpn-server-configuration
Verfügbare @code{openvpn-server-configuration}-Felder sind:

@table @asis
@item @code{openvpn} (Vorgabe: @code{openvpn}) (Typ: dateiartig)
Das OpenVPN-Paket.

@item @code{pid-file} (Vorgabe: @code{"/var/run/openvpn/openvpn.pid"}) (Typ: Zeichenkette)
Die Datei für den Prozessidentifikator („PID“) von OpenVPN.

@item @code{proto} (Vorgabe: @code{udp}) (Typ: Protokoll)
Das Protokoll (UDP oder TCP), das benutzt werden soll, um einen
Kommunikationskanal zwischen Clients und Servern herzustellen.

@item @code{dev} (Vorgabe: @code{tun}) (Typ: Gerätetyp)
Der Gerätetyp, mit dem die VPN-Verbindung repräsentiert werden soll.

@item @code{ca} (Vorgabe: @code{"/etc/openvpn/ca.crt"}) (Typ: Vielleicht-Zeichenkette)
Die Zertifikatsautorität, mit der Verbindungen geprüft werden.

@item @code{cert} (Vorgabe: @code{"/etc/openvpn/client.crt"}) (Typ: Vielleicht-Zeichenkette)
Das Zertifikat der Maschine, auf der der Daemon läuft. Es sollte von der in
@code{ca} angegebenen Zertifikatsautorität signiert sein.

@item @code{key} (Vorgabe: @code{"/etc/openvpn/client.key"}) (Typ: Vielleicht-Zeichenkette)
Der Schlüssel der Maschine, auf der der Daemon läuft. Er muss der Schlüssel
zum in @code{cert} angegebenen Zertifikat sein.

@item @code{comp-lzo?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Ob der Kompressionsalgorithmus lzo benutzt werden soll.

@item @code{persist-key?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Die Schlüsseldateien nach Auftreten von SIGUSR1 oder --ping-restart
@emph{nicht} erneut einlesen.

@item @code{persist-tun?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Nach dem Auftreten von SIGUSR1 oder --ping-restart TUN/TAP-Geräte
@emph{nicht} schließen und wieder öffnen und auch keine Start-/Stop-Skripte
ausführen.

@item @code{fast-io?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
(Experimentell) Schreibzugriffe durch Datenverkehr bei TUN/TAP/UDP
optimieren, indem ein Aufruf von poll/epoll/select vor der Schreiboperation
eingespart wird.

@item @code{verbosity} (Vorgabe: @code{3}) (Typ: Zahl)
Ausführlichkeitsstufe.

@item @code{tls-auth} (Vorgabe: @code{#f}) (Typ: TLS-Serverauthentifizierung)
Eine weitere HMAC-Authentifizierung zusätzlich zum TLS-Steuerungskanal
einsetzen, um das System vor gezielten Überlastungsangriffen („Denial of
Service“) zu schützen.

@item @code{port} (Vorgabe: @code{1194}) (Typ: Zahl)
Gibt die Portnummer an, auf der der Server lauscht.

@item @code{server} (Vorgabe: @code{"10.8.0.0 255.255.255.0"}) (Typ: IP-Maske)
Eine IP-Adresse gefolgt von deren Maske, die das Subnetz im virtuellen
Netzwerk angibt.

@item @code{server-ipv6} (Vorgabe: @code{#f}) (Typ: CIDR6)
Eine CIDR-Notation, mit der das IPv6-Subnetz im virtuellen Netzwerk
angegeben wird.

@item @code{dh} (Vorgabe: @code{"/etc/openvpn/dh2048.pem"}) (Typ: Zeichenkette)
Die Datei mit den Diffie-Hellman-Parametern.

@item @code{ifconfig-pool-persist} (Vorgabe: @code{"/etc/openvpn/ipp.txt"}) (Typ: Zeichenkette)
Die Datei, in der Client-IPs eingetragen werden.

@item @code{redirect-gateway?} (Vorgabe: @code{#f}) (Typ: Zugang)
Wenn dies auf wahr steht, fungiert der Server als Zugang („Gateway“) für
seine Clients.

@item @code{client-to-client?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Wenn dies auf wahr steht, ist es zugelassen, dass Clients untereinander
innerhalb des VPNs kommunizieren.

@item @code{keepalive} (Vorgabe: @code{(10 120)}) (Typ: keepalive)
Lässt ping-artige Nachrichtigen in beide Richtungen über die Leitung
übertragen, damit beide Seiten bemerken, wenn der Kommunikationspartner
offline geht. Für @code{keepalive} muss ein Paar angegeben werden. Das erste
Element ist die Periode, nach der das Pingsignal wieder gesendet werden
soll, und das zweite ist eine Zeitbegrenzung, in der eines ankommen muss,
damit die andere Seite nicht als offline gilt.

@item @code{max-clients} (Vorgabe: @code{100}) (Typ: Zahl)
Wie viele Clients es höchstens geben kann.

@item @code{status} (Vorgabe: @code{"/var/run/openvpn/status"}) (Typ: Zeichenkette)
Die Datei für einen Zustandsbericht („Status File“). Diese Datei enthält
einen kurzen Bericht über die momentane Verbindung. Sie wird jede Minute
gekürzt und neu geschrieben.

@item @code{client-config-dir} (Vorgabe: @code{'()}) (Typ: Liste-von-„openvpn-ccd“)
Die Liste der Konfigurationen für einige Clients.

@end table

@end deftp

@c %end of automatic openvpn-server documentation

@subheading strongSwan

Derzeit unterstützt der strongSwan-Dienst nur die alte Art der Konfiguration
über die Dateien @file{ipsec.conf} und @file{ipsec.secrets}.

@defvar strongswan-service-type
Ein Diensttyp, um mit strongSwan @acronym{VPN, Virtual Private Networking}
über IPsec einzurichten. Als Wert muss ein
@code{strongswan-configuration}-Verbundsobjekt angegeben werden, wie im
folgenden Beispiel:

@lisp
(service strongswan-service-type
         (strongswan-configuration
          (ipsec-conf "/etc/ipsec.conf")
          (ipsec-secrets "/etc/ipsec.secrets")))
@end lisp

@end defvar

@deftp {Datentyp} strongswan-configuration
Der Datentyp, der die Konfiguration des strongSwan-Dienstes repräsentiert.

@table @asis
@item @code{strongswan}
Das strongSwan-Paket, was für diesen Dienst benutzt werden soll.

@item @code{ipsec-conf} (Vorgabe: @code{#f})
Der Dateiname Ihrer @file{ipsec.conf}. Wenn es wahr ist, muss hierfür und
für @code{ipsec-secrets} jeweils eine Zeichenkette angegeben werden.

@item @code{ipsec-secrets} (Vorgabe: @code{#f})
Der Dateiname Ihrer @file{ipsec.secrets}. Wenn es wahr ist, muss hierfür und
für @code{ipsec-conf} jeweils eine Zeichenkette angegeben werden.

@end table
@end deftp

@subsubheading Wireguard

@defvar wireguard-service-type
Ein Diensttyp für eine Schnittstelle über einen Wireguard-Tunnel. Sein Wert
muss ein @code{wireguard-configuration}-Verbundsobjekt wie in diesem
Beispiel sein:

@lisp
(service wireguard-service-type
         (wireguard-configuration
          (peers
           (list
            (wireguard-peer
             (name "my-peer")
             (endpoint "my.wireguard.com:51820")
             (public-key "hzpKg9X1yqu1axN6iJp0mWf6BZGo8m1wteKwtTmDGF4=")
             (allowed-ips '("10.0.0.2/32")))))))
@end lisp

@end defvar

@deftp {Datentyp} wireguard-configuration
Der Datentyp, der die Konfiguration des Wireguard-Dienstes repräsentiert.

@table @asis
@item @code{wireguard}
Das Wireguard-Paket, was für diesen Dienst benutzt werden soll.

@item @code{interface} (Vorgabe: @code{"wg0"})
Der Name der VPN-Schnittstelle.

@item @code{addresses} (Vorgabe: @code{'("10.0.0.1/32")})
Eine Liste von Zeichenketten oder G-Ausdrücken, die bezeichnen, welche
IP-Adressen obiger Schnittstelle zugeordnet werden.

@item @code{port} (Vorgabe: @code{51820})
Auf welchem Port auf eingehende Verbindungen gelauscht werden soll.

@item @code{dns} (Vorgabe: @code{'())})
Eine Liste von Zeichenketten oder G-Ausdrücken, die bezeichnen, welche
DNS-Server den VPN-Clients per DHCP mitgeteilt werden.

@item @code{monitor-ips?} (Vorgabe: @code{#f})
@cindex Dynamische IP, bei Wireguard
@cindex dyndns, Nutzung mit Wireguard
Ob überwacht werden soll, wenn sich die Internet-Adressen (IPs) ändern, zu
denen die für Netzwerkteilnehmer angegebenen Endpunkte aufgelöst
werden. Dann wird der Endpunkt jedes Netzwerkteilnehmers, dessen IP-Adresse
nicht mehr mit dem neu aufgelösten Rechnernamen des Netzwerkteilnehmers
übereinstimmt, zurückgesetzt. Setzen Sie dies auf @code{#t}, wenn einer oder
mehrere Endpunkte ihre Rechnernamen über einen Anbieter für dynamisches DNS
beziehen, damit die Sitzungen bestehen bleiben.

@item @code{monitor-ips-interval} (default: @code{"*/5 * * * *"})
This is the monitoring schedule, expressed as a string in traditional cron
syntax or as a gexp evaluating to a Shepherd calendar event
(@pxref{Timers,,, shepherd, The GNU Shepherd Manual}).

@item @code{private-key} (Vorgabe: @code{"/etc/wireguard/private.key"})
Die Datei mit dem privaten Schlüssel für die Schnittstelle. Wenn die
angegebene Datei nicht existiert, wird sie automatisch erzeugt. Wenn das
Feld @code{#f} ist, wird kein privater Schlüssel erzeugt und das Feld nicht
in die Konfigurationsdatei serialisiert.

@item @code{bootstrap-private-key?} (Vorgabe: @code{#t})
Ob der private Schlüssel automatisch erzeugt werden soll, wenn er nicht
existiert.

Sie können dies auf @code{#f} setzen, wenn Sie den privaten Schlüssel mit
Hilfe von Kommandoersetzung festlegen möchten. Ein Beispiel aus dem Handbuch
zu @code{wg-quick(8)} zeigt, wie man den privaten Schlüssel aus einem
@code{password-store}-Passwortspeicher holt. Dazu kann folgender Code
dienen:

@lisp
(wireguard-configuration
 (private-key
  #~(string-append "<("
                   #$(file-append password-store "/bin/pass")
                   ;; Wireguard ersetzt %i durch den Schnittstellennamen.
                   " WireGuard/private-keys/%i)")))
@end lisp


@item @code{peers} (Vorgabe: @code{'()})
Die zugelassenen Netzwerkteilnehmer auf dieser Schnittstelle. Dies ist eine
Liste von @var{wireguard-peer}-Verbundsobjekten.

@item @code{pre-up} (Vorgabe: @code{'()})
Eine Liste von Zeichenketten oder G-Ausdrücken. Diese Skriptschnipsel sollen
vor dem Einrichten der Schnittstelle ausgeführt werden.

@item @code{post-up} (Vorgabe: @code{'()})
Eine Liste von Zeichenketten oder G-Ausdrücken. Diese Skriptschnipsel sollen
nach dem Einrichten der Schnittstelle ausgeführt werden.

@item @code{pre-down} (Vorgabe: @code{'()})
Eine Liste von Zeichenketten oder G-Ausdrücken. Diese Skriptschnipsel sollen
vor dem Abwickeln der Schnittstelle ausgeführt werden.

@item @code{post-down} (Vorgabe: @code{'()})
Eine Liste von Zeichenketten oder G-Ausdrücken. Diese Skriptschnipsel sollen
nach dem Abwickeln der Schnittstelle ausgeführt werden.

@item @code{shepherd-requirement} (Vorgabe: @code{'()}) (Typ: Liste-von-Symbolen)
Eine Liste von Symbolen, die Shepherd-Dienste angeben, von welchen dieser
Dienst abhängen soll.

@item @code{table} (Vorgabe: @code{"auto"})
Zu welcher Routing-Tabelle neue Routen hinzugefügt werden, angegeben als
Zeichenkette. Es gibt zwei besondere Werte: Mit @code{"off"} schalten Sie
die Erzeugung neuer Routen ganz ab, mit @code{"auto"} (was vorgegeben ist)
werden Routen zur Standard-Routingtabelle hinzugefügt und Standardrouten
besonders behandelt.

@item @code{auto-start?} (default: @code{#t"})
Whether the Wireguard network should be started automatically by the
Shepherd.  If it is @code{#f} the service has to be started manually with
@code{herd start wireguard-$interface} (for example: @code{herd start
wireguard-wg0}).

@end table
@end deftp

@deftp {Datentyp} wireguard-peer
Der Datentyp, der einen an die angegebene Schnittstelle angeschlossenen
Netzwerkteilnehmer („Peer“) repräsentiert.

@table @asis
@item @code{name}
Die Bezeichnung für den Netzwerkteilnehmer.

@item @code{endpoint} (Vorgabe: @code{#f})
Optional der Endpunkt des Netzwerkteilnehmers, etwa
@code{"demo.wireguard.com:51820"}.

@item @code{public-key}
Der öffentliche Schlüssel des Netzwerkteilnehmers, dargestellt als eine
base64-kodierte Zeichenkette.

@item @code{preshared-key} (Vorgabe: @code{#f})
Optional eine Datei mit einem vereinbarten „Pre-shared Key“ für diesen
Netzwerkteilnehmer, die als Zeichenkette oder G-Ausdruck angegeben werden
kann. Die angegebene Datei wird @emph{nicht} automatisch erzeugt.

@item @code{allowed-ips}
Eine Liste der IP-Adressen, von denen für diesen Netzwerkteilnehmer
eingehende Kommunikation zugelassen wird und an die ausgehende Kommunikation
für diesen Netzwerkteilnehmer gerichtet wird.

@item @code{keep-alive} (Vorgabe: @code{#f})
Optional ein Zeitintervall in Sekunden. Einmal pro Zeitintervall wird ein
Paket an den Serverendpunkt geschickt. Das hilft beim Empfangen eingehender
Verbindungen von diesem Netzwerkteilnehmer, wenn Sie nur über eine
Netzwerkadressübersetzung („NAT“) oder hinter einer Firewall erreichbar
sind.

@end table
@end deftp

@node Network File System
@subsection Network File System
@cindex NFS

Das Modul @code{(gnu services nfs)} stellt die folgenden Dienste zur
Verfügung, die meistens dazu benutzt werden, Verzeichnisbäume als
Netzwerkdateisysteme, englisch @dfn{Network File Systems} (NFS), einzubinden
oder an andere zu exportieren.

Obwohl man auch die einzelnen Komponenten eines Network-File-System-Dienstes
separat einrichten kann, raten wir dazu, einen NFS-Server mittels
@code{nfs-service-type} zu konfigurieren.

@subsubheading NFS-Dienst
@cindex NFS, Server

Der NFS-Dienst sorgt dafür, dass alle NFS-Komponentendienste, die
Konfiguration des NFS-Kernels und Dateisysteme eingerichtet werden, und er
installiert an den von NFS erwarteten Orten Konfigurationsdateien.

@defvar nfs-service-type
Ein Diensttyp für einen vollständigen NFS-Server.
@end defvar

@deftp {Datentyp} nfs-configuration
Dieser Datentyp repräsentiert die Konfiguration des NFS-Dienstes und all
seiner Subsysteme.

Er hat folgende Parameter:
@table @asis
@item @code{nfs-utils} (Vorgabe: @code{nfs-utils})
Das nfs-utils-Paket, was benutzt werden soll.

@item @code{nfs-versions} (Vorgabe: @code{'("4.2" "4.1" "4.0")})
Wenn eine Liste von Zeichenketten angegeben wird, beschränkt sich der
@command{rpc.nfsd}-Daemon auf die Unterstützung der angegebenen Versionen
des NFS-Protokolls.

@item @code{exports} (Vorgabe: @code{'()})
Diese Liste von Verzeichnissen soll der NFS-Server exportieren. Jeder
Eintrag ist eine Liste, die zwei Elemente enthält: den Namen eines
Verzeichnisses und eine Zeichenkette mit allen Optionen. Ein Beispiel, wo
das Verzeichnis @file{/export} an alle NFS-Clients nur mit Lesezugriff
freigegeben wird, sieht so aus:

@lisp
(nfs-configuration
 (exports
  '(("/export"
     "*(ro,insecure,no_subtree_check,crossmnt,fsid=0)"))))
@end lisp

@item @code{rpcmountd-port} (Vorgabe: @code{#f})
Welchen Netzwerk-Port der @command{rpc.mountd}-Daemon benutzen soll.

@item @code{rpcstatd-port} (Vorgabe: @code{#f})
Welchen Netzwerk-Port der @command{rpc.statd}-Daemon benutzen soll.

@item @code{rpcbind} (Vorgabe: @code{rpcbind})
Das rpcbind-Paket, das benutzt werden soll.

@item @code{idmap-domain} (Vorgabe: @code{"localdomain"})
Der lokale NFSv4-Domainname.

@item @code{nfsd-port} (Vorgabe: @code{2049})
Welchen Netzwerk-Port der @command{nfsd}-Daemon benutzen soll.

@item @code{nfsd-threads} (Vorgabe: @code{8})
Wie viele Threads der @command{rpc.statd}-Daemon benutzen soll.

@item @code{nfsd-tcp?} (Vorgabe: @code{#t})
Ob der @command{nfsd}-Daemon auf einem TCP-Socket lauschen soll.

@item @code{nfsd-udp?} (Vorgabe: @code{#f})
Ob der @command{nfsd}-Daemon auf einem UDP-Socket lauschen soll.

@item @code{pipefs-directory} (Vorgabe: @code{"/var/lib/nfs/rpc_pipefs"})
Das Verzeichnis, unter dem das Pipefs-Dateisystem eingebunden wurde.

@item @code{debug} (Vorgabe: @code{'()"})
Eine Liste der Subsysteme, für die Informationen zur Fehlersuche
bereitgestellt werden sollen, als Liste von Symbolen. Jedes der folgenden
Symbole ist gültig: @code{nfsd}, @code{nfs}, @code{rpc}, @code{idmap},
@code{statd} oder @code{mountd}.
@end table
@end deftp

Wenn Sie keinen vollständigen NFS-Dienst benötigen oder ihn selbst
einrichten wollen, können Sie stattdessen die im Folgenden dokumentierten
Komponentendienste benutzen.

@subsubheading RPC-Bind-Dienst
@cindex rpcbind

Mit dem RPC-Bind-Dienst können Programmnummern auf universelle Adressen
abgebildet werden. Viele Dienste, die mit dem NFS zu tun haben, benutzen
diese Funktion, daher wird sie automatisch gestartet, sobald ein davon
abhängiger Dienst startet.

@defvar rpcbind-service-type
Ein Diensttyp für den RPC-Portplaner-Daemon („Portmapper“).
@end defvar


@deftp {Datentyp} rpcbind-configuration
Datentyp, der die Konfiguration des RPC-Bind-Dienstes repräsentiert. Dieser
Typ verfügt über die folgenden Parameter:
@table @asis
@item @code{rpcbind} (Vorgabe: @code{rpcbind})
Das rpcbind-Paket, das benutzt werden soll.

@item @code{warm-start?} (Vorgabe: @code{#t})
Wenn dieser Parameter @code{#t} ist, wird der Daemon beim Starten eine
Zustandsdatei („State File“) lesen, aus der er die von der vorherigen
Instanz gespeicherten Zustandsinformationen wiederherstellt.
@end table
@end deftp


@subsubheading Pipefs-Pseudodateisystem
@cindex pipefs
@cindex rpc_pipefs

Mit dem Pipefs-Dateisystem können NFS-bezogene Daten zwischen dem Kernel und
Programmen auf der Anwendungsebene (dem „User Space“) übertragen werden.

@defvar pipefs-service-type
Ein Diensttyp für das Pseudodateisystem „Pipefs“.
@end defvar

@deftp {Datentyp} pipefs-configuration
Datentyp, der die Konfiguration des Pipefs-Pseudodateisystemdienstes
repräsentiert. Dieser Typ verfügt über die folgenden Parameter:
@table @asis
@item @code{mount-point} (Vorgabe: @code{"/var/lib/nfs/rpc_pipefs"})
Das Verzeichnis, unter dem das Dateisystem eingebunden werden soll.
@end table
@end deftp


@subsubheading GSS-Daemon-Dienst
@cindex GSSD
@cindex GSS
@cindex Global Security System

Der Daemon des @dfn{Global Security System} (GSS) ermöglicht starke
Informationssicherheit für RPC-basierte Protokolle. Vor dem Austausch von
Anfragen über entfernte Prozeduraufrufe („Remote Procedure Calls“, kurz RPC)
muss ein RPC-Client einen Sicherheitskontext („Security Context“)
herstellen. Typischerweise wird dazu der @command{kinit}-Befehl von Kerberos
benutzt, oder er wird automatisch bei der Anmeldung über PAM-Dienste
hergestellt (siehe @ref{Kerberos-Dienste}).

@defvar gss-service-type
Ein Diensttyp für den Daemon des Global Security System (GSS).
@end defvar

@deftp {Datentyp} gss-configuration
Datentyp, der die Konfiguration des GSS-Daemon-Dienstes
repräsentiert. Dieser Typ verfügt über die folgenden Parameter:
@table @asis
@item @code{nfs-utils} (Vorgabe: @code{nfs-utils})
Das Paket, in dem der Befehl @command{rpc.gssd} gesucht werden soll.

@item @code{pipefs-directory} (Vorgabe: @code{"/var/lib/nfs/rpc_pipefs"})
Das Verzeichnis, unter dem das Pipefs-Dateisystem eingebunden wurde.

@end table
@end deftp


@subsubheading IDMAP-Daemon-Dienst
@cindex idmapd
@cindex Name-Mapper

Der idmap-Daemon-Dienst ermöglicht eine Abbildung zwischen
Benutzeridentifikatoren und Benutzernamen. Er wird in der Regel dafür
benötigt, auf über NFSv4 eingebundene Dateisysteme zuzugreifen.

@defvar idmap-service-type
Ein Diensttyp für den Identity-Mapper-Daemon (IDMAP).
@end defvar

@deftp {Datentyp} idmap-configuration
Datentyp, der die Konfiguration des IDMAP-Daemon-Dienstes
repräsentiert. Dieser Typ verfügt über die folgenden Parameter:
@table @asis
@item @code{nfs-utils} (Vorgabe: @code{nfs-utils})
Das Paket, in dem der Befehl @command{rpc.idmapd} gesucht werden soll.

@item @code{pipefs-directory} (Vorgabe: @code{"/var/lib/nfs/rpc_pipefs"})
Das Verzeichnis, unter dem das Pipefs-Dateisystem eingebunden wurde.

@item @code{domain} (Vorgabe: @code{#f})
Der lokale NFSv4-Domain-Name. Für ihn muss eine Zeichenkette oder @code{#f}
angegeben werden. Wenn @code{#f} angegeben wird, benutzt der Daemon den
vollständigen Domain-Namen („Fully Qualified Domain Name“) des Rechners.

@item @code{verbosity} (Vorgabe: @code{0})
Die Ausführlichkeitsstufe des Daemons.

@end table
@end deftp



@subsubheading Autofs Service
@cindex autofs
@cindex automount

The autofs service automatically mounts and unmounts filesystems.  It can
mount both network and local storage, but is most often used to manage NFS
mounts.

A typical configuration might look like:

@lisp
(operating-system
  (services
   (append
    (list
     (service nfs-service-type (nfs-configuration))
     (service autofs-service-type
              (autofs-configuration
               (mounts
                (list
                 (autofs-indirect-map
                  (mount-point "/net/home")
                  (entries
                   (list
                    ;; Accessing /net/home/foo will mount
                    ;; big.network.server:/home/foo.
                    (autofs-map-entry
                     (type "nfs")
                     (device "big.network.server:/home/&")
                     (mount-point "*"))))))))))
    %base-services)))
@end lisp

@deftp {Data Type} autofs-indirect-map
Available @code{autofs-indirect-map} fields are:

@table @asis
@item @code{mount-point} (type: string)
Where to mount the indirect map.

@item @code{entries} (default: @code{()}) (type: autofs-map-entries)
Entries in this map.

@end table
@end deftp

@deftp {Data Type} autofs-map-entry
Available @code{autofs-map-entry} fields are:

@table @asis
@item @code{type} (default: @code{"auto"}) (type: string)
The type of the filesystem.

@item @code{device} (type: string)
Device or remote host to mount.  May contain special character @code{&},
which can be referenced in the @var{mount-point} field.

@item @code{mount-point} (type: string)
Directory to mount this device on.  Map entries come in two flavors: direct
and indirect.  Direct entries map a single device to a single mountpoint,
while indirect entries can map multiple devices to multiple mountpoints.  A
direct entry has a @var{mount-point} beginning with @code{/}, representing
the absolute path of the directory to mount the device on.  For example:

@lisp
(autofs-map-entry
 (type "ext4")
 (device "/dev/sdb1")
 (mount-point "/mnt/external-disk"))
@end lisp

An indirect entry has a @var{mount-point} not beginning with @code{/},
representing the subdirectory within the parent indirect map for this
entry.  Indirect maps may also use the special character @code{*}, which
will be replaced with the value of special character @code{&} in the
@var{device} field of this entry.  For example:

@lisp
(autofs-indirect-map
 (mount-point "/devices")
 (entries
  (list
   ;; Automount any block device r/o by ID.
   (autofs-map-entry
    (type "auto")
    (mount-point "ro/uuid/*")
    (device "/dev/disk/by-id/&")
    (options '(ro)))
   ;; Automount any block device by UUID.
   (autofs-map-entry
    (type "auto")
    (mount-point "rw/uuid/*")
    (device "/dev/disk/by-uuid/&")))))
@end lisp

@item @code{options} (default: @code{()}) (type: file-system-options)
List of mount options.  Some options are simple flags, such as ro, noexec,
nosuid, etc.  These may be expressed as strings or symbols.  Other options
also accept a value.  These are expressed as pairs of @code{(option .
value)}.  @code{option} may be a string or symbol, as with flags.
@code{value} may be a string, symbol, or number.  Example: @code{(ro (errors
.  remount-ro) noexec)}

@end table
@end deftp

@deftp {Data Type} autofs-configuration
Available @code{autofs-configuration} fields are:

@table @asis
@item @code{autofs} (default: @code{autofs}) (type: package)
The autofs package to use.

@item @code{mounts} (default: @code{()}) (type: autofs-mount-maps)
Mount maps to manage.  This is a list of either direct map entries or
indirect mount maps.

@item @code{timeout} (default: @code{300}) (type: conf-integer)
Sets the default mount timeout in seconds.

@item @code{master-wait} (default: @code{10}) (type: conf-integer)
Sets the default maximum number of retries (actual iterations is half this,
each is delayed by 2 seconds before retrying) waiting for the master map to
become available if it cannot be read at program start.  This can be longer
if the map source itself waits for availability (such as sss).

@item @code{negative-timeout} (default: @code{60}) (type: conf-integer)
Set the default timeout for caching failed key lookups.

@item @code{mount-verbose?} (default: @code{#f}) (type: conf-boolean)
Use the verbose flag when spawning mount(8), and log some process info about
the requestor and its parent.

@item @code{mount-wait} (default: @code{-1}) (type: conf-integer)
Set the default time to wait for a response from a spawned mount(8)  before
sending it a SIGTERM.  Note that we still need to wait for the RPC layer to
timeout before the sub-process exits so this isn't ideal but it is the best
we can do.  The default is to wait until mount(8)  returns without
intervention.

@item @code{umount-wait} (default: @code{12}) (type: conf-integer)
Set the default time to wait for a response from a spawned umount(8)  before
sending it a SIGTERM.  Note that we still need to wait for the RPC layer to
timeout before the sub-process exits so this isn't ideal but it is the best
we can do.

@item @code{browse-mode?} (default: @code{#t}) (type: conf-boolean)
Should maps be browsable by default?

@item @code{mount-nfs-default-protocol} (default: @code{3}) (type: conf-integer)
Set the default protocol that mount.nfs(8) uses when performing a mount.
Autofs needs to know the default NFS protocol that mount.nfs(8) uses so it
can do special case handling for its availability probe for different NFS
protocols.  Since we can't identify this default automatically we need to
set it in the autofs configuration.

@item @code{append-options?} (default: @code{#t}) (type: conf-boolean)
When #t, global options are appended to map entry options.  When #f, map
entry options replace the global options.

@item @code{logging} (type: conf-log-level)
Default log level.  May be #:none, #:verbose, or #:debug.

@item @code{force-standard-program-map-env?} (default: @code{#f}) (type: conf-boolean)
Override the use of a prefix with standard environment variables when a
program map is executed.  Since program maps are run as the privileged user
setting these standard environment variables opens automount(8) to potential
user privilege escalation when the program map is written in a language that
can load components from, for example, a user home directory.

@item @code{map-hash-table-size} (default: @code{1024}) (type: conf-integer)
This configuration option may be used to change the number of hash table
slots.  This configuration option affects the overhead of searching the map
entry cache for map entries when there are a large number of entries.  It
affects the number of entries that must be looked at to locate a map entry
in the map entry cache.  For example, the default of 1024 and a direct map
with 8000 entries would result in each slot containing an average of 8
entries, which should be acceptable.  However, if excessive CPU usage is
observed during automount lookups increasing this option can reduce the CPU
overhead considerably because it reduces the length of the search chains.
Note that the number of entries in a map doesn't necessarily relate to the
number of entries used in the map entry cache.  There are two distinct cases
where the map hash table can make a significant difference, direct maps and
indirect maps that use the "browse" option.  For indirect maps that do not
use the "browse" option entries are added to the map entry cache at lookup
so the number of active cache entries, in this case, is usually much less
than the number of entries in the map.  In this last case it would be
unusual for the map entry cache to grow large enough to warrant increasing
the default before an event that cleans stale entries, a map re-read for
example.

@item @code{use-hostname-for-mounts?} (default: @code{#f}) (type: conf-boolean)
NFS mounts where the host name resolves to more than one IP address are
probed for availability and to establish the order in which mounts to them
should be tried.  To ensure that mount attempts are made only to hosts that
are responding and are tried in the order of hosts with the quickest
response the IP address of the host needs to be used for the mount.  If it
is necessary to use the hostname given in the map entry for the mount
regardless, then set this option to #t.  Be aware that if this is done there
is no defense against the host name resolving to one that isn't responding
and while the number of attempts at a successful mount will correspond to
the number of addresses the host name resolves to the order will also not
correspond to fastest responding hosts.

@item @code{disable-not-found-message?} (default: @code{#f}) (type: conf-boolean)
The original request to add this log message needed it to be unconditional.
That produces, IMHO, unnecessary noise in the log so a configuration option
has been added to provide the ability to turn it off.

@item @code{use-ignore-mount-option?} (default: @code{#f}) (type: conf-boolean)
An option to enable the use of autofs pseudo option "disable".  This option
is used as a hint to user space that the mount entry should be omitted from
mount table listings.  The default is #f to avoid unexpected changes in
behaviour and so is an opt-in setting.

@item @code{sss-master-map-wait} (default: @code{0}) (type: conf-integer)
Set the time to wait and retry if sssd is unable to read the master map at
program start.  Default is 0 (don't wait) or 10 if sss supports returning
EHSTDOWN when the provider isn't available.  If the sss library upports
returning EHOSTDOWN when the provider is down then this value is how long to
wait between re‐ tries reading the master map.  When reading dependent maps
or looking up a map key this value is multiplied by the number of retries
that would be used when reading the master map.

@item @code{use-mount-request-log-id?} (default: @code{#f}) (type: conf-boolean)
Set whether to use a mount request log id so that log entries for specific
mount requests can be easily identified in logs that have multiple
concurrent requests.

@end table

@end deftp


@c %end of fragment



@node Samba-Dienste, Kontinuierliche Integration, Network File System, Dienste
@subsection Samba-Dienste

@cindex Samba
@cindex SMB
Das Modul @code{(gnu services samba)} stellt Dienstdefinitionen für Samba
und zugehörige Hilfsdienste zur Verfügung. Zurzeit werden die folgenden
Dienste unterstützt.

@subsubheading Samba

Mit @uref{https://www.samba.org, Samba} wird das Teilen von Verzeichnissen
und Druckern im Netzwerk über das Protokoll SMB/CIFS ermöglicht, was in
Windows häufig verwendet wird. Mit Samba kann auch die Rolle eines
Active-Directory-Domain-Controllers (AD DC) für andere Rechner in einem
heterogenen Netzwerk mit vielen Arten von Computersystemen übernommen
werden.

@defvar samba-service-type

Der Diensttyp, um die Samba-Dienste @code{samba}, @code{nmbd}, @code{smbd}
und @code{winbindd} zu aktivieren. Nach der Vorgabeeinstellung wird noch
keiner der Samba-Daemons ausgeführt. Sie müssen einzeln angeben, welche Sie
aktiviert haben möchten.

Hier sehen Sie ein grundlegendes Beispiel einer schlichten, anonymen (ohne
Authentifizierung) Samba-Dateifreigabe, wodurch Zugriff auf das Verzeichnis
@file{/public} gewährt wird.

@quotation Tipp
Es wird vorausgesetzt, dass alle Benutzerkonten auf das Verzeichnis
@file{/public} und enthaltene Dateien Lese- und Schreibzugriff haben, also
möchten Sie vielleicht @samp{chmod -R 777 /public} darauf ausführen.
@end quotation

@quotation Vorsicht
Sie sollten so eine Samba-Konfiguration nur in kontrollierten Umgebungen
einsetzen und darüber keine privaten Dateien teilen, denn jeder in Ihrem
Netzwerk würde darauf zugreifen können.
@end quotation

@lisp
(service samba-service-type (samba-configuration
                             (enable-smbd? #t)
                             (config-file (plain-file "smb.conf" "\
[global]
map to guest = Bad User
logging = syslog@@1

[public]
browsable = yes
path = /public
read only = no
guest ok = yes
guest only = yes\n"))))
@end lisp

@end defvar

@deftp {Datentyp} samba-service-configuration
Verbundsobjekt für die Konfiguration der Samba-Programme.

@table @asis
@item @code{package} (Vorgabe: @code{samba})
Das Samba-Paket, das benutzt werden soll.

@item @code{config-file} (Vorgabe: @code{#f})
Welche Konfigurationsdatei benutzt werden soll. Die Syntax können Sie
erfahren, wenn Sie @samp{man smb.conf} ausführen.

@item @code{enable-samba?} (Vorgabe: @code{#f})
Den @code{samba}-Daemon aktivieren.

@item @code{enable-smbd?} (Vorgabe: @code{#f})
Den @code{smbd}-Daemon aktivieren.

@item @code{enable-nmbd?} (Vorgabe: @code{#f})
Den @code{nmbd}-Daemon aktivieren.

@item @code{enable-winbindd?} (Vorgabe: @code{#f})
Den @code{winbindd}-Daemon aktivieren.

@end table
@end deftp

@cindex wsdd, Web Service Discovery Daemon
@subsubheading Web Service Discovery Daemon

Mit dem @acronym{WSDD, Web-Service-Discovery-Daemon} wird das Protokoll
@uref{http://docs.oasis-open.org/ws-dd/discovery/1.1/os/wsdd-discovery-1.1-spec-os.html,
Web Services Dynamic Discovery} zum Finden anderer Rechner über Multicast
DNS aktiviert, ähnlich zu dem, was Avahi macht. Es kann als Alternative
einspringen für Rechner mit SMB, auf denen SMBv1 aus Sicherheitsgründen
abgeschaltet wurde.

@defvar wsdd-service-type
Dies ist der Diensttyp für den WSD-Host-Daemon. Als Wert wird für diesen
Diensttyp ein Verbundsobjekt vom Typ @code{wsdd-configuration} benutzt. Die
Details zum @code{wsdd-configuration}-Verbundstyp folgen nun.
@end defvar

@deftp {Datentyp} wsdd-configuration
Dieser Datentyp repräsentiert die Konfiguration des wsdd-Dienstes.

@table @asis

@item @code{package} (Vorgabe: @code{wsdd})
Das zu benutzende wsdd-Paket.

@item @code{ipv4only?} (Vorgabe: @code{#f})
Lässt nur auf IPv4-Adressen lauschen.

@item @code{ipv6only} (Vorgabe: @code{#f})
Lässt nur auf IPv6-Adressen lauschen. Beachten Sie: Es ist @emph{nicht}
möglich, beide Optionen zu aktivieren, denn sonst würde @code{wsdd} auf gar
keiner IP-Version lauschen.

@item @code{chroot} (Vorgabe: @code{#f})
Mit Chroot in ein eigenes Verzeichnis wechseln und damit den Zugriff auf
ungewollte Verzeichnisse verhindern. Dies bietet zusätzliche Sicherheit,
wenn es eine Schwachstelle in @command{wsdd} geben sollte.

@item @code{hop-limit} (Vorgabe: @code{1})
Beschränkung, wie viele Zwischenschritte („Hops“) Multicast-Pakete nehmen
dürfen. Voreingestellt ist @var{1}, um zu verhindern, dass Pakete das lokale
Netzwerk verlassen.

@item @code{interface} (Vorgabe: @code{'()})
Nur auf den hier angegebenen Netzwerkschnittstellen lauschen. Die Vorgabe
ist, dass wsdd auf allen Schnittstellen erreichbar ist, außer der
Loopback-Schnittstelle, die niemals benutzt wird.

@item @code{uuid-device} (Vorgabe: @code{#f})
Im WSD-Protokoll muss ein Gerät eine UUID haben. Sie können hier eine UUID
für den Dienst selbst vergeben.

@item @code{domain} (Vorgabe: @code{#f})
Wenn gemeldet werden soll, dass dieser Rechner zu einer Active Directory
gehört.

@item @code{host-name} (Vorgabe: @code{#f})
Legen Sie den Rechnernamen selbst fest, statt dass @command{wsdd} den
Rechnernamen des Rechners verwendet. Normalerweise wird aus einem möglichen
vollständigen Domain-Namen („Fully Qualified Domain Name“) des Rechners nur
der Teil mit dem Rechnernamen benutzt.

@item @code{preserve-case?} (Vorgabe: @code{#f})
Vorgegeben ist, dass @command{wsdd} die Rechnernamen in der Arbeitsgruppe
(„Workgroup“) in Großbuchstaben wiedergibt. Das Gegenteil ist der Fall, wenn
der Rechnername aus einer Domain kommt. Wenn Sie diesen Parameter auf wahr
setzen, bleibt die Groß-/Kleinschreibung erhalten.

@item @code{workgroup} (Vorgabe: @var{"WORKGROUP"})
Hier können Sie den Namen der Arbeitsgruppe ändern. @command{wsdd} wird
diesen Rechner als Mitglied dieser Arbeitsgruppe melden.

@end table
@end deftp

@node Kontinuierliche Integration
@subsection Kontinuierliche Integration

@cindex Kontinuierliche Integration
@uref{https://guix.gnu.org/cuirass/, Cuirass} ist ein Werkzeug zur
kontinuierlichen Integration für Guix. Es kann sowohl bei der Entwicklung
helfen als auch beim Anbieten von Substituten für andere (siehe
@ref{Substitute}).

Das Modul @code{(gnu services cuirass)} stellt den folgenden Dienst zur
Verfügung:

@defvr {Prozedur} cuirass-service-type
Der Diensttyp des Cuirass-Dienstes. Sein Wert muss ein
@code{cuirass-configuration}-Verbundsobjekt sein, wie im Folgenden
beschrieben.
@end defvr

Um Erstellungsaufträge („Build Jobs“) hinzuzufügen, müssen Sie sie im
@code{specifications}-Feld der Konfiguration eintragen. Mit dem folgenden
Beispiel würden alle Pakete aus dem Kanal @code{my-channel} erstellt.

@lisp
(define %cuirass-specs
  #~(list (specification
           (name 'my-channel)
           (build '(channels my-channel))
           (channels
            (cons (channel
                   (name 'my-channel)
                   (url "https://my-channel.git"))
                  %default-channels)))))

(service cuirass-service-type
         (cuirass-configuration
          (specifications %cuirass-specs)))
@end lisp

Um das Paket @code{linux-libre}, das im vorgegebenen Guix-Kanal definiert
ist, zu erstellen, schreibe man die folgende Konfiguration.

@lisp
(define %cuirass-specs
  #~(list (specification
           (name 'my-linux)
           (build '(packages "linux-libre")))))

(service cuirass-service-type
         (cuirass-configuration
          (specifications %cuirass-specs)))
@end lisp

Für eine Beschreibung der anderen Konfigurationsmöglichkeiten und des
Spezifikations-Verbundsobjektes selbst, siehe das @ref{Specifications,,,
cuirass, Handbuch zu Cuirass}.

Die Informationen, die sich auf Erstellungsaufträge beziehen, werden direkt
in deren Spezifikation festgelegt, aber globale Einstellungen des
@command{cuirass}-Prozesses sind über andere Felder der
@code{cuirass-configuration} zugänglich.

@deftp {Datentyp} cuirass-configuration
Datentyp, der die Konfiguration von Cuirass repräsentiert.

@table @asis
@item @code{cuirass} (Vorgabe: @code{cuirass})
Das Cuirass-Paket, das benutzt werden soll.

@item @code{log-file} (Vorgabe: @code{"/var/log/cuirass.log"})
An welchen Ort die Protokolldatei geschrieben wird.

@item @code{web-log-file} (Vorgabe: @code{"/var/log/cuirass-web.log"})
An welchem Ort die Protokolldatei der Weboberfläche gespeichert wird.

@item @code{cache-directory} (Vorgabe: @code{"/var/cache/cuirass"})
Ort, wo Repositorys zwischengespeichert werden.

@item @code{user} (Vorgabe: @code{"cuirass"})
Besitzer des @code{cuirass}-Prozesses.

@item @code{group} (Vorgabe: @code{"cuirass"})
Gruppe des Besitzers des @code{cuirass}-Prozesses.

@item @code{interval} (default: @code{300})
Anzahl der Sekunden, bevor ein Repository wieder neu geladen wird und danach
Cuirass-Aufträge behandelt werden, als Standardeinstellung.

Note that individual jobset specifications may override this in their
@code{period} field; the value specified here is only used for
specifications that use the default @code{period} value, which is zero.

@item @code{parallel-evaluations} (default: @code{#f})
Maximum number of jobset evaluations that may run concurrently.  If
@code{#f}, that number is determined based on a number of CPU cores, with an
upper bound of 8.

@item @code{ttl} (default: @code{2592000})
Duration to keep build results' GC roots alive, in seconds.

@item @code{evaluation-ttl} (default: 24 months)
Number of seconds after which an evaluation may be deleted from the
database.

@item @code{build-expiry} (default: 4 months)
Duration in seconds after which pending builds are canceled.  This helps
ensure that the backlog does not grow indefinitely.

@item @code{threads} (default: @code{#f})
@itemx @code{web-threads} (default: @code{#f})
Number of kernel threads to use for Cuirass (main process) and for the web
interface (the @command{cuirass web} program).  The default value should be
appropriate for most cases.

@item @code{parameters} (Vorgabe: @code{#f})
Parameter aus der angegebenen Parameterdatei lesen. Die unterstützten
Parameter werden im @ref{Parameters,,, cuirass, Cuirass-Handbuch}
beschrieben.

@item @code{remote-server} (Vorgabe: @code{#f})
Ein @code{cuirass-remote-server-configuration}-Verbundsobjekt, um den
Mechanismus für entfernte Erstellungen zu benutzen, oder @code{#f}, um den
voreingestellten Erstellungsmechanismus zu benutzen.

@item @code{database} (Vorgabe: @code{"dbname=cuirass host=/var/run/postgresql"})
@var{database} als die Datenbank mit den Aufträgen und bisherigen
Erstellungsergebnissen benutzen. Weil Cuirass als Datenbanktreiber
PostgreSQL benutzt, muss @var{database} eine Zeichenkette sein wie
@code{"dbname=cuirass host=localhost"}.

@item @code{port} (Vorgabe: @code{8081})
Portnummer, die vom HTTP-Server benutzt wird.

@item @code{host} (Vorgabe: @code{"localhost"})
Auf der Netzwerkschnittstelle für den Rechnernamen @var{host} lauschen. Nach
Vorgabe werden Verbindungen vom lokalen Rechner @code{localhost} akzeptiert.

@item @code{specifications} (Vorgabe: @code{#~'()})
Ein G-Ausdruck (siehe @ref{G-Ausdrücke}), der zu einer Liste von
Spezifikations-Verbundsobjekten ausgewertet
wird. Spezifikations-Verbundsobjekte werden im @ref{Specifications,,,
cuirass, Cuirass-Handbuch} beschrieben.

@item @code{one-shot?} (Vorgabe: @code{#f})
Spezifikationen nur einmal auswerten und Ableitungen nur einmal erstellen.

@item @code{fallback?} (Vorgabe: @code{#f})
Pakete lokal erstellen, wenn das Substituieren einer vorerstellten
Binärdatei fehlschlägt.

@item @code{extra-options} (Vorgabe: @code{'()})
Zusätzliche Befehlszeilenoptionen, die beim Ausführen des Prozesses
@code{cuirass register} mitgegeben werden sollen.

@item @code{web-extra-options} (Vorgabe: @code{'()})
Zusätzliche Befehlszeilenoptionen, die beim Ausführen des Prozesses
@code{cuirass web} mitgegeben werden sollen.

@end table
@end deftp

@cindex entfernte Erstellung
@subsubheading Cuirass, entfernte Erstellung mit

Cuirass kennt zwei Mechanismen, wie damit Ableitungen erstellt werden
können.

@itemize
@item Den lokalen Guix-Daemon benutzen.
Dies ist der voreingestellte Erstellungsmechanismus. Sobald
Erstellungsaufträge ausgewertet wurden, werden sie an den Guix-Daemon auf
dem lokalen Rechner geschickt. Cuirass lauscht dann auf die Ausgabe des
Guix-Daemons, um die verschiedenen Ereignisse bei der Erstellung zu
erkennen.

@item Den Mechanismus für entfernte Erstellungen benutzen.
Die Erstellungsaufträge werden @emph{nicht} beim lokalen Guix-Daemon
eingereicht. Stattdessen teilt ein entfernter Server die Erstellungsanfragen
den verbundenen entfernten Arbeitermaschinen zu, entsprechend ihren
Erstellungsprioritäten.

@end itemize

Um diesen Erstellungsmodus zu aktivieren, übergeben Sie ein
@code{cuirass-remote-server-configuration}-Verbundsobjekt für das Argument
@code{remote-server} des @code{cuirass-configuration}-Verbundsobjektes. Der
@code{cuirass-remote-server-configuration}-Verbund wird im Folgenden
beschrieben.

Dieser Erstellungsmodus skaliert wesentlich besser als der Vorgabemodus. Mit
diesem Erstellungsmodus wird auch die Erstellungfarm von GNU Guix auf
@url{https://ci.guix.gnu.org} betrieben. Er sollte dann bevorzugt werden,
wenn Sie mit Cuirass eine große Anzahl von Paketen erstellen möchten.

@deftp {Datentyp} cuirass-remote-server-configuration
Der Datentyp, der die Konfiguration des Cuirass-„remote-server“-Prozesses
repräsentiert.

@table @asis
@item @code{backend-port} (Vorgabe: @code{5555})
Der TCP-Port, um mit @code{remote-worker}-Prozessen mit ZMQ zu
kommunizieren.

@item @code{log-port} (Vorgabe: @code{5556})
Der TCP-Port des Protokollservers.

@item @code{publish-port} (Vorgabe: @code{5557})
Der TCP-Port des „Publish“-Servers, um Substitute mit anderen zu teilen.

@item @code{log-file} (Vorgabe: @code{"/var/log/cuirass-remote-server.log"})
An welchen Ort die Protokolldatei geschrieben wird.

@item @code{cache} (Vorgabe: @code{"/var/cache/cuirass/remote"})
Im @var{cache}-Verzeichnis Erstellungsprotokolldateien speichern.

@item @code{log-expiry} (Vorgabe: 6 Monate)
Nach wie vielen Sekunden die von @command{cuirass remote-worker}
angesammelten Erstellungsprotokolle gelöscht werden können.

@item @code{trigger-url} (Vorgabe: @code{#f})
Sobald ein Substitut erfolgreich heruntergeladen wurde, wird dessen
Einlagerung als Narinfo („bake the substitute“) auf @var{trigger-url} direkt
ausgelöst.

@item @code{publish?} (Vorgabe: @code{#t})
Wenn dies auf falsch gesetzt ist, wird kein „Publish“-Server gestartet und
das @code{publish-port}-Argument ignoriert. Verwenden Sie es, wenn bereits
ein eigenständiger „Publish“-Server für den „remote-server“ läuft.

@item @code{public-key}
@item @code{private-key}
Die angegebenen @var{Datei}en als das Paar aus öffentlichem und privatem
Schlüssel zum Signieren veröffentlichter Store-Objekte benutzen.

@end table
@end deftp

Mindestens eine entfernte Arbeitermaschine („remote worker“) muss auf
irgendeiner Maschine im lokalen Netzwerk gestartet werden, damit tatsächlich
Erstellungen durchgeführt werden und deren Status gemeldet wird.

@deftp {Datentyp} cuirass-remote-worker-configuration
Der Datentyp, der die Konfiguration des Cuirass-„remote-worker“-Prozesses
repräsentiert.

@table @asis
@item @code{cuirass} (Vorgabe: @code{cuirass})
Das Cuirass-Paket, das benutzt werden soll.

@item @code{workers} (Vorgabe: @code{1})
@var{workers}-viele parallele Arbeiterprozesse starten.

@item @code{server} (Vorgabe: @code{#f})
Keine Maschinen über Avahi ermitteln, sondern stattdessen eine Verbindung
zum Server unter der in @code{server} angegebenen IP-Adresse aufbauen.

@item @code{systems} (Vorgabe: @code{(list (%current-system))})
Nur Erstellungen für die in @var{systems} angegebenen Systeme anfragen.

@item @code{log-file} (Vorgabe: @code{"/var/log/cuirass-remote-worker.log"})
An welchen Ort die Protokolldatei geschrieben wird.

@item @code{publish-port} (Vorgabe: @code{5558})
Der TCP-Port des „Publish“-Servers, um Substitute mit anderen zu teilen.

@item @code{substitute-urls} (Vorgabe: @code{%default-substitute-urls})
Die Liste der URLs, auf denen nach Substituten gesucht wird, wenn nicht
anders angegeben.

@item @code{public-key}
@item @code{private-key}
Die angegebenen @var{Datei}en als das Paar aus öffentlichem und privatem
Schlüssel zum Signieren veröffentlichter Store-Objekte benutzen.

@end table
@end deftp

@subsubheading Laminar

@uref{https://laminar.ohwg.net/, Laminar} ist ein sparsamer und modularer
Dienst zur Kontinuierlichen Integration. Statt einer Weboberfläche zur
Konfiguration werden versionskontrollierte Konfigurationsdateien und Skripte
verwendet.

Laminar ermutigt dazu, bestehende Werkzeuge wie bash und cron zu benutzen,
statt das Rad neu zu erfinden.

@defvar laminar-service-type
Der Diensttyp des Laminar-Dienstes. Sein Wert muss ein
@code{laminar-configuration}-Verbundsobjekt sein, wie im Folgenden
beschrieben.

Alle Konfigurationswerte haben bereits vorgegebene Einstellungen. Eine
minimale Konfiguration, um Laminar aufzusetzen, sehen Sie unten. Nach
Vorgabe läuft die Weboberfläche auf Port 8080.

@lisp
(service laminar-service-type)
@end lisp
@end defvar

@deftp {Datentyp} laminar-configuration
Datentyp, der die Konfiguration von Laminar repräsentiert.

@table @asis
@item @code{laminar} (Vorgabe: @code{laminar})
Das Laminar-Paket, das benutzt werden soll.

@item @code{home-directory} (Vorgabe: @code{"/var/lib/laminar"})
Das Verzeichnis mit Auftragskonfigurationen und Verzeichnissen, in denen
Aufträge ausgeführt werden („run“-Verzeichnissen).

@item @code{supplementary-groups} (Vorgabe: @code{'()})
Der Name der Gruppe, zu der das Laminar-Benutzerkonto gehören soll.

@item @code{bind-http} (Vorgabe: @code{"*:8080"})
Die Netzwerkschnittstelle mit Port oder der Unix-Socket, wo laminard auf
eingehende Verbindungen zur Web-Oberfläche lauschen soll.

@item @code{bind-rpc} (Vorgabe: @code{"unix-abstract:laminar"})
Die Netzwerkschnittstelle mit Port oder der Unix-Socket, wo laminard auf
eingehende Befehle z.B.@: zum Auslösen einer Erstellung lauschen soll.

@item @code{title} (Vorgabe: @code{"Laminar"})
Der Seitentitel, der auf der Web-Oberfläche angezeigt wird.

@item @code{keep-rundirs} (Vorgabe: @code{0})
Setzen Sie dies auf eine ganze Zahl, die festlegt, wie viele
Ausführungsverzeichnisse pro Auftrag vorgehalten werden. Die mit der
niedrigsten Nummer werden gelöscht. Die Vorgabe ist 0, d.h.@: alle
Ausführungsverzeichnisse werden sofort gelöscht.

@item @code{archive-url} (Vorgabe: @code{#f})
Die von laminard angebotene Weboberfläche wird aus dieser URL die Verweise
auf Artefakte archivierter Aufträge zusammensetzen.

@item @code{base-url} (Vorgabe: @code{#f})
Was Laminar in Verweisen auf eigene Seiten als Basis-URL verwenden soll.

@end table
@end deftp

@subsubheading Forgejo Runner

@cindex continuous integration, Forgejo
@cindex Forgejo, continuous integration
The @code{(gnu services ci)} also provides a service for
@uref{https://code.forgejo.org/forgejo/runner, Forgejo Runner}, a daemon
that connects to an instance of the @uref{https://forgejo.org, Forgejo code
collaboration tool} and runs jobs for continuous integration.

A minimal configuration mostly with default values that can be added to the
@code{services} field of your operating system looks like this:

@lisp
(service forgejo-runner-service-type
         (forgejo-runner-configuration
          (name "my-runner")
          (labels '("guix" "linux"))))
@end lisp

This provides a @code{forgejo-runner} Shepherd service.  That service will
initially fail to start; you will have to manually @dfn{register} the runner
against the Forgejo server by running a command like:

@example
herd register forgejo-runner @var{url} @var{token}
@end example

@noindent
... where the arguments are as follows:

@table @var
@item url
the URL of the Forgejo server---e.g., @indicateurl{https://codeberg.org};
@item token
an access token
@uref{https://forgejo.org/docs/latest/admin/runner-installation/#standard-registration,
provided by the Forgejo server}.
@end table

Once registration has succeeded, you can start the runner:

@example
herd enable forgejo-runner
herd start forgejo-runner
@end example

The runner then receives orders from the Forgejo server to execute
@dfn{actions}.  Actions are commands and workflows specified by YAML files
in the @file{.forgejo/workflows} directory of source code repositories---see
@uref{https://forgejo.org/docs/v7.0/user/actions/, the Forgejo Action
documentation} for more info.

Note that at the moment @code{forgejo-runner-service-type} lets you run only
one runner.  Details about the configuration of this service follow.

@defvar forgejo-runner-service-type
This is the service type for Forgejo Runner.  Its value must be a
@code{forgejo-runner-configuration} record, documented below.
@end defvar

@deftp {Data Type} forgejo-runner-configuration
This data type represents the configuration of an instance of
@code{forgejo-runner-service-type}.  It contains the following fields:

@table @asis
@item @code{package} (default: @code{forgejo-runner})
The Forgejo Runner package to use.

@item @code{name} (default: @code{#~(gethostname)})
Name of the runner as will be shown in the runner management interface of
Forgejo.

@item @code{labels} (default: @code{'("guix")})
List of
@uref{https://forgejo.org/docs/latest/admin/actions/#choosing-labels,
labels} representing the type of environment the runner provides and that
actions may refer to.

@item @code{capacity} (default: @code{1})
Number of tasks to be executed concurrently.

@item @code{timeout} (default: @code{(* 3 3600)})
Maximum duration of a job, in seconds.

@item @code{fetch-timeout} (default: @code{5})
Maximum duration for fetching the job from the Forgejo server, in seconds.

@item @code{fetch-interval} (default: @code{2})
Interval (in seconds) for fetching the job from the Forgejo server.

@item @code{report-interval} (default: @code{1})
Interval (in seconds) for reporting the job status and log to the Forgejo
server.

@item @code{data-directory} (default: @code{"/var/lib/forgejo-runner"})
Directory where @command{forgejo-runner} will store persistent data such as
its configuration and access token.

@item @code{run-directory} (default: @code{"/var/run/forgejo-runner"})
Directory where @command{forgejo-runner} stores cached data.

@item @code{log-file} (default: @code{"/var/log/forgejo-runner.log"})
Name of the @command{forgejo-runner} log file.

@end table
@end deftp

@node Dienste zur Stromverbrauchsverwaltung
@subsection Dienste zur Stromverbrauchsverwaltung

@cindex power-profiles-daemon
@subsubheading Power Profiles Daemon

The @code{(gnu services pm)} module provides a Guix service definition for
the Linux Power Profiles Daemon, which makes power profiles handling
available over D-Bus.

The available profiles consist of the default @samp{balanced} mode, a
@samp{power-saver} mode and on supported systems a @samp{performance} mode.

@quotation Wichtig
The @code{power-profiles-daemon} conflicts with other power management tools
like @code{tlp}. Using both together is not recommended.
@end quotation

@defvar power-profiles-daemon-service-type
This is the service type for the
@uref{https://gitlab.freedesktop.org/upower/power-profiles-daemon/, Power
Profiles Daemon}.  The value for this service is a
@code{power-profiles-daemon-configuration}.

To enable the Power Profiles Daemon with default configuration add this line
to your services:

@lisp
(service power-profiles-daemon-service-type)
@end lisp
@end defvar

@deftp {Datentyp} power-profiles-daemon-configuration
Data type representing the configuration of
@code{power-profiles-daemon-service-type}.

@table @asis
@item @code{power-profiles-daemon} (default: @code{power-profiles-daemon}) (type: file-like)
Package object of power-profiles-daemon.

@end table
@end deftp


@cindex TLP
@cindex Stromverbrauch mit TLP verwalten
@subsubheading TLP-Daemon

Das Modul @code{(gnu services pm)} stellt eine Guix-Dienstdefinition für das
Linux-Werkzeug TLP zur Stromverbrauchsverwaltung zur Verfügung.

TLP macht mehrere Stromspar-Modi auf Anwendungsebene („User Space“) und im
Kernel verfügbar. Im Gegensatz zum @code{upower-service} handelt es sich um
kein passives Werkzeug zur Überwachung, sondern TLP passt selbst jedes Mal
Einstellungen an, wenn eine neue Stromquelle erkannt wird. Mehr
Informationen finden Sie auf der @uref{https://linrunner.de/en/tlp/tlp.html,
TLP-Homepage}.

@defvar tlp-service-type
Der Diensttyp für das TLP-Werkzeug. In der Vorgabeeinstellung wird die
Akkulaufzeit für die meisten Systeme optimiert, aber Sie können sie nach
Belieben anpassen, indem Sie eine gültige @code{tlp-configuration}
hinzufügen:
@lisp
(service tlp-service-type
         (tlp-configuration
          (cpu-scaling-governor-on-ac (list "performance"))
          (sched-powersave-on-bat? #t)))
@end lisp
@end defvar

Im Folgenden ist jeder Parameterdefinition ihr Typ vorangestellt. Zum
Beispiel bedeutet @samp{Boolescher-Ausdruck foo}, dass der Parameter
@code{foo} als boolescher Ausdruck festgelegt werden sollte.  Typen, die mit
@code{Vielleicht-} beginnen, bezeichnen Parameter, die nicht in der
TLP-Konfigurationsdatei vorkommen, wenn Sie keinen Wert für sie setzen oder
den Wert ausdrücklich auf @code{%unset-value} setzen.

@c The following documentation was initially generated by
@c (generate-tlp-documentation) in (gnu services pm).  Manually maintained
@c documentation is better, so we shouldn't hesitate to edit below as
@c needed.  However if the change you want to make to this documentation
@c can be done in an automated way, it's probably easier to change
@c (generate-documentation) than to make it below and have to deal with
@c the churn as TLP updates.

Verfügbare @code{tlp-configuration}-Felder sind:

@deftypevr {@code{tlp-configuration}-Parameter} „package“ tlp
Das TLP-Paket.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Boolescher-Ausdruck tlp-enable?
Setzen Sie dies auf wahr, wenn Sie TLP aktivieren möchten.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette tlp-default-mode
Der vorgegebene Modus, wenn keine Stromversorgung gefunden werden
kann. Angegeben werden können AC (am Stromnetz) und BAT (Batterie/Akku).

Die Vorgabe ist @samp{"AC"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Nichtnegative-ganze-Zahl disk-idle-secs-on-ac
Die Anzahl an Sekunden, die der Linux-Kernel warten muss, bis er sich mit
dem Plattenspeicher synchronisiert, wenn die Stromversorgung auf AC steht.

Die Vorgabe ist @samp{0}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Nichtnegative-ganze-Zahl disk-idle-secs-on-bat
Wie @code{disk-idle-ac}, aber für den BAT-Modus.

Die Vorgabe ist @samp{2}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Nichtnegative-ganze-Zahl max-lost-work-secs-on-ac
Periodizität, mit der im Zwischenspeicher geänderte Speicherseiten („Dirty
Pages“) synchronisiert werden („Cache Flush“), ausgedrückt in Sekunden.

Die Vorgabe ist @samp{15}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Nichtnegative-ganze-Zahl max-lost-work-secs-on-bat
Wie @code{max-lost-work-secs-on-ac}, aber für den BAT-Modus.

Die Vorgabe ist @samp{60}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Leerzeichengetrennte-Zeichenketten-Liste cpu-scaling-governor-on-ac
Regulator der Frequenzskalierung der CPU („Frequency Scaling Governor“) im
AC-Modus. Beim intel_pstate-Treiber stehen powersave (stromsparend) und
performance (leistungsfähig) zur Auswahl. Beim acpi-cpufreq-Treiber stehen
ondemand, powersave, performance und conservative zur Auswahl.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Leerzeichengetrennte-Zeichenketten-Liste cpu-scaling-governor-on-bat
Wie @code{cpu-scaling-governor-on-ac}, aber für den BAT-Modus.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Nichtnegative-ganze-Zahl cpu-scaling-min-freq-on-ac
Legt die minimale verfügbare Frequenz für den Skalierungsregulator im
AC-Modus fest.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Nichtnegative-ganze-Zahl cpu-scaling-max-freq-on-ac
Legt die maximale verfügbare Frequenz für den Skalierungsregulator im
AC-Modus fest.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Nichtnegative-ganze-Zahl cpu-scaling-min-freq-on-bat
Legt die minimale verfügbare Frequenz für den Skalierungsregulator im
BAT-Modus fest.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Nichtnegative-ganze-Zahl cpu-scaling-max-freq-on-bat
Legt die maximale verfügbare Frequenz für den Skalierungsregulator im
BAT-Modus fest.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Nichtnegative-ganze-Zahl cpu-min-perf-on-ac
Beschränkt den minimalen Leistungszustand („P-State“), um die
Stromverteilung („Power Dissipation“) der CPU im AC-Modus zu
regulieren. Werte können als Prozentsatz bezüglich der verfügbaren Leistung
angegeben werden.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Nichtnegative-ganze-Zahl cpu-max-perf-on-ac
Beschränkt den maximalen Leistungszustand („P-State“), um die
Stromverteilung („Power Dissipation“) der CPU im AC-Modus zu
regulieren. Werte können als Prozentsatz bezüglich der verfügbaren Leistung
angegeben werden.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Nichtnegative-ganze-Zahl cpu-min-perf-on-bat
Wie @code{cpu-min-perf-on-ac} im BAT-Modus.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Nichtnegative-ganze-Zahl cpu-max-perf-on-bat
Wie @code{cpu-max-perf-on-ac} im BAT-Modus.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Boolescher-Ausdruck cpu-boost-on-ac?
Die CPU-Turbo-Boost-Funktionen im AC-Modus aktivieren.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Boolescher-Ausdruck cpu-boost-on-bat?
Wie @code{cpu-boost-on-ac?} im BAT-Modus.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Boolescher-Ausdruck sched-powersave-on-ac?
Dem Linux-Kernel erlauben, die Anzahl benutzter CPU-Kerne und Hyperthreads
anzupassen, wenn er unter leichter Last steht.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Boolescher-Ausdruck sched-powersave-on-bat?
Wie @code{sched-powersave-on-ac?}, aber für den BAT-Modus.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Boolescher-Ausdruck nmi-watchdog?
Ob die rechtzeitige Behandlung nichtmaskierbarer Unterbrechungen durch den
„NMI-Watchdog“ des Linux-Kernels überprüft werden soll.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Zeichenkette phc-controls
Auf Linux-Kernels, auf die der PHC-Patch angewandt wurde, wird hierdurch die
Prozessorspannung angepasst. Ein Beispielwert wäre @samp{"F:V F:V F:V F:V"}.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette energy-perf-policy-on-ac
Legt das Verhältnis von Prozessorleistung zu Stromsparsamkeit im AC-Modus
fest. Angegeben werden können performance (hohe Leistung), normal, powersave
(wenig Stromverbrauch).

Die Vorgabe ist @samp{"performance"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette energy-perf-policy-on-bat
Wie @code{energy-perf-policy-ac}, aber für den BAT-Modus.

Die Vorgabe ist @samp{"powersave"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste disks-devices
Festplattengeräte.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste disk-apm-level-on-ac
Stufe für das „Advanced Power Management“ auf Festplatten.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste disk-apm-level-on-bat
Wie @code{disk-apm-bat}, aber für den BAT-Modus.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Leerzeichengetrennte-Zeichenketten-Liste disk-spindown-timeout-on-ac
Zeitspanne, bis die Festplatte inaktiv wird (ein „Spin-Down“). Für jede
deklarierte Festplatte muss hier je ein Wert angegeben werden.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Leerzeichengetrennte-Zeichenketten-Liste disk-spindown-timeout-on-bat
Wie @code{disk-spindown-timeout-on-ac}, aber für den BAT-Modus.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Leerzeichengetrennte-Zeichenketten-Liste disk-iosched
Ein-/Ausgaben-Planungsprogramm für Plattengeräte auswählen. Für jede
deklarierte Festplatte muss ein Wert angegeben werden. Möglich sind zum
Beispiel cfq, deadline und noop.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette sata-linkpwr-on-ac
Stufe des „Aggressive Link Power Management“ (ALPM) für SATA@. Angegeben
werden können min_power (wenigster Stromverbrauch), medium_power (mittlerer
Stromverbrauch), max_performance (maximale Leistung).

Die Vorgabe ist @samp{"max_performance"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette sata-linkpwr-on-bat
Wie @code{sata-linkpwr-ac}, aber für den BAT-Modus.

Die Vorgabe ist @samp{"min_power"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Zeichenkette sata-linkpwr-blacklist
Bestimmte SATA-Geräte („SATA-Host-Devices“) vom Link Power Management
ausschließen.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-An-Aus-Boolescher-Ausdruck ahci-runtime-pm-on-ac?
Verwaltung des Stromverbrauchs zur Laufzeit für AHCI-Steuerungseinheiten
(„Controller“) und AHCI-Platten im AC-Modus aktivieren.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-An-Aus-Boolescher-Ausdruck ahci-runtime-pm-on-bat?
Wie @code{ahci-runtime-pm-on-ac} im BAT-Modus.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Nichtnegative-ganze-Zahl ahci-runtime-pm-timeout
Nach wie vielen Sekunden der Inaktivität die Platten in den
Bereitschaftsmodus gehen („Suspended“).

Die Vorgabe ist @samp{15}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette pcie-aspm-on-ac
Stufe des „PCI Express Active State Power Management“. Zur Auswahl stehen
default (Voreinstellung), performance (hohe Leistung), powersave (wenig
Stromverbrauch).

Die Vorgabe ist @samp{"performance"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette pcie-aspm-on-bat
Wie @code{pcie-aspm-ac}, aber für den BAT-Modus.

Die Vorgabe ist @samp{"powersave"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Nichtnegative-ganze-Zahl start-charge-thresh-bat0
Ab welchem Prozentwert die Batterie 0 anfangen soll, zu laden. Wird nur auf
manchen Laptops unterstützt.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Nichtnegative-ganze-Zahl stop-charge-thresh-bat0
Ab welchem Prozentwert die Batterie 0 aufhören soll, zu laden. Wird nur auf
manchen Laptops unterstützt.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Nichtnegative-ganze-Zahl start-charge-thresh-bat1
Ab welchem Prozentwert die Batterie 1 anfangen soll, zu laden. Wird nur auf
manchen Laptops unterstützt.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Nichtnegative-ganze-Zahl stop-charge-thresh-bat1
Ab welchem Prozentwert die Batterie 1 aufhören soll, zu laden. Wird nur auf
manchen Laptops unterstützt.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette radeon-power-profile-on-ac
Taktgeschwindigkeitsstufe („Clock Speed Level“) für Radeon-Grafik. Zur
Auswahl stehen low (niedrig), mid (mittel), high (hoch), auto (automatisch),
default (Voreinstellung).

Die Vorgabe ist @samp{"high"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette radeon-power-profile-on-bat
Wie @code{radeon-power-ac}, aber für den BAT-Modus.

Die Vorgabe ist @samp{"low"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette radeon-dpm-state-on-ac
Methode für die dynamische Energieverwaltung („Dynamic Power Management“,
DPM) auf Radeon. Zur Auswahl stehen battery (Batterie), performance
(Leistung).

Die Vorgabe ist @samp{"performance"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette radeon-dpm-state-on-bat
Wie @code{radeon-dpm-state-ac}, aber für den BAT-Modus.

Die Vorgabe ist @samp{"battery"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette radeon-dpm-perf-level-on-ac
Leistungsstufe („Performance Level“) des Radeon-DPM@. Zur Auswahl stehen
auto (automatisch), low (niedrig), high (hoch).

Die Voreinstellung ist @samp{"auto"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette radeon-dpm-perf-level-on-bat
Wie @code{radeon-dpm-perf-ac}, aber für den BAT-Modus.

Die Voreinstellung ist @samp{"auto"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} An-Aus-Boolescher-Ausdruck wifi-pwr-on-ac?
WLAN-Stromsparmodus.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} An-Aus-Boolescher-Ausdruck wifi-pwr-on-bat?
Wie @code{wifi-power-ac?}, aber für den BAT-Modus.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Ja-Nein-Boolescher-Ausdruck wol-disable?
Rechnerstart nach Netzwerkanforderung („Wake on LAN“) deaktivieren.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Nichtnegative-ganze-Zahl sound-power-save-on-ac
Nach wie vielen Sekunden der Stromsparmodus für die Audioverarbeitung auf
Intel-HDA- und AC97-Geräten aktiviert wird. Ein Wert von 0 deaktiviert den
Stromsparmodus.

Die Vorgabe ist @samp{0}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Nichtnegative-ganze-Zahl sound-power-save-on-bat
Wie @code{sound-powersave-ac}, aber für den BAT-Modus.

Die Vorgabe ist @samp{1}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Ja-Nein-Boolescher-Ausdruck sound-power-save-controller?
Steuerungseinheit („Controller“) im Stromsparmodus auf Intel-HDA-Geräten
deaktivieren.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Boolescher-Ausdruck bay-poweroff-on-bat?
Optisches Laufwerk in einer UltraBay/MediaBay im BAT-Modus
aktivieren. Laufwerke können erneut gestartet werden, indem Sie den Hebel
zum Auswerfen lösen (und wieder einsetzen) oder, auf neueren Modellen, indem
Sie den Knopf zum Auswerfen des eingelegten Datenträgers drücken.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette bay-device
Name des Geräts für das optische Laufwerk, das gestartet werden soll.

Die Vorgabe ist @samp{"sr0"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette runtime-pm-on-ac
Laufzeitenergieverwaltung („Runtime Power Management“) von
PCI(e)-Bus-Geräten. Zur Auswahl stehen on (angeschaltet) und auto
(automatisch).

Die Vorgabe ist @samp{"on"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Zeichenkette runtime-pm-on-bat
Wie @code{runtime-pm-ac}, aber für den BAT-Modus.

Die Voreinstellung ist @samp{"auto"}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Boolescher-Ausdruck runtime-pm-all?
Runtime Power Management for all PCI(e) bus devices, except blacklisted
ones.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Leerzeichengetrennte-Zeichenketten-Liste runtime-pm-blacklist
Die angegebenen PCI(e)-Geräteadressen von der Laufzeitenergieverwaltung
(„Runtime Power Management“) ausnehmen.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Leerzeichengetrennte-Zeichenketten-Liste runtime-pm-driver-blacklist
PCI(e)-Geräte von der Laufzeitenergieverwaltung („Runtime Power Management“)
ausnehmen, wenn sie den angegebenen Treibern zugeordnet sind.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Boolescher-Ausdruck usb-autosuspend?
USB-Geräte automatisch in den Ruhezustand versetzen („USB-Autosuspend“).

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Zeichenkette usb-blacklist
Die angegebenen Geräte vom USB-Autosuspend ausnehmen.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Boolescher-Ausdruck usb-blacklist-wwan?
WWAN-Geräte vom USB-Autosuspend ausnehmen.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Zeichenkette usb-whitelist
Für die angegebenen Geräte USB-Autosuspend aktivieren, selbst wenn
Autosuspend durch den Treiber oder wegen @code{usb-blacklist-wwan?}
deaktiviert werden würde.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Vielleicht-Boolescher-Ausdruck usb-autosuspend-disable-on-shutdown?
USB-Autosuspend vor dem Herunterfahren aktivieren.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{tlp-configuration}-Parameter} Boolescher-Ausdruck restore-device-state-on-startup?
Zustand von funkfähigen Geräten (Bluetooth, WLAN, WWAN) vom letzten
Herunterfahren beim Hochfahren des Systems wiederherstellen.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{tlp-configuration} parameter} string cpu-energy-perf-policy-on-ac
Set CPU energy/performance policy when on AC mode.  Possible values, in
order of increasing power saving, are performance, balance_performance,
default, balance_power and power.

@end deftypevr

@deftypevr {@code{tlp-configuration} parameter} string cpu-energy-perf-policy-on-bat
Set CPU energy/performance policy when on BAT mode.  Possible values, in
order of increasing power saving, are performance, balance_performance,
default, balance_power and power.

@end deftypevr

@cindex thermald
@cindex CPU-Frequenzskalierung mit Thermald
@subsubheading Thermald-Daemon

Das Modul @code{(gnu services pm)} stellt eine Schnittstelle zu Thermald zur
Verfügung, einem Dienst zur CPU-Frequenzskalierung („CPU Frequency
Scaling“), mit dem Überhitzung verhindert wird.

@defvar thermald-service-type
Dies ist der Diensttyp für @uref{https://01.org/linux-thermal-daemon/,
Thermald}, den @dfn{Linux Thermal Daemon}, der für die Hitzeregulierung von
Prozessoren zuständig ist. Er ändert deren thermischen Zustand („Thermal
State“) und verhindert, dass sie überhitzen.
@end defvar

@deftp {Datentyp} thermald-configuration
Datentyp, der die Konfiguration des @code{thermald-service-type}
repräsentiert.

@table @asis
@item @code{adaptive?} (Vorgabe: @code{#f})
Die sich anpassenden Tabellen aus @acronym{DPTF, Dynamic Power and Thermal
Framework} benutzen, falls vorhanden.

@item @code{ignore-cpuid-check?} (Vorgabe: @code{#f})
Ergebnis der Prüfung per CPUID auf unterstützte Prozessormodelle ignorieren.

@item @code{thermald} (Vorgabe: @var{thermald})
Paketobjekt von thermald.

@cindex PowerTOP
@cindex power consumption tuning with PowerTOP
@subsubheading PowerTOP

The @code{(gnu services pm)} module also provides a service definition for
@uref{https://01.org/powertop/, PowerTOP}, a power consumption analysis and
tuning tool.  When started, it tunes Linux kernel settings to reduce power
consumption.

@defvar powertop-service-type
The service type for PowerTOP.  No configuration is necessary.  When the
service starts, it executes @code{powertop --auto-tune}.

@lisp
(service powertop-service-type)
@end lisp
@end defvar

Available @code{powertop-configuration} fields are:

@deftypevr {@code{powertop-configuration} parameter} package powertop
The PowerTOP package.  Defaults to @code{powertop} in the @code{(gnu
packages linux)} module

@end deftypevr

@end table
@end deftp

The @code{(gnu services power)} module provides a service definition for
@uref{http://www.apcupsd.org/, apcupsd}, a utility to interact with
@acronym{APC, APC by Schneider Electric or formerly American Power
Conversion Corporation} @acronym{UPS, Uninterruptible Power Supply}
devices.  Apcupsd also works with some @acronym{OEM, Original Equipment
Manufacturer}-branded products manufactured by APC.

@defvar apcupsd-service-type
The service type for apcupsd.  For USB UPSes no configuration is necessary,
however tweaking some fields to better suit your needs might be desirable.
The defaults are taken from the upstream configuration and they are not very
conservative (for example, the default @code{battery-level} of 5% may be
considered too low by some).

The default event handlers do send emails, read more in
@ref{apcupsd-event-handlers}.

@lisp
(service apcupsd-service-type)
@end lisp
@end defvar

@deftp {Data Type} apcupsd-configuration

Available @code{apcupsd-configuration} fields are:

@table @asis
@item @code{apcupsd} (default: @code{apcupsd}) (type: package)
The @code{apcupsd} package to use.

@item @code{shepherd-service-name} (default: @code{apcupsd}) (type: symbol)
The name of the shepherd service.  You can add the service multiple times
with different names to manage multiple UPSes.

@item @code{auto-start?} (default: @code{#t}) (type: boolean)
Should the shepherd service auto-start?

@item @code{pid-file} (default: @code{"/var/run/apcupsd.pid"}) (type: string)
The file name of the pid file.

@item @code{debug-level} (default: @code{0}) (type: integer)
The logging verbosity.  Bigger number means more logs.  The source code uses
up to @code{300} as debug level value, so a value of @code{999} seems
reasonable to enable all the logs.

@item @code{run-dir} (default: @code{"/var/run/apcupsd"}) (type: string)
The directory containing runtime information.  You need to change this if
you desire to run multiple instances of the daemon.

@item @code{name} (Typ: Vielleicht-Zeichenkette)
Use this to give your UPS a name in log files and such.  This is
particularly useful if you have multiple UPSes.  This does not set the
EEPROM.  It should be 8 characters or less.

@item @code{cable} (default: @code{usb}) (type: enum-cable)
The type of a cable connecting the UPS to your computer.  Possible generic
choices are @code{'simple}, @code{'smart}, @code{'ether} and @code{'usb}.

Alternatively, a specific cable model number may be used: @code{'940-0119A},
@code{'940-0127A}, @code{'940-0128A}, @code{'940-0020B}, @code{'940-0020C},
@code{'940-0023A}, @code{'940-0024B}, @code{'940-0024C}, @code{'940-1524C},
@code{'940-0024G}, @code{'940-0095A}, @code{'940-0095B}, @code{'940-0095C},
@code{'940-0625A}, @code{'M-04-02-2000}.

@item @code{type} (default: @code{usb}) (type: enum-type)
The type of the UPS you have.

@table @code
@item apcsmart
Newer serial character device, appropriate for SmartUPS models using a
serial cable (not an USB).

@item usb
Most new UPSes are an USB.

@item net
Network link to a master apcupsd through apcupsd's Network Information
Server.  This is used if the UPS powering your computer is connected to a
different computer for monitoring.

@item snmp
SNMP network link to an SNMP-enabled UPS device.

@item netsnmp
Same as the SNMP above but requires use of the net-snmp library.  Unless you
have a specific need for this old driver, you should use the @code{'snmp}
instead.

@item dumb
An old serial character device for use with simple-signaling UPSes.

@item pcnet
A PowerChute Network Shutdown protocol which can be used as an alternative
to an SNMP with the AP9617 family of smart slot cards.

@item modbus
A serial device for use with newest SmartUPS models supporting the MODBUS
protocol.

@end table

@item @code{device} (default: @code{""}) (type: string)
For USB UPSes, usually you want to set this to an empty string (the
default).  For other UPS types, you must specify an appropriate port or
address.

@table @code
@item apcsmart
Set to the appropriate @file{/dev/tty**} device.

@item usb
A null string setting enables auto-detection, which is the best choice for
most installations.

@item net
Set to @code{@var{hostname}:@var{port}}.

@item snmp
Set to @code{@var{hostname}:@var{port}:@var{vendor}:@var{community}}.  The
@var{hostname} is the ip address or hostname of the UPS on the network.  The
@var{vendor} can be can be "APC" or "APC_NOTRAP".  "APC_NOTRAP" will disable
SNMP trap catching; you usually want "APC".  The @var{port} is usually 161.
The @var{community} is usually "private".

@item netsnmp
Same as the @code{'snmp}.

@item dumb
Set to the appropriate @file{/dev/tty**} device.

@item pcnet
Set to @code{@var{ipaddr}:@var{username}:@var{passphrase}:@var{port}}.  The
@var{ipaddr} is the IP address of the UPS management card.  The
@var{username} and the @var{passphrase} are the credentials for which the
card has been configured.  The @var{port} is the port number on which to
listen for messages from the UPS, normally 3052.  If this parameter is empty
or missing, the default of 3052 will be used.

@item modbus
Set to the appropriate @file{/dev/tty**} device.  You can also leave it
empty for MODBUS over USB or set to the serial number of the UPS.

@end table

@item @code{poll-time} (default: @code{60}) (type: integer)
The interval (in seconds) at which apcupsd polls the UPS for status.  This
setting applies both to directly-attached UPSes (apcsmart, usb, dumb) and
networked UPSes (net, snmp).  Lowering this setting will improve the
apcupsd's responsiveness to certain events at the cost of higher CPU
utilization.

@item @code{on-batery-delay} (default: @code{6}) (type: integer)
The time in seconds from when a power failure is detected until we react to
it with an onbattery event.  The @code{'powerout} event will be triggered
immediately when a power failure is detected.  However, the
@code{'onbattery} event will be trigger only after this delay.

@item @code{battery-level} (default: @code{5}) (type: integer)
If during a power failure, the remaining battery percentage (as reported by
the UPS) is below or equal to this value, the apcupsd will initiate a system
shutdown.

@quotation Anmerkung
@code{battery-level}, @code{remaining-minutes}, and @code{timeout} work in a
conjunction, so the first that occurs will cause the initiation of a
shutdown.
@end quotation

@item @code{remaining-minutes} (default: @code{3}) (type: integer)
If during a power failure, the remaining runtime in minutes (as calculated
internally by the UPS) is below or equal to this value, apcupsd will
initiate a system shutdown.

@quotation Anmerkung
@code{battery-level}, @code{remaining-minutes}, and @code{timeout} work in a
conjunction, so the first that occurs will cause the initiation of a
shutdown.
@end quotation

@item @code{timeout} (default: @code{0}) (type: integer)
If during a power failure, the UPS has run on batteries for this many
seconds or longer, apcupsd will initiate a system shutdown.  The value of 0
disables this timer.

@quotation Anmerkung
@code{battery-level}, @code{remaining-minutes}, and @code{timeout} work in a
conjunction, so the first that occurs will cause the initiation of a
shutdown.
@end quotation

@item @code{annoy-interval} (default: @code{300}) (type: integer)
The time in seconds between annoying users (via the @code{'annoyme} event)
to sign off prior to system shutdown.  0 disables.

@item @code{annoy-delay} (default: @code{60}) (type: integer)
The initial delay in seconds after a power failure before warning users to
get off the system.

@item @code{no-logon} (default: @code{disable}) (type: enum-no-logon)
The condition which determines when users are prevented from logging in
during a power failure.

@item @code{kill-delay} (default: @code{0}) (type: integer)
If this is non-zero, the apcupsd will continue running after a shutdown has
been requested, and after the specified time in seconds attempt to kill the
power.  This is for use on systems where apcupsd cannot regain control after
a shutdown.

@item @code{net-server} (default: @code{#f}) (type: boolean)
If enabled, a network information server process will be started.

@item @code{net-server-ip} (default: @code{"127.0.0.1"}) (type: string)
An IP address on which the NIS server will listen for incoming connections.

@item @code{net-server-port} (default: @code{3551}) (type: integer)
An IP port on which the NIS server will listen for incoming connections.

@item @code{net-server-events-file} (type: maybe-string)
If you want the last few EVENTS to be available over the network by the
network information server, you must set this to a file name.

@item @code{net-server-events-file-max-size} (default: @code{10}) (type: integer)
The maximum size of the events file in kilobytes.

@item @code{class} (default: @code{standalone}) (type: enum-class)
Normally standalone unless you share an UPS using an APC ShareUPS card.

@item @code{mode} (default: @code{disable}) (type: enum-mode)
Normally disable unless you share an UPS using an APC ShareUPS card.

@item @code{stat-time} (default: @code{0}) (type: integer)
The time interval in seconds between writing the status file, 0 disables.

@item @code{log-stats} (default: @code{#f}) (type: boolean)
Also write the stats as a logs.  This generates a lot of output.

@item @code{data-time} (default: @code{0}) (type: integer)
The time interval in seconds between writing the data records to the log
file, 0 disables.

@item @code{facility} (type: maybe-string)
The logging facility for the syslog.

@item @code{event-handlers} (type: apcupsd-event-handlers)
Handlers for events produced by apcupsd.

@end table
@end deftp

@anchor{apcupsd-event-handlers}
@deftp {Data Type} apcupsd-event-handlers

For a description of the events please refer to @samp{man 8 apccontrol}.

Each handler shall be a gexp.  It is spliced into the control script for the
daemon.  In addition to the standard Guile programming environment, the
following procedures and variables are also available:

@table @code
@item conf
Variable containing the file name of the configuration file.

@item powerfail-file
Variable containing the file name of the powerfail file.

@item cmd
The event currently being handled.

@item name
The name of the UPS as specified in the configuration file.

@item connected?
Is @code{#t} if @command{apcupsd} is connected to the UPS via a serial port
(or a USB port).  In most configurations, this will be the case.  In the
case of a Slave machine where apcupsd is not directly connected to the UPS,
this value will be @code{#f}.

@item powered?
Is @code{#t} if the computer on which @command{apcupsd} is running is
powered by the UPS and @code{#f} if not.  At the moment, this value is
unimplemented and always @code{#f}.

@item (err @var{fmt} @var{args...})
Wrapper around @code{format} outputting to @code{(current-error-port)}.

@item (wall @var{fmt} @var{args...})
Wrapper around @code{format} outputting via @command{wall}.

@item (apcupsd @var{args...})
Call @command{apcupsd} while passing the correct configuration file and all
the arguments.

@item (mail-to-root @var{subject} @var{body})
Send an email to the local administrator.  This procedure assumes the
@command{sendmail} is located at @command{/run/privileged/bin/sendmail} (as
would be the case with @code{opensmtpd-service-type}).

@end table

Available @code{apcupsd-event-handlers} fields are:

@table @asis
@item @code{modules} (type: gexp)
Additional modules to import into the generated handler script.

@item @code{killpower} (type: gexp)
The handler for the killpower event.

@item @code{commfailure} (type: gexp)
The handler for the commfailure event.

@item @code{commok} (type: gexp)
The handler for the commfailure event.

@item @code{powerout} (type: gexp)
The handler for the powerout event.

@item @code{onbattery} (type: gexp)
The handler for the onbattery event.

@item @code{offbattery} (type: gexp)
The handler for the offbattery event.

@item @code{mainsback} (type: gexp)
The handler for the mainsback event.

@item @code{failing} (type: gexp)
The handler for the failing event.

@item @code{timeout} (type: gexp)
The handler for the timeout event.

@item @code{loadlimit} (type: gexp)
The handler for the loadlimit event.

@item @code{runlimit} (type: gexp)
The handler for the runlimit event.

@item @code{doreboot} (type: gexp)
The handler for the doreboot event.

@item @code{doshutdown} (type: gexp)
The handler for the doshutdown event.

@item @code{annoyme} (type: gexp)
The handler for the annoyme event.

@item @code{emergency} (type: gexp)
The handler for the emergency event.

@item @code{changeme} (type: gexp)
The handler for the changeme event.

@item @code{remotedown} (type: gexp)
The handler for the remotedown event.

@item @code{startselftest} (type: gexp)
The handler for the startselftest event.

@item @code{endselftest} (type: gexp)
The handler for the endselftest event.

@item @code{battdetach} (type: gexp)
The handler for the battdetach event.

@item @code{battattach} (type: gexp)
The handler for the battattach event.

@end table
@end deftp

@node Audio-Dienste
@subsection Audio-Dienste

Das Modul @code{(gnu services audio)} stellt einen Dienst zur Verfügung, um
MPD (den Music Player Daemon) zu starten.

@cindex mpd
@subsubheading Music Player Daemon

Der Music Player Daemon (MPD) ist ein Dienst, der Musik abspielen kann und
der dabei vom lokalen Rechner oder über das Netzwerk durch verschiedene
Clients angesteuert werden kann.

Das folgende Beispiel zeigt die einfachstmögliche Konfiguration, wie man
eine Musiksammlung in @file{/srv/music} mit einem unter dem vorgegebenen
Benutzer @samp{mpd} laufenden @command{mpd} anbieten kann. Dabei wird
PulseAudio zur Ausgabe verwendet. Der Benutzer startet einen eigenen
PulseAudio-Daemon, der mit dem normalen Benutzerkonto um die Soundkarte
konkurrieren kann. Dann kann es notwendig sein, die Wiedergabe anderer
Audio-Anwendungen abzubrechen, um die Ausgabe von MPD zu hören, und
andersherum.

@lisp
(service mpd-service-type
         (mpd-configuration
          (music-directory "/srv/music")))
@end lisp

@quotation Wichtig
Auf das als @code{music-directory} angegebene Verzeichnis muss der
MPD-Benutzer, vorgegeben ist @samp{mpd}, Lesezugriff haben. Wenn
Berechtigungen fehlen, findet man Fehlermeldungen @samp{Permission denied}
in den MPD-Protokollen, die sich nach Vorgabe in @file{/var/log/messages}
befinden.
@end quotation

Die meisten MPD-Clients lösen eine Aktualisierung der Datenbank aus, wenn
sie eine Verbindung aufbauen, aber Sie können sie auch selbst mit der
@code{update}-Aktion auslösen:

@example
herd update mpd
@end example

Alle MPD-Konfigurationsfelder werden nun beschrieben; danach folgt ein
komplexeres Beispiel.

@defvar mpd-service-type
Der Diensttyp für @command{mpd}.
@end defvar

@c %start of fragment
@deftp {Datentyp} mpd-configuration
Verfügbare @code{mpd-configuration}-Felder sind:

@table @asis
@item @code{package} (Vorgabe: @code{mpd}) (Typ: dateiartig)
Das MPD-Paket.

@item @code{user} (Typ: Benutzerkonto)
Das Benutzerkonto, mit dem mpd ausgeführt wird.

@item @code{group} (Typ: Benutzergruppe)
Die Benutzergruppe, mit der mpd ausgeführt wird.

Vorgegeben ist @code{%mpd-group}, was für eine System-Benutzergruppe mit
Namen „mpd“ steht.

@item @code{shepherd-requirement} (Vorgabe: @code{'()}) (Typ: Liste-von-Symbolen)
Eine Liste von Symbolen, die Shepherd-Dienste angeben, von welchen dieser
Dienst abhängen soll.

@item @code{environment-variables} (Vorgabe: @code{'("PULSE_CLIENTCONFIG=/etc/pulse/client.conf" "PULSE_CONFIG=/etc/pulse/daemon.conf")}) (Typ: Liste-von-Zeichenketten)
Eine Liste von Zeichenketten, die Umgebungsvariable festlegen.

@item @code{log-file} (Typ: Vielleicht-Zeichenkette)
Der Ort, wo die Protokolldatei gespeichert werden soll. Wenn Sie hier nichts
angeben, werden Protokolle an den lokal laufenden syslog-Daemon
geschickt. Sie können auch einen Dateinamen angeben, zum Beispiel
@file{/var/log/mpd.log}.

@item @code{log-level} (Typ: Vielleicht-Zeichenkette)
Unterhalb welchen Schwellwerts @emph{keine} Nachrichten protokolliert werden
sollen. Zur Auswahl stehen, absteigend sortiert nach der Ausführlichkeit:
@code{verbose} (ausführliche Warnmeldungen), @code{info} (Informationen),
@code{notice} (Benachrichtigungen), @code{warning} (Warnmeldungen) und
@code{error} (nur Fehler).

@item @code{music-directory} (Typ: Vielleicht-Zeichenkette)
Das Verzeichis, in dem nach Musikdateien gesucht wird.

@item @code{music-dir} (Typ: Vielleicht-Zeichenkette)
Das Verzeichis, in dem nach Musikdateien gesucht wird.

@item @code{playlist-directory} (Typ: Vielleicht-Zeichenkette)
Das Verzeichnis, um Wiedergabelisten („Playlists“) zu speichern.

@item @code{playlist-dir} (Typ: Vielleicht-Zeichenkette)
Das Verzeichnis, um Wiedergabelisten („Playlists“) zu speichern.

@item @code{db-file} (Typ: Vielleicht-Zeichenkette)
Der Ort, an dem die Musikdatenbank gespeichert wird. Wenn nichts angegeben
wird, wird @file{~/.cache/db} benutzt.

@item @code{state-file} (Typ: Vielleicht-Zeichenkette)
Der Ort, an dem die Datei mit dem aktuellen Zustand von MPD gespeichert
wird.

@item @code{sticker-file} (Typ: Vielleicht-Zeichenkette)
Der Ort, an dem die Sticker-Datenbank gespeichert wird.

@item @code{default-port} (Vorgabe: @code{6600}) (Typ: Vielleicht-Port)
Was die Voreinstellung dafür sein soll, auf welchem Port mpd ausgeführt
wird.

@item @code{endpoints} (Typ: Vielleicht-Liste-von-Zeichenketten)
Die Adressen, an die sich mpd binden wird. Sie können dabei auch einen Port
angeben, um einen anderen Port als den voreingestellten @var{default-port}
zu benutzen, etwa @code{localhost:6602}, und wenn Sie IPv6-Adressen angeben,
müssen Sie außen herum eckige Klammern schreiben, um den Port angeben zu
können. Um einen Unix-Socket zu benutzen, würden Sie hier einen absoluten
Pfad angeben oder einen Pfad, der mit @code{~} beginnt, angeben.

@item @code{address} (Typ: Vielleicht-Zeichenkette)
Die Adresse, an die sich mpd binden wird. Um einen Unix-Socket zu benutzen,
kann hier ein absoluter Pfad angegeben werden.

@item @code{database} (Typ: Vielleicht-„mpd-plugin“)
Eine Konfiguration eines MPD-Datenbank-Plugins.

@item @code{partitions} (Vorgabe: @code{'()}) (Typ: Liste-von-„mpd-partition“)
Liste von MPD-Partitionen.

@item @code{neighbors} (Vorgabe: @code{'()}) (Typ: Liste-von-„mpd-plugin“)
Liste von Konfigurationen von MPD-Neighbor-Plugins.

@item @code{inputs} (Vorgabe: @code{'()}) (Typ: Liste-von-„mpd-plugin“)
Liste von Konfigurationen von MPD-Eingaben-Plugins.

@item @code{archive-plugins} (Vorgabe: @code{'()}) (Typ: Liste-von-„mpd-plugin“)
Liste von Konfigurationen von MPD-Archiv-Plugins.

@item @code{auto-update?} (Typ: Vielleicht-Boolescher-Ausdruck)
Ob die Musikdatenbank automatisch aktualisiert werden soll, wenn Änderungen
an Dateien in @var{music-directory} festgestellt werden.

@item @code{input-cache-size} (Typ: Vielleicht-Zeichenkette)
Größe von MPDs Zwischenspeicherung der Eingabe.

@item @code{decoders} (Vorgabe: @code{'()}) (Typ: Liste-von-„mpd-plugin“)
Liste von Konfigurationen von MPD-Decoder-Plugins.

@item @code{resampler} (Typ: Vielleicht-„mpd-plugin“)
Eine Konfiguration eines MPD-Resampler-Plugins.

@item @code{filters} (Vorgabe: @code{'()}) (Typ: Liste-von-„mpd-plugin“)
Liste von Konfigurationen von MPD-Filter-Plugins.

@item @code{outputs} (Typ: Liste-von-„mpd-plugin“-oder-von-„mpd-output“)
Welche Tonausgaben MPD benutzen kann. Vorgegeben ist eine einzelne Ausgabe,
die Pulseaudio benutzt.

@item @code{playlist-plugins} (Vorgabe: @code{'()}) (Typ: Liste-von-„mpd-plugin“)
Liste von Konfigurationen von MPD-Plugins für Wiedergabelisten (Playlists).

@item @code{extra-options} (Vorgabe: @code{'()}) (Typ: Assoziative-Liste)
Eine assoziative Liste, die Optionssymbole oder Zeichenketten auf
Zeichenketten abbildet. Sie wird an die Konfiguration angehängt.

@end table
@end deftp
@c %end of fragment

@deftp {Datentyp} mpd-plugin
Datentyp, der ein Plugin für @command{mpd} repräsentiert.

@table @asis
@item @code{plugin} (Typ: Vielleicht-Zeichenkette)
Plugin-Name.

@item @code{name} (Typ: Vielleicht-Zeichenkette)
Name.

@item @code{enabled?} (Typ: Vielleicht-Boolescher-Ausdruck)
Gibt an, ob das Plugin aktiviert ist oder nicht.

@item @code{extra-options} (Vorgabe: @code{'()}) (Typ: Assoziative-Liste)
Eine assoziative Liste, die Optionssymbole oder Zeichenketten auf
Zeichenketten abbildet. Sie wird an die Plugin-Konfiguration
angehängt. Siehe die
@uref{https://mpd.readthedocs.io/en/latest/plugins.html,MPD plugin
reference} für eine Liste, welche Optionen es gibt.

@end table
@end deftp

@deftp {Datentyp} mpd-partition
Datentyp, der eine Partition von @command{mpd} repräsentiert.

@table @asis
@item @code{name} (Typ: Zeichenkette)
Name der Partition.

@item @code{extra-options} (Vorgabe: @code{'()}) (Typ: Assoziative-Liste)
Eine assoziative Liste, die Optionssymbole oder Zeichenketten auf
Zeichenketten abbildet. Sie wird an die Plugin-Konfiguration
angehängt. Siehe die
@uref{https://mpd.readthedocs.io/en/latest/user.html#configuring-partitions,Configuring
Partitions} für eine Liste, welche Optionen bei Partitionen möglich sind.

@end table
@end deftp

@c %start of fragment
@deftp {Datentyp} mpd-output
Verfügbare @code{mpd-output}-Felder sind:

@table @asis
@item @code{name} (Vorgabe: @code{"MPD"}) (Typ: Zeichenkette)
Der Name der Tonausgabe.

@item @code{type} (Vorgabe: @code{"pulse"}) (Typ: Zeichenkette)
Der Typ der Tonausgabe.

@item @code{enabled?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Gibt an, ob diese Tonausgabe aktiviert sein soll, wenn MPD gestartet
wird. Vorgegeben ist, alle Tonausgaben zu aktivieren. Das entspricht der
Voreinstellung, wenn keine Zustandsdatei existiert; mit Zustandsdatei wird
der Zustand von früher wiederhergestellt.

@item @code{format} (Typ: Vielleicht-Zeichenkette)
Erzwingt ein bestimmtes Tonformat für die Ausgabe. Siehe
@uref{https://mpd.readthedocs.io/en/latest/user.html#audio-output-format,Global
Audio Format} für eine genauere Beschreibung.

@item @code{tags?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Wenn es auf @code{#f} steht, sendet MPD keine Tags an diese Ausgabe. Dies
wird nur berücksichtigt, wenn das Ausgabe-Plugin Tags empfangen kann, wie
beim @code{httpd}-Ausgabe-Plugin.

@item @code{always-on?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Wenn es auf @code{#t} steht, versucht MPD, diese Tonausgabe immer offen zu
lassen. Das kann bei Streaming-Servern helfen, wo man @emph{nicht} will,
dass die Verbindung zu allen Zuhörern abbricht, nur weil das Abspielen aus
irgendeinem Grund angehalten wurde.

@item @code{mixer-type} (Typ: Vielleicht-Zeichenkette)
Für dieses Feld wird eine Zeichenkette akzeptiert, die das für diese
Tonausgabe zu benutzende Mischpult („Mixer“) bezeichnet. Zur Wahl stehen das
@code{hardware}-Mischpult, das @code{software}-Mischpult, das
@code{null}-Mischpult oder kein Mischpult (@code{none}). Mit dem
@code{null}-Mischpult kann die Lautstärke eingestellt werden, aber ohne
Auswirkung; das kann als Trick benutzt werden, um ein externes Mischpult zu
implementieren. Wenn nichts angegeben wird, wird das
@code{hardware}-Mischpult benutzt, wenn es vom Gerät unterstützt wird.

@item @code{replay-gain-handler} (Typ: Vielleicht-Zeichenkette)
Für dieses Feld wird eine Zeichenkette akzeptiert, die die anzuwendende
@uref{https://mpd.readthedocs.io/en/latest/user.html#replay-gain,Wiedergabe-Verstärkung}
benennt. Bei @code{software} wird eine interne Lautstärkeregelung in
Software verwendet, bei @code{mixer} wird die externe Hardware verwendet,
die konfiguriert ist, und bei @code{none} findet auf dieser Ausgabe keine
Wiedergabe-Verstärkung statt.

@item @code{extra-options} (Vorgabe: @code{'()}) (Typ: Assoziative-Liste)
Eine assoziative Liste, die Optionssymbole oder Zeichenketten auf
Zeichenketten abbildet. Sie wird an die Tonausgabenkonfiguration angehängt.

@end table
@end deftp
@c %end of fragment

Das folgende Beispiel zeigt eine Konfiguration von @code{mpd}, die einige
Plugins konfiguriert und eine HTTP-Audiostreaming-Tonausgabe anbietet.

@lisp
(service mpd-service-type
         (mpd-configuration
           (outputs
             (list (mpd-output
                     (name "streaming")
                     (type "httpd")
                     (mixer-type 'null)
                     (extra-options
                      `((encoder . "vorbis")
                        (port    . "8080"))))))
           (decoders
             (list (mpd-plugin
                     (plugin "mikmod")
                     (enabled? #f))
                   (mpd-plugin
                     (plugin "openmpt")
                     (enabled? #t)
                     (extra-options `((repeat-count . -1)
                                      (interpolation-filter . 1))))))
           (resampler (mpd-plugin
                        (plugin "libsamplerate")
                        (extra-options `((type . 0)))))))
@end lisp

@subsubheading myMPD

@cindex MPD, Weboberfläche
@cindex myMPD-Dienst

@uref{https://jcorporation.github.io/myMPD/, myMPD} ist eine für Mobilgeräte
geeignete Oberfläche für MPD auf einem Webserver.

Folgendes Beispiel zeigt eine Instanz von myMPD, die auf Port 80 lauscht,
wobei Albenbilder @emph{nicht} zwischengespeichert werden.

@lisp
(service mympd-service-type
         (mympd-configuration
          (port 80)
          (covercache-ttl 0)))
@end lisp

@defvar mympd-service-type
Der Diensttyp für @command{mympd}.
@end defvar

@c %start of fragment
@deftp {Datentyp} mympd-configuration
Verfügbare @code{mympd-configuration}-Felder sind:

@table @asis
@item @code{package} (Vorgabe: @code{mympd}) (Typ: dateiartig)
Das Paketobjekt von myMPD.

@item @code{shepherd-requirement} (Vorgabe: @code{'()}) (Typ: Liste-von-Symbolen)
Eine Liste von Symbolen, die andere Shepherd-Dienste angeben, von denen
dieser Dienst abhängen soll.

@item @code{user} (Vorgabe: @code{%mympd-user}) (Typ: Benutzerkonto)
Das Benutzerkonto, dem der @code{mympd}-Prozess gehören soll.

Vorgegeben ist @code{%mympd-user}, was für ein System-Benutzerkonto mit
Namen „mympd“ steht, das Mitglied der Benutzergruppe @var{group} ist (siehe
unten).

@item @code{group} (Vorgabe: @code{%mympd-group}) (Typ: Benutzergruppe)
Gruppe des Besitzers des @code{mympd}-Prozesses.

Vorgegeben ist @code{%mympd-group}, was für eine System-Benutzergruppe mit
Namen „mympd“ steht.
@item @code{work-directory} (Vorgabe: @code{"/var/lib/mympd"}) (Typ: Zeichenkette)
Wo die Daten von myMPD gespeichert werden sollen.

@item @code{cache-directory} (Vorgabe: @code{"/var/cache/mympd"}) (Typ: Zeichenkette)
Wo der Zwischenspeicher von myMPD gespeichert werden soll.

@item @code{acl} (Typ: Vielleicht-„mympd-ip-acl“)
Zugriffssteuerungsliste (ACL), welche Rechner auf den myMPD-Webserver
zugreifen dürfen.

@item @code{covercache-ttl} (Vorgabe: @code{31}) (Typ: Vielleicht-Ganze-Zahl)
Wie lange Albenbilder zwischengespeichert werden. Bei @code{0} werden
Albenbilder @emph{nicht} zwischengespeichert.

@item @code{http?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
HTTP-Unterstützung.

@item @code{host} (Vorgabe: @code{"[::]"}) (Typ: Zeichenkette)
Rechnername, auf dem gelauscht werden soll.

@item @code{port} (Vorgabe: @code{80}) (Typ: Vielleicht-Zahl)
Auf welchen HTTP-Port gelauscht werden soll.

@item @code{log-level} (Vorgabe: @code{5}) (Typ: Ganze-Zahl)
Wie detailliert die Protokolle sein sollen. Möglich sind Werte von @code{0}
bis @code{7}.

@item @code{log-to} (Typ: Vielleicht-Zeichenkette)
Wohin Protokolle geschickt werden. Wenn nichts angegeben wird, werden
Protokolle beim lokal laufenden Syslog-Dienst unter der Syslog-Einrichtung
(Facility) @samp{daemon} eingeordnet. Sie können auch einen Dateinamen
angeben, zum Beispiel @file{/var/log/mympd.log}.

@item @code{lualibs} (Vorgabe: @code{"all"}) (Typ: Vielleicht-Zeichenkette)
Siehe
@uref{https://jcorporation.github.io/myMPD/scripting/#lua-standard-libraries}.

@item @code{uri} (Typ: Vielleicht-Zeichenkette)
Eine andere URI für myMPD vorgeben. Siehe
@uref{https://github.com/jcorporation/myMPD/issues/950}.

@item @code{script-acl} (Vorgabe: @code{(mympd-ip-acl (allow '("127.0.0.1")))}) (Typ: Vielleicht-„mympd-ip-acl“)
Zugriffssteuerungsliste (ACL), welche Rechner auf die
Scripting-Schnittstelle zugreifen dürfen.

@item @code{ssl?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
SSL/TLS-Unterstützung.

@item @code{ssl-port} (Vorgabe: @code{443}) (Typ: Vielleicht-Port)
Port, auf dem auf HTTPS gelauscht wird.

@item @code{ssl-cert} (Typ: Vielleicht-Zeichenkette)
Pfad zum PEM-kodierten X.509-SSL/TLS-Zertifikat (der öffentliche Schlüssel).

@item @code{ssl-key} (Typ: Vielleicht-Zeichenkette)
Pfad zum PEM-kodierten privaten Schlüssel für SSL/TLS.

@item @code{pin-hash} (Typ: Vielleicht-Zeichenkette)
Mit SHA-256 gehashte PIN, die durch myMPD vom Benutzer angefordert wird,
wenn der Benutzer auf Einstellungen zugreifen möchte.

@item @code{save-caches?} (Typ: Vielleicht-Boolescher-Ausdruck)
Ob Zwischenspeicher erhalten werden, wenn der Dienst neu gestartet wird.

@end table
@end deftp
@c %end of fragment

@c %start of fragment
@deftp {Datentyp} mympd-ip-acl
Verfügbare @code{mympd-ip-acl}-Felder sind:

@table @asis
@item @code{allow} (Vorgabe: @code{'()}) (Typ: Liste-von-Zeichenketten)
Zugelassene IP-Adressen.

@item @code{deny} (Vorgabe: @code{'()}) (Typ: Liste-von-Zeichenketten)
Verbotene IP-Adressen.

@end table
@end deftp
@c %end of fragment

@node Virtualisierungsdienste
@subsection Virtualisierungsdienste

Das Modul @code{(gnu services virtualization)} bietet Dienste für die
Daemons von libvirt und virtlog, sowie andere virtualisierungsbezogene
Dienste.

@subsubheading Libvirt-Daemon

@code{libvirtd} ist die serverseitige Daemon-Komponente des libvirt-Systems
zur Virtualisierungsverwaltung. Dieser Daemon läuft auf als Wirt dienenden
Servern und führt anfallende Verwaltungsaufgaben für virtualisierte Gäste
durch. Damit sich ein „unprivilegierter“ Benutzer ohne besondere
Berechtigungen mit dem libvirt-Daemon verbinden darf, muss er als Mitglied
der @samp{libvirt}-Benutzergruppe eingetragen werden, wie unten gezeigt.

@defvar libvirt-service-type
Dies ist der Diensttyp des @uref{https://libvirt.org, libvirt-Daemons}. Sein
Wert muss ein @code{libvirt-configuration}-Verbundsobjekt sein.

@lisp
(users (cons (user-account
              (name "benutzer")
              (group "users")
              (supplementary-groups '("libvirt"
                                      "audio" "video" "wheel")))
             %base-user-accounts))
(service libvirt-service-type
         (libvirt-configuration
          (tls-port "16555")))
@end lisp
@end defvar

@c Auto-generated with (configuration->documentation 'libvirt-configuration)
@c %start of fragment

@deftp {Data Type} libvirt-configuration
Verfügbare @code{libvirt-configuration}-Felder sind:

@table @asis
@item @code{libvirt} (default: @code{libvirt}) (type: file-like)
Libvirt-Paket.

@item @code{qemu} (default: @code{qemu}) (type: file-like)
Das QEMU-Paket, das benutzt werden soll.

@item @code{dmidecode} (default: @code{dmidecode}) (type: file-like)
The Dmidecode package to use.

@item @code{requirement} (default: @code{'()}) (type: list-of-symbols)
Shepherd services dependencies to the provisioned Shepherd service.

@item @code{firmwares} (default: @code{(ovmf-x86-64)}) (type: list-of-file-likes)
List of UEFI/BIOS firmware packages to make available.  Each firmware
package should contain a @file{share/qemu/firmware/@var{NAME}.json} QEMU
firmware metadata file.

@item @code{listen-tls?} (default: @code{#t}) (type: boolean)
Option zum Lauschen auf sichere TLS-Verbindungen über den öffentlichen
TCP/IP-Port. @code{listen} muss gesetzt sein, damit dies eine Wirkung
hat. Bevor Sie diese Funktionalität nutzen können, muss eine
Zertifikatsautorität eingerichtet worden sein und Server-Zertifikate
ausgestellt worden sein.

@item @code{listen-tcp?} (default: @code{#f}) (type: boolean)
Auf unverschlüsselte TCP-Verbindungen auf dem öffentlichen TCP/IP-Port
lauschen. @code{listen} muss gesetzt sein, damit dies eine Wirkung hat. Nach
Voreinstellung kann auf dem TCP-Socket nur gelauscht werden, wenn
SASL-Authentifizierung möglich ist. Nur solche SASL-Mechanismen, die
Datenverschlüsselung unterstützen, sind zugelassen. Das sind DIGEST_MD5 und
GSSAPI (Kerberos5).

@item @code{tls-port} (default: @code{"16514"}) (type: string)
Der Port, um sichere TLS-Verbindungen zu akzeptieren. Dies kann eine
Portnummer oder ein Dienstname sein.

@item @code{tcp-port} (default: @code{"16509"}) (type: string)
Der Port, um unsichere TCP-Verbindungen zu akzeptieren. Dies kann eine
Portnummer oder ein Dienstname sein.

@item @code{listen-addr} (default: @code{"0.0.0.0"}) (type: string)
IP-Adresse oder Rechnername („Hostname“), der für von Clients ausgehende
Verbindungen benutzt wird.

@item @code{mdns-adv?} (default: @code{#f}) (type: boolean)
Einstellung, ob der libvirt-Dienst mDNS-Mitteilungen sendet.

@item @code{mdns-name} (default: @code{"Virtualization Host terra"}) (type: string)
Der voreingestellte Name in mDNS-Mitteilungen. Er muss auf dem direkten
Broadcast-Netzwerk eindeutig sein.

@item @code{unix-sock-group} (default: @code{"libvirt"}) (type: string)
Besitzergruppe des UNIX-Sockets. Diese Einstellung kann benutzt werden, um
einer als vertrauenswürdig geltenden Gruppe von Benutzern Zugriff auf
Verwaltungsfunktionen zu gewähren, ohne dass diese als Administratornutzer
root ausgeführt werden müssen.

@item @code{unix-sock-ro-perms} (default: @code{"0777"}) (type: string)
UNIX-Socket-Berechtigungen für den Socket nur mit Lesezugriff („read
only“). Dies wird nur zur Überwachung des Zustands der VM benutzt.

@item @code{unix-sock-rw-perms} (default: @code{"0770"}) (type: string)
UNIX-Socket-Berechtigungen für den Socket mit Schreib- und Lesezugriff
(„read/write“). Nach Vorgabe kann nur der Administratornutzer root
zugreifen. Wenn auf dem Socket PolicyKit aktiviert ist, wird die Vorgabe
geändert, dass jeder zugreifen kann (z.B.@: zu @code{"0777"}).

@item @code{unix-sock-admin-perms} (default: @code{"0777"}) (type: string)
UNIX-Socket-Berechtigungen für den Administrator-Socket. Nach Vorgabg hat
nur der Besitzer (der Administratornutzer root) hierauf Zugriff; ändern Sie
es nur, wenn Sie sicher wissen, wer dann alles Zugriff bekommt.

@item @code{unix-sock-dir} (default: @code{"/var/run/libvirt"}) (type: string)
Das Verzeichnis, in dem Sockets gefunden werden können bzw. erstellt werden.

@item @code{auth-unix-ro} (default: @code{"polkit"}) (type: string)
Authentifizierungsschema für nur lesbare UNIX-Sockets. Nach Vorgabe
gestatten es die Socket-Berechtigungen jedem Nutzer, sich zu verbinden.

@item @code{auth-unix-rw} (default: @code{"polkit"}) (type: string)
Authentifizierungsschema für UNIX-Sockets mit Schreib- und Lesezugriff. Nach
Vorgabe erlauben die Socket-Berechtigungen nur dem Administratornutzer root
Zugriff. Wenn libvirt mit Unterstützung für PolicyKit kompiliert wurde, ist
die Vorgabe, Authentifizierung über „polkit“ durchzuführen.

@item @code{auth-tcp} (default: @code{"sasl"}) (type: string)
Authentifizierungsschema für TCP-Sockets. Wenn Sie SASL nicht aktivieren,
dann wird alle TCP-Kommunikation im Klartext verschickt. Tun Sie dies
@emph{nicht}, außer Sie benutzen libvirt nur als Entwickler oder zum Testen.

@item @code{auth-tls} (default: @code{"none"}) (type: string)
Authentifizierungsschema für TLS-Sockets. Für TLS-Sockets wird bereits durch
die TLS-Schicht Verschlüsselung bereitgestellt und eingeschränkte
Authentifizierung wird über Zertifikate durchgeführt. Es ist möglich, auch
hier den SASL-Authentifizierungsmechanismus anzuwenden, indem Sie für diese
Option @code{"sasl"} eintragen.

@item @code{access-drivers} (default: @code{()}) (type: optional-list)
Welche Schemata zur Zugriffskontrolle auf Programmierschnittstellen (APIs)
benutzt werden. Nach Vorgabe kann ein authentifizierter Nutzer auf alle
Programmierschnittstellen zugreifen. Zugriffstreiber können dies
einschränken.

@item @code{key-file} (default: @code{""}) (type: string)
Pfad zur Schlüsseldatei für den Server. Wenn er auf eine leere Zeichenkette
gesetzt ist, dann wird kein privater Schlüssel geladen.

@item @code{cert-file} (default: @code{""}) (type: string)
Pfad zur Zertifikatsdatei für den Server. Wenn er auf eine leere
Zeichenkette gesetzt ist, dann wird kein Zertifikat geladen.

@item @code{ca-file} (default: @code{""}) (type: string)
Pfad zur Datei mit dem Zertifikat der Zertifikatsautorität. Wenn er auf eine
leere Zeichenkette gesetzt ist, dann wird kein Zertifikat der
Zertifikatsautorität geladen.

@item @code{crl-file} (default: @code{""}) (type: string)
Pfad zur Zertifikatssperrliste („Certificate Revocation List“). Wenn er auf
eine leere Zeichenkette gesetzt ist, dann wird keine Zertifikatssperrliste
geladen.

@item @code{tls-no-sanity-cert} (default: @code{#f}) (type: boolean)
Keine Überprüfung unseres eigenen Serverzertifikats durchführen. Beim Start
vom @command{libvirtd} prüft dieser, ob bei seinem eigenen Zertifikat alles
in Ordnung ist.

@item @code{tls-no-verify-cert} (default: @code{#f}) (type: boolean)
Keine Überprüfung von Clientzertifikaten durchführen. Die Überprüfung des
Zertifikats eines Clients ist der primäre
Authentifizierungsmechanismus. Jeder Client, der kein von der
Zertifikatsautorität signiertes Zertifikat vorweist, wird abgelehnt.

@item @code{tls-allowed-dn-list} (default: @code{()}) (type: optional-list)
Liste der erlaubten Einträge für den „Distinguished Name“ bei x509.

@item @code{sasl-allowed-usernames} (default: @code{()}) (type: optional-list)
Liste der erlaubten Einträge für SASL-Benutzernamen. Wie Benutzernamen
aussehen müssen, ist abhängig vom jeweiligen SASL-Mechanismus.

@item @code{tls-priority} (default: @code{"NORMAL"}) (type: string)
Dies wird vorrangig statt der beim Kompilieren voreingestellten
TLS-Prioritätszeichenkette verwendet. Die Voreinstellung ist in der Regel
"NORMAL", solange dies nicht bei der Erstellung geändert wurde. Ändern Sie
dies nur, wenn die Einstellungen für libvirt von den globalen
Voreinstellungen abweichen sollen.

@item @code{max-clients} (default: @code{5000}) (type: integer)
Maximalzahl gleichzeitiger Client-Verbindungen, die für alle Sockets
zusammen zugelassen werden sollen.

@item @code{max-queued-clients} (default: @code{1000}) (type: integer)
Maximale Länge der Warteschlange für Verbindungen, die darauf warten, vom
Daemon angenommen zu werden. Beachten Sie, dass sich manche Protokolle, die
Neuübertragung unterstützen, danach richten könnten, damit ein erneuter
Verbindungsversuch angenommen wird.

@item @code{max-anonymous-clients} (default: @code{20}) (type: integer)
Maximale Länge der Warteschlange für Clients, die angenommen wurden, aber
noch nicht authentifiziert wurden. Setzen Sie dies auf null, um diese
Funktionalität abzuschalten.

@item @code{min-workers} (default: @code{5}) (type: integer)
Anzahl an Arbeiter-Threads, die am Anfang gestartet werden sollen.

@item @code{max-workers} (default: @code{20}) (type: integer)
Maximale Anzahl an Arbeiter-Threads. Wenn die Anzahl aktiver Clients die
@code{min-workers} übersteigt, werden weitere Threads erzeugt, bis die
@code{max_workers}-Beschränkung erreicht wurde. Typischerweise würden Sie
für @code{max_workers} die maximale Anzahl zugelassener Clients angeben.

@item @code{prio-workers} (default: @code{5}) (type: integer)
Die Anzahl priorisierter Arbeiter-Threads. Wenn alle Arbeiter aus diesem
Pool festhängen, können manche, mit hoher Priorität versehene Aufrufe
(speziell domainDestroy) in diesem Pool hier ausgeführt werden.

@item @code{max-requests} (default: @code{20}) (type: integer)
Wie viele nebenläufige RPC-Aufrufe global ausgeführt werden können.

@item @code{max-client-requests} (default: @code{5}) (type: integer)
Wie viele nebenläufige Anfragen von einer einzelnen Client-Verbindung
ausgehen können. Um zu verhindern, dass ein einzelner Client den gesamten
Server für sich beansprucht, sollte der Wert hier nur einen kleinen Teil der
globalen max_requests- und max_workers-Parameter ausmachen.

@item @code{admin-min-workers} (default: @code{1}) (type: integer)
Wie bei @code{min-workers}, aber für die Administratorschnittstelle.

@item @code{admin-max-workers} (default: @code{5}) (type: integer)
Wie bei @code{max-workers}, aber für die Administratorschnittstelle.

@item @code{admin-max-clients} (default: @code{5}) (type: integer)
Wie bei @code{max-clients}, aber für die Administratorschnittstelle.

@item @code{admin-max-queued-clients} (default: @code{5}) (type: integer)
Wie bei @code{max-queued-clients}, aber für die Administratorschnittstelle.

@item @code{admin-max-client-requests} (default: @code{5}) (type: integer)
Wie bei @code{max-client-requests}, aber für die Administratorschnittstelle.

@item @code{log-level} (default: @code{3}) (type: integer)
Semi-deprecated option for the logging level: using the @code{log-filters}
option instead is recommend, as it provides finer control.  The log level
can be set to @code{4} for errors, @code{3} for warnings, @code{2} for
information or @code{1} for debug.  Note that since @code{log-filters} and
@code{log-outputs} take precedence over this option, you will need to also
adjust their logging levels to avoid filtering out messages.

@item @code{log-filters} (default: @code{"3:remote 4:event"}) (type: string)
Logging filters.  A filter allows selecting a different logging level for a
given category of logs.  The format for a filter is either
@samp{@var{x}:@var{name}} or @samp{@var{x}:+@var{name}}, where name is a
string which is matched against the category given in the
@code{VIR_LOG_INIT()} at the top of each libvirt source file, e.g.,
@samp{"remote"}, @samp{"qemu"}, or @samp{"util.json"}.  @var{name} can be a
substring of the full category name, in order to match multiple similar
categories.  The optional @samp{+} prefix tells libvirt to log stack traces
for each message matching @var{name}.  @var{x} is the log level value used
to filter the associated message category.  @var{x} can be set to @samp{4}
for errors, @samp{3} for warnings, @samp{2} for information, or @samp{1} for
debug.  Multiple filters can be defined in a single filters statement, as
space-separated values.  Since @code{log-outputs} also include a level
filter, you may need to also adjust its value to see all the filtered
messages.

@item @code{log-outputs} (default: @code{"3:syslog:libvirtd"}) (type: string)
Logging outputs.  An output is one of the places to save logging
information.  The format for an output has the form
@code{"@var{x}:var@{output@}"}, where @var{output} can be @samp{stderr},
@samp{syslog:@var{name}}, where @var{name} is the syslog @code{ident} value
to use, or @samp{file:@var{file_name}}, where @var{file_name} is the file
name of the file to output to.  @var{x} is the minimal level, which acts as
a filter.  @var{x} can be set to @var{x} can be set to @samp{4} for errors,
@samp{3} for warnings, @samp{2} for information, or @samp{1} for debug.
Multiple filters can be defined in a single filters statement, as
space-separated values.

@item @code{audit-level} (default: @code{1}) (type: integer)
Modify the behavior of the auditing subsystem.  @samp{0} disables all
auditing, samp@{1@} enables auditing only if enabled on thehost and @samp{2}
enables auditing but exits if it is disabled on the host.

@item @code{audit-logging} (default: @code{#f}) (type: boolean)
Audit-Nachrichten über die Protokollinfrastruktur von libvirt versenden.

@item @code{host-uuid} (default: @code{""}) (type: optional-string)
Für das Wirtssystem zu verwendende UUID. Bei der UUID dürfen nicht alle
Ziffern gleich sein.

@item @code{host-uuid-source} (default: @code{"smbios"}) (type: string)
Source to read host UUID.  Use @code{"smbios"} to fetch the UUID via
@code{dmidecode -s system-uuid}, or @code{"machine-id"} to fetch the UUID
from @code{/etc/machine-id}.  If @code{dmidecode} does not provide a valid
UUID a temporary UUID will be generated.

@item @code{keepalive-interval} (default: @code{5}) (type: integer)
Einem Client wird eine Nachricht zum Aufrechterhalten der Verbindung
gesendet, nachdem @code{keepalive_interval} Sekunden lang keine Aktivität
stattgefunden hat. Damit kann überprüft werden, ob der Client noch
antwortet. Wird dieses Feld auf @code{-1} gesetzt, wird libvirtd keine
Aufrechterhaltungsanfragen senden; Clients können diese aber weiterhin dem
Daemon schicken und er wird auf diese antworten.

@item @code{keepalive-count} (default: @code{5}) (type: integer)
Wie viele Aufrechterhaltungsnachrichten höchstens zum Client geschickt
werden dürfen, ohne dass eine Antwort zurückgekommen ist, bevor die
Verbindung als abgebrochen gilt. Mit anderen Worten wird die Verbindung
ungefähr dann automatisch geschlossen, wenn @samp{keepalive_interval *
(keepalive_count + 1)} Sekunden seit der letzten vom Client empfangenen
Nachricht vergangen sind. Wenn @code{keepalive-count} auf @code{0} gesetzt
ist, werden Verbindungen dann automatisch geschlossen, wenn
@code{keepalive-interval} Sekunden der Inaktivität vorausgegangen sind, ohne
dass eine Aufrechterhaltungsnachricht versandt wurde.

@item @code{admin-keepalive-interval} (default: @code{5}) (type: integer)
Wie oben, aber für die Administratorschnittstelle.

@item @code{admin-keepalive-count} (default: @code{5}) (type: integer)
Wie oben, aber für die Administratorschnittstelle.

@item @code{ovs-timeout} (default: @code{5}) (type: integer)
Zeitbeschränkung für Aufrufe über Open vSwitch. Das Werkzeug
@code{ovs-vsctl} wird zur Konfiguration benutzt; die dort eingestellte
Zeitbeschränkung ist nach Voreinstellung auf 5 Sekunden festgelegt, um zu
verhindern, dass libvirt durch unbegrenztes Warten blockiert werden kann.

@end table

@end deftp


@c %end of fragment

@subsubheading Virtlog-Daemon
Der virtlogd-Dienst ist eine serverseitige Daemon-Komponente von libvirt,
die benutzt wird, um Protokolle der Konsolen von virtuellen Maschinen zu
verwalten.

Dieser Daemon wird von libvirt-Clientanwendungen nicht direkt benutzt,
sondern wird an deren Stelle vom @code{libvirtd} aufgerufen. Indem die
Protokolle in einem eigenständigen Daemon vorgehalten werden, kann der
eigentliche @code{libvirtd}-Daemon neu gestartet werden, ohne dass man
riskiert, Protokolle zu verlieren. Der @code{virtlogd}-Daemon hat die
Fähigkeit, sich selbst erneut mit exec() zu starten, wenn er @code{SIGUSR1}
empfängt, damit Aktualisierungen ohne Ausfall möglich sind.

@defvar virtlog-service-type
Dies ist der Diensttyp des virtlog-Daemons. Sein Wert muss eine
@code{virtlog-configuration} sein.

@lisp
(service virtlog-service-type
         (virtlog-configuration
          (max-clients 1000)))
@end lisp
@end defvar

@deftypevr {@code{libvirt}-Parameter} „package“ libvirt
Libvirt-Paket.
@end deftypevr

@deftypevr {@code{virtlog-configuration}-Parameter} Ganze-Zahl log-level
Protokollstufe. 4 für Fehler, 3 für Warnungen, 2 für Informationen, 1 zur
Fehlersuche.

Die Vorgabe ist @samp{3}.

@end deftypevr

@deftypevr {@code{virtlog-configuration}-Parameter} Zeichenkette log-filters
Protokollfilter.

Ein Filter ermöglicht es, für eine bestimmte Kategorie von Protokollen eine
andere Protokollierungsstufe festzulegen. Filter müssen eines der folgenden
Formate haben:

@itemize @bullet
@item
x:Name

@item
x:+Name

@end itemize

wobei @code{Name} eine Zeichenkette ist, die zu einer in der
Umgebungsvariablen @code{VIR_LOG_INIT()} am Anfang jeder Quelldatei von
libvirt angegebenen Kategorie passen muss, z.B.@: „remote“, „qemu“ oder
„util.json“ (der Name im Filter kann auch nur ein Teil des vollständigen
Kategoriennamens sein, wodurch mehrere, ähnliche passende Kategoriennamen
möglich sind). Das optionale Präfix „+“ bedeutet, dass libvirt eine
Rückverfolgung (d.h.@: ein „Stack Trace“) für jede zum Namen passende
Nachricht ins Protokoll schreiben soll. @code{x} benennt jeweils die
kleinste Stufe, deren passende Nachrichten protokolliert werden sollen.

@itemize @bullet
@item
1: Fehlersuche („DEBUG“)

@item
2: Informationen („INFO“)

@item
3: Warnungen („WARNING“)

@item
4: Fehler („ERROR“)

@end itemize

Mehrere Filter können in einer einzelnen Filteranweisung definiert werden;
sie müssen nur durch Leerzeichen voneinander getrennt werden.

Die Vorgabe ist @samp{"3:remote 4:event"}.

@end deftypevr

@deftypevr {@code{virtlog-configuration}-Parameter} Zeichenkette log-outputs
Ausgaben für die Protokollierung.

Als Ausgabe bezeichnen wir einen der Orte, an denen Protokollinformationen
gespeichert werden. Eine Ausgabe wird auf eine der folgenden Arten
angegeben:

@table @code
@item x:stderr
Protokolle werden auf der Standardausgabe („Stderr“) ausgegeben.

@item x:syslog:Name
Syslog wird zur Ausgabe benutzt. Der Name dient dabei als Identifikator für
libvirt-Protokolle.

@item x:file:Dateipfad
Protokolle werden in die Datei unter dem angegebenen Dateipfad ausgegeben.

@item x:journald
Die Ausgabe läuft über das journald-Protokollsystem.

@end table

In allen Fällen steht das x vorne für die kleinste Stufe und wirkt als
Filter.

@itemize @bullet
@item
1: Fehlersuche („DEBUG“)

@item
2: Informationen („INFO“)

@item
3: Warnungen („WARNING“)

@item
4: Fehler („ERROR“)

@end itemize

Mehrere Ausgaben können definiert werden, dazu müssen sie nur durch
Leerzeichen getrennt hier angegeben werden.

Die Vorgabe ist @samp{"3:stderr"}.

@end deftypevr

@deftypevr {@code{virtlog-configuration}-Parameter} Ganze-Zahl max-clients
Maximalzahl gleichzeitiger Client-Verbindungen, die für alle Sockets
zusammen zugelassen werden sollen.

Die Vorgabe ist @samp{1024}.

@end deftypevr

@deftypevr {@code{virtlog-configuration}-Parameter} Ganze-Zahl max-size
Wie groß eine Protokolldatei werden darf, bevor eine neue begonnen wird.

Die Vorgabe ist @samp{2MB}.

@end deftypevr

@deftypevr {@code{virtlog-configuration}-Parameter} Ganze-Zahl max-backups
Wie viele Dateien mit Sicherungskopien gespeichert bleiben sollen.

Die Vorgabe ist @samp{3}.

@end deftypevr

@anchor{transparent-emulation-qemu}
@subsubheading Transparente Emulation mit QEMU

@cindex Emulation
@cindex @code{binfmt_misc}
Mit @code{qemu-binfmt-service-type} wird transparente Emulation von
Programm-Binärdateien, die für unterschiedliche Architekturen erstellt
wurden, ermöglicht. Z.B.@: können Sie ein ARMv7-Programm „einfach so“
transparent auf einer x86_64-Maschine ausführen. Dazu wird der
@uref{https://www.qemu.org, QEMU-Emulator} mit der
@code{binfmt_misc}-Funktionalität des Kernels Linux kombiniert. Mit dieser
Funktionalität können Sie jedoch nur ein GNU/Linux-System, das auf einer
anderen Architektur läuft, emulieren. Unterstützung für GNU/Hurd ist auch
möglich, lesen Sie dazu unten weiter.

@defvar qemu-binfmt-service-type
Dies ist der Diensttyp des QEMU/binfmt-Dienstes für transparente
Emulation. Sein Wert muss ein @code{qemu-binfmt-configuration}-Objekt sein,
das das QEMU-Paket angibt, das benutzt werden soll, sowie die Architektur,
die wir emulieren möchten.

@lisp
(service qemu-binfmt-service-type
         (qemu-binfmt-configuration
           (platforms (lookup-qemu-platforms "arm" "aarch64"))))
@end lisp

In diesem Beispiel aktivieren wir transparente Emulation für die Plattformen
ARM und aarch64. Wenn wir @code{herd stop qemu-binfmt} ausführen, wird diese
abgeschaltet, und mit @code{herd start qemu-binfmt} wird sie wieder aktiv
(siehe @ref{Invoking herd, den @command{herd}-Befehl,, shepherd, The GNU
Shepherd Manual}).
@end defvar

@deftp {Datentyp} qemu-binfmt-configuration
Dies ist die Konfiguration des @code{qemu-binfmt}-Dienstes.

@table @asis
@item @code{platforms} (Vorgabe: @code{'()})
Die Liste der emulierten QEMU-Plattformen. Jeder Eintrag muss ein
@dfn{Plattformobjekt} sein, wie @code{lookup-qemu-platforms} eines
zurückliefert (siehe unten).

Wenn wir zum Beispiel annehmen, Sie arbeiten auf einer x86_64-Maschine und
haben diesen Dienst eingerichtet:

@lisp
(service qemu-binfmt-service-type
         (qemu-binfmt-configuration
           (platforms (lookup-qemu-platforms "arm"))))
@end lisp

Dann können Sie das hier ausführen:

@example
guix build -s armhf-linux inkscape
@end example

@noindent
und alles verhält sich so, als würden Sie Inkscape für ARMv7 @emph{wie
„nativ“ auf einem ARM-Rechner erstellen}, wozu QEMU transparent benutzt
wird, um den ARMv7-Prozessor zu emulieren. Das ist ganz schön praktisch,
wenn Sie testen wollen, ob ein Paket für eine Architektur erstellt werden
kann, die Ihnen nicht zur Verfügung steht.

@item @code{qemu} (Vorgabe: @code{qemu})
Das QEMU-Paket, das benutzt werden soll.
@end table
@end deftp

@deffn {Prozedur} lookup-qemu-platforms Plattformen…
Liefert die Liste der QEMU-Plattformobjekte, die den @var{Plattformen}…@:
entsprechen. @var{Plattformen} muss eine Liste von Zeichenketten sein, die
den Namen der Plattformen entsprechen, wie z.B.@: @code{"arm"},
@code{"sparc"}, @code{"mips64el"} und so weiter.
@end deffn

@deffn {Prozedur} qemu-platform? Objekt
Liefert wahr, wenn das @var{Objekt} ein Plattformobjekt ist.
@end deffn

@deffn {Prozedur} qemu-platform-name Plattform
Liefert den Namen der @var{Plattform}, also eine Zeichenkette wie z.B.@:
@code{"arm"}.
@end deffn


@subsubheading QEMU Guest Agent

@cindex Emulation

Mit dem QEMU Guest Agent kann das emulierte System vom Wirtssystem aus
gesteuert werden. Der Dienst für den @code{qemu-guest-agent} führt den
Agenten auf einem Guix-basierten Gastsystem aus. Um den Agenten vom Wirt aus
zu steuern, öffnen Sie einen Socket, indem Sie QEMU mit folgenden Argumenten
aufrufen:

@example
qemu-system-x86_64 \
	-chardev socket,path=/tmp/qga.sock,server=on,wait=off,id=qga0 \
	-device virtio-serial \
	-device virtserialport,chardev=qga0,name=org.qemu.guest_agent.0 \
	…
@end example

Dadurch wird auf dem Wirtssystem ein Socket unter @file{/tmp/qga.sock}
angelegt. Sobald der Guest Agent gestartet hat, können Sie mit @code{socat}
Befehle erteilen:

@example
$ guix shell socat -- socat unix-connect:/tmp/qga.sock stdio
@{"execute": "guest-get-host-name"@}
@{"return": @{"host-name": "guix"@}@}
@end example

Siehe die @url{https://wiki.qemu.org/Features/GuestAgent,Dokumentation zum
QEMU Guest Agent} für mehr Optionen und Befehle.

@defvar qemu-guest-agent-service-type
Diensttyp des Dienstes für den QEMU Guest Agent.
@end defvar

@deftp {Datentyp} qemu-guest-agent-configuration
Die Konfiguration des @code{qemu-guest-agent}-Dienstes.

@table @asis
@item @code{qemu} (Vorgabe: @code{qemu-minimal})
Das QEMU-Paket, das benutzt werden soll.

@item @code{device} (Vorgabe: @code{""})
Der Dateiname des Geräts bzw.@: Sockets, über das der Agent mit dem
Wirtssystem kommuniziert. Wird nichts angegeben, verwendet QEMU einen
voreingestellten Dateinamen.
@end table
@end deftp

@subsubheading Xen Guest Agent

@cindex Xen
@cindex Xen guest agent

The Xen guest agent allows a Xen host to control the emulated system.  The
@code{xe-guest-utilities} service runs the agent on Guix guests.

@url{https://github.com/xenserver/xe-guest-utilities, xe-guest-utilities}
collects information about the running virtualized guest. This includes:
@itemize
@item
static information
@itemize
@item
The operating system running
@item
The Linux kernel version
@end itemize

@item
dynamic information
@itemize
@item
Network interfaces (devices) being added/removed
@item
Network connections being unplugged/plugged-in
@item
CPUs being added or removed
@item
The guest migrating, being paused/resumed, etc.
@end itemize

@item
ephemeral information
@itemize
@item
The amount of memory currently in-use and free
@item
The amount of disk-space used
@end itemize
@end itemize

@quotation Anmerkung
The default Linux-libre kernel that Guix ships already enables the necessary
paravirtualization features for a guest.  There is nothing you need to do
for the guest to support Xen's paravirtualization features.

The guest utilities are used to have the guest report information
@emph{back} to the virtualizing host and support tasks that require
cooperation between host and guest, like CPU hotplugging.
@end quotation

@defvar xe-guest-utilities-service-type
Service type for the Xen guest utilities service.
@end defvar

@deftp {Data Type} xe-guest-utilities-configuration
Configuration for the @code{xe-guest-utilities} service.

@table @asis
@item @code{package} (default: @code{xe-guest-utilities})
The Xen guest utilities package to use.

@item @code{pid-file} (default: @code{"/var/run/xe-daemon.pid"})
Name of the file holding the PID of @code{xe-deamon}.

@item @code{log-file} (default: @code{"/var/log/xe-guest-utilities.log"})
Name of the @code{xe-guest-utilities} log file.
@end table
@end deftp

@code{xe-guest-utilities} is the standard guest utilities used for Xen
guests.  More recently the Xen Project has been working to develop
@code{xen-guest-agent}, a modern drop-in replacement for
@code{xe-guest-utilities}.  While they nearly have feature-parity,
@code{xen-guest-agent} currently lacks some of the features of its
predecessor, namely disk metrics and ``PV drivers version''.

@defvar xen-guest-agent-service-type
Service type for the Xen guest agent service.
@end defvar

@deftp {Data Type} xen-guest-agent-configuration
Configuration for the @code{xen-guest-agent} service.

@table @asis
@item @code{package} (default: @code{xen-guest-agent})
The Xen guest agent package to use.
@end table
@end deftp

@quotation Warnung
@code{xe-guest-utilities} and @code{xen-guest-agent} are mutually exclusive.
@end quotation


@anchor{build-vm}
@subsubheading Virtuelle Erstellungsmaschinen

@cindex virtuelle Erstellungsmaschinen
@cindex Erstellungs-VM
@cindex VM, darauf auslagern
@dfn{Virtuelle Erstellungsmaschinen} oder „Erstellungs-VM“ bzw.@: „Build-VM“
erlauben es Ihnen, Erstellungen an vollends kontrollierte Umgebungen
auszulagern. „Wie kann man mehr Kontrolle haben als bei normalen
Erstellungen? Und wozu das Ganze?“, fragen Sie. Und das sind berechtigte
Fragen.

Erstellungen, die mit @code{guix-daemon} gestartet werden, laufen durchaus
in einer kontrollierten Umgebung, genauer gesagt erzeugt der Daemon die
Erstellungsprozesse in getrennten Namensräumen und in einer chroot-Umgebung,
damit Erstellungsprozesse nur ihre deklarierten Abhängigkeiten sowie einen
klar abgegrenzten Teil des Dateisystembaums sehen können (siehe @ref{Einrichten der Erstellungsumgebung} für mehr Informationen). Jedoch tragen zur Umgebung auch
manche unkontrollierten Facetten bei: der Kernel des Betriebssystems, das
Prozessormodell und das Datum. Meistens sind diese Facetten unerheblich für
den Erstellungsprozess und das von @code{guix-daemon} garantierte
Isolationsniveau ist „gut genug“.

@cindex Zeitfallen
Manchmal allerdings haben @emph{diese} Facetten aber doch Einfluss auf den
Erstellungsprozess. Ein typisches Beispiel sind @dfn{Zeitfallen}:
Erstellungsprozesse, die nicht mehr funktionieren, wenn ein
festgeschriebener Zeitpunkt verstrichen ist@footnote{Das verbreitetste
Beispiel solcher Zeitfallen sind Testkataloge, die Auslaufdaten von
Zertifikaten prüfen. Solche Tests finden sich in TLS-Implementierungen wie
OpenSSL und GnuTLS, aber auch in anwendernäherer Software wie etwa
Python.}. Des Weiteren gibt es Software, die auf diejenige
Prozessormikroarchitektur hin optimiert wird, auf der sie erstellt wird,
oder schlimmer noch, sie hat Fehler, die nur auf ganz bestimmten CPU
auftreten.

Um damit klarzukommen, können Sie einen Dienst des Typs
@code{virtual-build-machine-service-type} einrichten, so dass eine virtuelle
Erstellungsmaschine zu Ihrem System hinzugefügt wird, wie in diesem
Beispiel:

@lisp
(use-modules (gnu services virtualization))

(operating-system
  ;; …
  (services (append (list (service virtual-build-machine-service-type))
                    %base-services)))
@end lisp

In der Vorgabeeinstellung ist es Ihre Aufgabe, die Erstellungsmaschine
ausdrücklich zu starten, wenn Sie sie brauchen, damit Erstellungen auf sie
ausgelagert werden können (siehe @ref{Auslagern des Daemons einrichten}):

@example
herd start build-vm
@end example

Mit der oben gezeigten Vorgabeeinstellung wird die Uhr der virtuellen
Erstellungsmaschine auf ein Datum einige Jahre in der Vergangenheit gesetzt
und das Prozessormodell wird dem Datum entsprechend gewählt@tie{}– unter
Umständen ist dieses Modell älter als Ihre Maschine. Dadurch bietet sich
Ihnen die Möglichkeit, Software aus vergangenen Jahren heute noch zu
erstellen, wenn deren Erstellung unter normalen Umständen mittlerweile wegen
einer Zeitfalle oder wegen eines anderweitig problematischen
Erstellungsprozesses fehlschlägt. Die Konfiguration der VM können Sie so
einsehen:

@example
herd configuration build-vm
@end example

Sie können die Erstellungsmaschine nach Ihren Wünschen konfigurieren wie in
diesem Beispiel:

@lisp
(service virtual-build-machine-service-type
         (virtual-build-machine
          (cpu "Westmere")
          (cpu-count 8)
          (memory-size (* 1 1024))
          (auto-start? #t)))
@end lisp

Die verfügbaren Optionen werden nun gezeigt.

@defvar virtual-build-machine-service-type
Mit diesem Diensttyp führen Sie @dfn{virtuelle Erstellungsmaschinen}
aus. Die virtuellen Erstellungsmaschinen werden so konfiguriert, dass
Erstellungen darauf ausgelagert werden, wenn diese laufen.
@end defvar

@deftp {Datentyp} virtual-build-machine
Dies ist der Datentyp, der die Konfiguration einer Erstellungsmaschine
repräsentiert. Sie enthält die folgenden Felder:

@table @asis
@item @code{name} (Vorgabe: @code{'build-vm})
Der Name dieser Erstellungs-VM. Von ihm leitet sich der Name des zugehörigen
Shepherd-Dienstes ab.

@item @code{image}
Welches Abbild für die virtuelle Maschine verwendet wird (siehe @ref{Systemabbilder}). Erwähnenswert ist, dass damit auch die Größe der virtuellen Platte
und das darauf laufende Betriebssystem festgelegt werden (siehe
@ref{„operating-system“-Referenz}). Mit dem Vorgabewert kommt ein minimales
Betriebssystemabbild zum Einsatz.

@item @code{qemu} (Vorgabe: @code{qemu-minimal})
Das QEMU-Paket, mit dem das Abbild laufen soll.

@item @code{cpu}
Das Prozessormodell, das emuliert werden soll, angegeben als Zeichenkette,
die das QEMU bekannte Modell angibt.

Der Vorgabewert für das Modell entscheidet sich anhand des in @code{date}
angegebenen Datums (siehe unten). Um zu wissen, welche CPU-Modelle verfügbar
sind, können Sie zum Beispiel dies ausführen:

@example
qemu-system-x86_64 -cpu help
@end example

@item @code{cpu-count} (Vorgabe: @code{4})
Die Anzahl, wie viele CPU in der virtuellen Maschine emuliert werden sollen.

@item @code{memory-size} (Vorgabe: @code{2048})
Die Größe in Mebibyte (MiB) des Arbeitsspeichers der virtuellen Maschine.

@item @code{date} (Vorgabe: vor ein paar Jahren)
Welches Datum die virtuelle Maschine kennt, wenn sie startet. Geben Sie ein
Datumsobjekt gemäß SRFI-19 an (siehe @ref{SRFI-19 Date,,, guile,
Referenzhandbuch zu GNU Guile}).

@item @code{port-forwardings} (Vorgabe: 11022 and 11004)
Welche TCP-Ports der virtuellen Maschine an den Wirt weitergeleitet werden
sollen. Vorgegeben ist, die Ports für SSH und Geheimnisse vom Wirt aus
sichtbar zu machen.

@item @code{systems} (Vorgabe: @code{(list (%current-system))})
Die Liste der von der Erstellungs-VM unterstützten Systemtypen@tie{}– etwa
@code{"x86_64-linux"}.

@item @code{auto-start?} (Vorgabe: @code{#f})
Ob die virtuelle Maschine gestartet werden soll, sobald das System bootet.
@end table
@end deftp

Im nächsten Abschnitt lesen Sie über eine Variante: virtuelle Maschinen für
GNU/Hurd!

@anchor{hurd-vm}
@subsubheading GNU@tie{}Hurd in einer virtuellen Maschine

@cindex @code{hurd}
@cindex Hurd
@cindex childhurd

Der @code{hurd-vm}-Dienst bietet Unterstützung, um GNU/Hurd in einer
virtuellen Maschine (VM) laufen zu lassen, als eine sogenannte „Kind-Hurd“,
englisch @dfn{Childhurd}. Der Dienst ist für die Nutzung mit
GNU/Linux-Systemen gedacht; die angegebene GNU/Hurd-Konfiguration wird
cross-kompiliert. Die virtuelle Maschine läuft als ein Shepherd-Dienst, der
durch Namen wie @code{hurd-vm} und @code{childhurd} bezeichnet wird und mit
Befehlen wie den folgenden gesteuert werden kann:

@example
herd start hurd-vm
herd stop childhurd
@end example

Während der Dienst läuft, können Sie seine Konsole anzeigen lassen, indem
Sie sich über einen VNC-Client mit ihm verbinden, z.B.@: durch den Befehl:

@example
guix shell tigervnc-client -- vncviewer localhost:5900
@end example

Die Vorgabekonfiguration (siehe @code{hurd-vm-configuration} unten) lässt
einen Server für Secure Shell (SSH) in Ihrem GNU/Hurd-System laufen, welchen
QEMU (der Emulator für virtuelle Maschinen) an Port 10022 des Wirtssystems
weitergibt. Außerdem ist @dfn{Auslagern} der Vorgabe nach aktiviert, so dass
Erstellungen für GNU/Hurd vom auf dem Wirt laufenden @code{guix-daemon}
automatisch an die Childhurd weitergereicht werden (siehe @ref{Auslagern des Daemons einrichten}). Dazu führen Sie einen Befehl wie den folgenden
aus. @code{i586-gnu} ist dabei der Systemtyp für die 32-Bit-Variante von
GNU/Hurd:

@example
guix build emacs-minimal -s i586-gnu
@end example

Die Childhurd ist flüchtig und zustandslos: Jedes Mal, wenn Sie sie neu
starten, hat sie wieder ihr ursprüngliches Wurzeldateisystem. Nur die
Dateien unter @file{/etc/childhurd} im Wirtssystem werden nach Vorgabe in
das Wurzeldateisystem der Childhurd übernommen, wenn sie startet. So können
Sie einen Startwert für „Geheimnisse“ in der VM angeben:
SSH-Rechnerschlüssel („Host Keys“), Autorisierungsschlüssel für Substitute
und so weiter@tie{}– siehe die Erklärung zu @code{secret-root} unten.

Es bietet sich an, dass Sie sich auf der virtuellen GNU/Hurd-Maschine ein
eigenes Benutzerkonto deklarieren und die Anmeldung über Ihren SSH-Schlüssel
erlauben. Als Grundlage nehmen Sie eine normale GNU/Hurd-Systemdefinition
(siehe @ref{Das Konfigurationssystem nutzen}) und übergeben dieses
Betriebssystem im @code{os}-Feld von @code{hurd-vm-configuration}, wie in
diesem Beispiel:

@lisp
(define childhurd-os
  ;; Definition meines GNU/Hurd-Systems, abgeleitet vom vorgegebenen.
  (operating-system
    (inherit %hurd-vm-operating-system)

    ;; Benutzerkonto hinzufügen.
    (users (cons (user-account
                  (name "charlie")
                  (comment "Das bin ich!")
                  (group "users")
                  (supplementary-groups '("wheel"))) ;für 'sudo'
                 %base-user-accounts))

    (services
     ;; Wir passen die SSH-Konfiguration an, damit wir als "root" und
     ;; als "charlie" über öffentliche Schlüssel authentifiziert werden
     ;; können.
     (modify-services (operating-system-user-services
                       %hurd-vm-operating-system)
       (openssh-service-type
        config => (openssh-configuration
                   (inherit config)
                   (authorized-keys
                    `(("root"
                       ,(local-file
                         "/home/charlie/.ssh/id_rsa.pub"))
                      ("charlie"
                       ,(local-file
                         "/home/charlie/.ssh/id_rsa.pub"))))))))))

(operating-system
  ;; …
  (services
    ;; Den 'hurd-vm'-Dienst fügen wir mit einer Konfiguration hinzu,
    ;; durch die er obige Betriebssystemkonfiguration instanziiert.
    (append (list (service hurd-vm-service-type
                           (hurd-vm-configuration
                             (os %childhurd-os))))
            %base-services)))
@end lisp

Das war’s schon! Der Rest dieses Abschnitts stellt die Referenz dieser
Dienstkonfiguration dar.

@defvar hurd-vm-service-type
Dies ist der Diensttyp zum Hurd-in-einer-virtuellen-Maschine-Dienst. Dessen
Wert muss ein @code{hurd-vm-configuration}-Objekt sein, das das
Betriebssystem festlegt (siehe @ref{„operating-system“-Referenz}) und die
Plattengröße für die virtuelle Hurd-Maschine, das zu nutzende QEMU-Paket
sowie die Befehlszeilenoptionen, um sie auszuführen.

Zum Beispiel:

@lisp
(service hurd-vm-service-type
         (hurd-vm-configuration
          (disk-size (* 5000 (expt 2 20))) ;5G
          (memory-size 1024)))             ;1024MiB
@end lisp

würde zur Erzeugung eines Disk-Images führen, dessen Größe für die
Erstellung von GNU@tie{}Hello ausreichend ist und das noch ein wenig
zusätzlichen Arbeitsspeicher zur Verfügung stellt.
@end defvar

@deftp {Datentyp} hurd-vm-configuration
Der Datentyp, der die Konfiguration des @code{hurd-vm-service-type}
repräsentiert.

@table @asis
@item @code{os} (Vorgabe: @var{%hurd-vm-operating-system})
Welches Betriebssystem instanziiert werden soll. Nach Vorgabe wird ein
minimales „Bare-Bones“-System mit uneingeschränktem
OpenSSH-Secure-Shell-Daemon, der auf Port 2222 lauscht (siehe
@ref{Netzwerkdienste, @code{openssh-service-type}}).

@item @code{qemu} (Vorgabe: @code{qemu-minimal})
Das QEMU-Paket, das benutzt werden soll.

@item @code{type} (Vorgabe: @code{'hurd-qcow2})
Der Name des Abbildtypen. Verwenden Sie @code{'hurd-qcow2} für ein
32-Bit-Abbild oder @code{'hurd64-qcow2} für ein 64-Bit-Abbild.

@item @code{image} (Vorgabe: @var{hurd-vm-disk-image})
Das @code{image}-Objekt für ein Disk-Image, mit dem diese virtuelle Maschine
laufen soll (siehe @ref{Systemabbilder}).

Alternativ können Sie den Dateinamen (als Zeichenkette) eines Abbilds
angeben. Das ist nützlich, wenn Sie möchten, dass das Abbild auch nach einem
Neustart des Dienstes bestehen bleibt. Siehe das folgende Beispiel.

@item @code{disk-size} (Vorgabe: @code{'guess})
Die Größe des Disk-Images.

@item @code{memory-size} (Vorgabe: @code{512})
Die Größe des Arbeitsspeichers der virtuellen Maschine in Mebibyte.

@item @code{options} (Vorgabe: @code{'("--snapshot")})
Weitere Befehlszeilenoptionen, mit denen QEMU ausgeführt wird.

@item @code{id} (Vorgabe: @code{#f})
Wenn das Feld gesetzt ist, muss es eine positive ganze Zahl größer null
sein, womit Childhurd-Instanzen parametrisiert werden. Es wird an den
Dienstnamen angehängt, z.B.@: @code{childhurd1}.

@item @code{net-options} (Vorgabe: @var{hurd-vm-net-options})
Die Prozedur, um die Liste der QEMU-Netzwerkoptionen zu erzeugen.

Nach Vorgabe liefert sie

@lisp
'("--device" "rtl8139,netdev=net0"
  "--netdev" (string-append
              "user,id=net0,"
              "hostfwd=tcp:127.0.0.1:@var{secrets-port}-:1004,"
              "hostfwd=tcp:127.0.0.1:@var{ssh-port}-:2222,"
              "hostfwd=tcp:127.0.0.1:@var{vnc-port}-:5900"))
@end lisp

mit Portweiterleitungen:

@example
@var{secrets-port}: @code{(+ 11004 (* 1000 @var{ID}))}
@var{ssh-port}: @code{(+ 10022 (* 1000 @var{ID}))}
@var{vnc-port}: @code{(+ 15900 (* 1000 @var{ID}))}
@end example

@cindex Childhurd, Auslagern auf
@cindex Hurd, Auslagern auf
@item @code{offloading?} (Vorgabe: @code{#t})
Ob automatisch das Auslagern von Erstellungen auf die Childhurd eingerichtet
werden soll.

Wenn dies aktiviert ist, können Sie Erstellungen für GNU/Hurd auf dem
Wirtssystem auslösen, die transparent an die virtuelle Maschine ausgelagert
werden, zum Beispiel mit so einem Befehl:

@example
guix build coreutils -s i586-gnu
@end example

Das Auslagern mit dieser Option wird auf diese Weise automatisch
eingerichtet:

@enumerate
@item
Der Schlüssel der Childhurd wird auf dem Wirtssystem autorisiert, damit das
Wirtssystem von der Childhurd stammende Erstellungsergebnisse annimmt. Das
geht so (siehe @ref{Aufruf von guix archive, @command{guix archive
--authorize}}, für Informationen dazu).

@item
Ein Benutzerkonto namens @code{offloading} wird angelegt, welches für das
Auslagern auf die Childhurd bestimmt ist.

@item
Auf dem Wirtssystem wird ein SSH-Schlüsselpaar angelegt, das als
autorisierter Schlüssel im @code{offloading}-Benutzerkonto der Childhurd
eingerichtet wird.

@item
Die Childhurd wird zu @file{/etc/guix/machines.scm} hinzugefügt (siehe
@ref{Auslagern des Daemons einrichten}).
@end enumerate

@item @code{secret-root} (Vorgabe: @file{/etc/childhurd})
Das Wurzelverzeichnis von Geheimnissen, die auf der Childhurd „out of band“,
d.h.@: abseits vom Zuständigkeitsbereich der Childhurd, installiert werden
sollen, sobald sie gestartet wurde. Childhurds sind flüchtig, d.h.@: bei
jedem Start würden Geheimnisse wie die SSH-Rechnerschlüssel und
Signierschlüssel von Guix neu angelegt.

Wenn das Verzeichnis @file{/etc/childhurd} @emph{nicht} existiert, wird dem
im Childhurd laufenden @code{secret-service}-Dienst eine leere Liste von
Geheimnissen geschickt.

Üblicherweise wird er benutzt, um in @file{"/etc/childhurd"} einen Dateibaum
aus @emph{nicht} flüchtigen Geheimnissen einzufügen, wenn diese noch
@emph{nicht} existieren:

@example
/etc/childhurd/etc/guix/acl
/etc/childhurd/etc/guix/signing-key.pub
/etc/childhurd/etc/guix/signing-key.sec
/etc/childhurd/etc/ssh/authorized_keys.d/offloading
/etc/childhurd/etc/ssh/ssh_host_ed25519_key
/etc/childhurd/etc/ssh/ssh_host_ecdsa_key
/etc/childhurd/etc/ssh/ssh_host_ed25519_key.pub
/etc/childhurd/etc/ssh/ssh_host_ecdsa_key.pub
@end example

@end table
@end deftp

Beachten Sie, dass nach Vorgabe ein flüchtiges Abbild für die virtuelle
Maschine benutzt wird, also dessen Inhalt verloren geht, sobald der Dienst
gestoppt wurde. Wenn Sie stattdessen ein bleibendes Abbild möchten, ändern
Sie die Felder @code{image} und @code{options} in der Konfiguration, so dass
keine @option{--snapshot}-Befehlszeilenoption übergeben wird, z.B.@: so:

@lisp
(service hurd-vm-service-type
         (hurd-vm-configuration
          ;; Abbild außerhalb des Stores mit bleibendem Zustand.
          (image "/nicht/im/store/mit/schreibzugriff/hurd.img")
          (options '())))
@end lisp

@subsubheading Ganeti

@cindex ganeti

@quotation Anmerkung
Dieser Dienst gilt als experimentell. Die Konfigurationsoptionen könnten in
Zukunft noch auf eine Weise abgeändert werden, die keine Kompatibilität mit
dem momentanen Verhalten gewährleistet, und nicht alle Funktionalitäten
wurden gründlich getestet. Wenn Sie ihn benutzen, ermutigen wir Sie, Ihre
Erfahrungen mit uns über @email{guix-devel@@gnu.org} zu teilen.
@end quotation

Ganeti ist ein System zur Verwaltung virtueller Maschinen. Es ist dafür
gedacht, virtuelle Maschinen auf einem Server-Cluster am Laufen zu halten,
selbst wenn Hardware ausfällt, und deren Wartung und Wiederherstellung
einfach zu machen. Es besteht aus mehreren Diensten, die später in diesem
Abschnitt beschrieben werden. Zusätzlich zum Ganeti-Dienst brauchen Sie den
OpenSSH-Dienst (siehe @ref{Netzwerkdienste,
@code{openssh-service-type}}) und müssen in die Datei @file{/etc/hosts}
(siehe @ref{Service-Referenz, @code{hosts-service-type}}) den Namen des
Clusters mit Adresse eintragen lassen (oder Sie verwenden einen eigenen
DNS-Server).

Alle Knoten, die an einem Ganeti-Cluster teilnehmen, sollten dieselbe
Konfiguration von Ganeti und @file{/etc/hosts} aufweisen. Hier ist eine
Beispielkonfiguration für einen Ganeti-Clusterknoten, der mehrere
Hintergrundsysteme für Speichergeräte unterstützt und die
@dfn{Betriebssystemanbieter} („OS providers“) @code{debootstrap} sowie
@code{guix} installiert hat:

@lisp
(use-package-modules virtualization)
(use-service-modules base ganeti networking ssh)
(operating-system
  ;; …
  (host-name "node1")

  ;; QEMU installieren, damit wir auf KVM aufsetzende Instanzen benutzen
  ;; können, sowie LVM, DRBD und Ceph, damit wir die Speicher-Hintergrundsysteme
  ;; "plain", "drbd" und "rbd" benutzen können.
  (packages (append (map specification->package
                         '("qemu" "lvm2" "drbd-utils" "ceph"
                           ;; Betriebssystemanbieter debootstrap und guix:
                           "ganeti-instance-guix" "ganeti-instance-debootstrap"))
                    %base-packages))
  (services
   (append (list (service static-networking-service-type
                          (list (static-networking
                                 (addresses
                                  (list (network-address
                                         (device "eth0")
                                         (value "192.168.1.201/24"))))
                                 (routes
                                  (list (network-route
                                         (destination "default")
                                         (gateway "192.168.1.254"))))
                                 (name-servers '("192.168.1.252"
                                                 "192.168.1.253")))))

                 ;; Ganeti benutzt SSH für die Kommunikation zwischen Knoten.
                 (service openssh-service-type
                          (openssh-configuration
                           (permit-root-login 'prohibit-password)))

                 (simple-service 'ganeti-hosts-entries hosts-service-type
                                 (list
                                   (host "192.168.1.200" "ganeti.example.com")
                                   (host "192.168.1.201" "node1.example.com"
                                         '("node1"))
                                   (host "192.168.1.202" "node2.example.com"
                                         '("node2"))))

                 (service ganeti-service-type
                          (ganeti-configuration
                           ;; Diese Liste führt die Pfade im Dateisystem auf,
                           ;; wo Abbilder virtueller Maschinen gespeichert
                           ;; werden.
                           (file-storage-paths '("/srv/ganeti/file-storage"))
                           ;; In dieser Variablen konfigurieren wir eine einzige
                           ;; „Variante“ jeweils für sowohl Debootstrap als auch
                           ;; Guix, die KVM benutzt.
                           (os %default-ganeti-os))))
           %base-services)))
@end lisp

Benutzern wird geraten, die
@url{https://docs.ganeti.org/docs/ganeti/3.0/html/admin.html,Anleitung für
Ganeti-Administratoren} zu lesen, um die verschiedenen Optionen für
Ganeti-Cluster und die häufigen Operationen zu erlernen. Es gibt auch einen
@url{https://guix.gnu.org/blog/2020/running-a-ganeti-cluster-on-guix/,Blogeintrag},
der beschreibt, wie man einen kleinen Cluster konfiguriert und
initialisiert.

@defvar ganeti-service-type
Dieser Diensttyp umfasst all die verschiedenen Dienste, die auf
Ganeti-Knoten ausgeführt werden sollen.

Sein Wert ist ein @code{ganeti-configuration}-Objekt, das das Paket für den
Betrieb über die Befehlszeile sowie die Konfiguration der einzelnen Daemons
festlegt. Auch werden zulässige Pfade für die Speicherung in Dateien sowie
verfügbare Gastbetriebssysteme über diesen Datentyp konfiguriert.
@end defvar

@deftp {Datentyp} ganeti-configuration
Der @code{ganeti}-Dienst akzeptiert folgende Konfigurationsoptionen:

@table @asis
@item @code{ganeti} (Vorgabe: @code{ganeti})
Welches @code{ganeti}-Paket benutzt werden soll. Es wird ins Systemprofil
installiert und macht die Befehlszeilenwerkzeuge @command{gnt-cluster},
@command{gnt-instance} usw.@: verfügbar. Beachten Sie, dass der hier
angegebene Wert keinen Einfluss auf die anderen Dienste hat; jeder legt sein
eigenes @code{ganeti}-Paket fest (siehe unten).

@item @code{noded-configuration} (Vorgabe: @code{(ganeti-noded-configuration)})
@itemx @code{confd-configuration} (Vorgabe: @code{(ganeti-confd-configuration)})
@itemx @code{wconfd-configuration} (Vorgabe: @code{(ganeti-wconfd-configuration)})
@itemx @code{luxid-configuration} (Vorgabe: @code{(ganeti-luxid-configuration)})
@itemx @code{rapi-configuration} (Vorgabe: @code{(ganeti-rapi-configuration)})
@itemx @code{kvmd-configuration} (Vorgabe: @code{(ganeti-kvmd-configuration)})
@itemx @code{mond-configuration} (Vorgabe: @code{(ganeti-mond-configuration)})
@itemx @code{metad-configuration} (Vorgabe: @code{(ganeti-metad-configuration)})
@itemx @code{watcher-configuration} (Vorgabe: @code{(ganeti-watcher-configuration)})
@itemx @code{cleaner-configuration} (Vorgabe: @code{(ganeti-cleaner-configuration)})

Mit diesen Optionen stellen Sie die verschiedenen Daemons und Cron-Aufträge
ein, die mit Ganeti eingerichtet werden. Die möglichen Werte dafür werden im
Folgenden genau beschrieben. Um eine Einstellung zu ändern, müssen Sie den
Konfigurationstyp für den jeweiligen Dienst verwenden:

@lisp
(service ganeti-service-type
         (ganeti-configuration
          (rapi-configuration
           (ganeti-rapi-configuration
            (interface "eth1"))))
          (watcher-configuration
           (ganeti-watcher-configuration
            (rapi-ip "10.0.0.1"))))
@end lisp

@item @code{file-storage-paths} (Vorgabe: @code{'()})
Liste zulässiger Verzeichnisse für das in Dateien speichernde
Hintergrundsystem („File Storage Backend“).

@item @code{hooks} (Vorgabe: @code{#f})
Wenn es gesetzt ist, gibt dies ein dateiartiges Objekt für ein Verzeichnis
mit auszuführenden
@url{https://docs.ganeti.org/docs/ganeti/3.0/html/hooks.html,Cluster
Execution Hooks} an.

@item @code{os} (Vorgabe: @code{%default-ganeti-os})
Liste von @code{<ganeti-os>}-Verbundsobjekten.
@end table

Im Kern ist @code{ganeti-service-type} eine Kurzform davon, jeden Dienst
einzeln zu deklarieren:

@lisp
(service ganeti-noded-service-type)
(service ganeti-confd-service-type)
(service ganeti-wconfd-service-type)
(service ganeti-luxid-service-type)
(service ganeti-kvmd-service-type)
(service ganeti-mond-service-type)
(service ganeti-metad-service-type)
(service ganeti-watcher-service-type)
(service ganeti-cleaner-service-type)
@end lisp

Außerdem enthalten ist eine Diensterweiterung für den
@code{etc-service-type}, der das Hintergrundsystem für die Speicherung in
Dateien und die Betriebssystemvarianten festlegt.

@end deftp

@deftp {Datentyp} ganeti-os
Dieser Datentyp wird verwendet, um ihn an den @code{os}-Parameter der
@code{ganeti-configuration} zu übergeben. Er umfasst die folgenden
Parameter:

@table @asis
@item @code{name}
Der Name dieses Betriebssystemanbieters. Sein einziger Zweck ist, anzugeben,
wohin die Konfigurationsdateien geschrieben werden. Wird „debootstrap“
angegeben, wird @file{/etc/ganeti/instance-debootstrap} erstellt.

@item @code{extension} (Vorgabe: @code{#f})
Welche Dateinamenserweiterung die Varianten dieser Art von Betriebssystem
benutzen, zum Beispiel @file{.conf} oder @file{.scm}. Wenn Sie
Variantendateinamen angeben, wird sie angehängt.

@item @code{variants} (Vorgabe: @code{'()})
Entweder eine Liste der @code{ganeti-os-variant}-Objekte für dieses
Betriebssystem oder ein „dateiartiges“ Objekt (siehe @ref{G-Ausdrücke,
dateiartige Objekte}), das das Variantenverzeichnis darstellt.

Wenn Sie den Betriebssystemanbieter für Guix möchten, die Definitionen Ihrer
Varianten aber aus einem lokalen Verzeichnis lesen möchten, statt sie
einzeln zu deklarieren (siehe dazu @var{guix-variants} weiter unten), dann
geht das so:

@lisp
(ganeti-os
 (name "guix")
 (variants (local-file "ganeti-guix-variants"
                       #:recursive? #true)))
@end lisp

Allerdings werden Sie sich um die Datei @file{variants.list} darin in diesem
Fall selbst kümmern müssen (siehe
@code{@url{https://docs.ganeti.org/docs/ganeti/3.0/man/ganeti-os-interface.html,
ganeti-os-interface(7)}}).

@end table
@end deftp

@deftp {Datentyp} ganeti-os-variant
Der Datentyp für eine Variante einer Art von Betriebssystem. Er nimmt die
folgenden Parameter:

@table @asis
@item @code{name}
Der Name dieser Variante.

@item @code{configuration}
Eine Konfigurationsdatei für diese Variante.
@end table
@end deftp

@defvar %default-debootstrap-hooks
Diese Variable enthält Anknüpfungspunkte („Hooks“), um das Netzwerk zu
konfigurieren und den GRUB-Bootloader einzurichten.
@end defvar

@defvar %default-debootstrap-extra-pkgs
Diese Variable führt eine Liste von Paketen auf, die für ein gänzlich
virtualisiertes Gastsystem sinnvoll sind.
@end defvar

@deftp {Datentyp} debootstrap-configuration

Mit diesem Datentyp werden Konfigurationsdateien erzeugt, die für den
debootstrap-Betriebssystemanbieter geeignet sind.

@table @asis
@item @code{hooks} (Vorgabe: @code{%default-debootstrap-hooks})
Wenn es nicht auf @code{#f} steht, muss hier ein G-Ausdruck angegeben
werden, der ein Verzeichnis mit Scripts (sogenannten „Hooks“, d.h.@:
Anknüpfungspunkte) festlegt, welche bei der Installation des Betriebssystems
ausgeführt werden. Es kann auch eine Liste von Paaren der Form @code{(Name
. dateiartiges-Objekt)} angegeben werden. Zum Beispiel:

@lisp
`((99-hallo-welt . ,(plain-file "#!/bin/sh\necho Hallo Welt")))
@end lisp

Damit wird ein Verzeichnis mit einer ausführbaren Datei namens
@code{99-hallo-welt} festgelegt, die jedes Mal ausgeführt wird, wenn diese
Variante installiert wird. Wird hier @code{#f} angegeben, werden die in
@file{/etc/ganeti/instance-debootstrap/hooks} vorgefundenen
Anknüpfungspunkte benutzt, falls vorhanden.
@item @code{proxy} (Vorgabe: @code{#f})
Optional; welcher HTTP-Proxy genutzt werden soll.
@item @code{mirror} (Vorgabe: @code{#f})
Der Spiegelserver für Debian. Üblicherweise wird etwas wie
@code{http://ftp.no.debian.org/debian} angegeben. Die Voreinstellung hängt
von der Distribution ab.
@item @code{arch} (Vorgabe: @code{#f})
Die dpkg-Architektur. Setzen Sie dies z.B.@: auf @code{armhf}, um eine
ARMv7-Instanz auf einem AArch64-Wirtssystem @i{via} debootstrap
einzurichten. Bei der Vorgabeeinstellung wird die aktuelle Systemarchitektur
übernommen.
@item @code{suite} (Vorgabe: @code{"stable"})
Wenn dieses Feld gesetzt ist, muss dafür eine Debian-Distributions-„Suite“
wie @code{buster} oder @code{focal} angegeben werden. Steht es auf
@code{#f}, wird die Voreinstellung für den Betriebssystemanbieter benutzt.
@item @code{extra-pkgs} (Vorgabe: @code{%default-debootstrap-extra-pkgs})
Liste zusätzlicher Pakete, die durch dpkg zusätzlich zum minimalen System
installiert werden.
@item @code{components} (Vorgabe: @code{#f})
Ist dies gesetzt, muss es eine Liste von Bereichen eines Debian-Repositorys
sein, etwa @code{'("main" "contrib")}.
@item @code{generate-cache?} (Vorgabe: @code{#t})
Ob das generierte debootstrap-Archiv automatisch zwischengespeichert werden
soll.
@item @code{clean-cache} (Vorgabe: @code{14})
Nach wie vielen Tagen der Zwischenspeicher verworfen werden soll. Geben Sie
@code{#f} an, damit der Zwischenspeicher niemals bereinigt wird.
@item @code{partition-style} (Vorgabe: @code{'msdos})
Der Partitionstyp der anzulegenden Partition. Wenn er festgelegt ist, muss
er entweder @code{'msdos} oder @code{'none} lauten oder eine Zeichenkette
angegeben werden.
@item @code{partition-alignment} (Vorgabe: @code{2048})
Auf wie viele Sektoren die Partition ausgerichtet werden soll.
@end table
@end deftp

@deffn {Prozedur} debootstrap-variant Name Konfiguration
Diese Hilfsprozedur erzeugt ein @code{ganeti-os-variant}-Verbundsobjekt. Sie
nimmt zwei Parameter entgegen: einen Namen und ein
@code{debootstrap-configuration}-Objekt.
@end deffn

@deffn {Prozedur} debootstrap-os Varianten…
Diese Hilfsprozedur erzeugt ein @code{ganeti-os}-Verbundsobjekt. Sie nimmt
eine Liste von mit @code{debootstrap-variant} erzeugten Varianten entgegen.
@end deffn

@deffn {Prozedur} guix-variant Name Konfiguration
Diese Hilfsprozedur erzeugt ein @code{ganeti-os-variant}-Verbundsobjekt, das
für den vorgegebenen Guix-Betriebssystemanbieter gedacht ist. Als Parameter
anzugeben sind ein Name und ein G-Ausdruck, der ein „dateiartiges“ Objekt
(siehe @ref{G-Ausdrücke, dateiartige Objekte}) mit einer Konfiguration für
Guix System liefert.
@end deffn

@deffn {Prozedur} guix-os Varianten…
Diese Hilfsprozedur erzeugt ein @code{ganeti-os}-Verbundsobjekt. Sie nimmt
eine Liste von durch @code{guix-variant} erzeugten Varianten entgegen.
@end deffn

@defvar %default-debootstrap-variants
Zur Erleichterung kann diese Variable benutzt werden, damit der
debootstrap-Anbieter sofort funktioniert, ohne dass seine Nutzer Varianten
selbst deklarieren müssen. Enthalten ist eine einzige debootstrap-Variante
mit der Standardkonfiguration:

@lisp
(list (debootstrap-variant
       "default"
       (debootstrap-configuration)))
@end lisp
@end defvar

@defvar %default-guix-variants
Zur Erleichterung kann diese Variable benutzt werden, damit der
Guix-Betriebssystemanbieter sofort und ohne weitere Konfiguration
funktioniert. Damit wird eine virtuelle Maschine mit einem SSH-Server, einer
seriellen Konsole und bereits autorisierten Ganeti-Wirts-SSH-Schlüsseln
erzeugt.

@lisp
(list (guix-variant
       "default"
       (file-append ganeti-instance-guix
                    "/share/doc/ganeti-instance-guix/examples/dynamic.scm")))
@end lisp
@end defvar

Benutzer können die Unterstützung für Guix @emph{nicht} bekannte
Betriebssystemanbieter implementieren, indem sie entsprechende Erweiterungen
für die @code{ganeti-os}- und @code{ganeti-os-variant}-Verbundstypen
implementieren. Ein Beispiel:

@lisp
(ganeti-os
 (name "eigenes-os")
 (extension ".conf")
 (variants
  (list (ganeti-os-variant
         (name "foo")
         (configuration (plain-file "bar" "das genügt"))))))
@end lisp

Damit wird @file{/etc/ganeti/instance-eigenes-os/variants/foo.conf} erzeugt,
das auf eine Datei im Store mit dem Inhalt @code{das genügt}
verweist. Außerdem wird
@file{/etc/ganeti/instance-eigenes-os/variants/variants.list} mit dem Inhalt
@code{foo} erzeugt.

Natürlich kann man Betriebssystemanbieter finden, für die das nicht
ausreicht. Wenn Sie sich durch die Schnittstelle in Ihren Möglichkeiten
eingeschränkt fühlen, schreiben Sie bitte an @email{guix-devel@@gnu.org}.

Der übrige Teil dieses Abschnitts beschreibt die verschiedenen Dienste, aus
denen sich der @code{ganeti-service-type} zusammensetzt.

@defvar ganeti-noded-service-type
@command{ganeti-noded} ist der Daemon, der für knotenbezogene Funktionen des
Ganeti-Systems da ist. Sein Wert muss ein
@code{ganeti-noded-configuration}-Objekt sein.
@end defvar

@deftp {Datentyp} ganeti-noded-configuration
Dies ist die Konfiguration des @code{ganeti-noded}-Dienstes für Ganetis
Knoten-Daemon.

@table @asis
@item @code{ganeti} (Vorgabe: @code{ganeti})
Das @code{ganeti}-Paket, was für diesen Dienst benutzt werden soll.

@item @code{port} (Vorgabe: @code{8081})
Der TCP-Port, auf dem der Knoten-Daemon (@code{noded}) auf Netzwerkanfragen
lauscht.

@item @code{address} (Vorgabe: @code{"0.0.0.0"})
An welche Netzwerkadresse sich der Daemon binden wird. Die
Vorgabeeinstellung bedeutet, sich an alle verfügbaren Adressen zu binden.

@item @code{interface} (Vorgabe: @code{#f})
Wenn dieses Feld gesetzt ist, muss es eine bestimmte Netzwerkschnittstelle
angeben (z.B.@: @code{eth0}), an die sich der Daemon binden wird.

@item @code{max-clients} (Vorgabe: @code{20})
Legt eine Maximalzahl gleichzeitiger Client-Verbindungen fest, um die sich
der Daemon kümmert. Darüber hinaus werden Verbindungen zwar akzeptiert, aber
erst beantwortet, wenn genügend viele Verbindungen wieder geschlossen
wurden.

@item @code{ssl?} (Vorgabe: @code{#t})
Ob SSL/TLS benutzt werden soll, um Netzwerkkommunikation zu
verschlüsseln. Das Zertifikat wird automatisch vom Cluster eingespielt und
kann über @command{gnt-cluster renew-crypto} rotiert werden.

@item @code{ssl-key} (Vorgabe: @file{"/var/lib/ganeti/server.pem"})
Hiermit kann ein bestimmter Schlüssel für mit TLS verschlüsselte
Kommunikation festgelegt werden.

@item @code{ssl-cert} (Vorgabe: @file{"/var/lib/ganeti/server.pem"})
Hiermit kann ein bestimmtes Zertifikat für mit TLS verschlüsselte
Kommunikation festgelegt werden.

@item @code{debug?} (Vorgabe: @code{#f})
Steht dies auf wahr, führt der Daemon zum Zweck der Fehlersuche
ausführlichere Protokolle. Beachten Sie, dass dadurch Details der
Verschlüsselung in die Protokolldateien fließen können. Seien Sie
vorsichtig!

@end table
@end deftp

@defvar ganeti-confd-service-type
@command{ganeti-confd} beantwortet Anfragen, die mit der Konfiguration eines
Ganeti-Clusters zu tun haben. Der Zweck dieses Daemons ist, eine
hochverfügbare und schnelle Methode zum Anfragen von
Cluster-Konfigurationswerten zu bieten. Er wird automatisch auf allen
Kandidaten für die Rolle des „Master“-Knotens aktiviert. Der Wert dieses
Dienstes muss ein @code{ganeti-confd-configuration}-Objekt sein.

@end defvar

@deftp {Datentyp} ganeti-confd-configuration
Dies ist die Konfiguration des @code{ganeti-confd}-Dienstes.

@table @asis
@item @code{ganeti} (Vorgabe: @code{ganeti})
Das @code{ganeti}-Paket, was für diesen Dienst benutzt werden soll.

@item @code{port} (Vorgabe: @code{8081})
Der UDP-Port, auf dem auf Netzwerkanfragen gelauscht werden soll.

@item @code{address} (Vorgabe: @code{"0.0.0.0"})
An welche Netzwerkadresse sich der Daemon binden soll.

@item @code{debug?} (Vorgabe: @code{#f})
Steht es auf wahr, wird der Daemon zum Zweck der Fehlersuche ausführlicher
protokollieren.

@end table
@end deftp

@defvar ganeti-wconfd-service-type
@command{ganeti-wconfd} ist der Daemon, der mit autoritativem Wissen über
die Cluster-Konfiguration ausgestattet ist, und die einzige Entität, die
Änderungen daran akzeptieren kann. Alle Aufträge, die die Konfiguration
ändern müssen, tun dies, indem sie entsprechende Anfragen an den Daemon
stellen. Er läuft nur auf dem „Master“-Knoten und deaktiviert sich auf allen
anderen Knoten automatisch.

Der Wert dieses Dienstes muss ein @code{ganeti-wconfd-configuration}-Objekt
sein.
@end defvar

@deftp {Datentyp} ganeti-wconfd-configuration
Dies ist die Konfiguration des @code{ganeti-wconfd}-Dienstes.

@table @asis
@item @code{ganeti} (Vorgabe: @code{ganeti})
Das @code{ganeti}-Paket, was für diesen Dienst benutzt werden soll.

@item @code{no-voting?} (Vorgabe: @code{#f})
Der Daemon wird das Starten verweigern, sofern die Mehrheit der Knoten
@emph{nicht} anerkennt, dass er auf dem Master-Knoten läuft. Setzen Sie dies
auf @code{#t}, um ihn selbst dann zu starten, wenn sich keine Mehrheit dafür
findet (das ist gefährlich; hoffentlich wissen Sie, was Sie tun).

@item @code{debug?} (Vorgabe: @code{#f})
Steht es auf wahr, wird der Daemon zum Zweck der Fehlersuche ausführlicher
protokollieren.

@end table
@end deftp

@defvar ganeti-luxid-service-type
Der Daemon @command{ganeti-luxid} ist dazu da, Anfragen zur Konfiguration
und zum aktuellen Zustand des laufenden Ganeti-Clusters zu beantworten. Des
Weiteren ist es der autoritative Daemon für Ganetis Auftragsliste. Aufträge
können über diesen Daemon eingereicht werden und werden von ihm geplant und
gestartet.

Er nimmt ein @code{ganeti-luxid-configuration}-Objekt entgegen.
@end defvar

@deftp {Datentyp} ganeti-luxid-configuration
Dies ist die Konfiguration des @code{ganeti-luxid}-Dienstes.

@table @asis
@item @code{ganeti} (Vorgabe: @code{ganeti})
Das @code{ganeti}-Paket, was für diesen Dienst benutzt werden soll.

@item @code{no-voting?} (Vorgabe: @code{#f})
Der Daemon verweigert das Starten, wenn er sich nicht sicher sein kann, dass
die Mehrheit der Cluster-Knoten überzeugt ist, dass er auf dem Master-Knoten
läuft. Setzen Sie dies auf @code{#t}, um solche Hinweise zu ignorieren (das
kann gefährlich sein!).

@item @code{debug?} (Vorgabe: @code{#f})
Steht es auf wahr, wird der Daemon zum Zweck der Fehlersuche ausführlicher
protokollieren.

@end table
@end deftp

@defvar ganeti-rapi-service-type
@command{ganeti-rapi} bietet eine Schnittstelle für entfernte Aufrufe
(englisch @dfn{Remote API}) für Ganeti-Cluster. Sie läuft auf dem
Master-Knoten und mit ihr können Aktionen auf dem Cluster programmatisch
mittels eines JSON-basierten Protokolls für entfernte Prozeduraufrufe
durchgeführt werden.

Die meisten Anfrageoperationen werden ohne Authentisierung zugelassen (außer
wenn @var{require-authentication?} gesetzt ist), wohingegen Schreibzugriffe
einer ausdrücklichen Authentisierung durch die Datei
@file{/var/lib/ganeti/rapi/users} bedürfen. Siehe die
@url{https://docs.ganeti.org/docs/ganeti/3.0/html/rapi.html, Dokumentation
der Ganeti Remote API} für mehr Informationen.

Der Wert dieses Dienstes muss ein @code{ganeti-rapi-configuration}-Objekt
sein.
@end defvar

@deftp {Datentyp} ganeti-rapi-configuration
Dies ist die Konfiguration des @code{ganeti-rapi}-Dienstes.

@table @asis
@item @code{ganeti} (Vorgabe: @code{ganeti})
Das @code{ganeti}-Paket, was für diesen Dienst benutzt werden soll.

@item @code{require-authentication?} (Vorgabe: @code{#f})
Ob selbst für Nur-Lese-Operationen eine Authentisierung verlangt werden
soll.

@item @code{port} (Vorgabe: @code{5080})
Der TCP-Port, auf dem auf API-Anfragen gelauscht werden soll.

@item @code{address} (Vorgabe: @code{"0.0.0.0"})
An welche Netzwerkadresse sich der Dienst binden soll. Nach Vorgabe wird auf
allen konfigurierten Adressen gelauscht.

@item @code{interface} (Vorgabe: @code{#f})
Wenn dies gesetzt ist, muss es eine bestimmte Netzwerkschnittstelle angeben
wie z.B.@: @code{eth0}, an die sich der Daemon binden wird.

@item @code{max-clients} (Vorgabe: @code{20})
Die Maximalzahl gleichzeitiger Verbindungen, um die sich der Dienst kümmern
darf. Weitere Verbindungen sind möglich, über sie wird aber erst dann
geantwortet, wenn genügend viele Verbindungen wieder geschlossen wurden.

@item @code{ssl?} (Vorgabe: @code{#t})
Ob SSL-/TLS-Verschlüsselung auf dem RAPI-Port eingesetzt werden soll.

@item @code{ssl-key} (Vorgabe: @file{"/var/lib/ganeti/server.pem"})
Hiermit kann ein bestimmter Schlüssel für mit TLS verschlüsselte
Kommunikation festgelegt werden.

@item @code{ssl-cert} (Vorgabe: @file{"/var/lib/ganeti/server.pem"})
Hiermit kann ein bestimmtes Zertifikat für mit TLS verschlüsselte
Kommunikation festgelegt werden.

@item @code{debug?} (Vorgabe: @code{#f})
Steht dies auf wahr, führt der Daemon zum Zweck der Fehlersuche
ausführlichere Protokolle. Beachten Sie, dass dadurch Details der
Verschlüsselung in die Protokolldateien fließen können. Seien Sie
vorsichtig!

@end table
@end deftp

@defvar ganeti-kvmd-service-type
@command{ganeti-kvmd} ist dafür verantwortlich, festzustellen, wenn eine
gegebene KVM-Instanz durch einen Administrator oder Nutzer geschlossen
wurde. Normalerweise wird Ganeti Instanzen neu starten, die nicht über ihn
selbst gestoppt wurden. Wenn die Cluster-Option @code{user_shutdown} wahr
ist, beobachtet der Daemon den durch QEMU bereitgestellten @code{QMP}-Socket
und lauscht auf Abschalteereignisse. Solche Instanzen werden von ihm als
durch den Benutzer heruntergefahren (@dfn{USER_down}) markiert statt als
durch Fehler beendet (@dfn{ERROR_down}), wenn sie von selbst ordnungsgemäß
heruntergefahren sind.

Der Dienst benutzt ein @code{ganeti-kvmd-configuration}-Objekt.
@end defvar

@deftp {Datentyp} ganeti-kvmd-configuration

@table @asis
@item @code{ganeti} (Vorgabe: @code{ganeti})
Das @code{ganeti}-Paket, was für diesen Dienst benutzt werden soll.

@item @code{debug?} (Vorgabe: @code{#f})
Steht es auf wahr, wird der Daemon zum Zweck der Fehlersuche ausführlicher
protokollieren.

@end table
@end deftp

@defvar ganeti-mond-service-type
@command{ganeti-mond} ist ein optionaler Daemon, mit dem Ganetis
Überwachungsfunktionalität gewährleistet wird. Er ist dafür verantwortlich,
Datensammler auszuführen und die gesammelten Informationen über eine
HTTP-Schnittstelle bereitzustellen.

Der Dienst benutzt ein @code{ganeti-mond-configuration}-Objekt.
@end defvar

@deftp {Datentyp} ganeti-mond-configuration

@table @asis
@item @code{ganeti} (Vorgabe: @code{ganeti})
Das @code{ganeti}-Paket, was für diesen Dienst benutzt werden soll.

@item @code{port} (Vorgabe: @code{1815})
Der Port, auf dem der Daemon lauschen wird.

@item @code{address} (Vorgabe: @code{"0.0.0.0"})
Die Netzwerkadresse, an die sich der Daemon binden soll, nach Vorgabe an
alle verfügbaren.

@item @code{debug?} (Vorgabe: @code{#f})
Steht es auf wahr, wird der Daemon zum Zweck der Fehlersuche ausführlicher
protokollieren.

@end table
@end deftp

@defvar ganeti-metad-service-type
@command{ganeti-metad} ist ein optionaler Daemon, der benutzt werden kann,
um Informationen über den Cluster an Instanzen oder an
Betriebssysteminstallationsskripte weiterzugeben.

Dazu nimmt er ein @code{ganeti-metad-configuration}-Objekt.
@end defvar

@deftp {Datentyp} ganeti-metad-configuration

@table @asis
@item @code{ganeti} (Vorgabe: @code{ganeti})
Das @code{ganeti}-Paket, was für diesen Dienst benutzt werden soll.

@item @code{port} (Vorgabe: @code{80})
Der Port, auf dem der Daemon lauschen wird.

@item @code{address} (Vorgabe: @code{#f})
Wenn es gesetzt ist, wird sich der Daemon nur an diese Adresse binden. Ist
es @emph{nicht} gesetzt, hängt das Verhalten von der Cluster-Konfiguration
ab.

@item @code{debug?} (Vorgabe: @code{#f})
Steht es auf wahr, wird der Daemon zum Zweck der Fehlersuche ausführlicher
protokollieren.

@end table
@end deftp

@defvar ganeti-watcher-service-type
@command{ganeti-watcher} ist ein Skript, das dafür gedacht ist, regelmäßig
ausgeführt zu werden und die Verfügbarkeit des Clusters
sicherzustellen. Instanzen, die ohne Ganetis Zustimmung abgebrochen sind,
werden durch es automatisch neu gestartet und DRBD-Verbindungen werden
repariert, wenn ein Knoten neu gestartet wurde. Außerdem werden alte
Cluster-Aufträge archiviert und nicht laufende Ganeti-Daemons erneut
gestartet. Wenn der Cluster-Parameter @code{ensure_node_health} gesetzt ist,
wird der Watcher auch Instanzen und DRBD-Geräte herunterfahren, wenn der
Knoten zwar läuft, aber von bekannten Kandidaten auf die Rolle des
Master-Knotens als offline deklariert wurde.

Er kann mit @command{gnt-cluster watcher pause} auf allen Knoten pausiert
werden.

Der Dienst benutzt ein @code{ganeti-watcher-configuration}-Objekt.
@end defvar

@deftp {Datentyp} ganeti-watcher-configuration

@table @asis
@item @code{ganeti} (Vorgabe: @code{ganeti})
Das @code{ganeti}-Paket, was für diesen Dienst benutzt werden soll.

@item @code{schedule} (default: @code{"*/5 * * * *"})
When to run the script, expressed either as a string in traditional cron
syntax or as a gexp representing a Shepherd calendar event (@pxref{Timers,,,
shepherd, The GNU Shepherd Manual}).  The default is every five minutes.

@item @code{rapi-ip} (Vorgabe: @code{#f})
Diese Option muss nur dann angegeben werden, wenn der RAPI-Daemon so
konfiguriert wurde, dass er eine bestimmte Schnittstelle oder Adresse
verwenden soll. Nach Vorgabe wird die Adresse des Clusters verwendet.

@item @code{job-age} (Vorgabe: @code{(* 6 3600)})
Cluster-Aufträge archivieren, die älter als diese Anzahl Sekunden sind. Die
Vorgabe beträgt 6@tie{}Stunden. Dadurch wird gewährleistet, dass man
@command{gnt-job list} noch sinnvoll bedienen kann.

@item @code{verify-disks?} (Vorgabe: @code{#t})
Steht dies auf @code{#f}, wird der Watcher @emph{nicht} versuchen,
fehlgeschlagene DRBD-Verbindungen automatisch zu reparieren. Administratoren
müssen stattdessen @command{gnt-cluster verify-disks} manuell aufrufen.

@item @code{debug?} (Vorgabe: @code{#f})
Steht dies auf @code{#t}, so führt das Skript zum Zweck der Fehlersuche
ausführlichere Protokolle.

@end table
@end deftp

@defvar ganeti-cleaner-service-type
@command{ganeti-cleaner} ist ein Skript, das regelmaßig ausgeführt werden
soll, um alte Dateien vom Cluster zu entfernen. Dieser Diensttyp steuert
zwei @dfn{cron-Aufträge} (@dfn{cron jobs}): einer, um alte Cluster-Aufträge
auf dem Master-Knoten andauernd zu löschen, und einer, der auf allen Knoten
ausgelaufene X509-Zertifikate, -Schlüssel sowie veraltete Informationen des
@command{ganeti-watcher} entfernt. Wie alle Ganeti-Dienste kann man ihn ohne
Probleme auch auf Nicht-Master-Knoten in die Konfiguration mit aufnehmen,
denn er deaktiviert sich selbst, wenn er nicht gebraucht wird.

Der Dienst benutzt ein @code{ganeti-cleaner-configuration}-Objekt.
@end defvar

@deftp {Datentyp} ganeti-cleaner-configuration

@table @asis
@item @code{ganeti} (Vorgabe: @code{ganeti})
Welches @code{ganeti}-Paket für den Befehl @command{gnt-cleaner} benutzt
werden soll.

@item @code{master-schedule} (Vorgabe: @code{"45 1 * * *"})
Wie oft der Bereinigungsauftrag für den Master durchgeführt werden
soll. Vorgegeben ist einmal täglich um 01:45:00 Uhr.

@item @code{node-schedule} (Vorgabe: @code{"45 2 * * *"})
Wie oft der Bereinigungsauftrag für Knoten durchgeführt werden
soll. Vorgegeben ist einmal täglich um 02:45:00 Uhr.

@end table
@end deftp

@node Versionskontrolldienste
@subsection Versionskontrolldienste

Das Modul @code{(gnu services version-control)} stellt einen Dienst zur
Verfügung, der einen Fernzugriff auf lokale Git-Repositorys
ermöglicht. Dafür gibt es drei Möglichkeiten: den
@code{git-daemon-service-type}, der Zugang zu Repositorys über das
ungesicherte, TCP-basierte @code{git://}-Protokoll gewährt, das Erweitern
des @code{nginx}-Webservers, um ihn als Proxy für Anfragen an das
@code{git-http-backend} einzusetzen, oder mit dem @code{cgit-service-type}
eine Weboberfläche zur Verfügung zu stellen.

@defvar git-daemon-service-type
Diensttyp für einen Dienst, der @command{git daemon} ausführt. Der Befehl
startet den Git-Daemon, einen einfachen TCP-Server, um Repositorys über das
Git-Protokoll für anonymen Zugriff zugänglich zu machen.

Der Wert des Dienstes muss ein
@code{<git-daemon-configuration>}-Verbundsobjekt sein. Nach Vorgabe wird
Lese-Zugriff auf exportierte@footnote{Das geschieht, indem die magische
Datei @file{git-daemon-export-ok} im Repository erzeugt wird.} Repositorys
in @file{/srv/git} gewährt.
@end defvar

@deftp {Datentyp} git-daemon-configuration
Datentyp, der die Konfiguration für @code{git-daemon-service-type}
repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @code{git})
Paketobjekt des verteilten Versionskontrollsystems Git.

@item @code{export-all?} (Vorgabe: @code{#f})
Ob Zugriff auf alle Git-Repositorys gewährt werden soll, selbst wenn keine
@file{git-daemon-export-ok}-Datei in ihrem Verzeichnis gefunden wird.

@item @code{base-path} (Vorgabe: @file{/srv/git})
Ob alle Pfadanfragen behandelt werden sollen, als wären sie relativ zum
angegebenen Pfad. Wenn Sie @command{git daemon} mit @code{(base-path
"/srv/git")} auf @samp{example.com} ausführen und später versuchen,
@indicateurl{git://example.com/hello.git} zu pullen, wird der Git-Daemon den
Pfad als @file{/srv/git/hello.git} interpretieren.

@item @code{user-path} (Vorgabe: @code{#f})
Ob die @code{~benutzerkonto}-Notation in Anfragen verwendet werden
darf. Wird hier die leere Zeichenkette angegeben, werden Anfragen an
@indicateurl{git://host/~alice/foo} als Anfragen verstanden, auf das
@code{foo}-Repository im Persönlichen Verzeichnis des
@code{alice}-Benutzerkontos verstanden. Wird @code{(user-path "pfad")}
angegeben, wird dieselbe Anfrage als eine Anfrage verstanden, auf das
@file{@var{pfad}/foo}-Repository im Persönlichen Verzeichnis des
@code{alice}-Benutzerkontos zuzugreifen.

@item @code{listen} (Vorgabe: @code{'()})
Ob auf bestimmte IP-Adressen oder Rechnernamen („Hostnames“) gelauscht
werden soll. Vorgegeben ist auf allen.

@item @code{port} (Vorgabe: @code{#f})
Ob auf einer alternativen Portnummer gelauscht werden soll. Vorgegeben ist
9418.

@item @code{whitelist} (Vorgabe: @code{'()})
Wenn dies nicht leer gelassen wird, wird nur der Zugriff auf die
aufgelisteten Verzeichnisse gewährt.

@item @code{extra-options} (Vorgabe: @code{'()})
Zusätzliche Befehlszeilenoptionen, die dem @command{git daemon} mitgegeben
werden sollen@footnote{Führen Sie @command{man git-daemon} aus, um weitere
Informationen zu erhalten.}.

@end table
@end deftp

Zugriffe über das @code{git://}-Protokoll werden nicht authentifiziert. Wenn
Sie von einem Repository pullen, dass Sie über @code{git://} geholt haben,
wissen Sie nicht, ob die empfangenen Daten modifiziert wurden oder auch nur
vom angegebenen Rechner kommen, und Ihre Verbindung kann abgehört werden. Es
ist besser, eine authentifizierte und verschlüsselte Übertragungsart zu
verwenden, zum Beispiel @code{https}. Obwohl Git es Ihnen ermöglicht,
Repositorys über schlichte dateibasierte Webserver anzubieten, gibt es ein
schnelleres Protokoll, das vom @code{git-http-backend}-Programm
implementiert wird. Dieses Programm dient als Hintergrundsystem für einen
ordentlichen Git-Webdienst. Es wurde so konstruiert, dass es über einen
FastCGI-Proxy abrufbar ist. Siehe @ref{Web-Dienste} für weitere
Informationen, wie Sie den benötigten @code{fcgiwrap}-Daemon ausführen.

Guix hat einen separaten Konfigurationsdatentyp, um Git-Repositorys über
HTTP anzubieten.

@deftp {Datentyp} git-http-configuration
Datentyp, der in Zukunft die Konfiguration eines
@code{git-http-service-type} repräsentieren soll; zurzeit kann damit Nginx
über @code{git-http-nginx-location-configuration} eingerichtet werden.

@table @asis
@item @code{package} (Vorgabe: @var{git})
Paketobjekt des verteilten Versionskontrollsystems Git.

@item @code{git-root} (Vorgabe: @file{/srv/git})
Das Verzeichnis, das die Git-Repositorys enthält, die der Allgemeinheit
zugänglich gemacht werden sollen.

@item @code{export-all?} (Vorgabe: @code{#f})
Ob alle Git-Repositorys in @var{git-root} zugänglich gemacht werden sollen,
selbst wenn keine @file{git-daemon-export-ok}-Datei in ihrem Verzeichnis
gefunden wird.

@item @code{uri-path} (Vorgabe: @samp{/git/})
Präfix für Pfade beim Git-Zugriff. Beim vorgegebenen Präfix @samp{/git/}
wird @indicateurl{http://@var{server}/git/@var{repo}.git} auf
@file{/srv/git/@var{repo}.git} abgebildet. Anfragen, deren URI-Pfade nicht
mit dem Präfix beginnen, werden nicht an die Git-Instanz weitergereicht.

@item @code{fcgiwrap-socket} (Vorgabe: @code{127.0.0.1:9000})
Der Socket, auf dem der @code{fcgiwrap}-Daemon lauscht. Siehe @ref{Web-Dienste}.
@end table
@end deftp

Es gibt zurzeit keinen @code{git-http-service-type}, stattdessen können Sie
eine @code{nginx-location-configuration} aus einer
@code{git-http-configuration} heraus erstellen und als Location zu einem
Webserver hinzufügen.

@deffn {Prozedur} git-http-nginx-location-configuration @
       [config=(git-http-configuration)]
Eine @code{nginx-location-configuration} berechnen, die der angegebenen
Git-HTTP-Konfiguration entspricht. Ein Beispiel für eine
nginx-Dienstdefinition, um das vorgegebene @file{/srv/git}-Verzeichnis über
HTTPS anzubieten, könnte so aussehen:

@lisp
(service nginx-service-type
         (nginx-configuration
          (server-blocks
           (list
            (nginx-server-configuration
             (listen '("443 ssl"))
             (server-name "git.mein-rechner.org")
             (ssl-certificate
              "/etc/certs/git.mein-rechner.org/fullchain.pem")
             (ssl-certificate-key
              "/etc/certs/git.mein-rechner.org/privkey.pem")
             (locations
              (list
               (git-http-nginx-location-configuration
                (git-http-configuration (uri-path "/"))))))))))
@end lisp

Für dieses Beispiel nehmen wir an, dass Sie Ihr TLS-Zertifikat über Let’s
Encrypt beziehen. Siehe @ref{Zertifikatsdienste}. Der vorgegebene
@code{certbot}-Dienst leitet alle HTTP-Anfragen nach
@code{git.mein-rechner.org} auf HTTPS um. Zu Ihren Systemdiensten werden Sie
auch einen @code{fcgiwrap}-Proxy hinzufügen müssen. Siehe @ref{Web-Dienste}.
@end deffn

@subsubheading Cgit-Dienst

@cindex Cgit-Dienst
@cindex Git, Weboberfläche
@uref{https://git.zx2c4.com/cgit/, Cgit} ist eine in C geschriebene
Weboberfläche als Vordergrundsystem für Git-Repositorys.

Im folgenden Beispiel wird der Dienst mit den vorgegebenen Werten
eingerichtet. Nach Vorgabe kann auf Cgit auf Port 80 unter
@code{http://localhost:80} zugegriffen werden.

@lisp
(service cgit-service-type)
@end lisp

Der Typ @code{Dateiobjekt} bezeichnet entweder ein dateiartiges Objekt
(siehe @ref{G-Ausdrücke, dateiartige Objekte}) oder eine Zeichenkette.

@c %start of fragment

Verfügbare @code{cgit-configuration}-Felder sind:

@deftypevr {@code{cgit-configuration}-Parameter} „package“ package
Das CGIT-Paket.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} „nginx-server-configuration-list“ nginx
NGINX-Konfiguration.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Dateiobjekt about-filter
Gibt einen Befehl an, der zur Formatierung des Inhalts der Übersichtsseiten
aufgerufen wird (sowohl auf oberster Ebene und für jedes Repository).

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette agefile
Gibt einen Pfad relativ zu jedem Repository-Pfad an, unter dem eine Datei
gespeichert sein kann, die Datum und Uhrzeit des jüngsten Commits im
Repository angibt.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Dateiobjekt auth-filter
Gibt einen Befehl an, der aufgerufen wird, um Benutzer zu authentifizieren.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette branch-sort
Wenn diese Option auf @samp{age} gesetzt wurde, wird die Liste der
Branch-Referenzen nach Datum sortiert, und wenn sie auf @samp{name} gesetzt
wurde, wird nach dem Branch-Namen sortiert.

Die Vorgabe ist @samp{"name"}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette cache-root
Pfad, unter dem Cgit-Zwischenspeichereinträge abgelegt werden.

Die Vorgabe ist @samp{"/var/cache/cgit"}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl cache-static-ttl
Zahl, die angibt, wie viele Minuten die Zwischenspeicherungen für
Repository-Seiten mit fester SHA1-Summe gültig bleiben, auf die zugegriffen
wird („Time-to-live“).

Die Vorgabe ist @samp{-1}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl cache-dynamic-ttl
Zahl, die angibt, wie viele Minuten die Zwischenspeicherungen für
Repository-Seiten mit veränderlicher SHA1-Summe gültig bleiben, auf die
zugegriffen wird.<

Die Vorgabe ist @samp{5}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl cache-repo-ttl
Zahl, die angibt, wie viele Minuten die Zwischenspeicherungen für die
Übersichtsseiten („summary“) von Repositorys gültig bleiben.

Die Vorgabe ist @samp{5}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl cache-root-ttl
Zahl, die angibt, wie viele Minuten die Zwischenspeicherung der Seite mit
dem Repository-Index gültig bleibt.

Die Vorgabe ist @samp{5}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl cache-scanrc-ttl
Zahl, die angibt, wie viele Minuten die Zwischenspeicherung des Ergebnisses
einer Suche in einem Pfad nach Git-Repositorys gültig bleibt.

Die Vorgabe ist @samp{15}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl cache-about-ttl
Zahl, die angibt, wie viele Minuten die Zwischenspeicherungen für die
Beschreibungsseiten („about“) von Repositorys gültig bleiben.

Die Vorgabe ist @samp{15}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl cache-snapshot-ttl
Zahl, die angibt, wie viele Minuten die Zwischenspeicherungen für die
Snapshots von Repositorys gültig bleiben.

Die Vorgabe ist @samp{5}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl cache-size
Wie viele Einträge der Cgit-Zwischenspeicher höchstens haben kann. Wird
@samp{0} festgelegt, wird @emph{nicht} zwischengespeichert.

Die Vorgabe ist @samp{0}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck case-sensitive-sort?
Ob beim Sortieren von Objekten in der Repository-Liste die
Groß-/Kleinschreibung beachtet werden soll.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Liste clone-prefix
Liste gemeinsamer Präfixe, von denen ein Repository geklont werden
kann. D.h.@: dass, wenn eines mit einer Repository-URL kombiniert wird, eine
gültige URL zum Klonen des Repositorys entsteht.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Liste clone-url
Liste von Schablonen, aus denen eine @code{clone-url} entsteht.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Dateiobjekt commit-filter
Befehl, mit dem Commit-Nachrichten formatiert werden.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette commit-sort
Wenn diese Option als @samp{date} festgelegt wird, wird das Commit-Log
streng nach Datum geordnet. Wenn sie auf @samp{topo} gesetzt ist, wird es
streng topologisch geordnet.

Die Vorgabe ist @samp{"git log"}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Dateiobjekt css
URL, die angibt, welches CSS-Dokument von jeder Cgit-Seite eingebunden
werden soll.

Die Vorgabe ist @samp{"/share/cgit/cgit.css"}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Dateiobjekt email-filter
Gibt einen Befehl an, um die Namen und E-Mail-Adressen der Committer,
Autoren und Tagger zu formatieren, die an verschiedenen Stellen in der
Oberfläche von Cgit vorkommen.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck embedded?
Wenn diese Option auf @samp{#t} gesetzt ist, wird Cgit ein HTML-Fragment
erzeugen, das für die Einbettung in andere HTML-Seiten geeignet ist.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck enable-commit-graph?
Wenn diese Option auf @samp{#t} gesetzt ist, wird Cgit den Graphen der
Commit-Historie links von den Commit-Nachrichten auf den Commit-Log-Seiten
mit ASCII-Zeichen darstellen.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck enable-filter-overrides?
Wenn diese Option auf @samp{#t} gesetzt ist, können alle Filtereinstellungen
durch die cgitrc-Dateien für das jeweilige Repository geändert werden.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck enable-follow-links?
Wenn diese Option auf @samp{#t} gesetzt ist, können Benutzer in der
Log-Ansicht einer Datei folgen („--follow“).

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck enable-http-clone?
Wenn es auf @samp{#t} gesetzt ist, kann Cgit als Endpunkt für eine
Dumb-HTTP-Übertragung mit „git clone“ benutzt werden.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck enable-index-links?
Wenn diese Option auf @samp{#t} gesetzt ist, legt Cgit für jedes Repository
zusätzlich Hyperlinks „summary“, „commit“, „tree“ im Repository-Index an.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck enable-index-owner?
Wenn diese Option auf @samp{#t} gesetzt ist, zeigt Cgit den Besitzer für
jedes Repository im Repository-Index an.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck enable-log-filecount?
Wenn diese Option auf @samp{#t} gesetzt ist, zeigt Cgit für jeden Commit auf
den Repository-Log-Seiten die geänderten Dateien an.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck enable-log-linecount?
Wenn diese Option auf @samp{#t} gesetzt ist, zeigt Cgit für jeden Commit auf
den Repository-Log-Seiten die Anzahl der hinzugefügten und entfernten Zeilen
an.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck enable-remote-branches?
Wenn diese Option auf @samp{#t} gesetzt ist, zeigt Cgit unter den „summary“-
und „ref“-Seiten entfernte Branches an.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck enable-subject-links?
Wenn diese Option auf @samp{#t} gesetzt ist, zeigt Cgit für Links auf
Eltern-Commits die Betreffzeile des Eltern-Commits als Linktext in der
Commit-Ansicht an.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck enable-html-serving?
Flag which, when set to @samp{#t}, will make cgit use the subject of the
parent commit as link text when generating links to parent commits in commit
view.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck enable-tree-linenumbers?
Wenn diese Option auf @samp{#t} gesetzt ist, zeigt Cgit für jeden Blob aus
reinem Text Links auf dessen Zeilennummern in der Baumansicht („tree“) an.

Die Vorgabe ist @samp{#t}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck enable-git-config?
Flag which, when set to @samp{#f}, will allow cgit to use Git config to set
any repo specific settings.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Dateiobjekt favicon
URL, auf der ein Cgit-Symbol für die Anzeige in einem Webbrowser zu finden
ist.

Die Vorgabe ist @samp{"/favicon.ico"}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette footer
Der Inhalt der für diese Option angegebenen Datei wird wortwörtlich am Ende
jeder Seite eingefügt (d.h.@: er ersetzt die vorgegebene Mitteilung
„generated by …“).

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette head-include
Der Inhalt der für diese Option angegebenen Datei wird wortwörtlich im
HTML-HEAD-Bereich jeder Seite eingefügt.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette header
Der Inhalt der für diese Option angegebenen Datei wird wortwörtlich am
Anfang jeder Seite eingefügt.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Dateiobjekt include
Der Name einer Konfigurationsdatei, deren Inhalt eingefügt werden soll,
bevor die übrige hier angegebene Konfiguration eingelesen wird.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette index-header
Der Inhalt der mit dieser Option angegebenen Datei wird wortwörtlich
oberhalb des Repository-Index eingefügt.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette index-info
Der Inhalt der mit dieser Option angegebenen Datei wird wortwörtlich
unterhalb der Überschrift auf jeder Repository-Index-Seite eingefügt.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck local-time?
Wenn diese Option auf @samp{#t} gesetzt ist, gibt Cgit die Zeitstempel von
Commits und Tags in der Zeitzone des Servers an.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Dateiobjekt logo
URL, unter der ein Bild zu finden ist, das auf allen Cgit-Seiten als Logo zu
sehen sein wird.

Die Vorgabe ist @samp{"/share/cgit/cgit.png"}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette logo-link
URL, die geladen wird, wenn jemand auf das Logo-Bild klickt.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Dateiobjekt owner-filter
Befehl, der aufgerufen wird, um die Besitzerspalte auf der Hauptseite zu
formatieren.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl max-atom-items
Anzahl der Objekte, die in der Atom-Feed-Ansicht angezeigt werden sollen.

Die Vorgabe ist @samp{10}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl max-commit-count
Anzahl der Einträge, die in der Log-Ansicht pro Seite angezeigt werden
sollen.

Die Vorgabe ist @samp{50}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl max-message-length
Anzahl der Zeichen, die in der Log-Ansicht von jeder Commit-Nachricht
angezeigt werden sollen.

Die Vorgabe ist @samp{80}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl max-repo-count
Gibt an, wie viele Einträge auf jeder Seite der Repository-Index-Seiten
stehen.

Die Vorgabe ist @samp{50}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl max-repodesc-length
Gibt die maximale Anzahl der Zeichen an, die von jeder
Repository-Beschreibung auf den Repository-Index-Seiten angezeigt werden
sollen.

Die Vorgabe ist @samp{80}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl max-blob-size
Gibt die maximale Größe eines Blobs in Kilobytes an, für den HTML angezeigt
werden soll.

Die Vorgabe ist @samp{0}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette max-stats
Maximaler Zeitraum für Statistiken. Gültige Werte sind @samp{week} (Woche),
@samp{month} (Monat), @samp{quarter} (Quartal) und @samp{year} (Jahr).

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Mimetype-Assoziative-Liste mimetype
Mimetype je für die angegebene Dateinamenserweiterung.

Die Vorgabe ist @samp{'((gif "image/gif") (html "text/html") (jpg
"image/jpeg") (jpeg "image/jpeg") (pdf "application/pdf") (png "image/png")
(svg "image/svg+xml"))}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Dateiobjekt mimetype-file
Gibt an, welche Datei zur automatischen Auflösung des Mimetypes benutzt
werden soll.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette module-link
Text, der als Formatzeichenkette für einen Hyperlink benutzt wird, wenn in
einer Verzeichnisauflistung ein Submodul ausgegeben wird.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck nocache?
Wenn dies auf @samp{#t} gesetzt ist, wird nicht zwischengespeichert.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck noplainemail?
Wenn dies auf @samp{#t} gesetzt ist, werden keine vollen E-Mail-Adressen
angezeigt.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck noheader?
Wenn diese Option auf @samp{#t} gesetzt ist, wird Cgit die
Standardseitenkopf auf allen Seiten weglassen.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Projektliste project-list
Eine Liste der Unterverzeichnisse innerhalb des mit
@code{repository-directory} festgelegten Verzeichnisses, relativ dazu
angegeben, die als Git-Repositorys geladen werden sollen. Eine leere Liste
bedeutet, dass alle Unterverzeichnisse geladen werden.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Dateiobjekt readme
Text, der als voreingestellter Wert für @code{readme} in
@code{repository-cgit-configuration} benutzt wird.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck remove-suffix?
Wenn es auf @code{#t} gesetzt ist und @code{repository-directory} aktiviert
ist, wird, wenn Repositorys mit einem Suffix von @code{.git} gefunden
werden, dieses Suffix von der URL und dem Namen weggelassen.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl renamelimit
Maximale Anzahl der Dateien, die bei der Erkennung von Umbenennungen
berücksichtigt werden.

Die Vorgabe ist @samp{-1}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette repository-sort
Auf welche Art Repositorys in jedem Abschnitt sortiert werden.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Robots-Liste robots
Text, der als Inhalt des @code{robots}-Meta-Tags dienen soll.

Die Vorgabe ist @samp{'("noindex" "nofollow")}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette root-desc
Welcher Text unterhalb der Überschrift auf Repository-Index-Seiten
ausgegeben wird.

Die Vorgabe ist @samp{"a fast webinterface for the git dscm"}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette root-readme
Der Inhalt der mit dieser Option angegebenen Datei wird wortwörtlich unter
dem „about“-Link auf der Repository-Index-Seite angezeigt.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette root-title
Welcher Text als Überschrift auf Repository-Index-Seiten ausgegeben werden
soll.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck scan-hidden-path
Wenn es auf @samp{#t} gesetzt ist und repository-directory aktiviert ist,
wird repository-directory in Verzeichnissen rekursiv schauen, deren Name mit
einem Punkt beginnt. Ansonsten werden solche Verzeichnisse unter
repository-directory als „versteckt“ betrachtet und ignoriert. Beachten Sie,
dass dies keine Wirkung auf das @file{.git}-Verzeichnis in @emph{nicht} auf
„bare“ gestellten Repositorys hat.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Liste snapshots
Dieser Text gibt an, für welche Snapshot-Formate Cgit Links erzeugt.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Repository-Verzeichnis repository-directory
Der Name des Verzeichnisses, in dem nach Repositorys gesucht wird (wird als
@code{scan-path} in die Einstellungen übernommen).

Die Vorgabe ist @samp{"/srv/git"}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette section
Der Name des aktuellen Abschnitts („section“) für Repositorys@tie{}– alle
später definierten Repositorys werden den aktuellen Abschnittsnamen erben.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette section-sort
Wenn diese Option auf @samp{#t} gesetzt wird, werden die Abschnitte in
Repository-Auflistungen nach Namen sortiert.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl section-from-path
Wenn diese Zahl vor „repository-directory“ definiert wurde, gibt sie an, wie
viele Pfadelemente jedes Repository-Pfads für den Abschnittsnamen
voreingestellt verwendet werden.

Die Vorgabe ist @samp{0}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Boolescher-Ausdruck side-by-side-diffs?
Wenn es auf @samp{#t} gesetzt ist, werden Diffs nach Voreinstellung in
Nebeneinanderdarstellung („side by side“) statt als zusammengeführte
„Unidiffs“ angezeigt.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Dateiobjekt source-filter
Gibt einen Befehl an, der aufgerufen wird, um Klartext-Blobs in der
Baumansicht („tree“) zu formatieren.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl summary-branches
Gibt die Anzahl der Branches an, die in der „summary“-Ansicht eines
Repositorys zu sehen sein sollen.

Die Vorgabe ist @samp{10}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl summary-log
Gibt die Anzahl der Log-Einträge an, die in der „summary“-Ansicht eines
Repositorys zu sehen sein sollen.

Die Vorgabe ist @samp{10}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Ganze-Zahl summary-tags
Gibt die Anzahl in der „summary“-Ansicht eines Repositorys anzuzeigender
Tags an.

Die Vorgabe ist @samp{10}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette strict-export
Wenn dieser Dateiname angegeben wird, muss eine Datei diesen Namens in einem
Repository enthalten sein, damit es angezeigt wird.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Zeichenkette virtual-root
Wird diese URL angegeben, wird sie als Wurzel für alle Cgit-Links verwendet.

Die Vorgabe ist @samp{"/"}.

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} „repository-cgit-configuration“-Liste repositories
Eine Liste von @dfn{repository-cgit-configuration}-Verbundsobjekten.

Die Vorgabe ist @samp{'()}.

Verfügbare @code{repository-cgit-configuration}-Felder sind:

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Liste snapshots
Eine Maske, die für dieses Repository auf die Snapshots gelegt wird, für die
Cgit Links erzeugt. Dadurch kann die globale Einstellung  @code{snapshots}
eingeschränkt werden.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Dateiobjekt source-filter
Die Voreinstellung für @code{source-filter} ersetzen.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Zeichenkette url
Die relative URL, mit der auf das Repository zugegriffen wird.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Dateiobjekt about-filter
Die Voreinstellung für @code{about-filter} ersetzen.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Zeichenkette branch-sort
Wenn diese Option auf @samp{age} gesetzt wurde, wird die Liste der
Branch-Referenzen nach Datum sortiert, und wenn sie auf @samp{name} gesetzt
wurde, wird nach dem Branch-Namen sortiert.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Liste clone-url
Eine Liste von URLs, von denen das Repository geklont werden kann.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Dateiobjekt commit-filter
Die Voreinstellung für @code{commit-filter} ersetzen.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Dateiobjekt commit-sort
Wenn diese Option als @samp{date} festgelegt wird, wird das Commit-Log
streng nach Datum geordnet. Wenn sie auf @samp{topo} gesetzt ist, wird es
streng topologisch geordnet.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Zeichenkette defbranch
Der Name des voreingestellten Branches dieses Repositorys. Wenn kein solcher
Branch im Repository existiert, wird der erste Branchname in sortierter
Reihenfolge voreingestellt. Nach Vorgabe wird der Branch voreingestellt, auf
den HEAD zeigt, oder „master“, wenn es keinen passenden HEAD gibt.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Zeichenkette desc
Der Wert, der als Repository-Beschreibung angezeigt werden soll.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Zeichenkette homepage
Der Wert, der als Repository-Homepage angezeigt werden soll.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Dateiobjekt email-filter
Die Voreinstellung für @code{email-filter} ersetzen.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Vielleicht-Repo-Boolescher-Ausdruck enable-commit-graph?
Eine Option, mit der die globale Einstellung für @code{enable-commit-graph?}
deaktiviert werden kann.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Vielleicht-Repo-Boolescher-Ausdruck enable-log-filecount?
Eine Option, mit der die globale Einstellung für
@code{enable-log-filecount?} deaktiviert werden kann.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Vielleicht-Repo-Boolescher-Ausdruck enable-log-linecount?
Eine Option, mit der die globale Einstellung für
@code{enable-log-linecount?} deaktiviert werden kann.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Vielleicht-Repo-Boolescher-Ausdruck enable-remote-branches?
Wenn diese Option auf @samp{#t} gesetzt ist, zeigt Cgit unter den „summary“-
und „ref“-Seiten entfernte Branches an.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Vielleicht-Repo-Boolescher-Ausdruck enable-subject-links?
Eine Option, mit der die globale Einstellung für
@code{enable-subject-links?} deaktiviert werden kann.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Vielleicht-Repo-Boolescher-Ausdruck enable-html-serving?
Eine Option, mit der die globale Einstellung für @code{enable-html-serving?}
deaktiviert werden kann.

Der Vorgabewert ist @samp{disabled} (d.h.@: deaktiviert).

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Boolescher-Ausdruck hide?
Wenn diese Option auf @code{#t} gesetzt ist, wird das Repository im
Repository-Index verborgen.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Boolescher-Ausdruck ignore?
Wenn diese Option auf @code{#t} gesetzt ist, wird das Repository ignoriert.

Vorgegeben ist @samp{#f}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Dateiobjekt logo
URL, unter der ein Bild zu finden ist, das auf allen Seiten dieses
Repositorys als Logo zu sehen sein wird.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Zeichenkette logo-link
URL, die geladen wird, wenn jemand auf das Logo-Bild klickt.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Dateiobjekt owner-filter
Die Voreinstellung für @code{owner-filter} ersetzen.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Zeichenkette module-link
Text, der als Formatzeichenkette für einen Hyperlink benutzt wird, wenn in
einer Verzeichnisauflistung ein Submodul ausgegeben wird. Die Argumente für
diese Formatzeichenkette sind Pfad und SHA1 des Submodul-Commits.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} module-link-Pfad module-link-path
Text, der als Formatzeichenkette für einen Hyperlink benutzt wird, wenn in
einer Verzeichnisauflistung ein Submodul mit dem angegebenen
Unterverzeichnispfad ausgegeben wird.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Zeichenkette max-stats
Die Voreinstellung für den maximalen Zeitraum für Statistiken ersetzen.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Zeichenkette name
Welcher Wert als Repository-Name angezeigt werden soll.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Zeichenkette owner
Ein Wert, um den Besitzer des Repositorys zu identifizieren.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Zeichenkette path
Ein absoluter Pfad zum Repository-Verzeichnis.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Zeichenkette readme
Ein Pfad (relativ zum Repository), der eine Datei angibt, deren Inhalt
wortwörtlich auf der „About“-Seite dieses Repositorys eingefügt werden soll.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Zeichenkette section
Der Name des aktuellen Abschnitts („section“) für Repositorys@tie{}– alle
später definierten Repositorys werden den aktuellen Abschnittsnamen erben.

Die Vorgabe ist @samp{""}.

@end deftypevr

@deftypevr {@code{repository-cgit-configuration}-Parameter} Repo-Liste extra-options
Zusätzliche Optionen werden an die cgitrc-Datei angehängt.

Die Vorgabe ist @samp{'()}.

@end deftypevr

@end deftypevr

@deftypevr {@code{cgit-configuration}-Parameter} Liste extra-options
Zusätzliche Optionen werden an die cgitrc-Datei angehängt.

Die Vorgabe ist @samp{'()}.

@end deftypevr


@c %end of fragment

Aber es könnte auch sein, dass Sie schon eine @code{cgitrc} haben und zum
Laufen bringen wollen. In diesem Fall können Sie eine
@code{opaque-cgit-configuration} als Verbundsobjekt an
@code{cgit-service-type} übergeben. Wie der Name schon sagt, bietet eine
opake Konfiguration keinerlei Unterstützung für Reflexion.

Verfügbare @code{opaque-cgit-configuration}-Felder sind:

@deftypevr {@code{opaque-cgit-configuration}-Parameter} „package“ cgit
Das cgit-Paket.
@end deftypevr

@deftypevr {@code{opaque-cgit-configuration}-Parameter} Zeichenkette string
Der Inhalt für @code{cgitrc} als eine Zeichenkette.
@end deftypevr

Wenn zum Beispiel Ihre @code{cgitrc} nur aus der leeren Zeichenkette
bestehen soll, könnten Sie einen Cgit-Dienst auf diese Weise instanziieren:

@lisp
(service cgit-service-type
         (opaque-cgit-configuration
          (cgitrc "")))
@end lisp

@subsubheading Gitolite-Dienst

@cindex Gitolite-Dienst
@cindex Git, Server anbieten („hosten“)
@uref{https://gitolite.com/gitolite/, Gitolite} ist ein Werkzeug, um
Git-Repositorys anderen auf einem zentralen Server anzubieten.

Gitolite kann mehrere Nutzer mit mehreren Repositorys bedienen und
unterstützt flexible Konfigurationsmöglichkeiten der Berechtigungen der
Repository-Nutzer.

Das folgende Beispiel richtet Gitolite für den voreingestellten
@code{git}-Benutzer und den angegebenen öffentlichen SSH-Schlüssel ein.

@lisp
(service gitolite-service-type
         (gitolite-configuration
           (admin-pubkey (plain-file
                           "ihrname.pub"
                           "ssh-rsa AAAA…@: guix@@example.com"))))
@end lisp

Sie konfigurieren Gitolite, indem Sie ein besonderes Admin-Repository
anpassen. Sie können es zum Beispiel klonen, indem Sie, wenn Sie Gitolite
auf @code{example.com} eingerichtet haben, den folgenden Befehl zum Klonen
des Admin-Repositorys ausführen:

@example
git clone git@@example.com:gitolite-admin
@end example

Wenn der Gitolite-Dienst aktiviert wird, wird der mitgegebene
@code{admin-pubkey} ins @file{keydir}-Verzeichnis vom
„gitolite-admin“-Repository eingefügt. Wenn sich dadurch das Repository
ändert, wird die Änderung mit der Commit-Nachricht „gitolite setup by GNU
Guix“ commitet.

@deftp {Datentyp} gitolite-configuration
Repräsentiert die Konfiguration vom @code{gitolite-service-type}.

@table @asis
@item @code{package} (Vorgabe: @code{gitolite})
Welches Gitolite-Paket benutzt werden soll. Sie können hiermit auch
optionale Abhängigkeiten von Gitolite, die @emph{nicht} im
Standard-Gitolite-Paket enthalten sind, hinzufügen, wie Redis und
git-annex. Diese Funktionalitäten können Sie mit der Prozedur
@code{make-gitolite} aus dem Modul @code{(gnu packages version-control)}
verfügbar machen, welche eine Variante von Gitolite erzeugt, bei der die
gewünschten Abhängigkeiten vorhanden sind.

Folgender Code liefert ein Paket zurück, wo die Programme Redis und
git-annex durch die Skripte von Gitolite aufrufbar sind:

@example
(use-modules (gnu packages databases)
             (gnu packages haskell-apps)
             (gnu packages version-control))
(make-gitolite (list redis git-annex))
@end example

@item @code{user} (Vorgabe: @code{"git"})
Welches Benutzerkonto für Gitolite benutzt werden soll. Mit diesem Benutzer
werden Sie über SSH auf Gitolite zugreifen.

@item @code{group} (Vorgabe: @code{"git"})
Gruppe für Gitolite.

@item @code{home-directory} (Vorgabe: @code{"/var/lib/gitolite"})
Das Verzeichnis, in dem die Gitolite-Konfiguration und Repositorys
gespeichert werden sollen.

@item @code{rc-file} (Vorgabe: @code{(gitolite-rc-file)})
Ein dateiartiges Objekt (siehe @ref{G-Ausdrücke, dateiartige Objekte}),
das die Konfiguration für Gitolite repräsentiert.

@item @code{git-config} (default: @code{(gitolite-git-configuration)})
A ``file-like'' object (@pxref{G-Ausdrücke, file-like objects}),
representing the git configuration for Gitolite.

@item @code{admin-pubkey}
Ein dateiartiges Objekt (siehe @ref{G-Ausdrücke, dateiartige Objekte}),
mit dem Gitolite eingerichtet werden kann. Er wird in das
@file{keydir}-Verzeichnis im „gitolite-admin“-Repository eingefügt.

Um einen SSH-Schlüssel als Zeichenkette anzugeben, benutzen Sie die
@code{plain-file}-Funktion.

@lisp
(plain-file "ihrname.pub" "ssh-rsa AAAA…@: guix@@example.com")
@end lisp

The file has to have @file{.pub} extension.

@item @code{admin-name} (default: @code{#f})
Usually the key name is derived by taking a base name of the
@code{admin-pubkey}.  The resulting file name is the name of the gitolite
user.  You can use this field to override the automatic name.

@end table
@end deftp

@deftp {Datentyp} gitolite-rc-file
Repräsentiert die Gitolie-RC-Datei.

@table @asis
@item @code{umask} (Vorgabe: @code{#o0077})
Dies legt fest, welche Berechtigungen Gitolite an die Repositorys und deren
Inhalt vergibt.

Für einen Wert wie @code{#o0027} wird die Gruppe, die Gitolite benutzt (nach
Vorgabe: @code{git}) Lesezugriff erhalten. Das ist nötig, wenn Sie Gitolite
mit Software wie Cgit oder Gitweb kombinieren.

@item @code{local-code} (Vorgabe: @code{"$rc@{GL_ADMIN_BASE@}/local"})
Hiermit können Sie eigene Programme zu den als „non-core“ eingestuften
hinzufügen oder sogar die mitgelieferten Programme durch Ihre eigenen
ersetzen.

Bitte geben Sie für diese Variable den vollständigen Pfad an. Vorgegeben
ist, dass das Verzeichnis namens "local" in Ihrem Klon des
Gitolite-Repositorys benutzt wird. Dadurch haben Sie den Vorteil, dass alles
versioniert wird, und können Änderungen vornehmen, ohne sich auf dem Server
anmelden zu müssen.

@item @code{unsafe-pattern} (Vorgabe: @code{#f})
Optional ein Perl-kompatibler regulärer Ausdruck, um unsichere
Konfigurationen in der Konfigurationsdatei zu unterbinden. Siehe
@uref{https://gitolite.com/gitolite/git-config.html#compensating-for-unsafe_patt,
die Dokumentation von Gitolite} für weitere Informationen.

Wenn als Wert @emph{nicht} @code{#f} angegeben wird, muss es eine
Zeichenkette mit einem Perl-kompatiblen regulären Ausdruck sein wie
@samp{"[`~#\$\&()|;<>]"}, was der Voreinstellung von Gitolite
entspricht. Damit wird unterbunden, jegliche Sonderzeichen in die
Konfiguration zu schreiben, die von einer Shell interpretiert werden
könnten, damit die Administration auch auf andere Leute übertragen werden
kann, die sonst keinen Shell-Zugriff auf dem Server haben.

@item @code{git-config-keys} (Vorgabe: @code{""})
Mit Gitolite können Sie Werte für Git-Konfigurationen über das
@samp{config}-Schlüsselwort festlegen. Mit dieser Einstellung können Sie
steuern, welche Konfigurationsschlüssel akzeptiert werden.

@item @code{log-extra} (default: @code{#f})
Whether gitolite should log extra details.

For historical reasons, this field defaults to @code{#f}.  The default value
from gitolite however is @code{1} (written as @code{#t} in this
configuration).

@item @code{host-name} (Vorgabe: @code{#f})
The host name of this gitolite instance.  It is used by the mirroring
feature.

@item @code{roles} (Vorgabe: @code{'(("READERS" . 1) ("WRITERS" . ))})
Legt fest, welche Rollennamen für Nutzer möglich sind, wenn Sie den Befehl
perms ausführen.

@item @code{enable} (Vorgabe: @code{'("help" "desc" "info" "perms" "writable" "ssh-authkeys" "git-config" "daemon" "gitweb")})
Diese Einstellung legt die innerhalb von Gitolite zur Verfügung gestellten
Befehle fest.

@item @code{extra-content} (Vorgabe: @code{""})
Extra content to add verbatim into the @code{%RC} hash.

@end table
@end deftp

@deftp {Data Type} gitolite-git-configuration
Data type representing the git configuration file for gitolite.

@table @asis
@item @code{name} (default: @code{"GNU GNU"})
User name used for commits (e.g. during setting up the admin repository).

@item @code{email} (default: @code{"guix@@localhost"})
Email used for commits (e.g. during setting up the admin repository).

@item @code{default-branch} (default: @code{#f})
If true, set the @code{init.defaultBranch} option to that value.  Common
values are @code{"master"} and @code{"main"}.

@item @code{receive-fsck-objects} (default: @code{#f})
If it is set to true, git-receive-pack will check all received objects.

@item @code{extra-content} (Vorgabe: @code{""})
Extra content to add verbatim into the git configuration file.

@end table
@end deftp

@subsubheading Gitile-Dienst

@cindex Gitile-Dienst
@cindex Git, Forge
Mit @uref{https://git.lepiller.eu/gitile, Gitile} kann eine eigene
Git-„Forge“ aufgesetzt werden, wo sich jeder über einen Web-Browser den
Inhalt von Git-Repositorys ansehen kann.

Am besten kombiniert man Gitile mit Gitolite, und Gitile bietet nach
Voreinstellung die für die Öffentlichkeit bestimmten Repositorys von
Gitolite an. Der Dienst sollte auf einem lokalen Port lauschen, und ein
Webserver sollte eingerichtet werden, um Gitiles statische Ressourcen
anzubieten. Für den Gitile-Dienst kann der Nginx-Dienst einfach zu diesem
Zweck erweitert werden (siehe @ref{NGINX}).

Im Folgenden sehen Sie ein Beispiel, wie Gitile konfiguriert wird, um
Repositorys von einem selbst ausgewählten Ort anzubieten, zusammen mit etwas
Text für die Hauptseite und Fußzeilen.

@lisp
(service gitile-service-type
         (gitile-configuration
           (repositories "/srv/git")
           (base-git-url "https://meineweb.site/git")
           (index-title "Meine Git-Repositorys")
           (intro '((p "Hier sind all meine öffentlichen Werke!")))
           (footer '((p "Nun ist Schluss")))
           (nginx
             (nginx-server-configuration
               (ssl-certificate
                 "/etc/certs/meineweb.site/fullchain.pem")
               (ssl-certificate-key
                 "/etc/certs/meineweb.site/privkey.pem")
               (listen '("443 ssl http2" "[::]:443 ssl http2"))
               (locations
                 (list
                   ;; Anonymen Abruf über HTTPS von „/git/“-URLs zulassen.
                   (git-http-nginx-location-configuration
                     (git-http-configuration
                       (uri-path "/git/")
                       (git-root "/var/lib/gitolite/repositories")))))))))
@end lisp

Neben dem Konfigurations-Verbundsobjekt sollten Sie auch bei Ihren
Git-Repositorys ein paar optionale Informationen darüber eintragen. Zunächst
werden Repositorys nur für die Allgemeinheit zugänglich, wenn sie die
magische Datei @file{git-daemon-export-ok} enthalten. Gitile erkennt daran,
welche Repositorys öffentlich sind und zugänglich gemacht werden sollen. Bei
Gitolite heißt das zum Beispiel, Sie ändern Ihre @file{conf/gitolite.conf},
dass dort für die öffentlich zu machenden Repositorys Folgendes steht:

@example
repo foo
    R = daemon
@end example

Zusätzlich kann Gitile aus der Repository-Konfiguration weitere
Informationen über das Repository auslesen und anzeigen. Gitile verwendet
für seine Konfiguration den gitweb-Namensraum. Zum Beispiel kann Ihre
@file{conf/gitolite.conf} Folgendes enthalten:

@example
repo foo
    R = daemon
    desc = Eine lange Beschreibung, gerne auch mit <i>HTML</i>-Tags, für die Seite mit dem Repository-Index
    config gitweb.name = Das Projekt Foo
    config gitweb.synopsis = Eine kurze Beschreibung für die Hauptseite des Projekts
@end example

Denken Sie daran, die Änderungen auch zu commiten und zu pushen, sobald Sie
zufrieden sind. Vielleicht müssen Sie Ihre gitolite-Konfiguration anpassen,
damit die genannten Konfigurationsoptionen zulässig sind. Eine Möglichkeit
ist folgende Dienstdefinition:

@lisp
(service gitolite-service-type
          (gitolite-configuration
            (admin-pubkey (local-file "key.pub"))
            (rc-file
              (gitolite-rc-file
                (umask #o0027)
                ;; Man soll jeden Konfigurationsschlüssel setzen dürfen
                (git-config-keys ".*")
                ;; Jeder Text soll ein gültiger Konfigurationswert sein
                (unsafe-patt "^$")))))
@end lisp

@deftp {Datentyp} gitile-configuration
Repräsentiert die Konfiguration vom @code{gitile-service-type}.

@table @asis
@item @code{package} (Vorgabe: @var{gitile})
Welches Gitile-Paket benutzt werden soll.

@item @code{host} (Vorgabe: @code{"localhost"})
Der Rechnername, auf den Gitile lauscht.

@item @code{port} (Vorgabe: @code{8080})
Der Port, auf dem Gitile lauscht.

@item @code{database} (Vorgabe: @code{"/var/lib/gitile/gitile-db.sql"})
Wo die Datenbank liegt.

@item @code{repositories} (Vorgabe: @code{"/var/lib/gitolite/repositories"})
Wo die Repositorys zu finden sind. Beachten Sie: Gitile zeigt nur
öffentliche Repositorys an. Um ein Repository öffentlich zu machen, fügen
Sie eine leere Datei @file{git-daemon-export-ok} in das Wurzelverzeichnis
des Repositorys ein.

@item @code{git-owner-validation?} (default: @code{#t})
Whether to check for the service user's ownership of repositories.  By
default, Git will refuse to process a repository owned by another user.

@item @code{base-git-url}
Die Basis-Git-URL, von der angezeigt wird, dass man Befehle zum Klonen
darauf ausführen kann.

@item @code{index-title} (Vorgabe: @code{"Index"})
Der Seitentitel der Index-Seite mit der Liste aller verfügbaren Repositorys.

@item @code{intro} (Vorgabe: @code{'()})
Der Inhalt der Einführung als Liste von SXML-Ausdrücken. Sie wird über der
Liste der Repositorys auf der Index-Seite angezeigt.

@item @code{footer} (Vorgabe: @code{'()})
Der Inhalt der Fußzeile als Liste von SXML-Ausdrücken. Sie wird unter jeder
von Gitile angebotenen Seite angezeigt.

@item @code{nginx}
Ein Server-Block für NGinx. NGinx wird durch Gitile erweitert und als
inverser Proxy („Reverse Proxy“) verwendet, um dessen Seiten anzubieten, und
es wird als einfacher Web-Server verwendet, um statische Dateien und
Grafiken anzubieten.

Über diesen Block können Sie weitere eigene URLs auf Ihrer Domain anbieten
lassen wie z.B.@: eine @code{/git/}-URL zum „anonymen“ Klonen ohne Anmeldung
oder sonstige Dateien, die Sie anbieten möchten.
@end table
@end deftp


@node Spieldienste
@subsection Spieldienste

@subsubheading Joycond-Dienst
@cindex joycond
@cindex nintendo controllers
Mit dem joycond-Dienst können Sie Nintendo-joycon-Spielcontroller über
Bluetooth koppeln. (Siehe @ref{Desktop-Dienste} für Informationen zum
Einrichten von Bluetooth.)

@deftp {Datentyp} joycond-configuration
Datentyp, der die Konfiguration von @command{joycond} repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @code{joycond})
Welches joycond-Paket benutzt werden soll.
@end table
@end deftp

@defvar joycond-service-type
Service type for the joycond service.  It also extends the
@code{udev-service-type} with the @code{joycond} package (provided via the
@code{joycond-configuration} configuration), so that joycond controllers can
be detected and used by an unprivileged user.
@end defvar

@subsubheading „The Battle for Wesnoth“-Dienst
@cindex wesnothd
@uref{https://wesnoth.org, The Battle for Wesnoth} ist ein in einer
Fantasy-Welt angesiedeltes, rundenbasiertes, taktisches Strategiespiel. Es
verfügt über mehrere Einzelspielerkampagnen und Mehrspielerspiele (über das
Netzwerk und lokal).

@defvar wesnothd-service-type
Diensttyp für den wesnothd-Dienst. Als Wert muss ein
@code{wesnothd-configuration}-Objekt benutzt werden. Um wesnothd mit seiner
Vorgabekonfiguration auszuführen, instanziieren Sie es als:

@lisp
(service wesnothd-service-type)
@end lisp
@end defvar

@deftp {Datentyp} wesnothd-configuration
Datentyp, der die Konfiguration von @command{wesnothd} repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @code{wesnoth-server})
Das Paket, das für den Wesnoth-Server benutzt werden soll.

@item @code{port} (Vorgabe: @code{15000})
Der Port, an den der Server gebunden wird.
@end table
@end deftp


@node PAM-Einbindedienst
@subsection PAM-Einbindedienst
@cindex pam-mount

Das Modul @code{(gnu services pam-mount)} stellt einen Dienst zur Verfügung,
mit dem Benutzer Datenträger beim Anmelden einbinden können. Damit sollte es
möglich sein, jedes vom System unterstützte Datenträgerformat einzubinden.

@defvar pam-mount-service-type
Diensttyp für PAM-Einbindeunterstützung.
@end defvar

@deftp {Datentyp} pam-mount-configuration
Datentyp, der die Konfiguration für PAM-Einbindungen („PAM Mount“)
repräsentiert.

Sie hat folgende Parameter:

@table @asis
@item @code{rules}
Die Konfigurationsregeln, um @file{/etc/security/pam_mount.conf.xml} zu
erzeugen.

Die Konfigurationsregeln sind SXML-Elemente (siehe @ref{SXML,,, guile,
Referenzhandbuch zu GNU Guile}) und nach Vorgabe wird für niemanden etwas
beim Anmelden eingebunden:

@lisp
`((debug (@@ (enable "0")))
  (mntoptions (@@ (allow ,(string-join
                          '("nosuid" "nodev" "loop"
                            "encryption" "fsck" "nonempty"
                            "allow_root" "allow_other")
                          ","))))
  (mntoptions (@@ (require "nosuid,nodev")))
  (logout (@@ (wait "0")
             (hup "0")
             (term "no")
             (kill "no")))
  (mkmountpoint (@@ (enable "1")
                   (remove "true"))))
@end lisp

Es müssen @code{volume}-Elemente eingefügt werden, um Datenträger
automatisch bei der Anmeldung einzubinden. Hier ist ein Beispiel, mit dem
die Benutzerin @code{alice} ihr verschlüsseltes @env{HOME}-Verzeichnis
einbinden kann, und der Benutzer @code{bob} die Partition einbinden kann, wo
er seine Daten abspeichert.

@lisp
(define pam-mount-rules
`((debug (@@ (enable "0")))
            (volume (@@ (user "alice")
                       (fstype "crypt")
                       (path "/dev/sda2")
                       (mountpoint "/home/alice")))
            (volume (@@ (user "bob")
                       (fstype "auto")
                       (path "/dev/sdb3")
                       (mountpoint "/home/bob/data")
                       (options "defaults,autodefrag,compress")))
            (mntoptions (@@ (allow ,(string-join
                                    '("nosuid" "nodev" "loop"
                                      "encryption" "fsck" "nonempty"
                                      "allow_root" "allow_other")
                                    ","))))
            (mntoptions (@@ (require "nosuid,nodev")))
            (logout (@@ (wait "0")
                       (hup "0")
                       (term "no")
                       (kill "no")))
            (mkmountpoint (@@ (enable "1")
                             (remove "true")))))

(service pam-mount-service-type
         (pam-mount-configuration
           (rules pam-mount-rules)))
@end lisp

Die vollständige Liste möglicher Optionen finden Sie in der Handbuchseite
(„man page“) für
@uref{http://pam-mount.sourceforge.net/pam_mount.conf.5.html,
pam_mount.conf}.
@end table
@end deftp

@subheading PAM-Laufwerkseinbindungsdienst
@cindex PAM-Laufwerkseinbindung

Mit einer PAM-Laufwerkseinbindung („PAM Mount Volumes“) werden Laufwerke zum
Zeitpunkt der Anmeldung automatisch eingebunden, durch den PAM-Anmeldedienst
und entsprechend der eingestellten laufwerksspezifischen Regeln. Weil PAM
die Anmeldung übernimmt, kann das zum Anmelden benutzte Passwort auch gleich
zum Einbinden authentifizierender Laufwerkstypen wie @code{cifs} mit
denselben Anmeldeinformationen benutzt werden.

Diese Laufwerke werden zusätzlich zu den in @code{pam-mount-rules}
angegebenen Datenträgern eingebunden.

Hier ist ein Beispiel für eine Regel, um ein im Netzwerk geteiltes
CIFS-Dateisystem vom entfernten Server namens @code{remote-server} von
@file{//remote-server/share} in ein Unterverzeichnis von @file{/shares}
einzubinden, das dort den Namen des Benutzers trägt, der sich angemeldet
hat:

@lisp
(simple-service 'pam-mount-remote-share pam-mount-volume-service-type
                (list (pam-mount-volume
                       (secondary-group "users")
                       (file-system-type "cifs")
                       (server "remote-server")
                       (file-name "share")
                       (mount-point "/shares/%(USER)")
                       (options "nosuid,nodev,seal,cifsacl"))))
@end lisp

@deftp {Datentyp} pam-mount-volume-service-type
Die Konfiguration für ein einzelnes einzubindendes Laufwerk. Felder, die Sie
nicht angeben, werden @emph{nicht} in der zur Laufzeit gültigen
PAM-Konfiguration auftauchen. Siehe
@uref{http://pam-mount.sourceforge.net/pam_mount.conf.5.html, den
Handbucheintrag}, wo die Vorgabewerte stehen, wenn Sie nichts angeben.

@table @asis
@item @code{user-name} (Typ: Vielleicht-Zeichenkette)
Das Laufwerk für diesen Benutzer einbinden.

@item @code{user-id} (Typ: Vielleicht-Ganze-Zahl-oder-Zahlenbereich)
Das Laufwerk für den Benutzer mit dieser ID als Kennung einbinden. Sie
können auch ein Paar aus @code{(Anfang . Ende)} angeben für einen Bereich
von Benutzer-IDs, bei denen die Einbindung des Laufwerks vollzogen werden
soll.

@item @code{primary-group} (Typ: Vielleicht-Zeichenkette)
Das Laufwerk für Benutzer einbinden, deren primäre Gruppe diesen Namen
trägt.

@item @code{group-id} (Typ: Vielleicht-Ganze-Zahl-oder-Zahlenbereich)
Das Laufwerk für die Benutzer einbinden, deren primäre Gruppe diese ID als
Kennung hat. Sie können auch eine Cons-Zelle aus @code{(Anfang . Ende)}
angeben für einen Bereich von Benutzergruppen-IDs, bei denen die Einbindung
des Laufwerks vollzogen werden soll.

@item @code{secondary-group} (Typ: Vielleicht-Zeichenkette)
Für Mitglieder welcher Benutzergruppe das Laufwerk eingebunden werden soll,
egal ob es deren primäre Gruppe oder eine sekundäre Gruppe ist.

@item @code{file-system-type} (Typ: Vielleicht-Zeichenkette)
Der Dateisystemtyp des Laufwerks, das eingebunden werden soll (z.B.@:
@code{cifs})

@item @code{no-mount-as-root?} (Typ: Vielleicht-Boolescher-Ausdruck)
Ob die Einbindung des Laufwerks mit Administratorberechtigung durchgeführt
werden soll. Normalerweise ergibt diese Option keinen Sinn, aber bei
Einbindungen vom Typ @code{fuse} oder anderen Einbindungen auf Benutzerebene
können Sie sie benutzen.

@item @code{server} (Typ: Vielleicht-Zeichenkette)
Der Name des entfernten Servers, von dem das Laufwerk eingebunden wird,
falls vorhanden.

@item @code{file-name} (Typ: Vielleicht-Zeichenkette)
Wo sich das Laufwerk befindet. Angegeben wird entweder eine lokale oder
entfernte Stelle, je nachdem, was in @code{file-system-type} steht.

@item @code{mount-point} (Typ: Vielleicht-Zeichenkette)
An welche Stelle im lokalen Dateisystem das Laufwerk eingebunden werden
soll. Hier können Sie @file{~} angeben als Abkürzung für das Persönliche
Verzeichnis des Benutzers, der angemeldet wird. Wenn Sie das Feld weglassen,
wird die Stelle, wohin eingebunden werden soll, in @file{/etc/fstab}
gesucht.

@item @code{options} (Typ: Vielleicht-Zeichenkette)
Welche Optionen wörtlich genau so an das zugrundeliegende mount-Programm
übergeben werden sollen.

@item @code{ssh?} (Typ: Vielleicht-Boolescher-Ausdruck)
Aktivieren Sie diese Option, um das Anmeldepasswort an SSH weiterzugeben,
wenn die Einbindung über SSH erfolgt (etwa @code{sshfs}).

@item @code{cipher} (Typ: Vielleicht-Zeichenkette)
Cryptsetup-Cipher-Name für das Laufwerk. Sie können ihn zusammen mit dem
Dateisystemtyp @code{crypt} in @code{file-system-type} benutzen.

@item @code{file-system-key-cipher} (Typ: Vielleicht-Zeichenkette)
Cipher-Name für das Ziellaufwerk.

@item @code{file-system-key-hash} (Typ: Vielleicht-Zeichenkette)
Welcher SSL-Hashname vom Ziellaufwerk benutzt werden soll.

@item @code{file-system-key-file-name} (Typ: Vielleicht-Zeichenkette)
Der Dateiname des Dateisystem-Schlüssels des Ziellaufwerks.

@end table
@end deftp


@node Guix-Dienste
@subsection Guix-Dienste

@subsubheading Shared Cache Service
@cindex shared cache
@cindex cache, sharing

Running @command{guix pull}, @command{guix time-machine}, @command{guix
system reconfigure}, and @command{guix home reconfigure} pulls the complete
Git version control history of your channels in
@file{$HOME/.cache/guix/checkouts}.  If you have multiple user accounts
(typically @code{root} and a main user account for your personal computer),
or if multiple users are using the system (typically on a shared server),
then this can quickly waste a lot of space.

The @code{shared-cache} service lets you prevent this waste by either
sharing or exposing a specific user's cache to the other users.

In the context of this service, @emph{sharing} and @emph{exposing} have the
same meaning as with @command{guix shell}: making the shared cache directory
read-only if you use mode @option{'expose} (the default), and writable if
you use mode @option{'share}, (@pxref{Aufruf von guix shell, @option{--expose}
and @option{--share}}).

Whatever mode you choose, from the point of view of the user, the cache
appears writable.  With @option{'expose}, any write will be stored in a
user-owned overlay directory next to mountpoint, whereas with
@option{'share}, writes will be propagated back to the sharing user's cache.

@quotation Warnung
Use the @option{'share} option @emph{if and only if} users on the machine
trust each other.  This is a hard requirement since, with this option, any
user could ``poison'' the shared cache to indirectly gain access to other
user's data and privileges.
@end quotation

@quotation Warnung
Using @option{'share} is meant for a single-seat computer where the single
user has unprivileged user accounts---e.g. one for work and one for gaming.
Even then, channels from one will leak into the other's cache.  Use with
caution.
@end quotation

@quotation Warnung
@option{'share} will not work for multiple concurrent invocation of
@command{guix}, e.g. if two user accounts run @command{guix time machine} at
the same time, the results will be fun but not useful.
@end quotation

Here is an example configuration that exposes @code{root}'s guix checkout
cache to @code{alice} and @code{bob}:

@lisp
(operating-system
  ;; @dots{}
     (services
      (cons*
       (service shared-cache-service-type
             (shared-cache-configuration
               (users (list (user-cache (user "alice"))
                            (user-cache (user "bob"))))))
                    %desktop-services)))
@end lisp

The service can also be extended by providing a list of @code{user-cache},
allowing for easier splitting of configuration.

@lisp
(operating-system
  ;; @dots{}
  (services
   (cons*
    (simple-service 'bob-shared-guix-cache shared-cache-service-type
                    (list (user-cache (user "bob"))))
    %desktop-services)))
@end lisp

@defvar shared-cache-service-type
Service type for sharing a subdirectory of @file{~/.cache/} between multiple
users.

This service allows different system users to share the contents of the user
cache, avoiding duplication and saving disk space.  It can be configured in
either ``share'' mode, where all users write to the same cache, or
``expose'' mode, where users get a read-only view with a writable overlay.
Its value must be a @code{shared-cache-configuration} object.
@end defvar

@deftp {Data Type} shared-cache-configuration
Data type representing the configuration of the shared cache.

@table @asis
@item @code{mode} (default: @code{'expose})
Either @code{'share} (read-write, dangerous) or @code{'expose} (read-only
with per-user overlay, the default).  In share mode, all writes go to the
shared directory.  In expose mode, only reads use the shared directory;
writes go to a user-owned overlay.

@item @code{shared-directory} (default: @code{"/root/.cache"})
The source cache directory that is shared between users.  Each user will see
some or all of its subdirectories mounted into their own @file{~/.cache}.

@item @code{users} (default: @code{'()})
The list of users that will benefit from the shared directory.  This must be
a list of @code{user-info} records.

@end table
@end deftp

@deftp {Data Type} user-info
Data type representing the configuration for a single user benefitting from
a shared cache.

@table @asis
@item @code{user}
The username of the user.

@item @code{location} (default: @code{"/home/@var{user}/.cache"})
The cache directory of the user.

@item @code{group} (default: @code{"users"})
The primary group of the user.

@item @code{directories} (default: @code{'("guix/checkouts")})
List of subdirectories of the @code{shared-cache-configuration}'s
@code{shared-directory} (whose default is @file{/root/.cache}) to mount
under @var{location} (whose default is @file{~/.cache/}) for the user.
@end table
@end deftp

@subsubheading Build Farm Front-End (BFFE)
Das @uref{https://git.cbaines.net/guix/bffe/,Build Farm Front-End} zum
Bedienen von Erstellungsfarmen hilft, große Mengen von Guix-Paketen
erstellen zu lassen. Damit werden Erstellungen angenommen und der Status der
Erstellungsfarmen angezeigt.

@defvar bffe-service-type
Diensttyp für das Build Farm Front-End zum Bedienen von
Erstellungsfarmen. Sein Wert muss ein @code{bffe-configuration}-Objekt sein.
@end defvar

@deftp {Datentyp} bffe-configuration
Dieser Datentyp repräsentiert die Konfiguration des Build Farm Front-End.

@table @asis
@item @code{package} (Vorgabe: @code{bffe})
Welches Paket für das Build Farm Front-End benutzt werden soll.

@item @code{user} (Vorgabe: @code{"bffe"})
Das Systembenutzerkonto, mit dem der Dienst ausgeführt wird.

@item @code{group} (Vorgabe: @code{"bffe"})
Die Systembenutzergruppe, mit der der Dienst ausgeführt wird.

@item @code{arguments}
Eine Liste von Argumenten, die ans Build Farm Front-End übergeben werden
sollen. Dabei handelt es sich um die Argumente an die Prozedur
@code{run-bffe-service}, mit der der Dienst gestartet wird.

Zum Beispiel kann mit folgendem Wert das Build Farm Front-End dazu gebracht
werden, die auf @code{data.guix.gnu.org} zur Verfügung gestellten
Ableitungen an der Erstellungskoordinator-Instanz einzureichen, wobei
angenommen wird, dass der Koordinator auf derselben Maschine läuft.

@example
(list
 #:build
 (list
  (build-from-guix-data-service
   (data-service-url "https://data.guix.gnu.org")
   (build-coordinator-url "http://127.0.0.1:8746")
   (branches '("master"))
   (systems '("x86_64-linux" "i686-linux"))
   (systems-and-targets
    (map (lambda (target)
           (cons "x86_64-linux" target))
         '("aarch64-linux-gnu"
           "i586-pc-gnu")))))
 #:web-server-args
 '(#:event-source "https://example.com"
   #:controller-args
   (#:title "example.com build farm")))
@end example

@item @code{extra-environment-variables} (Vorgabe: @var{'()})
Zusätzliche Umgebungsvariable, die mit dem Shepherd-Dienst festgelegt
werden.

@end table
@end deftp

@subsubheading Guix-Erstellungskoordinator
Der
@uref{https://git.cbaines.net/guix/build-coordinator/,Guix-Erstellungskoordinator}
(„Guix Build Coordinator“) hilft dabei, Erstellungen von Ableitungen auf
Maschinen zu verteilen, auf denen ein @dfn{Agent} läuft. Der
Erstellungs-Daemon wird weiterhin benutzt, um die Ableitungen zu erstellen,
der Guix-Erstellungskoordinator verwaltet nur die Zuteilung der Erstellungen
und den Umgang mit den Ergebnissen.

Der Guix-Erstellungskoordinator setzt sich aus einem @dfn{Koordinator} und
mindestens einem verbundenen @dfn{Agentenprozess} zusammen. Der
Koordinatorprozess kümmert sich um Clients, die Erstellungen einreichen, und
teilt Erstellungen den Agenten zu. Die Agentenprozesse kommunizieren mit
einem Erstellungs-Daemon, welcher die Erstellungen eigentlich durchführt und
die Ergebnisse an den Koordinator zurückgibt.

Es gibt ein Skript, um die Koordinatorkomponente des
Guix-Erstellungskoordinators auszuführen, aber der Dienst für Guix benutzt
stattdessen sein eigenes Guile-Skript, was in der Konfiguration benutzte
G-Ausdrücke besser integriert.

@defvar guix-build-coordinator-service-type
Diensttyp für den Guix-Erstellungskoordinator. Sein Wert muss ein
@code{guix-build-coordinator-configuration}-Objekt sein.
@end defvar

@deftp {Datentyp} guix-build-coordinator-configuration
Der Datentyp, der die Konfiguration des Guix-Erstellungskoordinators
repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @code{guix-build-coordinator})
Das zu verwendende Guix-Erstellungskoordinator-Paket.

@item @code{user} (Vorgabe: @code{"guix-build-coordinator"})
Das Systembenutzerkonto, mit dem der Dienst ausgeführt wird.

@item @code{group} (Vorgabe: @code{"guix-build-coordinator"})
Die Systembenutzergruppe, mit der der Dienst ausgeführt wird.

@item @code{database-uri-string} (Vorgabe: @code{"sqlite:///var/lib/guix-build-coordinator/guix_build_coordinator.db"})
Die URI für die Datenbank.

@item @code{agent-communication-uri} (Vorgabe: @code{"http://0.0.0.0:8745"})
Die URI, die beschreibt, wie auf Anfragen von Agentenprozessen gelauscht
wird.

@item @code{client-communication-uri} (Vorgabe: @code{"http://127.0.0.1:8746"})
Die URI, die beschreibt, wie auf Anfragen von Clients gelauscht wird. Mit
der Client-API können Erstellungen eingereicht werden und derzeit findet
dabei keine Authentifizierung statt. Das sollten Sie bedenken, wenn Sie
hieran Einstellungen vornehmen.

@item @code{allocation-strategy} (Vorgabe: @code{#~basic-build-allocation-strategy})
Ein G-Ausdruck für die zu nutzende Zuteilungsstrategie. Angegeben wird eine
Prozedur, die den Datenspeicher als Argument nimmt und in den Zuteilungsplan
in der Datenbank einfügt.

@item @code{hooks} (Vorgabe: @var{'()})
Eine assoziative Liste mit Hooks. Mit ihnen kann infolge bestimmter
Ereignisse beliebiger Code ausgeführt werden, z.B.@: wenn ein
Erstellungsergebnis verarbeitet wird.

@item @code{parallel-hooks} (Vorgabe: @var{'()})
Sie können Hooks so einstellen, dass sie parallel ausgeführt werden. Mit
diesem Parameter geben Sie eine assoziative Liste an, welche der Hooks
parallel ausgeführt werden sollen. Der Schlüssel ist das Symbol für den Hook
und der Wert ist die Anzahl Threads, die ausgeführt werden.

@item @code{listen-repl} (Vorgabe: @var{#f})
Ein Port oder Dateiname, wo eine REPL gestartet wird, auf die gelauscht
wird; übergeben Sie @code{#t}, damit auf dem Standardport gelauscht wird,
oder @code{#f}, um nirgends zu lauschen.

@item @code{guile} (Vorgabe: @code{guile-3.0-latest})
Mit welchem Guile-Paket der Guix-Erstellungskoordinator ausgeführt wird.

@item @code{extra-environment-variables} (Vorgabe: @var{'()})
Zusätzliche Umgebungsvariable, die mit dem Shepherd-Dienst festgelegt
werden.

@end table
@end deftp

@defvar guix-build-coordinator-agent-service-type
Diensttyp für einen Guix-Erstellungskoordinator-Agenten. Als Wert muss ein
@code{guix-build-coordinator-agent-configuration}-Objekt angegeben werden.
@end defvar

@deftp {Datentyp} guix-build-coordinator-agent-configuration
Der Datentyp, der die Konfiguration eines
Guix-Erstellungskoordinator-Agenten repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @code{guix-build-coordinator/agent-only})
Das zu verwendende Guix-Erstellungskoordinator-Paket.

@item @code{user} (Vorgabe: @code{"guix-build-coordinator-agent"})
Das Systembenutzerkonto, mit dem der Dienst ausgeführt wird.

@item @code{coordinator} (Vorgabe: @code{"http://localhost:8745"})
Das Passwort, das zum Herstellen einer Verbindung mit dem Koordinator
verwendet werden soll.

@item @code{authentication}
Ein Verbundsobjekt, das beschreibt, wie sich dieser Agent beim Koordinator
authentisiert. Mögliche Verbundsfelder werden im Folgenden beschrieben.

@item @code{systems} (Vorgabe: @code{#f})
Die Systeme, für die dieser Agent Erstellungen übernehmen
soll. Voreingestellt verwendet der Agentenprozess den Systemtyp, auf dem er
aktuell läuft.

@item @code{max-parallel-builds} (default: @code{#f})
Die Anzahl der Erstellungen, die parallel ausgeführt werden sollen.

@item @code{max-parallel-uploads} (default: @code{#f})
Die Anzahl, wie viele parallel hochgeladen werden sollen.

@item @code{max-allocated-builds} (Vorgabe: @code{#f})
Wie viele Erstellungen diesem Agenten höchstens zugewiesen werden können.

@item @code{max-1min-load-average} (Vorgabe: @code{#f})
Die durchschnittliche Last (Load Average), die bestimmt, ob der
Koordinatoragent mit neuen Erstellungen beginnt. Wenn die Load Average über
1@tie{}Minute den angegebenen Wert übersteigt, wartet der Agent und beginnt
keine zusätzlichen Erstellungen.

Wenn als Wert @code{#f} angegeben wird, wird die Einstellung nicht
festgelegt und der Agent verwendet die Anzahl der Kerne, die das System
meldet, als maximaler Load Average über 1@tie{}Minute.

@item @code{derivation-substitute-urls} (Vorgabe: @code{#f})
URLs, von denen versucht werden soll, Substitute für Ableitungen
herunterzuladen, wenn die Ableitungen noch nicht vorliegen.

@item @code{non-derivation-substitute-urls} (Vorgabe: @code{#f})
URLs, von denen versucht werden soll, Substitute für Erstellungseingaben
herunterzuladen, wenn die Eingabe-Store-Objekte noch nicht vorliegen.

@item @code{extra-options} (Vorgabe: @var{'()})
Extra command line options for @code{guix-build-coordinator-agent}.
@end table
@end deftp

@deftp {Datentyp} guix-build-coordinator-agent-password-auth
Der Datentyp, der einen Agenten repräsentiert, der sich bei einem
Koordinator über eine UUID und ein Passwort authentisiert.

@table @asis
@item @code{uuid}
Die UUID des Agenten. Sie sollte durch den Koordinatorprozess erzeugt worden
sein, in der Datenbank des Koordinators eingetragen sein und von dem Agenten
benutzt werden, für den sie gedacht ist.

@item @code{password}
Das Passwort, das zum Herstellen einer Verbindung mit dem Koordinator
verwendet werden soll.

@end table
@end deftp

@deftp {Datentyp} guix-build-coordinator-agent-password-file-auth
Der Datentyp, der einen Agenten repräsentiert, der sich bei einem
Koordinator über eine UUID und ein aus einer Datei gelesenes Passwort
authentisiert.

@table @asis
@item @code{uuid}
Die UUID des Agenten. Sie sollte durch den Koordinatorprozess erzeugt worden
sein, in der Datenbank des Koordinators eingetragen sein und von dem Agenten
benutzt werden, für den sie gedacht ist.

@item @code{password-file}
Eine Datei mit dem Passwort, um sich mit dem Koordinator zu verbinden.

@end table
@end deftp

@deftp {Datentyp} guix-build-coordinator-agent-dynamic-auth
Der Datentyp, der einen Agenten repräsentiert, der sich bei einem
Koordinator über einen dynamischen Authentisierungs-Token und den
Agentennamen authentisiert.

@table @asis
@item @code{agent-name}
Der Name des Agenten. Er wird benutzt, um den passenden Eintrag in der
Datenbank für ihn zu finden. Gibt es noch keinen Eintrag, wird automatisch
einer hinzugefügt.

@item @code{token}
Dynamischer Authentisierungs-Token. Er wird in der Datenbank des
Koordinators erzeugt und vom Agenten zur Authentisierung benutzt.

@end table
@end deftp

@deftp {Datentyp} guix-build-coordinator-agent-dynamic-auth-with-file
Der Datentyp, der einen Agenten repräsentiert, der sich bei einem
Koordinator über einen aus einer Datei gelesenen dynamischen
Authentisierungs-Token und den Agentennamen authentisiert.

@table @asis
@item @code{agent-name}
Der Name des Agenten. Er wird benutzt, um den passenden Eintrag in der
Datenbank für ihn zu finden. Gibt es noch keinen Eintrag, wird automatisch
einer hinzugefügt.

@item @code{token-file}
Eine Datei, in der der dynamische Authentisierungs-Token enthalten ist. Er
wird in der Datenbank des Koordinators erzeugt und vom Agenten zur
Authentisierung benutzt.

@end table
@end deftp

@subsubheading Guix-Datendienst
Der @uref{http://data.guix.gnu.org,Guix-Datendienst} („Guix Data Service“)
verarbeitet und speichert Daten über GNU Guix und stellt diese zur
Verfügung. Dazu gehören Informationen über Pakete, Ableitungen sowie durch
Linting erkannte Paketfehler.

Die Daten werden in einer PostgreSQL-Datenbank gespeichert und stehen über
eine Weboberfläche zur Verfügung.

@defvar guix-data-service-type
Diensttyp für den Guix-Datendienst. Sein Wert muss ein
@code{guix-data-service-configuration}-Objekt sein. Der Dienst kann optional
den getmail-Dienst erweitern und die guix-commits-Mailing-Liste benutzen, um
bei Änderungen am Guix-Git-Repository auf dem Laufenden zu bleiben.
@end defvar

@deftp {Datentyp} guix-data-service-configuration
Der Datentyp, der die Konfiguration des Guix-Datendienstes repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @code{guix-data-service})
Das zu verwendende Guix-Datendienst-Paket.

@item @code{user} (Vorgabe: @code{"guix-data-service"})
Das Systembenutzerkonto, mit dem der Dienst ausgeführt wird.

@item @code{group} (Vorgabe: @code{"guix-data-service"})
Die Systembenutzergruppe, mit der der Dienst ausgeführt wird.

@item @code{port} (Vorgabe: @code{8765})
Der Port, an den der Webdienst gebunden wird.

@item @code{host} (Vorgabe: @code{"127.0.0.1"})
Rechnername oder Netzwerkschnittstelle, an die der Webdienst gebunden wird.

@item @code{getmail-idle-mailboxes} (Vorgabe: @code{#f})
Wenn es festgelegt ist, wird es als Liste der Postfächer („Mailboxes“)
eingerichtet, die der getmail-Dienst beobachtet.

@item @code{commits-getmail-retriever-configuration} (Vorgabe: @code{#f})
Wenn es festgelegt ist, bezeichnet dies das
@code{getmail-retriever-configuration}-Objekt, mit dem getmail eingerichtet
wird, um E-Mails von der „guix-commits“-Mailing-Liste zu beziehen.

@item @code{extra-options} (Vorgabe: @var{'()})
Zusätzliche Befehlszeilenoptionen für @code{guix-data-service}.

@item @code{extra-process-jobs-options} (Vorgabe: @var{'()})
Zusätzliche Befehlszeilenoptionen für @code{guix-data-service-process-jobs}.

@item @code{git-repositories} (default: @var{#f})
List of git-repository information to insert into the database.

@item @code{build-servers} (default: @var{#f})
List of build-server information to insert into the database.

@end table
@end deftp

@anchor{guix-home-service-type}
@subsubheading Guix-Home-Dienst

Der Guix-Home-Dienst ermöglicht es, von Guix System aus die Persönlichen
Umgebungen eines oder mehrerer Benutzer aufzuspielen (siehe @ref{Persönliche Konfiguration} für mehr zu Guix Home). Auf diese Weise werden die
Deklarationen der Persönlichen Umgebung der angegebenen Benutzerkonten in
die Systemkonfiguration eingebettet und im Einklang mit dieser zur selben
Zeit ausgerollt, was den Benutzerinnen und Benutzern die Mühe erspart,
jeweils selbst @command{guix home reconfigure} auszulösen.

@command{guix home} can operate on the home environment configured for
current user via this service, but its effect won't last beyond the next
system activation.  This can be used for quick testing and may avoid the
need of keeping a separate home configuration.

@defvar guix-home-service-type
Diensttyp für den Guix-Home-Dienst. Sein Wert muss eine Liste von Listen aus
jeweils dem Benutzerkonto und der zugehörigen Persönlichen Umgebung sein. In
jedem solchen Paar wird das Benutzerkonto als Zeichenkette angegeben, die
den Schlüssel angibt, für welchen Benutzer die Umgebung aufgespielt wird,
und der Wert ist die Konfiguration der Persönlichen Umgebung.

@lisp
(use-modules (gnu services guix))

(define my-home
  (home-environment
    …))

(operating-system
  (services (append (list (service guix-home-service-type
                                   `(("alice" ,my-home))))
                    %base-services)))
@end lisp

Dieser Dienst kann durch andere Dienste mit weiteren Persönlichen Umgebungen
erweitert werden, wie in diesem Beispiel:

@lisp
(simple-service 'my-extra-home guix-home-service-type
                `(("bob" ,my-extra-home)))
@end lisp
@end defvar

@subsubheading Nar Herder
Der @uref{https://git.cbaines.net/guix/nar-herder/about/,Nar Herder} ist ein
Werkzeug zum Umgang mit einer Menge von Nars.

@defvar nar-herder-type
Ein Diensttyp für den Guix-Datendienst. Sein Wert muss ein
@code{nar-herder-configuration}-Objekt sein. Der Dienst kann optional den
getmail-Dienst erweitern und die guix-commits-Mailing-Liste benutzen, um bei
Änderungen am Guix-Git-Repository auf dem Laufenden zu bleiben.
@end defvar

@deftp {Datentyp} nar-herder-configuration
Der Datentyp, der die Konfiguration des Guix-Datendienstes repräsentiert.

@table @asis
@item @code{package} (Vorgabe: @code{nar-herder})
Das zu verwendende Nar-Herder-Paket.

@item @code{user} (Vorgabe: @code{"nar-herder"})
Das Systembenutzerkonto, mit dem der Dienst ausgeführt wird.

@item @code{group} (Vorgabe: @code{"nar-herder"})
Die Systembenutzergruppe, mit der der Dienst ausgeführt wird.

@item @code{port} (Vorgabe: @code{8734})
Der Port, an den der Server gebunden wird.

@item @code{host} (Vorgabe: @code{"127.0.0.1"})
Rechnername oder Netzwerkschnittstelle, an die der Server gebunden wird.

@item @code{control-port} (default: @code{8734})
The port to bind the control server to.

@item @code{control-host} (default: @code{"127.0.0.1"})
The host to bind the control server to.

@item @code{mirror} (Vorgabe: @code{#f})
Optional die URL der anderen Nar-Herder-Instanz, wenn diese gespiegelt
werden soll. Das bedeutet, die hiesige Nar-Herder-Instanz wird die Datenbank
von dort herunterladen und auf dem aktuellen Stand halten.

@item @code{database} (Vorgabe: @code{"/var/lib/nar-herder/nar_herder.db"})
Wo die Datenbank gespeichert wird. Wenn die hiesige Nar-Herder-Instanz eine
von anderswo spiegelt, wird die Datenbank von dort heruntergeladen, wenn
noch keine existiert. Wenn keine andere Nar-Herder-Instanz gespiegelt wird,
wird eine leere Datenbank angelegt.

@item @code{database-dump} (Vorgabe: @code{"/var/lib/nar-herder/nar_herder_dump.db"})
Der Ort für das Datenbank-Dump. Es wird erzeugt und regelmäßig aktualisiert,
indem eine Kopie der Datenbank gemacht wird. Es handelt sich um die Version
der Datenbank, die zum Herunterladen angeboten wird.

@item @code{storage} (Vorgabe: @code{#f})
Optional der Ort, wo Nars gespeichert werden.

@item @code{storage-limit} (Vorgabe: @code{"none"})
Wie viele Bytes die am Speicherort hinterlegten Nars höchstens
einnehmen. Wenn „none“ angegeben wird, gibt es keine Begrenzung.

Wenn am Speicherort mehr hinterlegt ist als hier angegeben ist, werden Nars
gemäß @code{storage-nar-removal-criteria} gelöscht.

@item @code{storage-nar-removal-criteria} (Vorgabe: @code{'()})
Nach welchen Kriterien Nars aus dem Speicherort gelöscht werden. Sie werden
in Verbindung mit @code{storage-limit} angewandt.

Wenn die Größe am Speicherort @code{storage-limit} überschreitet, werden
Nars gemäß der hier angegebenen Löschkriterien überprüft und, wenn irgendein
Kriterium erfüllt wird, gelöscht. Das geht so weiter, bis die vom
Speicherort eingenommene Größe unterhalb von @code{storage-limit} liegt.

Jedes Kriterium wird in Form einer Zeichenkette, dann einem
Gleichheitszeichen, dann noch einer Zeichenkette festgelegt. Derzeit wird
nur ein Kriterium unterstützt, nämlich ob ein Nar schon auf einer anderen
Nar-Herder-Instanz vorliegt.

@item @code{ttl} (Vorgabe: @code{#f})
@code{Cache-Control}-HTTP-Kopfzeilen erzeugen, die eine Time-to-live (TTL)
von @var{ttl} signalisieren. Für @var{ttl} muss eine Dauer (mit dem
Anfangsbuchstaben der Maßeinheit der Dauer im Englischen) angegeben werden:
@code{5d} bedeutet 5 Tage, @code{1m} bedeutet 1 Monat und so weiter.

Das ermöglicht es Guix, Substitutinformationen @var{ttl} lang
zwischenzuspeichern.

@item @code{new-ttl} (Vorgabe: @code{#f})
If specified, this will override the @code{ttl} setting when used for the
@code{Cache-Control} headers, but this value will be used when scheduling
the removal of nars.

Use this setting when the TTL is being reduced to avoid removing nars while
clients still have cached narinfos.

@item @code{negative-ttl} (Vorgabe: @code{#f})
Eben solche @code{Cache-Control}-HTTP-Kopfzeilen für erfolglose (negative)
Suchen erzeugen, um eine Time-to-live (TTL) zu signalisieren, wenn
Store-Objekte fehlen und mit dem HTTP-Status-Code 404 geantwortet wird. Nach
Vorgabe wird für negative Antworten @emph{keine} TTL signalisiert.

@item @code{log-level} (Vorgabe: @code{'DEBUG})
Die Protokollstufe, etwa @code{'INFO}, um @emph{nicht} einzelne Anfragen zu
protokollieren.

@item @code{cached-compressions} (Vorgabe: @code{'()})
Aktiviert das Befüllen eines Zwischenspeichers für Nars mit anderen
Kompressionsmethoden als bei den gespeicherten Nars. Geben Sie dazu eine
Liste von
@code{nar-herder-cached-compression-configuration}-Verbundsobjekten an.

@item @code{min-uses} (Vorgabe: @code{3})
Wenn cached-compressions aktiviert sind, werden Nars zwischengespeichert,
sobald die hier genannte Anzahl von Anfragen nach dem Nar eingegangen ist.

@item @code{workers} (Vorgabe: @code{2})
Wie viele zwischengespeicherte Nars auf einmal erzeugt werden.

@item @code{nar-source} (Vorgabe: @code{#f})
Woher Nars bezogen werden, um zwischengespeicherte komprimierte Nars zu
berechnen. Für den Vorgabewert wird der Speicherort benutzt.

@item @code{extra-environment-variables} (Vorgabe: @code{'()})
Zusätzliche Umgebungsvariable, die mit dem Shepherd-Dienst festgelegt
werden.

@end table
@end deftp

@deftp {Datentyp} nar-herder-cached-compression-configuration
Der Datentyp repräsentiert die Konfiguration für zwischengespeicherte
komprimierte Nars.

@table @asis
@item @code{type}
Welche Kompressionsmethode benutzt wird, z.B.@: @code{'zstd}.

@item @code{workers} (Vorgabe: @code{#f})
Das zu benutzende Kompressionsniveau.

@item @code{directory} (Vorgabe: @code{#f})
An welchem Ort zwischengespeicherte Nars abgelegt werden. Wenn nichts
angegeben wird, dann werden sie in
@file{/var/cache/nar-herder/nar/@var{type}} gespeichert.

@item @code{directory-max-size} (Vorgabe: @code{#f})
Die Maximalgröße in Bytes für dieses Verzeichnis.

@item @code{unused-removal-duration} (Vorgabe: @code{#f})
If a cached nar isn't used for @code{unused-removal-duration}, it will be
scheduled for removal.

@var{unused-removal-duration} muss eine Dauer angeben: @code{5d} bedeutet 5
Tage, @code{1m} bedeutet 1 Monat und so weiter.

@item @code{ttl} (Vorgabe: @code{#f})
If specified this overrides the @code{ttl} used for narinfos when this
cached compression is available.

@item @code{new-ttl} (Vorgabe: @code{#f})
As with the @code{new-ttl} option for @code{nar-herder-configuration}, this
value will override the @code{ttl} when used for narinfo requests.

@end table
@end deftp

@node Linux-Dienste
@subsection Linux-Dienste

@subsubheading VFS Mapping Service
@cindex VFS mapping
@cindex Virtual File System mapping
@cindex bind mounts, service
@cindex overlay mounts, service

The VFS (Virtual File System) Mapping service allows you to bind a file name
under a different name in the global namespace.  For example, this is used
by the Shared Cache Service (@pxref{Guix-Dienste}) to bind the @samp{root}
user's cache over another user's cache.  Another use case may be to expose
game data from the store over your home directory, and apply modifications
there.

The service has three @emph{policies} to choose from with respect to access
rights on the bound over path:

@table @code
@item 'bind
Use a bind mount; the ownership and file permissions of the destination are
the same as the source.

@item 'translate
Use bindfs to make the destination appear as owned by the target user and
group.  Writes will be propagated back to the source as if made by the
original owner.

@item 'overlay
Use an overlay to make the destination appear as owned by the target user
and group. Writes will not appear in the source, but will be stored in a
target-user-owned @samp{-overlay} suffixed directory near the destination.
@end table

Here is an example configuration that exposes the default data directory of
@command{tuxpaint} under the home directory of @code{alice}.  Any
modification made by Alice to the brushes or stamps will not propagate back
to the store (which is read-only anyway).

@lisp
(operating-system
  ;; @dots{}
  (services
   (cons*
    (service vfs-mapping-service-type
             (vfs-mapping-configuration
              (bindings (list (vfs-mapping
                               (source      #~(string-append #$tuxpaint
                                                             "/share/tuxpaint"))
                               (destination "/home/alice/.tuxpaint")
                               (user        "alice")
                               (policy      'overlay)
                               (name        "alice-tuxpaint-overlay"))))))
    %desktop-services)))
@end lisp

The service can also be extended by providing a list of @code{vfs-mapping},
allowing for easier splitting of configuration.

@lisp
(operating-system
  ;; @dots{}
  (services
   (cons*
    (simple-service 'bob-too-wants-to-hack-on-tuxpaint
                    vfs-mapping-service-type
                    (list (vfs-mapping
                           (source      #~(string-append #$tuxpaint "/share/tuxpaint"))
                           (destination "/home/bob/.tuxpaint")
                           (user        "bob")
                           (policy      'overlay)
                           (name        "bob-tuxpaint-overlay"))))
    %desktop-services)))
@end lisp

The @code{source} file name must exist for the service to start.  The
@code{destination} directory will be created if it does not exist.

@defvar vfs-mapping-service-type
Service type for binding a directory in multiple places on the file system.

The access rights are either the same in source and destination
(@code{'bind}), or writes are translated back to the source as if made by
the source's owner (@code{'translate}), or kept in an overlay directory near
the destination (@code{'overlay}).  The service's value must be a
@code{vfs-mapping-configuration} object.
@end defvar

@deftp {Data Type} vfs-mapping-configuration
Data type representing the configuration of the vfs-mapping service.

@table @asis
@item @code{bindfs} (default: @code{#~(string-append #$bindfs "/bin/bindfs")})
The @command{bindfs} command to use for mounting.

@item @code{fusermount} (default: @code{#~(string-append #$fuse-2 "/bin/fusermount")})
The @command{fusermount} command to use.

@item @code{umount} (default: @code{#~(string-append #$util-linux+udev "/bin/umount")})
The @command{umount} command to use.

@item @code{bindings} (default: @code{'()})
A list of @code{vfs-mapping} records.

@end table
@end deftp

@deftp {Data Type} vfs-mapping
Data type representing the configuration for a single shared directory.

@table @asis
@item @code{source}
The source file name to be shared.

@item @code{destination}
The destination at which the contents of @code{source} will be exposed.

@item @code{policy} (default: @code{'translate})
Either @code{'bind} (same ownership and access rights for @code{source} and
@code{destination}), @code{'translate} (read-write, with writes translated
as if made by @code{source}'s owner), or @code{'overlay} (read-only with
@code{user}-owned writable overlay).

@item @code{user} (default: @code{#f})
The user that will own the @code{destination} directory, and appear to own
its content.  It must be kept at its default @code{#f} value when using the
@code{'bind} policy.

@item @code{group} (default: @code{"users"})
The group that will own the @code{destination} directory, and appear to own
its content.

@item @code{name} (default: @code{"<src>-[<policy>]-><dst>"})
The name of the shepherd service to mount and unmount the binding.

@item @code{requirement} (default: @code{'(file-systems user-homes)})
The list of services that Shepherd ought to provision before trying to
mount.

@end table
@end deftp

@cindex OOM
@cindex Out-Of-Memory-Killer
@cindex earlyoom
@cindex Early-Out-Of-Memory-Daemon
@subsubheading Early-OOM-Dienst

@uref{https://github.com/rfjakob/earlyoom,Early OOM}, auch bekannt als
Earlyoom, ist ein minimalistischer Out-Of-Memory-Daemon (OOM), um auf
Anwendungsebene („User Space“) Programme erzwungen zu beenden, wenn einem
der freie Arbeitsspeicher ausgeht (ein „OOM-Killer“). Er stellt eine
Alternative zum im Kernel eingebauten OOM-Killer dar, mit der das System in
einem solchen Fall besser weiterhin auf Benutzereingaben reagieren kann und
die konfigurierbarer ist.

@defvar earlyoom-service-type
Der Diensttyp, um @command{earlyoom}, den Early-OOM-Daemon, auszuführen. Als
Wert muss ein @code{earlyoom-configuration}-Objekt angegeben werden, wie
unten beschrieben. So kann der Dienst mit seiner Vorgabekonfiguration
instanziiert werden:

@lisp
(service earlyoom-service-type)
@end lisp
@end defvar

@deftp {Datentyp} earlyoom-configuration
Dies ist das Verbundsobjekt mit der Konfiguration des
@code{earlyoom-service-type}.

@table @asis
@item @code{earlyoom} (Vorgabe: @var{earlyoom})
Das Earlyoom-Paket, das benutzt werden soll.

@item @code{minimum-available-memory} (Vorgabe: @code{10})
Der Schwellwert, wie viel Arbeitsspeicher mindestens @emph{verfügbar}
bleiben muss, in Prozent.

@item @code{minimum-free-swap} (Vorgabe: @code{10})
Der Schwellwert, wie viel Swap-Speicher mindestens frei bleiben muss, in
Prozent.

@item @code{prefer-regexp} (Vorgabe: @code{#f})
Ein regulärer Ausdruck (als eine Zeichenkette), der auf die Namen jener
Prozesse passt, die als Erste erzwungen beendet werden sollen.

@item @code{avoid-regexp} (Vorgabe: @code{#f})
Ein regulärer Ausdruck (als eine Zeichenkette), der auf die Namen jener
Prozesse passt, die @emph{nicht} erzwungen beendet werden sollen.<

@item @code{memory-report-interval} (Vorgabe: @code{0})
Das Intervall in Sekunden, in dem ein Bericht über den Speicher ausgegeben
werden soll. Nach Vorgabe ist es deaktiviert.

@item @code{ignore-positive-oom-score-adj?} (Vorgabe: @code{#f})
Ein boolescher Wert, der angibt, ob die in @file{/proc/*/oom_score_adj}
festgelegten Anpassungen nach oben ignoriert werden sollen.

@item @code{show-debug-messages?} (Vorgabe: @code{#f})
Ein boolescher Ausdruck, der angibt, ob Nachrichten zur Fehlersuche
ausgegeben werden sollen. Die Protokolle werden unter
@file{/var/log/earlyoom.log} gespeichert.

@item @code{send-notification-command} (Vorgabe: @code{#f})
Hiermit kann ein eigener Befehl eingestellt werden, um Benachrichtigungen zu
senden.
@end table
@end deftp

@subsubheading fstrim-Dienst
@cindex fstrim-Dienst
@cindex SSD-Speicher, regelmäßiger TRIM
@cindex Solid State Drives, TRIM

Mit dem Befehl @command{fstrim} können Sie unbenutzte Blöcke über einen
TRIM-Steuerbefehl auf einem eingebundenen Dateisystem freigeben.

@c This was copied from the fstrim manpage, with some Texinfo touch-ups.
@quotation Warnung
Wenn Sie @command{fstrim} zu häufig ausführen oder gar mit @command{mount -o
discard} einbinden, kann das die Lebensdauer von qualitativ schlechten
SSD-Geräten beeinträchtigen. Auf den meisten Desktop- und Server-Systemen
genügt es, TRIM-Befehle wöchentlich vorzunehmen. Beachten Sie, dass manche
Geräte TRIM-Befehle @emph{nicht} in eine Warteschlangenverarbeitung
einreihen können, sondern jeder TRIM-Befehl gleichzeitige Zugriffe auf die
Platte ausbremst.
@end quotation

@defvar fstrim-service-type
Diensttyp, um regelmäßig @command{fstrim} auszuführen. Als Wert muss ein
@code{<fstrim-configuration>}-Objekt angegeben werden. So kann der Dienst
mit seiner Vorgabekonfiguration instanziiert werden:

@lisp
(service fstrim-service-type)
@end lisp
@end defvar

@c %start of fragment

@deftp {Datentyp} fstrim-configuration
Verfügbare @code{fstrim-configuration}-Felder sind:

@table @asis
@item @code{package} (Vorgabe: @code{util-linux}) (Typ: dateiartig)
Das Paket mit dem Befehl @command{fstrim}.

@item @code{schedule} (default: @code{"0 0 * * 0"}) (type: Shepherd calendar event)
Schedule for launching @command{fstrim}, expressed as a string in
traditional cron syntax or as a gexp evaluating to a Shepherd calendar event
(@pxref{Timers,,, shepherd,The GNU Shepherd Manual}).  By default this is
set to run weekly on Sunday at 00:00.

@item @code{listed-in} (Vorgabe: @code{'("/etc/fstab" "/proc/self/mountinfo")}) (Typ: Vielleicht-Liste-von-Zeichenketten)
Liste von Dateien im Format von fstab oder mountinfo. Alle fehlenden oder
leeren Dateien werden ohne Fehlermeldung ignoriert. Die Abarbeitung der
Liste @emph{bricht ab}, sobald eine der Dateien @emph{nicht} leer
ist. Dateisysteme mit der Einbinde-Option („mount option“)
@code{X-fstrim.notrim} in fstab werden übersprungen.

@item @code{verbose?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Mit ausführlichen Meldungen ausführen.

@item @code{quiet-unsupported?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Keine Fehlermeldungen bringen, wenn die TRIM-Operation (ioctl) @emph{nicht}
unterstützt wird.

@item @code{extra-arguments} (Typ: Vielleicht-Liste-von-Zeichenketten)
Zusätzliche Befehlszeilenoptionen, die an @command{fstrim} angehängt
werden. Führen Sie @command{man fstrim} aus, um weitere Informationen zu
erhalten.

@end table

@end deftp


@c %end of fragment

@cindex modprobe
@cindex Kernelmodule laden
@subsubheading Kernelmodul-Ladedienst

Mit dem Kernelmodul-Ladedienst („Kernel Module Loader Service“) können Sie
veranlassen, dass hinzuladbare Kernelmodule beim Systemstart geladen
werden. Das bietet sich besonders für Module an, die nicht automatisch
geladen werden („Autoload“), sondern manuell geladen werden müssen, wie es
z.B.@: bei @code{ddcci} der Fall ist.

@defvar kernel-module-loader-service-type
Der Diensttyp, um hinzuladbare Kernelmodule beim Systemstart über
@command{modprobe} zu laden. Als Wert muss eine Liste von Zeichenketten
angegeben werden, die den Modulnamen entsprechen. Um zum Beispiel die durch
@code{ddcci-driver-linux} zur Verfügung gestellten Treiber zu laden und
dabei durch Übergabe bestimmter Parameter den Modus zur Fehlersuche zu
aktivieren, können Sie Folgendes benutzen:

@lisp
(use-modules (gnu) (gnu services))
(use-package-modules linux)
(use-service-modules linux)

(define ddcci-config
  (plain-file "ddcci.conf"
              "options ddcci dyndbg delay=120"))

(operating-system
  …
  (services (cons* (service kernel-module-loader-service-type
                            '("ddcci" "ddcci_backlight"))
                   (simple-service 'ddcci-config etc-service-type
                                   (list `("modprobe.d/ddcci.conf"
                                           ,ddcci-config)))
                   %base-services))
  (kernel-loadable-modules (list ddcci-driver-linux)))
@end lisp
@end defvar

@subsubheading Cachefilesd-Dienst

@cindex cachefilesd
@cindex fscache, Zwischenspeicher für Dateisysteme (Linux)
Der Cachefilesd-Dienst startet einen Daemon, mit dem Daten aus einem
Netzwerkdateisystem lokal zwischengespeichert werden. Insbesondere bei über
NFS und AFS freigegebenen Dateisystemen wird so die Latenz verringert, wenn
wiederholt Lesezugriffe auf dieselbe Datei erfolgen.

Den Daemon können Sie wie folgt konfigurieren:

@lisp
(service cachefilesd-service-type
         (cachefilesd-configuration
           (cache-directory "/var/cache/fscache")))
@end lisp

@defvar cachefilesd-service-type
Dies ist der Diensttyp zum Starten von @command{cachefilesd}. Der Wert
dieses Dienstes muss ein @code{cachefilesd-configuration}-Objekt sein, für
das mindestens das @var{cache-directory}-Feld angegeben werden muss.

@end defvar

@c %start of fragment
@deftp {Datentyp} cachefilesd-configuration
Verfügbare Felder einer @code{cachefilesd-configuration} sind:

@table @asis
@item @code{cachefilesd} (Vorgabe: @code{cachefilesd}) (Typ: dateiartig)
Das cachefilesd-Paket, das benutzt werden soll.

@item @code{debug-output?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Informationen zur Fehlersuche auf stderr ausgeben.

@item @code{use-syslog?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Ob Protokolle an die Syslog-Einrichtung statt an stdout gehen sollen.

@item @code{scan?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Scan for cacheable objects.

@item @code{cache-directory} (Typ: Vielleicht-Zeichenkette)
Der Ort für das Verzeichnis, um den Zwischenspeicher aufzubewahren.

@item @code{cache-name} (Vorgabe: @code{"CacheFiles"}) (Typ: Vielleicht-Zeichenkette)
Name des Zwischenspeichers (etwas eindeutiges).

@item @code{security-context} (Typ: Vielleicht-Zeichenkette)
Der SELinux-Sicherheitskontext.

@item @code{pause-culling-for-block-percentage} (Vorgabe: @code{7}) (Typ: Vielleicht-Nichtnegative-ganze-Zahl)
Nicht weiter bereinigen, wenn dieser Prozentsatz verfügbarer Blöcke
überschritten wird.

@item @code{pause-culling-for-file-percentage} (Vorgabe: @code{7}) (Typ: Vielleicht-Nichtnegative-ganze-Zahl)
Nicht weiter bereinigen, wenn dieser Prozentsatz verfügbarer Dateien
überschritten wird.

@item @code{resume-culling-for-block-percentage} (Vorgabe: @code{5}) (Typ: Vielleicht-Nichtnegative-ganze-Zahl)
Anfangen zu bereinigen, wenn dieser Prozentsatz verfügbarer Blöcke
unterschritten wird.

@item @code{resume-culling-for-file-percentage} (Vorgabe: @code{5}) (Typ: Vielleicht-Nichtnegative-ganze-Zahl)
Anfangen zu bereinigen, wenn dieser Prozentsatz verfügbarer Dateien
unterschritten wird.

@item @code{pause-caching-for-block-percentage} (Vorgabe: @code{1}) (Typ: Vielleicht-Nichtnegative-ganze-Zahl)
Nicht weiter reservieren, wenn dieser Prozentsatz verfügbarer Blöcke
unterschritten wird.

@item @code{pause-caching-for-file-percentage} (Vorgabe: @code{1}) (Typ: Vielleicht-Nichtnegative-ganze-Zahl)
Nicht weiter reservieren, wenn dieser Prozentsatz verfügbarer Dateien
unterschritten wird.

@item @code{log2-table-size} (Vorgabe: @code{12}) (Typ: Vielleicht-Nichtnegative-ganze-Zahl)
Die Größe der Tabellen mit bereinigbaren Objekten als Logarithmus zur Basis
2.

@item @code{cull?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Durch Bereinigen für freien Platz sorgen (erhöht die Systemauslastung).

@item @code{trace-function-entry-in-kernel-module?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Das Betreten von Funktionen im Kernel-Modul verfolgen (zur Fehlersuche).

@item @code{trace-function-exit-in-kernel-module?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Das Verlassen von Funktionen im Kernel-Modul verfolgen (zur Fehlersuche).

@item @code{trace-internal-checkpoints-in-kernel-module?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Das Erreichen interner Checkpoints im Kernel-Modul verfolgen (zur
Fehlersuche).

@end table
@end deftp
@c %end of fragment

@cindex rasdaemon
@cindex Daemon für Reliability, Availability und Serviceability
@subsubheading Rasdaemon-Dienst

Mit dem Rasdaemon-Dienst steht Ihnen ein Daemon zur Verfügung, mit dem
Trace-Ereignisse des Linux-Kernels bezüglich der Zuverlässigkeit
(Reliability), Verfügbarkeit (Availability) und Wartbarkeit (Serviceability)
der Plattform beobachtet werden. Sie werden in syslogd protokolliert.

Reliability, Availability, Serviceability ist ein Konzept auf Servern, um
deren Robustheit zu messen.

@strong{Relability} (Zuverlässigkeit) ist die Wahrscheinlichkeit, mit der
ein System korrekte Ausgaben liefert:

@itemize @bullet
@item Im Allgemeinen wird sie durch die Mittlere Betriebsdauer zwischen Ausfällen (Mean Time Between Failures, MTBF) beziffert.
@item Sie wird besser, wenn Hardware-Fehler vermieden, erkannt oder
repariert werden können.
@end itemize

@strong{Availability} (Verfügbarkeit) ist die Wahrscheinlichkeit, dass ein
System zu einem bestimmten Zeitpunkt betriebsbereit ist:

@itemize @bullet
@item Im Allgemeinen wird sie als Anteil der Ausfallzeit an der Gesamtzeit gemessen.
@item Oft kommen hier Mechanismen zum Einsatz, um Hardware-Fehler im laufenden Betrieb zu erkennen und zu beheben.
@end itemize

@strong{Serviceability} (Wartbarkeit) bezeichnet, wie einfach und schnell
ein System repariert und gepflegt werden kann:

@itemize @bullet
@item Im Allgemeinen wird sie durch den Mittleren Abstand zwischen Reparaturen (Mean Time Between Repair, MTBR) gemessen.
@end itemize


Zu den beobachtbaren Messwerten gehören für gewöhnlich:

@itemize @bullet
@item Prozessor – Fehler erkennen bei der Befehlsausführung (Instruction Execution) und an den Prozessor-Caches (L1/L2/L3),
@item Arbeitsspeicher – Fehlerbehebungslogik wie ECC einbauen, um Fehler zu erkennen und zu beheben,
@item Ein-/Ausgabe – CRC-Prüfsummen für übertragene Daten einbauen,
@item Massenspeicher – RAID, Journaling in Dateisystemen, Prüfsummen,
Selbstüberwachung, Technologien zur Analyse und Berichterstattung (SMART).
@end itemize

Durch das Beobachten, wie oft Fehler erkannt werden, kann bestimmt werden,
ob die Wahrscheinlichkeit von Hardware-Fehlern zunimmt, und in diesem Fall
kann ein vorsorglicher Austausch der schwächelnden Komponente vorgenommen
werden, solange die Fehler leicht zu beheben sind.

Genaue Informationen über die Arten der gesammelten Fehlerereignisse und was
sie bedeuten finden Sie in der Anleitung für Kernel-Administratoren unter
@url{https://www.kernel.org/doc/html/latest/admin-guide/ras.html}.

@defvar rasdaemon-service-type
Diensttyp für den @command{rasdaemon}-Dienst. Als Wert nimmt er ein
@code{rasdaemon-configuration}-Objekt. Sie instanziieren ihn so:

@lisp
(service rasdaemon-service-type)
@end lisp

Dadurch wird die Vorgabekonfiguration geladen, mit der alle Ereignisse
beobachtet und mit syslogd protokolliert werden.
@end defvar

@deftp {Datentyp} rasdaemon-configuration
Repräsentiert die Konfiguration von @command{rasdaemon}.

@table @asis
@item @code{record?} (Vorgabe: @code{#f})

Ein Boolescher Ausdruck, der anzeigt, ob die Ereignisse in eine
SQLite-Datenbank geschrieben werden. Dadurch wird ein strukturierterer
Zugang zu den Informationen aus der Protokolldatei ermöglicht. Der Ort für
die Datenbank ist fest einprogrammiert als
@file{/var/lib/rasdaemon/ras-mc_event.db}.

@end table
@end deftp

@cindex zram
@cindex komprimierter Swap-Speicher
@cindex komprimierte Blockgeräte im Arbeitsspeicher („RAM“)
@subsubheading Dienst für Zram-Geräte

Der Dienst für Zram-Geräte macht ein komprimiertes Swap-Gerät im
Arbeitsspeicher verfügbar. Mehr Informationen finden Sie in der
Linux-Kernel-Dokumentation
@uref{https://www.kernel.org/doc/html/latest/admin-guide/blockdev/zram.html,über
Zram-Geräte}.

@defvar zram-device-service-type
Dieser Dienst erzeugt das Zram-Blockgerät, formatiert es als Swap-Speicher
und aktiviert es als ein Swap-Gerät. Der Wert des Dienstes ist ein
@code{zram-device-configuration}-Verbundsobjekt.

@deftp {Datentyp} zram-device-configuration
Dieser Datentyp repräsentiert die Konfiguration des zram-device-Dienstes.

@table @asis
@item @code{size} (Vorgabe: @code{"1G"})
Wie viel Speicher Sie für das Zram-Gerät verfügbar machen möchten. Angegeben
werden kann eine Zeichenkette oder eine Zahl mit der Anzahl Bytes oder mit
einem Suffix, z.B.@: @code{"512M"} oder @code{1024000}.
@item @code{compression-algorithm} (Vorgabe: @code{'lzo})
Welchen Kompressionsalgorithmus Sie verwenden möchten. Alle
Konfigurationsmöglichkeiten lassen sich hier nicht aufzählen, aber der
Linux-Libre-Kernel von Guix unterstützt unter anderem die häufig benutzten
@code{'lzo}, @code{'lz4} und @code{'zstd}.
@item @code{memory-limit} (Vorgabe: @code{0})
Wie viel Arbeitsspeicher dem Zram-Gerät höchstens zur Verfügung steht. Wenn
es auf 0 steht, entfällt die Beschränkung. Obwohl im Allgemeinen von einem
Kompressionsverhältnis von 2:1 ausgegangen wird, kann es passieren, dass
@emph{nicht} komprimierbare Daten den Swap-Speicher füllen. Mit diesem Feld
kann das begrenzt werden. Es nimmt eine Zeichenkette oder eine Anzahl Bytes;
ein Suffix kann angegeben werden, z.B.@: @code{"2G"}.
@item @code{priority} (Vorgabe: @code{#f})
Welche Priorität dem Swap-Gerät gegeben wird, das aus dem Zram-Gerät
entsteht. Siehe @ref{Swap-Speicher} für eine Beschreibung der
Swap-Prioritäten. Es kann wichtig sein, für das Zram-Gerät eine bestimmte
Priorität zuzuweisen, sonst bleibt es am Ende aus den dort beschriebenen
Gründen praktisch ungenutzt.
@end table

@end deftp
@end defvar

@node Hurd-Dienste
@subsection Hurd-Dienste

@defvar hurd-console-service-type
Diensttyp, mit dem der fantastische @code{VGA}-Konsolen-Client auf Hurd
ausgeführt wird.

Der Wert des Dienstes ist ein
@code{hurd-console-configuration}-Verbundsobjekt.
@end defvar

@deftp {Datentyp} hurd-console-configuration
Dieser Datentyp repräsentiert die Konfiguration des hurd-console-Dienstes.

@table @asis
@item @code{hurd} (Vorgabe: @var{hurd})
Das zu verwendende Hurd-Paket.
@end table
@end deftp

@defvar hurd-getty-service-type
Der Diensttyp, um ein TTY über Hurds @code{getty}-Programm zu starten.

Der Wert des Dienstes ist ein
@code{hurd-getty-configuration}-Verbundsobjekt.
@end defvar

@deftp {Datentyp} hurd-getty-configuration
Dieser Datentyp repräsentiert die Konfiguration des hurd-getty-Dienstes.

@table @asis
@item @code{hurd} (Vorgabe: @var{hurd})
Das zu verwendende Hurd-Paket.

@item @code{tty}
Der Name der Konsole, auf der dieses Getty läuft@tie{}– z.B.@:
@code{"tty1"}.

@item @code{baud-rate} (Vorgabe: @code{38400})
Eine ganze Zahl, die die Baud-Rate des TTYs angibt.

@end table
@end deftp

@node Verschiedene Dienste
@subsection Verschiedene Dienste

@cindex Fingerabdruck
@subsubheading Fingerabdrucklese-Dienst

Das Modul @code{(gnu services authentication)} stellt einen DBus-Dienst zur
Verfügung, mit dem Fingerabdrücke mit Hilfe eines Fingerabdrucksensors
gelesen und identifiziert werden können.

@defvar fprintd-service-type
Der Diensttyp für @command{fprintd}, mit dem Fingerabdrücke gelesen werden
können.

@lisp
(service fprintd-service-type)
@end lisp
@end defvar

@cindex sysctl
@subsubheading Systemsteuerungsdienst

Das Modul @code{(gnu services sysctl)} stellt einen Dienst zur Verfügung, um
Kernelparameter zur Boot-Zeit einzustellen.

@defvar sysctl-service-type
Der Diensttyp für @command{sysctl}, das Kernel-Parameter unter
@file{/proc/sys/} anpasst. Um IPv4-Weiterleitung („Forwarding“) zu
aktivieren, kann er auf diese Weise instanziiert werden:

@lisp
(service sysctl-service-type
         (sysctl-configuration
           (settings '(("net.ipv4.ip_forward" . "1")))))
@end lisp

Weil @code{sysctl-service-type} in den Listen vorgegebener Dienste vorkommt,
sowohl in @code{%base-services} als auch in @code{%desktop-services}, können
Sie @code{modify-services} benutzen, um seine Konfiguration zu ändern und
die Kernel-Parameter einzutragen, die Sie möchten (siehe @ref{Service-Referenz, @code{modify-services}}).

@lisp
(modify-services %base-services
  (sysctl-service-type config =>
                       (sysctl-configuration
                         (settings (append '(("net.ipv4.ip_forward" . "1"))
                                           %default-sysctl-settings)))))
@end lisp

@end defvar

@deftp {Datentyp} sysctl-configuration
Der Datentyp, der die Konfiguration von @command{sysctl} repräsentiert.

@table @asis
@item @code{sysctl} (Vorgabe: @code{(file-append procps "/sbin/sysctl"})
Die ausführbare Datei für @command{sysctl}, die benutzt werden soll.

@item @code{settings} (Vorgabe: @code{%default-sysctl-settings})
Eine assoziative Liste, die Kernel-Parameter und ihre Werte festlegt.
@end table
@end deftp

@defvar %default-sysctl-settings
Eine assoziative Liste, die die vorgegebenen @command{sysctl}-Parameter auf
Guix System enthält.
@end defvar

@cindex pcscd
@subsubheading PC/SC-Smart-Card-Daemon-Dienst

Das Modul @code{(gnu services security-token)} stellt den folgenden Dienst
zur Verfügung, um @command{pcscd} auszuführen, den
PC/SC-Smart-Card-Daemon. @command{pcscd} ist das Daemonprogramm für die
Rahmensysteme pcsc-lite und MuscleCard. Es handelt sich um einen
Ressourcenverwaltungsdienst, der die Kommunikation mit
Smart-Card-Lesegeräten, Smart Cards und kryptographischen Tokens steuert,
die mit dem System verbunden sind.

@defvar pcscd-service-type
Diensttyp für den @command{pcscd}-Dienst. Als Wert muss ein
@code{pcscd-configuration}-Objekt angegeben werden. Um pcscd mit seiner
Vorgabekonfiguration auszuführen, instanziieren Sie ihn als:

@lisp
(service pcscd-service-type)
@end lisp
@end defvar

@deftp {Datentyp} pcscd-configuration
Repräsentiert die Konfiguration von @command{pcscd}.

@table @asis
@item @code{pcsc-lite} (Vorgabe: @code{pcsc-lite})
Das „pcsc-lite“-Paket, das pcscd zur Verfügung stellt.
@item @code{usb-drivers} (Vorgabe: @code{(list ccid)})
Die Liste der Pakete, die USB-Treiber für pcscd zur Verfügung stellen. Es
wird erwartet, dass sich Treiber unter @file{pcsc/drivers} innerhalb des
Store-Verzeichnisses des Pakets befinden.
@end table
@end deftp

@cindex LIRC
@subsubheading LIRC-Dienst

Das Modul @code{(gnu services lirc)} stellt den folgenden Dienst zur
Verfügung.

@defvar lirc-service-type
Diensttyp für einen Dienst, der @url{http://www.lirc.org, LIRC} ausführt,
einen Dienst zum Dekodieren von Infrarot-Signalen aus Fernbedienungen.

Der Wert dieses Dienstes ist ein @code{<lirc-configuration>}-Objekt.
@end defvar

@deftp {Datentyp} lirc-configuration
Datentyp, der die Konfiguration von @command{lircd} repräsentiert.

@table @asis
@item @code{lirc} (Vorgabe: @code{lirc}) (Typ: dateiartig)
Paketobjekt von @command{lirc}.

@item @code{device} (Vorgabe: @code{#f}) (Typ: Zeichenkette)
@itemx @code{driver} (Vorgabe: @code{#f}) (Typ: Zeichenkette)
@itemx @code{config-file} (Vorgabe: @code{#f}) (Typ: Zeichenkette-oder-dateiartig)
BESCHREIBUNG FEHLT NOCH. Siehe das @command{lircd}-Handbuch für Details.

@item @code{extra-options} (Vorgabe: @code{'()}) (Typ: Liste-von-Zeichenketten)
Zusätzliche Befehlszeilenoptionen, die an @command{lircd} übergeben werden.

@end table
@end deftp

@c TODO: Document <lirc-configuration>, preferably by refactoring this to use
@c       define-configuration and generating documentation from it.

@cindex SPICE
@subsubheading SPICE-Dienst

Das Modul @code{(gnu services spice)} stellt den folgenden Dienst bereit.

@defvar spice-vdagent-service-type
Diensttyp für einen Dienst, der @url{https://www.spice-space.org, VDAGENT}
ausführt, einen Daemon, um die Zwischenablage mit einer virtuellen Maschine
zu teilen und die Auflösung des Anzeigegeräts des Gastsystems umzustellen,
wenn sich die Größe des grafischen Konsolenfensters ändert.
@end defvar

@deftp {Datentyp} spice-vdagent-configuration
Datentyp, der die Konfiguration des @code{spice-vdagent-service-type}
repräsentiert.

@table @asis
@item @code{spice-vdagent} (Vorgabe: @code{spice-vdagent}) (Typ: dateiartig)
Paketobjekt von VDAGENT.

@end table
@end deftp

@cindex inputattach
@subsubheading inputattach-Dienst

@cindex Tablett-Eingaben, für Xorg
@cindex Tastbildschirm-Eingaben, für Xorg
Der @uref{https://linuxwacom.github.io/, inputattach-Dienst} macht es Ihnen
möglich, Eingabegeräte wie Wacom-Tabletts, Tastbildschirme („Touchscreens“)
oder Joysticks mit dem Xorg-Anzeigeserver zu benutzen.

@defvar inputattach-service-type
Der Diensttyp für den Dienst, der @command{inputattach} auf einem Gerät
ausführt und Ereignisse davon weiterleitet.
@end defvar

@deftp {Datentyp} inputattach-configuration
@table @asis
@item @code{device-type} (Vorgabe: @code{"wacom"})
Der Typ des Geräts, mit dem eine Verbindung hergestellt werden soll. Führen
Sie @command{inputattach --help} aus dem @code{inputattach}-Paket aus, um
eine Liste unterstützter Gerätetypen zu sehen.

@item @code{device} (Vorgabe: @code{"/dev/ttyS0"})
Die Gerätedatei, um sich mit dem Gerät zu verbinden.

@item @code{baud-rate} (Vorgabe: @code{#f})
Welche Baudrate für die serielle Verbindung benutzt werden soll. Es sollte
eine Zahl oder @code{#f} angegeben werden.

@item @code{log-file} (Vorgabe: @code{#f})
Wenn es wahr ist, muss es der Name einer Datei sein, in die
Protokollnachrichten geschrieben werden sollen.
@end table
@end deftp

@subsubheading Wörterbuchdienst
@cindex Wörterbuch

Das Modul @code{(gnu services dict)} stellt den folgenden Dienst zur
Verfügung:

@defvar dicod-service-type
Dies ist der Diensttyp für einen Dienst, der den @command{dicod}-Daemon
ausführt. Dabei handelt es sich um eine Implementierung eines DICT-Servers
(siehe das @ref{Dicod,,, dico, Handbuch von GNU Dico}).

Sie können in Ihre @file{~/.dico}-Datei @command{open localhost} eintragen,
damit @code{localhost} zum voreingestellten Server des
@command{dico}-Clients wird (siehe das @ref{Initialization File,,, dico,
Handbuch von GNU Dico}).

@quotation Anmerkung
Dieser Dienst ist auch mit Guix Home erhältlich, wo er einfach mit Ihren
Benutzerrechten ausgeführt wird (siehe @ref{Verschiedene Persönliche Dienste,
@code{home-dicod-service-type}}).
@end quotation
@end defvar

@deftp {Datentyp} dicod-configuration
Der Datentyp, der die Konfiguration von dicod repräsentiert.

@table @asis
@item @code{dico} (Vorgabe: @var{dico})
Paketobjekt des GNU-Dico-Wörterbuchservers.

@item @code{interfaces} (Vorgabe: @var{'("localhost")})
Hierfür muss die Liste der IP-Adressen, Ports und möglicherweise auch
Socket-Dateinamen angegeben werden, auf die gelauscht werden soll (siehe
@ref{Server Settings, @code{listen} directive,, dico, Handbuch von GNU
Dico}).

@item @code{handlers} (Vorgabe: @var{'()})
Liste der @code{<dicod-handler>}-Objekte, die Handler (Modulinstanzen)
bezeichnen.

@item @code{databases} (Vorgabe: @var{(list %dicod-database:gcide)})
Liste der @code{<dicod-database>}-Objekte, die anzubietende Wörterbücher
bezeichnen.
@end table
@end deftp

@deftp {Datentyp} dicod-handler
Der Datentyp, der einen Wörterbuch-Handler (eine Modulinstanz)
repräsentiert.

@table @asis
@item @code{name}
Der Name des Handlers (der Modulinstanz).

@item @code{module} (Vorgabe: @var{#f})
Der Name des dicod-Moduls (der Instanz) des Handlers. Wenn er @code{#f} ist,
heißt das, das Modul hat denselben Namen wie der Handler (siehe
@ref{Modules,,, dico, Handbuch von GNU Dico}).

@item @code{options}
Liste der Zeichenketten oder G-Ausdrücke, die die Argumente für den
Modul-Handler repräsentieren.
@end table
@end deftp

@deftp {Datentyp} dicod-database
Datentyp, der eine Wörterbuchdatenbank repräsentiert.

@table @asis
@item @code{name}
Der Name der Datenbank, der in DICT-Befehlen benutzt wird.

@item @code{handler}
Der Name des dicod-Handlers (der Modulinstanz), die von dieser Datenbank
benutzt wird (siehe @ref{Handlers,,, dico, Handbuch von GNU Dico}).

@item @code{complex?} (Vorgabe: @var{#f})
Ob die Datenbankkonfiguration komplex ist. In diesem Fall muss für die
komplexe Konfiguration auch ein entsprechendes @code{<dicod-handler>}-Objekt
existieren, ansonsten nicht.

@item @code{options}
Liste der Zeichenketten oder G-Ausdrücke, die die Argumente für die
Datenbank repräsentiert (siehe @ref{Databases,,, dico, Handbuch von GNU
Dico}).
@end table
@end deftp

@defvar %dicod-database:gcide
Ein @code{<dicod-database>}-Objekt, um das „GNU Collaborative International
Dictionary of English“ anzubieten. Dazu wird das @code{gcide}-Paket benutzt.
@end defvar

@deffn {Procedure} dicod-freedict-database dictionary-name
Returns a record of type @code{dicod-database} for purpose of configuring a
database for the FreeDict multilingual dictionary named by
@var{dictionary-name}, a string such as @code{"kur-eng"} for the
Kurdish-to-English dictionary, into a service of type
@code{dicod-service-type}.
@end deffn

@defvar %dicod-databases:freedict
A relatively large list of records of type @code{dicod-database}, made
available for users who wish to configure all the FreeDict multilingual
dictionaries provided by the @code{freedict-dictionaries} package into a
service of type @code{dicod-service-type}.
@end defvar

The following is an example @code{dicod-service-type} configuration,
extending a @command{dicod} daemon serving databases for the wordnet and
gcide dictionaries, as well as a selection of FreeDict multilingual
dictionaries.

@lisp
(service dicod-service-type
         (dicod-configuration
          (handlers (list
                     (dicod-handler
                      (name "wordnet")
                      (module "wordnet")
                      (options
                       (list #~(string-append "wnhome=" #$wordnet))))))
          (databases (cons*
                      (dicod-database
                       (name "wordnet")
                       (complex? #t)
                       (handler "wordnet"))
                      %dicod-database:gcide
                      (map
                       dicod-freedict-database
                       '("fra-eng" "eng-fra" "eng-spa" "spa-eng"))))))
@end lisp

@cindex Docker
@subsubheading Docker-Dienst

Das Modul @code{(gnu services docker)} stellt die folgenden Dienste zur
Verfügung.

@cindex containerd, container runtime
@defvar containerd-service-type

This service type operates containerd
@url{https://containerd.io,containerd}, a daemon responsible for overseeing
the entire container lifecycle on its host system. This includes image
handling, storage management, container execution, supervision, low-level
storage operations, network connections, and more.

@end defvar

@deftp {Data Type} containerd-configuration
This is the data type representing the configuration of containerd.

@table @asis

@item @code{containerd} (default: @code{containerd})
The containerd daemon package to use.

@item @code{debug?} (Vorgabe: @code{#f})
Ausgaben zur Fehlersuche an- oder abschalten.

@item @code{environment-variables} (Vorgabe: @code{'()})
Liste Umgebungsvariabler, mit denen @command{containerd} gestartet wird.

Hier muss eine Liste von Zeichenketten angegeben werden, die jeweils der
Form @samp{@var{Schlüssel}=@var{Wert}} genügen wie in diesem Beispiel:

@lisp
(list "HTTP_PROXY=socks5://127.0.0.1:9150"
      "HTTPS_PROXY=socks5://127.0.0.1:9150")
@end lisp

@end table
@end deftp

@defvar docker-service-type

Dies ist der Diensttyp des Dienstes, um @url{https://www.docker.com,Docker}
auszuführen, einen Daemon, der Anwendungsbündel in „Containern“, d.h.@:
isolierten Umgebungen, ausführen kann.

The @code{containerd-service-type} service need to be added to a system
configuration, otherwise a message about not any service provides
@code{containerd} will be displayed during @code{guix system reconfigure}.

@end defvar

@deftp {Datentyp} docker-configuration
Dies ist der Datentyp, der die Konfiguration von Docker und Containerd
repräsentiert.

@table @asis

@item @code{docker} (Vorgabe: @code{docker})
Das Docker-Daemon-Paket, was benutzt werden soll.

@item @code{docker-cli} (Vorgabe: @code{docker-cli})
Das Docker-Client-Paket, was benutzt werden soll.

@item @code{containerd} (Vorgabe: @var{containerd})
This field is deprecated in favor of @code{containerd-service-type} service.

@item @code{proxy} (Vorgabe: @var{docker-libnetwork-cmd-proxy})
Das Paket des mit Benutzerrechten (im „User-Land“) ausgeführten
Docker-Netzwerkproxys, das verwendet werden soll.

@item @code{enable-proxy?} (Vorgabe: @code{#t})
Den mit Benutzerrechten (im „User-Land“) ausgeführten Docker-Netzwerkproxy
an- oder abschalten.

@item @code{debug?} (Vorgabe: @code{#f})
Ausgaben zur Fehlersuche an- oder abschalten.

@item @code{enable-iptables?} (Vorgabe: @code{#t})
Das Hinzufügen von iptables-Regeln durch Docker an- oder abschalten.

@item @code{environment-variables} (Vorgabe: @code{'()})
Liste Umgebungsvariabler, mit denen @command{dockerd} gestartet wird.

Hier muss eine Liste von Zeichenketten angegeben werden, die jeweils der
Form @samp{@var{Schlüssel}=@var{Wert}} genügen wie in diesem Beispiel:

@lisp
(list "LANGUAGE=eo:ca:eu"
      "TMPDIR=/tmp/dockerd")
@end lisp

@item @code{config-file} (Typ: Vielleicht-dateiartig)
Eine JSON-Konfigurationsdatei, die @command{dockerd} mitgegeben wird.

@end table
@end deftp

@cindex Singularity, Dienst für Anwendungsbündel/Container
@defvar singularity-service-type
Dies ist der Diensttyp für den Dienst, mit dem Sie
@url{https://www.sylabs.io/singularity/, Singularity} ausführen können, ein
Docker-ähnliches Werkzeug, um Anwendungsbündel (auch bekannt als
„Container“) auszuführen. Der Wert für diesen Dienst ist das
Singularity-Paket, das benutzt werden soll.

Der Dienst installiert keinen Daemon, sondern er installiert Hilfsprogramme
als setuid-root (siehe @ref{Privilegierte Programme}), damit auch
„unprivilegierte“ Nutzer ohne besondere Berechtigungen @command{singularity
run} und ähnliche Befehle ausführen können.
@end defvar

@cindex Rootless Podman
@subsubheading Rootless Podman Service

@cindex rootless podman, container management tool
@cindex podman, rootless
@cindex container management, podman
The @code{(gnu services containers)} module provides the following service.


@defvar rootless-podman-service-type
This is the service type for @url{https://podman.io, Podman} is a container
management tool.

In addition to providing a drop-in replacement for Docker, Podman offers the
ability to run containers in ``root-less'' mode, meaning that regular users
can deploy containers without elevated privileges.  It does so mainly by
leveraging two Linux kernel features: unprivileged user namespaces, and
subordinate user and group IDs (@pxref{subordinate-user-group-ids, the
subordinate user and group ID service}).

The @code{rootless-podman-service-type} sets up the system to allow
unprivileged users to run @command{podman} commands:

@lisp
(use-service-modules containers dbus desktop networking @dots{})
(use-modules (gnu system accounts))  ;for 'subid-range'

(operating-system
  ;; @dots{}
  (users (cons (user-account
                (name "alice")
                (comment "Bob's sister")
                (group "users")

                ;; Adding the account to the "cgroup" group
                ;; makes it possible to run podman commands.
                (supplementary-groups '("cgroup" "wheel"
                                        "audio" "video")))
               %base-user-accounts))
  (services
    (cons* (service dbus-root-service-type)
           (service dhcpcd-service-type)
           (service elogind-service-type)
           (service iptables-service-type)
           (service rootless-podman-service-type
                    (rootless-podman-configuration
                      (subgids
                       (list (subid-range (name "alice"))))
                      (subuids
                       (list (subid-range (name "alice"))))))
           %base-services)))
@end lisp

The @code{iptables-service-type} is required for Podman to be able to setup
its own networks.  Due to the change in user groups and file systems it is
recommended to reboot (or at least logout), before trying to run Podman
commands.

To test your installation you can run:

@example
$ podman run -it --rm docker.io/alpine cat /etc/*release*
NAME="Alpine Linux"
ID=alpine
VERSION_ID=3.20.2
PRETTY_NAME="Alpine Linux v3.20"
HOME_URL="https://alpinelinux.org/"
BUG_REPORT_URL="https://gitlab.alpinelinux.org/alpine/aports/-/issues"
@end example

@end defvar

@c %start of fragment

@deftp {Data Type} rootless-podman-configuration
Available @code{rootless-podman-configuration} fields are:

@table @asis
@item @code{podman} (default: @code{podman}) (type: package-or-#f)
The Podman package that will be installed in the system profile.  Pass
@code{#f} to not install Podman.

@item @code{group-name} (default: @code{"cgroup"}) (type: string)
The name of the group that will own /sys/fs/cgroup resources.  Users that
want to use rootless Podman have to be in this group.

@item @code{containers-registries} (type: lowerable)
A string or a gexp evaluating to the path of Podman's
@code{containers/registries.conf} configuration file.

@item @code{containers-storage} (type: lowerable)
A string or a gexp evaluating to the path of Podman's
@code{containers/storage.conf} configuration file.

@item @code{containers-policy} (type: lowerable)
A string or a gexp evaluating to the path of Podman's
@code{containers/policy.json} configuration file.

@item @code{pam-limits} (type: list-of-pam-limits-entries)
The PAM limits to be set for rootless Podman.

@item @code{subgids} (default: @code{()}) (type: list-of-subid-ranges)
A list of subid ranges representing the subgids that will be available for
each configured user.

@item @code{subuids} (default: @code{()}) (type: list-of-subid-ranges)
A list of subid ranges representing the subuids that will be available for
each configured user.

@end table

@end deftp


@c %end of fragment

@cindex OCI-gestützt, Shepherd-Dienste
@subsubheading OCI-gestützte Dienste

Should you wish to manage your @acronym{Open Container Initiative, OCI}
containers with the same consistent interface you use for your other
Shepherd services, @var{oci-service-type} is the tool to use: given an OCI
container image, it will run it in a Shepherd service.  One example where
this is useful: it lets you run services that are available as OCI images
but not yet packaged for Guix.

@defvar oci-service-type

This is a thin wrapper around Docker's or Podman's CLI that executes OCI
images backed processes as Shepherd Services.

@lisp
(simple-service 'oci-provisioning
                oci-service-type
                (oci-extension
                  (networks
                    (list
                      (oci-network-configuration (name "monitoring"))))
                  (containers
                   (list
                    (oci-container-configuration
                     (network "monitoring")
                     (image
                      (oci-image
                        (repository "guile")
                        (tag "3")
                        (value (specifications->manifest '("guile")))
                        (pack-options '(#:symlinks (("/bin/guile" -> "bin/guile"))
                                        #:max-layers 2))))
                     (entrypoint "/bin/guile")
                     (command
                      '("-c" "(display \"hello!\n\")")))
                    (oci-container-configuration
                      (image "prom/prometheus")
                      (network "host")
                      (ports
                       '(("9000" . "9000")
                         ("9090" . "9090"))))
                    (oci-container-configuration
                      (image "grafana/grafana:10.0.1")
                      (network "host")
                      (volumes
                       '("/var/lib/grafana:/var/lib/grafana")))))))
@end lisp

In this example three different Shepherd services are going to be added to
the system.  Each @code{oci-container-configuration} record translates to a
@samp{docker run} or @samp{podman run} invocation and its fields directly
map to options.  You can refer to the
@url{https://docs.docker.com/engine/reference/commandline/run,Docker} or
@url{https://docs.podman.io/en/stable/markdown/podman-run.1.html,Podman}
upstream documentation for semantics of each value.  If the images are not
found, they will be pulled.  You can refer to the
@url{https://docs.docker.com/engine/reference/commandline/pull/,Docker} or
@url{https://docs.podman.io/en/stable/markdown/podman-pull.1.html,Podman}
upstream documentation for semantics.  The services with @code{(network
"host")} are going to be attached to the host network and are supposed to
behave like native processes with regard to networking.

@end defvar

@c %start of fragment

@deftp {Data Type} oci-configuration
Available @code{oci-configuration} fields are:

@table @asis
@item @code{runtime} (default: @code{'docker}) (type: symbol)
The OCI runtime to use to run commands.  It can be either @code{'docker} or
@code{'podman}.

@item @code{runtime-cli} (type: maybe-package-or-string)
The OCI runtime command line to be installed in the system profile and used
to provision OCI resources, it can be either a package or a string
representing an absolute file name to the runtime binary entrypoint.  When
unset it will default to @code{docker-cli} package for the @code{'docker}
runtime or to @code{podman} package for the @code{'podman} runtime.

@item @code{runtime-extra-arguments} (default: @code{'()}) (type: list)
A list of strings, gexps or file-like objects that will be placed after each
@command{docker} or @command{podman} invokation.

@item @code{user} (Typ: Vielleicht-Zeichenkette)
The user name under whose authority OCI commands will be run.  This field
will override the @code{user} field of @code{oci-configuration}.

@item @code{group} (type: maybe-string)
The group name under whose authority OCI commands will be run.  When using
the @code{'podman} OCI runtime, this field will be ignored and the default
group of the user configured in the @code{user} field will be used.  This
field will override the @code{group} field of @code{oci-configuration}.

@item @code{subuids-range} (type: maybe-subid-range)
An optional @code{subid-range} record allocating subuids for the user from
the @code{user} field.  When unset, with the rootless Podman OCI runtime, it
defaults to @code{(subid-range (name "oci-container"))}.

@item @code{subgids-range} (type: maybe-subid-range)
An optional @code{subid-range} record allocating subgids for the user from
the @code{user} field.  When unset, with the rootless Podman OCI runtime, it
defaults to @code{(subid-range (name "oci-container"))}.

@item @code{containers} (default: @code{'()}) (type: list-of-oci-containers)
The list of @code{oci-container-configuration} records representing the
containers to provision.  The use of the @code{oci-extension} record should
be preferred for most cases.

@item @code{networks} (default: @code{'()}) (type: list-of-oci-networks)
The list of @code{oci-network-configuration} records representing the
containers to provision.  The use of the @code{oci-extension} record should
be preferred for most cases.

@item @code{volumes} (default: @code{'()}) (type: list-of-oci-volumes)
The list of @code{oci-volumes-configuration} records representing the
containers to provision.  The use of the @code{oci-extension} record should
be preferred for most cases.

@item @code{verbose?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
When true, additional output will be printed, allowing to better follow the
flow of execution.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} oci-extension
Available @code{oci-extension} fields are:

@table @asis
@item @code{containers} (default: @code{'()}) (type: list-of-oci-containers)
The list of @code{oci-container-configuration} records representing the
containers to provision.

@item @code{networks} (default: @code{'()}) (type: list-of-oci-networks)
The list of @code{oci-network-configuration} records representing the
containers to provision.

@item @code{volumes} (default: @code{'()}) (type: list-of-oci-volumes)
The list of @code{oci-volumes-configuration} records representing the
containers to provision.

@end table

@end deftp


@c %end of fragment


@c %start of fragment

@deftp {Datentyp} oci-container-configuration
Verfügbare @code{oci-container-configuration}-Felder sind:

@table @asis
@item @code{user} (Vorgabe: @code{"oci-container"}) (Typ: Zeichenkette)
Mit den Berechtigungen welches Benutzerkontos die Docker-Befehle ausgeführt
werden.

@item @code{group} (Vorgabe: @code{"docker"}) (Typ: Zeichenkette)
Mit den Berechtigungen welcher Benutzergruppe die Docker-Befehle ausgeführt
werden.

@item @code{command} (Vorgabe: @code{'()}) (Typ: Liste-von-Zeichenketten)
Den voreingestellten Befehl (@code{CMD}) im Image ändern.

@item @code{entrypoint} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Den voreingestellten Einsprungpunkt (@code{ENTRYPOINT}) im Image ändern.

@item @code{host-environment} (Vorgabe: @code{'()}) (Typ: Liste)
Set environment variables in the host environment where @samp{docker run} or
@samp{podman run} are invoked.  This is especially useful to pass secrets
from the host to the container without having them on the OCI runtime
command line, for example: by setting the @code{MYSQL_PASSWORD} on the host
and by passing @code{--env MYSQL_PASSWORD} through the
@code{extra-arguments} field, it is possible to securely set values in the
container environment.  This field's value can be a list of pairs or
strings, even mixed:

@lisp
(list '("LANGUAGE" . "eo:ca:eu")
      "JAVA_HOME=/opt/java")
@end lisp

Pair members can be strings, gexps or file-like objects. Strings are passed
directly to @code{make-forkexec-constructor}.

@item @code{environment} (Vorgabe: @code{'()}) (Typ: Liste)
Set environment variables inside the container.  This can be a list of pairs
or strings, even mixed:

@lisp
(list '("LANGUAGE" . "eo:ca:eu")
      "JAVA_HOME=/opt/java")
@end lisp

Pair members can be strings, gexps or file-like objects. Strings are passed
directly to the OCI runtime CLI.  You can refer to the
@url{https://docs.docker.com/engine/reference/commandline/run/#env,Docker}
or
@url{https://docs.podman.io/en/stable/markdown/podman-run.1.html#env-e-env,Podman}
upstream documentation for semantics.

@item @code{image} (type: string-or-oci-image)
The image used to build the container.  It can be a string or an
@code{oci-image} record.  Strings are resolved by the OCI runtime, and
follow the usual format @code{myregistry.local:5000/testing/test-image:tag}.

@item @code{provision} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Der Name des Shepherd-Dienstes, der bereitgestellt wird.

@item @code{requirement} (default: @code{'()}) (type: list-of-symbols)
Set additional Shepherd services dependencies to the provisioned Shepherd
service.

@item @code{log-file} (Typ: Vielleicht-Zeichenkette)
When @code{log-file} is set, it names the file to which the service's
standard output and standard error are redirected.  @code{log-file} is
created if it does not exist, otherwise it is appended to.

@item @code{auto-start?} (default: @code{#t}) (type: boolean)
Whether this service should be started automatically by the Shepherd.  If it
is @code{#f}, the service has to be started manually with @command{herd
start}.

@item @code{respawn?} (default: @code{#f}) (type: boolean)
Ob der Dienst durch Shepherd neu gestartet werden soll, nachdem er gestoppt
wurde, zum Beispiel wenn der ihm zu Grunde liegende Prozess terminiert wird.

@item @code{shepherd-actions} (default: @code{'()}) (type: list-of-shepherd-actions)
This is a list of @code{shepherd-action} records defining actions supported
by the service.

@item @code{network} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Set an OCI network for the spawned container.

@item @code{ports} (Vorgabe: @code{'()}) (Typ: Liste)
Welcher Port oder Bereich von Ports im gestarteten Container zugänglich sein
sollen.  Geben Sie dazu eine Liste von Paaren oder von Zeichenketten an,
gerne auch gemischt:

@lisp
(list '("8080" . "80")
      "10443:443")
@end lisp

Pair members can be strings, gexps or file-like objects. Strings are passed
directly to the OCI runtime CLI.  You can refer to the
@url{https://docs.docker.com/engine/reference/commandline/run/#publish,Docker}
or
@url{https://docs.podman.io/en/stable/markdown/podman-run.1.html#publish-p-ip-hostport-containerport-protocol,Podman}
upstream documentation for semantics.

@item @code{volumes} (Vorgabe: @code{'()}) (Typ: Liste)
Welche Datenträgerzuordnungen („volume mappings“) im gestarteten Container
sein sollen. Geben Sie dazu eine Liste von Paaren oder von Zeichenketten an,
gerne auch gemischt:

@lisp
(list '("/root/data/grafana" . "/var/lib/grafana")
      "/gnu/store:/gnu/store")
@end lisp

Pair members can be strings, gexps or file-like objects. Strings are passed
directly to the OCI runtime CLI.  You can refer to the
@url{https://docs.docker.com/engine/reference/commandline/run/#volume,Docker}
or
@url{https://docs.podman.io/en/stable/markdown/podman-run.1.html#volume-v-source-volume-host-dir-container-dir-options,Podman}
upstream documentation for semantics.

@item @code{container-user} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Set the current user inside the spawned container.  You can refer to the
@url{https://docs.docker.com/engine/reference/run/#user,Docker} or
@url{https://docs.podman.io/en/stable/markdown/podman-run.1.html#user-u-user-group,Podman}
upstream documentation for semantics.

@item @code{workdir} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Set the current working directory for the spawned Shepherd service.  You can
refer to the
@url{https://docs.docker.com/engine/reference/run/#workdir,Docker} or
@url{https://docs.podman.io/en/stable/markdown/podman-run.1.html#workdir-w-dir,Podman}
upstream documentation for semantics.

@item @code{extra-arguments} (default: @code{'()}) (type: list)
A list of strings, gexps or file-like objects that will be directly passed
to the @samp{docker run} or @samp{podman run} invokation.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} oci-network-configuration
Available @code{oci-network-configuration} fields are:

@table @asis
@item @code{name} (Typ: Zeichenkette)
The name of the OCI network to provision.

@item @code{driver} (type: maybe-string)
The driver to manage the network.

@item @code{gateway} (type: maybe-string)
IPv4 or IPv6 gateway for the subnet.

@item @code{internal?} (default: @code{#f}) (type: boolean)
Restrict external access to the network

@item @code{ip-range} (type: maybe-string)
Allocate container ip from a sub-range in CIDR format.

@item @code{ipam-driver} (type: maybe-string)
IP Address Management Driver.

@item @code{ipv6?} (default: @code{#f}) (type: boolean)
Enable IPv6 networking.

@item @code{subnet} (type: maybe-string)
Subnet in CIDR format that represents a network segment.

@item @code{labels} (default: @code{'()}) (type: list)
The list of labels that will be used to tag the current volume.

@item @code{extra-arguments} (default: @code{'()}) (type: list)
A list of strings, gexps or file-like objects that will be directly passed
to the @samp{docker network create} or @samp{podman network create}
invokation.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} oci-volume-configuration
Available @code{oci-volume-configuration} fields are:

@table @asis
@item @code{name} (Typ: Zeichenkette)
The name of the OCI volume to provision.

@item @code{labels} (default: @code{'()}) (type: list)
The list of labels that will be used to tag the current volume.

@item @code{extra-arguments} (default: @code{'()}) (type: list)
A list of strings, gexps or file-like objects that will be directly passed
to the @samp{docker volume create} or @samp{podman volume create}
invokation.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} oci-image
Available @code{oci-image} fields are:

@table @asis
@item @code{repository} (type: string)
A string like @code{myregistry.local:5000/testing/test-image} that names the
OCI image.

@item @code{tag} (default: @code{"latest"}) (type: string)
A string representing the OCI image tag.  Defaults to @code{latest}.

@item @code{value} (type: oci-lowerable-image)
A @code{manifest} or @code{operating-system} record that will be lowered
into an OCI compatible tarball.  Otherwise this field's value can be a
file-like object that evaluates to an OCI compatible tarball.

@item @code{pack-options} (default: @code{'()}) (type: list)
An optional set of keyword arguments that will be passed to the
@code{docker-image} procedure from @code{guix scripts pack}.  They can be
used to replicate @command{guix pack} behavior:

@lisp
(oci-image
  (repository "guile")
  (tag "3")
  (value
    (specifications->manifest '("guile")))
  (pack-options '(#:symlinks (("/bin/guile" -> "bin/guile"))
                  #:max-layers 2)))
@end lisp

If the @code{value} field is an @code{operating-system} record, this field's
value will be ignored.

@item @code{system} (default: @code{""}) (type: string)
Attempt to build for a given system, e.g.@: "i686-linux"

@item @code{target} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Attempt to cross-build for a given triple, e.g.@: "aarch64-linux-gnu"

@item @code{grafts?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Whether to allow grafting or not in the pack build.

@end table

@end deftp


@c %end of fragment

@anchor{subordinate-user-group-ids}
@cindex subordinate user and group IDs
@cindex subid, subordinate user and group IDs
@subsubheading Subordinate User and Group ID Service

Among the virtualization facilities implemented by the Linux kernel is the
concept of @dfn{subordinate IDs}.  Subordinate IDs allow for mapping user
and group IDs inside process namespaces to user and group IDs of the host
system.  Subordinate user ID ranges (subuids) allow users to map virtual
user IDs inside containers to the user ID of an unprivileged user of the
host system.  Subordinate group ID ranges (subgids), instead map virtual
group IDs to the group ID of an unprivileged user on the host system.  You
can access @code{subuid(5)} and @code{subgid(5)} Linux man pages for more
details.

The @code{(gnu system shadow)} module exposes the
@code{subids-service-type}, its configuration record
@code{subids-configuration} and its extension record
@code{subids-extension}.

With @code{subids-service-type}, subuids and subgids ranges can be reserved
for users that desire so:

@lisp
(use-modules (gnu system shadow)     ;for 'subids-service-type'
             (gnu system accounts)   ;for 'subid-range'
             @dots{})

(operating-system
  ;; @dots{}
  (services
    (list
      (simple-service 'alice-bob-subids
                      subids-service-type
                      (subids-extension
                        (subgids
                         (list
                          (subid-range (name "alice"))))
                        (subuids
                         (list
                          (subid-range (name "alice"))
                          (subid-range (name "bob")
                                       (start 100700)))))))))
@end lisp

Users (definitely other services), usually, are supposed to extend the
service instead of adding subids directly to @code{subids-configuration},
unless the want to change the default behavior for root.  With default
settings the @code{subids-service-type} adds, if it's not already there, a
configuration for the root account to both @file{/etc/subuid} and
@file{/etc/subgid}, possibly starting at the minimum possible subid.
Otherwise the root subuids and subgids ranges are fitted wherever possible.

The above configuration will yield the following:

@example
# cat /etc/subgid
root:100000:65536
alice:165536:65536
# cat /etc/subuid
root:100000:700
bob:100700:65536
alice:166236:65536
@end example

@c %start of fragment

@deftp {Data Type} subids-configuration

With default settings the @code{subids-service-type} adds, if it's not
already there, a configuration for the root account to both
@file{/etc/subuid} and @file{/etc/subgid}, possibly starting at the minimum
possible subid.  To disable the default behavior and provide your own
definition for the root subid ranges you can set to @code{#f} the
@code{add-root?} field:

@lisp
(use-modules (gnu system shadow)     ;for 'subids-service-type'
             (gnu system accounts)   ;for 'subid-range'
             @dots{})

(operating-system
  ;; @dots{}
  (services
    (list
      (service subids-service-type
               (subids-configuration
                (add-root? #f)
                (subgids
                  (subid-range (name "root")
                               (start 120000)
                               (count 100)))
                (subuids
                  (subid-range (name "root")
                               (start 120000)
                               (count 100)))))
      (simple-service 'alice-bob-subids
                      subids-service-type
                      (subids-extension
                        (subgids
                         (list
                          (subid-range (name "alice"))))
                        (subuids
                         (list
                          (subid-range (name "alice"))
                          (subid-range (name "bob")
                                       (start 100700)))))))))
@end lisp

Available @code{subids-configuration} fields are:

@table @asis
@item @code{add-root?} (default: @code{#t}) (type: boolean)
Whether to automatically configure subuids and subgids for root.

@item @code{subgids} (default: @code{'()}) (type: list-of-subid-ranges)
The list of @code{subid-range}s that will be serialized to
@code{/etc/subgid}.  If a range doesn't specify a start it will be fitted
based on its number of requested subids.  If a range doesn't specify a count
the default size of 65536 will be assumed.

@item @code{subuids} (default: @code{'()}) (type: list-of-subid-ranges)
The list of @code{subid-range}s that will be serialized to
@code{/etc/subuid}.  If a range doesn't specify a start it will be fitted
based on its number of requested subids.  If a range doesn't specify a count
the default size of 65536 will be assumed.

@end table

@end deftp

@c %end of fragment

@c %start of fragment

@deftp {Data Type} subids-extension

Available @code{subids-extension} fields are:

@table @asis

@item @code{subgids} (default: @code{'()}) (type: list-of-subid-ranges)
The list of @code{subid-range}s that will be appended to
@code{subids-configuration-subgids}.  Entries with the same name are
deduplicated upon merging.

@item @code{subuids} (default: @code{'()}) (type: list-of-subid-ranges)
The list of @code{subid-range}s that will be appended to
@code{subids-configuration-subuids}.  Entries with the same name are
deduplicated upon merging.

@end table

@end deftp

@c %end of fragment

@c %start of fragment

@deftp {Data Type} subid-range

The @code{subid-range} record is defined at @code{(gnu system accounts)}.
Available fields are:

@table @asis

@item @code{name} (Typ: Zeichenkette)
The name of the user or group that will own this range.

@item @code{start} (default: @code{#f}) (type: integer)
The first requested subid.  When false the first available subid with enough
contiguous subids will be assigned.

@item @code{count} (default: @code{#f}) (type: integer)
The number of total allocated subids.  When #f the default of 65536 will be
assumed .

@end table

@end deftp

@c %end of fragment

@cindex Audit
@subsubheading Auditd-Dienst

Das Modul @code{(gnu services auditd)} stellt den folgenden Dienst zur
Verfügung.

@defvar auditd-service-type

Dies ist der Diensttyp des Dienstes, mit dem
@url{https://people.redhat.com/sgrubb/audit/,auditd} ausgeführt wird, ein
Daemon, der sicherheitsrelevante Informationen auf Ihrem System sammelt.

Beispiele für Dinge, über die Informationen gesammelt werden sollen:

@enumerate
@item
Dateizugriffe
@item
Betriebssystemaufrufe („System Calls“)
@item
Aufgerufene Befehle
@item
Fehlgeschlagene Anmeldeversuche
@item
Filterung durch die Firewall
@item
Netzwerkzugriff
@end enumerate

@command{auditctl} aus dem @code{audit}-Paket kann benutzt werden, um zu
überwachende Ereignisse (bis zum nächsten Neustart) hinzuzufügen oder zu
entfernen. Um über Ereignisse dauerhaft Informationen sammeln zu lassen,
schreiben Sie die Befehlszeilenargumente für auditctl in eine Datei namens
@file{audit.rules} im Verzeichnis für Konfigurationen (siehe
unten). @command{aureport} aus dem @code{audit}-Paket kann benutzt werden,
um einen Bericht über alle aufgezeichneten Ereignisse anzuzeigen. Nach
Vorgabe speichert der Audit-Daemon Protokolle in die Datei
@file{/var/log/audit.log}.

@end defvar

@deftp {Datentyp} auditd-configuration
Dies ist der Datentyp, der die Konfiguration von auditd repräsentiert.

@table @asis

@item @code{audit} (Vorgabe: @code{audit})
Das zu verwendende audit-Paket.

@item @code{configuration-directory} (Vorgabe: @code{%default-auditd-configuration-directory})
Das Verzeichnis mit der Konfigurationsdatei für das audit-Paket. Sie muss
den Namen @code{auditd.conf} tragen und optional kann sie ein paar
Audit-Regeln enthalten, die beim Start instanziiert werden sollen.

@end table
@end deftp

@cindex rshiny
@subsubheading R-Shiny-Dienst

Das Modul @code{(gnu services science)} stellt den folgenden Dienst bereit.

@defvar rshiny-service-type

Dies ist der Diensttyp eines Dienstes, um eine mit @code{r-shiny} erzeugte
Web-Anwendung („Webapp“) auszuführen. Dieser Dienst legt die
Umgebungsvariable @env{R_LIBS_USER} fest und führt das eingestellte Skript
aus, um @code{runApp} aufzurufen.

@deftp {Datentyp} rshiny-configuration
Dies ist der Datentyp, der die Konfiguration von rshiny repräsentiert.

@table @asis

@item @code{package} (Vorgabe: @code{r-shiny})
Das zu benutzende Paket.

@item @code{binary} (Vorgabe: @code{"rshiny"})
Der Name der Binärdatei oder des Shell-Skripts, das sich in
@code{Paket/bin/} befindet und beim Starten des Dienstes ausgeführt werden
soll.

Die übliche Art, diese Datei erzeugen zu lassen, ist folgende:

@lisp
…
(let* ((out       (assoc-ref %outputs "out"))
       (targetdir (string-append out "/share/" ,name))
       (app       (string-append out "/bin/" ,name))
       (Rbin      (search-input-file %build-inputs "/bin/Rscript")))
  ;; …
  (mkdir-p (string-append out "/bin"))
  (call-with-output-file app
    (lambda (port)
      (format port
"#!~a
library(shiny)
setwd(\"~a\")
runApp(launch.browser=0, port=4202)~%\n"
      Rbin targetdir))))
@end lisp

@end table
@end deftp
@end defvar

@cindex Nix
@subsubheading Nix-Dienst

Das Modul @code{(gnu services nix)} stellt den folgenden Dienst zur
Verfügung:

@defvar nix-service-type

Dies ist der Diensttyp für den Dienst, der den Erstellungs-Daemon der
@url{https://nixos.org/nix/, Nix-Paketverwaltung} ausführt. Hier ist ein
Beispiel, wie man ihn benutzt:

@lisp
(use-modules (gnu))
(use-service-modules nix)
(use-package-modules package-management)

(operating-system
  ;; …
  (packages (append (list nix)
                    %base-packages))

  (services (append (list (service nix-service-type))
                    %base-services)))
@end lisp

Nach @command{guix system reconfigure} können Sie Nix für Ihr Benutzerkonto
konfigurieren:

@itemize
@item Fügen Sie einen Nix-Kanal ein und aktualisieren Sie ihn. Siehe
@url{https://wiki.nixos.org/wiki/Nix_channels, Nix channels} für eine
Übersicht, welche Kanäle es gibt. Wenn Sie den Nix-Kanal „unstable“ nutzen
möchten, führen Sie dazu das aus:

@example
$ nix-channel --add https://nixos.org/channels/nixpkgs-unstable
$ nix-channel --update
@end example

@item Erstellen Sie das Verzeichnis mit Ihrem Nix-Profil:

@example
$ sudo mkdir -p /nix/var/nix/profiles/per-user/$USER
$ sudo chown $USER:root /nix/var/nix/profiles/per-user/$USER
@end example

@item Erzeugen Sie eine symbolische Verknüpfung zu Ihrem Profil und aktivieren Sie das Nix-Profil:

@example
$ ln -s "/nix/var/nix/profiles/per-user/$USER/profile" ~/.nix-profile
$ source /run/current-system/profile/etc/profile.d/nix.sh
@end example

@end itemize

@end defvar

@deftp {Datentyp} nix-configuration
Dieser Datentyp repräsentiert die Konfiguration des Nix-Daemons.

@table @asis
@item @code{nix} (Vorgabe: @code{nix})
Das zu verwendende Nix-Paket.

@item @code{sandbox} (Vorgabe: @code{#t})
Gibt an, ob Erstellungen nach Voreinstellung in einer isolierten Umgebung
(„Sandbox“) durchgeführt werden sollen.

@item @code{build-directory} (Vorgabe: @code{"/tmp"})
In welchem Verzeichnis die Verzeichnisbäume zu Erstellungen untergebracht
werden. Dies zu ändern, ist dann sinnvoll, wenn zum Beispiel der vorgegebene
Ort @emph{nicht} genügend Speicherplatz für die Verzeichnisbäume großer
Pakete bereitstellt.

Dies entspricht einer Änderung der Umgebungsvariablen @env{TMPDIR} des
@command{guix-daemon}. Siehe @ref{Einrichten der Erstellungsumgebung, @env{TMPDIR}} für
weitere Informationen.

@item @code{build-sandbox-items} (Vorgabe: @code{'()})
Dies ist eine Liste von Zeichenketten oder Objekten, die an das
@code{build-sandbox-items}-Feld der Konfigurationsdatei angehängt werden.

@item @code{extra-config} (Vorgabe: @code{'()})
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.

@item @code{extra-options} (Vorgabe: @code{'()})
Zusätzliche Befehlszeilenoptionen für @code{nix-service-type}.
@end table
@end deftp

@cindex Fail2Ban
@subsubheading Fail2Ban-Dienst

Durch @uref{http://www.fail2ban.org/, @code{fail2ban}} werden
Protokolldateien durchgesehen (wie @code{/var/log/apache/error_log}) und
diejenigen IP-Adressen ausgesperrt, die bösartig erscheinen@tie{}– also
mehrfach ein falsches Passwort probieren, nach Sicherheitslücken suchen und
Ähnliches.

Der Diensttyp @code{fail2ban-service-type} wird durch das Modul @code{(gnu
services security)} verfügbar gemacht.

Mit dem Diensttyp wird der @code{fail2ban}-Daemon ausgeführt. Sie können ihn
auf unterschiedliche Weise konfigurieren, nämlich:

@table @asis
@item Grundlegende Konfiguration
Die Grundeinstellungen für den Fail2Ban-Dienst können Sie über seine
@code{fail2ban}-Konfiguration bestimmen. Ihre Dokumentation finden Sie
unten.

@item Vom Nutzer festgelegte Jail-Erweiterungen
Mit der Funktion @code{fail2ban-jail-service} können neue Fail2Ban-Jails
hinzugefügt werden.

@item Erweiterungen für Shepherd-Dienste
Entwickler von Diensten können den Dienst mit dem Typ
@code{fail2ban-service-type} über den üblichen Mechanismus zur
Diensterweiterung erweitern.
@end table

@defvar fail2ban-service-type

Dies ist der Diensttyp für einen Dienst, der den @command{fail2ban}-Daemon
ausführt. Hier folgt ein Beispiel für eine grundlegende, explizite
Konfiguration.

@lisp
(append
 (list
  (service fail2ban-service-type
           (fail2ban-configuration
            (extra-jails
             (list
              (fail2ban-jail-configuration
               (name "sshd")
               (enabled? #t))))))
  ;; Es besteht keine implizite Abhängigkeit von einem wirklichen
  ;; SSH-Dienst, also müssen Sie ihn zusätzlich hinschreiben.
  (service openssh-service-type))
 %base-services)
@end lisp
@end defvar

@deffn {Prozedur} fail2ban-jail-service Diensttyp Jail
Den @var{Diensttyp}, ein @code{<service-type>}-Objekt, mit @var{Jail}
ausstatten, einem Objekt vom Typ @code{fail2ban-jail-configuration}.

Zum Beispiel:

@lisp
(append
 (list
  (service
   ;; Durch die Prozedur 'fail2ban-jail-service' kann jeglicher Diensttyp
   ;; mit einem fail2ban-Jail versehen werden. So müssen die Dienste
   ;; nicht explizit im fail2ban-service-type aufgeführt werden.
   (fail2ban-jail-service
    openssh-service-type
    (fail2ban-jail-configuration
     (name "sshd")
     (enabled? #t)))
   (openssh-configuration …))))
@end lisp
@end deffn

Nun folgt die Referenz der Verbundstypen zur Konfiguration des
@code{jail-service-type}.

@c The documentation is to be auto-generated via
@c 'generate-documentation'.  See at the bottom of (gnu services
@c security).

@deftp {Datentyp} fail2ban-configuration
Verfügbare @code{fail2ban-configuration}-Felder sind:

@table @asis
@item @code{fail2ban} (Vorgabe: @code{fail2ban}) (Typ: „package“)
Welches @code{fail2ban}-Paket benutzt werden soll. Es stellt sowohl die
Binärdateien als auch die Voreinstellungen für die Konfiguration bereit, die
mit @code{<fail2ban-jail-configuration>}-Objekten erweitert werden soll.

@item @code{run-directory} (Vorgabe: @code{"/var/run/fail2ban"}) (Typ: Zeichenkette)
Das Zustandsverzeichnis für den @code{fail2ban}-Daemon.

@item @code{jails} (Vorgabe: @code{'()}) (Typ: Liste-von-„fail2ban-jail-configuration“)
@code{<fail2ban-jail-configuration>}-Instanzen, die sich aus
Diensterweiterungen ergeben.

@item @code{extra-jails} (Vorgabe: @code{'()}) (Typ: Liste-von-„fail2ban-jail-configuration“)
@code{<fail2ban-jail-configuration>}-Instanzen, die explizit angegeben
werden.

@item @code{extra-content} (Vorgabe: @code{'()}) (Typ: Konfigurationstexte)
Zusätzlicher „roher Inhalt“, der ans Ende der Datei @file{jail.local}
angefügt wird. Geben Sie ihn als Liste von dateiartigen Objekten an.

@end table

@end deftp

@deftp {Datentyp} fail2ban-ignore-cache-configuration
Verfügbare @code{fail2ban-ignore-cache-configuration}-Felder sind:

@table @asis
@item @code{key} (Typ: Zeichenkette)
Schlüssel, für den zwischengespeichert wird.

@item @code{max-count} (Typ: Ganze-Zahl)
Für welche Größe zwischengespeichert wird.

@item @code{max-time} (Typ: Zeichenkette)
Wie lange die Zwischenspeicherung anhält.

@end table

@end deftp

@deftp {Datentyp} fail2ban-jail-action-configuration
Verfügbare @code{fail2ban-jail-action-configuration}-Felder sind:

@table @asis
@item @code{name} (Typ: Zeichenkette)
Name der Aktion.

@item @code{arguments} (Vorgabe: @code{'()}) (Typ: Liste-von-Argumenten)
Argumente der Aktion.

@end table

@end deftp

@deftp {Datentyp} fail2ban-jail-configuration
Verfügbare @code{fail2ban-jail-configuration}-Felder sind:

@table @asis
@item @code{name} (Typ: Zeichenkette)
Verpflichtend der Name dieser Jail-Konfiguration.

@item @code{enabled?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Gibt an, ob dieses Jail aktiviert ist.

@item @code{backend} (Typ: Vielleicht-Symbol)
Mit welchem Hintergrundprogramm Änderungen am @code{log-path} erkannt werden
sollen. Voreingestellt ist 'auto. Um die Voreinstellungen zu der
Jail-Konfiguration einzusehen, siehe die Datei
@file{/etc/fail2ban/jail.conf} des @code{fail2ban}-Pakets.

@item @code{max-retry} (Typ: Vielleicht-Ganze-Zahl)
Wie oft Fehler erkannt werden müssen, bevor ein Rechner gesperrt wird (etwa
@code{(max-retry 5)}).

@item @code{max-matches} (Typ: Vielleicht-Ganze-Zahl)
Wie viele Treffer je Ticket höchstens gespeichert werden sollen (in Aktionen
kann man dies mit @code{<matches>} verwenden).

@item @code{find-time} (Typ: Vielleicht-Zeichenkette)
In welchem Zeitfenster die Höchstzahl an Neuversuchen festgestellt werden
muss, damit eine IP-Adresse gesperrt wird. Ein Rechner wird gesperrt, wenn
er @code{max-retry} während der letzten @code{find-time} Sekunden erreicht
hat (z.B.@: @code{(find-time "10m")}). Es kann in Sekunden angegeben werden
oder im Zeitkurzformat von Fail2Ban (das „time abbreviation format“, das in
@command{man 5 jail.conf} beschrieben ist).

@item @code{ban-time} (Typ: Vielleicht-Zeichenkette)
Die Dauer einer Sperre, in Sekunden oder besagtem Zeitkurzformat. (Etwa
@code{(ban-time "10m")}.)

@item @code{ban-time-increment?} (Typ: Vielleicht-Boolescher-Ausdruck)
Ob vorherige Sperren einen Einfluss auf berechnete Steigerungen der
Sperrzeit einer bestimmten IP-Adresse haben sollen.

@item @code{ban-time-factor} (Typ: Vielleicht-Zeichenkette)
Der auf die Sperrzeit angerechnete Koeffizient für eine exponentiell
zunehmende Sperrzeit.

@item @code{ban-time-formula} (Typ: Vielleicht-Zeichenkette)
Mit dieser Formel wird der nächste Wert einer Sperrzeit berechnet.

@item @code{ban-time-multipliers} (Typ: Vielleicht-Zeichenkette)
Hiermit wird der nächste Wert einer Sperrzeit berechnet und die Formel
ignoriert.

@item @code{ban-time-max-time} (Typ: Vielleicht-Zeichenkette)
Wie viele Sekunden jemand längstens gesperrt wird.

@item @code{ban-time-rnd-time} (Typ: Vielleicht-Zeichenkette)
Wie viele Sekunden höchstens zufällig auf die Sperrzeit angerechnet
werden. So können ausgefuchste Botnetze @emph{nicht} genau ausrechnen, wann
eine IP-Adresse wieder entsperrt sein wird.

@item @code{ban-time-overall-jails?} (Typ: Vielleicht-Boolescher-Ausdruck)
Wenn dies wahr ist, wird festgelegt, dass nach einer IP-Adresse in der
Datenbank aller Jails gesucht wird. Andernfalls wird nur das aktuelle Jail
beachtet.

@item @code{ignore-self?} (Typ: Vielleicht-Boolescher-Ausdruck)
Niemals die eigene IP-Adresse der lokalen Maschine bannen.

@item @code{ignore-ip} (Vorgabe: @code{'()}) (Typ: Liste-von-Zeichenketten)
Eine Liste von IP-Adressen, CIDR-Masken oder DNS-Rechnernamen, die ignoriert
werden. @code{fail2ban} wird keinen Rechner bannen, der zu einer Adresse auf
dieser Liste gehört.

@item @code{ignore-cache} (Typ: Vielleicht-„fail2ban-ignore-cache-configuration“)
Machen Sie Angaben zum Zwischenspeicher, mit dem mehrfache Auffälligkeiten
ignoriert werden können.

@item @code{filter} (Typ: Vielleicht-„fail2ban-jail-filter-configuration“)
Der Filter, der für das Jail gilt, als
@code{<fail2ban-jail-filter-configuration>}-Objekt. Nach Voreinstellung
entsprechen die Namen der Jails ihren Filternamen.

@item @code{log-time-zone} (Typ: Vielleicht-Zeichenkette)
Die Voreinstellung für die Zeitzone, wenn eine Zeile im Protokoll keine
nennt.

@item @code{log-encoding} (Typ: Vielleicht-Symbol)
In welcher Kodierung die Protokolldateien abgelegt sind, um die sich das
Jail kümmert. Mögliche Werte sind @code{'ascii}, @code{'utf-8} und
@code{'auto}.

@item @code{log-path} (Vorgabe: @code{'()}) (Typ: Liste-von-Zeichenketten)
Die Dateinamen der Protokolldateien, die beobachtet werden.

@item @code{action} (Vorgabe: @code{'()}) (Typ: Liste-von-„fail2ban-jail-action“)
Eine Liste von @code{<fail2ban-jail-action-configuration>}.

@item @code{extra-content} (Vorgabe: @code{'()}) (Typ: Konfigurationstexte)
Zusätzlicher Inhalt für die Jail-Konfiguration. Geben Sie ihn als Liste von
dateiartigen Objekten an.

@end table

@end deftp

@deftp {Datentyp} fail2ban-jail-filter-configuration
Verfügbare @code{fail2ban-jail-filter-configuration}-Felder sind:

@table @asis
@item @code{name} (Typ: Zeichenkette)
Filter, der benutzt werden soll.

@item @code{mode} (Typ: Vielleicht-Zeichenkette)
In welchem Modus der Filter stehen soll.

@end table

@end deftp

@c End of auto-generated fail2ban documentation.

@cindex resize-file-system
@subsubheading Größenanpassungsdienst für Dateisysteme

Mit diesem Diensttyp können Sie ein aktives Dateisystem beim Hochfahren
vergrößern. Das bietet sich an, wenn Sie ein Guix-Abbild auf eine SD-Karte
(z.B.@: für ein eingebettetes Gerät) schreiben oder es auf einen VPS
hochladen. In beiden Fällen ist das Medium, auf das das Abbild kommt, oft
größer als das anzulegende Abbild.

Bei einem eingebetteten Gerät, das von einer SD-Karte startet, schreiben Sie
etwas wie hier:
@lisp
(service resize-file-system-service-type
         (resize-file-system-configuration
          (file-system
           (file-system (device (file-system-label "root"))
                        (type "ext4")))))
@end lisp

@quotation Warnung
Seien Sie besonders vorsichtig, dass Sie das richtige Gerät und seinen Typ
angeben. Der Dienst ist nicht auf Fehlerbehandlung ausgelegt und ruft
entsprechend Programme auf. Wenn Sie ihn falsch benutzen, könnten Daten
verloren gehen oder das Betriebssystem beschädigt werden.
@end quotation

Partitionen und Dateisysteme werden auf die maximal verfügbare Größe
ausgedehnt. Dateisysteme können nur wachsen, wenn sie sich auf der letzten
Partition eines Geräts befinden und noch freier Platz verfügbar ist.

Dieser Dienst unterstützt die Dateisysteme ext2, ext3, ext4, btrfs und
bcachefs.

@table @asis

@item @code{file-system} (Typ: file-system)
Das Dateisystem-Objekt, das vergrößert werden soll (siehe @ref{Dateisysteme}). In dem Objekt müssen die Felder @code{device} und @code{type}
gesetzt sein. Andere Felder werden ignoriert.

@item @code{cloud-utils} (Vorgabe: @code{cloud-utils}) (Typ: dateiartig)
Welches @code{cloud-utils}-Paket benutzt werden soll. Aus diesem Paket wird
der @code{growpart}-Befehl benutzt.

@item @code{e2fsprogs} (Vorgabe: @code{e2fsprogs}) (Typ: dateiartig)
Welches e2fsprogs-Paket benutzt werden soll, um ext2-, ext3- und
ext4-Dateisysteme zu vergrößern.

@item @code{btrfs-progs} (Vorgabe: @code{btrfs-progs}) (Typ: dateiartig)
Welches btrfs-progs-Paket benutzt werden soll, um ein btrfs-Dateisystem zu
vergrößern.

@item @code{bcachefs-tools} (Vorgabe: @code{bcachefs-tools}) (Typ: dateiartig)
Welches bcachefs-tools-Paket benutzt werden soll, um ein
bcachefs-Dateisystem zu vergrößern.

@end table

@cindex Backup
@subsubheading Backup-Dienste

The @code{(gnu services backup)} module offers services for backing up file
system trees.  For now, it provides the @code{restic-backup-service-type}.

With @code{restic-backup-service-type}, you can periodically back up
directories and files with @uref{https://restic.net/, Restic}, which
supports end-to-end encryption and deduplication.  Consider the following
configuration:

@lisp
(use-service-modules backup @dots{}) ;for 'restic-backup-service-type'
(use-package-modules sync @dots{})   ;for 'rclone'

(operating-system
  ;; @dots{}
  (packages (append (list rclone)    ;for use by restic
                    %base-packages))
  (services
    (list
      (service restic-backup-service-type
               (restic-backup-configuration
                 (jobs
                   (list (restic-backup-job
                           (name "remote-ftp")
                           (repository "rclone:remote-ftp:backup/restic")
                           (password-file "/root/.restic")
                           ;; Every day at 23.
                           (schedule "0 23 * * *")
                           (files '("/root/.restic"
                                    "/root/.config/rclone"
                                    "/etc/ssh/ssh_host_rsa_key"
                                    "/etc/ssh/ssh_host_rsa_key.pub"
                                    "/etc/guix/signing-key.pub"
                                    "/etc/guix/signing-key.sec"))))))))))
@end lisp

Each @code{restic-backup-job} translates to a Shepherd timer which sets the
@env{RESTIC_PASSWORD} environment variable by reading the first line of
@code{password-file} and runs @command{restic backup}, creating backups
using rclone of all the files listed in the @code{files} field.

The @code{restic-backup-service-type} provides the ability to
instantaneously trigger a backup with the @code{trigger} Shepherd action:

@example
sudo herd trigger remote-ftp
@end example

@c %start of fragment

@deftp {Data Type} restic-backup-configuration
Available @code{restic-backup-configuration} fields are:

@table @asis
@item @code{jobs} (default: @code{'()}) (type: list-of-restic-backup-jobs)
The list of backup jobs for the current system.

@end table

@end deftp


@c %end of fragment

@c %start of fragment

@deftp {Data Type} restic-backup-job
Available @code{restic-backup-job} fields are:

@table @asis
@item @code{restic} (default: @code{restic}) (type: package)
The restic package to be used for the current job.

@item @code{user} (default: @code{"root"}) (type: string)
The user used for running the current job.

@item @code{group} (default: @code{"root"}) (type: string)
The group used for running the current job.

@item @code{log-file} (Typ: Vielleicht-Zeichenkette)
The file system path to the log file for this job.  By default the file will
have be @file{/var/log/restic-backup/@var{job-name}.log}, where
@var{job-name} is the name defined in the @code{name} field.  For Guix Home
services it defaults to
@file{$XDG_STATE_HOME/shepherd/restic-backup/@var{job-name}.log}.

@item @code{max-duration} (type: maybe-number)
The maximum duration in seconds that a job may last.  Past
@code{max-duration} seconds, the job is forcefully terminated.

@item @code{wait-for-termination?} (default: @code{#f}) (type: boolean)
Wait until the job has finished before considering executing it again;
otherwise, perform it strictly on every occurrence of event, at the risk of
having multiple instances running concurrently.

@item @code{repository} (type: string)
The restic repository target of this job.

@item @code{name} (Typ: Zeichenkette)
A string denoting a name for this job.

@item @code{password-file} (type: string)
Name of the password file, readable by the configured @code{user}, that will
be used to set the @env{RESTIC_PASSWORD} environment variable for the
current job.

@item @code{schedule} (type: gexp-or-string)
A string or a gexp representing the frequency of the backup.  Gexp must
evaluate to @code{calendar-event} records or to strings.  Strings must
contain Vixie cron date lines.

@item @code{requirement} (type: maybe-list-of-symbols)
The list of Shepherd services that this backup job depends upon.  When unset
it defaults to @code{'()}, for Guix Home.  Otherwise to
@code{'(user-processes file-systems)}.

@item @code{files} (default: @code{'()}) (type: list-of-lowerables)
The list of files or directories to be backed up.  It must be a list of
values that can be lowered to strings.

@item @code{verbose?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Whether to enable verbose output for the current backup job.

@item @code{extra-flags} (default: @code{'()}) (type: list-of-lowerables)
A list of values that are lowered to strings.  These will be passed as
command-line arguments to the current job @command{restic backup}
invocation.

@end table

@end deftp

@c %end of fragment

@cindex DLNA/UPnP
@subsubheading DLNA-/UPnP-Dienste

The @code{(gnu services upnp)} module offers services related to
@acronym{UPnP, Universal Plug and Play} and @acronym{DLNA, Digital Living
Network Alliance}, networking protocols that can be used for media streaming
and device interoperability within a local network.  For now, this module
provides the @code{readymedia-service-type}.

@uref{https://minidlna.sourceforge.net/, ReadyMedia} (formerly known as
MiniDLNA) is a DLNA/UPnP-AV media server.  The project's daemon,
@code{minidlnad}, can serve media files (audio, pictures, and video) to
DLNA/UPnP-AV clients available on the network.
@code{readymedia-service-type} is a Guix service that wraps around
ReadyMedia's @code{minidlnad}.

Consider the following configuration:
@lisp
(use-service-modules upnp @dots{})

(operating-system
  @dots{}
  (services
   (list (service readymedia-service-type
                  (readymedia-configuration
                   (media-directories
                    (list (readymedia-media-directory
                           (path "/media/audio")
                           (types '(A)))
                          (readymedia-media-directory
                           (path "/media/video")
                           (types '(V)))
                          (readymedia-media-directory
                           (path "/media/misc"))))
                   (extra-config '(("notify_interval" . "60")))))
         @dots{})))
@end lisp

This sets up the ReadyMedia daemon to serve files from the media folders
specified in @code{media-directories}.  The @code{media-directories} field
is mandatory.  All other fields (such as network ports and the server name)
come with a predefined default and can be omitted.

@quotation Anmerkung
Dieser Dienst ist auch mit Guix Home erhältlich, wo er einfach mit Ihren
Benutzerrechten ausgeführt wird (siehe @ref{Verschiedene Persönliche Dienste,
@code{home-readymedia-service-type}}).
@end quotation

@c %start of fragment

@deftp {Data Type} readymedia-configuration
Available @code{readymedia-configuration} fields are:

@table @asis
@item @code{readymedia} (default: @code{readymedia}) (type: package)
Das ReadyMedia-Paket, was für den Dienst benutzt werden soll.

@item @code{friendly-name} (default: @code{#f}) (type: maybe-string)
A custom name that will be displayed on connected clients.

@item @code{media-directories} (type: list)
The list of media folders to serve content from.  Each item is a
@code{readymedia-media-directory}.

@item @code{cache-directory} (default: @code{"/var/cache/readymedia"}) (type: string)
A folder for ReadyMedia's cache files.  If not existing already, the folder
will be created as part of the service activation and the ReadyMedia user
will be assigned ownership.

@item @code{log-directory} (default: @code{"/var/log/readymedia"}) (type: string)
A folder for ReadyMedia's log files.  If not existing already, the folder
will be created as part of the service activation and the ReadyMedia user
will be assigned ownership.

@item @code{port} (default: @code{#f}) (type: maybe-integer)
A custom port that the service will be listening on.

@item @code{extra-config} (default: @code{'()}) (type: alist)
An association list of further options, as accepted by ReadyMedia.
@end table

@end deftp

@c %end of fragment

@c %start of fragment

@deftp {Data Type} readymedia-media-directory
A @code{media-directories} entry includes a folder @code{path} and,
optionally, the @code{types} of media files included within the folder.

@table @asis
@item @code{path} (type: string)
The media folder location.

@item @code{types} (default: @code{'()}) (type: list)
A list indicating the types of file included in the media folder.  Valid
values are combinations of individual media types, i.e. symbol @code{A} for
audio, @code{P} for pictures, @code{V} for video.  An empty list means that
no type is specified.
@end table

@end deftp

@c %end of fragment

@node Privilegierte Programme
@section Privilegierte Programme

@cindex privilegierte Programme
@cindex setuid-Programme
@cindex setgid-Programme
@cindex capabilities, POSIX
@cindex setcap
Manche Programme müssen mit erhöhten Berechtigungen ausgeführt werden,
selbst wenn Nutzer ohne besondere Berechtigungen sie starten. Ein bekanntes
Beispiel ist das Programm @command{passwd}, womit Nutzer ihr Passwort ändern
können, wozu das Programm auf die Dateien @file{/etc/passwd} und
@file{/etc/shadow} zugreifen muss@tie{}– was normalerweise nur der
„root“-Nutzer darf, aus offensichtlichen Gründen der
Informationssicherheit. Deswegen sollte @command{passwd} @dfn{setuid-root}
sein, d.h.@: es läuft immer mit den Administratorrechten des root-Nutzers,
egal wer sie startet (siehe @ref{How Change Persona,,, libc,
Referenzhandbuch der GNU-C-Bibliothek} für mehr Informationen über den
setuid-Mechanismus).

Der Store selbst kann @emph{keine} privilegierten Programme enthalten: Das
wäre eine Sicherheitslücke, weil dann jeder Nutzer auf dem System
Ableitungen schreiben könnte, die in den Store solche Dateien einfügen
würden (siehe @ref{Der Store}). Wir benutzen also einen anderen Mechanismus:
Statt auf den ausführbaren Dateien im Store selbst die Berechtigungen
festzulegen, lassen wir den Systemadministrator @emph{deklarieren}, welchen
Programmen diese zusätzlichen Berechtigungen gewährt werden.

Das Feld @code{privileged-programs} einer
@code{operating-system}-Deklaration enthält eine Liste von
@code{<privileged-program>}-Objekten, die die Namen der Programme angeben,
deren setuid- oder setgid-Bits gesetzt werden sollen (siehe @ref{Das Konfigurationssystem nutzen}). Zum Beispiel kann das Programm @command{mount.nfs},
was Teil des Pakets nfs-utils ist, so setuid-root werden:

@lisp
(privileged-program
  (program (file-append nfs-utils "/sbin/mount.nfs"))
  (setuid? #t))
@end lisp

Um @command{mount.nfs} also mit setuid auszuführen, tragen Sie das vorige
Beispiel in Ihre Betriebssystemdeklaration ein, indem Sie es an
@code{%default-privileged-programs} anhängen wie hier:

@lisp
(operating-system
  ;; Davor stehen andere Felder …
  (privileged-programs
    (append (list (privileged-program
                    (program (file-append nfs-utils "/sbin/mount.nfs"))
                    (setuid? #t)))
            %default-privileged-programs)))
@end lisp

@deftp {Datentyp} privileged-program
Dieser Datentyp steht für ein Programm, bei dem besondere Berechtigungen wie
setuid gesetzt werden sollen.

@table @asis
@item @code{program}
Ein dateiartiges Objekt, für das alle angegebenen Berechtigungen gelten
sollen.

@item @code{setuid?} (Vorgabe: @code{#f})
Ob das setuid-Bit für den Benutzer gesetzt werden soll.

@item @code{setgid?} (Vorgabe: @code{#f})
Ob das setgid-Bit für die Benutzergruppe gesetzt werden soll.

@item @code{user} (Vorgabe: @code{0})
Benutzeridentifikator (UID, als ganze Zahl) oder Benutzername (als
Zeichenkette) des Benutzers, dem das Programm gehören soll, nach Vorgabe der
Administratornutzer root.

@item @code{group} (Vorgabe: @code{0})
GID (als ganze Zahl) oder Gruppenname (als Zeichenkette) der Benutzergruppe,
der das Programm gehört, nach Vorgabe die Benutzergruppe root.

@item @code{capabilities} (Vorgabe: @code{#f})
A string representing the program's POSIX capabilities, as described by the
@code{cap_to_text(3)} man page from the libcap package, or @code{#f} to make
no changes.

@end table
@end deftp

Eine vorgegebene Menge von privilegierten Programmen wird durch die Variable
@code{%default-privileged-programs} aus dem Modul @code{(gnu system)}
definiert.

@defvar {Scheme-Variable} %default-privileged-programs
Eine Liste von @code{<privileged-program>}-Objekten, die übliche Programme
angeben, die besonders berechtigt sein müssen.

Die Liste enthält Befehle wie @command{passwd}, @command{ping}, @command{su}
und @command{sudo}.
@end defvar

Intern erzeugt Guix die eigentlichen privilegierten Programme im Verzeichnis
@file{/run/privileged/bin}, wenn das System aktiviert wird. Die Dateien in
diesem Verzeichnis verweisen auf die „echten“ Binärdateien im Store.

@node X.509-Zertifikate
@section X.509-Zertifikate

@cindex HTTPS, Zertifikate
@cindex X.509-Zertifikate
@cindex TLS
Über HTTPS verfügbare Webserver (also HTTP mit gesicherter Transportschicht,
englisch „Transport-Layer Security“, kurz TLS) senden Client-Programmen ein
@dfn{X.509-Zertifikat}, mit dem der Client den Server dann
@emph{authentifizieren} kann. Dazu verifiziert der Client, dass das
Zertifikat des Servers von einer sogenannten Zertifizierungsstelle signiert
wurde (@dfn{Certificate Authority}, kurz CA). Damit er aber die Signatur der
Zertifizierungsstelle verifizieren kann, muss jeder Client das Zertifikat
der Zertifizierungsstelle besitzen.

Web-Browser wie GNU@tie{}IceCat liefern ihre eigenen CA-Zertifikate mit,
damit sie von Haus aus Zertifikate verifizieren können.

Den meisten anderen Programmen, die HTTPS sprechen können@tie{}–
@command{wget}, @command{git}, @command{w3m} etc.@:@tie{}– muss allerdings
erst mitgeteilt werden, wo die CA-Zertifikate installiert sind.

@cindex @code{nss-certs}
Wenn Sie Guix System benutzen, müssen Sie dazu ein Paket, das Zertifikate
enthält, in das @code{packages}-Feld der @code{operating-system}-Deklaration
des Betriebssystems hinzufügen (siehe @ref{„operating-system“-Referenz}). Guix liefert ein solches Paket mit, @code{nss-certs}, was als
Teil von Mozillas „Network Security Services“ angeboten wird.

Das Paket gehört zu den @code{%base-packages}, Sie müssen es also
@emph{nicht} ausdrücklich hinzufügen. Das Verzeichnis @file{/etc/ssl/certs},
wo die meisten Anwendungen und Bibliotheken ihren Voreinstellungen
entsprechend nach Zertifikaten suchen, verweist auf die global installierten
Zertifikate.

Unprivilegierte Benutzer, wie die, die Guix auf einer Fremddistribution
benutzen, können sich auch lokal ihre eigenen Pakete mit Zertifikaten in ihr
Profil installieren. Eine Reihe von Umgebungsvariablen muss dazu definiert
werden, damit Anwendungen und Bibliotheken wissen, wo diese Zertifikate zu
finden sind. Und zwar folgt die OpenSSL-Bibliothek den Umgebungsvariablen
@env{SSL_CERT_DIR} und @env{SSL_CERT_FILE}, manche Anwendungen benutzen
stattdessen aber ihre eigenen Umgebungsvariablen. Das Versionskontrollsystem
Git liest den Ort zum Beispiel aus der Umgebungsvariablen
@env{GIT_SSL_CAINFO} aus. Sie würden typischerweise also so etwas ausführen:

@example
guix install nss-certs
export SSL_CERT_DIR="$HOME/.guix-profile/etc/ssl/certs"
export SSL_CERT_FILE="$HOME/.guix-profile/etc/ssl/certs/ca-certificates.crt"
export GIT_SSL_CAINFO="$SSL_CERT_FILE"
@end example

Ein weiteres Beispiel ist R, was voraussetzt, dass die Umgebungsvariable
@env{CURL_CA_BUNDLE} auf ein Zertifikatsbündel verweist, weshalb Sie etwas
wie hier ausführen müssten:

@example
guix install nss-certs
export CURL_CA_BUNDLE="$HOME/.guix-profile/etc/ssl/certs/ca-certificates.crt"
@end example

Für andere Anwendungen möchten Sie die Namen der benötigten
Umgebungsvariablen vielleicht in deren Dokumentation nachschlagen.


@node Name Service Switch
@section Name Service Switch

@cindex Name Service Switch
@cindex NSS
Das Modul @code{(gnu system nss)} enthält Anbindungen für die Konfiguration
des @dfn{Name Service Switch} (NSS) der libc (siehe @ref{NSS Configuration
File,,, libc, Referenzhandbuch der GNU-C-Bibliothek}). Kurz gesagt ist der
NSS ein Mechanismus, mit dem die libc um neue „Namens“-Auflösungsmethoden
für Systemdatenbanken erweitert werden kann; dazu gehören Rechnernamen (auch
bekannt als „Host“-Namen), Dienstnamen, Benutzerkonten und mehr (siehe
@ref{Name Service Switch, Systemdatenbanken und der Name Service Switch,,
libc, Referenzhandbuch der GNU-C-Bibliothek}).

Die NSS-Konfiguration legt für jede Systemdatenbank fest, mit welcher
Methode der Name nachgeschlagen („aufgelöst“) werden kann und welche
Methoden zusammenhängen@tie{}– z.B.@: unter welchen Umständen der NSS es mit
der nächsten Methode auf seiner Liste versuchen sollte. Die
NSS-Konfiguration wird im Feld @code{name-service-switch} von
@code{operating-system}-Deklarationen angegeben (siehe @ref{„operating-system“-Referenz, @code{name-service-switch}}).

@cindex nss-mdns
@cindex .local, Rechnernamensauflösung
Zum Beispiel konfigurieren die folgenden Deklarationen den NSS so, dass er
das @uref{https://0pointer.de/lennart/projects/nss-mdns/,
@code{nss-mdns}-Backend} benutzt, wodurch er auf @code{.local} endende
Rechnernamen über Multicast-DNS (mDNS) auflöst:

@lisp
(name-service-switch
   (hosts (list %files    ;zuerst in /etc/hosts nachschlagen

                ;; Wenn das keinen Erfolg hatte, es
                ;; mit 'mdns_minimal' versuchen.
                (name-service
                  (name "mdns_minimal")

                  ;; 'mdns_minimal' ist die Autorität für
                  ;; '.local'. Gibt es not-found ("nicht
                  ;; gefunden") zurück, müssen wir die
                  ;; nächsten Methoden gar nicht erst
                  ;; versuchen.
                  (reaction (lookup-specification
                             (not-found => return))))

                ;; Ansonsten benutzen wir DNS.
                (name-service
                  (name "dns"))

                ;; Ein letzter Versuch mit dem
                ;; "vollständigen" 'mdns'.
                (name-service
                  (name "mdns")))))
@end lisp

Keine Sorge: Die Variable @code{%mdns-host-lookup-nss} (siehe unten) enthält
diese Konfiguration bereits. Statt das alles selst einzutippen, können Sie
sie benutzen, wenn alles, was Sie möchten, eine funktionierende
Namensauflösung für @code{.local}-Rechner ist.

Beachten Sie dabei, dass es zusätzlich zum Festlegen des
@code{name-service-switch} in der @code{operating-system}-Deklaration auch
erforderlich ist, den @code{avahi-service-type} zu benutzen (siehe
@ref{Netzwerkdienste, @code{avahi-service-type}}). Es genügt auch, wenn
Sie die @code{%desktop-services} benutzen, weil er darin enthalten ist
(siehe @ref{Desktop-Dienste}). Dadurch wird @code{nss-mdns} für den Name
Service Cache Daemon nutzbar (siehe @ref{Basisdienste,
@code{nscd-service}}).

Um sich eine lange Konfiguration zu ersparen, können Sie auch einfach die
folgenden Variablen für typische NSS-Konfigurationen benutzen.

@defvar %default-nss
Die vorgegebene Konfiguration des Name Service Switch als ein
@code{name-service-switch}-Objekt.
@end defvar

@defvar %mdns-host-lookup-nss
Die Name-Service-Switch-Konfiguration mit Unterstützung für
Rechnernamensauflösung über „Multicast DNS“ (mDNS) für auf @code{.local}
endende Rechnernamen.
@end defvar

Furthermore, mDNS lookups could be restricted to IPv4 or IPv6 protocols
using the procedure @code{mdns-host-lookup-nss}.

@deffn {Procedure} mdns-host-lookup-nss @
       [#:ipv6? #t] [#:ipv4? #t] Return a @code{name-service-switch} object with
mDNS lookup restricted to specified protocols.
@end deffn

Im Folgenden finden Sie eine Referenz, wie eine
Name-Service-Switch-Konfiguration aussehen muss. Sie hat eine direkte
Entsprechung zum Konfigurationsdateiformat der C-Bibliothek, lesen Sie
weitere Informationen also bitte im Handbuch der C-Bibliothek nach (siehe
@ref{NSS Configuration File,,, libc, Referenzhandbuch der
GNU-C-Bibliothek}). Gegenüber dem Konfigurationsdateiformat des libc-NSS
bekommen Sie mit unserer Syntax nicht nur ein warm umklammerndes Gefühl,
sondern auch eine statische Analyse: Wenn Sie Syntax- und Schreibfehler
machen, werden Sie darüber benachrichtigt, sobald Sie @command{guix system}
aufrufen.

@deftp {Datentyp} name-service-switch

Der Datentyp, der die Konfiguration des Name Service Switch (NSS) der libc
repräsentiert. Jedes im Folgenden aufgeführte Feld repräsentiert eine der
unterstützten Systemdatenbanken.

@table @code
@item aliases
@itemx ethers
@itemx group
@itemx gshadow
@itemx hosts
@itemx initgroups
@itemx netgroup
@itemx networks
@itemx password
@itemx public-key
@itemx rpc
@itemx services
@itemx shadow
Das sind die Systemdatenbanken, um die sich NSS kümmern kann. Jedes dieser
Felder muss eine Liste aus @code{<name-service>}-Objekten sein (siehe
unten).
@end table
@end deftp

@deftp {Datentyp} name-service

Der einen eigentlichen Namensdienst repräsentierende Datentyp zusammen mit
der zugehörigen Auflösungsaktion.

@table @code
@item name
Eine Zeichenkette, die den Namensdienst bezeichnet (siehe @ref{Services in
the NSS configuration,,, libc, Referenzhandbuch der GNU-C-Bibliothek}).

Beachten Sie, dass hier aufgeführte Namensdienste für den nscd sichtbar sein
müssen. Dazu übergeben Sie im Argument @code{#:name-services} des
@code{nscd-service} die Liste der Pakete, die die entsprechenden
Namensdienste anbieten (siehe @ref{Basisdienste, @code{nscd-service}}).

@item reaction
Eine mit Hilfe des Makros @code{lookup-specification} angegebene Aktion
(siehe @ref{Actions in the NSS configuration,,, libc, Referenzhandbuch der
GNU-C-Bibliothek}). Zum Beispiel:

@lisp
(lookup-specification (unavailable => continue)
                      (success => return))
@end lisp
@end table
@end deftp

@node Initiale RAM-Disk
@section Initiale RAM-Disk

@cindex initrd
@cindex initiale RAM-Disk
Um ihn zu initialisieren (zu „bootstrappen“), wird für den Kernel
Linux-Libre eine @dfn{initiale RAM-Disk} angegeben (kurz @dfn{initrd}). Eine
initrd enthält ein temporäres Wurzeldateisystem sowie ein Skript zur
Initialisierung. Letzteres ist dafür zuständig, das echte Wurzeldateisystem
einzubinden und alle Kernel-Module zu laden, die dafür nötig sein könnten.

Mit dem Feld @code{initrd-modules} einer @code{operating-system}-Deklaration
können Sie angeben, welche Kernel-Module für Linux-libre in der initrd
verfügbar sein müssen. Insbesondere müssen hier die Module aufgeführt
werden, um die Festplatte zu betreiben, auf der sich Ihre Wurzelpartition
befindet@tie{}– allerdings sollte der vorgegebene Wert der
@code{initrd-modules} in dem meisten Fällen genügen. Wenn Sie aber zum
Beispiel das Kernel-Modul @code{megaraid_sas} zusätzlich zu den vorgegebenen
Modulen brauchen, um auf Ihr Wurzeldateisystem zugreifen zu können, würden
Sie das so schreiben:

@lisp
(operating-system
  ;; …
  (initrd-modules (cons "megaraid_sas" %base-initrd-modules)))
@end lisp

@defvar %base-initrd-modules
Der Vorgabewert für die Liste der Kernel-Module, die in der initrd enthalten
sein sollen.
@end defvar

Wenn Sie noch systemnähere Anpassungen durchführen wollen, können Sie im
Feld @code{initrd} einer @code{operating-system}-Deklaration angeben, was
für eine Art von initrd Sie benutzen möchten. Das Modul @code{(gnu system
linux-initrd)} enthält drei Arten, eine initrd zu erstellen: die abstrakte
Prozedur @code{base-initrd} und die systemnahen Prozeduren @code{raw-initrd}
und @code{expression->initrd}.

Mit der Prozedur @code{base-initrd} sollten Sie die häufigsten
Anwendungszwecke abdecken können. Wenn Sie zum Beispiel ein paar
Kernel-Module zur Boot-Zeit laden lassen möchten, können Sie das
@code{initrd}-Feld auf diese Art definieren:

@lisp
(initrd (lambda (file-systems . rest)
          ;; Eine gewöhnliche initrd, aber das Netzwerk wird
          ;; mit den Parametern initialisiert, die QEMU
          ;; standardmäßig erwartet.
          (apply base-initrd file-systems
                 #:qemu-networking? #t
                 rest)))
@end lisp

Die Prozedur @code{base-initrd} kann auch mit üblichen Anwendungszwecken
umgehen, um das System als QEMU-Gastsystem zu betreiben oder als ein
„Live“-System ohne ein dauerhaft gespeichertes Wurzeldateisystem.

Die Prozedur @code{base-initrd} baut auf der Prozedur @code{raw-initrd}
auf. Anders als @code{base-initrd} hat @code{raw-initrd} keinerlei
Zusatzfunktionalitäten: Es wird kein Versuch unternommen, für die initrd
notwendige Kernel-Module und Pakete automatisch
hinzuzunehmen. @code{raw-initrd} kann zum Beispiel benutzt werden, wenn ein
Nutzer eine eigene Konfiguration des Linux-Kernels verwendet und die
Standard-Kernel-Module, die mit @code{base-initrd} hinzugenommen würden,
nicht verfügbar sind.

Die initiale RAM-Disk, wie sie von @code{base-initrd} oder @code{raw-initrd}
erzeugt wird, richtet sich nach verschiedenen Optionen, die auf der
Kernel-Befehlszeile übergeben werden (also über GRUBs @code{linux}-Befehl
oder die @code{-append}-Befehlszeilenoption von QEMU). Erwähnt werden
sollten:

@table @code
@item gnu.load=@var{boot}
Die initiale RAM-Disk eine Datei @var{boot}, in der ein Scheme-Programm
steht, laden lassen, nachdem das Wurzeldateisystem eingebunden wurde.

Guix übergibt mit dieser Befehlszeilenoption die Kontrolle an ein
Boot-Programm, das die Dienstaktivierungsprogramme ausführt und anschließend
den GNU@tie{}Shepherd startet, das Initialisierungssystem („init“-System)
von Guix System.

@item root=@var{Wurzel}
Das mit @var{Wurzel} bezeichnete Dateisystem als Wurzeldateisystem
einbinden. @var{Wurzel} kann ein Geratename wie @code{/dev/sda1}, eine
Dateisystembezeichnung (d.h.@: ein Dateisystem-„Label“) oder eine
Dateisystem-UUID sein. Wird nichts angegeben, wird der Gerätename aus dem
Wurzeldateisystem der Betriebssystemdeklaration benutzt.

@item rootfstype=@var{Typ}
Den Dateisystemtyp für das Wurzeldateisystem festlegen. Der angegebene Typ
hat Vorrang vor dem @code{type}-Feld, das für das Wurzeldateisystem in der
@code{operating-system}-Deklaration angegeben wurde, falls vorhanden.

@item rootflags=@var{Optionen}
Die Einbinde-Optionen („mount options“) für das Wurzeldateisystem
festlegen. Diese haben Vorrang vor dem @emph{options}-Feld, das für das
Wurzeldateisystem in der @code{operating-system}-Deklaration angegeben
wurde, falls vorhanden.

@item fsck.mode=@var{Modus}
Ob das mit @var{Wurzel} bezeichnete Dateisystem vor dem Einbinden auf Fehler
geprüft werden soll. Als @var{Modus} geben Sie entweder @code{skip} (nie
prüfen), @code{force} (immer prüfen) oder @code{auto} an. Bei @code{auto}
wird die @code{check?}-Einstellung des Dateisystemobjekts für @var{Wurzel}
verwendet (siehe @ref{Dateisysteme}) und eine Dateisystemüberprüfung nur
durchgeführt, wenn das Dateisystem nicht ordnungsgemäß heruntergefahren
wurde.

Die Voreinstellung ist @code{auto}, wenn diese Option nicht angegeben wird
oder @var{Modus} keinem der genannten Werte entspricht.

@item fsck.repair=@var{Stufe}
Die Stufe gibt an, wie erkannte Fehler im Wurzeldateisystem @var{Wurzel}
automatisch repariert werden sollen. @var{Stufe} darf @code{no} sein (nichts
an @var{Wurzel} ändern, wenn möglich), @code{yes} (so viele Fehler wie
möglich beheben) oder @code{preen}. Letzteres repariert solche Probleme, wo
die automatische Reparatur als unbedenklich eingeschätzt wird.

Wenn Sie diese Option weglassen oder als @var{Stufe} keine der genannten
angeben, wird als Voreinstellung so verfahren, als hätten Sie @code{preen}
angegeben.

@item gnu.system=@var{System}
@file{/run/booted-system} und @file{/run/current-system} auf das
@var{System} zeigen lassen.

@item modprobe.blacklist=@var{Module}…
@cindex Kernel-Module, Sperrliste
@cindex Sperrliste, von Kernel-Modulen
Die initiale RAM-Disk sowie den Befehl @command{modprobe} (aus dem
kmod-Paket) anweisen, das Laden der angegebenen @var{Module} zu
verweigern. Als @var{Module} muss eine kommagetrennte Liste von
Kernel-Modul-Namen angegeben werden@tie{}– z.B.@: @code{usbkbd,9pnet}.

@item gnu.repl
Eine Lese-Auswerten-Schreiben-Schleife (englisch „Read-Eval-Print Loop“,
kurz REPL) von der initialen RAM-Disk starten, bevor diese die Kernel-Module
zu laden versucht und das Wurzeldateisystem einbindet. Unsere
Marketingabteilung nennt das @dfn{boot-to-Guile}. Der Schemer in Ihnen wird
das lieben. Siehe @ref{Using Guile Interactively,,, guile, Referenzhandbuch
zu GNU Guile} für mehr Informationen über die REPL von Guile.

@end table

Jetzt wo Sie wissen, was für Funktionalitäten eine durch @code{base-initrd}
und @code{raw-initrd} erzeugte initiale RAM-Disk so haben kann, möchten Sie
vielleicht auch wissen, wie man sie benutzt und weiter anpasst:

@cindex initrd
@cindex initiale RAM-Disk
@deffn {Prozedur} raw-initrd Dateisysteme @
       [#:linux-modules '()] [#:pre-mount #t] [#:mapped-devices '()] @
[#:keyboard-layout #f] [#:helper-packages '()] @
[#:qemu-networking? #f] [#:volatile-root? #f]
Liefert eine Ableitung, die eine rohe („raw“) initrd
erstellt. @var{Dateisysteme} bezeichnet eine Liste von durch die initrd
einzubindenden Dateisystemen, unter Umständen zusätzlich zum auf der
Kernel-Befehlszeile mit @option{root} angegebenen
Wurzeldateisystem. @var{linux-modules} ist eine Liste von Kernel-Modulen,
die zur Boot-Zeit geladen werden sollen. @var{mapped-devices} ist eine Liste
von Gerätezuordnungen, die hergestellt sein müssen, bevor die unter
@var{file-systems} aufgeführten Dateisysteme eingebunden werden (siehe
@ref{Zugeordnete Geräte}). @var{pre-mount} ist ein G-Ausdruck, der vor
Inkrafttreten der @var{mapped-devices} ausgewertet
wird. @var{helper-packages} ist eine Liste von Paketen, die in die initrd
kopiert werden. Darunter kann @code{e2fsck/static} oder andere Pakete
aufgeführt werden, mit denen durch die initrd das Wurzeldateisystem auf
Fehler hin geprüft werden kann.

Ist es auf einen wahren Wert gesetzt, dann muss @var{keyboard-layout} eine
Tastaturbelegung als @code{<keyboard-layout>}-Verbundsobjekt angeben, die
die gewünschte Tastaturbelegung für die Konsole bezeichnet. Sie wird
verwendet, noch bevor die Gerätezuordnungen in @var{mapped-devices}
hergestellt werden und bevor die Dateisysteme in @var{file-systems}
eingebunden werden, damit der Anwender dabei die gewollte Tastaturbelegung
beim Eingeben einer Passphrase und bei der Nutzung einer REPL verwenden
kann.

When @var{qemu-networking?} is true, set up networking with the standard
QEMU parameters.

Wenn @var{volatile-root?} wahr ist, ist Schreiben auf das Wurzeldateisystem
möglich, aber Änderungen daran bleiben nicht erhalten.
@end deffn

@deffn {Prozedur} base-initrd Dateisysteme @
       [#:mapped-devices '()] [#:keyboard-layout #f] @
[#:qemu-networking? #f] [#:volatile-root? #f] @
[#:linux-modules '()]
Liefert eine allgemein anwendbare, generische initrd als dateiartiges Objekt
mit den Kernel-Modulen aus @var{linux}. Die @var{file-systems} sind eine
Liste von durch die initrd einzubindenden Dateisystemen, unter Umständen
zusätzlich zum Wurzeldateisystem, das auf der Kernel-Befehlszeile mit
@option{root} angegeben wurde. Die @var{mapped-devices} sind eine Liste von
Gerätezuordnungen, die hergestellt sein müssen, bevor die @var{file-systems}
eingebunden werden.

Ist es auf einen wahren Wert gesetzt, dann muss @var{keyboard-layout} eine
Tastaturbelegung als @code{<keyboard-layout>}-Verbundsobjekt angeben, die
die gewünschte Tastaturbelegung für die Konsole bezeichnet. Sie wird
verwendet, noch bevor die Gerätezuordnungen in @var{mapped-devices}
hergestellt werden und bevor die Dateisysteme in @var{file-systems}
eingebunden werden, damit der Anwender dabei die gewollte Tastaturbelegung
beim Eingeben einer Passphrase und bei der Nutzung einer REPL verwenden
kann.

@var{qemu-networking?} und @var{volatile-root?} verhalten sich wie bei
@code{raw-initrd}.

In die initrd werden automatisch alle Kernel-Module eingefügt, die für die
unter @var{file-systems} angegebenen Dateisysteme und die angegebenen
Optionen nötig sind. Zusätzliche Kernel-Module können unter den
@var{linux-modules} aufgeführt werden. Diese werden zur initrd hinzugefügt
und zur Boot-Zeit in der Reihenfolge geladen, in der sie angegeben wurden.
@end deffn

Selbstverständlich betten die hier erzeugten und benutzten initrds ein
statisch gebundenes Guile ein und das Initialisierungsprogramm ist ein
Guile-Programm. Dadurch haben wir viel Flexibilität. Die Prozedur
@code{expression->initrd} erstellt eine solche initrd für ein an sie
übergebenes Programm.

@deffn {Prozedur} expression->initrd G-Ausdruck @
       [#:guile %guile-static-initrd] [#:name "guile-initrd"]
Liefert eine Linux-initrd (d.h.@: ein gzip-komprimiertes cpio-Archiv) als
dateiartiges Objekt, in dem @var{guile} enthalten ist, womit der
@var{G-Ausdruck} nach dem Booten ausgewertet wird. Alle vom @var{G-Ausdruck}
referenzierten Ableitungen werden automatisch in die initrd kopiert.
@end deffn

@node Bootloader-Konfiguration
@section Bootloader-Konfiguration

@cindex bootloader
@cindex Bootloader

Das Betriebssystem unterstützt mehrere Bootloader. Der gewünschte Bootloader
wird mit der @code{bootloader-configuration}-Deklaration konfiguriert. Alle
Felder dieser Struktur sind für alle Bootloader gleich außer dem einen Feld
@code{bootloader}, das angibt, welcher Bootloader konfiguriert und
installiert werden soll.

Manche der Bootloader setzen nicht alle Felder einer
@code{bootloader-configuration} um. Zum Beispiel ignoriert der
extlinux-Bootloader das @code{theme}-Feld, weil er keine eigenen Themen
unterstützt.

@deftp {Datentyp} bootloader-configuration
Der Typ der Deklaration einer Bootloader-Konfiguration.

@table @asis

@item @code{bootloader}
@cindex EFI, Bootloader
@cindex UEFI, Bootloader
@cindex BIOS, Bootloader
Der zu benutzende Bootloader als ein @code{bootloader}-Objekt. Zurzeit
werden @code{grub-bootloader}, @code{grub-efi-bootloader},
@code{grub-efi-removable-bootloader}, @code{grub-efi-netboot-bootloader},
@code{grub-efi-netboot-removable-bootloader}, @code{extlinux-bootloader} und
@code{u-boot-bootloader} unterstützt.

@cindex ARM, Bootloader
@cindex AArch64, Bootloader
Verfügbare Bootloader werden in den Modulen @code{(gnu bootloader …)}
beschrieben. Insbesondere enthält @code{(gnu bootloader u-boot)}
Definitionen für eine Vielzahl von ARM- und AArch64-Systemen, die den
@uref{https://www.denx.de/wiki/U-Boot/, U-Boot-Bootloader} benutzen.

@vindex grub-bootloader
Mit @code{grub-bootloader} können Sie vor allem auf Intel-basierten
Maschinen im alten „Legacy“-BIOS-Modus booten.

@vindex grub-efi-bootloader
@code{grub-efi-bootloader} macht es möglich, auf modernen Systemen mit
@dfn{Unified Extensible Firmware Interface} (UEFI) zu booten. Sie sollten
das hier benutzen, wenn im Installationsabbild ein Verzeichnis
@file{/sys/firmware/efi} vorhanden ist, wenn Sie davon auf Ihrem System
booten.

@vindex grub-efi-removable-bootloader
Mit @code{grub-efi-removable-bootloader} lässt sich Ihr System von
Wechseldatenträgern aus starten. Er platziert die GRUB-Datei an dem
Standardort, der im UEFI-Standard für solche Fälle vorgesehen ist, nämlich
in @file{/EFI/BOOT/BOOTX64.efi} innerhalb des Boot-Verzeichnisses, was
meistens @file{/boot/efi} ist. @code{grub-efi-removable-bootloader} ist
außerdem geeignet, wenn Sie eine „vergessliche“ UEFI-Firmware haben, die es
@emph{nicht} schafft, ihre Konfiguration im dafür gedachten nicht flüchtigen
Speicher zu erhalten. Genau wie bei @code{grub-efi-bootloader} können Sie
@code{grub-efi-removable-bootloader} nur benutzen, wenn das Verzeichnis
@file{/sys/firmware/efi} verfügbar ist.

@quotation Anmerkung
@emph{Für jedes} andere Betriebssystem, das seine GRUB-Datei auch an diesem
Standardort aus dem UEFI-Standard hat, wird diese hierbei überschrieben und
das alte System kann @emph{nicht} mehr gebootet werden.
@end quotation

@vindex grub-efi-netboot-bootloader
Mit @code{grub-efi-netboot-bootloader} können Sie Ihr System @i{via} TFTP
über das Netzwerk booten. Zusammen mit einem über NFS eingebundenen
Wurzeldateisystem können Sie damit ein Guix-System ohne Plattenlaufwerk
einrichten.

Bei der Installation des @code{grub-efi-netboot-bootloader} wird der Inhalt
der bei @code{targets} angegebenen TFTP-Wurzelverzeichnisse erzeugt (siehe
@ref{Bootloader-Konfiguration, @code{targets}}), innerhalb eines
Unterverzeichnisses @file{efi/Guix}, so dass eines von einem TFTP-Server
bereitgestellt werden kann. Vielleicht möchten Sie dazu Ihre
TFTP-Serververzeichnisse zuvor als @code{targets} einbinden, damit die
benötigten Dateien während der Installation direkt auf den TFTP-Server
aufgespielt werden.

Wenn Sie außerdem vorhaben, ein NFS-Wurzeldateisystem zu benutzen
(eigentlich auch, wenn Sie bloß den Store von einer NFS-Freigabe laden
möchten), dann muss der TFTP-Server auch die Datei
@file{/boot/grub/grub.cfg} und die anderen Dateien vom Store zur Verfügung
stellen, etwa GRUBs Hintergrundbild, den Kernel (siehe
@ref{„operating-system“-Referenz, @code{kernel}}) und auch die initrd (siehe
@ref{„operating-system“-Referenz, @code{initrd}}). Auf all diese
Store-Dateien greift GRUB @i{via} TFTP über ihren normalen Store-Pfad zu,
z.B.@: über @file{tftp://tftp-server/gnu/store/…-initrd/initrd.cpio.gz}.

Um das möglich zu machen, erzeugt Guix zwei symbolische Verknüpfungen. Für
jedes Ziel im Feld @code{targets} ist die erste Verknüpfung
@samp{Ziel}@file{/efi/Guix/boot/grub/grub.cfg}, die auf
@file{../../../boot/grub/grub.cfg} zeigt, wobei das @samp{Ziel} dem Pfad
@file{/boot} entsprechen kann. In diesem Fall verlässt die Verknüpfung das
zugänglich gemachte TFTP-Wurzelverzeichnis @emph{nicht}, in den anderen
Fällen schon. Die zweite Verknüpfung ist @samp{Ziel}@file{/gnu/store} und
zeigt auf @file{../gnu/store}. Diese Verknüpfung verlässt das zugänglich
gemachte TFTP-Wurzelverzeichnis.

Die Annahme hinter all dem ist, dass Sie einen NFS-Server haben, der das
Wurzelverzeichnis für Ihr Guix-System exportiert, und außerdem einen
TFTP-Server haben, der die als @code{targets} angegebenen Verzeichnisse
liefert@tie{}– normalerweise ist das ein einzelnes Verzeichnis
@file{/boot}@tie{}–, was in demselben Wurzelverzeichnis Ihres Guix-Systems
gespeichert vorliegt. In dieser Konstellation werden die symbolischen
Verknüpfungen funktionieren.

Bei anderen Konstellationen werden Sie Ihre eigene
Bootloader-Installationsprozedur programmieren müssen, die sich darum
kümmert, die nötigen Dateien aus dem Store über TFTP zugänglich zu machen,
zum Beispiel, indem diese in das TFTP-Wurzeldateisystem unter jedem der
@code{targets} kopiert werden.

Es ist wichtig, anzumerken, dass symbolische Verknüpfungen nach außerhalb
des TFTP-Wurzelverzeichnisses vielleicht erst in der Konfiguration
zugelassen werden müssen. Außerdem wird durch die Store-Verknüpfung der
gesamte Store über TFTP offengelegt. Beides hat Auswirkungen auf die
Informationssicherheit, welche Sie bedenken sollten. Auch sollten Sie alle
Arten von TFTP-Schreibzugriff besser verbieten!

Beachten Sie: Mit diesem Bootloader werden @emph{keine} Änderungen am „UEFI
Boot Manager“ des Systems vorgenommen.

Abgesehen vom @code{grub-efi-netboot-bootloader} und den bereits erwähnten
TFTP- und NFS-Servern brauchen Sie auch einen passend eingerichteten
DHCP-Server, der das Booten über das Netzwerk möglich macht. Derzeit können
wir Ihnen bei all dem nur empfehlen, Anleitungen über die @acronym{PXE,
Preboot eXecution Environment} ausfindig zu machen.

Für den Fall, dass eine lokale EFI-Systempartition (ESP) oder eine ähnliche
Partition mit einem FAT-Dateisystem in @code{targets} eingebunden ist,
können symbolische Verknüpfungen dort @emph{nicht} erzeugt werden. In diesem
Fall wird alles bereitgestellt, um vom lokalen Speicher zu booten, als wäre
@code{grub-efi-bootloader} verwendet worden, mit dem Unterschied, dass
sämtliche GRUB-Binärdateien nach @code{targets} kopiert werden, so dass
Booten über das Netzwerk möglich ist.

@vindex grub-efi-netboot-removable-bootloader
@code{grub-efi-netboot-removable-bootloader} ist identisch mit
@code{grub-efi-netboot-bootloader}, außer dass das Unterverzeichnis
@file{efi/boot} statt @file{efi/Guix} benutzt wird, entsprechend dem
UEFI-Standard bei Wechseldatenträgern.

@quotation Anmerkung
@emph{Für jedes} andere Betriebssystem, das seine GRUB-Datei auch an diesem
Standardort aus dem UEFI-Standard hat, wird diese hierbei überschrieben und
das alte System kann @emph{nicht} mehr gebootet werden.
@end quotation

@item @code{targets}
Eine Liste von Zeichenketten, die angibt, auf welche Ziele der Bootloader
installiert werden soll.

Was @code{targets} bedeutet, hängt vom jeweiligen Bootloader ab. Für
@code{grub-bootloader} sollten hier zum Beispiel Gerätenamen angegeben
werden, die vom @command{installer}-Befehl des Bootloaders verstanden
werden, etwa @code{/dev/sda} oder @code{(hd0)} (siehe @ref{Invoking
grub-install,,, grub, GNU GRUB Manual}). Für @code{grub-efi-bootloader} und
@code{grub-efi-removable-bootloader} sollten die Einhängepunkte des
EFI-Dateisystems angegeben werden, in der Regel @file{/boot/efi}. Für
@code{grub-efi-netboot-bootloader} sollten @code{targets} der oder die
Einhängepunkte sein, unter denen das TFTP-Wurzelverzeichnis Ihres
TFTP-Servers erreichbar ist.

@item @code{menu-entries} (Vorgabe: @code{'()})
Eine möglicherweise leere Liste von @code{menu-entry}-Objekten (siehe
unten), die für Menüeinträge stehen, die im Bootloader-Menü auftauchen
sollen, zusätzlich zum aktuellen Systemeintrag und dem auf vorherige
Systemgenerationen verweisenden Eintrag.

@item @code{default-entry} (Vorgabe: @code{0})
Die Position des standardmäßig ausgewählten Bootmenü-Eintrags. An Position 0
steht der Eintrag der aktuellen Systemgeneration.

@item @code{timeout} (Vorgabe: @code{5})
Wie viele Sekunden lang im Menü auf eine Tastatureingabe gewartet wird,
bevor gebootet wird. 0 steht für sofortiges Booten, für -1 wird ohne
Zeitbeschränkung gewartet.

@cindex Tastaturbelegung, beim Bootloader
@item @code{keyboard-layout} (Vorgabe: @code{#f})
Wenn dies auf @code{#f} gesetzt ist, verwendet das Menü des Bootloaders
(falls vorhanden) die Vorgabe-Tastaturbelegung, normalerweise
US@tie{}English („qwerty“).

Andernfalls muss es ein @code{keyboard-layout}-Objekt sein (siehe
@ref{Tastaturbelegung}).

@quotation Anmerkung
Dieses Feld wird derzeit von Bootloadern außer @code{grub} und
@code{grub-efi} ignoriert.
@end quotation

@item @code{theme} (Vorgabe: @var{#f})
Ein Objekt für das im Bootloader anzuzeigende Thema. Wird kein Thema
angegeben, benutzen manche Bootloader vielleicht ein voreingestelltes Thema;
GRUB zumindest macht es so.

@item @code{terminal-outputs} (Vorgabe: @code{'(gfxterm)})
Die Ausgabeterminals, die für das Boot-Menü des Bootloaders benutzt werden,
als eine Liste von Symbolen. GRUB akzeptiert hier diese Werte:
@code{console}, @code{serial}, @code{serial_@{0–3@}}, @code{gfxterm},
@code{vga_text}, @code{mda_text}, @code{morse} und @code{pkmodem}. Dieses
Feld entspricht der GRUB-Variablen @code{GRUB_TERMINAL_OUTPUT} (siehe
@ref{Simple configuration,,, grub,Handbuch von GNU GRUB}).

@item @code{terminal-inputs} (Vorgabe: @code{'()})
Die Eingabeterminals, die für das Boot-Menü des Bootloaders benutzt werden,
als eine Liste von Symbolen. GRUB verwendet hier das zur Laufzeit bestimmte
Standardterminal. GRUB akzeptiert sonst diese Werte: @code{console},
@code{serial}, @code{serial_@{0-3@}}, @code{at_keyboard} und
@code{usb_keyboard}. Dieses Feld entspricht der GRUB-Variablen
@code{GRUB_TERMINAL_INPUT} (siehe @ref{Simple configuration,,, grub,Handbuch
von GNU GRUB}).

@item @code{serial-unit} (Vorgabe: @code{#f})
Die serielle Einheit, die der Bootloader benutzt, als eine ganze Zahl
zwischen 0 und 3, einschließlich. Für GRUB wird sie automatisch zur Laufzeit
ausgewählt; derzeit wählt GRUB die 0 aus, die COM1 entspricht (siehe
@ref{Serial terminal,,, grub,Handbuch von GNU GRUB}).

@item @code{serial-speed} (Vorgabe: @code{#f})
Die Geschwindigkeit der seriellen Schnittstelle als eine ganze Zahl. GRUB
bestimmt den Wert standardmäßig zur Laufzeit; derzeit wählt GRUB
9600@tie{}bps (siehe @ref{Serial terminal,,, grub,Handbuch von GNU GRUB}).

@item @code{device-tree-support?} (Vorgabe: @code{#t})
Ob das Laden von @uref{https://en.wikipedia.org/wiki/Devicetree,
Device-Tree-Dateien} durch Linux stattfinden soll.

Diese Option ist standardmäßig aktiviert. In manchen Fällen, z.B.@: wenn
durch den @code{u-boot}-Bootloader schon der Device Tree in den
Arbeitsspeicher geladen wird, kann es gewünscht sein, diese Option hier
abzuschalten, indem Sie sie auf @code{#f} setzen.

@item @code{extra-initrd} (Vorgabe: @code{#f})
Ein Dateiname einer weiteren initrd, die beim Booten geladen werden
soll. Sie kann im Store gespeichert sein, aber muss es nicht, und
hauptsächlich ist dieses Feld dafür gedacht, dass Sie Dateien mit
Geheimnissen außerhalb des Stores benutzen können.

In order to be able to provide decryption keys for LUKS devices, they need
to be available in the initial RAM disk.  However they cannot be stored
inside the usual initrd, since it is stored in the store and being
world-readable (as files in the store are) is not a desired property for an
initrd containing decryption keys.  You can therefore use this field to
instruct GRUB to also load a manually created initrd not stored in the
store.

Wenn Sie allerdings etwas tun möchten, was nichts mit Geheimnissen zu tun
hat, sind Sie mit einer normalen initrd besser bedient (siehe
@ref{„operating-system“-Referenz, @code{initrd}}).

Ein für diesen Zweck geeignetes Abbild können Sie zum Beispiel so anlegen:

@example
echo /key-file.bin | cpio -oH newc >/key-file.cpio
chmod 0000 /key-file.cpio
@end example

Nachdem Sie es angelegt haben, können Sie es so benutzen:

@lisp
;; Operating system with encrypted boot partition
(operating-system
  @dots{}
  (bootloader (bootloader-configuration
               (bootloader grub-efi-bootloader)
               (targets '("/boot/efi"))
               ;; Load the initrd with a key file...
               (extra-initrd "/key-file.cpio")))
  (mapped-devices
   (list (mapped-device
          (source (uuid "12345678-1234-1234-1234-123456789abc"))
          (target "my-root")
          (type luks-device-mapping)
          ;; ... and use it to unlock the root device.
          (arguments '(#:key-file "/key-file.bin"))))))
@end lisp

Passen Sie auf, wenn Sie diese Option einrichten, denn wenn die Datei, auf
die Sie verweisen, von GRUB nicht gelesen werden kann, wird GRUB nicht in
der Lage sein, das System zu booten, bis Sie die initrd-Zeile manuell mit
einem Texteditor aus dem GRUB-Menü wieder entfernen.

Derzeit kann es nur zusammen mit GRUB benutzt werden.
@end table

@end deftp

@cindex Dual-Boot
@cindex Bootmenü
Sollten Sie zusätzliche Bootmenü-Einträge über das oben beschriebene
@code{menu-entries}-Feld hinzufügen möchten, müssen Sie diese mit der
@code{menu-entry}-Form erzeugen. Stellen Sie sich zum Beispiel vor, Sie
wollten noch eine andere Distribution booten können (schwer vorstellbar!),
dann könnten Sie einen Menüeintrag wie den Folgenden definieren:

@lisp
(menu-entry
  (label "Die _andere_ Distribution")
  (linux "/boot/old/vmlinux-2.6.32")
  (linux-arguments '("root=/dev/sda2"))
  (initrd "/boot/old/initrd"))
@end lisp

Details finden Sie unten.

@deftp {Datentyp} menu-entry
Der Typ eines Eintrags im Bootloadermenü.

@table @asis

@item @code{label}
Die Beschriftung, die im Menü gezeigt werden soll@tie{}– z.B.@:
@code{"GNU"}.

@item @code{linux} (Vorgabe: @code{#f})
Das Linux-Kernel-Abbild, was gebootet werden soll, zum Beispiel:

@lisp
(file-append linux-libre "/bzImage")
@end lisp

Für GRUB kann hier auch ein Gerät ausdrücklich zum Dateipfad angegeben
werden, unter Verwendung von GRUBs Konventionen zur Gerätebenennung (siehe
@ref{Naming convention,,, grub, Handbuch von GNU GRUB}), zum Beispiel:

@example
"(hd0,msdos1)/boot/vmlinuz"
@end example

Wenn das Gerät auf diese Weise ausdrücklich angegeben wird, wird das
@code{device}-Feld gänzlich ignoriert.

@item @code{linux-arguments} (Vorgabe: @code{'()})
Die Liste zusätzlicher Linux-Kernel-Befehlszeilenargumente@tie{}– z.B.@:
@code{'("console=ttyS0")}.

@item @code{initrd} (Vorgabe: @code{#f})
Ein G-Ausdruck oder eine Zeichenkette, die den Dateinamen der initialen
RAM-Disk angibt, die benutzt werden soll (siehe @ref{G-Ausdrücke}).

@item @code{device} (Vorgabe: @code{#f})
Das Gerät, auf dem Kernel und initrd zu finden sind@tie{}– d.h.@: bei GRUB
die Wurzel (@dfn{root}) dieses Menüeintrags (siehe @ref{root,,, grub,
Handbuch von GNU GRUB}).

Dies kann eine Dateisystembezeichnung (als Zeichenkette), eine
Dateisystem-UUID (als Bytevektor, siehe @ref{Dateisysteme}) oder @code{#f}
sein, im letzten Fall wird der Bootloader auf dem Gerät suchen, das die vom
@code{linux}-Feld benannte Datei enthält (siehe @ref{search,,, grub,
Handbuch von GNU GRUB}). Ein vom Betriebssystem vergebener Gerätename wie
@file{/dev/sda1} ist aber @emph{nicht} erlaubt.

@item @code{multiboot-kernel} (Vorgabe: @code{#f})
Der Kernel, der im Multiboot-Modus gebootet werden soll (siehe
@ref{multiboot,,, grub, GNU GRUB manual}). Wenn dieses Feld gesetzt ist,
wird ein Multiboot-Menüeintrag erzeugt. Zum Beispiel:

@lisp
(file-append mach "/boot/gnumach")
@end lisp

@item @code{multiboot-arguments} (Vorgabe: @code{'()})
Liste zusätzlicher Befehlszeilenoptionen für den Multiboot-Kernel.

Zum Beispiel möchten Sie für ein Betriebssystem, das innerhalb von QEMU
läuft, vielleicht eine textbasierte serielle Konsole verwenden (mit den
Befehlszeilenoptionen @option{--nographic} @option{--serial mon:stdio}):

@lisp
'("console=com0")
@end lisp

Um den neuen und noch experimentellen
@uref{https://darnassus.sceen.net/~hurd-web/rump_kernel/, auf Benutzerebene
laufenden rumpdisk-Treiber} statt des in den Kernel GNU@tie{}Mach
eingebauten IDE-Treibers zu verwenden, setzen Sie @code{kernel-arguments}
auf:

@lisp
'("noide")
@end lisp

Selbstverständlich können Sie auch beide Optionen verwenden:

@lisp
'("console=com0" "noide")
@end lisp

@item @code{multiboot-modules} (Vorgabe: @code{'()})
Die Liste der Befehle zum Laden von Multiboot-Modulen. Zum Beispiel:

@lisp
(list (list (file-append hurd "/hurd/ext2fs.static") "ext2fs"
             …)
      (list (file-append libc "/lib/ld.so.1") "exec"
             …))
@end lisp

@item @code{chain-loader} (Vorgabe: @code{#f})
Eine Zeichenkette, die von GRUBs @code{chainloader}-Direktive akzeptiert
wird. Sie hat keine Auswirkungen, wenn auch die Felder @code{linux} oder
@code{multiboot-kernel} angegeben werden. Im folgenden Beispiel wird ein
anderes GNU/Linux-System per Chainloading gebootet.

@lisp
(bootloader
 (bootloader-configuration
  ;; …
  (menu-entries
   (list
    (menu-entry
     (label "GNU/Linux")
     (device (uuid "1C31-A17C" 'fat))
     (chain-loader "/EFI/GNULinux/grubx64.efi"))))))
@end lisp

@end table
@end deftp

@cindex HDPI
@cindex HiDPI
@cindex Auflösung
@c FIXME: Write documentation once it's stable.
Zurzeit lässt nur GRUB sein Aussehen durch Themen anpassen. GRUB-Themen
werden mit der @code{grub-theme}-Form erzeugt, die hier noch nicht
vollständig dokumentiert ist.

@deftp {Datentyp} grub-theme
Der Datentyp, der die Konfiguration des GRUB-Themas repräsentiert.

@table @asis
@item @code{gfxmode} (Vorgabe: @code{'("auto")})
Welcher @code{gfxmode} für GRUB eingestellt werden soll (als eine Liste von
Zeichenketten mit Bildschirmauflösungen, siehe @ref{gfxmode,,, grub,
Handbuch von GNU GRUB}).
@end table
@end deftp

@deffn {Prozedur} grub-theme
Liefert das vorgegebene GRUB-Thema, das vom Betriebssystem benutzt wird,
wenn kein @code{theme}-Feld im
@code{bootloader-configuration}-Verbundsobjekt angegeben wurde.

Es wird von einem feschen Hintergrundbild begleitet, das die Logos von GNU
und Guix zeigt.
@end deffn

Um zum Beispiel eine andere Auflösung als vorgegeben zu verwenden, würden
Sie so etwas schreiben:

@lisp
(bootloader
 (bootloader-configuration
 ;; …
 (theme (grub-theme
         (inherit (grub-theme))
         (gfxmode '("1024x786x32" "auto"))))))
@end lisp

@node Aufruf von guix system
@section @command{guix system} aufrufen

@cindex @command{guix system}
Sobald Sie eine Betriebssystemdeklaration geschrieben haben, wie wir sie in
den vorangehenden Abschnitten gesehen haben, kann diese @dfn{instanziiert}
werden, indem Sie den Befehl @command{guix system}
aufrufen. Zusammengefasst:

@example
guix system @var{Optionen}…@: @var{Aktion} @var{Datei}
@end example

@var{Datei} muss der Name einer Datei sein, in der eine
Betriebssystemdeklaration als @code{operating-system}-Objekt
steht. @var{Aktion} gibt an, wie das Betriebssystem instanziiert
wird. Derzeit werden folgende Werte dafür unterstützt:

@table @code
@item search
Verfügbare Diensttypendefinitionen anzeigen, die zum angegebenen regulären
Ausdruck passen, sortiert nach Relevanz:

@cindex HDPI
@cindex HiDPI
@cindex Auflösung
@example
$ guix system search console
name: console-fonts
location: gnu/services/base.scm:806:2
extends: shepherd-root
description: 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"))) ; for HDPI
relevance: 9

name: mingetty
location: gnu/services/base.scm:1190:2
extends: shepherd-root
description: Provide console login using the `mingetty' program.
relevance: 2

name: login
location: gnu/services/base.scm:860:2
extends: pam
description: Provide a console log-in service as specified by its
+ configuration value, a `login-configuration' object.
relevance: 2

…
@end example

Wie auch bei @command{guix package --search} wird das Ergebnis im
@code{recutils}-Format geliefert, so dass es leicht ist, die Ausgabe zu
filtern (siehe @ref{Top, GNU-recutils-Datenbanken,, recutils, Handbuch von
GNU recutils}).

@cindex Diensttypdefinition, Bearbeiten
@cindex Bearbeiten, von Diensttypdefinitionen
@item edit
Die Definition des angegebenen Dienstes bearbeiten oder anzeigen.

Beispielsweise öffnet folgender Befehl Ihren Editor, der mit der
Umgebungsvariablen @env{EDITOR} gewählt werden kann, an der Stelle, wo der
@code{openssh}-Diensttyp definiert ist:

@example
guix system edit openssh
@end example

@item reconfigure
Das in der @var{Datei} beschriebene Betriebssystem erstellen, aktivieren und
zu ihm wechseln@footnote{Diese Aktion (und die dazu ähnlichen Aktionen
@code{switch-generation} und @code{roll-back}) sind nur auf Systemen
nutzbar, auf denen „Guix System“ bereits läuft.}.

@quotation Anmerkung
@c The paragraph below refers to the problem discussed at
@c <https://lists.gnu.org/archive/html/guix-devel/2014-08/msg00057.html>.
Es ist sehr zu empfehlen, @command{guix pull} einmal auszuführen, bevor Sie
@command{guix system reconfigure} zum ersten Mal aufrufen (siehe
@ref{Aufruf von guix pull}). Wenn Sie das nicht tun, könnten Sie nach dem
Abschluss von @command{reconfigure} eine ältere Version von Guix vorfinden,
als Sie vorher hatten.
@end quotation

Dieser Befehl setzt die in der @var{Datei} festgelegte Konfiguration
vollständig um: Benutzerkonten, Systemdienste, die Liste globaler Pakete,
privilegierten Programme und so weiter. Der Befehl startet die in der
@var{Datei} angegebenen Systemdienste, die aktuell nicht laufen; bei aktuell
laufenden Diensten wird sichergestellt, dass sie aktualisiert werden, sobald
sie das nächste Mal angehalten wurden (z.B.@: durch @code{herd stop X} oder
@code{herd restart X}).

Dieser Befehl erzeugt eine neue Generation, deren Nummer (wie @command{guix
system list-generations} sie anzeigt) um eins größer als die der aktuellen
Generation ist. Wenn die so nummerierte Generation bereits existiert, wird
sie überschrieben. Dieses Verhalten entspricht dem von @command{guix
package} (siehe @ref{Aufruf von guix package}).

Für den Bootloader wird ein Menüeintrag für die neue
Betriebssystemkonfiguration hinzugefügt, außer die Befehlszeilenoption
@option{--no-bootloader} wurde übergeben. Bei GRUB werden Einträge für
ältere Konfigurationen in ein Untermenü verschoben, so dass Sie auch eine
ältere Systemgeneration beim Booten noch hochfahren können, falls es
notwendig wird.

@cindex kexec, damit schnell neu starten
@cindex neu starten mit Linux’ kexec
Auf Linux wird @command{guix system reconfigure} auch das neue System für
ein schnelles Neustarten des Rechners mit kexec laden. Das heißt, wenn Sie
@command{reboot --kexec} ausführen, startet sofort das neue System, indem
dessen Kernel ausgeführt wird, ohne nochmal das BIOS und den Bootloader zu
durchlaufen (siehe @ref{Invoking reboot,,, shepherd, Handbuch von GNU
Shepherd}). Sie können dieses Verhalten mit der Befehlszeilenoption
@option{--no-kexec} unterbinden.

@cindex Provenienzverfolgung, des Betriebssystems
Nach Abschluss wird das neue System unter @file{/run/current-system}
verfügbar gemacht. Das Verzeichnis enthält @dfn{Provenienz-Metadaten}: Dazu
gehören die Liste der Kanäle, die benutzt wurden (siehe @ref{Kanäle}) und
die @var{Datei} selbst, wenn sie verfügbar ist. Sie können sie auf diese
Weise ansehen:

@example
guix system describe
@end example

Diese Informationen sind nützlich, falls Sie später inspizieren möchten, wie
diese spezielle Generation erstellt wurde. Falls die @var{Datei}
eigenständig ist, also keine anderen Dateien zum Funktionieren braucht, dann
können Sie tatsächlich die Generation @var{n} Ihres Betriebssystems später
erneut erstellen mit:

@example
guix time-machine \
  -C /var/guix/profiles/system-@var{n}-link/channels.scm -- \
  system reconfigure \
  /var/guix/profiles/system-@var{n}-link/configuration.scm
@end example

Sie können sich das als eine Art eingebaute Versionskontrolle vorstellen!
Ihr System ist nicht nur ein binäres Erzeugnis: @emph{Es enthält seinen
eigenen Quellcode}. Siehe @ref{Service-Referenz,
@code{provenance-service-type}} für mehr Informationen zur
Provenienzverfolgung.

Nach Voreinstellung können Sie durch @command{reconfigure} Ihr System
@emph{nicht auf eine ältere Version aktualisieren} und somit herabstufen,
denn dadurch könnten Sicherheitslücken eingeführt und Probleme mit
„zustandsbehafteten“ Diensten wie z.B.@: Datenbankverwaltungssystemen
ausgelöst werden. Sie können das Verhalten ändern, indem Sie
@option{--allow-downgrades} übergeben.

@item switch-generation
@cindex Generationen
Zu einer bestehenden Systemgeneration wechseln. Diese Aktion wechselt das
Systemprofil atomar auf die angegebene Systemgeneration. Hiermit werden auch
die bestehenden Menüeinträge des Bootloaders umgeordnet. Der Menüeintrag für
die angegebene Systemgeneration wird voreingestellt und die Einträge der
anderen Generationen werden in ein Untermenü verschoben, sofern der
verwendete Bootloader dies unterstützt. Das nächste Mal, wenn das System
gestartet wird, wird die hier angegebene Systemgeneration hochgefahren.

Der Bootloader selbst wird durch diesen Befehl @emph{nicht} neu
installiert. Es wird also lediglich der bereits installierte Bootloader mit
einer neuen Konfigurationsdatei benutzt werden.

Die Zielgeneration kann ausdrücklich über ihre Generationsnummer angegeben
werden. Zum Beispiel würde folgender Aufruf einen Wechsel zur
Systemgeneration 7 bewirken:

@example
guix system switch-generation 7
@end example

Die Zielgeneration kann auch relativ zur aktuellen Generation angegeben
werden, in der Form @code{+N} oder @code{-N}, wobei @code{+3} zum Beispiel
„3 Generationen weiter als die aktuelle Generation“ bedeuten würde und
@code{-1} „1 Generation vor der aktuellen Generation“ hieße. Wenn Sie einen
negativen Wert wie @code{-1} angeben, müssen Sie @code{--} der
Befehlszeilenoption voranstellen, damit die negative Zahl nicht selbst als
Befehlszeilenoption aufgefasst wird. Zum Beispiel:

@example
guix system switch-generation -- -1
@end example

Zurzeit bewirkt ein Aufruf dieser Aktion @emph{nur} einen Wechsel des
Systemprofils auf eine bereits existierende Generation und ein Umordnen der
Bootloader-Menüeinträge. Um die Ziel-Systemgeneration aber tatsächlich zu
benutzen, müssen Sie Ihr System neu hochfahren, nachdem Sie diese Aktion
ausgeführt haben. In einer zukünftigen Version von Guix wird diese Aktion
einmal dieselben Dinge tun, wie @command{reconfigure}, also etwa Dienste
aktivieren und deaktivieren.

Diese Aktion schlägt fehl, wenn die angegebene Generation nicht existiert.

@item roll-back
@cindex Rücksetzen
Zur vorhergehenden Systemgeneration wechseln. Wenn das System das nächste
Mal hochgefahren wird, wird es die vorhergehende Systemgeneration
benutzen. Dies ist die Umkehrung von @command{reconfigure} und tut genau
dasselbe wie @command{switch-generation} mit dem Argument @code{-1}
aufzurufen.

Wie auch bei @command{switch-generation} müssen Sie derzeit, nachdem Sie
diese Aktion aufgerufen haben, Ihr System neu starten, um die vorhergehende
Systemgeneration auch tatsächlich zu benutzen.

@item delete-generations
@cindex Löschen von Systemgenerationen
@cindex Platz sparen
Systemgenerationen löschen, wodurch diese zu Kandidaten für den Müllsammler
werden (siehe @ref{Aufruf von guix gc} für Informationen, wie Sie den
„Müllsammler“ laufen lassen).

Es funktioniert auf die gleiche Weise wie @samp{guix package
--delete-generations} (siehe @ref{Aufruf von guix package,
@option{--delete-generations}}). Wenn keine Argumente angegeben werden,
werden alle Systemgenerationen außer der aktuellen gelöscht:

@example
guix system delete-generations
@end example

Sie können auch eine Auswahl treffen, welche Generationen Sie löschen
möchten. Das folgende Beispiel hat die Löschung aller Systemgenerationen zur
Folge, die älter als zwei Monate sind:

@example
guix system delete-generations 2m
@end example

Wenn Sie diesen Befehl ausführen, wird automatisch der Bootloader mit einer
aktualisierten Liste von Menüeinträgen neu erstellt@tie{}– z.B.@: werden im
Untermenü für die „alten Generationen“ in GRUB die gelöschten Generationen
nicht mehr aufgeführt.

@item build
Die Ableitung des Betriebssystems erstellen, einschließlich aller
Konfigurationsdateien und Programme, die zum Booten und Starten benötigt
werden. Diese Aktion installiert jedoch nichts davon.

@item init
In das angegebene Verzeichnis alle Dateien einfügen, um das in der
@var{Datei} angegebene Betriebssystem starten zu können. Dies ist nützlich
bei erstmaligen Installationen von „Guix System“. Zum Beispiel:

@example
guix system init my-os-config.scm /mnt
@end example

Hiermit werden alle Store-Objekte nach @file{/mnt} kopiert, die von der in
@file{my-os-config.scm} angegebenen Konfiguration vorausgesetzt werden. Dazu
gehören Konfigurationsdateien, Pakete und so weiter. Auch andere essenzielle
Dateien, die auf dem System vorhanden sein müssen, damit es richtig
funktioniert, werden erzeugt@tie{}– z.B.@: die Verzeichnisse @file{/etc},
@file{/var} und @file{/run} und die Datei @file{/bin/sh}.

Dieser Befehl installiert auch den Bootloader auf jedem in
@file{my-os-config} mit @code{targets} angegebenen Ziel, außer die
Befehlszeilenoption @option{--no-bootloader} wurde übergeben.

@item installer
Run the installer.  Usually the installer is built as an @file{iso} image,
copied to a USB Stick or DVD, and booted from (@ref{Installation von USB-Stick oder DVD}).  If your machine already runs Guix and you still want to run
the installer, e.g., for testing purposes, you can skip the step of creating
an @file{iso} and run for instance:

@example
guix system installer --dry-run
@end example

@quotation Anmerkung
If you do not use @option{--dry-run} then you need to run as root.  Be
@emph{very careful} when running the installer as root, it can cause data
loss or render your system unbootable!
@end quotation

@item vm
@cindex virtuelle Maschine
@cindex VM
@anchor{guix system vm}
Eine virtuelle Maschine (VM) erstellen, die das in der @var{Datei}
deklarierte Betriebssystem enthält, und ein Skript liefern, das diese
virtuelle Maschine startet.

@quotation Anmerkung
Die Aktion @code{vm} sowie solche, die weiter unten genannt werden, können
KVM-Unterstützung im Kernel Linux-libre ausnutzen. Insbesondere sollte, wenn
die Maschine Hardware-Virtualisierung unterstützt, das entsprechende
KVM-Kernelmodul geladen sein und das Gerät @file{/dev/kvm} muss dann
existieren und dem Benutzer und den Erstellungsbenutzern des Daemons müssen
Berechtigungen zum Lesen und Schreiben darauf gegeben werden (siehe
@ref{Einrichten der Erstellungsumgebung}).
@end quotation

An das Skript übergebene Argumente werden an QEMU weitergereicht, wie Sie am
folgenden Beispiel sehen können. Damit würde eine Netzwerkverbindung
aktiviert und 1@tie{}GiB an RAM für die emulierte Maschine angefragt:

@example
$ /gnu/store/…-run-vm.sh -m 1024 -smp 2 -nic user,model=virtio-net-pci
@end example

Beide Schritte können zu einem kombiniert werden:

@example
$ $(guix system vm my-config.scm) -m 1024 -smp 2 -nic user,model=virtio-net-pci
@end example

Die virtuelle Maschine verwendet denselben Store wie das Wirtssystem.

Vorgegeben ist, für die VM das Wurzeldateisystem als flüchtig („volatile“)
einzubinden. Mit der Befehlszeilenoption @option{--persistent} werden
Änderungen stattdessen dauerhaft. In diesem Fall wird das Disk-Image der VM
aus dem Store in das Verzeichnis @env{TMPDIR} kopiert, damit Schreibzugriff
darauf besteht.

Mit den Befehlszeilenoptionen @option{--share} und @option{--expose} können
weitere Dateisysteme zwischen dem Wirtssystem und der VM geteilt werden: Der
erste Befehl gibt ein mit Schreibzugriff zu teilendes Verzeichnis an,
während der letzte Befehl nur Lesezugriff auf das gemeinsame Verzeichnis
gestattet.

Im folgenden Beispiel wird eine virtuelle Maschine erzeugt, die auf das
Persönliche Verzeichnis des Benutzers nur Lesezugriff hat, wo das
Verzeichnis @file{/austausch} aber mit Lese- und Schreibzugriff dem
Verzeichnis @file{$HOME/tmp} auf dem Wirtssystem zugeordnet wurde:

@example
guix system vm my-config.scm \
   --expose=$HOME --share=$HOME/tmp=/austausch
@end example

Für GNU/Linux ist das vorgegebene Verhalten, direkt in den Kernel zu booten,
wodurch nur ein sehr winziges „Disk-Image“ (eine Datei mit einem Abbild des
Plattenspeichers der virtuellen Maschine) für das Wurzeldateisystem nötig
wird, weil der Store des Wirtssystems davon eingebunden werden kann.

Mit der Befehlszeilenoption @option{--full-boot} wird erzwungen, einen
vollständigen Bootvorgang durchzuführen, angefangen mit dem
Bootloader. Dadurch wird mehr Plattenplatz verbraucht, weil dazu ein
Disk-Image mindestens mit dem Kernel, initrd und Bootloader-Datendateien
erzeugt werden muss.

Mit der Befehlszeilenoption @option{--image-size} kann die Größe des
Disk-Images angegeben werden.

The @option{--no-graphic} option will instruct @command{guix system} to
spawn a headless VM that will use the invoking tty for IO.  Among other
things, this enables copy-pasting, and scrollback.  Use the @kbd{ctrl-a}
prefix to issue QEMU commands; e.g.@: @kbd{ctrl-a h} prints a help,
@kbd{ctrl-a x} quits the VM, and @kbd{ctrl-a c} switches between the QEMU
monitor and the VM.

@cindex System-Images, Erstellung in verschiedenen Formaten
@cindex Erzeugen von System-Abbildern (Images) in verschiedenen Formaten
@item image
@cindex image, Disk-Images erzeugen
Mit dem Befehl @code{image} können mehrere Abbildtypen erzeugt werden. Der
Abbildtyp kann durch die Befehlszeilenoption @option{--image-type}
ausgewählt werden. Vorgegeben ist @code{mbr-hybrid-raw}. Für den Wert
@code{iso9660} kann mit der Befehlszeilenoption @option{--label} eine
Datenträgerkennung („Volume ID“) angegeben werden. Nach Vorgabe wird das
Wurzeldateisystem eines Abbilds als nicht-flüchtig eingebunden. Wenn die
Befehlszeilenoption @option{--volatile} angegeben wird, dann sind Änderungen
daran bloß flüchtig. Bei der Verwendung von @code{image} wird auf dem
erzeugten Abbild derjenige Bootloader installiert, der in der
@code{operating-system}-Definition angegeben wurde. Das folgende Beispiel
zeigt, wie Sie ein Abbild erzeugen, das als Bootloader
@code{grub-efi-bootloader} benutzt, und es mit QEMU starten:

@example
image=$(guix system image --image-type=qcow2 \
        gnu/system/examples/lightweight-desktop.tmpl)
cp $image /tmp/my-image.qcow2
chmod +w /tmp/my-image.qcow2
qemu-system-x86_64 -enable-kvm -hda /tmp/my-image.qcow2 -m 1000 \
                   -bios $(guix build ovmf-x86-64)/share/firmware/ovmf_x64.bin
@end example

Wenn Sie den Abbildtyp @code{mbr-hybrid-raw} anfordern, wird ein rohes
Disk-Image hergestellt; es kann zum Beispiel auf einen USB-Stick kopiert
werden. Angenommen @code{/dev/sdc} ist das dem USB-Stick entsprechende
Gerät, dann kann das Disk-Image mit dem folgenden Befehls darauf kopiert
werden:

@example
# dd if=$(guix system image my-os.scm) of=/dev/sdc status=progress
@end example

Durch die Befehlszeilenoption @code{--list-image-types} werden alle
verfügbaren Abbildtypen aufgelistet.

@cindex Abbilder für virtuelle Maschinen erzeugen
Wenn Sie den Abbildtypen @code{qcow2} benutzen, wird ein Abbild im
qcow2-Format geliefert, das vom QEMU-Emulator effizient benutzt werden
kann. Siehe @ref{Guix in einer VM starten} für weitere Informationen, wie Sie
das Abbild in einer virtuellen Maschine ausführen. Als Bootloader wird immer
@code{grub-bootloader} benutzt, egal was in der als Argument übergebenen
@code{operating-system}-Datei deklariert wurde. Der Grund dafür ist, dass
dieser besser mit QEMU funktioniert, das als BIOS nach Voreinstellung
SeaBIOS benutzt, wo erwartet wird, dass ein Bootloader in den Master Boot
Record (MBR) installiert wurde. Für den Fall, dass die virtuelle Maschine
auf AArch64 läuft, ziehen Sie den Abbildtypen @code{qcow2-gpt} in Betracht,
der den Bootloader nur im EFI installiert.

@cindex docker-image, Abbilder für Docker erzeugen
Wenn Sie den Abbildtyp @code{docker} anfordern, wird ein Abbild für Docker
hergestellt. Guix erstellt das Abbild von Grund auf und @emph{nicht} aus
einem vorerstellten Docker-Basisabbild heraus, daher enthält es @emph{exakt}
das, was Sie in der Konfigurationsdatei für das Betriebssystem angegeben
haben. Sie können das Abbild dann wie folgt laden und einen Docker-Container
damit erzeugen:

@example
image_id="$(docker load < guix-system-docker-image.tar.gz)"
container_id="$(docker create $image_id)"
docker start $container_id
@end example

Dieser Befehl startet einen neuen Docker-Container aus dem angegebenen
Abbild. Damit wird das Guix-System auf die normale Weise hochgefahren,
d.h.@: zunächst werden alle Dienste gestartet, die Sie in der Konfiguration
des Betriebssystems angegeben haben. Sie können eine interaktive Shell in
dieser isolierten Umgebung bekommen, indem Sie @command{docker exec}
benutzen:

@example
docker exec -ti $container_id /run/current-system/profile/bin/bash --login
@end example

Je nachdem, was Sie im Docker-Container ausführen, kann es nötig sein, dass
Sie ihn mit weitergehenden Berechtigungen ausstatten. Wenn Sie zum Beispiel
Software mit Guix innerhalb des Docker-Containers erstellen wollen, müssen
Sie an @code{docker create} die Befehlszeilenoption @option{--privileged}
übergeben.

Zuletzt bewirkt die Befehlszeilenoption @option{--network}, dass durch
@command{guix system docker-image} ein Abbild erzeugt wird, was sein
Netzwerk mit dem Wirtssystem teilt und daher auf Dienste wie nscd oder
NetworkManager verzichten sollte.

@item container
Liefert ein Skript, um das in der @var{Datei} deklarierte Betriebssystem in
einem Container auszuführen. Mit Container wird hier eine Reihe
ressourcenschonender Isolierungsmechanismen im Kernel Linux-libre
bezeichnet. Container beanspruchen wesentlich weniger Ressourcen als
vollumfängliche virtuelle Maschinen, weil der Kernel, Bibliotheken in
gemeinsam nutzbaren Objektdateien („Shared Objects“) sowie andere Ressourcen
mit dem Wirtssystem geteilt werden können. Damit ist also eine „dünnere“
Isolierung möglich.

Zurzeit muss das Skript als Administratornutzer „root“ ausgeführt werden,
damit darin mehr als nur ein einzelner Benutzer und eine Benutzergruppe
unterstützt wird. Der Container teilt seinen Store mit dem Wirtssystem.

Wie bei der Aktion @code{vm} (siehe @ref{guix system vm}) können zusätzlich
weitere Dateisysteme zwischen Wirt und Container geteilt werden, indem man
die Befehlszeilenoptionen @option{--share} und @option{--expose} verwendet:

@example
guix system container my-config.scm \
   --expose=$HOME --share=$HOME/tmp=/austausch
@end example

Die Befehlszeilenoptionen @option{--share} und @option{--expose} können Sie
auch an das erzeugte Skript übergeben, um weitere Verzeichnisse im Container
als Verzeichniseinbindung („bind mount“) verfügbar zu machen.

The generated script also supports the @option{--pid-file} option to write
the container process ID to a file. This can be used, along with
@command{guix container exec} to execute scripts within the container
(@pxref{Aufruf von guix container}).

@quotation Anmerkung
Die Aktion @code{container} funktioniert nur mit Linux-libre 3.19 oder
neuer.
@end quotation

@end table

Unter den @var{Optionen} können beliebige gemeinsame Erstellungsoptionen
aufgeführt werden (siehe @ref{Gemeinsame Erstellungsoptionen}). Des Weiteren kann als
@var{Optionen} Folgendes angegeben werden:

@table @option
@item --expression=@var{Ausdruck}
@itemx -e @var{Ausdruck}
Als Konfiguration des Betriebssystems das @code{operating-system}-Objekt
betrachten, zu dem der @var{Ausdruck} ausgewertet wird. Dies ist eine
Alternative dazu, die Konfiguration in einer Datei festzulegen. Hiermit wird
auch das Installationsabbild des Guix-Systems erstellt, siehe @ref{Ein Abbild zur Installation erstellen}).

@item --system=@var{System}
@itemx -s @var{System}
Versuchen, für das angegebene @var{System} statt für denselben Systemtyp wie
auf dem Wirtssystem zu erstellen. Dies funktioniert wie bei @command{guix
build} (siehe @ref{Aufruf von guix build}).

@item --target=@var{Tripel}
Lässt für das angegebene @var{Tripel} cross-erstellen, dieses muss ein
gültiges GNU-Tripel wie z.B.@: @code{"aarch64-linux-gnu"} sein (siehe
@ref{Specifying target triplets, GNU-Tripel für configure,, autoconf,
Autoconf}).

@item --derivation
@itemx -d
Liefert den Namen der Ableitungsdatei für das angegebene Betriebssystem,
ohne dazu etwas zu erstellen.

@cindex Provenienzverfolgung, des Betriebssystems
@item --save-provenance
Wie zuvor erläutert, speichern @command{guix system init} und @command{guix
system reconfigure} Provenienzinformationen immer über einen dedizierten
Dienst (siehe @ref{Service-Referenz,
@code{provenance-service-type}}). Andere Befehle tun das nach Voreinstellung
jedoch @emph{nicht}. Wenn Sie zum Beispiel ein Abbild für eine virtuelle
Maschine mitsamt Provenienzinformationen erzeugen möchten, können Sie dies
ausführen:

@example
guix system image -t qcow2 --save-provenance config.scm
@end example

Auf diese Weise wird im erzeugten Abbild im Prinzip „sein eigener Quellcode
eingebettet“, in Form von Metadaten in @file{/run/current-system}. Mit
diesen Informationen kann man das Abbild neu erzeugen, um sicherzugehen,
dass es tatsächlich das enthält, was davon behauptet wird. Man könnte damit
auch eine Abwandlung des Abbilds erzeugen.

@item --image-type=@var{Typ}
@itemx -t @var{Typ}
Für die Aktion @code{image} wird ein Abbild des angegebenen @var{Typ}s
erzeugt.

Wird diese Befehlszeilenoption nicht angegeben, so benutzt @command{guix
system} den Abbildtyp @code{mbr-hybrid-raw}.

@cindex ISO-9660-Format
@cindex CD-Abbild-Format
@cindex DVD-Abbild-Format
@option{--image-type=iso9660} erzeugt ein Abbild im Format ISO-9660, was für
das Brennen auf CDs und DVDs geeignet ist.

@item --image-size=@var{Größe}
Für die Aktion @code{image} wird hiermit festgelegt, dass ein Abbild der
angegebenen @var{Größe} erstellt werden soll. Die @var{Größe} kann als Zahl
die Anzahl Bytes angeben oder mit einer Einheit als Suffix versehen werden
(siehe @ref{Block size, Größenangaben,, coreutils, GNU Coreutils}).

Wird keine solche Befehlszeilenoption angegeben, berechnet @command{guix
system} eine Schätzung der Abbildgröße anhand der Größe des in der
@var{Datei} deklarierten Systems.

@item --network
@itemx -N
Für die Aktion @code{container} dürfen isolierte Umgebungen (auch bekannt
als „Container“) auf das Wirtsnetzwerk zugreifen, d.h.@: es wird kein
Netzwerknamensraum für sie erzeugt.

@item --root=@var{Datei}
@itemx -r @var{Datei}
Die @var{Datei} zu einer symbolischen Verknüpfung auf das Ergebnis machen
und als Müllsammlerwurzel registrieren.

@item --skip-checks
Die Konfiguration @emph{nicht} vor der Installation zur Sicherheit auf
Fehler prüfen.

Das vorgegebene Verhalten von @command{guix system init} und @command{guix
system reconfigure} sieht vor, die Konfiguration zur Sicherheit auf Fehler
hin zu überprüfen, die ihr Autor übersehen haben könnte: Es wird
sichergestellt, dass die in der @code{operating-system}-Deklaration
erwähnten Dateisysteme tatsächlich existieren (siehe @ref{Dateisysteme}) und
dass alle Linux-Kernelmodule, die beim Booten benötigt werden könnten, auch
im @code{initrd-modules}-Feld aufgeführt sind (siehe @ref{Initiale RAM-Disk}). Mit dieser Befehlszeilenoption werden diese Tests allesamt
übersprungen.

@item --allow-downgrades
An @command{guix system reconfigure} die Anweisung erteilen,
Systemherabstufungen zuzulassen.

Nach Voreinstellung können Sie mit @command{reconfigure} Ihr System nicht
auf eine ältere Version aktualisieren und somit herabstufen. Dazu werden die
Provenienzinformationen Ihres Systems herangezogen (wie sie auch von
@command{guix system describe} angezeigt werden) und mit denen aus Ihrem
@command{guix}-Befehl verglichen (wie sie @command{guix describe}
anzeigt). Wenn die Commits von @command{guix} nicht Nachfolger derer Ihres
Systems sind, dann bricht @command{guix system reconfigure} mit einer
Fehlermeldung ab. Wenn Sie @option{--allow-downgrades} übergeben, können Sie
diese Sicherheitsüberprüfungen umgehen.

@quotation Anmerkung
Sie sollten verstehen, was es für die Sicherheit Ihres Rechners bedeutet,
ehe Sie @option{--allow-downgrades} benutzen.
@end quotation

@cindex on-error
@cindex on-error-Strategie
@cindex Fehlerstrategie
@item --on-error=@var{Strategie}
Beim Auftreten eines Fehlers beim Einlesen der @var{Datei} die angegebene
@var{Strategie} verfolgen. Als @var{Strategie} dient eine der Folgenden:

@table @code
@item nothing-special
Nichts besonderes; der Fehler wird kurz gemeldet und der Vorgang
abgebrochen. Dies ist die vorgegebene Strategie.

@item backtrace
Ebenso, aber zusätzlich wird eine Rückverfolgung des Fehlers (ein
„Backtrace“) angezeigt.

@item debug
Nach dem Melden des Fehlers wird der Debugger von Guile zur Fehlersuche
gestartet. Von dort können Sie Befehle ausführen, zum Beispiel können Sie
sich mit @code{,bt} eine Rückverfolgung („Backtrace“) anzeigen lassen und
mit @code{,locals} die Werte lokaler Variabler anzeigen lassen. Im
Allgemeinen können Sie mit Befehlen den Zustand des Programms
inspizieren. Siehe @ref{Debug Commands,,, guile, Referenzhandbuch zu GNU
Guile} für eine Liste verfügbarer Befehle zur Fehlersuche.
@end table
@end table

Sobald Sie Ihre Guix-Installation erstellt, konfiguriert, neu konfiguriert
und nochmals neu konfiguriert haben, finden Sie es vielleicht hilfreich,
sich die auf der Platte verfügbaren@tie{}– und im Bootmenü des Bootloaders
auswählbaren@tie{}– Systemgenerationen auflisten zu lassen:

@table @code

@item describe
Die laufende Systemgeneration beschreiben: ihren Dateinamen, den Kernel und
den benutzten Bootloader etc.@: sowie Provenienzinformationen, falls
verfügbar.

Die Befehlszeilenoption @code{--list-installed} hat dieselbe Syntax wie bei
@command{guix package --list-installed} (siehe @ref{Aufruf von guix package}). Wenn die Befehlszeilenoption angegeben wird, wird in der
Beschreibung eine Liste der Pakete angezeigt, die aktuell im Systemprofil
installiert sind. Optional kann die Liste mit einem regulären Ausdruck
gefiltert werden.

@quotation Anmerkung
Mit der @emph{laufenden} Systemgeneration@tie{}– die, auf die
@file{/run/current-system} verweist@tie{}– ist @emph{nicht} unbedingt die
@emph{aktuelle} Systemgeneration gemeint, auf die
@file{/var/guix/profiles/system} verweist: Sie unterscheiden sich, wenn Sie
zum Beispiel im Bootloader-Menü eine ältere Generation starten lassen.

Auch die @emph{gebootete} Systemgeneration@tie{}– auf die
@file{/run/booted-system} verweist@tie{}– ist vielleicht eine andere, etwa
wenn Sie das System in der Zwischenzeit rekonfiguriert haben.
@end quotation

@item list-generations
Eine für Menschen verständliche Zusammenfassung jeder auf der Platte
verfügbaren Generation des Betriebssystems ausgeben. Dies ähnelt der
Befehlszeilenoption @option{--list-generations} von @command{guix package}
(siehe @ref{Aufruf von guix package}).

Optional kann ein Muster angegeben werden, was dieselbe Syntax wie
@command{guix package --list-generations} benutzt, um damit die Liste
anzuzeigender Generationen einzuschränken. Zum Beispiel zeigt der folgende
Befehl Generationen an, die bis zu 10 Tage alt sind:

@example
$ guix system list-generations 10d
@end example

Sie können als Befehlszeilenoption @code{--list-installed} angeben mit
derselben Syntax wie in @command{guix package --list-installed}. Das kann
nützlich sein, wenn Sie herausfinden möchten, wann ein bestimmtes Paket zum
System hinzukam.

@end table

Der Befehl @command{guix system} hat sogar noch mehr zu bieten! Mit
folgenden Unterbefehlen wird Ihnen visualisiert, wie Ihre Systemdienste
voneinander abhängen:

@anchor{system-extension-graph}
@table @code

@item extension-graph
Auf die Standardausgabe den @dfn{Diensterweiterungsgraphen} des in der
@var{Datei} definierten Betriebssystems ausgeben (siehe @ref{Dienstkompositionen} für mehr Informationen zu Diensterweiterungen). Vorgegeben ist,
ihn im Dot-/Graphviz-Format auszugeben, aber Sie können ein anderes Format
mit @option{--graph-backend} auswählen, genau wie bei @command{guix graph}
(siehe @ref{Aufruf von guix graph, @option{--backend}}):

Der Befehl:

@example
$ guix system extension-graph @var{Datei} | xdot -
@end example

zeigt die Erweiterungsrelation unter Diensten an.

@quotation Anmerkung
Sie finden das Programm @command{dot} im Paket @code{graphviz}.
@end quotation

@anchor{system-shepherd-graph}
@item shepherd-graph
Auf die Standardausgabe den @dfn{Abhängigkeitsgraphen} der Shepherd-Dienste
des in der @var{Datei} definierten Betriebssystems ausgeben. Siehe
@ref{Shepherd-Dienste} für mehr Informationen sowie einen Beispielgraphen.

Auch hier wird nach Vorgabe die Ausgabe im Dot-/Graphviz-Format sein, aber
Sie können ein anderes Format mit @option{--graph-backend} auswählen.

@end table

@node Aufruf von guix deploy
@section @command{guix deploy} aufrufen

@cindex @command{guix deploy}
Wir haben bereits gesehen, wie die Konfiguration einer Maschine mit
@code{operating-system}-Deklarationen lokal verwaltet werden kann. Doch was
ist, wenn Sie mehrere Maschinen konfigurieren möchten? Vielleicht kümmern
Sie sich um einen Dienst im Web, der über mehrere Server verteilt ist. Mit
@command{guix deploy} können Sie ebensolche
@code{operating-system}-Deklarationen verwenden, um mehrere entfernte
Rechner („Hosts“) gleichzeitig in einer logischen Bereitstellung (einem
„Deployment“) zu verwalten.

@quotation Anmerkung
Die in diesem Abschnitt beschriebenen Funktionalitäten befinden sich noch in
der Entwicklung und können sich ändern. Kontaktieren Sie uns auf
@email{guix-devel@@gnu.org}!
@end quotation

@example
guix deploy @var{Datei}
@end example

Mit einem solchen Aufruf werden diejenigen „Maschinen“ bereitgestellt, zu
denen der Code in der @var{Datei} ausgewertet wird. Zum Beispiel könnte die
@var{Datei} eine solche Definition enthalten:

@lisp
;; Dies ist eine Guix-Bereitstellung einer minimalen Installation ohne
;; X11-Anzeigeserver auf eine Maschine, auf der ein SSH-Daemon auf
;; localhost:2222 lauscht. So eine Konfiguration kann für virtuelle
;; Maschinen geeignet sein, deren Ports an die Loopback-Schnittstelle
;; ihres Wirtssystems weitergeleitet werden.

(use-service-modules networking ssh)
(use-package-modules bootloaders)

(define %system
  (operating-system
   (host-name "gnu-deployed")
   (timezone "Etc/UTC")
   (bootloader (bootloader-configuration
                (bootloader grub-bootloader)
                (targets '("/dev/vda"))
                (terminal-outputs '(console))))
   (file-systems (cons (file-system
                        (mount-point "/")
                        (device "/dev/vda1")
                        (type "ext4"))
                       %base-file-systems))
   (services
    (append (list (service dhcp-client-service-type)
                  (service openssh-service-type
                           (openssh-configuration
                            (permit-root-login #t)
                            (allow-empty-passwords? #t))))
            %base-services))))

(list (machine
       (operating-system %system)
       (environment managed-host-environment-type)
       (configuration (machine-ssh-configuration
                       (host-name "localhost")
                       (system "x86_64-linux")
                       (user "alice")
                       (identity "./id_rsa")
                       (port 2222)))))
@end lisp

Die Datei sollte zu einer Liste von @var{machine}-Objekten ausgewertet
werden. Wenn dieses Beispiel aufgespielt wird, befindet sich danach eine
neue Generation auf dem entfernten System, die der
@code{operating-system}-Deklaration @code{%system} entspricht.  Mit
@code{environment} und @code{configuration} wird die Methode zur Belieferung
der Maschine („Provisioning“) angegeben, d.h.@: wie sie angesteuert werden
soll, um dort Rechenressourcen anzulegen und zu verwalten. Im obigen
Beispiel werden keine Ressourcen angelegt, weil @code{'managed-host} für
eine Maschine mit bereits laufendem Guix-System steht, auf die über das
Netzwerk zugegriffen werden kann. Das ist ein besonders einfacher Fall; zu
einer komplexeren Bereitstellung könnte das Starten virtueller Maschinen
über einen Anbieter für „Virtual Private Servers“ (VPS) gehören. In einem
solchen Fall würde eine andere Art von Umgebung als @var{environment}
angegeben werden.

Beachten Sie, dass Sie zunächst ein Schlüsselpaar auf der
Koordinatormaschine erzeugen lassen müssen, damit der Daemon signierte
Archive mit Dateien aus dem Store exportieren kann (siehe @ref{Aufruf von guix archive}). Auf Guix System geschieht dies automatisch.

@example
# guix archive --generate-key
@end example

@noindent
Jede Zielmaschine muss den Schlüssel der Hauptmaschine autorisieren, damit
diese Store-Objekte von der Koordinatormaschine empfangen kann:

@example
# guix archive --authorize < öffentlicher-schlüssel-koordinatormaschine.txt
@end example

In dem Beispiel wird unter @code{user} der Name des Benutzerkontos
angegeben, mit dem Sie sich zum Aufspielen auf der Maschine anmelden. Der
Vorgabewert ist @code{root}, jedoch wird eine Anmeldung als root über SSH
manchmal nicht zugelassen. Als Ausweg kann @command{guix deploy} Sie erst
mit einem „unprivilegierten“ Benutzerkonto ohne besondere Berechtigungen
anmelden, um danach automatisch mit @code{sudo} die Berechtigungen
auszuweiten. Damit das funktioniert, muss @code{sudo} auf der entfernten
Maschine installiert und durch das @code{user}-Konto ohne Nutzerinteraktion
aufrufbar sein; mit anderen Worten muss die Zeile in @code{sudoers}, die das
@code{user}-Benutzerkonto zum Aufruf von @code{sudo} berechtigt, mit dem
@code{NOPASSWD}-Tag versehen sein. Dazu kann das folgende Schnipsel in die
Betriebssystemkonfiguration eingefügt werden:

@lisp
(use-modules …
             (gnu system))   ;macht %sudoers-specification verfügbar

(define %user "benutzername")

(operating-system
  …
  (sudoers-file
     (plain-file "sudoers"
                 (string-append (plain-file-content %sudoers-specification)
                                (format #f "~a ALL = NOPASSWD: ALL~%"
                                        %user)))))

@end lisp

Weitere Informationen über das Format der @file{sudoers}-Datei erhalten Sie,
wenn Sie @command{man sudoers} ausführen.

Wenn Sie ein System auf einige Maschinen aufgespielt haben, möchten Sie
vielleicht alle genannten Maschinen einen Befehl ausführen lassen. Mit der
Befehlszeilenoption @option{--execute} oder @option{-x} können Sie das
bewirken. Folgendes Beispiel zeigt, wie Sie @command{uname -a} auf allen in
der Bereitstellungsdatei aufgelisteten Maschinen ausführen:

@example
guix deploy @var{Datei} -x -- uname -a
@end example

Eine Sache, die häufig nach dem Aufspielen zu tun ist, ist, bestimmte
Dienste auf allen Maschinen neu zu starten. Das geht so:

@example
guix deploy @var{Datei} -x -- herd restart @var{Dienst}
@end example

Der Befehl @command{guix deploy -x} liefert genau dann null zurück, wenn
sein Befehl auf allen Maschinen erfolgreich war.

You may also wish to roll back configurations on machines to a previous
generation.  You can do that using the @option{--roll-back} or @option{-r}
option like so:

@example
guix deploy --roll-back @var{file}
@end example

@c FIXME/TODO: Separate the API doc from the CLI doc.

Hier sehen Sie die Datentypen, die Sie kennen müssen, wenn Sie eine
Bereitstellungsdatei schreiben.

@deftp {Datentyp} machine
Dieser Datentyp steht für eine einzelne Maschine beim Bereitstellen auf
mehrere verschiedene Maschinen.

@table @asis
@item @code{operating-system}
Das Objekt mit der aufzuspielenden Betriebssystemkonfiguration.

@item @code{environment}
Auf welcher Art von Umgebung die Maschine läuft. Der hier angegebene
@code{environment-type} steht dafür, wie die Maschine beliefert wird
(„Provisioning“).

@item @code{configuration} (Vorgabe: @code{#f})
Dieses Objekt gibt die bestimmte Konfiguration der Umgebung
(@code{environment}) der Maschine an. Falls es für diese Umgebung eine
Vorgabekonfiguration gibt, kann auch @code{#f} benutzt werden. Wenn
@code{#f} für eine Umgebung ohne Vorgabekonfiguration benutzt wird, wird ein
Fehler ausgelöst.
@end table
@end deftp

@deftp {Datentyp} machine-ssh-configuration
Dieser Datentyp repräsentiert die SSH-Client-Parameter einer Maschine, deren
Umgebung (@code{environment}) vom Typ @code{managed-host-environment-type}
ist.

@table @asis
@item @code{host-name}
@item @code{build-locally?} (Vorgabe: @code{#t})
Wenn es falsch ist, werden Ableitungen für das System auf der Maschine
erstellt, auf die es aufgespielt wird.
@item @code{system}
Der Systemtyp, der die Architektur der Maschine angibt, auf die aufgespielt
wird@tie{}– z.B. @code{"x86_64-linux"}.
@item @code{authorize?} (Vorgabe: @code{#t})
Wenn es wahr ist, wird der Signierschlüssel des Koordinators zum
ACL-Schlüsselbund (der Access Control List, deutsch Zugriffssteuerungsliste)
der entfernten Maschine hinzugefügt.
@item @code{port} (Vorgabe: @code{22})
@item @code{user} (Vorgabe: @code{"root"})
@item @code{identity} (Vorgabe: @code{#f})
Wenn dies angegeben wird, ist es der Pfad zum privaten SSH-Schlüssel, um
sich beim entfernten Rechner zu authentisieren.

@item @code{host-key} (Vorgabe: @code{#f})
Hierfür sollte der SSH-Rechnerschlüssel der Maschine angegeben werden. Er
sieht so aus:

@example
ssh-ed25519 AAAAC3Nz…@: root@@example.org
@end example

Wenn @code{#f} als @code{host-key} angegeben wird, wird der Server gegen die
Datei @file{~/.ssh/known_hosts} geprüft, genau wie es der
@command{ssh}-Client von OpenSSH tut.

@item @code{allow-downgrades?} (Vorgabe: @code{#f})
Ob mögliche Herabstufungen zugelassen werden sollen.

Genau wie @command{guix system reconfigure} vergleicht auch @command{guix
deploy} die Commits auf den momentan eingespielten Kanälen am entfernten
Rechner (wie sie von @command{guix system describe} gemeldet werden) mit
denen, die zurzeit verwendet werden (wie sie @command{guix describe}
anzeigt), um festzustellen, ob aktuell verwendete Commits Nachfolger der
aufgespielten sind. Ist das @emph{nicht} der Fall und steht
@code{allow-downgrades?} auf falsch, wird ein Fehler gemeldet. Dadurch kann
gewährleistet werden, dass Sie nicht aus Versehen die entfernte Maschine auf
eine alte Version herabstufen.

@item @code{safety-checks?} (Vorgabe: @code{#t})
Ob „Sicherheitsüberprüfungen“ vor dem Aufspielen durchgeführt werden. Dazu
gehört, zu prüfen, ob die Geräte und Dateisysteme in der
Betriebssystemkonfiguration tatsächlich auf der Zielmaschine vorhanden sind
und die Linux-Module, die gebrauchy werden, um auf Speichergeräte beim
Booten zuzugreifen, auch im Feld @code{initrd-modules} des
@code{operating-system} aufgelistet sind.

Durch die Sicherheitsüberprüfungen wird gewährleistet, dass Sie nicht aus
Versehen ein System bereitstellen, dass gar nicht booten kann. Überlegen Sie
sich gut, wenn Sie sie ausschalten!
@end table
@end deftp

@deftp {Datentyp} digital-ocean-configuration
Dieser Datentyp beschreibt das Droplet, das für eine Maschine erzeugt werden
soll, deren Umgebung (@code{environment}) vom Typ
@code{digital-ocean-environment-type} ist.

@table @asis
@item @code{ssh-key}
Der Pfad zum privaten SSH-Schlüssel, um sich beim entfernten Rechner zu
authentisieren. In Zukunft wird es dieses Feld vielleicht nicht mehr geben.
@item @code{tags}
Eine Liste von „Tags“ als Zeichenketten, die die Maschine eindeutig
identifizieren. Sie müssen angegeben werden, damit keine zwei Maschinen in
der Bereitstellung dieselbe Menge an Tags haben.
@item @code{region}
Ein Digital-Ocean-„Region Slug“ (Regionskürzel), zum Beispiel @code{"nyc3"}.
@item @code{size}
Ein Digital-Ocean-„Size Slug“ (Größenkürzel), zum Beispiel
@code{"s-1vcpu-1gb"}
@item @code{enable-ipv6?}
Ob das Droplet mit IPv6-Netzanbindung erzeugt werden soll.
@end table
@end deftp

@deftp {Data Type} hetzner-configuration
This is the data type describing the server that should be created for a
machine with an @code{environment} of @code{hetzner-environment-type}. It
allows you to configure deployment to a @acronym{VPS, virtual private
server} hosted by @uref{https://www.hetzner.com, Hetzner}.

@table @asis

@item @code{allow-downgrades?} (Vorgabe: @code{#f})
Ob mögliche Herabstufungen zugelassen werden sollen.

@item @code{authorize?} (Vorgabe: @code{#t})
If true, the public signing key @code{"/etc/guix/signing-key.pub"} of the
machine that invokes @command{guix deploy} will be added to the operating
system ACL keyring of the target machine.

@item @code{build-locally?} (Vorgabe: @code{#t})
If true, system derivations will be built on the machine that invokes
@command{guix deploy}, otherwise derivations are build on the target
machine.  Set this to @code{#f} if the machine you are deploying from has a
different architecture than the target machine and you can't build
derivations for the target architecture by other means, like offloading
(@pxref{Auslagern des Daemons einrichten}) or emulation
(@pxref{transparent-emulation-qemu, Transparent Emulation with QEMU}).

@item @code{delete?} (default: @code{#t})
If true, the server will be deleted when an error happens in the
provisioning phase. If false, the server will be kept in order to debug any
issues.

@item @code{ipv4} (default: @code{#t})
@itemx @code{ipv6} (default: @code{#t})
When false, no public IP address is attached.  Specify the name of an
existing primary ip to attach it to the machine.  Other values would create
a new address automatically.

@item @code{labels} (default: @code{'()})
A user defined alist of key/value pairs attached to the SSH key and the
server on the Hetzner API.  Keys and values must be strings,
e.g. @code{'(("environment" . "development"))}.  For more information, see
@uref{https://docs.hetzner.cloud/#labels, Labels}.

@item @code{location} (default: @code{"fsn1"})
The name of a @uref{https://docs.hetzner.com/cloud/general/locations,
location} to create the server in.  For example, @code{"fsn1"} corresponds
to the Hetzner site in Falkenstein, Germany, while @code{"sin"} corresponds
to its site in Singapore.

@item @code{server-type} (default: @code{"cx42"})
The name of the
@uref{https://docs.hetzner.com/cloud/servers/overview#server-types, server
type} this virtual server should be created with.  For example,
@code{"cx42"} corresponds to a x86_64 server that has 8 VCPUs, 16 GB of
memory and 160 GB of storage, while @code{"cax31"} to the AArch64
equivalent.  Other server types and their current prices can be found
@uref{https://www.hetzner.com/cloud/#pricing, here}.  The @code{"cpx11"}
server type is currently not supported, since its rescue system is too small
to bootstrap a Guix system from.

@item @code{ssh-key} (default: @code{#f})
Wenn dies angegeben wird, ist es der Dateiname des privaten SSH-Schlüssels,
um sich beim entfernten Rechner zu authentisieren.

@item @code{ssh-public-key} (default: extracted from @code{ssh-key})
If specified, either a public key as returned by @code{string->public-key}
or the path to the SSH public key to use to authenticate with the remote
host.

@end table

When deploying a machine for the first time, the following steps are taken
to provision a server for the machine on the
@uref{https://www.hetzner.com/cloud, Hetzner Cloud} service:

@itemize

@item
Create the SSH key of the machine on the Hetzner API.

@item
Create a server for the machine on the Hetzner API.

@item
Format the root partition of the disk using the file system of the machine's
operating system.  Supported file systems are btrfs and ext4.

@item
Install a minimal Guix operating system on the server using the
@uref{https://docs.hetzner.com/cloud/servers/getting-started/rescue-system,
rescue mode}.  This minimal system is used to install the machine's
operating system, after rebooting.

@item
Reboot the server and apply the machine's operating system on the server.

@end itemize

Once the server has been provisioned and SSH is available, deployment
continues by delegating it to the @code{managed-host-environment-type}.

Servers on the Hetzner Cloud service can be provisioned on the AArch64
architecture using UEFI boot mode, or on the x86_64 architecture using BIOS
boot mode.  The @code{(gnu machine hetzner)} module exports the
@code{%hetzner-os-arm} and @code{%hetzner-os-x86} operating systems that are
compatible with those two architectures, and can be used as a base for
defining your custom operating system.

The following example shows the definition of two machines that are deployed
on the Hetzner Cloud service.  The first one uses the @code{%hetzner-os-arm}
operating system to run a server with 16 shared vCPUs and 32 GB of RAM on
the @code{aarch64} architecture, the second one uses the
@code{%hetzner-os-x86} operating system on a server with 16 shared vCPUs and
32 GB of RAM on the @code{x86_64} architecture.

@lisp
(use-modules (gnu machine)
             (gnu machine hetzner))

(list (machine
       (operating-system %hetzner-os-arm)
       (environment hetzner-environment-type)
       (configuration (hetzner-configuration
                       (server-type "cax41")
                       (ssh-key "/home/charlie/.ssh/id_rsa"))))
      (machine
       (operating-system %hetzner-os-x86)
       (environment hetzner-environment-type)
       (configuration (hetzner-configuration
                       (server-type "cpx51")
                       (ssh-public-key "/home/charlie/.ssh/id_rsa.pub")))))
@end lisp

@vindex GUIX_HETZNER_API_TOKEN
Passing this file to @command{guix deploy} with the environment variable
@env{GUIX_HETZNER_API_TOKEN} set to a valid Hetzner
@uref{https://docs.hetzner.com/cloud/api/getting-started/generating-api-token,
API key} should provision two machines for you.

@end deftp

@node Guix in einer VM starten
@section Guix in einer virtuellen Maschine betreiben

@cindex virtuelle Maschine
Um Guix in einer virtuellen Maschine (VM) auszuführen, können Sie das
vorerstellte Guix-VM-Abbild benutzen, das auf
@url{@value{BASE-URL}/guix-system-vm-image-@value{VERSION}.x86_64-linux.qcow2}
angeboten wird. Das Abbild ist ein komprimiertes Abbild im QCOW-Format. Sie
können es an einen Emulator wie QEMU übergeben (siehe unten für Details).

Dieses Abbild startet eine grafische Xfce-Umgebung und enthält einige oft
genutzte Werkzeuge. Sie können im Abbild mehr Software installieren, indem
Sie @command{guix package} in einem Terminal ausführen (siehe @ref{Aufruf von guix package}). Sie können das System im Abbild auch rekonfigurieren,
basierend auf seiner anfänglichen Konfigurationsdatei, die als
@file{/run/current-system/configuration.scm} verfügbar ist (siehe @ref{Das Konfigurationssystem nutzen}).

Statt dieses vorerstellte Abbild zu benutzen, können Sie auch Ihr eigenes
Abbild erstellen, indem Sie @command{guix system image} benutzen (siehe
@ref{Aufruf von guix system}).

@cindex QEMU
Wenn Sie Ihr eigenes Abbild erstellen haben lassen, müssen Sie es aus dem
Store herauskopieren (siehe @ref{Der Store}) und sich darauf
Schreibberechtigung geben, um die Kopie benutzen zu können. Wenn Sie QEMU
aufrufen, müssen Sie einen Systememulator angeben, der für Ihre
Hardware-Plattform passend ist. Hier ist ein minimaler QEMU-Aufruf, der das
Ergebnis von @command{guix system image -t qcow2} auf x86_64-Hardware
bootet:

@example
$ qemu-system-x86_64 \
   -nic user,model=virtio-net-pci \
   -enable-kvm -m 2048 \
   -device virtio-blk,drive=myhd \
   -drive if=none,file=guix-system-vm-image-@value{VERSION}.x86_64-linux.qcow2,id=myhd
@end example

Die Bedeutung jeder dieser Befehlszeilenoptionen ist folgende:

@table @code
@item qemu-system-x86_64
Hiermit wird die zu emulierende Hardware-Plattform angegeben. Sie sollte zum
Wirtsrechner passen.

@item -nic user,model=virtio-net-pci
Den als Nutzer ausgeführten Netzwerkstapel („User-Mode Network Stack“) ohne
besondere Berechtigungen benutzen. Mit dieser Art von Netzwerkanbindung kann
das Gast-Betriebssystem eine Verbindung zum Wirt aufbauen, aber nicht
andersherum. Es ist die einfachste Art, das Gast-Betriebssystem mit dem
Internet zu verbinden. Das @code{model} gibt das Modell eines zu
emulierenden Netzwerkgeräts an: @code{virtio-net-pci} ist ein besonderes
Gerät, das für virtualisierte Betriebssysteme gedacht ist und für die
meisten Anwendungsfälle empfohlen wird. Falls Ihre Hardware-Plattform x86_64
ist, können Sie eine Liste verfügbarer Modelle von Netzwerkkarten (englisch
„Network Interface Card“, kurz NIC) einsehen, indem Sie
@command{qemu-system-x86_64 -net nic,model=help} ausführen.

@item -enable-kvm
Wenn Ihr System über Erweiterungen zur Hardware-Virtualisierung verfügt,
beschleunigt es die Dinge, wenn Sie die Virtualisierungsunterstützung „KVM“
des Linux-Kernels benutzen lassen.

@c To run Xfce + 'guix pull', we need at least 1G of RAM.
@item -m 2048
Die Menge an Arbeitsspeicher (RAM), die dem Gastbetriebssystem zur Verfügung
stehen soll, in Mebibytes. Vorgegeben wären 128@tie{}MiB, was für einige
Operationen zu wenig sein könnte.

@item -device virtio-blk,drive=myhd
Ein @code{virtio-blk}-Laufwerk namens „myhd“ erzeugen. @code{virtio-blk} ist
ein Mechanismus zur „Paravirtualisierung“ von Blockgeräten, wodurch QEMU
diese effizienter benutzen kann, als wenn es ein Laufwerk vollständig
emulieren würde. Siehe die Dokumentation von QEMU und KVM für mehr
Informationen.

@item -drive if=none,file=/tmp/qemu-image,id=myhd
Unser QCOW-Abbild in der Datei
@file{guix-system-vm-image-@value{VERSION}.x86_64-linux.qcow2} soll als
Inhalt des „myhd“-Laufwerks herhalten.
@end table

Das voreingestellte @command{run-vm.sh}-Skript, das durch einen Aufruf von
@command{guix system vm} erzeugt wird, fügt keine Befehlszeilenoption
@command{-nic user} an. Um innerhalb der virtuellen Maschine Netzwerkzugang
zu haben, fügen Sie den @code{(dhcp-client-service)} zu Ihrer
Systemdefinition hinzu und starten Sie die VM mit @command{$(guix system vm
config.scm) -nic user}. Erwähnt werden sollte der Nachteil, dass bei
Verwendung von @command{-nic user} zur Netzanbindung der
@command{ping}-Befehl @emph{nicht} funktionieren wird, weil dieser das
ICMP-Protokoll braucht. Sie werden also einen anderen Befehl benutzen
müssen, um auszuprobieren, ob Sie mit dem Netzwerk verbunden sind, zum
Beispiel @command{guix download}.

@subsection Verbinden über SSH

@cindex SSH
@cindex SSH-Server
Um SSH in der virtuellen Maschine zu aktivieren, müssen Sie einen SSH-Server
wie @code{openssh-service-type} zu ihr hinzufügen (siehe @ref{Netzwerkdienste, @code{openssh-service-type}}). Des Weiteren müssen Sie den
SSH-Port für das Wirtssystem freigeben (standardmäßig hat er die Portnummer
22). Das geht zum Beispiel so:

@example
$(guix system vm config.scm) -nic user,model=virtio-net-pci,hostfwd=tcp::10022-:22
@end example

Um sich mit der virtuellen Maschine zu verbinden, benutzen Sie diesen
Befehl:

@example
ssh -o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no -p 10022 localhost
@end example

Mit @command{-p} wird @command{ssh} der Port mitgeteilt, über den eine
Verbindung hergestellt werden soll. @command{-o
UserKnownHostsFile=/dev/null} verhindert, dass @command{ssh} sich bei jeder
Modifikation Ihrer @command{config.scm}-Datei beschwert, ein anderer
bekannter Rechner sei erwartet worden, und @command{-o
StrictHostKeyChecking=no} verhindert, dass Sie die Verbindung zu unbekannten
Rechnern jedes Mal bestätigen müssen, wenn Sie sich verbinden.

@quotation Anmerkung
Wenn dieses Beispiel zu @samp{hostfwd} bei Ihnen nicht funktioniert (weil
z.B.@: sich Ihr SSH-Client aufhängt, wenn Sie versuchen, sich mit dem
zugeordneten Port auf Ihrer VM zu verbinden), dann überprüfen Sie nochmal,
ob Ihre Guix-System-VM auch mit Netzwerkunterstützung konfiguriert wurde,
also etwas wie der Diensttyp @code{dhcp-client-service-type} angegeben
wurde.
@end quotation

@subsection @command{virt-viewer} mit Spice benutzen

Eine Alternative zur grafischen Schnittstelle des standardmäßigen
@command{qemu} ist, sich mit Hilfe des @command{remote-viewer} aus dem Paket
@command{virt-viewer} zu verbinden. Um eine Verbindung herzustellen,
übergeben Sie die Befehlszeilenoption @command{-spice
port=5930,disable-ticketing} an @command{qemu}. Siehe den vorherigen
Abschnitt für weitere Informationen, wie Sie das übergeben.

Spice macht es auch möglich, ein paar nette Hilfestellungen zu benutzen, zum
Beispiel können Sie Ihren Zwischenspeicher zum Kopieren und Einfügen (Ihr
„Clipboard“) mit Ihrer virtuellen Maschine teilen. Um das zu aktivieren,
werden Sie die folgenden Befehlszeilennoptionen zusätzlich an @command{qemu}
übergeben müssen:

@example
-device virtio-serial-pci,id=virtio-serial0,max_ports=16,bus=pci.0,addr=0x5
-chardev spicevmc,name=vdagent,id=vdagent
-device virtserialport,nr=1,bus=virtio-serial0.0,chardev=vdagent,\
name=com.redhat.spice.0
@end example

Sie werden auch den @code{(spice-vdagent-service)} zu Ihrer Systemdefinition
hinzufügen müssen (siehe @ref{Verschiedene Dienste, Spice-Dienst}).

@node Dienste definieren
@section Dienste definieren

Der vorhergehende Abschnitt präsentiert die verfügbaren Dienste und wie man
sie in einer @code{operating-system}-Deklaration kombiniert. Aber wie
definieren wir solche Dienste eigentlich? Und was ist überhaupt ein Dienst?

@menu
* Dienstkompositionen::      Wie Dienste zusammengestellt werden.
* Diensttypen und Dienste::  Typen und Dienste.
* Service-Referenz::         Referenz zur Programmierschnittstelle.
* Shepherd-Dienste::         Eine spezielle Art von Dienst.
* Komplizierte Konfigurationen::  Die Anbindungen für komplizierte 
                                    Konfigurationen definieren.
@end menu

@node Dienstkompositionen
@subsection Dienstkompositionen

@cindex services
@cindex Daemons
Wir definieren hier einen @dfn{Dienst} (englisch „Service“) als, grob
gesagt, etwas, das die Funktionalität des Betriebssystems erweitert. Oft ist
ein Dienst ein Prozess@tie{}– ein sogenannter @dfn{Daemon}@tie{}–, der beim
Hochfahren des Systems gestartet wird: ein Secure-Shell-Server, ein
Web-Server, der Guix-Erstellungsdaemon usw. Manchmal ist ein Dienst ein
Daemon, dessen Ausführung von einem anderen Daemon ausgelöst wird@tie{}– zum
Beispiel wird ein FTP-Server von @command{inetd} gestartet oder ein
D-Bus-Dienst durch @command{dbus-daemon} aktiviert. Manchmal entspricht ein
Dienst aber auch keinem Daemon. Zum Beispiel nimmt sich der
Benutzerkonten-Dienst („account service“) die Benutzerkonten und sorgt
dafür, dass sie existieren, wenn das System läuft. Der „udev“-Dienst sammelt
die Regeln zur Geräteverwaltung an und macht diese für den eudev-Daemon
verfügbar. Der @file{/etc}-Dienst fügt Dateien in das Verzeichnis
@file{/etc} des Systems ein.

@cindex Diensterweiterungen
Dienste des Guix-Systems werden durch @dfn{Erweiterungen} („Extensions“)
miteinander verbunden. Zum Beispiel @emph{erweitert} der Secure-Shell-Dienst
den Shepherd@tie{}– Shepherd ist das Initialisierungssystem (auch
„init“-System genannt), was als PID@tie{}1 läuft@tie{}–, indem es ihm die
Befehlszeilen zum Starten und Stoppen des Secure-Shell-Daemons übergibt
(siehe @ref{Netzwerkdienste, @code{openssh-service-type}}). Der
UPower-Dienst erweitert den D-Bus-Dienst, indem es ihm seine
@file{.service}-Spezifikation übergibt, und erweitert den udev-Dienst, indem
es ihm Geräteverwaltungsregeln übergibt (siehe @ref{Desktop-Dienste,
@code{upower-service}}). Der Guix-Daemon-Dienst erweitert den Shepherd,
indem er ihm die Befehlszeilen zum Starten und Stoppen des Daemons übergibt,
und er erweitert den Benutzerkontendienst („account service“), indem er ihm
eine Liste der benötigten Erstellungsbenutzerkonten übergibt (siehe
@ref{Basisdienste}).

Alles in allem bilden Dienste und ihre „Erweitert“-Relationen einen
gerichteten azyklischen Graphen (englisch „Directed Acyclic Graph“, kurz
DAG). Wenn wir Dienste als Kästen und Erweiterungen als Pfeile darstellen,
könnte ein typisches System so etwas hier anbieten:

@image{images/service-graph,,5in,Typischer Diensterweiterungsgraph}

@cindex Systemdienst
Ganz unten sehen wir den @dfn{Systemdienst}, der das Verzeichnis erzeugt, in
dem alles zum Ausführen und Hochfahren enthalten ist, so wie es der Befehl
@command{guix system build} liefert. Siehe @ref{Service-Referenz}, um mehr
über die anderen hier gezeigten Diensttypen zu erfahren. Beim
@ref{system-extension-graph, Befehl @command{guix system extension-graph}}
finden Sie Informationen darüber, wie Sie diese Darstellung für eine
Betriebssystemdefinition Ihrer Wahl generieren lassen.

@cindex Diensttypen
Technisch funktioniert es so, dass Entwickler @dfn{Diensttypen} definieren
können, um diese Beziehungen auszudrücken. Im System kann es beliebig viele
Dienste zu jedem Typ geben. Zum Beispiel können auf einem System zwei
Instanzen mit je unterschiedlichen Parametern laufen.

Der folgende Abschnitt beschreibt die Programmierschnittstelle für
Diensttypen und Dienste.

@node Diensttypen und Dienste
@subsection Diensttypen und Dienste

Ein @dfn{Diensttyp} („service type“) ist ein Knoten im oben beschriebenen
ungerichteten azyklischen Graphen (DAG). Fangen wir an mit einem einfachen
Beispiel: dem Diensttyp für den Guix-Erstellungsdaemon (siehe @ref{Aufruf des guix-daemon}):

@lisp
(define guix-service-type
  (service-type
   (name 'guix)
   (extensions
    (list (service-extension shepherd-root-service-type guix-shepherd-service)
          (service-extension account-service-type guix-accounts)
          (service-extension activation-service-type guix-activation)))
   (default-value (guix-configuration))))
@end lisp

@noindent
Damit sind drei Dinge definiert:

@enumerate
@item
Ein Name, der nur dazu da ist, dass man leichter die Abläufe verstehen und
Fehler suchen kann.

@item
Eine Liste von @dfn{Diensterweiterungen} („service extensions“). Jede
Erweiterung gibt den Ziel-Diensttyp an sowie eine Prozedur, die für gegebene
Parameter für den Dienst eine Liste von Objekten zurückliefert, um den
Dienst dieses Typs zu erweitern.

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

@item
Optional kann ein Vorgabewert für Instanzen dieses Typs angegeben werden.
@end enumerate

In diesem Beispiel werden durch @code{guix-service-type} drei Dienste
erweitert:

@table @code
@item shepherd-root-service-type
Die Prozedur @code{guix-shepherd-service} definiert, wie der Shepherd-Dienst
erweitert wird, und zwar liefert sie ein @code{<shepherd-service>}-Objekt,
womit definiert wird, wie der @command{guix-daemon} gestartet und gestoppt
werden kann (siehe @ref{Shepherd-Dienste}).

@item account-service-type
Diese Erweiterung des Dienstes wird durch @code{guix-accounts} berechnet,
eine Prozedur, die eine Liste von @code{user-group}- und
@code{user-account}-Objekten liefert, die die Erstellungsbenutzerkonten
repräsentieren (siehe @ref{Aufruf des guix-daemon}).

@item activation-service-type
Hier ist @code{guix-activation} eine Prozedur, die einen G-Ausdruck
liefert. Dieser ist ein Code-Schnipsel, das zur „Aktivierungszeit“
ausgeführt werden soll@tie{}– z.B.@: wenn der Dienst hochgefahren wird.
@end table

Ein Dienst dieses Typs wird dann so instanziiert:

@lisp
(service guix-service-type
         (guix-configuration
           (build-accounts 5)
           (extra-options '("--gc-keep-derivations"))))
@end lisp

Das zweite Argument an die @code{service}-Form ist ein Wert, der die
Parameter dieser bestimmten Dienstinstanz repräsentiert. Siehe
@ref{guix-configuration-type, @code{guix-configuration}} für Informationen
über den @code{guix-configuration}-Datentyp. Wird kein Wert angegeben, wird
die Vorgabe verwendet, die im @code{guix-service-type} angegeben wurde:

@lisp
(service guix-service-type)
@end lisp

@code{guix-service-type} ist ziemlich einfach, weil es andere Dienste
erweitert, aber selbst nicht erweitert werden kann.

@c @subsubsubsection Extensible Service Types

Der Diensttyp eines @emph{erweiterbaren} Dienstes sieht ungefähr so aus:

@lisp
(define udev-service-type
  (service-type (name 'udev)
                (extensions
                 (list (service-extension shepherd-root-service-type
                                          udev-shepherd-service)))

                (compose concatenate)     ;Liste der Regeln zusammenfügen
                (extend (lambda (config rules) ;Konfiguration und Regeln
                          (udev-configuration
                           (inherit config)
                           (rules (append (udev-configuration-rules config)
                                          rules)))))))
@end lisp

Dies ist der Diensttyp für den @uref{https://github.com/eudev-project/eudev,
Geräteverwaltungsdaemon eudev}. Verglichen mit dem vorherigen Beispiel sehen
wir neben einer Erweiterung des @code{shepherd-root-service-type} auch zwei
neue Felder.

@table @code
@item compose
Die Prozedur, um die Liste der jeweiligen Erweiterungen für den Dienst
dieses Typs zu einem Objekt zusammenzustellen (zu „komponieren“, englisch
@dfn{compose}).

Dienste können den udev-Dienst erweitern, indem sie eine Liste von Regeln
(„Rules“) an ihn übergeben; wir komponieren mehrere solche Erweiterungen,
indem wir die Listen einfach zusammenfügen.

@item extend
Diese Prozedur definiert, wie der Wert des Dienstes um die Komposition mit
Erweiterungen erweitert („extended“) werden kann.

Udev-Erweiterungen werden zu einer einzigen Liste von Regeln komponiert,
aber der Wert des udev-Dienstes ist ein
@code{<udev-configuration>}-Verbundsobjekt. Deshalb erweitern wir diesen
Verbund, indem wir die Liste der von Erweiterungen beigetragenen Regeln an
die im Verbund gespeicherte Liste der Regeln anhängen.

@item description
Diese Zeichenkette gibt einen Überblick über den Systemtyp. Die Zeichenkette
darf mit Texinfo ausgezeichnet werden (siehe @ref{Overview,,, texinfo, GNU
Texinfo}). Der Befehl @command{guix system search} durchsucht diese
Zeichenketten und zeigt sie an (siehe @ref{Aufruf von guix system}).
@end table

Es kann nur eine Instanz eines erweiterbaren Diensttyps wie
@code{udev-service-type} geben. Wenn es mehrere gäbe, wäre es mehrdeutig,
welcher Dienst durch die @code{service-extension} erweitert werden soll.

Sind Sie noch da? Der nächste Abschnitt gibt Ihnen eine Referenz der
Programmierschnittstelle für Dienste.

@node Service-Referenz
@subsection Service-Referenz

Wir haben bereits einen Überblick über Diensttypen gesehen (siehe
@ref{Diensttypen und Dienste}). Dieser Abschnitt hier stellt eine
Referenz dar, wie Dienste und Diensttypen manipuliert werden können. Diese
Schnittstelle wird vom Modul @code{(gnu services)} angeboten.

@deffn {Prozedur} service Typ [Wert]
Liefert einen neuen Dienst des angegebenen @var{Typ}s. Der @var{Typ} muss
als @code{<service-type>}-Objekt angegeben werden (siehe unten). Als
@var{Wert} kann ein beliebiges Objekt angegeben werden, das die Parameter
dieser bestimmten Instanz dieses Dienstes repräsentiert.

Wenn kein @var{Wert} angegeben wird, wird der vom @var{Typ} festgelegte
Vorgabewert verwendet; verfügt der @var{Typ} über keinen Vorgabewert, dann
wird ein Fehler gemeldet.

Zum Beispiel bewirken Sie hiermit:

@lisp
(service openssh-service-type)
@end lisp

@noindent
dasselbe wie mit:

@lisp
(service openssh-service-type
         (openssh-configuration))
@end lisp

In beiden Fällen ist das Ergebnis eine Instanz von
@code{openssh-service-type} mit der vorgegebenen Konfiguration.
@end deffn

@deffn {Prozedur} service? Objekt
Liefert wahr zurück, wenn das @var{Objekt} ein Dienst ist.
@end deffn

@deffn {Prozedur} service-kind Dienst
Liefert den Typ des @var{Dienst}es@tie{}– d.h.@: ein
@code{<service-type>}-Objekt.
@end deffn

@deffn {Prozedur} service-value Dienst
Liefert den Wert, der mit dem @var{Dienst} assoziiert wurde. Er
repräsentiert die Parameter des @var{Dienst}es.
@end deffn

Hier ist ein Beispiel, wie ein Dienst erzeugt und manipuliert werden kann:

@lisp
(define s
  (service nginx-service-type
           (nginx-configuration
            (nginx nginx)
            (log-directory log-Verzeichnis)
            (run-directory run-Verzeichnis)
            (file config-Datei))))

(service? s)
@result{} #t

(eq? (service-kind s) nginx-service-type)
@result{} #t
@end lisp

Die Form @code{modify-services} ist eine nützliche Methode, die Parameter
von einigen der Dienste aus einer Liste wie @code{%base-services} abzuändern
(siehe @ref{Basisdienste, @code{%base-services}}). Sie wird zu einer Liste
von Diensten ausgewertet. Natürlich können Sie dazu auch die üblichen
Listenkombinatoren wie @code{map} und @code{fold} benutzen (siehe
@ref{SRFI-1, List Library,, guile, Referenzhandbuch zu GNU Guile}),
@code{modify-services} soll dieses häufig benutzte Muster lediglich durch
eine knappere Syntax unterstützen.

@defspec modify-services Dienste @
  (Typ Variable => Rumpf) …

Passt die von @var{Dienste} bezeichnete Dienst-Liste entsprechend den
angegebenen Klauseln an. Jede Klausel hat die Form:

@example
(@var{Typ} @var{Variable} => @var{Rumpf})
@end example

wobei @var{Typ} einen Diensttyp („service type“) bezeichnet@tie{}– wie zum
Beispiel @code{guix-service-type}@tie{}– und @var{Variable} ein Bezeichner
ist, der im @var{Rumpf} an die Dienst-Parameter@tie{}– z.B.@: eine
@code{guix-configuration}-Instanz@tie{}– des ursprünglichen Dienstes mit
diesem @var{Typ} gebunden wird.

Der @var{Rumpf} muss zu den neuen Dienst-Parametern ausgewertet werden,
welche benutzt werden, um den neuen Dienst zu konfigurieren. Dieser neue
Dienst wird das Original in der resultierenden Liste ersetzen. Weil die
Dienstparameter eines Dienstes mit @code{define-record-type*} erzeugt
werden, können Sie einen kurzen @var{Rumpf} schreiben, der zu den neuen
Dienstparametern ausgewertet wird, indem Sie die Funktionalität namens
@code{inherit} benutzen, die von @code{define-record-type*} bereitgestellt
wird.

Klauseln können auch die folgende Form annehmen:

@lisp
(delete @var{Diensttyp})
@end lisp

Mit so einer Klausel werden alle Dienste mit dem angegebenen @var{Diensttyp}
aus der Liste der @var{Dienste} weggelassen.

Siehe @ref{Das Konfigurationssystem nutzen} für ein Anwendungsbeispiel.

@end defspec

Als Nächstes ist die Programmierschnittstelle für Diensttypen an der
Reihe. Sie ist etwas, was Sie kennen werden wollen, wenn Sie neue
Dienstdefinitionen schreiben, aber wenn Sie nur Ihre
@code{operating-system}-Deklaration anpassen möchten, brauchen Sie diese
Schnittstelle wahrscheinlich nicht.

@deftp {Datentyp} service-type
@cindex Diensttyp
Die Repräsentation eines @dfn{Diensttypen} (siehe @ref{Diensttypen und Dienste}).

@table @asis
@item @code{name}
Dieses Symbol wird nur verwendet, um die Abläufe im System anzuzeigen und
die Fehlersuche zu erleichtern.

@item @code{extensions}
Eine nicht-leere Liste von @code{<service-extension>}-Objekten (siehe
unten).

@item @code{compose} (Vorgabe: @code{#f})
Wenn es auf @code{#f} gesetzt ist, dann definiert der Diensttyp Dienste, die
nicht erweitert werden können@tie{}– d.h.@: diese Dienste erhalten ihren
Wert nicht von anderen Diensten.

Andernfalls muss es eine Prozedur sein, die ein einziges Argument
entgegennimmt. Die Prozedur wird durch @code{fold-services} aufgerufen und
ihr wird die Liste von aus den Erweiterungen angesammelten Werten
übergeben. Sie gibt daraufhin einen einzelnen Wert zurück.

@item @code{extend} (Vorgabe: @code{#f})
Ist dies auf @code{#f} gesetzt, dann können Dienste dieses Typs nicht
erweitert werden.

Andernfalls muss es eine zwei Argumente nehmende Prozedur sein, die von
@code{fold-services} mit dem anfänglichen Wert für den Dienst als erstes
Argument und dem durch Anwendung von @code{compose} gelieferten Wert als
zweites Argument aufgerufen wird. Als Ergebnis muss ein Wert geliefert
werden, der einen zulässigen neuen Parameterwert für die Dienstinstanz
darstellt.

@item @code{description}
Eine Zeichenkette, womöglich geschrieben als Texinfo-Markup, die in ein paar
Sätzen beschreibt, wofür der Dienst gut ist. Diese Zeichenkette ermöglicht
es Nutzern, mittels @command{guix system search} Informationen über den
Dienst zu bekommen (siehe @ref{Aufruf von guix system}).

@item @code{default-value} (Vorgabe: @code{&no-default-value})
Der Vorgabewert, der für Instanzen dieses Diensttyps verwendet wird. Dadurch
können Nutzer die @code{service}-Form ohne ihr zweites Argument benutzen:

@lisp
(service @var{Diensttyp})
@end lisp

Der zurückgelieferte Dienst hat dann den durch den @var{Diensttyp}
vorgegebenen Vorgabewert.
@end table

Siehe den Abschnitt @ref{Diensttypen und Dienste} für Beispiele.
@end deftp

@deffn {Prozedur} service-extension Zieltyp Berechner
Liefert eine neue Erweiterung für den Dienst mit dem @var{Zieltyp}. Als
@var{Berechner} muss eine Prozedur angegeben werden, die ein einzelnes
Argument nimmt: @code{fold-services} ruft sie auf und übergibt an sie den
Wert des erweiternden Dienstes, sie muss dafür einen zulässigen Wert für den
@var{Zieltyp} liefern.
@end deffn

@deffn {Prozedur} service-extension? Objekt
Liefert wahr zurück, wenn das @var{Objekt} eine Diensterweiterung ist.
@end deffn

Manchmal wollen Sie vielleicht einfach nur einen bestehenden Dienst
erweitern. Dazu müssten Sie einen neuen Diensttyp definieren und die
Erweiterung definieren, für die Sie sich interessieren, was ganz schön
wortreich werden kann. Mit der Prozedur @code{simple-service} können Sie es
kürzer fassen.

@deffn {Prozedur} simple-service Name Zieltyp Wert
Liefert einen Dienst, der den Dienst mit dem @var{Zieltyp} um den @var{Wert}
erweitert. Dazu wird ein Diensttyp mit dem @var{Name}n für den einmaligen
Gebrauch erzeugt, den der zurückgelieferte Dienst instanziiert.

Zum Beispiel kann mcron (siehe @ref{Geplante Auftragsausführung}) so um einen
zusätzlichen Auftrag erweitert werden:

@lisp
(simple-service 'my-mcron-job mcron-service-type
                #~(job '(next-hour (3)) "guix gc -F 2G"))
@end lisp
@end deffn

Den Kern dieses abstrakten Modells für Dienste bildet die Prozedur
@code{fold-services}, die für das „Kompilieren“ einer Liste von Diensten hin
zu einem einzelnen Verzeichnis verantwortlich ist, in welchem alles
enthalten ist, was Sie zum Booten und Hochfahren des Systems brauchen@tie{}–
d.h.@: das Verzeichnis, das der Befehl @command{guix system build} anzeigt
(siehe @ref{Aufruf von guix system}). Einfach ausgedrückt propagiert
@code{fold-services} Diensterweiterungen durch den Dienstgraphen nach unten
und aktualisiert dabei in jedem Knoten des Graphen dessen Parameter, bis nur
noch der Wurzelknoten übrig bleibt.

@deffn {Prozedur} fold-services Dienste [#:target-type system-service-type]
Faltet die @var{Dienste} wie die funktionale Prozedur @code{fold} zu einem
einzigen zusammen, indem ihre Erweiterungen nach unten propagiert werden,
bis eine Wurzel vom @var{target-type} als Diensttyp erreicht wird; dieser so
angepasste Wurzeldienst wird zurückgeliefert.
@end deffn

Als Letztes definiert das Modul @code{(gnu services)} noch mehrere
essenzielle Diensttypen, von denen manche im Folgenden aufgelistet sind:

@defvar system-service-type
Die Wurzel des Dienstgraphen. Davon wird das Systemverzeichnis erzeugt, wie
es vom Befehl @command{guix system build} zurückgeliefert wird.
@end defvar

@defvar boot-service-type
Der Typ des „Boot-Dienstes“, der das @dfn{Boot-Skript} erzeugt. Das
Boot-Skript ist das, was beim Booten durch die initiale RAM-Disk ausgeführt
wird.
@end defvar

@defvar etc-service-type
Der Typ des @file{/etc}-Dienstes. Dieser Dienst wird benutzt, um im
@file{/etc}-Verzeichnis Dateien zu platzieren. Er kann erweitert werden,
indem man Name-Datei-Tupel an ihn übergibt wie in diesem Beispiel:

@lisp
(list `("issue" ,(plain-file "issue" "Willkommen!\n")))
@end lisp

Dieses Beispiel würde bewirken, dass eine Datei @file{/etc/issue} auf die
angegebene Datei verweist.
@end defvar

@defvar etc-profile-d-service-type
The type of the @file{/etc/profile.d} service.  This service is used to
create files under @file{/etc/profile.d}.  It takes as value a list of
file-like objects, as can be produced with @code{local-file},
@code{plain-file}, etc.  Note that provided files whose file names do not
end with @file{.sh} are @emph{not} added to @file{/etc/profile.d/} and are
silently dropped.  Package objects can also be provided directly to have
their @file{etc/profile.d/*.sh} prefixed files added.  A simple usage may
look like:

@example
(simple-service 'my-important-profile-file etc-profile-d-service-type
                (list (plain-file "youppi.sh" "HOW_IMPORTANT=very")))
@end example
@end defvar

@defvar etc-bashrc-d-service-type
The type of the @file{/etc/bashrc.d} service.  This service is used to
create files under @file{/etc/bashrc.d}.  It takes as value a list of
file-like objects, as can be produced with @code{local-file},
@code{plain-file}, etc.  Note that provided files whose file names do not
end with @file{.sh} are @emph{not} added to @file{/etc/profile.d/} and are
silently dropped.  The default value is made available via the
@var{%default-etc-bashrc-d-files} variable for users to extended.  Package
objects can also be provided directly to have their @file{etc/bashrc.d/*.sh}
prefixed files added.  Since the service is part @code{%base-services}, it
can be extended via @code{simple-service} like so:

@example
(use-package-modules gnome)     ;for the `vte' package

(simple-service 'vte-integration etc-bashrc-d-service-type
                (list (file-append vte "/etc/profile.d/vte.sh")))
@end example
@end defvar

@defvar vte-integration-service-type
This services adds the @file{/etc/bashrc.d/vte.sh} to your system, which
improves the Bash and Zsh experience when using VTE-powered terminal
emulators.  This causes for example the current directory to be displayed in
the terminal emulator's tab title, and the current directory to be preserved
when creating a new tab, among other features.  The value of the service is
the @code{vte} package to use.

@example
(use-package-modules gnome)     ;for the `vte' package

(service vte-integration-service-type vte)
@end example
@end defvar

@defvar privileged-program-service-type
Der Typ des Dienstes für privilegierte Programme, der eine Liste von
ausführbaren Dateien ansammelt, die jeweils als G-Ausdrücke übergeben werden
und dann zur Menge der privilegierten Programme auf dem System hinzugefügt
werden (siehe @ref{Privilegierte Programme}).
@end defvar

@defvar profile-service-type
Der Typ des Dienstes zum Einfügen von Dateien ins @dfn{Systemprofil}@tie{}–
d.h.@: die Programme unter @file{/run/current-system/profile}. Andere
Dienste können ihn erweitern, indem sie ihm Listen von ins Systemprofil zu
installierenden Paketen übergeben.
@end defvar

@cindex Provenienzverfolgung, des Betriebssystems
@anchor{provenance-service-type}
@defvar provenance-service-type
Dies ist der Diensttyp des Dienstes, um @dfn{Provenienz-Metadaten} zusammen
mit dem eigentlichen System zu speichern. Dazu werden mehrere Dateien unter
@file{/run/current-system} erstellt:

@table @file
@item channels.scm
Sie ist eine „Kanaldatei“, wie sie an @command{guix pull -C} oder
@command{guix time-machine -C} übergeben werden kann, die die zum Erstellen
des Systems notwendigen Kanäle beschreibt, sofern diese Information zur
Verfügung gestanden hat (siehe @ref{Kanäle}).

@item configuration.scm
Jene Datei entspricht derjenigen, die als Wert für diesen
@code{provenance-service-type}-Dienst mitgegeben wurde. Nach Vorgabe
übergibt @command{guix system reconfigure} automatisch die
Betriebssystemkonfigurationsdatei, die es auf der Befehlszeile bekommen hat.

@item provenance
Hierin sind dieselben Informationen enthalten, die auch in den anderen
beiden Dateien stehen, aber in einem leichter zu verarbeitenden Format.
@end table

Im Allgemeinen genügen diese zwei Informationen (Kanäle und
Konfigurationsdatei), um das Betriebssystem „aus seinem Quellcode heraus“ zu
reproduzieren.

@quotation Einschränkungen
Sie benötigen diese Informationen, um Ihr Betriebssystem erneut zu
erstellen, aber sie alleine @emph{reichen nicht immer aus}. Insbesondere ist
@file{configuration.scm} alleine nicht hinreichend, wenn es @emph{nicht}
eigenständig ist, sondern auf externe Guile-Module oder andere Dateien
verweist. Wenn Sie erreichen wollen, dass @file{configuration.scm}
eigenständig wird, empfehlen wir, alle darin verwendeten Module oder Dateien
zu Bestandteilen eines Kanals zu machen.

Übrigens sind Provenienzmetadaten „still“ in dem Sinn, dass ihr
Vorhandensein nichts an den Bits ändert, die Ihr System ausmachen,
@emph{abgesehen von den die Metadaten ausmachenden Bits}. Zwei verschiedene
Betriebssystemkonfigurationen und Kanalangaben können also Bit für Bit
dasselbe System erzeugen, aber wenn der @code{provenance-service-type}
benutzt wird, enthalten die beiden Systeme trotzdem unterschiedliche
Metadaten und damit nicht mehr den gleichen Dateinamen im Store, was es
schwerer macht, ihre Gleichheit zu erkennen.
@end quotation

Dieser Dienst wird automatisch zu Ihrer Betriebssystemkonfiguration
hinzugefügt, wenn Sie @command{guix system reconfigure}, @command{guix
system init} oder @command{guix deploy} benutzen.
@end defvar

@defvar linux-loadable-module-service-type
Der Diensttyp des Dienstes, der Listen von Paketen mit Kernel-Modulen, die
der Kernel laden können soll, sammelt und dafür sorgt, dass der Kernel sie
laden kann.

Der Diensttyp ist dazu gedacht, von anderen Diensttypen erweitert zu werden,
etwa so:

@lisp
(simple-service 'installing-module
                linux-loadable-module-service-type
                (list module-to-install-1
                      module-to-install-2))
@end lisp

Die Module werden @emph{nicht} geladen. Sie werden nur zum Kernel-Profil
hinzugefügt, damit sie mit anderen Werkzeugen überhaupt erst geladen werden
@emph{können}.
@end defvar

@node Shepherd-Dienste
@subsection Shepherd-Dienste

@cindex Dienste, mit Shepherd
@cindex PID 1
@cindex init-System
Das Modul @code{(gnu services shepherd)} gibt eine Methode an, mit der
Dienste definiert werden können, die von GNU@tie{}Shepherd verwaltet werden,
was das Initialisierungssystem (das „init“-System) ist@tie{}– es ist der
erste Prozess, der gestartet wird, wenn das System gebootet wird, auch
bekannt als PID@tie{}1 (siehe @ref{Introduction,,, shepherd, The GNU
Shepherd Manual}).

Dienste unter dem Shepherd können voneinander abhängen. Zum Beispiel kann es
sein, dass der SSH-Daemon erst gestartet werden darf, nachdem der
Syslog-Daemon gestartet wurde, welcher wiederum erst gestartet werden kann,
sobald alle Dateisysteme eingebunden wurden. Das einfache Betriebssystem,
dessen Definition wir zuvor gesehen haben (siehe @ref{Das Konfigurationssystem nutzen}), ergibt folgenden Dienstgraphen:

@image{images/shepherd-graph,,5in,Typischer Shepherd-Dienstgraph}

Sie können so einen Graphen tatsächlich für jedes Betriebssystem erzeugen
lassen, indem Sie den Befehl @command{guix system shepherd-graph} benutzen
(siehe @ref{system-shepherd-graph, @command{guix system shepherd-graph}}).

Der @code{%shepherd-root-service} ist ein Dienstobjekt, das diesen Prozess
mit PID@tie{}1 repräsentiert. Der Dienst hat den Typ
@code{shepherd-root-service-type}. Sie können ihn erweitern, indem Sie eine
Liste von @code{<shepherd-service>}-Objekten an ihn übergeben.

@deftp {Datentyp} shepherd-service
Der Datentyp, der einen von Shepherd verwalteten Dienst repräsentiert.

@table @asis
@item @code{provision}
Diese Liste von Symbolen gibt an, was vom Dienst angeboten wird.

Das bedeutet, es sind die Namen, die an @command{herd start}, @command{herd
status} und ähnliche Befehle übergeben werden können (siehe @ref{Invoking
herd,,, shepherd, The GNU Shepherd Manual}). Siehe @ref{Defining Services,,,
shepherd, The GNU Shepherd Manual} für Details.

@item @code{requirement} (Vorgabe: @code{'()})
Eine Liste von Symbolen, die angeben, von welchen anderen Shepherd-Diensten
dieser hier abhängt.

@cindex @code{user-processes} Shepherd service
Mit sehr wenigen Ausnahmen müssen Dienste, die einen Daemon starten,
mindestens vom @code{user-processes}-Dienst abhängen; so wird
sichergestellt, dass Daemons nach Einbindung aller Dateisysteme gestartet
werden und dass sie beim Herunterfahren gestoppt wurden, bevor versucht
wird, verbleibende Nutzerprozesse zu beenden.

Ebenso müssen Dienste, die beim Start oder im Betrieb Dateisysteme
einbinden, @code{user-file-systems} als Voraussetzung
benennen. @code{user-processes} hängt bereits von @code{user-file-systems}
ab. Daher genügt nur die Voraussetzung @code{user-processes} auch schon.

@cindex einmalig ausgeführte Dienste, für Shepherd
@item @code{one-shot?} (Vorgabe: @code{#f})
Gibt an, ob dieser Dienst nur einmal ausgeführt wird („one-shot“). Einmalig
ausgeführte Dienste werden gestoppt, sobald ihre @code{start}-Aktion
abgeschlossen wurde. Siehe @ref{Slots of services,,, shepherd, The GNU
Shepherd Manual} für weitere Informationen.

@item @code{respawn?} (Vorgabe: @code{#t})
Ob der Dienst neu gestartet werden soll, nachdem er gestoppt wurde, zum
Beispiel wenn der ihm zu Grunde liegende Prozess terminiert wird.

@item @code{respawn-limit} (Vorgabe: @code{#f})
Hiermit kann beschränkt werden, wie viele Male und wie schnell ein Dienst
durch Shepherd neu gestartet werden soll, ehe er deaktiviert wird. Siehe
@ref{Defining Services,,, shepherd, The GNU Shepherd Manual} für mehr
Informationen.

@item @code{respawn-delay} (Vorgabe: @code{#f})
Wenn dies wahr ist, ist es die Verzögerung in Sekunden, ehe ein Dienst, der
nicht starten konnte, neu gestartet wird.

@item @code{start} (Vorgabe: @code{#~(const #t)})
@itemx @code{stop} (Vorgabe: @code{#~(const #f)})
Die Felder @code{start} und @code{stop} beziehen sich auf Shepherds
Funktionen zum Starten und Stoppen von Prozessen (siehe @ref{Service De- and
Constructors,,, shepherd, The GNU Shepherd Manual}). Sie enthalten
G-Ausdrücke, die in eine Shepherd-Konfigurationdatei umgeschrieben werden
(siehe @ref{G-Ausdrücke}).

@item @code{actions} (Vorgabe: @code{'()})
@cindex Aktionen, bei Shepherd-Diensten
Dies ist eine Liste von @code{shepherd-action}-Objekten (siehe unten), die
vom Dienst zusätzlich unterstützte @dfn{Aktionen} neben den Standardaktionen
@code{start} und @code{stop} angeben. Hier aufgeführte Aktionen werden als
@command{herd}-Unterbefehle verfügbar gemacht:

@example
herd @var{Aktion} @var{Dienst} [@var{Argumente}…]
@end example

@item @code{free-form} (Vorgabe: @code{#f})
When set, this field replaces the @code{start}, @code{stop}, and
@code{actions} fields.  It is meant to be used when the service definition
comes from some other source, typically the service collection provided by
the Shepherd proper (@pxref{Service Collection,,, shepherd, The GNU Shepherd
Manual}).

@cindex REPL service, for shepherd
For example, the snippet below defines a service for the Shepherd's built-in
@acronym{REPL, read-eval-print loop} service (@pxref{REPL Service,,,
shepherd, The GNU Shepherd Manual}):

@lisp
(shepherd-service
  (provision '(repl))
  (modules '((shepherd service repl)))
  (free-form #~(repl-service)))
@end lisp

In this case, the service object is returned by the @code{repl-service}
procedure of the Shepherd, so all the @code{free-form} G-expression does is
call that procedure.  Note that the @code{provision} field must be
consistent with the actual service provision.

@item @code{auto-start?} (Vorgabe: @code{#t})
Ob dieser Dienst automatisch durch Shepherd gestartet werden soll. Wenn es
auf @code{#f} steht, muss der Dienst manuell über @code{herd start}
gestartet werden.

@item @code{documentation}
Eine Zeichenkette zur Dokumentation, die angezeigt wird, wenn man dies
ausführt:

@example
herd doc @var{Dienstname}
@end example

wobei der @var{Dienstname} eines der Symbole aus der @code{provision}-Liste
sein muss (siehe @ref{Invoking herd,,, shepherd, The GNU Shepherd Manual}).

@item @code{modules} (Vorgabe: @code{%default-modules})
Dies ist die Liste der Module, die in den Sichtbarkeitsbereich geladen sein
müssen, wenn @code{start} und @code{stop} ausgewertet werden.

@end table
@end deftp

Im folgenden Beispiel wird ein Shepherd-Dienst definiert, der
@command{syslogd}, den Systemprotokollier-Daemon aus den GNU Networking
Utilities, startet (siehe @ref{syslogd invocation, @command{syslogd},,
inetutils, GNU Inetutils}):

@example
(let ((config (plain-file "syslogd.conf" "@dots{}")))
  (shepherd-service
    (documentation "Den Syslog-Daemon (syslogd) ausführen.")
    (provision '(syslogd))
    (requirement '(user-processes))
    (start #~(make-forkexec-constructor
               (list #$(file-append inetutils "/libexec/syslogd")
                     "--rcfile" #$config)
               #:pid-file "/var/run/syslog.pid"))
    (stop #~(make-kill-destructor))))
@end example

Die Kernelemente in diesem Beispiel sind die Felder @code{start} und
@code{stop}: Es sind Code-Schnipsel, die erst später ausgewertet werden; wir
sagen, sie sind @dfn{staged}. Sie benutzen die von Shepherd bereitgestellte
Prozedur @code{make-forkexec-constructor} und ihr duales Gegenstück,
@code{make-kill-destructor} (siehe das @ref{Service De- and Constructors,,,
shepherd, Handbuch von GNU Shepherd}). Durch das @code{start}-Feld wird
@command{shepherd} das @command{syslogd}-Programm mit den angegebenen
Befehlszeilenoptionen starten; beachten Sie, dass wir @code{config} nach
@option{--rcfile} angeben; dabei handelt es sich um eine vorher im Code
deklarierte Konfigurationsdatei (deren Inhalt wir hier nicht
erklären). Entsprechend wird mit dem Feld @code{stop} ausgesagt, wie dieser
Dienst gestoppt werden kann; in diesem Fall wird er über den Systemaufruf
@code{kill} gestoppt, dem die PID des Prozesses übergeben wird. Code-Staging
wird über G-Ausdrücke umgesetzt: Mit @code{#~} beginnt der später
ausgeführte „staged Code“, und @code{#$} beendet dies und der Code darin
wird wirtsseitig hier und jetzt ausgewertet (siehe @ref{G-Ausdrücke}).

@deftp {Datentyp} shepherd-action
Dieser Datentyp definiert zusätzliche Aktionen, die ein Shepherd-Dienst
implementiert (siehe oben).

@table @code
@item name
Die Aktion bezeichnendes Symbol.

@item documentation
Diese Zeichenkette ist die Dokumentation für die Aktion. Sie können sie
sehen, wenn Sie dies ausführen:

@example
herd doc @var{Dienst} action @var{Aktion}
@end example

@item procedure
Dies sollte ein G-Ausdruck sein, der zu einer mindestens ein Argument
nehmenden Prozedur ausgewertet wird. Das Argument ist der „running“-Wert des
Dienstes (siehe @ref{Slots of services,,, shepherd, The GNU Shepherd
Manual}).
@end table

Das folgende Beispiel definiert eine Aktion namens @code{sag-hallo}, die den
Benutzer freundlich begrüßt:

@lisp
(shepherd-action
  (name 'sag-hallo)
  (documentation "Sag Hallo!")
  (procedure #~(lambda (running . args)
                 (format #t "Hallo, Freund! Argumente: ~s\n"
                         args)
                 #t)))
@end lisp

Wenn wir annehmen, dass wir die Aktion zum Dienst @code{beispiel}
hinzufügen, können Sie Folgendes ausführen:

@example
# herd sag-hallo beispiel
Hallo, Freund! Argumente: ()
# herd sag-hallo beispiel a b c
Hallo, Freund! Argumente: ("a" "b" "c")
@end example

Wie Sie sehen können, ist das eine sehr ausgeklügelte Art, Hallo zu
sagen. Siehe @ref{Defining Services,,, shepherd, The GNU Shepherd Manual}
für mehr Informationen zu Aktionen.
@end deftp

@cindex Konfigurationsdatei, bei Shepherd-Diensten
@deffn {Prozedur} shepherd-configuration-action
Liefert eine Aktion @code{configuration}, mit der @var{Datei} angezeigt
wird. Dafür sollte der Name der Konfigurationsdatei des Dienstes übergeben
werden.

Dienste mit dieser Aktion auszustatten, kann hilfreich sein. Zum Beispiel
ist der Tor-Dienst für anonyme Netzwerkrouten (siehe @ref{Netzwerkdienste, @code{tor-service-type}}) ungefähr so definiert:

@lisp
(let ((torrc (plain-file "torrc" …)))
  (shepherd-service
    (provision '(tor))
    (requirement '(user-processes loopback syslogd))

    (start #~(make-forkexec-constructor
              (list #$(file-append tor "/bin/tor") "-f" #$torrc)
              #:user "tor" #:group "tor"))
    (stop #~(make-kill-destructor))
    (actions (list (shepherd-configuration-action torrc)))
    (documentation "Run the Tor anonymous network overlay.")))
@end lisp

Über diese Aktion haben Administratoren die Möglichkeit, zu prüfen, wie die
an @command{tor} übergebene Konfigurationsdatei aussieht, mit einem
Shell-Befehl wie:

@example
cat $(herd configuration tor)
@end example

So gelingt die Fehlersuche!
@end deffn

@defvar shepherd-root-service-type
Der Diensttyp für den Shepherd-„Wurzeldienst“@tie{}– also für PID@tie{}1.

Dieser Diensttyp stellt das Ziel für Diensterweiterungen dar, die
Shepherd-Dienste erzeugen sollen (siehe @ref{Diensttypen und Dienste} für
ein Beispiel). Jede Erweiterung muss eine Liste von
@code{<shepherd-service>}-Objekten übergeben. Sein Wert muss eine
@code{shepherd-configuration} sein, wie im Folgenden beschrieben.
@end defvar

@deftp {Datentyp} shepherd-configuration
Dieser Datentyp repräsentiert die Konfiguration von Shepherd.

@table @code
@item shepherd (Vorgabe: @code{shepherd})
Das zu benutzende Shepherd-Paket.

@item services (Vorgabe: @code{'()})
Eine Liste zu startender Shepherd-Dienste als
@code{<shepherd-service>}-Objekte. Wahrscheinlich sollten Sie stattdessen
den Mechanismus zur Diensterweiterung benutzen (siehe @ref{Shepherd-Dienste}).
@end table
@end deftp

Im folgenden Beispiel wird ein anderes Shepherd-Paket für das Betriebssystem
festgelegt:

@lisp
(operating-system
  ;; …
  (services (append (list openssh-service-type))
            ;; …
            %desktop-services)
  ;; …
  ;; Eigenes Shepherd-Paket benutzen.
  (essential-services
   (modify-services (operating-system-default-essential-services
                     this-operating-system)
     (shepherd-root-service-type config => (shepherd-configuration
                                            (inherit config)
                                            (shepherd my-shepherd))))))
@end lisp

@anchor{shepherd-transient-timer-services}
@cindex vergänglicher Dienst, Shepherd
@defvar shepherd-transient-service-type
Dieser Diensttyp repräsentiert Shepherds Dienst für vergängliche Dienste,
@code{transient}, mit dem Sie Befehle im Hintergrund starten können und mit
ihnen wie mit gewöhnlichen Shepherd-Diensten umgehen können. Das ähnelt
@command{systemd-run}.

Beispielsweise startet folgender Befehl @command{rsync} im Hintergrund in
einer Umgebung, in der die Umgebungsvariable @env{SSH_AUTH_SOCK} den
gegebenen Wert hat:

@example
herd spawn transient -E SSH_AUTH_SOCK=$SSH_AUTH_SOCK -- \
  rsync -e ssh -vur . backup.example.org:
@end example

Siehe @ref{Transient Service Maker,,, shepherd, Handbuch von GNU Shepherd}
für mehr Informationen zum @code{transient}-Dienst.
@end defvar

@cindex Timer-Dienst, Shepherd
@defvar shepherd-timer-service-type
Dieser Diensttyp repräsentiert Shepherds @code{timer}-Dienst zur geplanten
Ausführung von Befehlen zu einem Zeitpunkt, ähnlich wie der altehrwürdige
@command{at}-Befehl. Hier sehen Sie ein Beispiel:

@example
herd schedule timer at 07:00 -- mpg123 Musik/alarm.mp3
@end example

Siehe @ref{Timer Service,,, shepherd, Handbuch von GNU Shepherd} für weitere
Informationen zum @code{timer}-Dienst.
@end defvar

@anchor{shepherd-system-log}
@cindex Systemprotokolldienst, von Shepherd
@cindex syslogd, Shepherds Systemprotokolldienst
@defvar shepherd-system-log-service-type
Dieser Dienst implementiert ein @dfn{Systemprotokoll}, was eingehende
Nachrichten von Anwendungen einliest, die an @file{/dev/log} gesendet
wurden, und diese in Dateien oder Terminals anhand vom Benutzer festgelegter
Regeln schreibt. Er stellt Funktionen bereit wie sie traditionell in
@command{syslogd}-Programmen zu finden sind.

Der Wert dieses Dienstes muss ein
@code{system-log-configuration}-Verbundsobjekt sein, wie im Folgenden
beschrieben.

Dieser Dienst gehört zu den @code{%base-services} (siehe @ref{Basisdienste}).
@end defvar

@c %start of fragment

@deftp {Datentyp} system-log-configuration
Verfügbare @code{system-log-configuration}-Felder sind:

@table @asis
@item @code{provision} (default: @code{(system-log syslogd)}) (type: list-of-symbols)
The name(s) of the system log service.

@item @code{requirement} (default: @code{(root-file-system)}) (type: list-of-symbols)
Dependencies of the system log service.

@item @code{kernel-log-file} (type: gexp-or-string-or-false)
File from which kernel messages are read, @file{/dev/kmsg} by default.

@item @code{message-destination} (default: @code{#f}) (type: gexp-or-false)
This gexp must evaluate to a procedure that, when passed a log message,
returns the list of files to write it to; @code{#f} is equivalent to using
@code{(default-message-destination-procedure)}.  @xref{System Log
Service,,,shepherd,The GNU Shepherd Manual}, for information on how to write
that procedure.

@item @code{date-format} (type: gexp-or-string)
String or string-valued gexp specifying how to format timestamps in log
files.  It must be a valid string for @code{strftime} (@pxref{Time,,,
guile,GNU Guile Reference Manual}), including delimiting space---e.g.,
@code{"%c "} for a format identical to that of traditional syslogd
implementations.

@item @code{history-size} (type: gexp-or-integer)
Number of logging messages kept in memory for the purposes of making them
available to @command{herd status system-log}.

@item @code{max-silent-time} (type: gexp-or-integer-or-false)
Time after which a mark is written to log files if nothing was logged during
that time frame.  When set to @code{#f}, this feature is disabled.

@end table

@end deftp


@c %end of fragment

@defvar %shepherd-root-service
Dieser Dienst repräsentiert PID@tie{}1.
@end defvar

@node Komplizierte Konfigurationen
@subsection Komplizierte Konfigurationen
@cindex komplizierte Konfigurationen
Einige Programme haben vielleicht ziemlich komplizierte
Konfigurationsdateien oder -formate. Sie können die Hilfsmittel, die in dem
Modul @code{(gnu services configuration)} definiert sind, benutzen, um das
Erstellen von Scheme-Anbindungen für diese Konfigurationsdateien leichter zu
machen.

Das Werkzeug der Wahl ist das Hilfs-Makro @code{define-configuration}, mit
dem Sie einen Scheme-Verbundstyp definieren (siehe @ref{Record Overview,,,
guile, Referenzhandbuch zu GNU Guile}). Ein Scheme-Verbund dieses Typs wird
zu einer Konfigurationsdatei serialisiert, indem für die enthaltenen Felder
ein @dfn{Serialisierer} aufgerufen werden kann. Das sind Prozeduren, die
einen Scheme-Wert nehmen und in einen anderen Scheme-Wert oder G-Ausdruck
übersetzen (siehe @ref{G-Ausdrücke}).

@defmac define-configuration Name Klausel1 Klausel2 …
Einen Verbundstyp mit dem Namen @code{@var{Name}} erstellen, der die in den
Klauseln gefundenen Felder enthalten wird.

Eine Klausel hat folgende Form:

@example
(@var{Feldname}
 @var{Typ-Deklaration}
 @var{Dokumentation}
 @var{Option*}
 …)
@end example

@var{Feldname} ist ein Bezeichner, der als Name des Feldes im erzeugten
Verbund verwendet werden wird.

@var{Typ-Deklaration} ist entweder nur @code{@var{Typ}}, wenn Nutzer für das
Feld einen Wert festlegen müssen, oder @code{(@var{Typ} @var{Vorgabewert})},
wenn nicht.

Mit @var{Typ} wird benannt, was als Typ des Werts für @var{Feldname} gelten
soll. Weil Guile typenlos ist, muss es eine entsprechend benannte
Prädikatprozedur @code{@var{Typ}?} geben, die auf dem Wert für das Feld
aufgerufen werden wird und prüft, dass der Wert des Feldes den geltenden Typ
hat. Wenn zum Beispiel @code{package} als @var{Typ} angegeben wird, wird
eine Prozedur namens @code{package?} auf den für das Feld angegebenen Wert
angewandt werden. Sie muss zurückliefern, ob es sich wirklich um ein
@code{<package>}-Objekt handelt.

@var{Vorgabewert} ist der Standardwert für das Feld; wenn keiner festgelegt
wird, muss der Benutzer einen Wert angeben, wenn er ein Objekt mit dem
Verbundstyp erzeugt.

@c XXX: Should these be full sentences or are they allow to be very
@c short like package synopses?
@var{Dokumentation} ist eine Zeichenkette, die mit Texinfo-Syntax formatiert
ist. Sie sollte eine Beschreibung des Feldes enthalten.

Als @var{Option*} schreiben Sie eine der folgenden Unterklauseln:

@table @asis
@item @code{empty-serializer}
Dieses Feld wird nicht serialisiert werden.

@item @code{(serializer @var{Serialisierer})}
@var{Serialisierer} ist der Name einer Prozedur, die zwei Argumente nimmt,
erstens den Namen des Feldes und zweitens den Wert für das Feld, und eine
Zeichenkette oder einen G-Ausdruck (siehe @ref{G-Ausdrücke}) zurückliefern
sollte, welcher Inhalt dafür in die Konfigurationsdatei serialisiert
wird. Wenn kein Serialisierer angegeben wird, wird eine Prozedur namens
@code{serialize-@var{Typ}} dafür aufgerufen.

Eine einfache Serialisiererprozedur könnte so aussehen:
@lisp
(define (serialize-boolean field-name value)
  (let ((value (if value "true" "false")))
    #~(string-append '#$field-name " = " #$value)))
@end lisp

@item @code{(sanitizer @var{Sanitisierer})}
@var{Sanitisierer} ist eine Prozedur, die ein Argument nimmt, welches vom
Dienstbenutzer bestimmt wird, und dafür einen „sanitisierten“ Wert
zurückliefert. Wenn kein Sanitisierer angegeben wird, wird ein vorgegebener
Sanitisierer verwendet, der einen Fehler meldet, wenn der Wert nicht den als
@var{Typ} genannten Datentyp hat.

So sieht ein Beispiel aus für einen Sanitisierer eines Feldes, der sowohl
Zeichenketten als auch Symbole zulässt:
@lisp
(define (sanitize-foo value)
  (cond ((string? value) value)
        ((symbol? value) (symbol->string value))
        (else (error "bad value"))))
@end lisp
@end table

Es kommt vor, dass in derselben Datei mehrere Arten von
Konfigurationsverbund definiert werden, deren Serialisierer sich für
denselben Typ unterscheiden, weil ihre Konfigurationen verschieden
formatiert werden müssen. Zum Beispiel braucht es eine andere
@code{serialize-boolean}-Prozedur für einen Getmail-Dienst als für einen
Transmission-Dienst. Um leichter mit so einer Situation fertig zu werden,
können Sie ein Serialisierer-Präfix nach dem Literal @code{prefix} in der
@code{define-configuration}-Form angeben. Dann müssen Sie den eigenen
@var{Serialisierer} @emph{nicht} für jedes Feld angeben.

@lisp
(define (foo-serialize-string field-name value)
  …)

(define (bar-serialize-string field-name value)
  …)

(define-configuration foo-configuration
  (label
   string
   "The name of label.")
  (prefix foo-))

(define-configuration bar-configuration
  (ip-address
   string
   "The IPv4 address for this device.")
  (prefix bar-))
@end lisp

In manchen Fällen wollen Sie vielleicht überhaupt gar keinen Wert aus dem
Verbund serialisieren. Dazu geben Sie das Literal @code{no-serialization}
an. Auch können Sie das Makro @code{define-configuration/no-serialization}
benutzen, was eine Kurzschreibweise dafür ist.

@lisp
;; Nichts wird auf die Platte serialisiert.
(define-configuration foo-configuration
  (field
   (string "test")
   "Some documentation.")
  (no-serialization))

;; Das Gleiche wie oben.
(define-configuration/no-serialization bar-configuration
  (field
   (string "test")
   "Some documentation."))
@end lisp
@end defmac

@defmac define-maybe Typ
Manchmal soll ein Feld dann @emph{nicht} serialisiert werden, wenn der
Benutzer keinen Wert dafür angibt. Um das zu erreichen, können Sie das Makro
@code{define-maybe} benutzen, um einen „maybe type“, zu Deutsch
„Vielleicht-Typ“, zu definieren. Wenn der Wert eines Vielleicht-Typs
@emph{nicht} gesetzt oder auf den Wert @code{%unset-value} gesetzt ist, wird
er nicht serialisiert.

Beim Definieren eines „Vielleicht-Typs“ ist die Voreinstellung, den dem
Grundtyp entsprechenden Serialisierer zu benutzen. Zum Beispiel wird ein
Feld vom Typ @code{maybe-string} nach Voreinstellung mit der Prozedur
@code{serialize-string} serialisiert. Natürlich können Sie stattdessen eine
eigene Serialisiererprozedur festlegen. Ebenso muss der Wert entweder den
Typ „string“ (also Zeichenkette) aufweisen oder unspezifiziert sein.

@lisp
(define-maybe string)

(define (serialize-string field-name value)
  …)

(define-configuration baz-configuration
  (name
   ;; Wenn eine Zeichenkette angegeben wird, wird diese mit der
   ;; Prozedur „serialize-string“ serialisiert werden.  Sonst
   ;; ist vorgegeben, für dieses Feld nichts zu serialisieren.
   maybe-string
   "The name of this module."))
@end lisp

Wie bei @code{define-configuration} kann man ein Präfix für
Serialisierernamen als Literal mit @code{prefix} angeben.

@lisp
(define-maybe integer
  (prefix baz-))

(define (baz-serialize-integer field-name value)
  …)
@end lisp

Auch gibt es das Literal @code{no-serialization}. Wenn es angegeben wird,
bedeutet das, es wird kein Serialisierer für den Vielleicht-Typ eingesetzt,
ganz gleich ob ein Wert gesetzt wurde oder
nicht. @code{define-maybe/no-serialization} ist eine Kurzschreibweise, um
das Literal @code{no-serialization} festzulegen.

@lisp
(define-maybe/no-serialization symbol)

(define-configuration/no-serialization test-configuration
  (mode
   maybe-symbol
   "Docstring."))
@end lisp
@end defmac

@deffn {Prozedur} maybe-value-set? Wert
Mit diesem Prädikat können Sie ermitteln, ob ein Benutzer für das
Vielleicht-Feld einen bestimmten Wert angegeben hat.
@end deffn

@deffn {Prozedur} serialize-configuration Konfiguration Felder
Liefert einen G-Ausdruck mit den Werten zu jedem der @var{Felder} im
Verbundsobjekt @var{Konfiguration}, das mit @code{define-configuration}
erzeugt wurde. Der G-Ausdruck kann mit z.B.@: @code{mixed-text-file} auf die
Platte serialisiert werden.
@end deffn

Nachdem Sie einen Konfigurationsverbundstyp definiert haben, haben Sie
bestimmt auch die Absicht, die Dokumentation dafür zu schreiben, um anderen
Leuten zu erklären, wie man ihn benutzt. Dabei helfen Ihnen die folgenden
zwei Prozeduren, die hier dokumentiert sind.

@deffn {Prozedur} generate-documentation Dokumentation Dokumentationsname
Ein Stück Texinfo aus den Docstrings in der @var{Dokumentation}
erzeugen. Als @var{Dokumentation} geben Sie eine Liste aus
@code{(@var{Bezeichnung} @var{Felder} @var{Unterdokumentation} ...)}
an. @var{Bezeichnung} ist ein Symbol und gibt den Namen des
Konfigurationsverbunds an. @var{Felder} ist eine Liste aller Felder des
Konfigurationsverbunds.

@var{sub-documentation} is a @code{(@var{field-name}
@var{configuration-name})} tuple.  @var{field-name} is the name of the field
which takes another configuration record as its value, and
@var{configuration-name} is the name of that configuration record.  The same
value may be used for multiple @var{field-name}s, in case a field accepts
different types of configurations.

Eine @var{Unterdokumentation} müssen Sie nur angeben, wenn es verschachtelte
Verbundstypen gibt. Zum Beispiel braucht ein Verbundsobjekt
@code{getmail-configuration} (siehe @ref{Mail-Dienste}) ein Verbundsobjekt
@code{getmail-configuration-file} in seinem @code{rcfile}-Feld, daher ist
die Dokumentation für @code{getmail-configuration-file} verschachtelt in der
von @code{getmail-configuration}.

@lisp
(generate-documentation
  `((getmail-configuration ,getmail-configuration-fields
     (rcfile getmail-configuration-file))
    …)
  'getmail-configuration)
@end lisp

Für @var{Dokumentationsname} geben Sie ein Symbol mit dem Namen des
Konfigurationsverbundstyps an.

@end deffn

@deffn {Prozedur} configuration->documentation Konfigurationssymbol
Für @var{Konfigurationssymbol}, ein Symbol mit dem Namen, der beim
Definieren des Konfigurationsverbundstyp mittels @code{define-configuration}
benutzt wurde, gibt diese Prozedur die Texinfo-Dokumentation seiner Felder
aus. Wenn es keine verschachtelten Konfigurationsfelder gibt, bietet sich
diese Prozedur an, mit der Sie  ausschließlich die Dokumentation der
obersten Ebene von Feldern ausgegeben bekommen.
@end deffn

Gegenwärtig gibt es kein automatisiertes Verfahren, um die Dokumentation zu
Konfigurationsverbundstypen zu erzeugen und gleich ins Handbuch
einzutragen. Stattdessen würden Sie jedes Mal, wenn Sie etwas an den
Docstrings eines Konfigurationsverbundstyps ändern, aufs Neue
@code{generate-documentation} oder @code{configuration->documentation} von
Hand aufrufen und die Ausgabe in die Datei @file{doc/guix.texi} einfügen.

@c TODO: Actually test this
Nun folgt ein Beispiel, wo ein Verbundstyp mit @code{define-configuration}
usw.@: erzeugt wird.

@lisp
(use-modules (gnu services)
             (guix gexp)
             (gnu services configuration)
             (srfi srfi-26)
             (srfi srfi-1))

;; Feldnamen, in Form von Scheme-Symbolen, zu Zeichenketten machen
(define (uglify-field-name field-name)
  (let ((str (symbol->string field-name)))
    ;; field? -> is-field
    (if (string-suffix? "?" str)
        (string-append "is-" (string-drop-right str 1))
        str)))

(define (serialize-string field-name value)
  #~(string-append #$(uglify-field-name field-name) " = " #$value "\n"))

(define (serialize-integer field-name value)
  (serialize-string field-name (number->string value)))

(define (serialize-boolean field-name value)
  (serialize-string field-name (if value "true" "false")))

(define (serialize-contact-name field-name value)
  #~(string-append "\n[" #$value "]\n"))

(define (list-of-contact-configurations? lst)
  (every contact-configuration? lst))

(define (serialize-list-of-contact-configurations field-name value)
  #~(string-append #$@@(map (cut serialize-configuration <>
                                contact-configuration-fields)
                           value)))

(define (serialize-contacts-list-configuration configuration)
  (mixed-text-file
   "contactrc"
   #~(string-append "[Owner]\n"
                    #$(serialize-configuration
                       configuration contacts-list-configuration-fields))))

(define-maybe integer)
(define-maybe string)

(define-configuration contact-configuration
  (name
   string
   "The name of the contact."
   serialize-contact-name)
  (phone-number
   maybe-integer
   "The person's phone number.")
  (email
   maybe-string
   "The person's email address.")
  (married?
   boolean
   "Whether the person is married."))

(define-configuration contacts-list-configuration
  (name
   string
   "The name of the owner of this contact list.")
  (email
   string
   "The owner's email address.")
  (contacts
   (list-of-contact-configurations '())
   "A list of @@code@{contact-configuration@} records which contain
information about all your contacts."))
@end lisp

Eine Kontaktelistekonfiguration könnte dann wie folgt erzeugt werden:

@lisp
(define my-contacts
  (contacts-list-configuration
   (name "Alice")
   (email "alice@@example.org")
   (contacts
    (list (contact-configuration
           (name "Bob")
           (phone-number 1234)
           (email "bob@@gnu.org")
           (married? #f))
          (contact-configuration
           (name "Charlie")
           (phone-number 0000)
           (married? #t))))))
@end lisp

Wenn Sie diese Konfiguration auf die Platte serialisierten, ergäbe sich so
eine Datei:

@example
[owner]
name = Alice
email = alice@@example.org

[Bob]
phone-number = 1234
email = bob@@gnu.org
is-married = false

[Charlie]
phone-number = 0
is-married = true
@end example


@c *********************************************************************
@cindex Problembehandlung, Guix System
@cindex Guix System, Problembehandlung
@node Problembehandlung bei Guix System
@chapter Problembehandlung bei Guix System

Guix System macht möglich, dass Sie einfach eine alte Systemgeneration
hochfahren, wenn sich die neueste als kaputt herausstellt. Dadurch ist Guix
System gegenüber unwiederbringlichem Gebrauchsverlust recht robust
aufgestellt. Das setzt allerdings voraus, dass GRUB richtig läuft. Wenn aus
irgendeinem Grund Ihre GRUB-Installation bei einer Rekonfiguration des
Systems gestört wird, sind Sie ausgesperrt und nicht mehr in der Lage, den
Rechner ohne Handgriffe in eine alte Generation zu starten. Für solche Fälle
schafft eine andere Technik Abhilfe: Mit @command{chroot} kommen Sie noch in
Ihr System hinein und können es mit @code{reconfigure} retten. Wie das geht,
wird hier erklärt.

@cindex chroot, Guix System
@cindex Rettungssystem, Guix System
@cindex GRUB reparieren, mit chroot
@menu
* Chroot ins vorliegende System::  Chroot ins vorliegende System
@end menu

@node Chroot ins vorliegende System
@section Chroot ins vorliegende System

In diesem Abschnitt wird erklärt, wie Sie mit @command{chroot} in ein
kaputtes Guix System hineinkommen, um es durch @code{reconfigure} auf eine
gültige Konfiguration zu bringen, etwa wenn GRUB beim letzten Mal falsch
installiert wurde. Auf anderen GNU/Linux-Systemen würde man ähnlich
vorgehen, aber Guix System ist in mancher Hinsicht anders, insbesondere muss
der Daemon laufen und Sie müssen Ihre Profile erreichen. Darauf geht diese
Erklärung ein.

@enumerate
@item
Beschaffen Sie ein bootfähiges Abbild von Guix System. Das neueste
Entwicklungs-Image wäre geeignet, weil darin der Kernel und die Werkzeuge
mindestens so neu sind wie im installierten System. Sie können es von der
URL
@url{https://ci.guix.gnu.org/search/latest/ISO-9660?query=spec:images+status:success+system:x86_64-linux+image.iso,
https://ci.guix.gnu.org} bekommen. Im Abschnitt @ref{Installation von USB-Stick oder DVD} wird erklärt, wie Sie das Image auf ein bootfähiges Medium
überspielen.

@item
Fahren Sie vom Medium mit dem Abbild den Rechner hoch und machen Sie die
ersten Schritte im grafischen textbasierten Installationsprogramm, bis die
Netzwerkverbindung eingerichtet ist. Alternativ können Sie die
Netzwerkverbindung manuell einrichten wie es im Abschnitt
@ref{manual-installation-networking} beschrieben ist. Sofern Sie den Fehler
@samp{RTNETLINK answers: Operation not possible due to RF-kill} zu sehen
bekommen, hilft vielleicht @samp{rfkill list} gefolgt von @samp{rfkill
unblock 0}, wobei @samp{0} Ihr Geräteidentifikator (ID) ist.

@item
Wechseln Sie zu einer virtuellen Konsole (TTY), falls noch nicht geschehen,
indem Sie die Tasten @kbd{Steuerungstaste + Alt + F4} gleichzeitig
drücken. Binden Sie Ihr Dateisystem unter @file{/mnt} ein. Angenommen Sie
haben Ihr Wurzeldateisystem auf der Partition @file{/dev/sda2}, dann geht
das mit diesen Befehlen:

@example sh
mount /dev/sda2 /mnt
@end example

@item
Binden Sie die blockorientierten Spezialgeräte und Linux-eigene
Verzeichnisse ein:

@example sh
mount --rbind /proc /mnt/proc
mount --rbind /sys /mnt/sys
mount --rbind /dev /mnt/dev
@end example

Sofern Ihr System EFI benutzt, müssen Sie auch die als ESP dienende
Partition einbinden. Wenn Sie bei Ihnen @file{/dev/sda1} heißt, lautet der
Befehl:

@example sh
mount /dev/sda1 /mnt/boot/efi
@end example

@item
Nun betreten Sie Ihr System als eine @command{chroot}-Umgebung:

@example sh
chroot /mnt /bin/sh
@end example

@item
Binden Sie das Systemprofil sowie das Profil von Ihrem @var{benutzer} ein,
damit die Umgebung vollständig ist. Mit @var{benutzer} ist hier der
Benutzername gemeint, den Sie auf dem Guix System haben, das Sie zu
reparieren versuchen:

@example sh
source /var/guix/profiles/system/profile/etc/profile
source /home/@var{benutzer}/.guix-profile/etc/profile
@end example

Damit Sie auch dieselbe Guix-Version zur Verfügung haben, die Sie
normalerweise in Ihrem Benutzerkonto haben, laden Sie mit @command{source}
auch Ihr aktuelles Guix-Profil:

@example sh
source /home/@var{benutzer}/.config/guix/current/etc/profile
@end example

@item
Starten Sie einen minimal funktionsfähigen @command{guix-daemon} als
Hintergrundprozess:

@example sh
guix-daemon --build-users-group=guixbuild --disable-chroot &
@end example

@item
Wenn es nötig ist, ändern Sie die Konfigurationsdatei Ihres Guix System,
damit sie wieder stimmt. Dann rekonfigurieren Sie etwa so:

@example sh
guix system reconfigure Ihre-config.scm
@end example

@item
Endlich sollte Ihr System so weit sein, dass Sie neustarten können und
ausprobieren, ob Sie es so in Ordnung gebracht haben.

@end enumerate

@node Persönliche Konfiguration
@chapter Persönliche Konfiguration
@cindex Persönliche Home-Umgebung konfigurieren
@c Maybe later, it will be possible to make home configuration a part of
@c system configuration to make everything managed by guix system.
Die Umgebung in Ihrem Persönlichen Verzeichnis können Sie mit Guix
einrichten, über eine deklarative Konfiguration dieser @dfn{Persönlichen
Umgebung} in einem @code{home-environment}-Objekt. Wir verwenden die
Konfigurationsmechanismen, die im vorangehenden Kapitel beschrieben wurden
(siehe @ref{Dienste definieren}), wenden diese aber auf die
Konfigurationsdateien („Dotfiles“) und Pakete des Benutzers an. Das geht
sowohl auf Guix System als auch auf Fremddistributionen. Jeder Benutzer kann
so alle Pakete und Dienste, die für ihn installiert und eingerichtet sein
sollen, deklarieren. Sobald man eine Datei mit einem
@code{home-environment}-Verbundsobjekt hat, kann man diese Konfiguration
@dfn{instanziieren} lassen, ohne besondere Berechtigungen auf dem System zu
haben. Dazu rufen Sie den Befehl @command{guix home} auf (siehe
@ref{Aufruf von guix home}).

Die Persönliche Umgebung eines Benutzers setzt sich für gewöhnlich aus drei
Grundbestandteilen zusammen: Software, Konfiguration und Zustand. In den
gängigsten Distributionen wird Software normalerweise systemweit für alle
Nutzer installiert, dagegen können die meisten Software-Pakete bei
GNU@tie{}Guix durch jeden Benutzer selbst installiert werden, ohne
Administratorrechte vorauszusetzen. Seine Software ist daher nur ein
weiterer Teil der Persönlichen Umgebung des Benutzers. Aber Pakete alleine
machen nicht glücklich, oft müssen sie erst noch konfiguriert werden, in der
Regel mit Konfigurationsdateien in @env{XDG_CONFIG_HOME} (nach
Voreinstellung bedeutet das in @file{~/.config}) oder anderen
Verzeichnissen. Übrig sind verschiedene Arten von Zustand, etwa
Mediendateien, Anwendungsdatenbanken und Protokolldateien.

Persönliche Umgebungen mit Guix zu verwalten bringt einige Vorteile:

@itemize

@item Alle Software kann in derselben Sprache konfiguriert werden
(Guile Scheme), wodurch Nutzer in die Lage versetzt werden, dieselben Werte
in die Konfigurationen verschiedener Programme einzusetzen.

@item Eine wohldefinierte Persönliche Umgebung ist eigenständig
und kann deklarativ und reproduzierbar verfasst werden. Binärdateien von
anderswo herunterzuladen oder eine Konfigurationsdatei von Hand zu
bearbeiten ist unnötig.

@item Nach jedem Aufruf von @command{guix home reconfigure} wird eine neue
Generation der Persönlichen Umgebung erzeugt. Dadurch können Benutzer zu
einer vorherigen Generation der Persönlichen Umgebung zurückwechseln, d.h.@:
sie müssen keine Sorgen haben, dass nach einer Änderung ihre Konfiguration
nicht mehr funktioniert.

@item Sie können sogar zustandsbehaftete Daten über Guix Home
verwalten. Dazu gehört etwa, Git-Repositorys automatisch zu klonen, wenn Sie
die Maschine zum ersten Mal einrichten, oder auch Befehle wie
@command{rsync} regelmäßig zu starten, um die Daten mit einem anderen
Rechner abzugleichen. Diese Funktionalität befindet sich jedoch noch auf
einer experimentellen Entwicklungsstufe.

@end itemize

@menu
* Deklaration der Persönlichen Umgebung::  Die Persönliche Umgebung 
                                             einrichten.
* Shell-Konfiguration::      Die Persönliche Umgebung aktivieren.
* Persönliche Dienste::      Dienste der Persönlichen Umgebung festlegen.
* Aufruf von guix home::     Die Konfiguration einer Persönlichen Umgebung 
                               instanziieren.
@end menu

@node Deklaration der Persönlichen Umgebung
@section Deklaration der Persönlichen Umgebung
Die Persönliche Umgebung können Sie konfigurieren, indem Sie eine
@code{home-environment}-Deklaration in einer Datei speichern, die Sie dem
Befehl @command{guix home} übergeben (siehe @ref{Aufruf von guix home}). Der
einfachste Einstieg gelingt, indem Sie mit @command{guix home import} eine
anfängliche Konfiguration erzeugen lassen:

@example
guix home import ~/src/guix-config
@end example

Durch den Befehl @command{guix home import} werden einige dieser „Dotfiles“
wie @file{~/.bashrc} aus Ihrem Persönlichen Verzeichnis gelesen und in das
angegebene Verzeichnis kopiert. In diesem Beispiel ist das
@file{~/src/guix-config}. Auch der Inhalt Ihres Profils in
@file{~/.guix-profile} wird gelesen und anhand davon wird eine Konfiguration
Ihrer Persönlichen Umgebung in
@file{~/src/guix-config/home-configuration.scm} erzeugt, die Ihrer
momentanen Konfiguration nachempfunden ist.

Zu einer einfachen Konfiguration kann z.B.@: Bash gehören zusammen mit einer
eigenen Textdatei wie im folgenden Beispiel. Zögern Sie nicht damit, in der
Persönlichen Umgebung etwas zu deklarieren, was mit Ihren bestehenden
Dotfiles überlappt, denn bevor irgendeine Konfigurationsdatei installiert
wird, legt Guix Home eine Sicherungskopie an einer anderen Stelle im
Persönlichen Verzeichnis ab.

@quotation Anmerkung
Wir empfehlen sehr, Ihre Shell oder Shells mit Guix Home zu verwalten, weil
dadurch sicherlich alle vorausgesetzten Skripte über @code{source}-Befehle
in die Shell-Konfiguration eingebunden werden. Andernfalls müssten Sie sie
von Hand einbinden (siehe @ref{Shell-Konfiguration}).
@end quotation

@findex home-environment
@vindex %base-home-services
@lisp
@include he-config-bare-bones.scm
@end lisp

Was das @code{packages}-Feld tut, sollte klar sein: Dadurch werden die
aufgelisteten Pakete in das Profil des Benutzers installiert. Das wichtigste
Feld ist @code{services}, was eine Liste @dfn{Persönlicher Dienste} zu
enthalten hat. Sie stellen die Grundbausteine einer Persönlichen Umgebung
dar.

Für Persönliche Dienste gibt es keinen Daemon (zumindest nicht
zwingend). Ein Persönlicher Dienst stellt nur ein Element dar, um einen
Aspekt einer Persönlichen Umgebung zu deklarieren bzw.@: andere Aspekte zu
erweitern. Dieser im vorherigen Kapitel erörterte Erweiterungsmechanismus
(siehe @ref{Dienste definieren}) sollte nicht verwechselt werden mit
Shepherd-Diensten (siehe @ref{Shepherd-Dienste}). Mit dem
Erweiterungsmechanismus und etwas Scheme-Code, um die Dinge
zusammenzubringen, haben Sie als Nutzer die Freiheit, eigens auf Sie
abgestimmte Persönliche Umgebungen zu entwerfen.

@cindex Container, bei @command{guix shell}
Wenn die Konfiguration brauchbar ausschaut, können Sie sie einem ersten Test
in einem Wegwerf-„Container“ unterziehen:

@example
guix home container config.scm
@end example

Dieser Befehl öffnet eine Shell, in der Ihre Persönliche Umgebung
läuft. Diese Shell befindet sich in einem Container, ist also vom übrigen
System isoliert. Deshalb können Sie Ihre Konfiguration so
ausprobieren@tie{}– Sie sehen, ob noch Teile der Konfiguration fehlen oder
falsches Verhalten bewirken, ob Daemons gestartet werden und so
weiter. Sobald Sie die Shell verlassen, haben Sie wieder die „wirkliche“
Eingabeaufforderung Ihrer ursprünglichen Shell vor sich.

Wenn Ihre Konfigurationsdatei so weit fertig ist und Ihrem Bedarf
entspricht, wird es Zeit, Ihre Persönliche Umgebung zu rekonfigurieren,
indem Sie diesen Befehl geben:

@example
guix home reconfigure config.scm
@end example

Dadurch wird Ihre Persönliche Umgebung @dfn{erstellt} und von
@file{~/.guix-home} darauf verwiesen. Geschafft!

@quotation Anmerkung
Achten Sie darauf, dass Ihr Betriebssystem mit elogind, systemd oder einem
entsprechenden Mechanismus das XDG-Laufzeitverzeichnis anlegt und die
Variable @env{XDG_RUNTIME_DIR} festlegt. Wenn nicht, kann das Skript
@file{on-first-login} nichts starten und Prozesse wie der benutzereigene
Shepherd und alles, was davon abhängt, fahren nicht hoch.
@end quotation

Wenn Sie Guix System benutzen, können Sie die Persönliche Konfiguration
innerhalb der Systemkonfiguration Ihrer Betriebssystemdeklaration vorgeben,
so dass mit @command{guix system reconfigure} beide, System- und Persönliche
Konfiguration, auf einen Schlag aufgespielt werden. Siehe dazu
@ref{guix-home-service-type, @code{guix-home-service-type}}.

@node Shell-Konfiguration
@section Shell-Konfiguration
Sie können den folgenden Abschnitt problemlos überspringen, wenn Ihre Shell
oder Shells mit Guix Home verwaltet werden. Wenn nicht, lesen Sie ihn bitte
genau.

Es gibt ein paar Skripte, die eine Login-Shell auswerten muss, damit die
Persönliche Umgebung aktiv wird. Die Dateien, die nur beim Starten von
Login-Shells geladen werden, tragen am Ende das Suffix @code{profile}. Mehr
Informationen über Login-Shells finden Sie in dem Referenzhandbuch von
GNU@tie{}Bash @ref{Invoking Bash,,, bash, hier} und @ref{Bash Startup
Files,,, bash, hier}.

Als Erstes wird @file{setup-environment} gesourcet, wodurch alle nötigen
Umgebungsvariablen festgelegt werden (einschließlich vom Benutzer
festgelegter Variabler) und als Zweites wird mit @file{on-first-login}
Shepherd für den angemeldeten Benutzer gestartet und die über andere
Persönliche Dienste deklarierten Aktionen durchgeführt, wenn die Dienste
@code{home-run-on-first-login-service-type} erweitern.

Guix Home wird immer @file{~/.profile} mit den folgenden Zeilen darin
anlegen:

@example
HOME_ENVIRONMENT=$HOME/.guix-home
. $HOME_ENVIRONMENT/setup-environment
$HOME_ENVIRONMENT/on-first-login
@end example

Dadurch werden POSIX-konforme Login-Shells die Persönliche Umgebung
aktivieren. Jedoch wird diese Datei in der Regel von den meisten modernen
Shells @emph{nicht} gelesen, weil sie nach Voreinstellung @emph{nicht} im
POSIX-Modus laufen und stattdessen ihre eigenen @file{*profile}-Dateien beim
Start laden. Zum Beispiel wird Bash der Datei @file{~/.bash_profile} den
Vorzug geben, wenn diese existiert, und nur falls sie @emph{nicht}
existiert, liest Bash die Datei @file{~/.profile}. Zsh (wenn ihr keine
zusätzlichen Argumente übergeben wurden) ignoriert @file{~/.profile}
grundsätzlich, auch wenn @file{~/.zprofile} fehlt.

Damit Ihre Shell @file{~/.profile} doch beachtet, tragen Sie
@code{. ~/.profile} oder @code{source ~/.profile} in die beim Start gelesene
Datei der Login-Shell ein. Im Fall von Bash ist dies @file{~/.bash_profile}
und für Zsh ist es @file{~/.zprofile}.

@quotation Anmerkung
Dieser Schritt fällt weg, wenn Sie Guix Home Ihre Shell verwalten
lassen. Dann nämlich liefe all das vollautomatisch ab.
@end quotation

@node Persönliche Dienste
@section Persönliche Dienste
@cindex Persönliche Dienste

Als @dfn{Persönlichen Dienst} (englisch „Home Service“) bezeichnen wir nicht
nur Software, die über einen durch Shepherd verwalteten Daemon gestartet
wird (siehe @ref{Jump Start,,, shepherd, Handbuch von GNU Shepherd}), denn
darum geht es meistens gar nicht. Ein Persönlicher Dienst bedeutet lediglich
ein Baustein der Persönlichen Umgebung, mit dem so etwas deklariert wird wie
eine Auswahl in die Persönliche Umgebung zu installierender Pakete, eine
Reihe von Konfigurationsdateien, für die symbolische Verknüpfungen in
@env{XDG_CONFIG_HOME} (nach Voreinstellung ist @file{~/.config} gemeint)
angelegt werden oder für Login-Shells festgelegte Umgebungsvariable.

Ein Diensterweiterungsmechanismus (siehe @ref{Dienstkompositionen})
ermöglicht es Persönlichen Diensten, andere Persönliche Dienste zu erweitern
und so auf die von ihnen bereits angebotenen Fähigkeiten
zurückzugreifen. Beispielsweise kann für einen Dienst ein mcron-Auftrag
(siehe @ref{Top,,, mcron, GNU@tie{}Mcron}) deklariert werden, indem man ihn
den Persönlichen Mcron-Dienst erweitern lässt (siehe @ref{Persönlicher Mcron-Dienst}); ein Daemon wird deklariert, indem man ihn den Persönlichen
Shepherd-Dienst erweitern lässt (siehe @ref{Persönlicher Shepherd-Dienst}); für
Bash werden neue Befehle festgelegt, indem man den Persönlichen Shell-Dienst
für Bash erweitern lässt (siehe @ref{Persönliche Shell-Dienste,
@code{home-bash-service-type}}.

Über die verfügbaren Persönlichen Dienste können Sie sich mit dem Befehl
@command{guix home search} informieren (siehe @ref{Aufruf von guix home}). Wenn Sie die gewünschten Persönlichen Dienste gefunden haben, fügen
Sie das entsprechende Modul ein, indem Sie die @code{use-modules}-Form für
das Modul angeben (siehe @ref{use-modules,, Using Guile Modules, guile,
Referenzhandbuch von GNU Guile}) oder alternativ das Modul in der
@code{#:use-modules}-Direktive Ihres eigenen Moduls nennen (siehe
@ref{define-module,, Creating Guile Modules, guile, Referenzhandbuch zu GNU
Guile}). Dann deklarieren Sie einen Persönlichen Dienst über die Funktion
@code{service} oder Sie erweitern einen Dienst über die Prozedur
@code{simple-service} aus @code{(gnu services)}.

@menu
* Essenzielle Persönliche Dienste::  Umgebungsvariable, Pakete, 
                                       on-*-Skripte.
* Shells: Persönliche Shell-Dienste.  POSIX-Shells, Bash, Zsh.
* Mcron: Persönlicher Mcron-Dienst.  Geplante Auftragsausführung durch 
                                       Benutzer.
* Stromverbrauch: Persönliche Dienste zur Stromverbrauchsverwaltung.  Dienste 
                                                                        zum 
                                                                        Batterieverbrauch.
* Shepherd: Persönlicher Shepherd-Dienst.  Des Benutzers Daemons verwalten.
* SSH: Secure Shell.         Den Secure-Shell-Client einrichten.
* GPG: GNU Privacy Guard.    Einrichten von GPG und was dazugehört.
* Desktop: Persönliche Desktop-Dienste.  Dienste für grafische Umgebungen.
* Guix: Persönliche Guix-Dienste.  Dienste zu Guix.
* Backup: Backup Home Services.  Services for backing up User's files.
* Schriftarten: Persönliche Schriftarten-Dienste.  Schriftarten je Benutzer.
* Audio: Persönliche Tondienste.  Ton regeln.
* Mail: Persönliche Maildienste.  Dienste, um E-Mail einzurichten.
* Kurznachrichten: Persönliche Kurznachrichtendienste.  Messaging managen.
* Medien: Persönliche Mediendienste.  Zum Umgang mit Medien.
* Niri: Niri window manager.  Setting up the Niri.
* Sway: Sway-Fensterverwaltung.  Anlegen der Sway-Konfiguration.
* Netzwerk: Persönliche Netzwerkdienste.  Netzwerkdienste.
* Secrets: Secrets Home Services.  Services for storing secrets.
* Verschiedenes: Verschiedene Persönliche Dienste.  Weitere Dienste.
@end menu
@c In addition to that Home Services can provide

@node Essenzielle Persönliche Dienste
@subsection Essenzielle Persönliche Dienste
Ein paar grundlegende Persönliche Dienste sind auch in @code{(gnu home
services)} definiert; sie sind in erster Linie zur internen Nutzung und für
die Erstellung der Persönlichen Umgebung gedacht, aber manche sind auch für
Endanwender interessant.

@cindex Umgebungsvariable

@defvar home-environment-variables-service-type
Der Dienst mit diesem Diensttyp wird von jeder Persönlichen Umgebung
automatisch instanziiert; so sind die Vorgabeeinstellungen. Sie müssen ihn
also nicht definieren, aber vielleicht möchten Sie Ihn erweitern mit einer
Liste von Paaren zum Festlegen von Umgebungsvariablen (englisch „Environment
Variables“).

@lisp
(list ("ENV_VAR1" . "Wert1")
      ("ENV_VAR2" . "Wert2"))
@end lisp

Es ist am einfachsten, ihn zu erweitern, ohne einen neuen Dienst zu
definieren, nämlich indem Sie das @code{simple-service}-Helferlein aus dem
Modul @code{(gnu services)} einsetzen.

@findex literal-string
@lisp
(simple-service 'einige-hilfreiche-umgebungsvariable-service
		home-environment-variables-service-type
		`(("LESSHISTFILE" . "$XDG_CACHE_HOME/.lesshst")
                  ("SHELL" . ,(file-append zsh "/bin/zsh"))
                  ("USELESS_VAR" . #f)
                  ("_JAVA_AWT_WM_NONREPARENTING" . #t)
                  ("LITERAL_VALUE" . ,(literal-string "$@{abc@}"))))
@end lisp

Wenn Sie einen solchen Dienst in die Definition Ihrer Persönlichen Umgebung
aufnehmen, fügt das folgenden Inhalt in Ihr @file{setup-environment}-Skript
ein (das von Ihrer Login-Shell gesourcet werden dürfte):

@example
export LESSHISTFILE="$XDG_CACHE_HOME/.lesshst"
export SHELL="/gnu/store/2hsg15n644f0glrcbkb1kqknmmqdar03-zsh-5.8/bin/zsh"
export _JAVA_AWT_WM_NONREPARENTING
export LITERAL_VALUE='$@{abc@}'
@end example

Sie sehen, wie wir hier mit @code{literal-string} deklarieren können, dass
ein Wert als @dfn{literale Zeichenkette} aufgefasst werden soll, also dass
„besondere Zeichen“ wie das Dollarzeichen darin nicht durch die Shell
interpretiert werden sollen.

@quotation Anmerkung
Achten Sie darauf, dass das Modul @code{(gnu packages shells)} mit
@code{use-modules} oder Ähnlichem importiert wird, denn durch den @code{(gnu
packages shells)}-Namensraum wird die Definition des @code{zsh}-Pakets
verfügbar gemacht, auf die obiges Beispiel Bezug nimmt.
@end quotation

Wir verwenden hier eine assoziative Liste (siehe @ref{Association Lists,
alists, Association Lists, guile, Referenzhandbuch von GNU Guile}). Das ist
eine Datenstruktur aus Schlüssel-Wert-Paaren und für
@code{home-environment-variables-service-type} ist der Schlüssel immer eine
Zeichenkette und der Wert entweder eine Zeichenkette, ein G-Ausdruck für
Zeichenketten (siehe @ref{G-Ausdrücke}), ein dateiartiges Objekt (siehe
@ref{G-Ausdrücke, dateiartige Objekte}) oder ein Boolescher Ausdruck. Im
Fall von G-Ausdrücken wird die Variable auf den Wert des G-Ausdrucks
festgelegt, bei dateiartigen Objekten auf den Pfad der Datei im Store (siehe
@ref{Der Store}), bei @code{#t} wird die Variable ohne Wert exportiert und
bei @code{#f} wird sie ganz weggelassen.

@end defvar

@defvar home-profile-service-type
Der Dienst dieses Typs wird durch jede Persönliche Umgebung automatisch
instanziiert. Sie müssen ihn nicht erst definieren. Vielleicht wollen Sie
ihn aber um eine Liste von Paketen erweitern, wenn Sie weitere Pakete in Ihr
Profil installieren wollen. Wenn andere Dienste Programme für den Nutzer
verfügbar machen müssen, erweitern diese dazu auch diesen Diensttyp.

Als Wert der Erweiterung muss eine Liste von Paketen angegeben werden:

@lisp
(list htop vim emacs)
@end lisp

Hier können Sie den gleichen Ansatz wie bei @code{simple-service} (siehe
@ref{Service-Referenz, simple-service}) für
@code{home-environment-variables-service-type} fahren. Achten Sie darauf,
die Module mit den angegebenen Paketen über etwas wie @code{use-modules} zu
importieren. Um ein Paket oder Informationen über das es enthaltende Modul
zu finden, hilft Ihnen @command{guix search} (siehe @ref{Aufruf von guix package}). Alternativ können Sie @code{specification->package} einsetzen, um
das Paketverbundsobjekt anhand einer Zeichenkette zu spezifizieren; dann
brauchen Sie auch das zugehörige Modul @emph{nicht} zu laden.
@end defvar

Es gibt noch mehr essenzielle Dienste, von denen wir aber nicht erwarten,
dass Nutzer sie erweitern.

@defvar home-service-type
Die Wurzel des gerichteten azyklischen Graphen aus Persönlichen
Diensten. Damit wird ein Verzeichnis erzeugt, auf das später die symbolische
Verknüpfung @file{~/.guix-home} verweist und das Konfigurationsdateien, das
Profil mit Binärdateien und Bibliotheken sowie ein paar notwendige Skripte
enthält, die die Dinge zusammenhalten.
@end defvar

@defvar home-run-on-first-login-service-type
Mit dem Dienst dieses Diensttyps wird ein Guile-Skript erzeugt, das von der
Login-Shell ausgeführt werden soll. Es wird dabei nur dann ausgeführt, wenn
eine besondere Signaldatei in @env{XDG_RUNTIME_DIR} @emph{nicht} vorgefunden
wird, wodurch das Skript nicht unnötig ausgeführt wird, wenn mehrere
Login-Shells geöffnet werden.

Man kann den Diensttyp mit einem G-Ausdruck erweitern. Allerdings sollten
Nutzer diesen Dienst @emph{nicht} dazu gebrauchen, Anwendungen automatisch
zu starten, denn das macht man besser über Erweiterungen des
@code{home-shepherd-service-type} durch einen Shepherd-Dienst (siehe
@ref{Shepherd-Dienste}) oder über eine Erweiterung der von der Shell beim
Start geladenen Datei um den benötigten Befehl und mittels des für diese Art
Shell geeigneten Diensttyps.
@end defvar

@defvar home-files-service-type
Mit dem Dienst dieses Typs können Sie eine Liste von Dateien angeben, die in
@file{~/.guix-home/files} platziert werden; normalerweise stehen in diesem
Verzeichnis Konfigurationsdateien (genauer gesagt stehen dort symbolische
Verknüpfungen auf die eigentlichen Konfigurationsdateien in
@file{/gnu/store}), die dann in @file{$XDG_CONFIG_HOME} oder in seltenen
Fällen nach @file{$HOME} kopiert werden sollen. Der Dienst kann erweitert
werden mit Werten im folgenden Format:

@lisp
`((".sway/config" ,sway-dateiartig)
  (".tmux.conf" ,(local-file "./tmux.conf")))
@end lisp

Jede verschachtelte Liste enthält zwei Werte: ein Unterverzeichnis und ein
dateiartiges Objekt. Nachdem Sie die Persönliche Umgebung erstellt haben,
wird in @file{~/.guix-home/files} der entsprechende Inhalt eingefügt und
alle Unterverzeichnisse werden dazu erzeugt. Allerdings kümmert sich ein
anderer Dienst darum, die Dateien dann weiter zu verteilen. Vorgegeben ist,
dass ein @code{home-symlink-manager-service-type} die notwendigen
symbolischen Verknüpfungen im Persönlichen Verzeichnis auf Dateien aus
@file{~/.guix-home/files} anlegt und Sicherungskopien bereits bestehender,
im Konflikt stehender Konfigurationsdateien und anderer Dateien
anlegt. Dieser symlink-manager gehört zu den essenziellen Persönlichen
Diensten (die nach Vorgabeeinstellungen aktiviert sind), aber es ist
möglich, dass Sie alternative Dienste benutzen, um fortgeschrittenere
Anwendungsfälle wie ein nur lesbares Persönliches Verzeichnis
hinzukriegen. Sie sind eingeladen, zu experimentieren und Ihre Ergebnisse zu
teilen.
@end defvar

@cindex Dotfiles in Guix Home
Häufig trifft man auf Benutzer von Guix Home, die zuvor ein anderes
Verfahren zum Versionieren ihrer Konfigurationsdateien (d.h.@: ihrer
@emph{Dotfiles}) in einem einzelnen Verzeichnis benutzt haben, zusammen mit
einer Technik, um Änderungen daran ins Persönliche Verzeichnis einzuspielen.

@cindex Stow-artige Dotfile-Verwaltung
Mit dem Diensttyp @code{home-dotfiles-service-type} aus @code{(gnu home
services dotfiles)} wird der Umstieg auf Guix Home für diese Nutzergruppe
leicht gemacht. Dazu verweisen Sie einen Dienst dieses Typs auf das
Verzeichnis mit den Dotfiles, damit Dotfiles automatisch ins Persönliche
Verzeichnis des Benutzers übertragen werden, ohne dass auf die von Guix
vorgegebene Struktur umgestellt werden müsste.

Bitte denken Sie daran, dass es eine gute Idee ist, die
Dotfiles-Verzeichnisse unter Versionskontrolle zu stellen, zum Beispiel in
demselben Repository, in dem Sie Ihre Guix-Home-Konfiguration organisieren.

Möglich sind bislang zwei Verzeichnislayouts für Dotfiles. Beim Layout
@code{'plain} wird folgende Struktur des Verzeichnisses erwartet:

@example
~$ tree -a ./dotfiles/
dotfiles/
├── .gitconfig
├── .gnupg
│   ├── gpg-agent.conf
│   └── gpg.conf
├── .guile
├── .config
│   ├── guix
│   │   └── channels.scm
│   └── nixpkgs
│       └── config.nix
├── .nix-channels
├── .tmux.conf
└── .vimrc
@end example

Diese Baumstruktur wird genau so in das Persönliche Verzeichnis installiert,
wenn Sie @command{guix home reconfigure} ausführen.

Das Layout @code{'stow}, welches so aufgebaut sein muss, wie
@uref{https://www.gnu.org/software/stow/, GNU Stow} es empfiehlt, verfügt
über eine zusätzliche Verzeichnisschicht für jede Anwendung, etwa:

@example
~$ tree -a ./dotfiles/
dotfiles/
├── git
│   └── .gitconfig
├── gpg
│   └── .gnupg
│       ├── gpg-agent.conf
│       └── gpg.conf
├── guile
│   └── .guile
├── guix
│   └── .config
│       └── guix
│           └── channels.scm
├── nix
│   ├── .config
│   │   └── nixpkgs
│   │       └── config.nix
│   └── .nix-channels
├── tmux
│   └── .tmux.conf
└── vim
    └── .vimrc

13 directories, 10 files
@end example

Eine informelle Spezifikation finden Sie im Handbuch von Stow (siehe
@ref{Introduction,,, stow, Handbuch von GNU Stow}). Die Baumstruktur wird
dann nach dem Verfahren von GNU Stow ins Persönliche Verzeichnis
installiert, wenn Sie @command{guix home reconfigure} ausführen.

Eine passende Konfiguration mit dem @code{'plain}-Layout könnte so aussehen:

@lisp
(home-environment
  ;; …
  (services
    (service home-dotfiles-service-type
             (home-dotfiles-configuration
               (directories '("./dotfiles"))))))
@end lisp

Erwartungsgemäß würden Sie das Persönliche Verzeichnis dann in diesem
Zustand vorfinden:

@example
.
├── .config
│   ├── guix
│   │   └── channels.scm
│   └── nixpkgs
│       └── config.nix
├── .gitconfig
├── .gnupg
│   ├── gpg-agent.conf
│   └── gpg.conf
├── .guile
├── .nix-channels
├── .tmux.conf
└── .vimrc
@end example

@defvar home-dotfiles-service-type
Liefert einen Dienst sehr ähnlich wie @code{home-files-service-type} (der
sogar als Erweiterung für diesen implementiert ist), der aber so gestaltet
ist, dass Benutzer, die ihre Dotfiles bisher schon in einem Verzeichnis
nachvollziehbar aufbewahren, leicht auf Guix Home überwechseln können. Mit
dem Dienst wird Guix Home auf das Dotfiles-Verzeichnis verwiesen, damit die
Dateien automatisch ins Persönliche Verzeichnis eingespielt werden, ohne
dass Sie alle Dotfiles an die von Guix vorgegebene Konfigurationsweise
anpassen müssten.
@end defvar

@c %start of fragment

@deftp {Datentyp} home-dotfiles-configuration
Verfügbare @code{home-dotfiles-configuration}-Felder sind:

@table @asis
@item @code{source-directory} (Vorgabe: @code{(current-source-directory)}) (Typ: Zeichenkette)
Der Pfad, bei dem die Auflösung der Dotfiles enthaltenden Verzeichnisse
beginnen soll. Vorgegeben ist, dass die Verzeichnisse mit Dotfiles relativ
zu der Stelle im Dateisystem, an der @code{home-dotfiles-configuration}
benutzt wird, als Quellort aufgelöst werden.

@item @code{layout} (Vorgabe: @code{'plain}) (Typ: Symbol)
Welches Layout im angegebenen Verzeichnis vorliegt. Möglich ist entweder
@code{'stow} oder @code{'plain}.

@item @code{directories} (Vorgabe: @code{'()}) (Typ: Liste-von-Zeichenketten)
Die Liste der Dotfiles enthaltenden Verzeichnisse. Dort wird
@code{home-dotfiles-service-type} nach den Dotfiles von Anwendungen suchen.

@item @code{packages} (Typ: Vielleicht-Liste-von-Zeichenketten)
Die Namen eines Teils der Verzeichnisse im Paketlayout von GNU Stow. Wenn
Sie welche angeben, wird @code{home-dotfiles-service-type} nur die Dotfiles
aus dieser Teilmenge von Anwendungen einspielen. Dieses Feld wird beim
Layout @code{'plain} ignoriert.

@item @code{excluded} (Vorgabe: @code{'(".*~" ".*\\.swp" "\\.git" "\\.gitignore")}) (Typ: Liste-von-Zeichenketten)
Die Liste von Mustern, welche Dateien @code{home-dotfiles-service-type} auf
der Suche nach Dotfiles beim Besuchen jedes in @code{directories}
aufgeführten Verzeichnisses ausschließen soll.

@end table

@end deftp


@c %end of fragment

@defvar home-xdg-configuration-files-service-type
Dieser Dienst ist @code{home-files-service-type} sehr ähnlich (und intern
erweitert er ihn auch), aber damit werden Dateien definiert, die in
@file{~/.guix-home/files/.config} platziert werden, für welche dann eine
symbolische Verknüpfung in @file{$XDG_CONFIG_HOME} mittels
@code{home-symlink-manager-service-type} (beispielsweise) angelegt wird,
wenn die Persönliche Umgebung aktiviert wird. Er kann erweitert werden um
Werte im folgenden Format:

@lisp
`(("sway/config" ,sway-dateiartig)
  ;; -> ~/.guix-home/files/.config/sway/config
  ;; -> $XDG_CONFIG_HOME/sway/config (mittels symlink-manager)
  ("tmux/tmux.conf" ,(local-file "./tmux.conf")))
@end lisp
@end defvar

@defvar home-activation-service-type
Mit dem Dienst dieses Diensttyps wird ein Guile-Skript erzeugt, das bei
jedem Aufruf von @command{guix home reconfigure} und jeder anderen Aktion
ausgeführt wird. Damit wird die Persönliche Umgebung aktiviert.
@end defvar

@defvar home-symlink-manager-service-type
Mit dem Dienst dieses Diensttyps wird ein Guile-Skript erzeugt, das bei der
Aktivierung der Persönlichen Umgebung ausgeführt wird. Um die symbolischen
Verknüpfungen zu verwalten, tut es ein paar Dinge, nämlich:

@enumerate
@item
Der Inhalt jedes @file{files/}-Verzeichnisses der aktuellen und der
künftigen Persönlichen Umgebung wird eingelesen.

@item
Alle symbolischen Verknüpfungen, die bei der vorherigen Aktivierung durch
symlink-manager erzeugt wurden, werden gelöst. Wenn dadurch
Unterverzeichnisse leer werden, werden sie gelöscht.

@item
Neue symbolische Verknüpfungen werden auf folgende Weise erzeugt: Es wird
jedes @file{files/}-Verzeichnis durchsucht (diese werden in der Regel mit
@code{home-files-service-type},
@code{home-xdg-configuration-files-service-type} und vielleicht anderen
Diensten definiert) und für die Dateien aus dem Unterverzeichnis
@file{files/.config/} werden entsprechende Verknüpfungen in
@env{XDG_CONFIG_HOME} abgelegt. Zum Beispiel landet eine symbolische
Verknüpfung zu @file{files/.config/sway/config} in
@file{$XDG_CONFIG_HOME/sway/config}. Die anderen Dateien in @file{files/}
außerhalb des Unterverzeichnisses @file{files/.config/} werden ein wenig
anders behandelt: Die symbolischen Verknüpfungen werden dafür in
@file{$HOME} abgelegt. @file{files/.ein-programm/config} landet also in
@file{$HOME/.ein-programm/config}.

@item
Fehlende Unterverzeichnisse werden erzeugt.

@item
Wenn es schon eine Datei mit so einem Namen gibt, wird von der im Konflikt
stehenden Datei eine Sicherungskopie behalten.

@end enumerate

symlink-manager ist Teil der essenziellen Persönlichen Dienste und ist somit
nach Vorgabeeinstellungen aktiviert und wird benutzt.
@end defvar


@node Persönliche Shell-Dienste
@subsection Shells

@cindex shell
@cindex Login-Shell
@cindex interaktive Shell
@cindex bash
@cindex zsh

Shells spielen eine ziemlich wichtige Rolle bei der Initialisierung der
Umgebung. Sie können Ihre Shells selbst einrichten, wie im Abschnitt
@ref{Shell-Konfiguration} beschrieben, aber empfehlen tun wir, dass Sie
die folgend aufgeführten Dienste benutzen. Das ist sowohl leichter als auch
zuverlässiger.

Jede Persönliche Umgebung instanziiert
@code{home-shell-profile-service-type}, was eine Datei @file{~/.profile}
erzeugt, die von allen POSIX-kompatiblen Shells geladen wird. In der Datei
sind alle Schritte enthalten, die nötig sind, um die Umgebung ordnungsgemäß
zu initialisieren. Allerdings bevorzugen viele moderne Shells wie Bash oder
Zsh, ihre eigenen Dateien beim Starten zu laden. Darum brauchen wir für
diese jeweils einen Persönlichen Dienst (@code{home-bash-service-type} und
@code{home-zsh-service-type}), um dafür zu sorgen, dass @file{~/.profile}
durch @file{~/.bash_profile} bzw.@: @file{~/.zprofile} gesourcet werden.

@subsubheading Shell-Profil-Dienst

@deftp {Datentyp} home-shell-profile-configuration
Verfügbare @code{home-shell-profile-configuration}-Felder sind:

@table @asis
@item @code{profile} (Vorgabe: @code{'()}) (Typ: Konfigurationstexte)
Ein @code{home-shell-profile}-Dienst wird durch die Persönliche Umgebung
automatisch instanziiert. Legen Sie den Dienst also @emph{bloß nicht}
manuell an; Sie können ihn lediglich erweitern. Für @code{profile} wird eine
Liste dateiartiger Objekte erwartet, die in die Datei @file{~/.profile}
aufgenommen werden. Nach Vorgabe enthält @file{~/.profile} nur den Code zur
Initialisierung, der von Login-Shells ausgeführt werden muss, um die
Persönliche Umgebung für den Benutzer verfügbar zu machen. Andere Befehle
können hier auch in die Datei eingefügt werden, wenn sie wirklich unbedingt
dort stehen müssen. In den meisten Fällen schreibt man sie besser in die
Konfigurationsdateien der Shell, wenn man eigene Anpassungen
wünscht. Erweitern Sie den @code{home-shell-profile}-Dienst nur dann, wenn
Sie wissen, was Sie tun.

@end table

@end deftp

@subsubheading Persönlicher Bash-Dienst

@c %start of fragment
@anchor{home-bash-configuration}

@deftp {Datentyp} home-bash-configuration
Verfügbare @code{home-bash-configuration}-Felder sind:

@table @asis
@item @code{package} (Vorgabe: @code{bash}) (Typ: „package“)
Das Bash-Paket, was benutzt werden soll.

@item @code{guix-defaults?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Add sane defaults like setting @env{PS1}, @env{SHELL}, and ensuring
@file{/etc/profile} is sourced for non-interactive SSH shells.  If you use
Guix System, is it safe to set this to @code{#f}, as in this case this is
already taken care of by the globally installed @file{/etc/bashrc}.

@item @code{environment-variables} (default: @code{()}) (type: alist)
Eine assoziative Liste der Umgebungsvariablen, die für die Bash-Sitzung
gesetzt sein sollen. Dieselben Regeln wie für den
@code{home-environment-variables-service-type} gelten auch hier (siehe
@ref{Essenzielle Persönliche Dienste}). Der Inhalt dieses Felds wird anschließend an
das, was im @code{bash-profile}-Feld steht, angefügt.

@item @code{variables} (default: @code{()}) (type: alist)
Bash variables (not to be confused with environment variables) to be set in
@file{.bashrc} for use by interactive shells.  A typical example of such
variables is @code{HISTSIZE} and related history variables (@pxref{Bash
Variables,,, bash,Bash Reference Manual}).

@item @code{aliases} (type: alist)
Assoziative Liste der Alias-Namen, welche für die Bash-Sitzung eingerichtet
werden sollen. Die Alias-Namen werden nach dem Inhalt des
@code{bashrc}-Feldes in der Datei @file{.bashrc} definiert. Jeder Alias-Name
steht automatisch in Anführungszeichen, d.h.@: ein Eintrag wie:

@lisp
'(("ls" . "ls -alF"))
@end lisp

wird zu

@example
alias ls="ls -alF"
@end example

@item @code{bash-profile} (default: @code{()}) (type: text-config)
Eine Liste dateiartiger Objekte, die in @file{.bash_profile} eingefügt
werden. Damit können benutzereigene Befehle beim Start der Login-Shell
ausgeführt werden. (In der Regel handelt es sich um die Shell, die gestartet
wird, direkt nachdem man sich auf der Konsole (TTY) anmeldet.)
@file{.bash_login} wird niemals gelesen, weil @file{.bash_profile} immer
existiert.

@item @code{bashrc} (default: @code{()}) (type: text-config)
Eine Liste dateiartiger Objekte, die in @file{.bashrc} eingefügt
werden. Damit können benutzereigene Befehle beim Start einer interaktiven
Shell ausgeführt werden. (Interaktive Shells sind Shells für interaktive
Nutzung, die man startet, indem man @code{bash} eintippt oder die durch
Terminal-Anwendungen oder andere Programme gestartet werden.)

@item @code{bash-logout} (default: @code{()}) (type: text-config)
Eine Liste dateiartiger Objekte, die zu @file{.bash_logout} hinzugefügt
werden. Damit können benutzereigene Befehle beim Verlassen der Login-Shell
ausgeführt werden. Die Datei wird in manchen Fällen @emph{nicht} gelesen
(wenn die Shell zum Beispiel durch exec eines anderen Prozesses terminiert).

@end table

@end deftp


@c %end of fragment

Sie können den Bash-Dienst mit Hilfe einer Konfiguration im Verbundsobjekt
@code{home-bash-extension} erweitern. Dessen Felder spiegeln meistens die
von @code{home-bash-configuration} (siehe
@ref{home-bash-configuration}). Die Inhalte der Erweiterungen werden ans
Ende der zugehörigen Bash-Konfigurationsdateien angehängt (siehe @ref{Bash
Startup Files,,, bash, Referenzhandbuch von GNU Bash}.

Zum Beispiel können Sie so einen Dienst definieren, der den Bash-Dienst
erweitert, um in @file{~/.bash_profile} eine weitere Shell-Variable
@env{PS1} definieren zu lassen:

@lisp
(define bash-tolle-eingabeaufforderung-service
  (simple-service 'bash-tolle-eingabeaufforderung
                  home-bash-service-type
                  (home-bash-extension
                   (variables
                    '(("PS1" . "\\u \\wλ "))))))
@end lisp

Den Dienst @code{bash-tolle-eingabeaufforderung-service} würden Sie
anschließend ins @code{services}-Feld im @code{home-environment} Ihrer
Persönlichen Umgebung eintragen. Nun folgt die Referenz zu
@code{home-bash-extension}.

@c %start of fragment

@deftp {Datentyp} home-bash-extension
Verfügbare @code{home-bash-extension}-Felder sind:

@table @asis
@item @code{environment-variables} (default: @code{()}) (type: alist)
Zusätzliche Umgebungsvariable, die festgelegt werden sollen. Diese werden
mit den Umgebungsvariablen anderer Erweiterungen und denen des zugrunde
liegenden Dienstes zu einem zusammenhängenden Block aus Umgebungsvariablen
vereint.

@item @code{variables} (default: @code{()}) (type: alist)
Extra Bash variables (not to be confused with environment variables) to be
set in @file{.bashrc} for use by interactive shells.

@item @code{aliases} (default: @code{()}) (type: alist)
Zusätzliche Alias-Namen, die festgelegt werden sollen. Diese werden mit den
Alias-Namen anderer Erweiterungen und denen des zugrunde liegenden Dienstes
zusammengelegt.

@item @code{bash-profile} (default: @code{()}) (type: text-config)
Zusätzliche Textblöcke, die zu @file{.bash_profile} hinzugefügt werden
sollen. Diese werden zu den Textblöcken anderer Erweiterungen und denen des
zugrunde liegenden Dienstes hinzugenommen.

@item @code{bashrc} (default: @code{()}) (type: text-config)
Zusätzliche Textblöcke, die zu @file{.bashrc} hinzugefügt werden
sollen. Diese werden zu den Textblöcken anderer Erweiterungen und denen des
zugrunde liegenden Dienstes hinzugenommen.

@item @code{bash-logout} (default: @code{()}) (type: text-config)
Zusätzliche Textblöcke, die zu @file{.bash_logout} hinzugefügt werden
sollen. Diese werden zu den Textblöcken anderer Erweiterungen und denen des
zugrunde liegenden Dienstes hinzugenommen.

@end table

@end deftp

@c %end of fragment

@subsubheading Persönlicher Zsh-Dienst

@deftp {Datentyp} home-zsh-configuration
Verfügbare @code{home-zsh-configuration}-Felder sind:

@table @asis
@item @code{package} (Vorgabe: @code{zsh}) (Typ: „package“)
Das zu benutzende Zsh-Paket.

@item @code{xdg-flavor?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Ob alle Konfigurationsdateien in @file{$XDG_CONFIG_HOME/zsh} platziert
werden sollen. Auch wird @file{~/.zshenv} dann @env{ZDOTDIR} auf
@file{$XDG_CONFIG_HOME/zsh} festlegen. Der Startvorgang der Shell wird mit
@file{$XDG_CONFIG_HOME/zsh/.zshenv} fortgeführt.

@item @code{environment-variables} (Vorgabe: @code{'()}) (Typ: Assoziative-Liste)
Eine assoziative Liste, welche Umgebungsvariable in der Zsh-Sitzung
festgelegt sein sollen.

@item @code{zshenv} (Vorgabe: @code{'()}) (Typ: Konfigurationstexte)
Eine Liste dateiartiger Objekte, die zu @file{.zshenv} hinzugefügt
werden. Damit können benutzereigene Shell-Umgebungsvariable festgelegt
werden. Enthaltene Befehle dürfen @emph{kein} vorhandenes TTY voraussetzen
und sie dürfen @emph{nichts} ausgeben. Die Datei wird immer gelesen. Sie
wird vor jeder anderen Datei in @env{ZDOTDIR} gelesen.

@item @code{zprofile} (Vorgabe: @code{'()}) (Typ: Konfigurationstexte)
Eine Liste dateiartiger Objekte, die in @file{.zprofile} eingefügt
werden. Damit können benutzereigene Befehle beim Start der Login-Shell
ausgeführt werden. (In der Regel handelt es sich um die Shell, die gestartet
wird, direkt nachdem man sich auf der Konsole (TTY) anmeldet.)
@file{.zprofile} wird vor @file{.zlogin} gelesen.

@item @code{zshrc} (Vorgabe: @code{'()}) (Typ: Konfigurationstexte)
Eine Liste dateiartiger Objekte, die in @file{.zshrc} eingefügt
werden. Damit können benutzereigene Befehle beim Start einer interaktiven
Shell ausgeführt werden. (Interaktive Shells sind Shells für interaktive
Nutzung, die man startet, indem man @code{zsh} eintippt oder die durch
Terminal-Anwendungen oder andere Programme gestartet werden.)

@item @code{zlogin} (Vorgabe: @code{'()}) (Typ: Konfigurationstexte)
Eine Liste dateiartiger Objekte, die in @file{.zlogin} eingefügt
werden. Damit können benutzereigene Befehle am Ende des Startvorgangs der
Login-Shell ausgeführt werden.

@item @code{zlogout} (Vorgabe: @code{'()}) (Typ: Konfigurationstexte)
Eine Liste dateiartiger Objekte, die zu @file{.zlogout} hinzugefügt
werden. Damit können benutzereigene Befehle beim Verlassen der Login-Shell
ausgeführt werden. Die Datei wird in manchen Fällen @emph{nicht} gelesen
(wenn die Shell zum Beispiel durch exec eines anderen Prozesses terminiert).

@end table

@end deftp

@subsubheading Inputrc-Profil-Dienst
@cindex inputrc
@cindex readline

Das @uref{https://tiswww.cwru.edu/php/chet/readline/rltop.html,
GNU-Readline-Paket} enthält Bearbeitungsmodi, um damit wie in Emacs oder vi
zu arbeiten. Die Einstellungen dazu stehen in der Datei
@file{~/.inputrc}. Mit dem Modul @code{gnu home services shells} können Sie
diese Einstellungen auf vorhersehbare Weise vornehmen, wie folgt. Für
weitere Informationen, wie die Konfiguration in der Datei @file{~/.inputrc}
aussehen muss, siehe @ref{Readline Init File,,, readline, GNU Readline}.

@defvar home-inputrc-service-type

Mit einem Dienst dieses Typs kann man verschiedene Einstellungen an
@file{.inputrc} vornehmen. Die Einstellungen in @file{.inputrc} werden von
allen Programmen gelesen, die mit GNU Readline gebunden werden.

Hier sehen Sie ein Beispiel, wie so ein Dienst aussehen und konfiguriert
werden kann, wenn Sie ihn im @code{services}-Feld innerhalb von
@code{home-environment} in Ihrer Persönlichen Konfiguration eintragen:

@lisp
(service home-inputrc-service-type
         (home-inputrc-configuration
           (key-bindings
            `(("Control-l" . "clear-screen")))
           (variables
            `(("bell-style" . "visible")
              ("colored-completion-prefix" . #t)
              ("editing-mode" . "vi")
              ("show-mode-in-prompt" . #t)))
           (conditional-constructs
            `(("$if mode=vi" .
               ,(home-inputrc-configuration
                  (variables
                   `(("colored-stats" . #t)
                     ("enable-bracketed-paste" . #t)))))
              ("$else" .
               ,(home-inputrc-configuration
                  (variables
                   `(("show-all-if-ambiguous" . #t)))))
              ("endif" . #t)
              ("$include" . "/etc/inputrc")
              ("$include" . ,(file-append
                               (specification->package "readline")
                               "/etc/inputrc"))))))
@end lisp

Im Beispiel oben werden zunächst @code{key-bindings} und @code{variables}
eingestellt. In @code{conditional-constructs} wird gezeigt, wie man bedingte
Anweisungen benutzt und weitere Dateien einbindet. Im obigen Beispiel wird
@code{colored-stats} nur aktiviert, wenn der Bearbeitungsmodus auf
@code{vi}-Stil steht. Außerdem werden weitere Einstellungen aus
@file{/etc/inputrc} oder aus @file{/gnu/store/…-readline/etc/inputrc}
geladen.

Mit einer @code{home-inputrc-service-type}-Instanz des Dienstes muss ein
@code{home-inputrc-configuration}-Verbundsobjekt assoziiert werden; die
Beschreibung folgt nun.

@end defvar

@anchor{home-inputrc-configuration}
@deftp {Datentyp} home-inputrc-configuration
Verfügbare @code{home-inputrc-configuration}-Felder sind:

@table @asis
@item @code{key-bindings} (Vorgabe: @code{'()}) (Typ: Assoziative-Liste)
Eine assoziative Liste von Tastenbelegungen für Readline, die in die Datei
@file{~/.inputrc} geschrieben werden.

@lisp
'((\"Control-l\" . \"clear-screen\"))
@end lisp

wird zu

@example
Control-l: clear-screen
@end example

@item @code{variables} (Vorgabe: @code{'()}) (Typ: Assoziative-Liste)
Eine assoziative Liste zu setzender Readline-Variabler.

@lisp
'((\"bell-style\" . \"visible\")
  (\"colored-completion-prefix\" . #t))
@end lisp

wird zu

@example
set bell-style visible
set colored-completion-prefix on
@end example

@item @code{conditional-constructs} (Vorgabe: @code{'()}) (Typ: Assoziative-Liste)
Eine assoziative Liste von bedingten Ausdrücken, die in der
Initialisierungsdatei stehen sollen. Dazu gehören @command{$if},
@command{else}, @command{endif} und @command{include}, die als Wert eine
weitere @command{home-inputrc-configuration} bekommen.

@lisp
(conditional-constructs
 `((\"$if mode=vi\" .
     ,(home-inputrc-configuration
        (variables
         `((\"show-mode-in-prompt\" . #t)))))
   (\"$else\" .
     ,(home-inputrc-configuration
        (key-bindings
         `((\"Control-l\" . \"clear-screen\")))))
   (\"$endif\" . #t)))
@end lisp

wird zu

@example
$if mode=vi
set show-mode-in-prompt on
$else
Control-l: clear-screen
$endif
@end example

@item @code{extra-content} (Vorgabe: @code{""}) (Typ: Konfigurationstext)
Weiterer Text, der unverändert an die Konfigurationsdatei angehängt
wird. Führen Sie @command{man readline} aus, um weitere Informationen über
all die Konfigurationsoptionen zu bekommen.

@end table
@end deftp

@node Persönlicher Mcron-Dienst
@subsection Geplante Auftragsausführung durch Benutzer

@cindex cron, für einen Benutzer
@cindex mcron, für einen Benutzer
@cindex Planen von Aufträgen für einen Benutzer
Das Modul @code{(gnu home services mcron)} enthält eine Schnittstelle zu
GNU@tie{}mcron, einem Daemon, der gemäß einem vorher festgelegten Zeitplan
Aufträge (sogenannte „Jobs“) ausführt (siehe @ref{Top,,, mcron,
GNU@tie{}mcron}). Es gelten hier dieselben Informationen wie beim mcron für
Guix System (siehe @ref{mcron-service, mcron-Referenz}), außer dass
Persönliche mcron-Dienste in einem @code{home-environment}-Verbundsobjekt
deklariert werden statt in einem @code{operating-system}-Verbundsobjekt.

@quotation Anmerkung
We recommend defining periodic tasks as Shepherd timers, which provide more
flexibility than mcron.  @xref{Persönlicher Shepherd-Dienst}, for more info.
@end quotation

@defvar home-mcron-service-type
Dies ist der Diensttyp des Persönlichen @code{mcron}-Dienstes. Als Wert
verwendet er ein @code{home-mcron-configuration}-Objekt. Hiermit können zu
geplanten Zeiten Aufgaben durchgeführt werden.

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

@deftp {Datentyp} home-mcron-configuration
Verfügbare @code{home-mcron-configuration}-Felder sind:

@c Auto-generated with (gnu home services mcron)'s
@c generate-documentation procedure.
@c %start of fragment
@table @asis
@item @code{mcron} (Vorgabe: @code{mcron}) (Typ: dateiartig)
Welches mcron-Paket benutzt werden soll.

@item @code{jobs} (Vorgabe: @code{'()}) (Typ: Liste-von-G-Ausdrücken)
Dies muss eine Liste von G-Ausdrücken sein (siehe @ref{G-Ausdrücke}), die
jeweils einer mcron-Auftragsspezifikation (der Spezifikation eines „Jobs“)
entsprechen (siehe @ref{Syntax, mcron-Auftragsspezifikationen,,
mcron,GNU@tie{}mcron}).

@item @code{log?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Lässt Protokolle auf die Standardausgabe schreiben.

@item @code{log-format} (Vorgabe: @code{"~1@@*~a ~a: ~a~%"}) (Typ: Zeichenkette)
Eine Formatzeichenkette gemäß @code{(ice-9 format)} für die
Protokollnachrichten. Mit dem Vorgabewert werden Nachrichten in der Form
"@samp{@var{Prozesskennung} @var{Name}: @var{Nachricht}"} geschrieben (siehe
@ref{Invoking mcron, Aufrufen von mcron,, mcron,GNU@tie{}mcron}). Außerdem
schreibt GNU@tie{}Shepherd vor jeder Nachricht einen Zeitstempel.

@end table
@end deftp
@c %end of fragment

@node Persönliche Dienste zur Stromverbrauchsverwaltung
@subsection Persönliche Dienste zur Stromverbrauchsverwaltung

@cindex Stromverbrauch verwalten
Das Modul @code{(gnu home services pm)} stellt Persönliche Dienste bereit,
die mit dem Batterieverbrauch zu tun haben.

@defvar home-batsignal-service-type
Hiermit kann ein Dienst für @code{batsignal} genutzt werden, einem Programm,
um den Batterieladestand im Auge zu behalten und den Nutzer mit
Benachrichtigungen zu warnen, wenn die Batterie leer wird. Sie können ihn
auch so konfigurieren, dass ein Befehl ausgeführt wird, wenn der Ladestand
eine „Gefahrstufe“ überschreitet. Dieser Dienst wird mit einem Objekt des
@code{home-batsignal-configuration}-Verbundstyps konfiguriert.
@end defvar

@deftp {Datentyp} home-batsignal-configuration
Datentyp, der die Konfiguration von batsignal repräsentiert.

@table @asis
@item @code{warning-level} (Vorgabe: @code{15})
Bei welchem Batterieladestand eine Warnung vermeldet wird.

@item @code{warning-message} (Vorgabe: @code{#f})
Welche Nachricht als Benachrichtigung abgeschickt wird, wenn der
Batterieladestand auf @code{warning-level} fällt. Wenn das auf @code{#f}
gesetzt ist, wird die voreingestellte Nachricht abgeschickt.

@item @code{critical-level} (Vorgabe: @code{5})
Bei welchem Batterieladestand eine kritische Lage vermeldet wird.

@item @code{critical-message} (Vorgabe: @code{#f})
Welche Nachricht als Benachrichtigung abgeschickt wird, wenn der
Batterieladestand auf @code{critical-level} fällt. Wenn das auf @code{#f}
gesetzt ist, wird die voreingestellte Nachricht abgeschickt.

@item @code{danger-level} (Vorgabe: @code{2})
Bei welchem Batterieladestand der Befehl in @code{danger-command} ausgeführt
wird.

@item @code{danger-command} (Vorgabe: @code{#f})
Welcher Befehl ausgeführt werden soll, wenn der Batterieladestand auf
@code{danger-level} fällt. Wenn das auf @code{#f} gesetzt ist, wird gar kein
Befehl ausgeführt.

@item @code{full-level} (Vorgabe: @code{#f})
Bei welchem Batterieladestand vermeldet wird, dass sie voll geladen
ist. Wenn Sie das auf @code{#f} setzen, wird gar nichts gemeldet bei einer
voll geladenen Batterie.

@item @code{full-message} (Vorgabe: @code{#f})
Welche Nachricht als Benachrichtigung abgeschickt wird, wenn der
Batterieladestand auf @code{full-level} steigt. Wenn das auf @code{#f}
gesetzt ist, wird die voreingestellte Nachricht abgeschickt.

@item @code{batteries} (Vorgabe: @code{'()})
Welche Batterien überwacht werden sollen. Wenn Sie das auf @code{'()}
setzen, wird versucht, die Batterien automatisch zu finden.

@item @code{poll-delay} (Vorgabe: @code{60})
Die Zeit in Sekunden, wie lange abgewartet wird, bis die Batterien erneut
geprüft werden.

@item @code{icon} (Vorgabe: @code{#f})
Ein dateiartiges Objekt, das als Symbolbild für die
Batteriebenachrichtigungen verwendet wird. Wenn Sie das auf @code{#f}
setzen, werden keine Symbole bei den Benachrichtigungen angezeigt.

@item @code{notifications?} (Vorgabe: @code{#t})
Ob überhaupt Benachrichtigungen abgeschickt werden sollen.

@item @code{notifications-expire?} (Vorgabe: @code{#f})
Ob Benachrichtigungen nach einiger Zeit auslaufen.

@item @code{notification-command} (Vorgabe: @code{#f})
Mit welchem Befehl Benachrichtigungen abgeschickt werden. Wenn Sie das auf
@code{#f} setzen, werden Benachrichtigungen über @code{libnotify}
zugestellt.

@item @code{ignore-missing?} (Vorgabe: @code{#f})
Ob Fehler, dass eine Batterie fehlt, ignoriert werden sollen.
@end table
@end deftp

@node Persönlicher Shepherd-Dienst
@subsection Benutzer-Daemons verwalten

@cindex Shepherd-Dienste, für Benutzer
Das Modul @code{(gnu home services shepherd)} ermöglicht die Definition von
Shepherd-Diensten für jeden Nutzer (siehe @ref{Introduction,,, shepherd,
Handbuch von GNU Shepherd}). Dazu erweitern Sie
@code{home-shepherd-service-type} mit neuen Diensten. Guix Home kümmert sich
dann darum, dass der @code{shepherd}-Daemon für Sie beim Anmelden gestartet
wird, und er startet wiederum die Dienste, die Sie anfordern.

@defvar home-shepherd-service-type
Der Diensttyp für das als normaler Benutzer ausgeführte Shepherd, womit man
sowohl durchgängig laufende Prozesse als auch einmalig ausgeführte Aufgaben
verwalten. Mit Benutzerrechten ausgeführte Shepherd-Prozesse sind
@emph{keine} „init“-Prozesse (PID 1), aber ansonsten sind fast alle
Informationen aus @ref{Shepherd-Dienste} auch für sie anwendbar.

Dieser Diensttyp stellt das Ziel für Diensterweiterungen dar, die
Shepherd-Dienste erzeugen sollen (siehe @ref{Diensttypen und Dienste} für
ein Beispiel). Jede Erweiterung muss eine Liste von
@code{<shepherd-service>}-Objekten übergeben. Sein Wert muss eine
@code{home-shepherd-configuration} sein, wie im Folgenden beschrieben.
@end defvar

@deftp {Datentyp} home-shepherd-configuration
Dieser Datentyp repräsentiert die Konfiguration von Shepherd.

@table @code
@item shepherd (Vorgabe: @code{shepherd})
Das zu benutzende Shepherd-Paket.

@item auto-start? (Vorgabe: @code{#t})
Ob Shepherd bei einer ersten Anmeldung gestartet werden soll.

@item daemonize? (default: @code{#t})
Whether or not to run Shepherd in the background.

@item silent? (default: @code{#t})
When true, the @command{shepherd} process does not write anything to
standard output when started automatically.

@item services (Vorgabe: @code{'()})
Eine Liste zu startender Shepherd-Dienste als
@code{<shepherd-service>}-Objekte. Wahrscheinlich sollten Sie stattdessen
den Mechanismus zur Diensterweiterung benutzen (siehe @ref{Shepherd-Dienste}).
@end table
@end deftp

@cindex timers, per-user
Shepherd macht es möglich, dass Sie @dfn{Timer} definieren, eine besondere
Art Dienst, die einen vorgegebenen Auftrag wiederholt durchführt. Genau wie
Sie Timer auf Systemebene definieren können (siehe @ref{Geplante Auftragsausführung}), können Sie es in Ihrer Persönlichen Umgebung tun.

The example below defines a home environment where a Shepherd timer runs the
@command{mkid} command twice per day (@pxref{mkid invocation,,, idutils, ID
Database Utilities}).  It does so by extending
@code{home-shepherd-service-type} with @code{simple-service}; the Shepherd
timer itself is produced by the @code{shepherd-timer} procedure
(@pxref{shepherd-timer-procedure, @code{shepherd-timer}}), which is given
the service name, a gexp specifying its schedule, and a gexp specifying the
command to run.

@lisp
(use-modules (gnu) (guix)
             (gnu home services shepherd)
             (gnu packages idutils))

(define idutils-service
  ;; Index my 'doc' directory everyday at 12:15PM and 7:15PM.
  (simple-service
   'update-idutils-database home-shepherd-service-type
   (list (shepherd-timer '(update-idutils-database)
                         #~(calendar-event #:hours '(12 19)
                                           #:minutes '(15))
                         #~(#$(file-append idutils "/bin/mkid")
                            "doc")))))

(home-environment
  ;; @dots{}
  (services (append (list idutils-service)
                    %base-home-services)))
@end lisp

Siehe @ref{Timers,,, shepherd, Handbuch von GNU Shepherd} für weitere
Informationen zu Shepherd-Timern.

@cindex log rotation, for user services
Des Weiteren bringt Shepherd einen @dfn{Dienst zur Protokollrotation} mit,
welcher alte Protokolldateien komprimiert und später löscht, die von ihm
ausgeführte Dienste und Daemons hinterlassen. Dieser Dienst wird durch
@code{home-log-rotation-service-type} zur Verfügung gestellt, wie weiter
unten beschrieben.

@defvar home-log-rotation-service-type
Dies ist der Diensttyp für Shepherds Protokollrotationsdienst für einzelne
Benutzer (siehe @ref{Log Rotation Service,,, shepherd, Handbuch von GNU
Shepherd}). Sein Wert muss ein
@code{log-rotation-configuration}-Verbundsobjekt sein, genau wie bei seinem
systemweiten Gegenstück. Siehe @ref{log-rotation-configuration} für dessen
Referenz.

Dieser Dienst gehört zu @code{%base-home-services}.
@end defvar

@defvar home-shepherd-transient-service-type
@defvarx home-shepherd-timer-service-type
Dies sind die Shepherd-Dienste @code{timer} und @code{transient}. Ersterer
ermöglicht eine zeitgesteuerte Ausführung, die für spätere Zeitpunkte
eingeplant wird, während Letzterer Befehle im Hintergrund als normaler
Dienst ausführt.

Siehe @ref{shepherd-transient-timer-services, die systemweiten Dienste
@code{timer} und @code{transient}}, was die Gegenstücke hierzu auf Guix
System sind, wenn Sie Näheres wissen möchten.
@end defvar

@node Secure Shell
@subsection Secure Shell

@cindex Secure-Shell-Client, Konfiguration
@cindex SSH-Client, Konfiguration
Im @uref{https://www.openssh.com, OpenSSH-Paket} befindet sich ein
Clientprogramm, nämlich der Befehl @command{ssh}, um eine Verbindung zu
entfernten Maschinen über das SSH-Protokoll herzustellen (eine „Secure
shell“). Mit dem Modul @code{(gnu home services ssh)} können Sie OpenSSH auf
vorhersehbare Weise einrichten, nahezu unabhängig vom Zustand, in dem Ihr
lokaler Rechner ist. Dazu instanziieren Sie @code{home-openssh-service-type}
in Ihrer Persönlichen Konfiguration wie im Folgenden erklärt.

@defvar home-openssh-service-type
Dies ist der Diensttyp zum Einrichten des OpenSSH-Clients. Dadurch werden
mehrere Dinge erledigt:

@itemize
@item
Es wird eine Datei @file{~/.ssh/config} bereitgestellt, damit je nach Ihrer
Konfiguration @command{ssh} die Rechner kennt, mit denen Sie sich regelmäßig
verbinden, und Parameter damit assoziiert werden können.

@item
Es wird eine Datei @file{~/.ssh/authorized_keys} bereitgestellt, in der
öffentliche Schlüssel eingetragen sind, mit denen man sich ausweisen muss,
damit der lokale SSH-Server, @command{sshd}, Verbindungen zu diesem
Benutzerkonto akzeptieren kann.

@item
Optional wird auch eine Datei @file{~/.ssh/known_hosts} bereitgestellt,
damit @file{ssh} die Rechner authentifizieren kann, mit denen Sie sich
verbinden.
@end itemize

Hier sehen Sie ein Beispiel, wie so ein Dienst aussehen und konfiguriert
werden kann, wenn Sie ihn im @code{services}-Feld innerhalb von
@code{home-environment} in Ihrer Persönlichen Konfiguration eintragen:

@lisp
(service home-openssh-service-type
         (home-openssh-configuration
          (hosts
           (list (openssh-host (name "ci.guix.gnu.org")
                               (user "charlie"))
                 (openssh-host (name "chbouib")
                               (host-name "chbouib.example.org")
                               (user "supercharlie")
                               (port 10022))))
          (authorized-keys (list (local-file "alice.pub")))))
@end lisp

Im obigen Beispiel sind zwei Rechner mit Parametern angegeben, so dass wenn
Sie etwa @command{ssh chbouib} ausführen, automatisch eine Verbindung zu
@code{chbouib.example.org} auf Port 10022 hergestellt wird und Sie als
Benutzer @samp{supercharlie} angemeldet werden. Außerdem wird der
öffentliche Schlüssel in @file{alice.pub} autorisiert und dessen
Eigentümerin darf eingehende Verbindungen an Ihr Konto am Rechner aufbauen.

Mit einer @code{home-openssh-service-type}-Instanz des Dienstes muss ein
@code{home-openssh-configuration}-Verbundsobjekt assoziiert werden; die
Beschreibung folgt nun.
@end defvar

@deftp {Datentyp} home-openssh-configuration
Der Datentyp, der die Konfiguration für den OpenSSH-Client und auch den
-Server bezüglich der Persönlichen Umgebung beschreibt. Dazu gehören die
folgenden Felder:

@table @asis
@item @code{hosts} (Vorgabe: @code{'()})
Eine Liste von @code{openssh-host}-Verbundsobjekten, mit denen Rechnernamen
und damit assoziierte Verbindungsparameter festgelegt werden (siehe
unten). Diese Rechnerliste wird in @file{~/.ssh/config} platziert, was
@command{ssh} beim Start ausliest.

@item @code{known-hosts} (Vorgabe: @code{*unspecified*})
Es muss eines hiervon sein:

@itemize
@item
@code{*unspecified*}, in diesem Fall überlässt
@code{home-openssh-service-type} es dem @command{ssh}-Programm und Ihnen als
Benutzer, die Liste bekannter Rechner in @file{~/.ssh/known_hosts} zu
pflegen, oder

@item
eine Liste dateiartiger Objekte, die dann zusammengefügt werden zu
@file{~/.ssh/known_hosts}.
@end itemize

In der Datei @file{~/.ssh/known_hosts} steht eine Liste von Paaren aus
Rechnername und zugehörigem Schlüssel, mit denen @command{ssh} die Rechner
authentifiziert, mit denen Sie sich verbinden. So werden mögliche Angriffe
mit Doppelgängern erkannt. Das vorgegebene Verhalten von @command{ssh} folgt
dem Prinzip @dfn{TOFU, Trust-on-first-use}: Wenn Sie sich zum ersten Mal
verbinden, wird der zum Rechner gehörende Schlüssel in dieser Datei für die
Zukunft gespeichert. Genau so verhält sich @command{ssh}, wenn sie die
Einstellung von @code{known-hosts} unspezifiziert lassen (d.h.@: sie den
Wert @code{*unspecified*} hat).

Wenn Sie stattdessen die Liste bekannter Rechnerschlüssel vorab im
@code{known-hosts}-Feld hinterlegen, haben Sie eine eigenständige und
zustandslose Konfiguration, die Sie auf anderen Rechnern jederzeit
nachbilden können. Dafür stellt es beim ersten Mal einen Mehraufwand dar,
die Liste aufzustellen, deshalb ist @code{*unspecified*} die
Vorgabeeinstellung.

@item @code{authorized-keys} (Vorgabe: @code{#false})
Vorgegeben ist @code{#false}, was bedeutet, dass eine gegebenenfalls
vorhandene Datei @file{~/.ssh/authorized_keys} in Ruhe gelassen
wird. Andernfalls muss hierfür eine Liste dateiartiger Objekte angegeben
werden, von denen jedes einen öffentlichen SSH-Schlüssel enthält, für den es
erlaubt ist, sich mit dieser Maschine zu verbinden.

Intern werden die Dateien zusammengefügt und als
@file{~/.ssh/authorized_keys} bereitgestellt. Wenn auf diesem Rechner ein
OpenSSH-Server, @command{sshd}, läuft, @emph{kann} er diese Datei
berücksichtigen; so verhält sich @command{sshd} in seiner
Vorgabeeinstellung, aber Sie sollten wissen, dass man @command{sshd} auch so
konfigurieren kann, dass es die Datei ignoriert.

@item @code{add-keys-to-agent} (Vorgabe: @code{no})
Mit dieser Zeichenkette bestimmen Sie, ob neue Schlüssel automatisch zum
laufenden ssh-agent hinzugefügt werden sollen. Wenn Sie sie auf @code{yes}
setzen und ein Schlüssel aus seiner Datei geladen wurde, bleiben Schlüssel
und Passphrase im SSH-Agenten für einige Zeit (die voreingestellte
Gültigkeitsdauer) gespeichert, als hätte man @code{ssh-add} aufgerufen. Wenn
Sie die Option auf @code{ask} setzen, wird @code{ssh} um Bestätigung
bitten. Wenn Sie sie auf @code{confirm} setzen, müssen Sie jede Verwendung
des Schlüssels bestätigen. Wenn Sie sie auf @code{no} setzen, werden
Schlüssel nicht im SSH-Agenten gespeichert. Alternativ können Sie für diese
Option eine Zeitdauer angeben, wie lange der Schlüssel beim @code{ssh-agent}
gespeichert bleibt, und danach wird er automatisch entfernt. Sie können also
entweder @code{no}, @code{yes}, @code{confirm} (optional gefolgt von einer
Zeitdauer), @code{ask} oder eine Zeitdauer angeben.
@end table
@end deftp

@c %start of fragment

@deftp {Datentyp} openssh-host
Verfügbare @code{openssh-host}-Felder sind:

@table @asis
@item @code{name} (Typ: Zeichenkette)
Der Name zu dieser Rechnerdeklaration. Für einen @code{openssh-host} darf
nur entweder @code{name} oder @code{match-criteria} festgelegt werden. Für
allgemeine Optionen verwenden Sie @code{\"*\"} als einen @code{host-name}.

@item @code{host-name} (Typ: Vielleicht-Zeichenkette)
Der Rechnername, z.B.@: @code{"foo.example.org"} oder @code{"192.168.1.2"}.

@item @code{match-criteria} (Typ: Vielleicht-Match-Kriterien)
Wenn angegeben, benennt diese Zeichenkette alle Rechner, für die der Eintrag
gelten soll, anstelle des Feldes @code{host-name}. Ihr erstes Element muss
@code{all} oder ein Schlüsselwort aus @code{ssh-match-keywords} sein. Die
restlichen Elemente sind Argumente an das Schlüsselwort oder weitere
Kriterien. Für einen @code{openssh-host} darf nur entweder @code{name} oder
@code{match-criteria} festgelegt werden. Die anderen Konfigurationsoptionen
darin werden für alle zu @code{match-criteria} passenden Rechner gelten.

@item @code{address-family} (Typ: Vielleicht-Adressfamilie)
Welche Adressfamilie benutzt werden soll, wenn eine Verbindung zum Rechner
hergestellt wird: Entweder @code{AF_INET} (nur als IPv4-Verbindung) oder
@code{AF_INET6} (nur als IPv6-Verbindung). Außerdem ist es möglich, für das
Feld keinen Wert anzugeben, wenn jede Adressfamilie erlaubt werden soll.

@item @code{identity-file} (Typ: Vielleicht-Zeichenkette)
Anhand welcher Identitätsdatei Sie sich authentisieren, z.B.@:
@code{"/home/charlie/.ssh/id_ed25519"}.

@item @code{port} (Typ: Vielleicht-Natürliche-Zahl)
Die TCP-Portnummer, mit der eine Verbindung hergestellt wird.

@item @code{user} (Typ: Vielleicht-Zeichenkette)
Der Benutzername am entfernten Rechner.

@item @code{forward-x11?} (Typ: Vielleicht-Boolescher-Ausdruck)
Ob Verbindungen an entfernte grafische X11-Clients an die grafische lokale
X11-Anzeige weitergeleitet werden.

@item @code{forward-x11-trusted?} (Typ: Vielleicht-Boolescher-Ausdruck)
Ob den entfernten X11-Clients Vollzugriff auf die eigene grafische
X11-Anzeige gewährt werden soll.

@item @code{forward-agent?} (Typ: Vielleicht-Boolescher-Ausdruck)
Ob der Authentisierungsagent (falls vorhanden) an die entfernte Maschine
weitergeleitet wird.

@item @code{compression?} (Typ: Vielleicht-Boolescher-Ausdruck)
Ob übertragene Daten komprimiert werden.

@item @code{proxy} (Typ: Vielleicht-„proxy-command“-oder-„proxy-jump“-Liste)
Was für ein Befehl aufgerufen werden soll, um die Verbindung zu diesem
Server herzustellen; alternativ eine Liste der Rechnernamen der
SSH-Zwischenstationen, über die eine Verbindung mit dem Server aufgebaut
wird. Setzen Sie dieses Feld entweder auf einen @code{proxy-command} oder
auf eine Liste von @code{proxy-jump}-Verbundsobjekten.

Zum Beispiel würde als @code{proxy-command} der Befehl, um sich mittels
eines HTTP-Proxys auf 192.0.2.0 zu verbinden, so angegeben:
@code{(proxy-command "nc -X connect -x 192.0.2.0:8080 %h %p")}.

@deftp {Datentyp} proxy-jump
Verfügbare @code{proxy-jump}-Felder sind:

@table @asis
@item @code{user} (Typ: Vielleicht-Zeichenkette)
Der Benutzername am entfernten Rechner.

@item @code{host-name} (Typ: Zeichenkette)
Der Rechnername, z.B.@: @code{foo.example.org} oder @code{192.168.1.2}.

@item @code{port} (Typ: Vielleicht-Natürliche-Zahl)
Die TCP-Portnummer, mit der eine Verbindung hergestellt wird.

@end table

@end deftp

@item @code{host-key-algorithms} (Typ: Vielleicht-Zeichenketten-Liste)
Die Liste der Schlüsselalgorithmen, die für diesen Rechner akzeptiert
werden, etwa @code{'("ssh-ed25519")}.

@item @code{accepted-key-types} (Typ: Vielleicht-Zeichenketten-Liste)
Die Liste der akzeptierten Schlüsseltypen für öffentliche Schlüssel.

@item @code{extra-content} (Vorgabe: @code{""}) (Typ: Rohe-Konfigurations-Zeichenkette)
Zusätzlicher Inhalt, der unverändert zu diesem @code{Host}-Block in
@file{~/.ssh/config} noch angehängt wird.

@end table

@end deftp

@cindex Parcimonie, Persönlicher Dienst
Mit dem @code{parcimonie}-Dienst wird ein Daemon gestartet, der nach und
nach einen öffentlichen GnuPG-Schlüssel von einem Schlüsselserver
aktualisiert. Dabei wird je ein Schlüssel gleichzeitig aktualisiert. Nach
jeder Aktualisierung eines Schlüssels pausiert Parcimonie eine zufällige
Zeitspanne lang. Die Zeitspanne ist lang genug, damit der zuletzt gewählte
Tor-Kanal ausläuft. So soll es für einen Angreifer schwierig sein, die
verschiedenen Schlüsselaktualisierungen in Zusammenhang zu bringen.

Zum Beispiel würden Sie hiermit @code{parcimonie} so einrichten, dass es die
Schlüssel in Ihrem GnuPG-Schlüsselbund aktualisiert, sowie außerdem die
Schlüsselbunde, die Guix eingerichtet hat, etwa wenn Sie @code{guix import}
benutzen:

@lisp
(service home-parcimonie-service-type
         (home-parcimonie-configuration
           (refresh-guix-keyrings? #t)))
@end lisp

Dabei nehmen wir an, dass der Tor-Dienst für anonyme Netzwerkrouten auf
Ihrem System bereits läuft. Auf Guix System heißt das zum Beispiel, dass Sie
@code{tor-service-type} eingerichtet haben (siehe @ref{Netzwerkdienste,
@code{tor-service-type}}).

Es folgt die Referenz dieses Dienstes.

@defvar parcimonie-service-type
Dies ist der Diensttyp für @command{parcimonie}
(@uref{https://salsa.debian.org/intrigeri/parcimonie, Webauftritt von
Parcimonie}). Sein Wert muss ein @code{home-parcimonie-configuration}-Objekt
sein, wie im Folgenden beschrieben.
@end defvar

@c %start of fragment

@deftp {Datentyp} home-parcimonie-configuration
Verfügbare @code{home-parcimonie-configuration}-Felder sind:

@table @asis
@item @code{parcimonie} (Vorgabe: @code{parcimonie}) (Typ: dateiartig)
Das parcimonie-Paket, das benutzt werden soll.

@item @code{verbose?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ob die Protokollierung des Dienstes ausführlicher sein soll.

@item @code{gnupg-already-torified?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ob GnuPG bereits so eingestellt ist, dass aller Netzwerkverkehr über
@uref{https://torproject.org, Tor} geleitet wird.

@item @code{refresh-guix-keyrings?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Guix legt ein paar Schlüsselbunde in @var{$XDG_CONFIG_HOME} an, z.B.@: bei
Aufrufen von @code{guix import} (siehe @ref{Aufruf von guix import}). Wenn Sie
dies auf @code{#t} setzen, werden auch diese durch Guix angefertigten
Schlüsselbunde aktualisiert.

@item @code{extra-content} (Vorgabe: @code{#f}) (Typ: Rohe-Konfigurations-Zeichenkette)
„Roher Inhalt“, der zusätzlich an den parcimonie-Befehl übergeben wird.

@end table

@end deftp

@c %end of fragment

@cindex ssh-agent
Das @uref{https://www.openssh.com, OpenSSH-Paket} enthält einen Daemon,
nämlich den Befehl @command{ssh-agent}, mit dem Schlüssel für Verbindungen
zu entfernten Maschinen über das Protokoll @acronym{SSH, Secure Shell}
vorgehalten werden. Mit dem Dienst aus @code{(gnu home services ssh)} können
Sie den ssh-agent von OpenSSH so einrichten, dass er ab der
Benutzeranmeldung ausgeführt wird. Siehe @ref{GNU Privacy Guard,
@code{home-gpg-agent-service-type}} für eine Alternative zum
@command{ssh-agent} von OpenSSH.


Hier sehen Sie ein Beispiel, wie so ein Dienst aussehen und konfiguriert
werden kann, wenn Sie ihn im @code{services}-Feld innerhalb von
@code{home-environment} in Ihrer Persönlichen Konfiguration eintragen:

@lisp
(service home-ssh-agent-service-type
         (home-ssh-agent-configuration
          (extra-options '("-t" "1h30m"))))
@end lisp

@defvar home-ssh-agent-service-type
Dies ist der Diensttyp des Persönlichen @code{ssh-agent}-Dienstes. Als Wert
verwendet er ein @code{home-ssh-agent-configuration}-Objekt.
@end defvar

@deftp {Datentyp} home-ssh-agent-configuration
Verfügbare @code{home-ssh-agent-configuration}-Felder sind:

@table @asis
@item @code{openssh} (Vorgabe: @code{openssh}) (Typ: dateiartig)
Das zu benutzende OpenSSH-Paket.

@item @code{socket-directory} (Vorgabe: @code{@env{XDG_RUNTIME_DIR}/ssh-agent"}) (Typ: G-Ausdruck)
Das Verzeichnis, wo der Socket für den ssh-agent liegen soll.

@item @code{extra-options} (Vorgabe: @code{'()})
Zusätzliche Befehlszeilenoptionen, die dem @command{ssh-agent} mitgegeben
werden sollen. Führen Sie @command{man ssh-agent} aus, um weitere
Informationen zu erhalten.

@end table
@end deftp

@node GNU Privacy Guard
@subsection GNU Privacy Guard

@cindex GNU Privacy Guard, Persönlicher Dienst
@cindex GPG, Persönlicher Dienst
Das Modul @code{(gnu home services gnupg)} stellt Dienste zur Verfügung, mit
denen Sie den GNU Privacy Guard in Ihrer Persönlichen Umgebung einrichten
können. Er ist auch bekannt unter den Namen GnuPG oder GPG.

@cindex gpg-agent, Persönlicher Dienst
@cindex SSH-Agent, über gpg-agent
Mit dem @code{gpg-agent}-Dienst richten Sie den GPG-Agenten ein und
konfigurieren ihn. @code{gpg-agent} ist das Programm, worüber private
OpenPGP-Schlüssel und optional private OpenSSH-Schlüssel (für Secure Shell)
verwaltet werden können (siehe @ref{Invoking GPG-AGENT,,, gnupg, Using the
GNU Privacy Guard}).

Hier ist ein Beispiel, wie Sie @code{gpg-agent} mit SSH-Unterstützung so
einrichten, dass eine Emacs-basierte Pinentry-Oberfläche gezeigt wird, wenn
Sie eine Passphrase eingeben müssen:

@lisp
(service home-gpg-agent-service-type
         (home-gpg-agent-configuration
          (pinentry-program
           (file-append pinentry-emacs "/bin/pinentry-emacs"))
          (ssh-support? #t)))
@end lisp

Es folgt die Referenz dieses Dienstes.

@defvar home-gpg-agent-service-type
Dies ist der Diensttyp für @command{gpg-agent} (siehe @ref{Invoking
GPG-AGENT,,, gnupg, Using the GNU Privacy Guard}). Sein Wert muss ein
@code{home-gpg-agent-configuration}-Objekt sein, wie im Folgenden
beschrieben.
@end defvar

@c %start of fragment

@deftp {Datentyp} home-gpg-agent-configuration
Verfügbare @code{home-gpg-agent-configuration}-Felder sind:

@table @asis
@item @code{gnupg} (Vorgabe: @code{gnupg}) (Typ: dateiartig)
Das GnuPG-Paket, was benutzt werden soll.

@item @code{pinentry-program} (Typ: dateiartig)
Welches Pinentry-Programm gezeigt werden soll. Pinentry ist eine einfache
Benutzeroberfläche, die @command{gpg-agent} aufruft, wann immer eine Eingabe
durch den Benutzer gemacht werden muss, wie eine Passphrase oder
@acronym{PIN,Persönliche Identifikationsnummer} (siehe @ref{Top,,,
pinentry,Using the PIN-Entry}).

@item @code{ssh-support?} (Vorgabe: @code{#f}) (Typ: Boolescher-Ausdruck)
Ob auch Unterstützung für @acronym{SSH,Secure Shell} bereitgestellt werden
soll. Wenn dies auf wahr steht, verhält sich @command{gpg-agent} als
Alternative zum Programm @command{ssh-agent} von OpenSSH, d.h.@: es kümmert
sich um geheime Schlüssel für OpenSSH und leitet Anfragen nach Passphrasen
an das ausgewählte Pinentry-Programm weiter.

@item @code{default-cache-ttl} (Vorgabe: @code{600}) (Typ: Ganze-Zahl)
Wie lange ein Zugang zwischengespeichert wird, in Sekunden.

@item @code{max-cache-ttl} (Vorgabe: @code{7200}) (Typ: Ganze-Zahl)
Wie lange ein Zugang höchstens zwischengespeichert wird, in Sekunden. Wenn
diese Zeitspanne abgelaufen ist, fliegt der Zugang aus dem Zwischenspeicher,
egal ob kürzlich darauf zugegriffen wurde.

@item @code{default-cache-ttl-ssh} (Vorgabe: @code{1800}) (Typ: Ganze-Zahl)
Wie lange ein SSH-Zugang zwischengespeichert wird, in Sekunden.

@item @code{max-cache-ttl-ssh} (Vorgabe: @code{7200}) (Typ: Ganze-Zahl)
Wie lange ein SSH-Zugang höchstens zwischengespeichert wird, in Sekunden.

@item @code{extra-content} (Vorgabe: @code{""}) (Typ: Rohe-Konfigurations-Zeichenkette)
„Roher Inhalt“, der so, wie er ist, ans Ende von
@file{~/.gnupg/gpg-agent.conf} angehängt wird.

@end table

@end deftp


@c %end of fragment


@node Persönliche Desktop-Dienste
@subsection Persönliche Desktop-Dienste

Das Modul @code{(gnu home services desktop)} stellt Dienste zur Verfügung,
die Ihnen auf „Desktop“-Systemen helfen können, d.h.@: wenn Sie eine
grafische Arbeitsumgebung mit z.B.@: Xorg gebrauchen.

@cindex X Window, für Persönliche Dienste
@cindex X11, in Guix Home
@defvar home-x11-service-type
Dieser Diensttyp repräsentiert den Anzeigeserver von X Window für grafische
Anwendungen (auch „X11“ genannt).

X Window kann nur durch einen Systemdienst gestartet werden; auf Guix System
obliegt das Starten dem @code{gdm-service-type} und vergleichbaren Diensten
(siehe @ref{X Window}). Auf der Ebene von Guix Home, was durch
„unprivilegierte“ Nutzer ohne besondere Berechtigungen verwendet wird, lässt
sich X Window keinesfalls starten. Alles, was wir tun können, ist, zu
prüfen, ob es läuft. Dafür ist dieser Dienst da.

Ein Benutzer von Guix Home muss sich vermutlich nicht um
@code{home-x11-service-type} scheren oder ihn ausdrücklich
instanziieren. Dienste allerdings, die eine grafische X-Window-Anzeige
brauchen wie @code{home-redshift-service-type} weiter unten werden ihn
instanziieren und vom zugehörigen Shepherd-Dienst @code{x11-display}
abhängen (siehe @ref{Persönlicher Shepherd-Dienst}).

Wenn X Window läuft, startet der Shepherd-Dienst @code{x11-display} und
setzt die Umgebungsvariable @env{DISPLAY} im @command{shepherd}-Prozess und
wenn sie bereits gesetzt war, wird sie auf ihren ursprünglichen Wert
gesetzt, andernfalls startet der Dienst nicht.

Man kann den Dienst auch dazu zwingen, einen bestimmten Wert für
@env{DISPLAY} zu verwenden, und zwar so:

@example
herd start x11-display :3
@end example

Im obigen Beispiel wird @code{x11-display} angewiesen, @env{DISPLAY} als
@code{:3} festzulegen.
@end defvar

@defvar home-redshift-service-type
Dies ist der Diensttyp für @uref{https://github.com/jonls/redshift,
Redshift}, ein Programm, um die Farbtemperatur des Bildschirms an die
Tageszeit anzupassen. Sein zugewiesener Wert muss ein
@code{home-redshift-configuration}-Verbundsobjekt sein wie im folgenden
Beispiel:

Eine typische Konfiguration, bei der wir Längen- und Breitengrad selbst
vorgeben, könnte so aussehen:

@lisp
(service home-redshift-service-type
         (home-redshift-configuration
          (location-provider 'manual)
          (latitude 35.81)    ;Nordhalbkugel
          (longitude -0.80))) ;westlich von Greenwich
@end lisp
@end defvar

@deftp {Datentyp} home-redshift-configuration
Verfügbare @code{home-redshift-configuration}-Felder sind:

@table @asis
@item @code{redshift} (Vorgabe: @code{redshift}) (Typ: dateiartig)
Das zu verwendende Redshift-Paket.

@item @code{location-provider} (Vorgabe: @code{geoclue2}) (Typ: Symbol)
Anbieter für die Ortsbestimmung („Geolocation“). Entweder Sie geben den Ort
manuell ein, dann schreiben Sie @code{'manual}, oder für eine automatische
Ortsbestimmung schreiben Sie @code{'geoclue2}. Wenn Sie den Ort manuell
eingeben möchten, müssen Sie außerdem Breiten- und Längengrad in den Feldern
@code{latitude} und @code{longitude} festlegen, damit Redshift die Tageszeit
bei Ihnen ermitteln kann. Wenn Sie die automatische Ortsbestimmung benutzen
möchten, muss der Geoclue-Systemdienst laufen, der die Ortsinformation
bringt.

@item @code{adjustment-method} (Vorgabe: @code{randr}) (Typ: Symbol)
Die Methode zur Farbanpassung.

@item @code{daytime-temperature} (Vorgabe: @code{6500}) (Typ: Ganze-Zahl)
Farbtemperatur am Tag (in Kelvin).

@item @code{nighttime-temperature} (Vorgabe: @code{4500}) (Typ: Ganze-Zahl)
Farbtemperatur bei Nacht (in Kelvin).

@item @code{daytime-brightness} (Typ: Vielleicht-Inexakte-Zahl)
Bildschirmhelligkeit bei Tag, zwischen 0.1 und 1.0 oder unspezifiziert.

@item @code{nighttime-brightness} (Typ: Vielleicht-Inexakte-Zahl)
Bildschirmhelligkeit in der Nacht, zwischen 0.1 und 1.0 oder unspezifiziert.

@item @code{latitude} (Typ: Vielleicht-Inexakte-Zahl)
Der Breitengrad, wenn @code{location-provider} auf @code{'manual} gestellt
ist.

@item @code{longitude} (Typ: Vielleicht-Inexakte-Zahl)
Der Längengrad, wenn @code{location-provider} auf @code{'manual} gestellt
ist.

@item @code{dawn-time} (Typ: Vielleicht-Zeichenkette)
Eine selbst festgelegte Uhrzeit, zu der morgens von Nacht auf Tag geschaltet
wird, im Format @code{"HH:MM"}. Wenn Sie dies angeben, wird der Sonnenstand
zur Ermittlung von Tag und Nacht @emph{nicht} herangezogen.

@item @code{dusk-time} (Typ: Vielleicht-Zeichenkette)
Entsprechend eine selbst festgelegte Uhrzeit, zu der abends von Tag auf
Nacht geschaltet wird.

@item @code{extra-content} (Vorgabe: @code{""}) (Typ: Rohe-Konfigurations-Zeichenkette)
Weiterer Text, der unverändert an die Redshift-Konfigurationsdatei angehängt
wird. Führen Sie @command{man redshift} aus, um weitere Informationen über
das Format der Konfigurationsdatei zu erfahren.

@end table

@end deftp

@defvar home-dbus-service-type
Mit diesem Diensttyp können Sie eine Instanz von D-Bus nur für die aktuelle
Sitzung ausführen. Er ist gedacht für Anwendungen ohne besondere
Berechtigung, die eine laufende D-Bus-Instanz voraussetzen.
@end defvar

@deftp {Datentyp} home-dbus-configuration
Das Verbundsobjekt mit der Konfiguration des @code{home-dbus-service-type}.

@table @asis
@item @code{dbus} (Vorgabe: @code{dbus})
Das Paket mit dem Befehl @command{/bin/dbus-daemon}.
@end table
@end deftp

@defvar home-unclutter-service-type
Dies ist der Diensttyp für Unclutter, einem Programm, was bei einer
X11-Sitzung im Hintergrund läuft und womit erkannt wird, wenn der Mauszeiger
für eine festgelegte Zeitspanne @emph{nicht} bewegt wird. Dann wird der
Mauszeiger verborgen, damit Sie ungestört lesen können, was darunter
ist. Sein zugewiesener Wert muss ein
@code{home-unclutter-configuration}-Verbundsobjekt sein wie unten gezeigt.

Eine typische Konfiguration, bei der wir die untätige Zeitspanne selbst
vorgeben, könnte so aussehen:

@lisp
(service home-unclutter-service-type
         (home-unclutter-configuration
          (idle-timeout 2)))
@end lisp
@end defvar

@deftp {Datentyp} home-unclutter-configuration
Das Verbundsobjekt mit der Konfiguration des
@code{home-unclutter-service-type}.

@table @asis
@item @code{unclutter} (Vorgabe: @code{unclutter}) (Typ: dateiartig)
Welches Unclutter-Paket benutzt werden soll.

@item @code{idle-timeout} (Vorgabe: @code{5}) (Typ: Ganze-Zahl)
Die Zeitspanne in Sekunden, nach der der Mauszeiger verborgen wird.
@end table

@end deftp

@defvar home-xmodmap-service-type
Dies ist der Diensttyp für
@uref{https://gitlab.freedesktop.org/xorg/app/xmodmap,xmodmap}, ein
Werkzeug, mit dem Sie Tastenzuordnungen („Keymaps“) auf dem
Xorg-Anzeigeserver anpassen können sowie Zuordnungen für Maustasten und
Tasten ähnlicher Zeigergeräte. Sein zugewiesener Wert muss ein
@code{home-xmodmap-configuration}-Verbundsobjekt sein wie unten gezeigt.

Im Feld @code{key-map} geben Sie eine Liste von Objekten an, von denen jedes
entweder eine @dfn{Anweisung} (als Zeichenkette) oder eine @dfn{Zuweisung}
(als Paar von Zeichenketten) sein muss. Zum Beispiel würde folgendes Stück
Code die Tasten @kbd{Caps_Lock} (die Feststelltaste) und @kbd{Control_L}
(die linke Steuerungstaste) vertauschen, indem als Erstes die Keysyms (sie
stehen rechts) von den zugehörigen Modifikatorzuweisungen (sie stehen links)
entfernt werden, durch Vertauschen neu zugewiesen werden und schließlich die
Keysyms wieder zu den Modifikatorzuweisungen hinzugefügt werden.

@lisp
(service home-xmodmap-service-type
         (home-xmodmap-configuration
          (key-map '(("remove Lock" . "Caps_Lock")
                     ("remove Control" . "Control_L")
                     ("keysym Control_L" . "Caps_Lock")
                     ("keysym Caps_Lock" . "Control_L")
                     ("add Lock" . "Caps_Lock")
                     ("add Control" . "Control_L")))))
@end lisp
@end defvar

@deftp {Datentyp} home-xmodmap-configuration
Das Verbundsobjekt für den @code{home-xmodmap-service-type}. Diese Felder
sind verfügbar:

@table @asis
@item @code{xmodmap} (Vorgabe: @code{xmodmap}) (Typ: dateiartig)
Zu benutzendes @code{xmodmap}-Paket.

@item @code{key-map} (Vorgabe: @code{'()}) (Typ: Liste)
Die Liste der Ausdrücke, die @code{xmodmap} beim Starten des Dienstes
einliest.

@end table
@end deftp

@defvar home-startx-command-service-type
Fügt @command{startx} zum Persönlichen Profil hinzu, wodurch es in
@env{PATH} eingetragen wird.

Der Wert dieses Dienstes ist ein @code{<xorg-configuration>}-Objekt. das an
die Prozedur @code{xorg-start-command-xinit} übergeben wird, welche das
benutzte @command{startx} erzeugt. Der Vorgabewert ist
@code{(xorg-configuration)}.
@end defvar

@defvar home-darkman-service-type
This is the service type for the
@uref{https://gitlab.com/WhyNotHugo/darkman, Darkman}, a program for
dark-mode and light-mode transitions on Unix-like desktops.  It invokes
scripts in @code{$XDG_DATA_DIRS/dark-mode.d} at sundown, and invokes scripts
in @code{$XDG_DATA_DIRS/light-mode.d} at sunrise.  Darkman tries to
determine the user's current location from:
@itemize
@item The config file.
@item The cache file from last time it ran.
@item Using the system geoclue.
@end itemize
@end defvar

@deftp {Data Type} home-darkman-configuration
The configuration record for @code{home-darkman-service-type}.  Its
available fields are:

@table @asis
@item @code{darkman} (default: @code{darkman}) (type: file-like)
The @code{darkman} package to use.

@item @code{latitude} (type: maybe-number)
Latitude, used at startup or when @code{use-geoclue} is @code{#f}.  More
than one decimal point is generally not needed.

@item @code{longitude} (type: maybe-number)
Longitude, used at startup or when @code{use-geoclue} is @code{#f}.  More
than one decimal point is generally not needed.

@item @code{use-geoclue} (default: @code{#f}) (type: boolean)
Whether to use a local geoclue instance to determine the current location.
Setting this to false without explicitly setting latitude and longtitude
disables automatic transitions entirely.

@item @code{dbus-server} (default: @code{#t}) (type: boolean)
Whether to expose the current mode via darkman's own D-Bus API.

@item @code{portal} (default: @code{#t}) (type: boolean)
Whether to expose the current mode via the XDG settings portal D-Bus API.

@end table
@end deftp

@defvar home-gcr-ssh-agent-service-type

GNOME Keyring used to be able to act as a wrapper over @command{ssh-agent}.
It would display a graphical password entry dialog, including a checkbox to
remember the password, which, if selected, would allow fully passwordless
use of that key.

The SSH functionality is disabled by default in
@command{gnome-keyring-daemon} builds since version
@uref{https://gitlab.gnome.org/GNOME/gnome-keyring/-/commit25c5a1982467802fa12c6852b03c57924553ba73,
1.46}.  It has been
@uref{https://gitlab.gnome.org/GNOME/gcr/-/merge_requests/67, moved} into
@command{gcr-ssh-agent}, which is part of the @code{gcr} package.

To enable the SSH agent functionality it is sufficient to add the following
to your Home configuration.

@lisp
(use-modules (gnu home services gnome) ;for 'home-gcr-ssh-agent-service-type'
             @dots{})

(home-environment
  (services
    (list
      @dots{}
      (service home-gcr-ssh-agent-service-type))))
@end lisp
@end defvar

@deftp {Data Type} gcr-ssh-agent-configuration
The configuration record for @code{home-gcr-ssh-agent-service-type}.  Its
available fields are:

@table @asis
@item @code{package} (default: @code{gcr}) (type: package)
The @code{gcr} package to use.

@item @code{log-file} (Typ: Vielleicht-Zeichenkette)
Where the service will write its logs.  If unset, it defaults to
@file{$HOME/.local/state/shepherd/gcr-ssh-agent.log}.

@end table
@end deftp

@node Persönliche Guix-Dienste
@subsection Persönliche Guix-Dienste

Das Modul @code{(gnu home services guix)} bietet Dienste an, um Guix für den
Benutzer einzurichten.

@defvar home-channels-service-type
Dies ist der Diensttyp, um @file{$XDG_CONFIG_HOME/guix/channels.scm}
einzurichten. Mit dieser Datei wird gesteuert, welche Kanäle mit
@command{guix pull} empfangen werden (siehe @ref{Kanäle}). Sein
zugewiesener Wert muss eine Liste von @code{channel}-Verbundsobjekten sein,
wie sie im Modul @code{(guix channels)} definiert sind.

Es ist im Allgemeinen besser, eine Erweiterung für diesen Dienst zu machen,
statt den Dienst direkt zu konfigurieren, denn in seinem Vorgabewert sind
die vorgegebenen Kanäle für Guix, die als @code{%default-channels} definiert
sind, bereits enthalten. Wenn Sie sich entscheiden, diesen Dienst direkt zu
konfigurieren, müssen Sie darauf achten, dass ein @code{guix}-Kanal
konfiguriert ist. Siehe @ref{Weitere Kanäle angeben} und @ref{Eigenen Guix-Kanal benutzen} für weitere Details.

Eine typische Diensterweiterung, um einen Kanal hinzuzufügen, könnte so
aussehen:

@lisp
(simple-service 'paketvarianten-dienst
                home-channels-service-type
                (list
                 (channel
                  (name 'paketvarianten)
                  (url "https://example.org/variant-packages.git"))))
@end lisp
@end defvar

@node Backup Home Services
@subsection Backup-Dienste

The @code{(gnu home services backup)} module offers services for backing up
file system trees.  For now, it provides the
@code{home-restic-backup-service-type}.

With @code{home-restic-backup-service-type}, you can periodically back up
directories and files with @uref{https://restic.net/, Restic}, which
supports end-to-end encryption and deduplication.  Consider the following
configuration:

@lisp
(use-modules (gnu home services backup) ;for 'restic-backup-job', 'home-restic-backup-service-type'
             (gnu packages sync)        ;for 'rclone'
             @dots{})

(home-environment

  (packages (list rclone    ;for use by restic
                  @dots{}))
  (services
    (list
      @dots{}
      (simple-service 'backup-jobs
                      home-restic-backup-service-type
                      (list (restic-backup-job
                              (name "remote-ftp")
                              (repository "rclone:remote-ftp:backup/restic")
                              (password-file "/home/alice/.restic")
                              ;; Every day at 23.
                              (schedule "0 23 * * *")
                              (files '("/home/alice/.restic"
                                       "/home/alice/.config/rclone"
                                       "/home/alice/Pictures"))))))))
@end lisp

In general it is preferable to extend the
@code{home-restic-backup-service-type}, as shown in the example above.  This
is because it takes care of wrapping everything with @code{for-home}, which
enables the @code{home-restic-backup-service-type} and
@code{restic-backup-service-type} to share the same codebase.

For a custom configuration, wrap your @code{restic-backup-configuration} in
@code{for-home}, as in this example:

@lisp
(use-modules (gnu services)             ;for 'for-home'
             (gnu services backup)      ;for 'restic-backup-job' and 'restic-backup-configuration'
             (gnu home services backup) ;for 'home-restic-backup-service-type'
             (gnu packages sync)        ;for 'rclone'
             @dots{})

(home-environment

  (packages (list rclone    ;for use by restic
                  @dots{}))
  (services
    (list
      @dots{}
      (service home-restic-backup-service-type
               (for-home
                (restic-backup-configuration
                 (jobs (list @dots{}))))))))
@end lisp

You can refer to @pxref{Verschiedene Dienste,
@code{restic-backup-service-type}} for details about
@code{restic-backup-configuration} and @code{restic-backup-job}.  The only
difference is that the @code{home-restic-backup-service-type} will ignore
the @code{user} and @code{group} field of @code{restic-backup-job}.

@node Persönliche Schriftarten-Dienste
@subsection Persönliche Schriftarten-Dienste

Im Modul @code{(gnu home services fontutils)} werden Dienste bereitgestellt,
um Fontconfig für einen einzelnen Benutzer einzustellen. Die
@uref{https://www.freedesktop.org/wiki/Software/fontconfig,Fontconfig-Bibliothek}
wird von vielen Anwendungen verwendet, damit sie auf die Schriftarten im
System zugreifen können.

@defvar home-fontconfig-service-type
Dieser Diensttyp erzeugt Konfigurationen für Fontconfig. Als ihm
zugewiesener Wert hat er eine Liste von entweder Zeichenketten (oder
G-Ausdrücken), die auf Orte mit Schriftarten verweisen, oder SXML-Fragmenten
(siehe @ref{SXML,,, guile, Referenzhandbuch von GNU Guile}), welche dann in
XML umgewandelt und in den Hauptknoten @code{fontconfig} eingefügt werden.

Es ist im Allgemeinen besser, eine Erweiterung für diesen Dienst zu machen,
statt den Dienst direkt zu konfigurieren, denn in seinem Vorgabewert steht
der Standardinstallationspfad für Schriftarten im Profil von Guix Home
(@file{~/.guix-home/profile/share/fonts}). Wenn Sie sich entscheiden, diesen
Dienst direkt zu konfigurieren, achten Sie darauf, dass auch dieses
Verzeichnis enthalten ist.

Eine Diensterweiterung, um mit dem Paketverwaltungsprogramm Nix installierte
Schriftarten hinzuzufügen und eine Schriftart als bevorzugt für Monospace
festzulegen, könnte so aussehen:

@lisp
(simple-service 'additional-fonts-service
                home-fontconfig-service-type
                (list "~/.nix-profile/share/fonts"
                      '(alias
                        (family "monospace")
                        (prefer
                         (family "Liberation Mono")))))
@end lisp
@end defvar

@node Persönliche Tondienste
@subsection Persönliche Tondienste

Das Modul @code{(gnu home services sound)} stellt Dienste bereit, die mit
Sound-Unterstützung zu tun haben.

@cindex PulseAudio, Persönlicher Dienst
@cindex RTP, für PulseAudio
@subsubheading PulseAudio-RTP-Streaming-Dienst

Mit den folgenden Diensten wird der
@uref{https://pulseaudio.org,PulseAudio-Audioserver} dynamisch
umkonfiguriert: Damit können Sie eine Audioausgabe als Broadcast an andere
Geräte über das Netzwerk ausstrahlen. Dazu wird das Protokoll @acronym{RTP,
Real-time Transport Protocol} benutzt. Ebenso kann über RTP empfangener Ton
wiedergegeben werden. Sobald Sie
@code{home-pulseaudio-rtp-sink-service-type} als Persönlichen Dienst
eingerichtet haben, können Sie mit folgendem Befehl eine
Audiobroadcasting-Ausgabe starten:

@example
herd start pulseaudio-rtp-sink
@end example

Führen Sie dann ein PulseAudio unterstützendes Mischprogramm wie
@code{pavucontrol} oder @code{pulsemixer} aus (beide sind in gleichnamigen
Paketen zu finden), um zu steuern, welche Audio-Streams an das RTP-Ziel
geschickt werden.

Nach der Vorgabeeinstellung wird Audio an eine Multicast-Adresse geschickt,
so dass jedes Gerät im @acronym{LAN, Local Area Network} es empfängt und
abspielen kann. Doch dafür Multicast zu benutzen, lastet das Netzwerk aus
und verschlechtert es, deswegen ist es Ihnen womöglich lieber, Audio an ein
bestimmtes Netzwerkgerät zu senden. Die eine Möglichkeit ist, die IP-Adresse
des Zielgeräts beim Starten des Dienstes mitanzugeben:

@example
herd start pulseaudio-rtp-sink 192.168.1.42
@end example

Die andere Möglichkeit ist, die zu benutzende IP-Adresse in Ihrer
Persönlichen Konfiguration als Standard einzutragen:

@lisp
(service home-pulseaudio-rtp-sink-service-type
         "192.168.1.42")
@end lisp

Auf dem Netzwerkgerät, das den RTP-Stream empfangen und abspielen soll,
können Sie @code{home-pulseaudio-rtp-source-service-type} wie hier benutzen:

@lisp
(service home-pulseaudio-rtp-source-service-type)
@end lisp

Und so wird das Empfangsmodul für PulseAudio gestartet:

@example
herd start pulseaudio-rtp-source
@end example

Auch hier ist vorgegeben, die Multicast-Adresse zu verwenden. Wenn Sie
stattdessen auf direkt eingehende Verbindungen lauschen lassen möchten,
führen Sie Folgendes aus:

@lisp
(service home-pulseaudio-rtp-source-service-type
         "0.0.0.0")
@end lisp

Es folgt die Referenz dieser Dienste.

@defvar home-pulseaudio-rtp-sink-service-type
@defvarx home-pulseaudio-rtp-source-service-type
Mit diesem Diensttyp senden bzw.@: empfangen Sie Audio-Streams über
@acronym{RTP, Real-time Transport Protocol}.

Als Wert wird eine IP-Adresse zugewiesen (als Zeichenkette), an die der
Audio-Stream gesendet bzw.@: von der er empfangen wird. Vorgegeben ist,
Audio an die bzw.@: von der Multicast-Adresse
@code{%pulseaudio-rtp-multicast-address} zu senden bzw.@: zu empfangen.

Ein solcher Dienst definiert einen Shepherd-Dienst:
@code{pulseaudio-rtp-sink} bzw.@: @code{pulseaudio-rtp-source}. Der Dienst
wird @emph{nicht} automatisch gestartet; Sie müssen ihn manuell starten,
wenn Sie ihn laufen lassen möchten, wie in diesem Beispiel:

@example
herd start pulseaudio-rtp-sink
@end example

Wenn Sie den Shepherd-Dienst stoppen, endet das Broadcasting.
@end defvar

@defvar %pulseaudio-rtp-multicast-address
Dies ist die Multicast-Adresse, die nach Vorgabe von den obigen zwei
Diensten benutzt wird.
@end defvar

@cindex PipeWire, Persönlicher Dienst
@subsubheading Persönlicher PipeWire-Dienst

@uref{https://pipewire.org, PipeWire} stellt einen Dienst für die Ein- und
Ausgabe von Audio und Video bereit, der sich durch eine geringe Latenz und
graphenbasierte Verarbeitung auszeichnet. Zusätzlich zum eigenen Protokoll
kann PipeWire sowohl JACK als auch PulseAudio bedienen.

Zwar kümmert sich PipeWire um die Medienverarbeitung und stellt die API
bereit, doch kennt es nicht selbst die Geräte wie z.B.@: die
Soundkarten. Auch weiß es nicht, wie Sie Anwendungen, Hardware und Filter
zur Medienverarbeitung verbinden möchten. Stattdessen übernimmt das bei
PipeWire ein Programm zur @dfn{Sitzungsverwaltung}. Mit diesem geben Sie all
diese Beziehungen an. Obwohl Sie zur Sitzungsverwaltung ein Programm Ihrer
Wahl einsetzen könnten, ist die Referenzimplementierung
@url{https://pipewire.pages.freedesktop.org/wireplumber/, WirePlumber} des
PipeWire-Projekts für die meisten Leute die richtige Wahl, deswegen wird er
im @code{home-pipewire-service-type} benutzt.

PipeWire kann PulseAudio ersetzen, indem Sie @code{enable-pulseaudio?} in
@code{home-pipewire-configuration} auf @code{#t} setzen, damit noch auf das
bisherige PulseAudio ausgerichtete Clients PipeWire ohne weitere
Konfiguration benutzen können.

Außerdem können sich JACK-Clients mit PipeWire verbinden. Dazu verwenden Sie
das mit PipeWire mitgelieferte Programm @command{pw-jack}. Stellen Sie dem
Befehl einfach @command{pw-jack} voran, wenn Sie ihn ausführen, dann sollten
die Audio-Daten über PipeWire laufen:

@example
pw-jack mpv -ao=jack sound-file.wav
@end example

Mehr Informationen zur PulseAudio-Emulation finden Sie auf
@uref{https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-PulseAudio}
bzw.@: für JACK auf
@uref{https://gitlab.freedesktop.org/pipewire/pipewire/-/wikis/Config-JACK}.

Weil PipeWire seine Dienste nicht bei Bedarf über @code{dbus} startet (wie
bei PulseAudio), werden mit @code{home-pipewire-service-type} die Dienste
über Shepherd bei der Anmeldung gestartet. Dadurch werden die Dienste
@code{pipewire}, @code{wireplumber} sowie, wenn die Konfiguration es
vorgibt, @code{pipewire-pulseaudio} bereitgestellt. Siehe @ref{Persönlicher Shepherd-Dienst}.

@defvar home-pipewire-service-type
Hiermit wird die Dienstdefinition für @command{pipewire} zur Verfügung
gestellt, das bei der Anmeldung gestartet wird. Sein Wert ist ein
@code{home-pipewire-configuration}-Objekt.

Um den Dienst zu starten, tragen Sie ihn im @code{service}-Feld Ihrer
@code{home-environment}-Deklaration ein, etwa so:

@lisp
(service home-pipewire-service-type)
@end lisp
@end defvar

@deftp {Datentyp} home-pipewire-configuration
Verfügbare @code{home-pipewire-configuration}-Felder sind:

@table @asis
@item @code{pipewire} (Vorgabe: @code{pipewire}) (Typ: dateiartig)
Das zu benutzende PipeWire-Paket.

@item @code{wireplumber} (Vorgabe: @code{wireplumber}) (Typ: dateiartig)
Das zu benutzende WirePlumber-Paket.

@item @code{enable-pulseaudio?} (Vorgabe: @code{#t}) (Typ: Boolescher-Ausdruck)
Wenn es auf wahr gesetzt ist, wird PipeWires Emulation für PulseAudio
aktiviert, so dass Clients für PulseAudio transparent PipeWire dafür nutzen
können.

@item @code{extra-content} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Extra content to add to the end of @file{~/.config/alsa/asoundrc}.
@end table
@end deftp

@node Persönliche Maildienste
@subsection Persönliche Maildienste

Das Modul @code{(gnu home services mail)} stellt Dienste zur Verfügung, die
Ihnen helfen, Programme zum Umgang mit E-Mail in Ihrer Persönlichen Umgebung
einzurichten.

@cindex msmtp
@uref{https://marlam.de/msmtp, MSMTP} ist ein Client für @acronym{SMTP,
Simple Mail Transfer Protocol}. Mit ihm können E-Mails an einen festgelegten
SMTP-Server geschickt werden, der sich dann um die richtige Zustellung
kümmert.

Es folgt die Referenz dieses Dienstes.

@defvar home-msmtp-service-type
Der Diensttyp für @command{msmtp}. Sein Wert muss ein
@code{home-msmtp-configuration}-Verbundsobjekt wie unten gezeigt sein. Durch
ihn wird die Datei @file{~/.config/msmtp/config} verfügbar gemacht.

Hier ist ein Beispiel, wie Sie @code{msmtp} für ein einzelnes E-Mail-Konto
einrichten:

@lisp
(service home-msmtp-service-type
         (home-msmtp-configuration
          (accounts
           (list
            (msmtp-account
             (name "alice")
             (configuration
              (msmtp-configuration
               (host "mail.example.org")
               (port 587)
               (user "alice")
               (password-eval "pass Mail/alice"))))))))
@end lisp
@end defvar

@c %start of fragment

@deftp {Datentyp} home-msmtp-configuration
Verfügbare @code{home-msmtp-configuration}-Felder sind:

@table @asis
@item @code{defaults} (Typ: „msmtp-configuration“)
Die Konfiguration, die für alle Konten voreingestellt wird.

@item @code{accounts} (Vorgabe: @code{'()}) (Typ: Liste-von-„msmtp-account“)
Eine Liste von @code{msmtp-account}-Verbundsobjekten, die Informationen zu
jedem Ihrer Konten enthalten.

@item @code{default-account} (Typ: Vielleicht-Zeichenkette)
Legt fest, welches Konto voreingestellt ist.

@item @code{extra-content} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Weiterer Text, der unverändert an die Konfigurationsdatei angehängt
wird. Führen Sie @command{man msmtp} aus, um weitere Informationen über das
Format der Konfigurationsdatei zu erfahren.

@end table

@end deftp

@c %end of fragment

@c %start of fragment

@deftp {Datentyp} msmtp-account
Verfügbare @code{msmtp-account}-Felder sind:

@table @asis
@item @code{name} (Typ: Zeichenkette)
Der eindeutige Name des Kontos.

@item @code{configuration} (Typ: „msmtp-configuration“)
Die Konfiguration für dieses Konto.

@end table

@end deftp

@c %end of fragment

@c %start of fragment

@deftp {Datentyp} msmtp-configuration
Verfügbare @code{msmtp-configuration}-Felder sind:

@table @asis
@item @code{auth?} (Typ: Vielleicht-Boolescher-Ausdruck)
Authentisierung an- oder abschalten.

@item @code{tls?} (Typ: Vielleicht-Boolescher-Ausdruck)
TLS (auch bekannt als SSL) für sichere Verbindungen an- oder abschalten.

@item @code{tls-starttls?} (Typ: Vielleicht-Boolescher-Ausdruck)
Welche TLS-Variante in der Sitzung zum Einsatz kommen soll: Starten von TLS
aus der Sitzung heraus („an“, ist vorgegeben) oder Tunneln der Sitzung durch
TLS („aus“).

@item @code{tls-trust-file} (Typ: Vielleicht-Zeichenkette)
Aktiviert die Überprüfung von Server-Zertifikaten anhand einer Liste
vertrauenswürdiger Zertifizierungsstellen (engl.@: Certification
Authorities, CAs).

@item @code{log-file} (Typ: Vielleicht-Zeichenkette)
Aktiviert die Protokollierung in die angegebene Datei. Bei leerem Argument
wird @emph{nicht} protokolliert. Beim Dateinamen „-“ werden die
protokollierten Informationen an die Standardausgabe geleitet.

@item @code{host} (Typ: Vielleicht-Zeichenkette)
An welchen SMTP-Server Mails geschickt werden.

@item @code{port} (Typ: Vielleicht-Ganze-Zahl)
Auf welchem Port der SMTP-Server lauscht. Vorgegeben ist 25 („smtp“), wenn
@emph{nicht} TLS ohne STARTTLS eingestellt ist, wodurch Port 465 („smtps“)
vorgegeben ist.

@item @code{user} (Typ: Vielleicht-Zeichenkette)
Legt fest, mit welchem Benutzernamen die Authentisierung durchgeführt werden
soll.

@item @code{from} (Typ: Vielleicht-Zeichenkette)
Legt als Absenderadresse im Umschlag (Envelope-From) die angegebene Adresse
fest.

@item @code{password-eval} (Typ: Vielleicht-Zeichenkette)
Legt als Passwort für die Authentisierung die Ausgabe (stdout) des
angegebenen Befehls fest.

@item @code{extra-content} (Vorgabe: @code{""}) (Typ: Zeichenkette)
Weiterer Text, der unverändert an diesen Konfigurationsblock angehängt
wird. Führen Sie @command{man msmtp} aus, um weitere Informationen über das
Format der Konfigurationsdatei zu erfahren.

@end table

@end deftp

@c %end of fragment

@node Persönliche Kurznachrichtendienste
@subsection Persönliche Kurznachrichtendienste

@cindex znc
Der @uref{https://znc.in, ZNC-Bouncer} kann als Daemon laufen, damit Sie auf
IRC anwesend bleiben. Mit dem Dienst in @code{(gnu home services messaging)}
können Sie bewirken, dass ZNC ab der Benutzeranmeldung läuft.

Sie werden außerdem eine @file{~/.znc/configs/znc.conf} getrennt
bereitstellen müssen.

Hier sehen Sie ein Beispiel, wie so ein Dienst aussehen und konfiguriert
werden kann, wenn Sie ihn im @code{services}-Feld innerhalb von
@code{home-environment} in Ihrer Persönlichen Konfiguration eintragen:

@lisp
(service home-znc-service-type)
@end lisp

@defvar home-znc-service-type
Dies ist der Diensttyp des Persönlichen ZNC-Dienstes. Als Wert verwendet er
ein @code{home-znc-configuration}-Objekt.
@end defvar

@deftp {Datentyp} home-znc-configuration
Verfügbare @code{home-znc-configuration}-Felder sind:

@table @asis
@item @code{znc} (Vorgabe: @code{znc}) (Typ: dateiartig)
Das zu benutzende ZNC-Paket.

@item @code{extra-options} (Vorgabe: @code{'()})
Zusätzliche Befehlszeilenoptionen, die @command{znc} mitgegeben werden
sollen. Führen Sie @command{man znc} aus, um weitere Informationen zu
erhalten.

@end table
@end deftp

@cindex irc-bot
@cindex snuik
Der @uref{https://gitlab.com/janneke/snuik, Snuik-IRC-Bot} kann als Daemon
laufen, um leichter mit Nutzern zu kommunizieren, die gerade offline
sind. Mit dem Dienst in @code{(gnu home services messaging)} können Sie
bewirken, dass Snuik ab der Benutzeranmeldung läuft.

@defvar home-snuik-service-type
Dies ist der Diensttyp des Persönlichen Snuik-Dienstes. Als Wert verwendet
er ein @code{home-snuik-configuration}-Objekt.
@end defvar

Dabei können Sie auch eine angepasste Konfiguration angeben, indem Sie ein
@code{snuik-configuration}-Verbundsobjekt genau wie bei
@code{snuik-service-type} angeben, es aber in @code{for-home} umhüllen. Hier
ist ein Beispiel für einen Dienst und seine Konfiguration, die Sie ins Feld
@code{services} Ihrer @code{home-environment} einfügen können:

@lisp
(service home-snuik-service-type
         (for-home
          (snuik-configuration
           (server "irc.oftc.net")
           (nick "sneek")
           (password "snuik is sneeky")
           (channels '("#reproducible-builds")))))
@end lisp

@node Persönliche Mediendienste
@subsection Persönliche Mediendienste

@cindex kodi
Sie können das @uref{https://kodi.tv, Kodi-Media-Center} auf einem
Medienserver als Daemon starten lassen. Mit dem Dienst aus @code{(gnu home
services kodi)} richten Sie Kodi so ein, dass er mit der Benutzeranmeldung
automatisch startet.

Hier sehen Sie ein Beispiel, wie so ein Dienst aussehen und konfiguriert
werden kann, wenn Sie ihn im @code{services}-Feld innerhalb von
@code{home-environment} in Ihrer Persönlichen Konfiguration eintragen:

@lisp
(service home-kodi-service-type
  (home-kodi-configuration
   (extra-options '("--settings="<Datei-mit-Einstellungen>"))))
@end lisp

@defvar home-kodi-service-type
Dies ist der Diensttyp des Persönlichen Kodi-Dienstes. Als Wert verwendet er
ein @code{home-kodi-configuration}-Objekt.
@end defvar

@deftp {Datentyp} home-kodi-configuration
Verfügbare @code{home-kodi-configuration}-Felder sind:

@table @asis
@item @code{kodi} (Vorgabe: @code{kodi}) (Typ: dateiartig)
Das zu benutzende Kodi-Paket.

@item @code{extra-options} (Vorgabe: @code{'()})
Zusätzliche Befehlszeilenoptionen, mit denen @command{kodi} gestartet werden
soll. Führen Sie @command{man kodi} aus, um weitere Informationen zu
erhalten.

@end table
@end deftp

@c This is ugly, but upstream does *not* capitalize the ``m'' even when
@c at the beginning of a sentence.  So let us follow the branding.
@node mpv Media Player
@subsection mpv Media Player

@cindex mpv, Home Service
@cindex mpv, configuration
Configuring the @uref{https://mpv.io/, mpv media player} can be somewhat
daunting task, due to the sheer amount of options available, especially if
one wants to be able to inherit the configuration in their code.  The
@code{home-mpv-service-type} is provided to help with that problem.  When
the service is added to your home environment, file based on the passed
configuration is generated and placed into the correct location.

Due to the bug #74748, it does not use Guix Records to represent the
configuration, but uses keyword arguments to achieve similar result.
Example follows:

@lisp
(service home-mpv-service-type
         (make-home-mpv-configuration
          #:global (make-mpv-profile-configuration
                    #:fullscreen? #t
                    #:alang '("jpn" "eng"))))
@end lisp

@defvar home-mpv-service-type
This is the type of the mpv home service, whose value is a
@code{home-mpv-configuration} object.
@end defvar

@deffn {Procedure} make-home-mpv-configuration
Return a new instance of @code{home-mpv-configuration}.  Available keyword
arguments are:

@table @asis
@item @code{inherit} (default: @code{#t})
Inherit fields from an another instance.

@item @code{global} (default: @code{(make-mpv-profile-configuration)})
The global configuration preceding all profiles.

@item @code{profiles} (default: @code{()})
An alist containing configuration for any additional profiles to include in
the configuration file.

@lisp
(make-home-mpv-configuration
 #:profiles `((fullscreen . ,(make-mpv-profile-configuration
                              #:fullscreen? #t))))
@end lisp

@item @code{extra-config} (default: @code{#f})
Additional content to include in the configuration file.  It is placed at
the end of the file.

@end table
@end deffn

@deffn {Procedure} make-mpv-profile-configuration
Return a new instance of @code{mpv-profile-configuration}.  As above, it
also supports the @code{#:inherit} argument.  Additionally it supports
keyword arguments named after the options of @command{mpv}.  Hence
@option{--fullscreen} (or @code{fullscreen} in the configuration file)
becomes @code{#:fullscreen?}.

Few options are using their aliases instead.  @option{audio} instead of
@option{aid}, @option{video} instead of @option{vid}, @option{sub} instead
of @option{sid}, @option{screenshot-directory} instead of
@option{screenshot-dir} and @option{watch-later-directory} instead of
@option{watch-later-dir}.

Valid values for the fields depend on their type.

@table @asis
@item Flags
The value should be @code{#f} or @code{#t}.

@item Numerical fields
Integer and integer64 fields are validated by @code{integer?}, float and
double fields by @code{real?}.  Ranges are checked when applicable.

@item Aspect
Same as integer.

@item ByteSize
Same as integer64.

@item Choice
The value should be a symbol representing member of the enumeration.  If the
choice has @samp{or ...} part, it can also be value of that alternative
type.

@item @var{type} list
The value should be a list of the @var{type}.

@end table

Other types accept strings, with validation of the values where possible
(e.g. type @samp{Color} is validated, but type @samp{Audio channels or
channel map} is not).  If an option is marked as taking a file, values
satisfying @code{file-like?} can also be used.

The full list of currently supported keyword arguments is below.  For the
types, allowed values and full description please refer to the @command{mpv
--list-options} and @uref{https://mpv.io/manual/stable/#options, mpv
manual}.

Only set fields are output to the configuration file.  Accessors are
provided for every field, returning either their value or a sentinel object
@code{%unset-value} (from @code{(gnu services configuration)}).

@code{ab-loop-a}, @code{ab-loop-b}, @code{ab-loop-count},
@code{access-references?}, @code{ad}, @code{ad-lavc-ac3drc},
@code{ad-lavc-downmix?}, @code{ad-lavc-o}, @code{ad-lavc-threads},
@code{ad-queue-enable?}, @code{ad-queue-max-bytes},
@code{ad-queue-max-samples}, @code{ad-queue-max-secs}, @code{af},
@code{audio}, @code{alang}, @code{allow-delayed-peak-detect?},
@code{alsa-buffer-time}, @code{alsa-ignore-chmap?},
@code{alsa-mixer-device}, @code{alsa-mixer-index}, @code{alsa-mixer-name},
@code{alsa-non-interleaved?}, @code{alsa-periods}, @code{alsa-resample?},
@code{ao}, @code{ao-null-broken-delay?}, @code{ao-null-broken-eof?},
@code{ao-null-buffer}, @code{ao-null-channel-layouts},
@code{ao-null-format}, @code{ao-null-latency}, @code{ao-null-outburst},
@code{ao-null-speed}, @code{ao-null-untimed?}, @code{ao-pcm-append?},
@code{ao-pcm-file}, @code{ao-pcm-waveheader?}, @code{archive-exts},
@code{audio-backward-batch}, @code{audio-backward-overlap},
@code{audio-buffer}, @code{audio-channels}, @code{audio-client-name},
@code{audio-delay}, @code{audio-demuxer}, @code{audio-device},
@code{audio-display}, @code{audio-exclusive?}, @code{audio-exts},
@code{audio-fallback-to-null?}, @code{audio-file-auto},
@code{audio-file-paths}, @code{audio-files}, @code{audio-format},
@code{audio-normalize-downmix?}, @code{audio-pitch-correction?},
@code{audio-resample-cutoff}, @code{audio-resample-filter-size},
@code{audio-resample-linear?}, @code{audio-resample-max-output-size},
@code{audio-resample-phase-shift}, @code{audio-reversal-buffer},
@code{audio-samplerate}, @code{audio-spdif}, @code{audio-stream-silence?},
@code{audio-swresample-o}, @code{audio-wait-open},
@code{auto-window-resize?}, @code{autocreate-playlist}, @code{autofit},
@code{autofit-larger}, @code{autofit-smaller}, @code{autoload-files?},
@code{autosync}, @code{background}, @code{background-color},
@code{blend-subtitles}, @code{bluray-device}, @code{border?},
@code{border-background}, @code{brightness}, @code{cache},
@code{cache-on-disk?}, @code{cache-pause?}, @code{cache-pause-initial?},
@code{cache-pause-wait}, @code{cache-secs}, @code{cdda-cdtext?},
@code{cdda-device}, @code{cdda-overlap}, @code{cdda-paranoia},
@code{cdda-sector-size}, @code{cdda-skip?}, @code{cdda-span-a},
@code{cdda-span-b}, @code{cdda-speed}, @code{cdda-toc-offset},
@code{chapter-merge-threshold}, @code{chapter-seek-threshold},
@code{chapters-file}, @code{clipboard-backends}, @code{clipboard-monitor?},
@code{config?}, @code{container-fps-override}, @code{contrast},
@code{cookies?}, @code{cookies-file}, @code{corner-rounding},
@code{correct-downscaling?}, @code{correct-pts?}, @code{cover-art-auto},
@code{cover-art-files}, @code{cover-art-whitelist}, @code{cscale},
@code{cscale-antiring}, @code{cscale-blur}, @code{cscale-clamp},
@code{cscale-param1}, @code{cscale-param2}, @code{cscale-radius},
@code{cscale-taper}, @code{cscale-window}, @code{cscale-wparam},
@code{cscale-wtaper}, @code{cursor-autohide},
@code{cursor-autohide-fs-only?}, @code{deband?}, @code{deband-grain},
@code{deband-iterations}, @code{deband-range}, @code{deband-threshold},
@code{deinterlace}, @code{deinterlace-field-parity}, @code{demuxer},
@code{demuxer-backward-playback-step}, @code{demuxer-cache-dir},
@code{demuxer-cache-unlink-files}, @code{demuxer-cache-wait?},
@code{demuxer-donate-buffer?}, @code{demuxer-hysteresis-secs},
@code{demuxer-lavf-allow-mimetype?}, @code{demuxer-lavf-analyzeduration},
@code{demuxer-lavf-buffersize}, @code{demuxer-lavf-format},
@code{demuxer-lavf-hacks?}, @code{demuxer-lavf-linearize-timestamps},
@code{demuxer-lavf-o}, @code{demuxer-lavf-probe-info},
@code{demuxer-lavf-probescore}, @code{demuxer-lavf-probesize},
@code{demuxer-lavf-propagate-opts?}, @code{demuxer-max-back-bytes},
@code{demuxer-max-bytes}, @code{demuxer-mkv-crop-compat?},
@code{demuxer-mkv-probe-start-time?},
@code{demuxer-mkv-probe-video-duration},
@code{demuxer-mkv-subtitle-preroll},
@code{demuxer-mkv-subtitle-preroll-secs},
@code{demuxer-mkv-subtitle-preroll-secs-index},
@code{demuxer-rawaudio-channels}, @code{demuxer-rawaudio-format},
@code{demuxer-rawaudio-rate}, @code{demuxer-rawvideo-codec},
@code{demuxer-rawvideo-format}, @code{demuxer-rawvideo-fps},
@code{demuxer-rawvideo-h}, @code{demuxer-rawvideo-mp-format},
@code{demuxer-rawvideo-size}, @code{demuxer-rawvideo-w},
@code{demuxer-readahead-secs}, @code{demuxer-seekable-cache},
@code{demuxer-termination-timeout}, @code{demuxer-thread?},
@code{directory-filter-types}, @code{directory-mode},
@code{display-fps-override}, @code{display-tags}, @code{dither},
@code{dither-depth}, @code{dither-size-fruit}, @code{drag-and-drop},
@code{dscale}, @code{dscale-antiring}, @code{dscale-blur},
@code{dscale-clamp}, @code{dscale-param1}, @code{dscale-param2},
@code{dscale-radius}, @code{dscale-taper}, @code{dscale-window},
@code{dscale-wparam}, @code{dscale-wtaper}, @code{dump-stats},
@code{dvbin-card}, @code{dvbin-channel-switch-offset}, @code{dvbin-file},
@code{dvbin-full-transponder?}, @code{dvbin-prog}, @code{dvbin-timeout},
@code{dvd-angle}, @code{dvd-device}, @code{dvd-speed}, @code{edition},
@code{egl-config-id}, @code{egl-output-format}, @code{embeddedfonts?},
@code{end}, @code{error-diffusion}, @code{external-files},
@code{fbo-format}, @code{focus-on}, @code{force-media-title},
@code{force-render?}, @code{force-rgba-osd-rendering?},
@code{force-seekable?}, @code{force-window}, @code{force-window-position?},
@code{framedrop}, @code{frames}, @code{fs-screen}, @code{fs-screen-name},
@code{fullscreen?}, @code{gamma}, @code{gamma-auto?}, @code{gamma-factor},
@code{gamut-mapping-mode}, @code{gapless-audio}, @code{geometry},
@code{glsl-shader-opts}, @code{glsl-shaders}, @code{gpu-api},
@code{gpu-context}, @code{gpu-debug?}, @code{gpu-dumb-mode},
@code{gpu-hwdec-interop}, @code{gpu-shader-cache?},
@code{gpu-shader-cache-dir}, @code{gpu-sw?}, @code{gpu-tex-pad-x},
@code{gpu-tex-pad-y}, @code{hdr-compute-peak}, @code{hdr-contrast-recovery},
@code{hdr-contrast-smoothness}, @code{hdr-peak-decay-rate},
@code{hdr-peak-percentile}, @code{hdr-scene-threshold-high},
@code{hdr-scene-threshold-low}, @code{hidpi-window-scale?},
@code{hls-bitrate}, @code{hr-seek}, @code{hr-seek-demuxer-offset},
@code{hr-seek-framedrop?}, @code{http-header-fields}, @code{http-proxy},
@code{hue}, @code{hwdec}, @code{hwdec-codecs}, @code{hwdec-extra-frames},
@code{hwdec-image-format}, @code{hwdec-software-fallback},
@code{icc-3dlut-size}, @code{icc-cache?}, @code{icc-cache-dir},
@code{icc-force-contrast}, @code{icc-intent}, @code{icc-profile},
@code{icc-profile-auto?}, @code{icc-use-luma?}, @code{idle},
@code{ignore-path-in-watch-later-config?}, @code{image-display-duration},
@code{image-exts}, @code{image-lut}, @code{image-lut-type},
@code{image-subs-video-resolution?}, @code{include}, @code{index},
@code{initial-audio-sync?}, @code{input-ar-delay}, @code{input-ar-rate},
@code{input-builtin-bindings?}, @code{input-builtin-dragging?},
@code{input-commands}, @code{input-conf}, @code{input-cursor?},
@code{input-cursor-passthrough?}, @code{input-default-bindings?},
@code{input-doubleclick-time}, @code{input-dragging-deadzone},
@code{input-ime?}, @code{input-ipc-client}, @code{input-ipc-server},
@code{input-key-fifo-size}, @code{input-media-keys?},
@code{input-preprocess-wheel?}, @code{input-right-alt-gr?},
@code{input-terminal?}, @code{input-test?},
@code{input-touch-emulate-mouse?}, @code{input-vo-keyboard?},
@code{interpolation?}, @code{interpolation-preserve?},
@code{interpolation-threshold}, @code{inverse-tone-mapping?},
@code{jack-autostart?}, @code{jack-connect?}, @code{jack-name},
@code{jack-port}, @code{jack-std-channel-layout}, @code{keep-open},
@code{keep-open-pause?}, @code{keepaspect?}, @code{keepaspect-window?},
@code{lavfi-complex}, @code{length}, @code{libplacebo-opts},
@code{linear-downscaling?}, @code{linear-upscaling?},
@code{load-auto-profiles}, @code{load-commands?}, @code{load-console?},
@code{load-positioning?}, @code{load-scripts?}, @code{load-select?},
@code{load-stats-overlay?}, @code{load-unsafe-playlists?}, @code{log-file},
@code{loop-file}, @code{loop-playlist}, @code{lut}, @code{lut-type},
@code{mc}, @code{media-controls?}, @code{merge-files?},
@code{metadata-codepage}, @code{mf-fps}, @code{mf-type},
@code{monitoraspect}, @code{monitorpixelaspect}, @code{msg-color?},
@code{msg-level}, @code{msg-module?}, @code{msg-time?}, @code{mute?},
@code{native-fs?}, @code{native-keyrepeat?}, @code{native-touch?},
@code{network-timeout}, @code{oac}, @code{oacopts}, @code{ocopy-metadata?},
@code{of}, @code{ofopts}, @code{on-all-workspaces?}, @code{ontop?},
@code{ontop-level}, @code{opengl-check-pattern-a},
@code{opengl-check-pattern-b}, @code{opengl-early-flush}, @code{opengl-es},
@code{opengl-glfinish?}, @code{opengl-pbo?},
@code{opengl-rectangle-textures?}, @code{opengl-swapinterval},
@code{opengl-waitvsync?}, @code{orawts?}, @code{ordered-chapters?},
@code{ordered-chapters-files}, @code{oremove-metadata}, @code{osc?},
@code{osd-align-x}, @code{osd-align-y}, @code{osd-back-color},
@code{osd-bar?}, @code{osd-bar-align-x}, @code{osd-bar-align-y},
@code{osd-bar-h}, @code{osd-bar-marker-min-size},
@code{osd-bar-marker-scale}, @code{osd-bar-marker-style},
@code{osd-bar-outline-size}, @code{osd-bar-w}, @code{osd-blur},
@code{osd-bold?}, @code{osd-border-style}, @code{osd-color},
@code{osd-duration}, @code{osd-font}, @code{osd-font-provider},
@code{osd-font-size}, @code{osd-fonts-dir}, @code{osd-fractions?},
@code{osd-italic?}, @code{osd-justify}, @code{osd-level},
@code{osd-margin-x}, @code{osd-margin-y}, @code{osd-msg1}, @code{osd-msg2},
@code{osd-msg3}, @code{osd-on-seek}, @code{osd-outline-color},
@code{osd-outline-size}, @code{osd-playing-msg},
@code{osd-playing-msg-duration}, @code{osd-playlist-entry},
@code{osd-scale}, @code{osd-scale-by-window?}, @code{osd-selected-color},
@code{osd-selected-outline-color}, @code{osd-shadow-offset},
@code{osd-spacing}, @code{osd-status-msg}, @code{oset-metadata}, @code{ovc},
@code{ovcopts}, @code{panscan}, @code{pause?}, @code{pipewire-buffer},
@code{pipewire-remote}, @code{pipewire-volume-mode}, @code{pitch},
@code{play-direction}, @code{player-operation-mode}, @code{playlist-exts},
@code{playlist-start}, @code{prefetch-playlist?}, @code{profile},
@code{pulse-allow-suspended?}, @code{pulse-buffer}, @code{pulse-host},
@code{pulse-latency-hacks?}, @code{quiet?}, @code{really-quiet?},
@code{rebase-start-time?}, @code{referrer}, @code{replaygain},
@code{replaygain-clip?}, @code{replaygain-fallback},
@code{replaygain-preamp}, @code{reset-on-next-file},
@code{resume-playback?}, @code{resume-playback-check-mtime?},
@code{rtsp-transport}, @code{saturation}, @code{save-position-on-quit?},
@code{save-watch-history?}, @code{scale}, @code{scale-antiring},
@code{scale-blur}, @code{scale-clamp}, @code{scale-param1},
@code{scale-param2}, @code{scale-radius}, @code{scale-taper},
@code{scale-window}, @code{scale-wparam}, @code{scale-wtaper},
@code{scaler-resizes-only?}, @code{screen}, @code{screen-name},
@code{screenshot-avif-encoder}, @code{screenshot-avif-opts},
@code{screenshot-avif-pixfmt}, @code{screenshot-directory},
@code{screenshot-format}, @code{screenshot-high-bit-depth?},
@code{screenshot-jpeg-quality}, @code{screenshot-jpeg-source-chroma?},
@code{screenshot-jxl-distance}, @code{screenshot-jxl-effort},
@code{screenshot-png-compression}, @code{screenshot-png-filter},
@code{screenshot-sw?}, @code{screenshot-tag-colorspace?},
@code{screenshot-template}, @code{screenshot-webp-compression},
@code{screenshot-webp-lossless?}, @code{screenshot-webp-quality},
@code{script-opts}, @code{scripts}, @code{secondary-sid},
@code{secondary-sub-ass-override}, @code{secondary-sub-delay},
@code{secondary-sub-pos}, @code{secondary-sub-visibility?}, @code{sharpen},
@code{show-in-taskbar?}, @code{shuffle?}, @code{sub}, @code{sigmoid-center},
@code{sigmoid-slope}, @code{sigmoid-upscaling?}, @code{slang},
@code{snap-window?}, @code{speed}, @code{spirv-compiler}, @code{sstep},
@code{start}, @code{stop-playback-on-init-failure?},
@code{stop-screensaver}, @code{stream-buffer-size}, @code{stream-dump},
@code{stream-lavf-o}, @code{stream-record}, @code{stretch-dvd-subs?},
@code{stretch-image-subs-to-screen?}, @code{sub-align-x},
@code{sub-align-y}, @code{sub-ass?}, @code{sub-ass-force-margins?},
@code{sub-ass-justify?}, @code{sub-ass-override},
@code{sub-ass-prune-delay}, @code{sub-ass-scale-with-window?},
@code{sub-ass-style-overrides}, @code{sub-ass-styles},
@code{sub-ass-use-video-data}, @code{sub-ass-video-aspect-override},
@code{sub-ass-vsfilter-color-compat}, @code{sub-auto}, @code{sub-auto-exts},
@code{sub-back-color}, @code{sub-blur}, @code{sub-bold?},
@code{sub-border-style}, @code{sub-clear-on-seek?}, @code{sub-codepage},
@code{sub-color}, @code{sub-create-cc-track?}, @code{sub-delay},
@code{sub-demuxer}, @code{sub-file-paths}, @code{sub-files},
@code{sub-filter-jsre}, @code{sub-filter-regex},
@code{sub-filter-regex-enable?}, @code{sub-filter-regex-plain?},
@code{sub-filter-regex-warn?}, @code{sub-filter-sdh?},
@code{sub-filter-sdh-enclosures}, @code{sub-filter-sdh-harder?},
@code{sub-fix-timing?}, @code{sub-font}, @code{sub-font-provider},
@code{sub-font-size}, @code{sub-fonts-dir}, @code{sub-forced-events-only?},
@code{sub-fps}, @code{sub-gauss}, @code{sub-gray?}, @code{sub-hinting},
@code{sub-italic?}, @code{sub-justify}, @code{sub-lavc-o},
@code{sub-line-spacing}, @code{sub-margin-x}, @code{sub-margin-y},
@code{sub-outline-color}, @code{sub-outline-size},
@code{sub-past-video-end?}, @code{sub-pos}, @code{sub-scale},
@code{sub-scale-by-window?}, @code{sub-scale-signs?},
@code{sub-scale-with-window?}, @code{sub-shadow-offset}, @code{sub-shaper},
@code{sub-spacing}, @code{sub-speed}, @code{sub-stretch-durations?},
@code{sub-use-margins?}, @code{sub-visibility?},
@code{sub-vsfilter-bidi-compat?}, @code{subs-fallback},
@code{subs-fallback-forced}, @code{subs-match-os-language?},
@code{subs-with-matching-audio}, @code{swapchain-depth},
@code{sws-allow-zimg?}, @code{sws-bitexact?}, @code{sws-cgb},
@code{sws-chs}, @code{sws-cs}, @code{sws-cvs}, @code{sws-fast?},
@code{sws-lgb}, @code{sws-ls}, @code{sws-scaler},
@code{target-colorspace-hint}, @code{target-contrast}, @code{target-gamut},
@code{target-lut}, @code{target-peak}, @code{target-prim},
@code{target-trc}, @code{taskbar-progress?}, @code{teletext-page},
@code{temporal-dither?}, @code{temporal-dither-period}, @code{term-osd},
@code{term-osd-bar?}, @code{term-osd-bar-chars}, @code{term-playing-msg},
@code{term-status-msg}, @code{term-title}, @code{terminal?}, @code{title},
@code{title-bar?}, @code{tls-ca-file}, @code{tls-cert-file},
@code{tls-key-file}, @code{tls-verify?}, @code{tone-mapping},
@code{tone-mapping-max-boost}, @code{tone-mapping-param},
@code{tone-mapping-visualize?}, @code{track-auto-selection?}, @code{tscale},
@code{tscale-antiring}, @code{tscale-blur}, @code{tscale-clamp},
@code{tscale-param1}, @code{tscale-param2}, @code{tscale-radius},
@code{tscale-taper}, @code{tscale-window}, @code{tscale-wparam},
@code{tscale-wtaper}, @code{untimed?}, @code{use-embedded-icc-profile?},
@code{use-filedir-conf?}, @code{user-agent}, @code{vaapi-device}, @code{vd},
@code{vd-apply-cropping?}, @code{vd-lavc-assume-old-x264?},
@code{vd-lavc-bitexact?}, @code{vd-lavc-check-hw-profile?},
@code{vd-lavc-dr}, @code{vd-lavc-fast?}, @code{vd-lavc-film-grain},
@code{vd-lavc-framedrop}, @code{vd-lavc-o}, @code{vd-lavc-show-all?},
@code{vd-lavc-skipframe}, @code{vd-lavc-skipidct},
@code{vd-lavc-skiploopfilter}, @code{vd-lavc-threads},
@code{vd-queue-enable?}, @code{vd-queue-max-bytes},
@code{vd-queue-max-samples}, @code{vd-queue-max-secs}, @code{vf},
@code{video}, @code{video-align-x}, @code{video-align-y},
@code{video-aspect-method}, @code{video-aspect-override},
@code{video-backward-batch}, @code{video-backward-overlap},
@code{video-crop}, @code{video-exts}, @code{video-latency-hacks?},
@code{video-margin-ratio-bottom}, @code{video-margin-ratio-left},
@code{video-margin-ratio-right}, @code{video-margin-ratio-top},
@code{video-osd?}, @code{video-output-levels}, @code{video-pan-x},
@code{video-pan-y}, @code{video-recenter?}, @code{video-reversal-buffer},
@code{video-rotate}, @code{video-scale-x}, @code{video-scale-y},
@code{video-sync}, @code{video-sync-max-audio-change},
@code{video-sync-max-factor}, @code{video-sync-max-video-change},
@code{video-timing-offset}, @code{video-unscaled}, @code{video-zoom},
@code{vlang}, @code{vo}, @code{vo-image-avif-encoder},
@code{vo-image-avif-opts}, @code{vo-image-avif-pixfmt},
@code{vo-image-format}, @code{vo-image-high-bit-depth?},
@code{vo-image-jpeg-quality}, @code{vo-image-jpeg-source-chroma?},
@code{vo-image-jxl-distance}, @code{vo-image-jxl-effort},
@code{vo-image-outdir}, @code{vo-image-png-compression},
@code{vo-image-png-filter}, @code{vo-image-tag-colorspace?},
@code{vo-image-webp-compression}, @code{vo-image-webp-lossless?},
@code{vo-image-webp-quality}, @code{vo-kitty-alt-screen?},
@code{vo-kitty-cols}, @code{vo-kitty-config-clear?}, @code{vo-kitty-height},
@code{vo-kitty-left}, @code{vo-kitty-rows}, @code{vo-kitty-top},
@code{vo-kitty-use-shm?}, @code{vo-kitty-width}, @code{vo-null-fps},
@code{vo-sixel-alt-screen?}, @code{vo-sixel-buffered?},
@code{vo-sixel-cols}, @code{vo-sixel-config-clear?}, @code{vo-sixel-dither},
@code{vo-sixel-fixedpalette?}, @code{vo-sixel-height}, @code{vo-sixel-left},
@code{vo-sixel-pad-x}, @code{vo-sixel-pad-y}, @code{vo-sixel-reqcolors},
@code{vo-sixel-rows}, @code{vo-sixel-threshold}, @code{vo-sixel-top},
@code{vo-sixel-width}, @code{vo-tct-256?}, @code{vo-tct-algo},
@code{vo-tct-buffering}, @code{vo-tct-height}, @code{vo-tct-width},
@code{vo-vaapi-scaled-osd?}, @code{vo-vaapi-scaling},
@code{vo-vdpau-chroma-deint?}, @code{vo-vdpau-colorkey},
@code{vo-vdpau-composite-detect?}, @code{vo-vdpau-denoise},
@code{vo-vdpau-force-yuv?}, @code{vo-vdpau-fps}, @code{vo-vdpau-hqscaling},
@code{vo-vdpau-output-surfaces}, @code{vo-vdpau-pullup?},
@code{vo-vdpau-queuetime-fs}, @code{vo-vdpau-queuetime-windowed},
@code{vo-vdpau-sharpen}, @code{volume}, @code{volume-gain},
@code{volume-gain-max}, @code{volume-gain-min}, @code{volume-max},
@code{vulkan-async-compute?}, @code{vulkan-async-transfer?},
@code{vulkan-device}, @code{vulkan-display-display},
@code{vulkan-display-mode}, @code{vulkan-display-plane},
@code{vulkan-queue-count}, @code{vulkan-swap-mode},
@code{watch-history-path}, @code{watch-later-directory},
@code{watch-later-options}, @code{wayland-app-id},
@code{wayland-configure-bounds}, @code{wayland-content-type},
@code{wayland-disable-vsync?}, @code{wayland-edge-pixels-pointer},
@code{wayland-edge-pixels-touch}, @code{wayland-internal-vsync},
@code{wayland-present?}, @code{wid}, @code{window-dragging?},
@code{window-maximized?}, @code{window-minimized?}, @code{window-scale},
@code{write-filename-in-watch-later-config?}, @code{x11-bypass-compositor},
@code{x11-name}, @code{x11-netwm}, @code{x11-present},
@code{x11-wid-title?}, @code{xv-adaptor}, @code{xv-buffers}, @code{xv-ck},
@code{xv-ck-method}, @code{xv-colorkey}, @code{xv-port}, @code{ytdl?},
@code{ytdl-format}, @code{ytdl-raw-options}, @code{zimg-dither},
@code{zimg-fast?}, @code{zimg-scaler}, @code{zimg-scaler-chroma},
@code{zimg-scaler-chroma-param-a}, @code{zimg-scaler-chroma-param-b},
@code{zimg-scaler-param-a}, @code{zimg-scaler-param-b}, and
@code{zimg-threads}.

@end deffn

@node Niri window manager
@subsection Niri window manager

@cindex niri, Home Service
@cindex niri, configuration
@cindex Wayland compositor
@cindex scrollable tiling window manager
The @code{(gnu home services niri)} module provides the
@code{home-niri-service-type} service, which installs and configures
@uref{https://github.com/YaLTeR/niri, Niri}, a scrollable tiling Wayland
compositor. Niri combines traditional tiling window management with smooth
scrolling between workspaces.

This service starts Niri as a user-level desktop session with proper
environment variables configured for Wayland compatibility, including
@code{XDG_CURRENT_DESKTOP}, @code{XDG_SESSION_DESKTOP}, and
@code{DESKTOP_SESSION}.

Here is a minimal example service declaration for your
@code{home-environment} configuration:

@example
(service home-niri-service-type)
@end example

For more advanced configurations, you can customize the service with a
@code{niri-configuration} record to specify additional environment
variables.

@node Sway-Fensterverwaltung
@subsection Sway-Fensterverwaltung

@cindex Sway, Persönlicher Dienst
@cindex Sway, Konfiguration
Im Modul @code{(gnu home services sway)} wird @code{home-sway-service-type}
angeboten, ein Persönlicher Dienst, um die
@uref{https://github.com/swaywm/sway,Sway-Fensterverwaltung für Wayland}
deklarativ zu konfigurieren.

Hier sehen Sie ein Beispiel, wie so ein Dienst aussehen und konfiguriert
werden kann, wenn Sie ihn im @code{services}-Feld innerhalb von
@code{home-environment} in Ihrer Persönlichen Konfiguration eintragen:

@lisp
(service home-sway-service-type
         (sway-configuration
          (gestures
           '((swipe:3:down . "move to scratchpad")
             (swipe:3:up   . "scratchpad show")))
          (outputs
           (list (sway-output
                  (identifier '*)
                  (background (file-append sway
                                           "\
/share/backgrounds/sway/Sway_Wallpaper_Blue_1920x1080.png")))))))
@end lisp

Obiges Beispiel stellt eine Sway-Konfiguration dar, wo
@itemize
@item
alle Monitore ein bestimmtes Hintergrundbild benutzen mit einer @file{.png}
aus dem Paket @code{sway},
@item
durch Wischen nach unten (bzw.@: oben) mit drei Fingern das aktive Fenster
in die Ablage, das „Scratchpad“, bewegt wird (bzw.@: das Scratchpad
gezeigt/verborgen wird).
@end itemize

@quotation Anmerkung
Dieser Persönliche Dienst richtet nur die Konfigurationsdatei ein und legt
Pakete für Sway ins Profil. Er startet Sway aber @emph{nicht} von
selbst. Wenn Sie das möchten, gefällt Ihnen dazu vielleicht stattdessen
@code{greetd-wlgreet-sway-session}.

Die unten definierte Prozedur @code{sway-configuration->file} kann als Wert
für das @emph{optionale} Feld @code{sway-configuration} in
@code{greetd-wlgreet-sway-session} genutzt werden.
@end quotation

@deffn {Prozedur} sway-configuration->file config
Diese Prozedur nimmt ein Argument @code{config} entgegen, das ein
@code{sway-configuration}-Verbundsobjekt (wie unten definiert) sein muss,
und sie liefert ein dateiartiges Objekt, das der serialisierten
Konfiguration entspricht.
@end deffn

@defvar home-sway-service-type
Dies ist ein Persönlicher Diensttyp zum Einrichten von Sway. Er kümmert sich
um Folgendes:
@itemize
@item
Eine Datei @file{~/.config/sway/config} wird bereitgestellt.
@item
Sway-bezogene Pakete werden in Ihr Profil aufgenommen.
@end itemize

It is possible to extend this service (@pxref{Dienstkompositionen}).  The
resulting configuration file contains the concatenation of keybindings,
modes, @i{etc.}@: found in all extensions.

@quotation Anmerkung
At the moment, only one bar configuration is allowed.  If more are found, an
error will be raised.
@end quotation
@end defvar

@defvar %empty-sway-configuration
The variable @code{%empty-sway-configuration} contains an empty
@code{sway-configuration} record.  This value can help users write simple
service extensions.
@end defvar

@deftp {Datentyp} sway-configuration
Das Verbundsobjekt beschreibt die Sway-Konfiguration (siehe@
@cite{sway(5)}). Diese Felder sind verfügbar:

@table @asis
@item @code{variables} (Vorgabe: @code{%sway-default-variables})
Der Wert dieses Feldes ist eine assoziative Liste, wo die Schlüssel Symbole
sind und die Werte entweder Zeichenketten, G-Ausdrücke oder dateiartige
Objekte sind (siehe @ref{G-Ausdrücke}).

Beispiel:
@lisp
(variables `((mod . "Mod4") ; Zeichenkette
             (term ; file-append
              . ,(file-append foot "/bin/foot"))
             (Term ; G-Ausdruck
              . ,#~(string-append #$foot "/bin/foot"))))
@end lisp

@quotation Anmerkung
Die vorgegebenen Tastenbelegungen funktionieren nur, wenn Variable namens
@code{$mod}, @code{$left}, @code{$right}, @code{$up} und @code{$down}
zugewiesen wurden. Wenn Sie sie nicht alle definieren möchten, dann müssen
Sie die Tastenbelegungen entfernen, die auf sie verweisen.
@end quotation

@item @code{keybindings} (Vorgabe: @code{%sway-default-keybindings})
Dieses Feld beschreibt die Tastenbelegungen im voreingestellten Modus
@emph{default}. Als Wert wird eine assoziative Liste angegeben; Schlüssel
sind Symbole und Werte können eines davon sein:
@itemize
@item
Zeichenketten oder G-Ausdrücke,
@item
eine Cons-Zelle oder eine Zeichenkette oder ein G-Ausdruck, zusammen mit
einer Liste von Optionen. Optionen sind eine Zeichenkette mit
„input-device=“ am Anfang oder Zeichenketten ``no-warn'', ``whole-window'',
``border'', ``exclude-titlebar'', ``release'', ``locked'', ``to-code'',
``inhibited'' und ``no-repeat''.
@end itemize

Mit diesem Schnipsel würde man das Terminal über die Tastenkombination
@kbd{$mod+t} aufrufen und auch durch Drücken von @kbd{$mod+Shift+t}
(vorausgesetzt eine Variable @code{$term} ist definiert):
@lisp
`(($mod+t . ,#~(string-append "exec " #$foot "/bin/foot"))
  ($mod+Shift+t . "exec $term")
  ($mod+q "exec $term" . ("to-code"))) ;; passes the --to-code option.
@end lisp

@item @code{gestures} (Vorgabe: @code{%sway-default-gestures})
Similar to the previous field, but for finger-gestures.  Options must start
with ``input-device='' or be among ``exact'' and ``no-warn''.

Mit folgendem Schnipsel wird es möglich, durch Wischen mit drei Fingern nach
rechts und links durch die Arbeitsflächen zu navigieren:
@lisp
'((swipe:3:right . "workspace next_on_output")
  (swipe:3:left    "workspace prev_on_output" . ("exact")))
@end lisp

@item @code{packages} (Vorgabe: @code{%sway-default-packages})
In diesem Feld wird eine Liste von Paketen aufgeführt, die ins
Benutzerprofil aufgenommen werden sollen. Derzeit besagt der Vorgabewert
nur, dass @code{sway} zum Profil hinzugefügt werden soll.

@item @code{inputs} (Vorgabe: @code{'()})
Eine Liste von @dfn{sway-input}-Verbundsobjekten (unten beschrieben).

@item @code{outputs} (Vorgabe: @code{'()})
Eine Liste von @dfn{sway-output}-Verbundsobjekten (unten beschrieben).

@item @code{bar} (optional @code{sway-bar}-Verbundsobjekt)
Optional ein @code{sway-bar}-Verbundsobjekt (unten beschrieben), um eine
Leiste „Sway bar“ einzufügen.

@item @code{modes} (Vorgabe: @code{%sway-default-modes})
Eine Liste von @dfn{sway-mode}-Verbundsobjekten (unten beschrieben), um Modi
zur Sway-Konfiguration hinzuzufügen. Beim Vorgabewert
@code{%sway-default-modes} wird ein Modus „resize“ wie in Sways
Voreinstellungen hinzugefügt (wie unten beschrieben).

@item @code{startup+reload-programs} (Vorgabe: @code{'()})
Welche Programme beim Start @emph{sowie} nach jedem Neuladen der
Konfiguration ausgeführt werden. Der Wert dieses Feldes ist eine Liste von
Zeichenketten, G-Ausdrücken oder dateiartigen Objekten (siehe
@ref{G-Ausdrücke}).

@item @code{startup-programs} (Vorgabe: @code{%sway-default-startup-programs})
Welche Programme beim Start ausgeführt werden. Der Wert dieses Feldes ist
eine Liste von Zeichenketten, G-Ausdrücken oder dateiartigen Objekten (siehe
@ref{G-Ausdrücke}).

Beim Vorgabewert @code{%sway-default-startup-programs} läuft
@code{swayidle}, damit nach 50 Minuten der Inaktivität der Bildschirm
gesperrt wird (als Hintergrund wird ein mit Sway mitgeliefertes Bild
eingeblendet) und nach 100 Minuten Inaktivität wird der Bildschirm gesperrt.

@item @code{extra-content} (Vorgabe: @code{'()})
Weitere Zeilen, die an die Konfigurationsdatei angehängt werden. Als Wert
für das Feld wird eine Liste von Zeichenketten oder G-Ausdrücken angegeben.
@end table
@end deftp

@deftp {Datentyp} sway-input
@code{sway-input}-Verbundsobjekte beschreiben Blöcke für Eingabemethoden
(siehe@ @cite{sway-input(5)}). Zum Beispiel wendet folgendes Schnipsel eine
französische Tastaturbelegung auf alle Tastaturen an und belegt zudem die
Taste @kbd{capslock} auf @kbd{ctrl}:
@lisp
(sway-input (identifier "type:keyboard")
            (layout
              (keyboard-layout "fr" #:options '("ctrl:nocaps"))))
@end lisp

Verfügbare Felder für ein @code{sway-input}-Verbundsobjekt sind:

@table @asis
@item @code{identifier} (Vorgabe: @code{'*})
Identifikator der Eingabe. Für das Feld können Sie ein Symbol oder eine
Zeichenkette angeben. Wenn @code{identifier} ein Symbol ist, wird es einfach
eingefügt; wenn es eine Zeichenkette ist, wird sie in der
Konfigurationsdatei in Anführungszeichen gesetzt.

@item @code{layout} (optional @code{<keyboard-layout>}-Verbundsobjekt)
Eine Option nur für Tastaturen. Das Feld gibt die für die Eingabe verwendete
Tastenbelegung an. Als Wert müssen Sie ein
@code{<keyboard-layout>}-Verbundsobjekt angeben (siehe @ref{Tastaturbelegung}).

@quotation Anmerkung
@code{(gnu home services sway)} re-exportiert @emph{nicht} die Prozedur
@code{keyboard-layout}.
@end quotation

@item @code{disable-while-typing} (optional Boolescher-Ausdruck)
Wenn es auf @code{#t} (bzw.@: @code{#f}) steht, wird mit der Option „disable
while typing“ das Abschalten beim Tippen dieser Eingabe aktiviert (bzw.@:
deaktiviert).

@item @code{disable-while-trackpointing} (optional Boolescher-Ausdruck)
Wenn es auf @code{#t} (bzw.@: @code{#f}) steht, wird mit der Option „disable
while track-pointing“ das Abschalten bei Trackpointnutzung dieser Eingabe
aktiviert (bzw.@: deaktiviert).

@item @code{tap} (optional Boolescher-Ausdruck)
Aktiviert oder deaktiviert die Option „tap“, durch die ein Antippen des
Tastfelds als Klicken verstanden wird.

@item @code{extra-content} (Vorgabe: @code{'()})
Weitere Zeilen, die an den Eingabeblock angehängt werden. Als Wert für das
Feld wird eine Liste von Zeichenketten oder G-Ausdrücken angegeben.
@end table
@end deftp

@deftp {Datentyp} sway-output
@code{sway-output}-Verbundsobjekte beschreiben Ausgaben für Sway (siehe@
@cite{sway-output(5)}). Verfügbare Felder sind:

@table @asis
@item @code{identifier} (Vorgabe: @code{'*})
Identifikator des Monitors. Für das Feld können Sie ein Symbol oder eine
Zeichenkette angeben. Wenn @code{identifier} ein Symbol ist, wird es einfach
eingefügt; wenn es eine Zeichenkette ist, wird sie in der
Konfigurationsdatei in Anführungszeichen gesetzt.

@item @code{resolution} (optional Zeichenkette)
Diese Zeichenkette gibt die Auflösung des Monitors.

@item @code{position} (optional)
Der (optionale) Wert dieses Feldes muss ein @code{point} sein. Beispiel:
@lisp
(position
 (point (x 1920)
        (y 0)))
@end lisp

@item @code{background} (optional)
Der Wert dieses Feld benennt, welches Hintergrundbild diese Ausgabe zieren
soll. Als Typ für den Wert des Feldes gibt es folgende Möglichkeiten:
@itemize
@item
eine Zeichenkette,
@item
ein G-Ausdruck,
@item
ein dateiartiges Objekt,
@item
ein Paar. In letzterem Fall muss sein erstes Argument eine Zeichenkette, ein
G-Ausdruck oder ein dateiartiges Objekt sein. Das zweite Argument im Paar
beschreibt, auf welche Art das Hintergrundbild angezeigt werden soll. Es
muss eines der Symbole @code{stretch}, @code{fill}, @code{fit},
@code{center} oder @code{tile} sein.

Wenn das zweite Argument nicht angegeben wird (d.h. wenn als Wert kein Paar
benutzt wird), wird der @code{fill}-Modus angewandt.
@end itemize

@quotation Anmerkung
Um eine SVG-Datei benutzen zu können, muss @code{librsvg} in Ihrem Profil
installiert sein (z.B.@: indem Sie es im Feld @code{packages} der
@code{sway-configuration} eintragen).
@end quotation

@item @code{extra-content} (Vorgabe: @code{'()})
Liste mit weiteren Zeilen, die an den Ausgabe-Konfigurationsblock angehängt
werden. Elemente der Liste müssen Zeichenketten oder G-Ausdrücke sein.
@end table
@end deftp

@deftp {Datentyp} sway-border-color
@table @code
@item border
Die Farbe des Randes.
@item background
Die Farbe des Hintergrunds.
@item text
Die Farbe des Textes.
@end table
@end deftp

@deftp {Datentyp} sway-color
@table @asis
@item @code{background} (optional Zeichenkette)
Hintergrundfarbe der Leiste.

@item @code{statusline} (optional Zeichenkette)
Textfarbe der Statuszeile.

@item @code{focused-background} (optional Zeichenkette)
Hintergrundfarbe der Leiste auf dem Monitor, der den Fokus hat.

@item @code{focused-statusline} (optional Zeichenkette)
Textfarbe der Statuszeile auf dem Monitor, der den Fokus hat.

@item @code{focused-workspace} (optional @code{sway-border-color})
Farbschema der Arbeitsflächen. die den Fokus haben.

@item @code{active-workspace} (optional @code{sway-border-color})
Farbschema aktiver Arbeitsflächen.

@item @code{inactive-workspace} (optional @code{sway-border-color})
Farbschema inaktiver Arbeitsflächen.

@item @code{urgent-workspace} (optional @code{sway-border-color})
Farbschema von Arbeitsflächen mit „dringenden“ Fenstern.

@item @code{binding-mode} (optional @code{sway-border-color})
Farbschema für den Indikator eines Belegungsmodus.
@end table
@end deftp

@deftp {Datentyp} sway-bar
Beschreibt die „Sway bar“, eine Leiste für Sway (siehe@ @cite{sway-bar(5)}).

@table @asis
@item @code{identifier} (Vorgabe: @code{'bar0})
Identifikator der Leiste. Der Wert muss ein Symbol sein.

@item @code{position} (optional)
Gibt die Position der Leiste an. Akzeptierte Werte sind @code{'top} für oben
oder @code{'bottom} für unten.

@item @code{hidden-state} (optional)
Specify the appearance of the bar when it is hidden.  Accepted values are
@code{'hide} or @code{'show}.

@item @code{binding-mode-indicator} (optional)
Boolescher Ausdruck, mit dem der Indikator des Belegungsmodus an- oder
ausgeschaltet wird.

@item @code{colors} (optional)
Optional ein @dfn{sway-color}-Verbundsobjekt.

@item @code{status-command} (optional)
This field accept strings, G-expressions and executable file-like values.
The default value is a command (string) that prints the date and time every
second.

Each line printed on @code{stdout} by this command (or script) will be
displayed on the status area of the bar.

Hier sind ein paar Beispiele mit:
@itemize
@item
einer Zeichenkette: @code{"while date +'%Y-%m-%d %X'; do sleep 1; done"},
@item
einem G-Ausdruck:
@lisp
#~(string-append "while "
                 #$coreutils "/bin/date"
                 " +'%Y-%m-%d %X'; do sleep 1; done")
@end lisp
@item
einer ausführbaren Datei:
@lisp
(program-file
 "sway-bar-status"
 #~(begin
     (use-modules (ice-9 format)
                  (srfi srfi-19))
     (let loop ()
       (let* ((date (date->string
                     (current-date)
                     "~d/~m/~Y (~a) • ~H:~M:~S")))
         (format #t "~a~%~!" date)
         (sleep 1)
         (loop)))))
@end lisp
@end itemize

@item @code{mouse-bindings} (Vorgabe: @code{'()})
This field accepts an associative list.  Keys are integers describing mouse
events.  Values are similar to that of key-bindings (except that ``to-code''
is not a valid option for mouse-bindings).

The module @code{(gnu home services sway)} exports constants
@code{%ev-code-mouse-left}, @code{%ev-code-mouse-right} and
@code{%ev-code-mouse-scroll-click} whose values are integers corresponding
to left, right and scroll click respectively.  For example, with
@code{(mouse-bindings `((,%ev-code-mouse-left . "exec $term")))}, left
clicks in the status bar open the terminal (assuming that the variable
@code{$term} is bound to a terminal).
@end table
@end deftp

@deftp {Datentyp} sway-mode
Describes a Sway mode (see@ @cite{sway(5)}).  For example, the following
snippet defines the resize mode of the default Sway configuration:
@example
(sway-mode
 (mode-name "resize")
 (keybindings
  '(($left  . "resize shrink width 10px")
    ($right . "resize grow width 10px")
    ($down  . "resize grow height 10px")
    ($up    . "resize shrink height 10px")
    (Left   . "resize shrink width 10px")
    (Right  . "resize grow width 10px")
    (Down   . "resize grow height 10px")
    (Up     . "resize shrink height 10px")
    (Return . "mode \"default\"")
    (Escape . "mode \"default\""))))
@end example

@table @asis
@item @code{mode-name} (Vorgabe: @code{"default"})
Name of the mode.  This field accepts strings.

@item @code{keybindings} (Vorgabe: @code{'()})
Dieses Feld beschreibt die Tastenbelegungen. Als Wert wird eine assoziative
Liste angegeben. Auch hier sind Schlüssel Symbole und Werte sind entweder
Zeichenketten, G-Ausdrücke oder Cons-Zellen.

@item @code{mouse-bindings} (Vorgabe: @code{'()})
Ditto, but keys are mouse events (integers).  Constants
@code{%ev-code-mouse-*} described above can be used as helpers to define
mouse bindings.
@end table
@end deftp

@node Persönliche Netzwerkdienste
@subsection Persönliche Netzwerkdienste

In diesem Abschnitt werden Dienste aufgelistet, die irgendwie mit
Netzwerkkommunikation zu tun haben und die Sie mit Guix Home verwenden
können.

@subheading Syncthing Service

@cindex Syncthing, Dienst zur Synchronisierung von Dateien
@cindex Sicherung von Dateien, Syncthing
Das Modul @code{(gnu home services syncthing)} stellt einen Dienst bereit,
mit dem @uref{Syncthing, https://syncthing.net} eingerichtet wird, das
kontinuierlich Sicherungskopien von Dateien anlegt.

@defvar home-syncthing-service-type
Dies ist der Diensttyp des @command{syncthing}-Daemons. Er ist das
Gegenstück zu dem Systemdienst @code{syncthing-service-type}, aber als
Persönlicher Dienst (siehe @ref{Netzwerkdienste,
@code{syncthing-service-type}}). Der Wert für diesen Diensttyp ist eine
@command{syncthing-configuration}.

So würden Sie ihn mit der Vorgabekonfiguration einrichten:

@lisp
(service home-syncthing-service-type)
@end lisp

Wenn Sie die Konfiguration anpassen möchten, umhüllen Sie Ihre
@code{syncthing-configuration} in @code{for-home} wie in diesem Beispiel:

@lisp
(service home-syncthing-service-type
         (for-home
          (syncthing-configuration (logflags 5))))
@end lisp

Nähere Informationen zur @code{syncthing-configuration} finden Sie in der
Dokumentation des Systemdienstes (siehe @ref{Netzwerkdienste,
@code{syncthing-service-type}}).
@end defvar

@node Secrets Home Services
@subsection Secrets Home Services

The @code{(gnu home services secrets)} module provides services pertaining
to storing secrets, notably including password managers.

@subsubheading Himitsu Services

@uref{https://himitsustore.org/, Himitsu} is a daemon for storing arbitrary
secrets encrypted by a single password.  The daemon operates alongside a
prompter, which asks the user for permission when an application requests a
secret, and for the store password on first use in a session.  Neither
Himitsu nor its underlying cryptography library have been indepednently
audited.

@defvar home-himitsu-service-type
This service provides the main Himitsu store daemon.  It will not launch
unless you have a store set up - run @code{himitsu-store -i} after the
service is added to your profile to create it, and then @code{herd start
himitsud} to restart the service. Configuration is as follows:
@end defvar

@deftp {Data Type} home-himitsu-configuration
@table @asis
@item @code{package} (default: @code{himitsu})
Package to find @code{himitsud} in.

@item @code{notify-reuse} (optional)
Interpreted shell command to run on application access to an
already-approved secret.

@item @code{prompter} (default: @code{(wrap-himitsu-prompter (file-append hiprompt-gtk "/bin/hiprompt-gtk"))})
Path to a prompter binary.  Defaults to @code{hiprompt-gtk}, the reference
implementation.  If your prompter is graphical, you should pass it through
the provided @code{wrap-himitsu-prompter} procedure, which will autodetect a
running display to prompt on, due to the Himitsu daemon starting before the
display server is online.

@item @code{extra-options} (optional)
List of extra strings or G-expressions to insert verbatim into the Himitsu
configuration file.  Each list element gets its own line.

@end table
@end deftp

Himitsu can be used through its command-line tool @code{hiq} or through any
number of supporting services, providing compatability to other
applications.  Git credential support may be provided simply by adding the
@code{himitsu-git} package to your profile, but other such supporting
services are listed below:

@defvar home-himitsu-ssh-service-type
This service provides an @code{ssh-agent} implementation that stores keys
through Himitsu.  You may interact with a running daemon through
@code{hissh-import} and @code{hissh-export}.
@end defvar

@deftp {Data Type} home-himitsu-ssh-configuration
@table @asis
@item @code{package} (default: @code{himitsu-ssh})
Package to find @code{hissh-agent} in.

@item @code{persist} (default: @code{'(session 300 refuse)})
List of options given when prompting to allow this service access to your
list of keys.  The option chosen decides how long @code{himitsu-ssh} has
this access.  Options can be either @code{'session} (access is retained
until the daemon closes), @code{'refuse} (access is declined and the
prompter will not ask again), @code{'skip} (ask again next use), or a
numerical access timeout in seconds.

@item @code{disclose} (default: @code{'(skip session 300)})
List of options given when prompting to allow this service use of your
secret keys.  Has the same format as @code{persist}.

@end table
@end deftp

@defvar home-himitsu-secret-service-type
This service provides a
@uref{https://specifications.freedesktop.org/secret-service/latest/,
freedesktop Secret Service} implementation, allowing Himitsu to replace
@pxref{Desktop-Dienste, gnome-keyring-service-type} and @pxref{Desktop-Dienste, kwallet-service-type}.
@end defvar

@deftp {Data Type} home-himitsu-secret-service-configuration
@table @asis
@item @code{package} (default: @code{himitsu-secret-service})
Package to find @code{hisecrets-agent} in.

@end table
@end deftp

@node Verschiedene Persönliche Dienste
@subsection Verschiedene Persönliche Dienste

Dieser Abschnitt führt Persönliche Dienste auf, die sich nicht besser
kategorisieren ließen.

@subsubheading Beets-Dienst

@cindex Beets-Dienst, mit Home
Das Modul @code{(gnu home services music)} stellt den folgenden Dienst zur
Verfügung:

@defvar home-beets-service-type
@uref{https://beets.io, Beets} is a music file and metadata manager that can
be used via its command-line interface, @command{beet}. Beets requires a
YAML configuration file and this Guix Home service is to create such file.
@end defvar

Der Dienst kann wie folgt benutzt werden:

@lisp
(service home-beets-service-type
         (home-beets-configuration (directory "/home/alice/music")))
@end lisp

Weitere Optionen können als Freitext im Feld @code{extra-options} angegeben
werden.

@lisp
(service home-beets-service-type
         (home-beets-configuration
          (directory "/home/alice/music")
          (extra-options '("
import:
  move: yes"))))
@end lisp

@subsubheading Wörterbuchdienst

@cindex Wörterbuchdienst, mit Home
Das Modul @code{(gnu home services dict)} stellt den folgenden Dienst zur
Verfügung:

@defvar home-dicod-service-type
Dies ist der Diensttyp für einen Dienst, der den @command{dicod}-Daemon
ausführt. Dabei handelt es sich um eine Implementierung eines DICT-Servers
(siehe das @ref{Dicod,,, dico, Handbuch von GNU Dico}).

Sie können in Ihre @file{~/.dico}-Datei @command{open localhost} eintragen,
damit @code{localhost} zum voreingestellten Server des
@command{dico}-Clients wird (siehe das @ref{Initialization File,,, dico,
Handbuch von GNU Dico}).
@end defvar

Dieser Dienst ist eine direkte Abbildung des Systemdienstes
@code{dicod-service-type} (siehe @ref{Verschiedene Dienste, Dictionary
Service}). So können Sie ihn benutzen:

@lisp
(service home-dicod-service-type)
@end lisp

Dabei können Sie auch eine angepasste Konfiguration angeben, indem Sie ein
@code{dicod-configuration}-Verbundsobjekt genau wie bei
@code{dicod-service-type} angeben, es aber in @code{for-home} umhüllen:

@lisp
(service home-dicod-service-type
         (for-home
          (dicod-configuration @dots{})))
@end lisp

@subheading ReadyMedia Service

@cindex ReadyMedia, DLNA/UPnP Service
The @code{(gnu home services upnp)} module provides a service to set up the
@uref{https://minidlna.sourceforge.net/, ReadyMedia} @acronym{DLNA, Digital
Living Network Alliance} @acronym{UPnP, Universal Plug and Play} media
server.

@defvar home-readymedia-service-type
This is the service type for the @command{minidlnad} daemon; it is the Home
counterpart of the @code{readymedia-service-type} system service
(@pxref{Verschiedene Dienste, @code{readymedia-service-type}}).  The value
for this service type is a @code{readymedia-configuration}.
@end defvar

The service can be used with a @code{readymedia-configuration} wrapped in
@code{for-home} like this:

@lisp
(service home-readymedia-service-type
         (for-home
          (readymedia-configuration
            (media-directories
             (list (readymedia-directory
                     (path "/path/to/media/audio")
                     (types '(A)))
                   (readymedia-directory
                     (path "/path/to/media/video")
                     (types '(V)))
                   (readymedia-directory
                     (path "/path/to/media/misc")))))))
@end lisp

For details about @code{readymedia-configuration}, check out the
documentation of the system service (@pxref{Verschiedene Dienste,
@code{readymedia-service-type}}).

@subsubheading OCI-gestützte Dienste

@cindex OCI-backed, for Home
The @code{(gnu home services containers)} module provides the following
service:

@defvar home-oci-service-type
This is the type of the service that allows to manage your OCI containers
with the same consistent interface you use for your other Home Shepherd
services.
@end defvar

This service is a direct mapping of the @code{oci-service-type} system
service (@pxref{Verschiedene Dienste, OCI backed services}).  You can use
it like this:

@lisp
(use-modules (gnu services containers)
             (gnu home services containers))

(simple-service 'home-oci-provisioning
                home-oci-service-type
                (oci-extension
                  (volumes
                    (list
                      (oci-volume-configuration (name "prometheus"))
                      (oci-volume-configuration (name "grafana"))))
                  (networks
                    (list
                      (oci-network-configuration (name "monitoring"))))
                  (containers
                   (list
                    (oci-container-configuration
                     (network "monitoring")
                     (image
                      (oci-image
                        (repository "guile")
                        (tag "3")
                        (value (specifications->manifest '("guile")))
                        (pack-options '(#:symlinks (("/bin/guile" -> "bin/guile"))
                                        #:max-layers 2))))
                     (entrypoint "/bin/guile")
                     (command
                      '("-c" "(display \"hello!\n\")")))
                    (oci-container-configuration
                      (image "prom/prometheus")
                      (network "monitoring")
                      (ports
                       '(("9000" . "9000")
                         ("9090" . "9090")))
                      (volumes
                       (list
                        '(("prometheus" . "/var/lib/prometheus")))))
                    (oci-container-configuration
                      (image "grafana/grafana:10.0.1")
                      (network "monitoring")
                      (volumes
                       '(("grafana:/var/lib/grafana"))))))))

@end lisp

You may specify a custom configuration by providing a
@code{oci-configuration} record, exactly like for @code{oci-service-type},
but wrapping it in @code{for-home}:

@lisp
(use-modules (gnu services)
             (gnu services containers)
             (gnu home services containers))

(service home-oci-service-type
         (for-home
          (oci-configuration
           (runtime 'podman)
           (verbose? #t))))

(simple-service 'home-oci-provisioning
                home-oci-service-type
                (oci-extension
                  (volumes
                    (list
                      (oci-volume-configuration (name "prometheus"))
                      (oci-volume-configuration (name "grafana"))))
                  (networks
                    (list
                      (oci-network-configuration (name "monitoring"))))
                  (containers
                   (list
                    (oci-container-configuration
                     (network "monitoring")
                     (image
                      (oci-image
                        (repository "guile")
                        (tag "3")
                        (value (specifications->manifest '("guile")))
                        (pack-options '(#:symlinks (("/bin/guile" -> "bin/guile"))
                                        #:max-layers 2))))
                     (entrypoint "/bin/guile")
                     (command
                      '("-c" "(display \"hello!\n\")")))
                    (oci-container-configuration
                      (image "prom/prometheus")
                      (network "monitoring")
                      (ports
                       '(("9000" . "9000")
                         ("9090" . "9090")))
                      (volumes
                       (list
                        '(("prometheus" . "/var/lib/prometheus")))))
                    (oci-container-configuration
                      (image "grafana/grafana:10.0.1")
                      (network "monitoring")
                      (volumes
                       '(("grafana:/var/lib/grafana"))))))))
@end lisp

@node Aufruf von guix home
@section @command{guix home} aufrufen

@cindex @command{guix home}

Sobald Sie eine Deklaration Ihrer Persönlichen Umgebung haben (siehe
@ref{Deklaration der Persönlichen Umgebung,,,,}), kann diese @dfn{instanziiert}
werden, indem Sie den Befehl @command{guix home} aufrufen. Zusammengefasst:

@example
guix home @var{Optionen}…@: @var{Aktion} @var{Datei}
@end example

@var{Datei} muss der Name einer Datei sein, in der eine Persönliche Umgebung
als @code{home-environment}-Objekt steht. @var{Aktion} gibt an, wie das
Betriebssystem instanziiert wird (abgesehen von unterstützenden Aktionen, wo
nichts instanziiert wird). Derzeit werden folgende Werte dafür unterstützt:

@table @code
@item search
Verfügbare Definitionen Persönlicher Dienste anzeigen, die zum angegebenen
regulären Ausdruck passen, sortiert nach Relevanz:

@cindex shell
@cindex Shell-Profil
@cindex bash
@cindex zsh
@example
$ guix home search shell
name: home-shell-profile
location: gnu/home/services/shells.scm:100:2
extends: home-files
description: Create `~/.profile', which is used for environment initialization of POSIX compliant login shells.
+ This service type can be extended with a list of file-like objects.
relevance: 6

name: home-fish
location: gnu/home/services/shells.scm:640:2
extends: home-files home-profile
description: Install and configure Fish, the friendly interactive shell.
relevance: 3

name: home-zsh
location: gnu/home/services/shells.scm:290:2
extends: home-files home-profile
description: Install and configure Zsh.
relevance: 1

name: home-bash
location: gnu/home/services/shells.scm:508:2
extends: home-files home-profile
description: Install and configure GNU Bash.
relevance: 1

…
@end example

Wie auch bei @command{guix search} wird das Ergebnis im
@code{recutils}-Format geliefert, so dass es leicht ist, die Ausgabe zu
filtern (siehe @ref{Top, GNU-recutils-Datenbanken,, recutils, Handbuch von
GNU recutils}).

@cindex Container, bei @command{guix shell}
@item container
Eine Shell in einer isolierten Umgebung@tie{}– einem @dfn{Container}@tie{}–
öffnen, die die in @var{Datei} angegebene Persönliche Umgebung enthält.

Zum Beispiel würden Sie so eine interaktive Shell in einem Container
starten, der Ihrer Persönlichen Umgebung entspricht:

@example
guix home container config.scm
@end example

In diesem Wegwerf-Container können Sie Dateien nach Herzenslust verändern,
denn innerhalb des Containers gemachte Änderungen oder gestartete Prozesse
sind alle wieder weg, sobald Sie die Shell verlassen.

Wie auch @command{guix shell} hält sich der Container an einige
Befehlszeilenoptionen:

@table @option
@item --network
@itemx -N
Netzwerkzugriff im Container erlauben (was nach Voreinstellung abgeschaltet
ist).

@item --expose=@var{Quelle}[=@var{Ziel}]
@itemx --share=@var{Quelle}[=@var{Ziel}]
Wie bei @command{guix shell} wird das Verzeichnis unter @var{Quelle} vom
Wirtssystem im Container als @var{Ziel} verfügbar gemacht. Bei
@option{--expose} gibt es nur Lesezugriff und bei @option{--share} auch
Schreibzugriff darauf (siehe @ref{Aufruf von guix shell, @option{--expose} und
@option{--share}}).
@end table

Des Weiteren können Sie einen Befehl im Container ausführen lassen, anstatt
eine interaktive Shell zu starten. Zum Beispiel würden Sie so überprüfen,
welche Shepherd-Dienste im Persönlichen Wegwerf-Container gestartet werden:

@example
guix home container config.scm -- herd status
@end example

Den Befehl, der im Container auszuführen ist, geben Sie nach zwei kurzen
Strichen @code{--} an.

@cindex Diensttypdefinition, Bearbeiten
@cindex Bearbeiten, von Diensttypdefinitionen
@item edit
Die Definition des angegebenen Persönlichen Dienstes bearbeiten oder
anzeigen.

Beispielsweise öffnet folgender Befehl Ihren Editor, der mit der
Umgebungsvariablen @env{EDITOR} gewählt werden kann, an der Stelle, wo der
@code{home-mcron}-Diensttyp definiert ist:

@example
guix home edit home-mcron
@end example

@item reconfigure
Die in der @var{Datei} beschriebene Persönliche Umgebung erstellen und zu
ihr wechseln. Wechseln bedeutet, dass das Aktivierungsskript ausgewertet
wird und (in der Grundeinstellung) symbolische Verknüpfungen auf
Konfigurationsdateien, die anhand der Deklaration der Persönlichen Umgebung
im @code{home-environment}-Objekt erzeugt werden, in @file{~} angelegt
werden. Wenn die Datei mit demselben Pfad bereits im Persönlichen
Verzeichnis existiert, wird sie nach
@file{~/@var{Zeitstempel}-guix-home-legacy-configs-backup} verschoben. Dabei
ist @var{Zeitstempel} eine Zeitangabe seit der UNIX-Epoche.

@quotation Anmerkung
Es ist sehr zu empfehlen, @command{guix pull} einmal auszuführen, bevor Sie
@command{guix home reconfigure} zum ersten Mal aufrufen (siehe @ref{Aufruf von guix pull}).
@end quotation

Dieser Befehl setzt die in der @var{Datei} festgelegte Konfiguration
vollständig um. Der Befehl startet die in der @var{Datei} angegebenen
Shepherd-Dienste, die aktuell nicht laufen; bei aktuell laufenden Diensten
wird sichergestellt, dass sie aktualisiert werden, sobald sie das nächste
Mal angehalten wurden (z.B.@: durch @code{herd stop @var{Dienst}} oder
@code{herd restart @var{Dienst}}).

Dieser Befehl erzeugt eine neue Generation, deren Nummer (wie @command{guix
home list-generations} sie anzeigt) um eins größer als die der aktuellen
Generation ist. Wenn die so nummerierte Generation bereits existiert, wird
sie überschrieben. Dieses Verhalten entspricht dem von @command{guix
package} (siehe @ref{Aufruf von guix package}).

@cindex Provenienzverfolgung, der Persönlichen Umgebung
Nach Abschluss wird die neue Persönliche Umgebung unter @file{~/.guix-home}
verfügbar gemacht. Das Verzeichnis enthält @dfn{Provenienz-Metadaten}: Dazu
gehören die Liste der Kanäle, die benutzt wurden (siehe @ref{Kanäle}) und
die @var{Datei} selbst, wenn sie verfügbar ist. Sie können die
Provenienzinformationen auf diese Weise ansehen:

@example
guix home describe
@end example

Diese Informationen sind nützlich, falls Sie später inspizieren möchten, wie
diese spezielle Generation erstellt wurde. Falls die @var{Datei}
eigenständig ist, also keine anderen Dateien zum Funktionieren braucht, dann
können Sie tatsächlich die Generation @var{n} Ihrer Persönlichen Umgebung
später erneut erstellen mit:

@example
guix time-machine \
  -C /var/guix/profiles/per-user/@var{Benutzer}/guix-home-@var{n}-link/channels.scm -- \
  home reconfigure \
  /var/guix/profiles/per-user/@var{Benutzer}/guix-home-@var{n}-link/configuration.scm

@end example

Sie können sich das als eine Art eingebaute Versionskontrolle vorstellen!
Ihre Persönliche Umgebung ist nicht nur ein binäres Erzeugnis: @emph{Es
enthält seinen eigenen Quellcode}.

@quotation Anmerkung
Wenn Sie Guix System benutzen, siehe @ref{guix-home-service-type,
@code{guix-home-service-type}}, um zu erfahren, wie Sie die Persönliche
Konfiguration als Teil Ihrer Systemkonfiguration angeben können, damit
@command{guix system reconfigure} beide, die System- und die Persönliche
Konfiguration, aufspielt.
@end quotation

@item switch-generation
@cindex Generationen von Persönlichen Umgebungen
Zu einer bestehenden Generation der Persönlichen Umgebung wechseln. Diese
Aktion wechselt das Profil der Persönlichen Umgebung atomar auf die
angegebene Generation der Persönlichen Umgebung.

Die Zielgeneration kann ausdrücklich über ihre Generationsnummer angegeben
werden. Zum Beispiel würde folgender Aufruf einen Wechsel zur Generation 7
der Persönlichen Umgebung bewirken:

@example
guix home switch-generation 7
@end example

Die Zielgeneration kann auch relativ zur aktuellen Generation angegeben
werden, in der Form @code{+N} oder @code{-N}, wobei @code{+3} zum Beispiel
„3 Generationen weiter als die aktuelle Generation“ bedeuten würde und
@code{-1} „1 Generation vor der aktuellen Generation“ hieße. Wenn Sie einen
negativen Wert wie @code{-1} angeben, müssen Sie @code{--} der
Befehlszeilenoption voranstellen, damit die negative Zahl nicht selbst als
Befehlszeilenoption aufgefasst wird. Zum Beispiel:

@example
guix home switch-generation -- -1
@end example

Diese Aktion schlägt fehl, wenn die angegebene Generation nicht existiert.

@item roll-back
@cindex Rücksetzen
Zur vorhergehenden Generation der Persönlichen Umgebung wechseln. Dies ist
die Umkehrung von @command{reconfigure} und tut genau dasselbe wie
@command{switch-generation} mit dem Argument @code{-1} aufzurufen.

@item delete-generations
@cindex Löschen von Generationen der Persönlichen Umgebung
@cindex Platz sparen
Generationen der Persönlichen Umgebung löschen, wodurch diese zu Kandidaten
für den Müllsammler werden (siehe @ref{Aufruf von guix gc} für Informationen,
wie Sie den „Müllsammler“ laufen lassen).

Es funktioniert auf die gleiche Weise wie @samp{guix package
--delete-generations} (siehe @ref{Aufruf von guix package,
@option{--delete-generations}}). Wenn keine Argumente angegeben werden,
werden alle Generationen der Persönlichen Umgebung außer der aktuellen
gelöscht:

@example
guix home delete-generations
@end example

Sie können auch eine Auswahl treffen, welche Generationen Sie löschen
möchten. Das folgende Beispiel hat die Löschung aller Generationen der
Persönlichen Umgebung zur Folge, die älter als zwei Monate sind:

@example
guix home delete-generations 2m
@end example

@item build
Die Ableitung der Persönlichen Umgebung erstellen, einschließlich aller
Konfigurationsdateien und Programme, die benötigt werden. Diese Aktion
installiert jedoch nichts davon.

@item describe
Die aktuelle Generation der Persönlichen Umgebung beschreiben: ihren
Dateinamen sowie Provenienzinformationen, falls verfügbar.

Um installierte Pakete im Profil der aktuellen Persönlichen Generation zu
finden, wird die Befehlszeilenoption @code{--list-installed} angeboten,
deren Syntax dieselbe ist wie bei @command{guix package --list-installed}
(siehe @ref{Aufruf von guix package}). Zum Beispiel zeigt der folgende Befehl
eine Tabelle mit allen Paketen, deren Name „emacs“ enthält und die ins
Profil der aktuellen Persönlichen Generation installiert sind, an:

@example
guix home describe --list-installed=emacs
@end example

@item list-generations
Eine für Menschen verständliche Zusammenfassung jeder auf der Platte
verfügbaren Generation der Persönlichen Umgebung ausgeben. Dies ähnelt der
Befehlszeilenoption @option{--list-generations} von @command{guix package}
(siehe @ref{Aufruf von guix package}).

Optional kann ein Muster angegeben werden, was dieselbe Syntax wie
@command{guix package --list-generations} benutzt, um damit die Liste
anzuzeigender Generationen einzuschränken. Zum Beispiel zeigt der folgende
Befehl Generationen an, die bis zu 10 Tage alt sind:

@example
guix home list-generations 10d
@end example

Sie können auch die Befehlszeilenoption @code{--list-installed} angeben mit
derselben Syntax wie in @command{guix home describe}. Das kann nützlich
sein, wenn Sie herausfinden möchten, wann ein bestimmtes Paket zum
Persönlichen Profil hinzukam.

@item import
Eine Deklaration der Persönlichen Umgebung anhand der Pakete im
Standardprofil und der Konfigurationsdateien im Persönlichen Verzeichnis des
Benutzers anlegen. Dabei werden die Konfigurationsdateien in das angegebene
Verzeichnis kopiert und eine @file{home-configuration.scm} wird darin mit
dem, was die Persönliche Umgebung ausmacht, gefüllt. Beachten Sie, dass
@code{guix home import} nicht alle Persönlichen Dienste, die es gibt,
unterstützt (siehe @ref{Persönliche Dienste}).

@example
$ guix home import ~/guix-config
guix home: Alle Konfigurationsdateien für die Persönliche Umgebung wurden in „/home/alice/guix-config“ geschrieben
@end example
@end table

Es gibt noch mehr zu sehen! Mit @command{guix home} können Sie folgende
Unterbefehle benutzen, um zu visualisieren, wie die Dienste Ihrer
Persönlichen Umgebung voneinander abhängen:

@table @code
@cindex Diensterweiterungsgraph, der Persönlichen Umgebung
@item extension-graph
Auf die Standardausgabe den @dfn{Diensterweiterungsgraphen} der in der
@var{Datei} definierten Persönlichen Umgebung ausgeben (siehe @ref{Dienstkompositionen} für mehr Informationen zu Diensterweiterungen). Vorgegeben ist,
ihn im Dot-/Graphviz-Format auszugeben, aber Sie können ein anderes Format
mit @option{--graph-backend} auswählen, genau wie bei @command{guix graph}
(siehe @ref{Aufruf von guix graph, @option{--backend}}):

Der Befehl:

@example
guix home extension-graph @var{Datei} | xdot -
@end example

zeigt die Erweiterungsrelation unter Diensten an.

@cindex Abhängigkeitsgraph, der Persönlichen Umgebung
@item shepherd-graph
Auf die Standardausgabe den @dfn{Abhängigkeitsgraphen} der Shepherd-Dienste
der in der @var{Datei} definierten Persönlichen Umgebung ausgeben. Siehe
@ref{Shepherd-Dienste} für mehr Informationen sowie einen Beispielgraphen.

Auch hier wird nach Vorgabe die Ausgabe im Dot-/Graphviz-Format sein, aber
Sie können ein anderes Format mit @option{--graph-backend} auswählen.
@end table

Unter den @var{Optionen} können beliebige gemeinsame Erstellungsoptionen
aufgeführt werden (siehe @ref{Gemeinsame Erstellungsoptionen}). Des Weiteren kann als
@var{Optionen} Folgendes angegeben werden:

@table @option

@item --expression=@var{Ausdruck}
@itemx -e @var{Ausdruck}
Als Konfiguration der Persönlichen Umgebung das
@code{home-environment}-Objekt betrachten, zu dem der @var{Ausdruck}
ausgewertet wird. Dies ist eine Alternative dazu, die Konfiguration in einer
Datei festzulegen.

@item --allow-downgrades
An @command{guix home reconfigure} die Anweisung erteilen,
Systemherabstufungen zuzulassen.

Genau wie bei @command{guix system} verhindert @command{guix home
reconfigure} standardmäßig, dass Sie Ihre Persönliche Umgebung herabstufen
auf ältere Versionen oder auf Versionen, die mit den Kanalversionen Ihrer
vorigen Persönlichen Umgebung (@command{guix home describe} zeigt diese)
@emph{nicht} zusammenhängen. Sie können @option{--allow-downgrades} angeben,
um die Überprüfung zu umgehen, und tragen dann selbst die Schuld, wenn Sie
Ihre Persönliche Umgebung herabstufen. Vorsicht ist geboten!

@end table

@node Dokumentation
@chapter Dokumentation

@cindex Dokumentation, Suche danach
@cindex Suchen nach Dokumentation
@cindex Info, Dokumentationsformat
@cindex man-Pages (Handbuchseiten)
@cindex Handbuchseiten („Man-Pages“)
In den meisten Fällen liegt den mit Guix installierten Paketen auch
Dokumentation bei, die diese beschreibt. Die zwei üblichsten Formate für
Dokumentation sind „Info“, ein durchsuchbares Hypertextformat, das für
GNU-Software benutzt wird, und sogenannte „Handbuchseiten“ (englisch „Manual
Pages“, kurz Man-Pages), das linear aufgebaute Dokumentationsformat, das auf
Unix traditionell mitgeliefert wird. Info-Handbücher können mit dem Befehl
@command{info} oder mit Emacs abgerufen werden, auf Handbuchseiten kann mit
dem Befehl @command{man} zugegriffen werden.

Sie können die Dokumentation von auf Ihrem System installierter Software
nach einem Schlüsselwort durchsuchen. Zum Beispiel suchen Sie mit folgendem
Befehl in den Info-Handbüchern nach „TLS“.

@example
$ info -k TLS
"(emacs)Network Security" -- STARTTLS
"(emacs)Network Security" -- TLS
"(gnutls)Core TLS API" -- gnutls_certificate_set_verify_flags
"(gnutls)Core TLS API" -- gnutls_certificate_set_verify_function
…
@end example

@noindent
Mit folgendem Befehl suchen Sie dasselbe Schlüsselwort in
Handbuchseiten@footnote{Die von @command{man -k} durchsuchte Datenbank wird
nur erstellt, wenn Ihre Umgebung das Paket @code{man-db} enthält.}:

@example
$ man -k TLS
SSL (7)              - OpenSSL SSL/TLS library
certtool (1)         - GnuTLS certificate tool
…
@end example

Diese Suchvorgänge finden ausschließlich lokal auf Ihrem Rechner statt,
wodurch gewährleistet ist, dass die Fundstellen zur von Ihnen auch
tatsächlich installierten Software passen, Sie für den Zugriff keine
Internetverbindung brauchen und Datenschutz gewährleistet bleibt.

Sobald Sie die Fundstellen kennen, können Sie zum Beispiel so die
entsprechende Dokumentation anzeigen lassen:

@example
$ info "(gnutls)Core TLS API"
@end example

@noindent
oder

@example
$ man certtool
@end example

Info-Handbücher sind in Abschnitte unterteilt und verfügen über Register
sowie Hyperlinks, wie jene, die Sie auch von Webseiten kennen. Der
@command{info}-Betrachter (siehe @ref{Top, Info-Betrachter,, info-stnd,
Stand-alone GNU Info}) und sein Gegenstück für Emacs (siehe @ref{Misc
Help,,, emacs, The GNU Emacs Manual}) verfügen über leicht erlernbare
Tastenkürzel, mit denen Sie in Handbüchern navigieren können. Siehe
@ref{Getting Started,,, info, Info: An Introduction} für eine Einführung in
die Info-Navigation.

@node Plattformen
@chapter Plattformen

Wir erstellen mit Guix Pakete und Systeme, die, wie die meisten anderen
Computerprogramme auch, auf einen festgelegten Befehlssatz eines Prozessors
und auf ein festgelegtes Betriebssystem abzielen. Oft laufen sie sogar auf
einem bestimmten Kernel und einer bestimmten Systembibliothek. Diese
Einschränkungen fasst Guix in @code{platform}-Verbundsobjekten zusammen.

@menu
* „platform“-Referenz::      Details der Plattform-Deklarationen.
* Unterstützte Plattformen::  Beschreibung der unterstützten Plattformen.
@end menu

@node „platform“-Referenz
@section @code{platform}-Referenz

Mit dem @code{platform}-Datentyp wird eine @dfn{Plattform} beschrieben: ein
Befehlssatz („Instruction Set Architecture“, ISA) zusammen mit einem
Betriebssystem und möglicherweise weiteren systemweiten Einstellungen wie
ihrer Binärschnittstelle („Application Binary Interface“, ABI).

@deftp {Datentyp} platform
Dieser Datentyp steht für eine Plattform.

@table @asis
@item @code{target}
Mit diesem Feld legt man das der Plattform entsprechende GNU-Tripel als
Zeichenkette fest (siehe @ref{Specifying Target Triplets, GNU-Tripel für
configure,, autoconf, Autoconf}).

@item @code{system}
Diese Zeichenkette ist der Systemtyp, den man in Guix verwendet und zum
Beispiel an die Befehlszeilenoption @option{--system} bei den meisten
Befehlen übergibt.

Dessen Form entspricht meistens @code{"@var{CPU}-@var{Kernel}"}, wobei
@var{CPU} den Prozessor eines Zielrechners angibt und @var{Kernel} den
Betriebssystem-Kernel eines Zielrechners angibt.

Möglich ist zum Beispiel @code{"aarch64-linux"} oder
@code{"armhf-linux"}. Systemtypen brauchen Sie, wenn Sie nativ erstellen
möchten (siehe @ref{Native Erstellungen}).

@item @code{linux-architecture} (Vorgabe: @code{#false})
Diese optionale Zeichenkette interessiert nur, wenn Linux als Kernel
festgelegt ist. In diesem Fall entspricht sie der ARCH-Variablen, die
benutzt wird, wenn Linux erstellt wird. Ein Beispiel ist @code{"mips"}.

@item @code{rust-target} (Vorgabe: @code{#false})
Diese optionale Zeichenkette gibt an, was Rust als Zielsystem (Target) auf
dieser Plattform am besten verwenden soll. Zum Beispiel ist das gemeinsame
System („base level system“), das für ein @code{armhf-linux}-System als Ziel
genommen wird, zu @code{armv7-unknown-linux-gnueabihf} am nächsten.

@item @code{glibc-dynamic-linker}
Dieses Feld enthält den Namen des dynamischen Binders der GNU-C-Bibliothek
des entsprechenden Systems in Form einer Zeichenkette. Ein Beispiel ist
@code{"/lib/ld-linux-armhf.so.3"}.

@end table
@end deftp

@node Unterstützte Plattformen
@section Unterstützte Plattformen

Die Module namens @code{(guix platforms …)} exportieren die folgenden
Variablen, von denen jede an ein @code{platform}-Verbundsobjekt gebunden
ist.

@defvar armv7-linux
Diese Plattform zielt auf ARMv7-Prozessoren ab, auf denen GNU/Linux läuft.
@end defvar

@defvar aarch64-linux
Diese Plattform zielt auf ARMv8-Prozessoren ab, auf denen GNU/Linux läuft.
@end defvar

@defvar loongarch64-linux
Platform targeting loongarch 64-bit CPU running GNU/Linux.
@end defvar

@defvar mips64-linux
Diese Plattform zielt auf MIPS-64-Bit-Prozessoren in Little-Endian ab, auf
denen GNU/Linux läuft.
@end defvar

@defvar powerpc-linux
Diese Plattform zielt auf PowerPC-32-Bit-Prozessoren in Big-Endian ab, auf
denen GNU/Linux läuft.
@end defvar

@defvar powerpc64le-linux
Diese Plattform zielt auf PowerPC-64-Bit-Prozessoren in Little-Endian ab,
auf denen GNU/Linux läuft.
@end defvar

@defvar riscv64-linux
Diese Plattform zielt auf RISC-V-64-Bit-Prozessoren ab, auf denen GNU/Linux
läuft.
@end defvar

@defvar i686-linux
Diese Plattform zielt auf x86-Prozessoren ab, auf denen GNU/Linux läuft.
@end defvar

@defvar x86_64-linux
Diese Plattform zielt auf x86-64-Bit-Prozessoren ab, auf denen GNU/Linux
läuft.
@end defvar

@defvar x86_64-linux-x32
Diese Plattform zielt auf x86-64-Bit-Prozessoren ab, auf denen GNU/Linux
läuft, wobei X32 als Binärschnittstelle (ABI) die Laufzeitunterstützung
übernimmt.
@end defvar

@defvar i686-mingw
Diese Plattform zielt auf x86-Prozessoren ab, die die Laufzeitunterstützung
durch MinGW nutzen.
@end defvar

@defvar x86_64-mingw
Diese Plattform zielt auf x86-64-Bit-Prozessoren ab, die die
Laufzeitunterstützung durch MinGW nutzen.
@end defvar

@defvar i586-gnu
Diese Plattform zielt auf x86-Prozessoren ab, auf denen GNU/Hurd läuft (was
auch als „GNU“ bezeichnet wird).
@end defvar

@defvar avr
Diese Plattform zielt auf AVR-Prozessoren ohne Betriebssystem ab, die die
Laufzeitunterstützung durch die AVR-Libc nutzen.
@end defvar

@defvar or1k-elf
Diese Plattform zielt auf OpenRISC-1000-Prozessoren ohne Betriebssystem und
ohne C-Standardbibliothek ab.
@end defvar

@defvar xtensa-ath9k-elf
Diese Plattform zielt auf Xtensa-Prozessoren ab, wie sie in den
USB-Netzwerkkarten von Qualcomm Atheros AR7010 und AR9271 für 802.11n
verbaut sind.
@end defvar

@node Systemabbilder
@chapter Systemabbilder erstellen

@cindex Systemabbilder
Wenn Sie beabsichtigen, Guix System zum ersten Mal auf einer neuen Maschine
zu installieren, gibt es im Grunde drei Möglichkeiten, wie Sie vorgehen
können. Erstens können Sie ausgehend von einem bestehenden Betriebssystem,
das sich bereits auf der Maschine befindet, den Befehl @command{guix system
init} aufrufen (siehe @ref{Aufruf von guix system}). Die zweite Möglichkeit
ist, ein Installationsabbild vorzubereiten (siehe @ref{Ein Abbild zur Installation erstellen}). Von diesem bootfähigen System aus wird dann
schließlich @command{guix system init} durchgeführt. Zu guter Letzt bleibt
eine dritte Möglichkeit: Sie bereiten ein Abbild vor, das direkt eine
Instanz des gewünschten Systems enthält. Sie kopieren das Abbild dann auf
ein bootfähiges Gerät, sagen wir ein USB-Laufwerk oder eine Speicherkarte,
und der Zielrechner bootet direkt davon. Eine Installationsprozedur findet
@emph{nicht} statt.

Mit dem Befehl @command{guix system image} sind Sie in der Lage, aus einer
Betriebssystemdefinition ein bootfähiges Abbild, englisch „Image“,
anzufertigen. Der Befehl kann mehrere Typen von Abbild bereitstellen wie
@code{mbr-hybrid-raw}, @code{iso9660} oder @code{docker}. Jede aktuelle
@code{x86_64}-Maschine dürfte von einem @code{iso9660}-Abbild aus starten
können. Jedoch gibt es auch Maschinen da draußen, für die eigens
zugeschnittene Abbildtypen vonnöten sind. In der Regel haben diese Maschinen
@code{ARM}-Prozessoren und sie setzen eventuell voraus, dass bestimmte
Partitionen an je einem bestimmten Versatz zu finden sind.

In diesem Kapitel wird erklärt, wie Sie eigene Abbildtypen definieren können
und wie Sie daraus bootfähige Images erstellen lassen.

@menu
* „image“-Referenz::         Details der Abbild-Deklarationen.
* Abbilder instanziieren::   So legen Sie eine Image-Instanz an.
* „image-type“-Referenz::    Details der Abbildtyp-Deklarationen.
* Abbild-Module::            Module mit Images definieren.
@end menu

@node „image“-Referenz
@section @code{image}-Referenz

Der nun beschriebene Verbundstyp @code{image} ermöglicht es, ein
angepasstes, bootfähiges Systemabbild zu definieren.

@deftp {Datentyp} image
Dieser Datentyp steht für ein Systemabbild.

@table @asis
@item @code{name} (Vorgabe: @code{#false})
Der Name, den das Abbild tragen soll, als Symbol; zum Beispiel
@code{'my-iso9660}. Der Name ist optional; vorgegeben ist @code{#false}.

@item @code{format}
Das Abbildformat als Symbol. Folgende Abbildformate werden unterstützt:

@itemize
@item @code{disk-image}, ein rohes Disk-Image aus einer oder mehreren
Partitionen.

@item @code{compressed-qcow2}, ein komprimiertes Abbild im qcow2-Format, das aus
einer oder mehreren Partitionen besteht.

@item @code{docker}, ein Abbild für Docker.

@item @code{iso9660}, ein Abbild im ISO-9660-Format.

@item @code{tarball}, ein Abbild als tar.gz-Archiv.

@item @code{wsl2}, ein Abbild für WSL2.

@end itemize

@item @code{platform} (Vorgabe: @code{#false})
Welchem @code{platform}-Verbundsobjekt der/die Zielrechner des Abbilds
entsprechen (siehe @ref{Plattformen}); zum Beispiel @code{aarch64-linux}. Nach
Vorgabe steht dieses Feld auf @code{#false}, so dass das Abbild dieselbe
Plattform wie beim Wirtssystem als Ziel annimmt.

@item @code{size} (Vorgabe: @code{'guess})
Die Größe des Abbilds in Bytes oder das Symbol @code{'guess}. Wenn
@code{'guess} angegeben wird, was vorgegeben ist, wird das Abbild so groß
wie es der Inhalt des Abbilds vorgibt.

@item @code{operating-system}
Das @code{operating-system}-Verbundsobjekt, das für das Abbild instanziiert
wird.

@item @code{partition-table-type} (Vorgabe: @code{'mbr})
Der Partitionstabellentyp für das Abbild als ein Symbol. Mögliche Werte sind
@code{'mbr} und @code{'gpt}. Vorgegeben ist @code{'mbr}.

@item @code{partitions} (Vorgabe: @code{'()})
Die Partitionen auf dem Abbild als eine Liste von
@code{partition}-Verbundsobjekten (siehe @ref{„partition“-Referenz}).

@item @code{compression?} (Vorgabe: @code{#true})
Ob der Inhalt des Abbilds komprimiert werden soll, angegeben als Boolescher
Ausdruck. Vorgegeben ist @code{#true} und die Wahl hat nur einen Einfluss,
wenn das Abbildformat @code{'iso9660} lautet.

@item @code{volatile-root?} (Vorgabe: @code{#true})
Ob die Wurzelpartition auf dem Abbild flüchtig sein soll, angegeben als
Boolescher Ausdruck.

Dazu wird ein im Arbeitsspeicher vorgehaltenes Dateisystem (overlayfs) über
der Wurzelpartition durch die initrd eingebunden. Vorgegeben ist
@code{#true}. Wenn es auf @code{#false} gesetzt ist, wird die
Wurzelpartition auf dem Abbild mit Lese- @emph{und} Schreibzugriff von der
initrd eingebunden.

@item @code{shared-store?} (Vorgabe: @code{#false})
Ob der Store auf dem Abbild mit dem Wirtssystem geteilt werden soll,
angegeben als Boolescher Ausdruck. Das können Sie dann gebrauchen, wenn Sie
Abbilder für virtuelle Maschinen erstellen. Wenn es auf @code{#false} steht,
wie es vorgegeben ist, dann wird der Abschluss des erstellten
@code{operating-system} auf das Abbild kopiert. Wenn es dagegen auf
@code{#true} steht, wird angenommen, dass der Store des Wirtssystems beim
Start zur Verfügung gestellt werden wird, zum Beispiel, indem er als
@code{9p}-Einhängepunkt eingebunden wird.

@item @code{shared-network?} (Vorgabe: @code{#false})
Ob die Netzwerkschnittstelle des Wirtssystems mit dem Abbild geteilt wird,
angegeben als Boolescher Ausdruck. Dies hat nur einen Einfluss, wenn als
Abbildformat @code{'docker} verwendet wird. Vorgegeben ist @code{#false}.

@item @code{substitutable?} (Vorgabe: @code{#true})
Ob für die Ableitung des Abbilds Substitute benutzt werden können, angegeben
als Boolescher Ausdruck. Vorgegeben ist @code{true}.

@end table
@end deftp

@menu
* „partition“-Referenz::     „partition“-Referenz
@end menu

@node „partition“-Referenz
@subsection @code{partition}-Referenz

Ein @code{image}-Verbundsobjekt kann Partitionen enthalten.

@deftp {Datentyp} partition
Dieser Datentyp steht für eine Partition auf einem Abbild.

@table @asis
@item @code{size} (Vorgabe: @code{'guess})
Die Größe der Partition in Bytes oder das Symbol @code{'guess}. Wenn
@code{'guess} angegeben wird, was vorgegeben ist, wird die Partition so groß
wie es der Inhalt der Partition vorgibt.

@item @code{offset} (Vorgabe: @code{0})
Bei welchem Versatz in Bytes die Partition losgeht, relativ zum Anfang des
Abbilds oder zum Ende der vorherigen Partition. Vorgegeben ist @code{0},
wodurch kein Versatz gelassen wird.

@item @code{file-system} (Vorgabe: @code{"ext4"})
Das Dateisystem der Partition als Zeichenkette. Die Vorgabe ist
@code{"ext4"}.

Als Wert werden @code{"btrfs"}, @code{"ext4"}, @code{"fat16"},
@code{"f2fs"}, @code{"fat32"}, @code{"vfat"} und @code{"swap"} unterstützt.

Partitionen mit @code{"vfat"}-, @code{"fat16"}- und
@code{"fat32"}-Dateisystem werden automatisch LBA-kompatibel eingestellt,
wenn sie keine @code{'esp}-Flag tragen.

@item @code{file-system-options} (Vorgabe: @code{'()})
Die Befehlszeilenoptionen, die bei der Erstellung der Partition an das
Werkzeug zur Partitionserstellung übergeben werden, angegeben als eine Liste
von Zeichenketten. Dies wird nur für die Erstellung von @code{"vfat"},
@code{"fat16"}, @code{"fat32"} oder @code{"ext4"}-Partitionen unterstützt.

Siehe den Abschnitt zu @code{"extended-options"} in der Handbuchseite des
@code{"mke2fs"}-Werkzeugs für eine umfassendere Übersicht.

@item @code{label}
Die Bezeichnung der Partition. Diese Zeichenkette @emph{muss} angegeben
werden. Ein Beispiel wäre @code{"my-root"}.

@item @code{uuid} (Vorgabe: @code{#false})
Die UUID der Partition als ein @code{uuid}-Verbundsobjekt (siehe @ref{Dateisysteme}). Vorgegeben ist @code{#false}, wodurch das Werkzeug zur
Partitionserstellung eine zufällige UUID an die Partition vergeben wird.

@item @code{flags} (Vorgabe: @code{'()})
Mit welchen Flags die Partition erzeugt wird, angegeben als Liste von
Symbolen. Möglich sind @code{'boot} und @code{'esp}. Lassen Sie die
@code{'boot}-Flag setzen, wenn Sie von dieser Partition booten
möchten. Genau eine Partition sollte diese Flag tragen, in der Regel die
Wurzelpartition. Mit der @code{'esp}-Flag wird eine UEFI-Systempartition
gekennzeichnet.

@item @code{initializer} (Vorgabe: @code{#false})
Die Initialisierungsprozedur der Partition als ein G-Ausdruck. Diese
Prozedur wird aufgerufen, um Dateien zur Partition hinzuzufügen. Wenn keine
Initialisierungsprozedur angegeben wird, wird die Prozedur
@code{initialize-root-partition} aus dem Modul @code{(gnu build image)}
verwendet.

@end table
@end deftp

@node Abbilder instanziieren
@section Abbilder instanziieren

Sagen wir, Sie möchten ein MBR-formatiertes Abbild mit drei verschiedenen
Partitionen erzeugen:

@itemize
@item Der @acronym{ESP, EFI-Systempartition}, einer Partition
mit 40@tie{}MiB versetzt um 1024@tie{}KiB mit einem vfat-Dateisystem.

@item Einer ext4-Partition mit 50@tie{}MiB für eine Datei mit Daten und der Bezeichnung „data“.

@item Einer bootfähigen ext4-Partition, auf der @code{%simple-os}
als Betriebssystem liegt.
@end itemize

Dazu würden Sie zum Beispiel folgende Betriebssystemdefinition in eine Datei
@code{my-image.scm} schreiben.

@lisp
(use-modules (gnu)
             (gnu image)
             (gnu tests)
             (gnu system image)
             (guix gexp))

(define MiB (expt 2 20))

(image
 (format 'disk-image)
 (operating-system %simple-os)
 (partitions
  (list
   (partition
    (size (* 40 MiB))
    (offset (* 1024 1024))
    (label "GNU-ESP")
    (file-system "vfat")
    (flags '(esp))
    (initializer (gexp initialize-efi-partition)))
   (partition
    (size (* 50 MiB))
    (label "DATA")
    (file-system "ext4")
    (initializer #~(lambda* (root . rest)
                     (mkdir root)
                     (call-with-output-file
                         (string-append root "/data")
                       (lambda (port)
                         (format port "my-data"))))))
   (partition
    (size 'guess)
    (label root-label)
    (file-system "ext4")
    (flags '(boot))
    (initializer (gexp initialize-root-partition))))))
@end lisp

Wir merken an, dass für die erste und dritte Partition hier jeweils die
allgemeinen Initialisierungsprozeduren @code{initialize-efi-partition} und
@code{initialize-root-partition} verwendet werden. Mit
@code{initialize-efi-partition} wird ein GRUB-EFI-Lader installiert, um den
GRUB-Bootloader von der Wurzelpartition zu starten. Mit
@code{initialize-root-partition} wird ein vollständiges System instanziiert,
entsprechend der Betriebssystemdefinition in @code{%simple-os}.

Jetzt können Sie das hier ausführen:

@example
guix system image my-image.scm
@end example

und die Abbilddefinition wird instanziiert. Das bedeutet, ein Disk-Image
wird erstellt, das die erwartete Struktur hat:

@example
$ parted $(guix system image my-image.scm) print
…
Modell:  (file)
Festplatte /gnu/store/yhylv1bp5b2ypb97pd3bbhz6jk5nbhxw-disk-image: 1714MB
Sektorgröße (logisch/physisch): 512B/512B
Partitionstabelle: msdos
Disk-Flags:

Nummer  Anfang  Ende    Größe   Typ      Dateisystem  Flags
 1      1049kB  43.0MB  41.9MB  primary  fat16        esp
 2      43.0MB  95.4MB  52.4MB  primary  ext4
 3      95.4MB  1714MB  1619MB  primary  ext4         boot
@end example

Als Größe der @code{boot}-Partition wurde @code{1619MB} ermittelt, damit sie
groß genug ist, um das Betriebssystem @code{%simple-os} zu beherbergen.

Es ist auch möglich, dass Sie die bestehenden Definitionen für
@code{image}-Verbundsobjekte verwenden und so @code{image}-Verbundsobjekte
einfacher definieren können, indem Sie Vererbung benutzen. Im Modul
@code{(gnu system image)} werden die folgenden @code{image}-Variablen
definiert.

@defvar mbr-disk-image
Ein MBR-formatiertes Disk-Image, das eine einzelne Wurzelpartition
enthält. Diese beginnt an einem Versatz von 1@tie{}MiB. Das ist dafür
gedacht, dass noch etwas Platz verbleibt, um einen Bootloader in der Lücke
nach dem MBR installieren zu lassen.
@end defvar

@defvar mbr-hybrid-disk-image
Ein MBR-formatiertes Disk-Image, das aus zwei Partitionen besteht: einer
ESP-Partition für 64-Bit und einer bootfähigen Wurzelpartition. Die
ESP-Partition beginnt an einem Versatz von 1@tie{}MiB. Das ist dafür
gedacht, dass noch etwas Platz verbleibt, um einen Bootloader in der Lücke
nach dem MBR installieren zu lassen. Das Abbild ist für @code{x86_64}- und
@code{i686}-Maschinen geeignet, die nur mit dem alten „legacy“ BIOS-Booting
starten. Mit der ESP-Partition kann es auch auf neueren Maschinen benutzt
werden, die UEFI-Booting voraussetzen, daher wird es als @emph{hybrid}
bezeichnet.
@end defvar

@defvar efi-disk-image
Ein GPT-formatiertes Disk-Image, das aus zwei Partitionen besteht: einer
ESP-Partition für 64-Bit und einer bootfähigen Wurzelpartition. Das Abbild
ist sowohl für die meisten @code{x86_64}- als auch @code{i686}-Maschinen
geeignet, die über BIOS oder UEFI starten können.
@end defvar

@defvar efi32-disk-image
Genau wie @code{efi-disk-image}, aber die EFI-Partition ist auf 32 Bit
ausgelegt.
@end defvar

@defvar iso9660-image
Ein ISO-9660-Abbild, das eine einzelne bootfähige Partition enthält. Dieses
Abbild kann ebenso auf den meisten @code{x86_64}- und @code{i686}-Maschinen
benutzt werden.
@end defvar

@defvar docker-image
Ein Docker-Abbild, mit dem ein Docker-Container gestartet werden kann.
@end defvar

Mit Hilfe des @code{efi-disk-image} können wir unsere vorherige
@code{image}-Deklaration vereinfachen:

@lisp
(use-modules (gnu)
             (gnu image)
             (gnu tests)
             (gnu system image)
             (guix gexp)
             (ice-9 match))

(define MiB (expt 2 20))

(define data
  (partition
   (size (* 50 MiB))
   (label "DATA")
   (file-system "ext4")
   (initializer #~(lambda* (root . rest)
                    (mkdir root)
                    (call-with-output-file
                        (string-append root "/data")
                      (lambda (port)
                        (format port "my-data")))))))

(image
 (inherit efi-disk-image)
 (operating-system %simple-os)
 (partitions
  (match (image-partitions efi-disk-image)
    ((esp root)
     (list esp data root)))))
@end lisp

Dadurch kommt genau dieselbe Abbildinstanz zustande, dennoch ist die
@code{image}-Deklaration so einfacher geworden.

@node „image-type“-Referenz
@section „image-type“-Referenz

Dem Befehl @command{guix system image} kann, wie oben gezeigt, eine Datei
als Argument übergeben werden, in der eine @code{image}-Deklaration
enthalten ist, und daraus wird das eigentliche Disk-Image erstellt. An den
gleichen Befehl kann man auch eine Datei als Argument übergeben, in der eine
Betriebssystemdeklaration als @code{operating-system}-Verbundsobjekt
enthalten ist. Doch wie wird in diesem Fall aus dem @code{operating-system}
ein Abbild gemacht?

Hier kommen die Objekte des Verbundstyps @code{image-type} ins Spiel. Solche
Verbundsobjekte legen fest, wie ein @code{operating-system}-Verbundsobjekt
umgewandelt werden muss, damit ein @code{image}-Verbundsobjekt daraus wird.

@deftp {Datentyp} image-type
Dieser Datentyp steht für einen Abbildtyp.

@table @asis
@item @code{name}
Der Name des Abbildtyps als Symbol. Hierfür @emph{muss} etwas angegeben
werden, zum Beispiel @code{'efi32-raw}.

@item @code{constructor}
Der Konstruktor für diesen Abbildtyp. Hier @emph{muss} eine Prozedur
angegeben werden, die ein Verbundsobjekt vom Typ @code{operating-system}
nimmt und dafür ein Verbundsobjekt vom Typ @code{image} zurückliefert.

@end table
@end deftp

Es werden im Modul @code{(gnu system image)} und in den Modulen @code{(gnu
system images …)} mehrere @code{image-type}-Verbundsobjekte zur Verfügung
gestellt.

@defvar mbr-raw-image-type
Ein Abbild erstellen, das auf dem Abbild @code{mbr-disk-image} basiert.
@end defvar

@defvar mbr-hybrid-raw-image-type
Ein Abbild erstellen, das auf dem Abbild @code{mbr-hybrid-disk-image}
basiert.
@end defvar

@defvar efi-raw-image-type
Ein Abbild erstellen, das auf dem Abbild @code{efi-disk-image} basiert.
@end defvar

@defvar efi32-raw-image-type
Ein Abbild erstellen, das auf dem Abbild @code{efi32-disk-image} basiert.
@end defvar

@defvar qcow2-image-type
Ein Abbild auf Grundlage des @code{mbr-disk-image}-Abbilds erstellen, aber
im Abbildformat @code{compressed-qcow2}. Das resultierende Abbild wird einen
im MBR eingebetteten Bootloader sowie einen EFI-Bootloader enthalten. Das
Abbild ist ungeeignet auf Architekturen, die „grub-pc“ nicht unterstützen,
etwa AArch64. Siehe @code{qcow2-gpt-image-type} als Alternative.
@end defvar

@defvar qcow2-gpt-image-type
Ein Abbild auf Grundlage des @code{efi-disk-image}-Abbilds erstellen, aber
im Abbildformat @code{compressed-qcow2}. Das resultierende Abbild wird nur
einen EFI-Bootloader enthalten, anders als beim Abbildformat
@code{qcow2-image-type}. Das Abbild ist geeignet auf Architekturen, die
„grub-pc“ nicht unterstützen, etwa AArch64.
@end defvar

@defvar iso-image-type
Ein komprimiertes Abbild erstellen, das auf dem Abbild @code{iso9660-image}
basiert.
@end defvar

@defvar uncompressed-iso-image-type
Ein Abbild erstellen, das auf dem Abbild @code{iso9660-image} basiert, für
das allerdings das Feld @code{compression?} auf @code{#false} gesetzt ist.
@end defvar

@defvar docker-image-type
Ein Abbild erstellen, das auf dem Abbild @code{docker-image} basiert.
@end defvar

@defvar raw-with-offset-image-type
Ein MBR-formatiertes Abbild erstellen, das eine einzelne Partition mit einem
Versatz von @code{1024KiB} enthält. Das ist dafür gedacht, dass noch etwas
Platz verbleibt, um einen Bootloader in der Lücke nach dem MBR zu
installieren.
@end defvar

@defvar pinebook-pro-image-type
Ein Abbild erstellen, das für eine Pinebook-Pro-Maschine als Ziel gedacht
ist. Das MBR-formatierte Abbild enthält eine einzelne Partition mit einem
Versatz von @code{9MiB}. In diese Lücke wird
@code{u-boot-pinebook-pro-rk3399-bootloader} als Bootloader installiert.
@end defvar

@defvar rock64-image-type
Ein Abbild erstellen, das für eine Rock64-Maschine als Ziel gedacht ist. Das
MBR-formatierte Abbild enthält eine einzelne Partition mit einem Versatz von
@code{16MiB}. In diese Lücke wird @code{u-boot-rock64-rk3328-bootloader} als
Bootloader installiert.
@end defvar

@defvar novena-image-type
Ein Abbild erstellen, das für eine Novena-Maschine als Ziel gedacht ist. Die
Eigenschaften sind wie bei @code{raw-with-offset-image-type}.
@end defvar

@defvar pine64-image-type
Ein Abbild erstellen, das für eine Pine64-Maschine als Ziel gedacht ist. Die
Eigenschaften sind wie bei @code{raw-with-offset-image-type}.
@end defvar

@defvar hurd-image-type
Ein Abbild erstellen, das für eine @code{i386}-Maschine als Ziel gedacht
ist, auf der der Kernel von Hurd läuft. Das MBR-formatierte Abbild enthält
eine einzelne ext2-Partition mit geeigneten Flags in
@code{file-system-options}.
@end defvar

@defvar hurd-qcow2-image-type
Ein Abbild erstellen, das dem mit @code{hurd-image-type} erstellten ähnelt,
wo aber das @code{format} auf @code{'compressed-qcow2} gesetzt ist.
@end defvar

@defvar wsl2-image-type
Ein Abbild für @acronym{WSL2, Windows-Subsystem für Linux 2} erstellen. Dort
können Sie es importieren mit den Befehlen:

@example
wsl --import Guix ./guix ./wsl2-image.tar.gz
wsl -d Guix
@end example

@end defvar

Erinnern wir uns zurück, dass der Befehl @code{guix system image} eine
Betriebssystemdeklaration nur mit @code{operating-system} als Argument
akzeptiert. Die Vorgabe ist, dass dann @code{mbr-raw-image-type} verwendet
wird, um aus dem Betriebssystem im @code{operating-system}-Objekt ein
wirklich bootfähiges Abbild zu machen.

Sie können ein anderes @code{image-type}-Objekt als Abbildtyp auswählen,
indem Sie die Befehlszeilenoption @code{--image-type} angeben. Mit der
Befehlszeilenoption @code{--list-image-types} werden Ihnen alle
unterstützten Abbildtypen angezeigt, was auf eine textuelle Auflistung der
oben beschriebenen @code{image-types}-Variablen hinausläuft (siehe
@ref{Aufruf von guix system}).

@node Abbild-Module
@section Abbild-Module

Nehmen wir uns das Pine64 als Beispiel vor. Es handelt sich um eine
ARM-basierte Maschine. Um ein Abbild für diesen Chip anfertigen zu können,
benötigen wir die folgenden Bestandteile:

@itemize
@item Ein @code{operating-system}-Verbundsobjekt, zu dem
mindestens ein geeigneter Kernel (@code{linux-libre-arm64-generic}) und
Bootloader @code{u-boot-pine64-lts-bootloader}) für Pine64 gehören.

@item Womöglich wäre ein @code{image-type}-Verbundsobjekt
geeignet, mit dem aus einem @code{operating-system}-Verbundsobjekt ein für
Pine64 nutzbares @code{image}-Verbundsobjekt hergeleitet wird.

@item Dazu ein @code{image}-Verbundsobjekt, das über den Befehl
@command{guix system image} instanziiert werden kann.

@end itemize

Im Modul @code{(gnu system images pine64)} sind all diese Bestandteile zu
finden; jeweils @code{pine64-barebones-os}, @code{pine64-image-type} und
@code{pine64-barebones-raw-image}.

Das Modul liefert ein Abbild vom Typ @code{pine64-barebones-raw-image}, so
dass wir diesen Befehl benutzen können:

@example
guix system image gnu/system/images/pine64.scm
@end example

Damit könnten wir dank dem im @code{pine64-image-type}-Verbundsobjekt
deklarierten Abbildtyp @code{'pine64-raw} eine Datei @code{my-pine.scm}
vorbereiten, die dann den folgenden Inhalt hat:

@lisp
(use-modules (gnu system images pine64))
(operating-system
  (inherit pine64-barebones-os)
  (timezone "Europe/Athens"))
@end lisp

So passen wir das Betriebssystem aus @code{pine64-barebones-os} an. Wir
führen aus:

@example
$ guix system image --image-type=pine64-raw my-pine.scm
@end example

Es sei angemerkt, dass Sie genauso in anderen Modulen innerhalb des
Verzeichnisses @code{gnu/system/images} Definitionen für Novena-, Pine64-,
PinebookPro- und Rock64-Maschinen als Zielsystem finden können.

@node Dateien zur Fehlersuche installieren
@chapter Dateien zur Fehlersuche installieren

@cindex Dateien zur Fehlersuche
Die Binärdateien von Programmen, wie sie zum Beispiel von den GCC-Compilern
erzeugt werden, sind in der Regel im ELF-Format gespeichert und enthalten
eine Sektion mit @dfn{Informationen zur Fehlersuche} (englisch „Debugging
Information“). Informationen zur Fehlersuche machen es möglich, dass der
Debugger, GDB, Binärcode dem Quellcode zuordnen kann. Das ist nötig, damit
es mit etwas Glück leicht ist, Fehler in einem kompilierten Programm zu
suchen.

Dieses Kapitel erklärt, wie abgetrennte Informationen zur Fehlersuche
(„Debug“-Informationen) verwendet werden können, wenn Pakete solche
anbieten, und wie Pakete mit Informationen zur Fehlersuche neu erstellt
werden können, wenn die Pakete keine anbieten.

@menu
* Fehlersuchinformationen abtrennen::  ‚debug‘-Ausgaben installieren.
* Fehlersuchinformationen erneuern::  Fehlende Informationen zur Fehlersuche 
                                        erstellen.
@end menu

@node Fehlersuchinformationen abtrennen
@section Fehlersuchinformationen abtrennen

Das Problem bei Informationen zur Fehlersuche ist, dass dadurch einiges an
Plattenplatz verbraucht wird. Zum Beispiel steuern die Informationen zur
Fehlersuche in der GNU-C-Bibliothek mehr als 60 MiB bei. Als ein Nutzer ist
es deswegen in der Regel nicht möglich, sämtliche Fehlersuchinformationen
für alle installierten Programme zu speichern. Andererseits sollten
Platzeinsparnisse nicht auf Kosten der Fehlersuche gehen@tie{}– besonders im
GNU-System, wo es Nutzern leicht fallen sollte, ihre Freiheit, wie sie ihre
Rechner benutzen, auszuüben (siehe @ref{GNU-Distribution}).

Glücklicherweise gibt es in den GNU Binary Utilities (Binutils) und GDB
einen Mechanismus, mit dem Nutzer das Beste aus beiden Welten bekommen:
Informationen zur Fehlersuche können von den davon beschriebenen
Binärdateien losgelöst und in separaten Dateien gespeichert werden. GDB kann
dann Fehlersuchinformationen laden, wenn diese Dateien verfügbar sind (siehe
@ref{Separate Debug Files,,, gdb, Debugging with GDB}).

Die GNU-Distribution nutzt diesen Mechanismus aus, indem sie Informationen
zur Fehlersuche im Unterverzeichnis @code{lib/debug} einer separaten
Paketausgabe speichert, die den fantasielosen Namen @code{debug} trägt. Mit
dem folgenden Befehl können Sie zum Beispiel Informationen zur Fehlersuche
für die GNU-C-Bibliothek und für GNU Guile installieren:

@example
guix install glibc:debug guile:debug
@end example

GDB muss dann angewiesen werden, im Profil des Nutzers nach Informationen
zur Fehlersuche zu schauen, indem Sie die Variable
@code{debug-file-directory} entsprechend setzen (vielleicht möchsten Sie die
Variable in der Datei @file{~/.gdbinit} festlegen, siehe @ref{Startup,,,
gdb, Debugging with GDB}):

@example
(gdb) set debug-file-directory ~/.guix-profile/lib/debug
@end example

Von da an wird GDB auch aus den @file{.debug}-Dateien unter
@file{~/.guix-profile/lib/debug} auslesbare Informationen zur Fehlersuche
verwenden.

Im Folgenden sehen Sie ein alternatives GDB-Skript, um mit anderen Profilen
zu arbeiten. Es macht Gebrauch von der optionalen Guile-Einbindung in
GDB. Dieses Schnipsel wird auf Guix System nach Voreinstellung in der
@file{~/.gdbinit}-Datei zur Verfügung gestellt.

@example
guile
(use-modules (gdb))
(execute (string-append "set debug-file-directory "
                        (or (getenv "GDB_DEBUG_FILE_DIRECTORY")
                            "~/.guix-profile/lib/debug")))
end
@end example

Des Weiteren werden Sie höchstwahrscheinlich wollen, dass GDB den Quellcode,
der auf Fehler untersucht wird, anzeigen kann. Dazu müssen sie den
Quellcodes des Pakets, für das Sie sich interessieren (laden Sie ihn mit
@code{guix build --source} herunter; siehe @ref{Aufruf von guix build}), und
dann weisen Sie GDB an, in dem Verzeichnis zu suchen, indem Sie den
@code{directory}-Befehl benutzen (siehe @ref{Source Path, @code{directory},,
gdb, Debugging with GDB}).

@c XXX: keep me up-to-date
Der Mechanismus mit der @code{debug}-Ausgabe wird in Guix als Teil des
@code{gnu-build-system} implementiert (siehe @ref{Erstellungssysteme}). Zurzeit
ist sie optional@tie{}– nur für Pakete, in deren Definition ausdrücklich
eine @code{debug}-Ausgabe deklariert wurde, sind Informationen zur
Fehlersuche verfügbar. Um zu überprüfen, ob Pakete eine @code{debug}-Ausgabe
mit Informationen zur Fehlersuche haben, benutzen Sie @command{guix package
--list-available} (siehe @ref{Aufruf von guix package}).

Lesen Sie weiter, um zu erfahren, wie Sie mit Paketen ohne eine
@code{debug}-Ausgabe umgehen können.

@node Fehlersuchinformationen erneuern
@section Fehlersuchinformationen erneuern

@cindex Dateien zur Fehlersuche, neu erstellen
Wie wir oben gesehen haben, bieten manche Pakete, aber nicht alle,
Informationen zur Fehlersuche in einer @code{debug}-Ausgabe an. Doch was tut
man mit denen ohne Fehlersuchinformationen? Die Befehlszeilenoption
@option{--with-debug-info} stellt eine Lösung dafür da: Mit ihr kann jedes
Paket, für das solche Debug-Informationen fehlen,@tie{}– und nur
solche@tie{}– neu erstellt werden und die Anwendung, in der Sie Fehler
suchen, wird damit veredelt. Obwohl es also nicht so schnell geht wie eine
@code{debug}-Ausgabe zu installieren, ist es doch ein verhältnismäßig
kleiner Aufwand.

Schauen wir uns das näher an. Angenommen, Sie erleben einen Fehler in
Inkscape und würden gerne wissen, was dabei in GLib passiert. GLib ist eine
Bibliothek, die tief im Abhängigkeitsgraphen von GLib liegt. Wie sich
herausstellt, verfügt GLib über keine @code{debug}-Ausgabe. Die
Rückverfolgung („Backtrace“), die GDB anzeigt, ist zu nichts nütze:

@example
(gdb) bt
#0  0x00007ffff5f92190 in g_getenv ()
   from /gnu/store/…-glib-2.62.6/lib/libglib-2.0.so.0
#1  0x00007ffff608a7d6 in gobject_init_ctor ()
   from /gnu/store/…-glib-2.62.6/lib/libgobject-2.0.so.0
#2  0x00007ffff7fe275a in call_init (l=<optimized out>, argc=argc@@entry=1, argv=argv@@entry=0x7fffffffcfd8,
    env=env@@entry=0x7fffffffcfe8) at dl-init.c:72
#3  0x00007ffff7fe2866 in call_init (env=0x7fffffffcfe8, argv=0x7fffffffcfd8, argc=1, l=<optimized out>)
    at dl-init.c:118
@end example

Dagegen hilft, wenn Sie Inkscape so installieren, dass es an eine Variante
von GLib gebunden ist, die Informationen zur Fehlersuche enthält.

@example
guix install inkscape --with-debug-info=glib
@end example

Und schon sieht die Fehlersuche wesentlich besser aus:

@example
$ gdb --args sh -c 'exec inkscape'
…
(gdb) b g_getenv
Function "g_getenv" not defined.
Make breakpoint pending on future shared library load? (y or [n]) y
Breakpoint 1 (g_getenv) pending.
(gdb) r
Starting program: /gnu/store/…-profile/bin/sh -c exec\ inkscape
…
(gdb) bt
#0  g_getenv (variable=variable@@entry=0x7ffff60c7a2e "GOBJECT_DEBUG") at ../glib-2.62.6/glib/genviron.c:252
#1  0x00007ffff608a7d6 in gobject_init () at ../glib-2.62.6/gobject/gtype.c:4380
#2  gobject_init_ctor () at ../glib-2.62.6/gobject/gtype.c:4493
#3  0x00007ffff7fe275a in call_init (l=<optimized out>, argc=argc@@entry=3, argv=argv@@entry=0x7fffffffd088,
    env=env@@entry=0x7fffffffd0a8) at dl-init.c:72
…
@end example

Viel besser!

Beachten Sie, dass es Pakete geben kann, für die sich
@option{--with-debug-info} nicht wie gewünscht auswirkt. Siehe @ref{Paketumwandlungsoptionen, @option{--with-debug-info}} für mehr Informationen.

@node TeX und LaTeX gebrauchen
@chapter @TeX{} und @LaTeX{} gebrauchen

@cindex @TeX{}-Pakete
@cindex @LaTeX{}-Pakete
Guix stellt Pakete für @TeX{}, @LaTeX{}, ConTeXt, LuaTeX und verwandte
Textsatzsysteme bereit, die aus der @uref{https://www.tug.org/texlive/,
@TeX{}-Live-Distribution} stammen. Weil @TeX{} Live außergewöhnlich groß ist
und sich in diesem Irrgarten zurechtzufinden schwierig ist, enthält dieser
Abschnitt eine Anleitung, wie man die nötigen Pakete aufspielt und damit
@TeX{}- und @LaTeX{}-Dokumente kompiliert.

@TeX{} Live gibt es in zwei @emph{nicht} mischbaren Geschmacksrichtungen in
Guix:

@itemize
@item
Einmal das „monolithische“ @code{texlive}-Paket: Da ist @emph{absolut jedes
@TeX{}-Live-Paket} drinnen (es sind um die 4.200 Stück), es ist aber auch
gewaltig groß@tie{}– über 4@tie{}GiB für nur ein Paket!

@item
Dann eine „modulare“ @TeX{}-Live-Distribution, wo Sie nur die Pakete, die
Sie brauchen, installieren. Der Name der Pakete beginnt immer mit
@samp{texlive-}.
@end itemize

Es funktioniert nicht, die beiden Geschmacksrichtungen zu
vermischen@footnote{Keine Regel ohne Ausnahme! Weil im monolithischen @TeX{}
Live das @command{biber}-Programm fehlt, ist es möglich, das Paket
@code{texlive-biber} dazuzunehmen, was es enthält.}. Wenn Ihr Dokument beim
modularen Paketsatz nicht kompiliert werden kann, liegt die Lösung
@emph{nicht} darin, das monolithische @code{texlive}-Paket hinzuzufügen,
sondern Sie sollten die Pakete aus der modularen Distribution hinzufügen.

Ein zusammenpassendes System mit allen notwendigen Werkzeugen, das auch noch
alle nötigen Abhängigkeiten enthält, zusammenzustellen, ist
mühevoll. Greifen Sie fürs Erste einfach auf „Meta-Pakete“ bzw.@:
Paketsammlungen zurück („Collections“) und auf „Schemes“, damit sind
Collections von Collections gemeint. Folgender Befehl listet die verfügbaren
Schemes und Collections auf (siehe @ref{guix-search,, Invoking guix
package}):

@example
guix search texlive-\(scheme\|collection\) | recsel -p name,description
@end example

Falls nötig, vervollständigen Sie die Auswahl mit eigenständigen Paketen,
vor allem wenn sie Teil einer Collection mit vielen Paketen sind, die Sie
zum großen Teil nicht brauchen.

Beispielsweise eignet sich das folgende Manifest als vernünftiger und doch
sparsamer Ausgangspunkt für französische @LaTeX{}-Nutzer:

@lisp
(specifications->manifest
 '("rubber"

   "texlive-scheme-basic"
   "texlive-collection-latexrecommended"
   "texlive-collection-fontsrecommended"
   "texlive-babel-french"

   ;; Aus der Collection "latexextra".
   "texlive-tabularray"
   ;; Aus der Collection "binextra".
   "texlive-texdoc"))
@end lisp

Manchmal klappt es in dieser Grundeinstellung nicht, ein gewünschtes
Dokument zu kompilieren. Schwierigkeiten macht vor allem, die Pakete
auszusuchen, die Sie brauchen. Wenn ein Paket fehlt, schlagen Befehle wie
@command{pdflatex} und Kollegen fehl mit so unverständlichen Meldungen wie:

@example
dokument.tex: File `tikz.sty' not found.
dokument.tex:7: Emergency stop.
@end example

@noindent
Oder wenn eine Schrift fehlt:

@example
kpathsea: Running mktexmf phvr7t
! I can't find file `phvr7t'.
@end example

Wie findet man heraus, welches Paket fehlt? Im ersten Fall hilft eine Suche:

@example
$ guix search texlive tikz
name: texlive-pgf
version: 59745
…
@end example

Im zweiten Fall wird man mit @command{guix search} nicht fündig. Wenn man
stattdessen in der Paketdatenbank von @TeX{} Live mit dem Befehl
@command{tlmgr} sucht, bekommt man Antworten:

@example
$ tlmgr info phvr7t
tlmgr: cannot find package phvr7t, searching for other matches:

Packages containing `phvr7t' in their title/description:

Packages containing files matching `phvr7t':
helvetic:
        texmf-dist/fonts/tfm/adobe/helvetic/phvr7t.tfm
        texmf-dist/fonts/tfm/adobe/helvetic/phvr7tn.tfm
        texmf-dist/fonts/vf/adobe/helvetic/phvr7t.vf
        texmf-dist/fonts/vf/adobe/helvetic/phvr7tn.vf
tex4ht:
        texmf-dist/tex4ht/ht-fonts/alias/adobe/helvetic/phvr7t.htf
@end example

@noindent
Die Datei erhält man als Teil von @TeX{} Lives @code{helvetic}-Paket, das in
Guix @code{texlive-helvetic} heißt. Es sind viele Schritte, aber sie führen
zum Ziel!

@node Sicherheitsaktualisierungen
@chapter Sicherheitsaktualisierungen

@cindex Sicherheitsaktualisierungen
@cindex Sicherheitslücken
Ab und zu werden wichtige Sicherheitsschwachstellen in Software-Paketen
entdeckt, die mit Patches behoben werden müssen. Guix-Entwickler geben ihr
Bestes, bezüglich bekannter Schwachstellen auf dem Laufenden zu bleiben und
so bald wie möglich Patches dafür auf den @code{master}-Branch von Guix
aufzuspielen (einen stabilen „stable“-Branch ohne riskante Änderungen haben
wir noch nicht). Das Werkzeug @command{guix lint} hilft Entwicklern dabei,
verwundbare Versionen von Softwarepaketen in der Distribution zu finden:

@smallexample
$ guix lint -c cve
gnu/packages/base.scm:652:2: glibc@@2.21: Wahrscheinlich angreifbar durch CVE-2015-1781, CVE-2015-7547
gnu/packages/gcc.scm:334:2: gcc@@4.9.3: Wahrscheinlich angreifbar durch CVE-2015-5276
gnu/packages/image.scm:312:2: openjpeg@@2.1.0: Wahrscheinlich angreifbar durch CVE-2016-1923, CVE-2016-1924
…
@end smallexample

Siehe @ref{Aufruf von guix lint} für weitere Informationen.

Guix verfolgt eine funktionale Disziplin bei der Paketverwaltung (siehe
@ref{Einführung}), was impliziert, dass bei jeder Änderung an einem Paket
@emph{jedes davon abhängige Paket} neu erstellt werden muss. Ohne einen
Mechanismus würde das Ausliefern von Sicherheitsaktualisierungen in
Kernpaketen wie libc oder Bash dadurch deutlich verlangsamt@tie{}–
schließlich müsste quasi die gesamte Distribution neu erstellt
werden. Vorerstellte Binärdateien zu benutzen, wäre schon einmal eine Hilfe
(siehe @ref{Substitute}), aber die Auslieferung wäre immer noch laangsamer,
als wir es uns wünschen.

@cindex Veredelungen
Als Gegenmittel sind in Guix @dfn{Veredelungen} implementiert. Diese stellen
einen Mechanismus dar, mit dem kritische Aktualisierungen schnell an Guix’
Benutzer ausgeliefert werden können, ohne die Nachteile, zu denen es käme,
wenn wir die gesamte Distribution neu erstellen müssten. Die Idee dahinter
ist, nur das Paket, das einen Patch braucht, neu zu erstellen, und damit
dann Pakete, die der Nutzer ausdrücklich installiert hat und die vorher
Referenzen auf das alte Paket enthielten, zu „veredeln“. So eine Veredelung
kostet typischerweise nur sehr wenig, d.h.@: um Größenordnungen weniger, als
die ganze Abhängigkeitskette neu zu erstellen.

@cindex Ersetzungen von Paketen, bei Veredelungen
Nehmen wir also an, eine Sicherheitsaktualisierung müsste auf Bash angewandt
werden. Guix-Entwickler schreiben dann eine Paketdefinition für die
„reparierte“ Bash, sagen wir @code{bash-fixed}, auf die gleiche Art wie
immer (siehe @ref{Pakete definieren}). Dann wird die ursprüngliche
Paketdefinition um ein @code{replacement}-Feld (zu Deutsch „Ersetzung“)
erweitert, das auf das Paket verweist, in dem der Fehler behoben wurde:

@lisp
(define bash
  (package
    (name "bash")
    ;; …
    (replacement bash-fixed)))
@end lisp

Ab diesem Zeitpunkt wird jedes Paket, das Sie installieren und das direkt
oder indirekt von Bash abhängt@tie{}– also die von @command{guix gc
--requisites} ausgegebenen Pakete (siehe @ref{Aufruf von guix gc})@tie{}–,
automatisch „umgeschrieben“, so dass es @code{bash-fixed} referenziert, wo
es vorher @code{bash} referenziert hatte. Die Dauer dieses
Veredelungsprozesses ist proportional zur Größe des Pakets und liegt auf
einer neuen Maschine für ein „durchschnittliches“ Paket bei unter einer
Minute. Veredeln ist rekursiv: Wenn eine indirekte Abhängigkeit veredelt
werden muss, „propagiert“ der Veredelungsprozess durch die abhängigen Pakete
und endet mit dem Paket, das der Nutzer installiert.

Zurzeit muss der Name und die Version einer Veredelung gleichlang wie die
beim ersetzten Paket sein (also bei @code{bash-fixed} und @code{bash} im
Beispiel oben). Diese Einschränkung kommt daher, dass beim Veredeln der
Inhalt von Dateien, einschließlich Binärdateien, durch einfache Ersetzungen
„geflickt“ wird. Es gibt noch mehr Einschränkungen: Wenn zum Beispiel ein
Paket veredelt wird, das eine gemeinsame Bibliothek („Shared Library“)
verwendet, muss der @code{SONAME} von Original und Ersatz derselbe sein und
die beiden müssen binär kompatibel sein.

Mit der Befehlszeilenoption @option{--no-grafts} können Sie den
Veredelungsmechanismus zwingend abschalten (siehe @ref{Gemeinsame Erstellungsoptionen,
@option{--no-grafts}}). Der Befehl

@example
guix build bash --no-grafts
@end example

@noindent
liefert also den Namen der Store-Datei mit der ursprünglichen Bash, während

@example
guix build bash
@end example

@noindent
den Namen der Store-Datei für die „reparierte“ Ersatz-Bash liefert. Dadurch
können Sie zwischen den beiden Varianten von Bash unterscheiden.

Um zu prüfen, welche Bash Ihr gesamtes Profil referenziert, können Sie
diesen Befehl hier laufen lassen (siehe @ref{Aufruf von guix gc}):

@example
guix gc -R $(readlink -f ~/.guix-profile) | grep bash
@end example

@noindent
Dann vergleichen Sie die Namen der Store-Objekte, die Sie ausgegeben
bekommen, mit den beiden Bash-Paketnamen oben. Ebenso können Sie eine ganze
Guix-Systemgeneration überprüfen:

@example
guix gc -R $(guix system build my-config.scm) | grep bash
@end example

Zum Schluss können Sie mit dem Befehl @command{lsof} überprüfen, welches von
den Bash-Paketen die laufenden Prozesse benutzen:

@example
lsof | grep /gnu/store/.*bash
@end example


@node Bootstrapping
@chapter Bootstrapping

@c Adapted from the ELS 2013 paper.

@cindex Bootstrapping

Wenn wir von Bootstrapping sprechen, meinen wir damit, wie die Distribution
„aus dem Nichts“ erstellt werden kann. Erinnern Sie sich, wie die
Erstellungsumgebung für eine Ableitung nichts außer ihren deklarierten
Eingaben enthält (siehe @ref{Einführung})? Daraus ergibt sich ein
Henne-Ei-Problem: Wie kann so das allererste Paket entstehen? Womit wird der
Compiler kompiliert?

Man könnte auf die Idee kommen, diese Frage sei nur für eingefleischte
Hacker interessant. Doch auch wenn die Antwort darauf technischer Natur ist,
hat sie weitreichende Implikationen. Vom Bootstrapping der Distribution
hängt ab, wie sehr wir, als Individuen und als Kollektiv aus Nutzern und
Hackern, der Software vertrauen können, die wir verwenden. Es ist ein
zentrales Anliegen vom Standpunkt der @emph{Informationssicherheit}, aber
auch im Hinblick auf die @emph{Freiheit} der Benutzer.

@cindex Bootstrap-Binärdateien
Das GNU-System besteht in erster Linie aus C-Code, dessen Kern die libc
ist. Das GNU-Erstellungssystem selbst setzt voraus, dass eine Bourne-Shell
und die Kommandozeilenwerkzeuge der GNU-Coreutils, Awk, Findutils, „sed“ und
„grep“ verfügbar sind. Des Weiteren sind Programme für die Erstellung@tie{}–
also Programme, die @code{./configure}, @code{make}, etc.@: ausführen@tie{}–
in Guile Scheme geschrieben (siehe @ref{Ableitungen}). Folglich ist es
erforderlich, dass, damit überhaupt irgendetwas erstellt werden kann, Guix
vorerstellte Binärdateien von Guile, GCC, Binutils, libc und den anderen
oben genannten Paketen verwendet. Diese bezeichnen wir als die
@dfn{Bootstrap-Binärdateien}.

Diese Bootstrap-Binärdateien werden als „gegeben“ angenommen, obwohl wir sie
auch neu erzeugen können, falls nötig (siehe @ref{Vorbereitung zur Verwendung der Bootstrap-Binärdateien}).

@menu
* Quellcode von Anfang an::  Ein Bootstrapping, wie GNU es verdient.
* Vorbereitung zur Verwendung der Bootstrap-Binärdateien::  Das 
                                                              Allerwichtigste 
                                                              erstellen.
@end menu

@node Quellcode von Anfang an
@section Bootstrapping aus dem Quellcode allein

Guix wird@tie{}– wie andere GNU/Linux-Distributionen auch@tie{}–
traditionell aus einer Menge von Bootstrap-Binärdateien heraus erstellt: der
Bourne-Shell, den Befehlszeilenwerkzeugen der GNU Coreutils, Awk, Findutils,
„sed“ und „grep“ sowie Guile, GCC, Binutils und der GNU-C-Bibliothek (siehe
@ref{Bootstrapping}). Normalerweise werden diese Bootstrap-Binärdateien
„stillschweigend vorausgesetzt“.

Die Bootstrap-Binärdateien stillschweigend vorauszusetzen bedeutet, dass wir
sie als korrekte und vertrauenswürdige Grundlage ansehen, als „Seed“, aus
dem heraus das komplette System erstellt wird. Darin liegt ein Problem: Die
Gesamtgröße all dieser Bootstrapping-Binärdateien beträgt um die 250MB
(siehe @ref{Bootstrappable Builds,,, mes, GNU Mes}). Ein Audit oder auch nur
eine Inspektion davon ist praktisch unmöglich.

@c XXX TODO: update to savannah url, once accepted there
Bei @code{i686-linux} und @code{x86_64-linux} ist Guix so weit, dass ein
@dfn{Bootstrapping aus dem Quellcode allein} möglich ist. Das Bootstrapping
wurzelt in @file{hex0-seed} aus dem Paket
@url{https://savannah.gnu.org/projects/stage0, Stage0}. Das Programm hex0
ist ein kleinster Assembler: Es liest leerzeichengetrennte
Hexadezimalziffern (Nibbles) aus einer Datei ein, die Kommentare enthalten
darf, und gibt auf der Standardausgabe die zu den Hexadezimalzahlen
gehörenden Bytes aus. Der Quellcode dieses den Anfang bildenden
hex0-Programms ist eine Datei namens
@url{https://github.com/oriansj/bootstrap-seeds/blob/master/POSIX/x86/hex0_x86.hex0,@file{hex0_x86.hex0}}
und die Sprache, in der es geschrieben ist, ist @code{hex0}.

Hex0 kann sich selbst erstellen („self-hosting“):

@example
./hex0-seed hex0_x86.hex0 hex0
@end example

Hex0 ist das ASCII-Gegenstück des binären Programms und lässt sich erzeugen,
indem man das Gleiche tut wie hier:

@example
sed 's/[;#].*$//g' hex0_x86.hex0 | xxd -r -p > hex0
chmod +x hex0
@end example

Durch die Gleichwertigkeit von ASCII und Binärcode können wir diese erste
357-Byte-Binärdatei als Quellcode anerkennen. Daher haben wir ein
„Bootstrapping aus dem Quellcode allein“ erreicht.

Das Bootstrapping geht Schritt für Schritt weiter: @code{hex0} erstellt
@code{hex1} und dann weiter bis @code{M0}, @code{hex2}, @code{M1},
@code{mescc-tools} und schließlich @code{M2-Planet}. Von dort können wir mit
@code{M2-Planet} und den Programmen aus @code{mescc-tools} dann Mes
erstellen (siehe @ref{Top, Referenzhandbuch zu GNU Mes,, mes, GNU Mes},
einen Scheme-Interpretierer und C-Compiler, der in Scheme geschrieben
ist). Ab hier beginnt das traditionellere @code{C}-basierte Bootstrapping
des GNU-Systems.

Ein nächster Schritt war es, die Shell und all ihre Werkzeuge durch in Guile
Scheme verfasste Implementierungen zu ersetzen. Nun haben wir ein
@emph{Bootstrapping nur in Scheme}. Gash (siehe @ref{Gash,,, gash, The Gash
manual}) ist eine POSIX-kompatible Shell, die Bash ersetzt, und mit ihr
kommen die Gash Utils als minimalistischer Ersatz für Awk, die GNU Core
Utilities, Grep, Gzip, Sed und Tar.

Das Erstellen des GNU-Systems aus seinem Quellcode heraus ist derzeit nur
möglich, wenn wir ein paar historische GNU-Pakete als Zwischenschritte
hinzufügen@footnote{Dazu gehören Pakete wie @code{gcc-2.95.3},
@code{binutils-2.14}, @code{glibc-2.2.5}, @code{gzip-1.2.4}, @code{tar-1.22}
und noch ein paar andere. Details finden Sie in
@file{gnu/packages/commencement.scm}.}. Mit dem Heranreifen von Gash und
Gash Utils und der Entwicklung von GNU-Paketen hin zu mehr Bootstrapbarkeit
(z.B.@: wird es neue Veröffentlichungen von GNU Sed auch wieder als
Gzip-komprimierte Tarballs geben, einer Alternative zur schwer zu
bootstrappenden @code{xz}-Kompression), wird dieser Satz zusätzlicher Pakete
hoffentlich noch einmal reduziert werden können.

Im folgenden Graphen sehen Sie den sich ergebenden Abhängigkeitsgraphen für
@code{gcc-core-mesboot0}, den Bootstrapping-Compiler, mit dem das
traditionelle Bootstrapping für den Rest von Guix System vollzogen wird.

@c ./pre-inst-env guix graph \
@c   -e '(@@ (gnu packages commencement) gcc-core-mesboot0)' \
@c   | sed -r \
@c     -e 's,((bootstrap-seeds|guile-bootstrap).*shape =) box,\1 ellipse,' \
@c     -e 's,fontname = sans,fontname = "dejavu sans",' \
@c   > doc/images/gcc-core-mesboot0-graph.dot
@image{images/gcc-core-mesboot0-graph,6in,,Abhängigkeitsgraph des
gcc-core-mesboot0}

Wir arbeiten daran, ein solches Bootstrapping für die @code{arm-linux}- und
@code{aarch64-linux}-Architekturen und GNU@tie{}Hurd anzubieten.

Wenn Sie daran Interesse haben, dann machen Sie bei uns mit auf
@code{#bootstrappable} auf dem Libera.Chat-IRC-Netzwerk oder diskutieren Sie
mit auf @email{bug-mes@@gnu.org} oder @email{gash-devel@@nongnu.org}.

@node Vorbereitung zur Verwendung der Bootstrap-Binärdateien
@section Vorbereitung zur Verwendung der Bootstrap-Binärdateien

@c As of Emacs 24.3, Info-mode displays the image, but since it's a
@c large image, it's hard to scroll.  Oh well.
@image{images/bootstrap-graph,6in,,Abhängigkeitsgraph der frühen
Bootstrap-Ableitungen}

Die Abbildung oben zeigt den Anfang des Abhängigkeitsgraphen der
Distribution und entspricht den Paketdefinitionen im @code{(gnu package
bootstrap)}-Modul. Eine ähnliche Grafik kann mit @command{guix graph} (siehe
@ref{Aufruf von guix graph}) erzeugt werden:

@example
guix graph -t derivation \
  -e '(@@@@ (gnu packages bootstrap) %bootstrap-gcc)' \
  | dot -Tps > gcc.ps
@end example

oder für das Bootstrapping mit noch kleinerem Seed:

@example
guix graph -t derivation \
  -e '(@@@@ (gnu packages bootstrap) %bootstrap-mes)' \
  | dot -Tps > mes.ps
@end example

Bei diesem Detaillierungsgrad sind die Dinge recht komplex. Guile selbst
besteht aus einer ausführbaren ELF-Datei neben vielen Quelldateien und
kompilierten Scheme-Dateien, die dynamisch bei der Ausführung geladen
werden. Das wird in dem im Graph gezeigten @file{guile-2.0.7.tar.xz}-Archiv
gespeichert. Das Archiv ist Teil von Guix’ „Quelldistribution“ und wird in
den Store mit @code{add-to-store} (siehe @ref{Der Store}) eingefügt.

Doch wie schreibt man eine Ableitung, die dieses Tarball-Archiv entpackt und
in den Store einfügt? Um dieses Problem zu lösen, benutzt die
@code{guile-bootstrap-2.0.drv}-Ableitung@tie{}– die erste, die erstellt
wird@tie{}– @code{bash} als Ersteller, welche wiederum
@code{build-bootstrap-guile.sh} ausführt, was über einen Aufruf von
@code{tar} den Tarball entpackt. Deswegen sind @file{bash}, @file{tar},
@file{xz} und @file{mkdir} als statisch gebundene Binärdateien auch Teil der
Guix-Quelldistribution, die nur dazu da sind, dass der Guile-Tarball
entpackt werden kann.

Sobald @code{guile-bootstrap-2.0.drv} erstellt worden ist, haben wir ein
funktionierendes Guile zur Hand, mit dem nachfolgende Erstellungsprogramme
ausgeführt werden können. Sein erster Auftrag ist, Tarballs mit den anderen
vorerstellten Binärdateien herunterzuladen@tie{}– das ist die Tätigkeit der
@file{.tar.xz.drv}-Ableitungen. Wir verwenden zu diesem Zweck Guix-Module
wie @code{ftp-client.scm}. Die @code{module-import.drv}-Ableitungen
importieren solche Module und schreiben sie in derselben Verzeichnisstruktur
in ein Verzeichnis im Store. Die
@code{module-import-compiled.drv}-Ableitungen kompilieren die Module und
schreiben sie in der richtigen Struktur in ein Ausgabeverzeichnis. Dies
entspricht dem @code{#:modules}-Argument von
@code{build-expression->derivation} (siehe @ref{Ableitungen}).

Schließlich werden die verschiedenen Tarballs durch die Ableitungen
@code{gcc-bootstrap-0.drv}, @code{glibc-bootstrap-0.drv}, oder
@code{bootstrap-mes-0.drv} und @code{bootstrap-mescc-tools-0.drv},
entpackt. Zu diesem Zeitpunkt haben wir eine fertige Toolchain für C.

@unnumberedsec Die Erstellungswerkzeuge erstellen

Das Bootstrapping ist abgeschlossen, sobald eine vollständige Toolchain
vorliegt, die von den oben erläuterten vorerstellten
Bootstrapping-Werkzeugen @emph{nicht} abhängt. Diese Voraussetzung, keine
Abhängigkeiten zu haben, überprüft man, indem man schaut, ob die Dateien der
endgültigen Toolchain frei von Referenzen auf die
@file{/gnu/store}-Verzeichnisse der Bootstrapping-Eingaben sind. Der
Vorgang, diese „finale“ Toolchain zu bekommen, wird von den
Paketdefinitionen beschrieben, die Sie im Modul @code{(gnu packages
commencement)} finden.

Mit dem Befehl @command{guix graph} können wir gegenüber dem obigen Graphen
„herauszoomen“, indem wir alles auf der Ebene von Paketobjekten statt auf
der von einzelnen Ableitungen betrachten@tie{}– denken Sie daran, dass ein
Paket zu mehreren Ableitungen führen kann; normalerweise einer, die seine
Quelldateien herunterlädt, einer, die die benötigten Guile-Module erstellt,
und einer, die das Paket dann tatsächlich aus seinem Quellcode heraus
erstellt. Der Befehl

@example
guix graph -t bag \
  -e '(@@@@ (gnu packages commencement)
          glibc-final-with-bootstrap-bash)' | xdot -
@end example

@noindent
zeigt den Abhängigkeitsgraphen, der zur „finalen“
C-Bibliothek@footnote{Ihnen könnte die @code{glibc-intermediate}-Markierung
auffallen, die darauf hindeutet, dass sie @emph{noch nicht ganz} final ist,
aber annäherungsweise betrachten wir sie als final.} führt. Hier sehen Sie
ihn:

@image{images/bootstrap-packages,6in,,Abhängigkeitsgraph der frühen Pakete}

@c See <https://lists.gnu.org/archive/html/gnu-system-discuss/2012-10/msg00000.html>.
Das erste Werkzeug, das mit den Bootstrapping-Binärdateien erstellt wird,
ist GNU@tie{}Make@tie{}– beachten Sie das oben sichtbare
@code{make-boot0}@tie{}–, das eine Voraussetzung aller folgenden Pakete
ist. Von da aus werden Findutils und Diffutils erstellt.

Es folgt die erste Stufe der Binutils und GCC, die pseudo-crosskompiliert
werden@tie{}– d.h.@: die @option{--target}-Befehlszeilenoption entspricht
der @option{--host}-Option. Mit ihnen wird libc erstellt. Dank den
Crosskompilierungstricks ist garantiert, dass diese libc keine Referenzen
auf die anfängliche Toolchain enthält.

Damit werden die finalen Binutils und GCC erstellt (sie sind oben nicht zu
sehen). GCC benutzt den @command{ld} aus den finalen Binutils und bindet
Programme an die gerade erstellte libc. Mit dieser Toolchain erstellen wir
die anderen Pakete, die Guix und das GNU-Erstellungssystem benutzen: Guile,
Bash, Coreutils, etc.

Und voilà! Wenn das geschafft ist, haben wir die vollständige Menge von
Erstellungswerkzeugen, die das GNU-Erstellungssystem erwartet. Sie sind in
der Variablen @code{%final-inputs} des Moduls @code{(gnu packages
commencement)} zu finden und werden von jedem Paket implizit benutzt, das
das @code{gnu-build-system} verwendet (siehe @ref{Erstellungssysteme,
@code{gnu-build-system}}).


@unnumberedsec Die Bootstrapping-Binärdateien erstellen

@cindex Bootstrap-Binärdateien
Weil die finale Toolchain nicht von den Bootstrapping-Binärdateien abhängt,
müssen diese nur selten aktualisiert werden. Es ist dennoch sinnvoll, sie
automatisiert erzeugen zu können, wenn sie doch aktualisiert werden. Das
Modul @code{(gnu packages make-bootstrap)} ermöglicht dies.

Mit dem folgenden Befehl werden die Tarball-Archive erstellt, die die
Bootstrapping-Binärdateien enthalten (beim traditionellen Bootstrapping sind
das Binutils, GCC und glibc; beim Bootstrapping mit kleinerem Seed sind es
linux-libre-headers, bootstrap-mescc-tools, bootstrap-mes; dazu kommen Guile
sowie ein Tarball mit einer Mischung aus Coreutils und anderen grundlegenden
Befehlszeilenwerkzeugen):

@example
guix build bootstrap-tarballs
@end example

Die erzeugten Tarballs sind es, auf die im Modul @code{(gnu packages
bootstrap)} verwiesen werden sollte, das am Anfang dieses Abschnitts erwähnt
wurde.

Können Sie noch folgen? Dann haben Sie vielleicht schon angefangen, sich zu
fragen, wann wir denn einen Fixpunkt erreichen. Das ist eine interessante
Frage! Leider wissen wir es nicht, aber wenn Sie es herausfinden wollen (und
Ihnen die nennenswerten Rechen- und Speicherkapazitäten dafür zur Verfügung
stehen), dann lassen Sie es uns wissen.

@unnumberedsec Die Menge an Bootstrapping-Binärdateien verkleinern

Zu unserem traditionellen Bootstrapping gehören GCC, GNU Libc, Guile,
etc. Das ist ganz schön viel binärer Code! Warum ist das ein Problem? Es ist
deswegen ein Problem, weil es praktisch unmöglich ist, solch große Klumpen
binären Codes einem Audit zu unterziehen. Dadurch wird es schwer,
nachzuvollziehen, welcher Quellcode ihn erzeugt hat. Jede ausführbare
Binärdatei, für die kein Audit möglich ist, macht uns verwundbar gegenüber
Hintertüren in Compilern, wie Ken Thompson sie in seiner Arbeit von 1984,
@emph{Reflections on Trusting Trust}, beschrieben hat.

Wir senken das Risiko, indem wir unsere Bootstrapping-Binärdateien immer mit
einer früheren Guix-Version erzeugen. Trotzdem fehlt uns das Niveau an
Transparenz, das wir am übrigen Paketabhängigkeitsgraphen wertschätzen, wo
Guix immer vom Quellcode eindeutig auf die Binärdateien abbildet. Unser Ziel
ist also, die Menge an Bootstrapping-Binärdateien so weit wie möglich zu
verkleinern.

Auf dem @uref{https://bootstrappable.org, Webauftritt von
Bootstrappable.org} werden laufende Projekte mit diesem Zweck
aufgeführt. Bei einem davon geht es darum, den Bootstrapping-GCC durch eine
Folge von Assemblern, Interpretierern und Compilern zunehmender Komplexität
zu ersetzen, die von Anfang an aus Quellcode heraus erstellt werden kann,
angefangen bei einem einfachen, überprüfbaren Assembler.

Unsere erste große Leistung stellt die Ersetzung von GCC, der
GNU-C-Bibliothek und der Binutils durch die MesCC-Tools (einem einfachen
Binder für hexadezimal dargestellte Maschinenprogramme und einem
Makro-Assembler) und Mes dar (siehe @ref{Top, Referenzhandbuch zu GNU Mes,,
mes, GNU Mes}, einem Scheme-Interpretierer und in Scheme geschriebenen
C-Compiler). Weder MesCC-Tools noch Mes können bereits von Grund auf
gebootstrapt werden, daher schleusen wir sie als binäre Seeds ein. Wir
nennen das unser Bootstrapping mit kleinerem Seed, weil es die Größe unserer
Bootstrapping-Binärdateien halbiert hat! Außerdem haben wir damit keinerlei
Binärdatei für einen C-Compiler; auf i686-linux und x86_64-linux werden
Guix-Pakete ganz ohne binären C-Compiler gebootstrapt.

Wir arbeiten daran, MesCC-Tools und Mes vollständig bootstrappen zu können,
und behalten auch andere Bootstrapping-Binärdateien im Blick. Ihre
Unterstützung ist willkommen!

@node Portierung
@chapter Auf eine neue Plattform portieren

Wie oben beschrieben ist die GNU-Distribution eigenständig und diese
Eigenständigkeit wird erreicht, indem sie aus vorerstellten
„Bootstrap-Binärdateien“ heraus erstellt werden kann (siehe
@ref{Bootstrapping}). Diese Binärdateien unterscheiden sich je nach
verwendetem Betriebssystem-Kernel, nach der Prozessorarchitektur und der
Anwendungsbinärschnittstelle („Application Binary Interface“, kurz ABI). Um
die Distribution also auf eine noch nicht unterstützte Plattform zu
portieren, muss man diese Bootstrap-Binärdateien für diese Plattform
erstellen und das Modul @code{(gnu packages bootstrap)} aktualisieren, damit
es sie benutzt.

Zum Glück kann Guix diese Bootstrap-Binärdateien
@emph{cross-kompilieren}. Wenn alles gut geht, und vorausgesetzt, die
GNU-Werkzeuge (zusammen werden sie als GNU-„Toolchain“ bezeichnet)
unterstützen diese Zielplattform auch, dann kann es völlig ausreichen, dass
Sie einen Befehl wie hier ausführen:

@example
guix build --target=armv5tel-linux-gnueabi bootstrap-tarballs
@end example

Damit das funktioniert, muss erst eine neue Plattform eingetragen werden;
sie sind im Modul @code{(guix platform)} registriert. Eine Plattform stellt
die Verbindung her zwischen einem GNU-Tripel (siehe @ref{Specifying Target
Triplets, GNU-Tripel für configure,, autoconf, Autoconf}), dem
entsprechenden @var{System} in Nix-Notation, dem Dateinamen für den
dynamischen Binder @var{glibc-dynamic-linker} von libc auf dieser Plattform
und dem zugehörigen Namen der Linux-Architektur, sofern es um Linux geht
(siehe @ref{Plattformen}).

Sobald Sie einen Bootstrap-Tarball haben, muss das Modul @code{(gnu packages
bootstrap)} aktualisiert werden, damit es diese Binärdateien für die
Zielplattform benutzt. Das heißt, die Hashes und URLs der Bootstrap-Tarballs
für die neue Plattform müssen neben denen für die bisher unterstützten
Plattformen aufgeführt werden. Der Bootstrap-Guile-Tarball wird besonders
behandelt: Von ihm wird erwartet, dass er lokal verfügbar ist, und
@file{gnu/local.mk} enthält Regeln, um ihn für die unterstützten
Architekturen herunterzuladen; eine Regel muss auch für die neue Plattform
hinzugefügt werden.

In der Praxis kann es einige Schwierigkeiten geben. Erstens kann es sein,
dass das erweiterte GNU-Tripel, das eine Anwendungsbinärschnittstelle (ABI)
festlegt (wie es das @code{eabi}-Suffix oben tut) nicht von allen
GNU-Werkzeugen erkannt wird. Typischerweise erkennt glibc manche davon,
während für GCC eine zusätzliche Befehlszeilenoption @option{--with-abi} an
configure übergeben werden muss (siehe @code{gcc.scm} für Beispiele, wie man
das macht). Zweitens könnte es sein, dass manche der notwendige Pakete für
diese Plattform nicht erfolgreich erstellt werden können. Zuletzt könnten
die generierten Binärdateien aus dem einen oder anderen Grund fehlerhaft
sein.

@c *********************************************************************
@include contributing.de.texi

@c *********************************************************************
@node Danksagungen
@chapter Danksagungen

Guix baut auf dem @uref{https://nixos.org/nix/,
Nix-Paketverwaltungsprogramm} auf, das von Eelco Dolstra entworfen und
entwickelt wurde, mit Beiträgen von anderen Leuten (siehe die Datei
@file{nix/AUTHORS} in Guix). Nix hat für die funktionale Paketverwaltung die
Pionierarbeit geleistet und noch nie dagewesene Funktionalitäten
vorangetrieben wie transaktionsbasierte Paketaktualisierungen und die
Rücksetzbarkeit selbiger, eigene Paketprofile für jeden Nutzer und
referenziell transparente Erstellungsprozesse. Ohne diese Arbeit gäbe es
Guix nicht.

Die Nix-basierten Software-Distributionen Nixpkgs und NixOS waren auch eine
Inspiration für Guix.

GNU@tie{}Guix ist selbst das Produkt kollektiver Arbeit mit Beiträgen durch
eine Vielzahl von Leuten. Siehe die Datei @file{AUTHORS} in Guix für mehr
Informationen, wer diese wunderbaren Menschen sind. In der Datei
@file{THANKS} finden Sie eine Liste der Leute, die uns geholfen haben, indem
Sie Fehler gemeldet, sich um unsere Infrastruktur gekümmert, künstlerische
Arbeit und schön gestaltete Themen beigesteuert, Vorschläge gemacht und noch
vieles mehr getan haben@tie{}– vielen Dank!


@c *********************************************************************
@node GNU-Lizenz für freie Dokumentation
@appendix GNU-Lizenz für freie Dokumentation
@cindex Lizenz, GNU-Lizenz für freie Dokumentation
@include fdl-1.3.texi

@c *********************************************************************
@node Konzeptverzeichnis
@unnumbered Konzeptverzeichnis
@printindex cp

@node Programmierverzeichnis
@unnumbered Programmierverzeichnis
@syncodeindex tp fn
@syncodeindex vr fn
@printindex fn

@bye

@c Local Variables:
@c ispell-local-dictionary: "american";
@c End:
