Suivant: référence de système d'exploitation, Monter: Configuration système [Table des matières][Index]
Le système d’exploitation est configuré en fournissant une déclaration
operating-system
dans un fichier qui peut être passé à la command
guix system
(voir Invoquer guix system). Une configuration
simple, avec les services systèmes par défaut, le noyau Linux-Libre par
défaut, un disque de RAM initial et un chargeur d’amorçage ressemble à ceci
:
;; This is an operating system configuration template ;; for a "bare bones" setup, with no X11 display server. (use-modules (gnu)) (use-service-modules networking ssh) (use-package-modules screen ssh) (operating-system (host-name "komputilo") (timezone "Europe/Berlin") (locale "en_US.utf8") ;; Boot in "legacy" BIOS mode, assuming /dev/sdX is the ;; target hard disk, and "my-root" is the label of the target ;; root file system. (bootloader (bootloader-configuration (bootloader grub-bootloader) (target "/dev/sdX"))) (file-systems (cons (file-system (device (file-system-label "my-root")) (mount-point "/") (type "ext4")) %base-file-systems)) ;; This is where user accounts are specified. The "root" ;; account is implicit, and is initially created with the ;; empty password. (users (cons (user-account (name "alice") (comment "Bob's sister") (group "users") ;; Adding the account to the "wheel" group ;; makes it a sudoer. Adding it to "audio" ;; and "video" allows the user to play sound ;; and access the webcam. (supplementary-groups '("wheel" "audio" "video"))) %base-user-accounts)) ;; Globally-installed packages. (packages (cons screen %base-packages)) ;; Add services to the baseline: a DHCP client and ;; an SSH server. (services (append (list (service dhcp-client-service-type) (service openssh-service-type (openssh-configuration (openssh openssh-sans-x) (port-number 2222)))) %base-services)))
Cet exemple devrait se comprendre de lui-même. Certains champs définis
ci-dessus, comme host-name
et bootloader
sont obligatoires.
D’autres comme packages
et services
peuvent être omis auquel
cas ils ont une valeur par défaut.
Ci-dessous nous discutons des effets de certains des champs les plus
importants (voir référence de système d'exploitation, pour des détails sur tous
les champs disponibles) et comment instancier le système
d’exploitation avec guix system
.
Le champ bootloader
décrit la méthode qui sera utilisée pour démarrer
votre système. Les machines basées sur les processeurs Intel peuvent
démarrer dans l’ancien mode BIOS, comme dans l’exemple au-dessus.
Cependant, les machines plus récentes s’appuient sur l’UEFI (Unified
Extensible Firmware Interface) pour démarrer. Dans ce cas, le champ
bootloader
devrait contenir quelque chose comme cela :
(bootloader-configuration
(bootloader grub-efi-bootloader)
(target "/boot/efi"))
Voir Configuration du chargeur d'amorçage, pour plus d’informations sur les options de configuration disponibles.
Le champ packages
liste les paquets qui seront visibles sur tout le
système, pour tous les comptes utilisateur·rice·s — c.-à-d. dans la
variable d’environnement PATH
de tous les utilisateur·rice·s — en plus
des profils utilisateur·rice·s (voir Invoquer guix package). La variable
%base-packages fournit tous les outils qu’on pourrait attendre pour
les taches de base de l’administrateur·rice et de l’utilisateur·rice — dont
les GNU Core Utilities, les GNU Networking Utilities, l’éditeur de texte
léger GNU Zile, find
, grep
, etc. L’exemple ci-dessus
ajoute GNU Screen à ces paquets, récupéré depuis le module (gnu
packages screen)
(voir Modules de paquets). Vous pouvez utiliser la
syntaxe (list package output)
pour ajouter une sortie spécifique d’un
paquet :
(use-modules (gnu packages)) (use-modules (gnu packages dns)) (operating-system ;; ... (packages (cons (list bind "utils") %base-packages)))
Se référer aux paquets par le nom de leur variable, comme bind
ci-dessus, a l’avantage d’être sans ambiguïté ; cela permet aussi de se
rendre rapidement compte de coquilles quand on a des « variables non liées
». L’inconvénient est qu’on a besoin de savoir dans quel module est défini
le paquet, et de modifier la ligne use-package-modules
en
conséquence. Pour éviter cela, on peut utiliser la procédure
specification->package
du module (gnu packages)
, qui renvoie
le meilleur paquet pour un nom donné ou un nom et une version :
(use-modules (gnu packages)) (operating-system ;; ... (packages (append (map specification->package '("tcpdump" "htop" "gnupg@2.0")) %base-packages)))
Le champ services
liste les services système à rendre
disponible lorsque le système démarre (voir Services). La déclaration
operating-system
au-dessus spécifie que, en plus des services de
base, on veut que le démon ssh OpenSSH écoute sur le port 2222
(voir openssh-service-type
). Sous le capot,
openssh-service-type
s’arrange pour que sshd
soit lancé avec
les bonnes options de la ligne de commande, éventuellement en générant des
fichiers de configuration (voir Définir des services).
Parfois, plutôt que d’utiliser les services de base tels-quels, on peut
vouloir les personnaliser. Pour cela, utilisez modify-services
(voir modify-services
) pour modifier la liste.
Par exemple, supposons que vous souhaitiez modifier guix-daemon
et
Mingetty (l’écran de connexion en console) dans la liste
%base-services
(voir %base-services
). Pour
cela, vous pouvez écrire ce qui suit dans votre déclaration de système
d’exploitation :
(define %my-services ;; ma propre liste de services. (modify-services %base-services (guix-service-type config => (guix-configuration (inherit config) ;; Récupérer les substituts depuis example.org. (substitute-urls (list "https://example.org/guix" "https://ci.guix.gnu.org")))) (mingetty-service-type config => (mingetty-configuration (inherit config) ;; Connexion automatique en tant que « guest ». (auto-login "guest"))))) (operating-system ;; … (services %my-services))
Cela modifie la configuration — c.-à-d. les paramètres du service — de
l’instance de guix-service-type
, et de toutes les instances de
mingetty-service-type
dans la liste %base-services
. Remarquez
comment on fait cela : d’abord, on s’arrange pour que la configuration de
départ soit liée à l’identifiant config
dans body puis on écrit
body pour qu’il s’évalue en la configuration désirée. En particulier,
remarquez comment on utilise inherit
pour créer une nouvelle
configuration qui a les même valeurs que l’ancienne configuration, avec
seulement quelques modifications.
La configuration pour une utilisation de « bureau » typique, avec une partition racine chiffrée, le serveur d’affichage X11, GNOME et Xfce (les utilisateurs peuvent choisir l’environnement de bureau sur l’écran de connexion en appuyant sur F1), la gestion du réseau, la gestion de l’énergie, et bien plus, ressemblerait à ceci :
;; This is an operating system configuration template ;; for a "desktop" setup with GNOME and Xfce where the ;; root partition is encrypted with LUKS. (use-modules (gnu) (gnu system nss)) (use-service-modules desktop xorg) (use-package-modules certs gnome) (operating-system (host-name "antelope") (timezone "Europe/Paris") (locale "en_US.utf8") ;; Choose US English keyboard layout. The "altgr-intl" ;; variant provides dead keys for accented characters. (keyboard-layout (keyboard-layout "us" "altgr-intl")) ;; Use the UEFI variant of GRUB with the EFI System ;; Partition mounted on /boot/efi. (bootloader (bootloader-configuration (bootloader grub-efi-bootloader) (target "/boot/efi") (keyboard-layout keyboard-layout))) ;; Specify a mapped device for the encrypted root partition. ;; The UUID is that returned by 'cryptsetup luksUUID'. (mapped-devices (list (mapped-device (source (uuid "12345678-1234-1234-1234-123456789abc")) (target "my-root") (type luks-device-mapping)))) (file-systems (append (list (file-system (device (file-system-label "my-root")) (mount-point "/") (type "ext4") (dependencies mapped-devices)) (file-system (device (uuid "1234-ABCD" 'fat)) (mount-point "/boot/efi") (type "vfat"))) %base-file-systems)) ;; Create user `bob' with `alice' as its initial password. (users (cons (user-account (name "bob") (comment "Alice's brother") (password (crypt "alice" "$6$abc")) (group "users") (supplementary-groups '("wheel" "netdev" "audio" "video"))) %base-user-accounts)) ;; This is where we specify system-wide packages. (packages (append (list ;; for HTTPS access nss-certs ;; for user mounts gvfs) %base-packages)) ;; Add GNOME and Xfce---we can choose at the log-in screen ;; by clicking the gear. Use the "desktop" services, which ;; include the X11 log-in service, networking with ;; NetworkManager, and more. (services (append (list (service gnome-desktop-service-type) (service xfce-desktop-service-type) (set-xorg-configuration (xorg-configuration (keyboard-layout keyboard-layout)))) %desktop-services)) ;; Allow resolution of '.local' host names with mDNS. (name-service-switch %mdns-host-lookup-nss))
Un système graphique avec un choix de gestionnaires de fenêtres légers plutôt que des environnement de bureaux complets ressemblerait à cela :
;; This is an operating system configuration template ;; for a "desktop" setup without full-blown desktop ;; environments. (use-modules (gnu) (gnu system nss)) (use-service-modules desktop) (use-package-modules bootloaders certs emacs emacs-xyz ratpoison suckless wm xorg) (operating-system (host-name "antelope") (timezone "Europe/Paris") (locale "en_US.utf8") ;; Use the UEFI variant of GRUB with the EFI System ;; Partition mounted on /boot/efi. (bootloader (bootloader-configuration (bootloader grub-efi-bootloader) (target "/boot/efi"))) ;; Assume the target root file system is labelled "my-root", ;; and the EFI System Partition has UUID 1234-ABCD. (file-systems (append (list (file-system (device (file-system-label "my-root")) (mount-point "/") (type "ext4")) (file-system (device (uuid "1234-ABCD" 'fat)) (mount-point "/boot/efi") (type "vfat"))) %base-file-systems)) (users (cons (user-account (name "alice") (comment "Bob's sister") (group "users") (supplementary-groups '("wheel" "netdev" "audio" "video"))) %base-user-accounts)) ;; Add a bunch of window managers; we can choose one at ;; the log-in screen with F1. (packages (append (list ;; window managers ratpoison i3-wm i3status dmenu emacs emacs-exwm emacs-desktop-environment ;; terminal emulator xterm ;; for HTTPS access nss-certs) %base-packages)) ;; Use the "desktop" services, which include the X11 ;; log-in service, networking with NetworkManager, and more. (services %desktop-services) ;; Allow resolution of '.local' host names with mDNS. (name-service-switch %mdns-host-lookup-nss))
Cet exemple se réfère au système de fichier /boot/efi par son UUID,
1234-ABCD
. Remplacez cet UUID par le bon UUID de votre système,
renvoyé par la commande blkid
.
Voir Services de bureaux, pour la liste exacte des services fournis par
%desktop-services
. Voir Certificats X.509, pour des informations
sur le paquet nss-certs
utilisé ici.
Encore une fois, %desktop-services
n’est qu’une liste d’objets
service. Si vous voulez enlever des services de là, vous pouvez le faire
avec des procédures pour les listes (voir SRFI-1 Filtering and Partitioning dans GNU Guile Reference Manual). Par exemple,
l’expression suivante renvoie une liste qui contient tous les services dans
%desktop-services
sauf le service Avahi :
(remove (lambda (service)
(eq? (service-kind service) avahi-service-type))
%desktop-services)
En supposant que la déclaration operating-system
est stockée dans le
fichier my-system-config.scm, la commande guix system
reconfigure my-system-config.scm
instancie cette configuration et en fait
l’entrée par défaut dans GRUB (voir Invoquer guix system).
Pour changer la configuration du système, on met normalement à jour ce
fichier et on relance guix system reconfigure
. On ne devrait
jamais avoir à modifier de fichiers dans /etc ou à lancer des
commandes qui modifient l’état du système comme useradd
ou
grub-install
. En fait, vous devez les éviter parce que non
seulement ça annulerait vos garanties, mais ça empêcherait aussi de revenir
à des versions précédents du système, si vous en avez besoin.
En parlant de revenir en arrière, à chaque fois que vous lancez
guix system reconfigure
, une nouvelle génération du système
est crée — sans modifier ou supprimer les générations précédentes. Les
anciennes générations du système ont une entrée dans le menu du chargeur
d’amorçage, ce qui vous permet de démarrer dessus au cas où quelque chose se
serait mal passé avec la dernière génération. C’est rassurant, non ? La
commande guix system list-generations
liste les générations du
système disponibles sur le disque. Il est possible de revenir à une
ancienne génération via les commandes guix system roll-back
et
guix system switch-generation
.
Bien que la commande guix system reconfigure
ne modifiera pas les
générations précédentes, vous devez faire attention lorsque votre génération
actuelle n’est pas la dernière (p. ex. après avoir invoqué guix
system roll-back
), puisque l’opération pourrait remplacer une génération
suivante (voir Invoquer guix system).
Au niveau Scheme, la grosse déclaration operating-system
est
instanciée avec la procédure monadique suivante (voir La monade du dépôt) :
Renvoie une dérivation qui construit os, un objet
operating-system
(voir Dérivations).
La sortie de la dérivation est un répertoire qui se réfère à tous les paquets et d’autres fichiers supports requis pour instancier os.
Cette procédure est fournie par le module (gnu system)
. Avec
(gnu services)
(voir Services), ce module contient les entrailles
du système Guix. Ouvrez-le un jour !
Suivant: référence de système d'exploitation, Monter: Configuration système [Table des matières][Index]