Suivant: , Précédent: , Monter: Configuration du système   [Table des matières][Index]


3.3 L’API de création d’images du système Guix

Historiquement, le système Guix est centré sur une structure operating-system. Cette structure contient divers champs qui vont du chargeur d’amorçage et à la déclaration du noyau aux services à installer.

Les contraintes sur l’image peuvent grandement varier en fonction de la machine cible : une machine x86_64 standard n’a pas les mêmes contraintes qu’un petit ordinateur monocarte ARM comme le Pine64. Les fabricants de matériel imposent donc des formats d’image distincts avec des tailles et des emplacements de partition variables.

Pour créer des images convenables pour toutes ces machines, une nouvelle abstraction est nécessaire : c’est le but de l’enregistrement image. Cet enregistrement contient toutes les informations requises pour être transformé en une image complète, qui peut être directement démarrée sur une machine cible.

(define-record-type* <image>
  image make-image
  image?
  (name               image-name ;symbol
                      (default #f))
  (format             image-format) ;symbol
  (target             image-target
                      (default #f))
  (size               image-size  ;size in bytes as integer
                      (default 'guess))
  (operating-system   image-operating-system  ;<operating-system>
                      (default #f))
  (partitions         image-partitions ;list of <partition>
                      (default '()))
  (compression?       image-compression? ;boolean
                      (default #t))
  (volatile-root?     image-volatile-root? ;boolean
                      (default #t))
  (substitutable?     image-substitutable? ;boolean
                      (default #t)))

Cet enregistrement contient le système d’exploitation à instancier. Le champ format défini le type d’image et peut être efi-raw, qcow2 ou iso9660 par exemple. Plus tard, on prévoit de l’étendre à docker et aux autres types d’images.

Un nouveau répertoire dans les sources de Guix est dédié aux définitions des images. Pour l’instant il y a quatre fichiers :

Regardons le fichier pine64.scm. Il contient la variable pine64-barebones-os qui est une définition minimale d’un système d’exploitation dédié à la carte Pine A64 LTS.

(define pine64-barebones-os
  (operating-system
   (host-name "vignemale")
   (timezone "Europe/Paris")
   (locale "en_US.utf8")
   (bootloader (bootloader-configuration
                (bootloader u-boot-pine64-lts-bootloader)
                (targets '("/dev/vda"))))
   (initrd-modules '())
   (kernel linux-libre-arm64-generic)
   (file-systems (cons (file-system
                        (device (file-system-label "my-root"))
                        (mount-point "/")
                        (type "ext4"))
                       %base-file-systems))
   (services (cons (service agetty-service-type
                            (agetty-configuration
                             (extra-options '("-L")) ; no carrier detect
                             (baud-rate "115200")
                             (term "vt100")
                             (tty "ttyS0")))
                   %base-services))))

Les champs kernel et bootloader pointent vers les paquets dédiés à cette carte.

Ci-dessous, la variable pine64-image-type est ainsi définie.

(define pine64-image-type
  (image-type
   (name 'pine64-raw)
   (constructor (cut image-with-os arm64-disk-image <>))))

Elle utilise un enregistrement dont nous n’avons pas encore parlé, l’enregistrement image-type, défini de cette façon :

(define-record-type* <image-type>
  image-type make-image-type
  image-type?
  (name           image-type-name) ;symbol
  (constructor    image-type-constructor)) ;<operating-system> -> <image>

Le but principal de cet enregistrement est d’associer un nom à une procédure transformant un operating-system en une image. Pour comprendre pourquoi c’est nécessaire, voyons la commande produisant une image à partir d’un fichier de configuration de type operating-system :

guix system image my-os.scm

Cette commande demande une configuration de type operating-system mais comment indiquer que l’on veut cibler une carte Pine64 ? Nous devons fournir l’information supplémentaire, image-type, en passant le drapeau --image-type ou -t, de cette manière :

guix system image --image-type=pine64-raw my-os.scm

Ce paramètre image-type pointe vers le pine64-image-type défini plus haut. Ainsi, la déclaration operating-system dans my-os.scm se verra appliquée la procédure [cut image-with-os arm64-disk-image <>) pour la transformer en une image.

L’image qui en résulte ressemble à ceci :

(image
 (format 'disk-image)
 (target "aarch64-linux-gnu")
 (operating-system my-os)
 (partitions
  (list (partition
         (inherit root-partition)
         (offset root-offset)))))

qui ajoute l’objet operating-system défini dans my-os.scm à l’enregistrement arm64-disk-image.

Mais assez de cette folie. Qu’est-ce que cette API pour les images apporte aux utilisateurs et utilisatrices ?

On peut lancer :

mathieu@cervin:~$ guix system --list-image-types
Les types d'image disponibles sont :

   - unmatched-raw
   - rock64-raw
   - pinebook-pro-raw
   - pine64-raw
   - novena-raw
   - hurd-raw
   - hurd-qcow2
   - qcow2
   - iso9660
   - uncompressed-iso9660
   - tarball
   - efi-raw
   - mbr-raw
   - docker
   - wsl2
   - raw-with-offset
   - efi32-raw

et en écrivant un fichier de type operating-system basé sur pine64-barebones-os, vous pouvez personnaliser votre image selon vos préférences dasn un fichier (my-pine-os.scm) de cette manière :

(use-modules (gnu services linux)
             (gnu system images pine64))

(let ((base-os pine64-barebones-os))
  (operating-system
    (inherit base-os)
    (timezone "America/Indiana/Indianapolis")
    (services
     (cons
      (service earlyoom-service-type
               (earlyoom-configuration
                (prefer-regexp "icecat|chromium")))
      (operating-system-user-services base-os)))))

lancez :

guix system image --image-type=pine64-raw my-pine-os.scm

ou bien,

guix system image --image-type=hurd-raw my-hurd-os.scm

pour récupérer une image que vous pouvez écrire sur un disque dur pour démarrer dessus.

Sans rien changer à my-hurd-os.scm, en appelant :

guix system image --image-type=hurd-qcow2 my-hurd-os.scm

vous aurez une image QEMU pour le Hurd à la place.


Suivant: Utiliser des clés de sécurité, Précédent: Personnalisation du noyau, Monter: Configuration du système   [Table des matières][Index]