Nächste: , Nach oben: Systemkonfiguration   [Inhalt][Index]


12.1 Das Konfigurationssystem nutzen

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

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

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

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

  ;; Boot in "legacy" BIOS mode, assuming /dev/sdX is the
  ;; target hard disk, and "my-root" is the label of the target
  ;; root file system.
  (bootloader (bootloader-configuration
                (bootloader grub-bootloader)
                (targets '("/dev/sdX"))))
  ;; It's fitting to support the equally bare bones ‘-nographic’
  ;; QEMU option, which also nicely sidesteps forcing QWERTY.
  (kernel-arguments (list "console=ttyS0,115200"))
  (file-systems (cons (file-system
                        (device (file-system-label "my-root"))
                        (mount-point "/")
                        (type "ext4"))
                      %base-file-systems))

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

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

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

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

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

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

Bootloader

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

(bootloader-configuration
  (bootloader grub-efi-bootloader)
  (targets '("/boot/efi")))

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

global sichtbare Pakete

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

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

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

Sich auf Pakete anhand ihres Variablennamens zu beziehen, wie oben bei 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 use-package-modules entsprechend zu ergänzen. Um dies zu vermeiden, kann man auch die Prozedur specification->package aus dem Modul (gnu packages) aufrufen, welche das einem angegebenen Namen oder Name-Versions-Paar zu Grunde liegende Paket liefert:

(use-modules (gnu packages))

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

Systemdienste

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

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

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

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

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

Dadurch ändert sich die Konfiguration – d.h. die Dienst-Parameter – der guix-service-type-Instanz und die aller mingetty-service-type-Instanzen in der %base-services-Liste (siehe das Kochbuch in GNU Guix Cookbook 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 config im Rumpf gebunden wird, dann schreiben wir den Rumpf, damit er zur gewünschten Konfiguration ausgewertet wird. Beachten Sie insbesondere, wie wir mit inherit eine neue Konfiguration erzeugen, die dieselben Werte wie die alte Konfiguration hat, aber mit ein paar Modifikationen.

Die Konfiguration für typische Nutzung auf Heim- und Arbeitsrechnern, mit einer verschlüsselten Partition für das Wurzeldateisystem, 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 F1 drücken), Netzwerkverwaltung, Verwaltungswerkzeugen für den Energieverbrauch, und Weiteres, würde so aussehen:

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

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

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

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

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

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

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

  ;; Specify a swap file for the system, which resides on the
  ;; root file system.
  (swap-devices (list (swap-space
                       (target "/swapfile"))))

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

  ;; Add the `students' group
  (groups (cons* (user-group
                  (name "students"))
                 %base-groups))

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

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

                ;; FIXME: Since GDM depends on Rust (gdm -> gnome-shell -> gjs
                ;; -> mozjs -> rust) and Rust is currently unavailable on
                ;; non-x86_64 platforms, we use SDDM and Mate here instead of
                ;; GNOME and GDM.
                (append (list (service mate-desktop-service-type)
                              (service xfce-desktop-service-type)
                              (set-xorg-configuration
                               (xorg-configuration
                                (keyboard-layout keyboard-layout))
                               sddm-service-type))
                        %desktop-services)))

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Das System instanziieren

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

Anmerkung: Unsere Empfehlung ist, dass Sie die Datei my-system-config.scm sicher mit einem Versionsverwaltungssystem aufbewahren, so dass Sie die Änderungen daran leicht im Blick haben.

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

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

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

Die Programmierschnittstelle

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

Monadische Prozedur: operating-system-derivation os

Liefert eine Ableitung, mit der ein operating-system-Objekt os erstellt wird (siehe Ableitungen).

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

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


Nächste: operating-system-Referenz, Nach oben: Systemkonfiguration   [Inhalt][Index]