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


3.2 Personnalisation du noyau

Guix est, en son cœur, une distribution source avec des substituts (voir Substituts dans le manuel de référence de GNU Guix), et donc construire des paquets à partir de leur code source est normal pendant les installations et les mis à jour de paquets. Malgré tout, c’est aussi normal d’essayer de réduire le temps passé à compiler des paquets, et les changements récents et futurs concernant la construction et la distribution des substituts continue d’être un sujet de discussion dans le projet Guix.

Le noyau, bien qu’il ne demande pas énormément de RAM pour être construit, prend assez long à construire sur une machine usuelle. La configuration du noyau officielle, comme avec la plupart des autres distributions GNU/Linux, penche du côté de l’inclusivité, et c’est vraiment ça qui rend la construction aussi longue à partir des sources.

Le noyau Linux, cependant, peut aussi être décrit comme un simple paquet comme les autres, et peut donc être personnalisé comme n’importe quel autre paquet. La procédure est un peu différente, même si c’est surtout dû à la nature de la définition du paquet.

Le paquet du noyau linux-libre est en fait une procédure qui crée un paquet.

(define* (make-linux-libre* version gnu-revision source supported-systems
                            #:key
                            (extra-version #f)
                            ;; A function that takes an arch and a variant.
                            ;; See kernel-config for an example.
                            (configuration-file #f)
                            (defconfig "defconfig")
                            (extra-options %default-extra-linux-options))
  ...)

The current linux-libre package is for the 5.15.x series, and is declared like this:

(define-public linux-libre-5.15
  (make-linux-libre* linux-libre-5.15-version
                     linux-libre-5.15-gnu-revision
                     linux-libre-5.15-source
                     '("x86_64-linux" "i686-linux" "armhf-linux" "aarch64-linux" "riscv64-linux")
                     #:configuration-file kernel-config))

Any keys which are not assigned values inherit their default value from the make-linux-libre definition. When comparing the two snippets above, notice the code comment that refers to #:configuration-file. Because of this, it is not actually easy to include a custom kernel configuration from the definition, but don’t worry, there are other ways to work with what we do have.

Il y a deux manières de créer un noyau avec une configuration personnalisée. La première consiste à fournir un fichier .config standard au processus de construction en ajoutant un fichier .config comme entrée native de notre noyau. Voici un bout de code correspondant à la phase 'configure de la définition de paquet make-linux-libre :

(let ((build  (assoc-ref %standard-phases 'build))
      (config (assoc-ref (or native-inputs inputs) "kconfig")))

  ;; Use a custom kernel configuration file or a default
  ;; configuration file.
  (if config
      (begin
        (copy-file config ".config")
        (chmod ".config" #o666))
      (invoke "make" ,defconfig)))

Et voici un exemple de paquet de noyau. Le paquet linux-libre n’a rien de spécial, on peut en hériter et remplacer ses champs comme n’importe quel autre paquet :

(define-public linux-libre/E2140
  (package
    (inherit linux-libre)
    (native-inputs
     `(("kconfig" ,(local-file "E2140.config"))
      ,@(alist-delete "kconfig"
                      (package-native-inputs linux-libre))))))

Dans le même répertoire que le fichier définissant linux-libre-E2140 se trouve un fichier nommé E2140.config, qui est un fichier de configuration du noyau. Le mot-clé defconfig de make-linux-libre reste vide ici, donc la configuration du noyau dans le paquet est celle qui sera incluse dans le champ native-inputs.

La deuxième manière de créer un noyau personnalisé est de passer une nouvelle valeur au mot-clé extra-options de la procédure make-linux-libre. Le mot-clé extra-options fonctionne avec une autre fonction définie juste en dessous :

(define %default-extra-linux-options
  `(;; https://lists.gnu.org/archive/html/guix-devel/2014-04/msg00039.html
   ("CONFIG_DEVPTS_MULTIPLE_INSTANCES" . #true)
   ;; Modules required for initrd:
   ("CONFIG_NET_9P" . m)
   ("CONFIG_NET_9P_VIRTIO" . m)
   ("CONFIG_VIRTIO_BLK" . m)
   ("CONFIG_VIRTIO_NET" . m)
   ("CONFIG_VIRTIO_PCI" . m)
   ("CONFIG_VIRTIO_BALLOON" . m)
   ("CONFIG_VIRTIO_MMIO" . m)
   ("CONFIG_FUSE_FS" . m)
   ("CONFIG_CIFS" . m)
   ("CONFIG_9P_FS" . m)))

(define (config->string options)
  (string-join (map (match-lambda
                      ((option . 'm)
                       (string-append option "=m"))
                      ((option . #true)
                       (string-append option "=y"))
                      ((option . #false)
                       (string-append option "=n")))
                    options)
               "\n"))

Et dans le script configure personnalisé du paquet « make-linux-libre » :

;; Appending works even when the option wasn't in the
;; file.  The last one prevails if duplicated.
(let ((port (open-file ".config" "a"))
      (extra-configuration ,(config->string extra-options)))
  (display extra-configuration port)
  (close-port port))

(invoke "make" "oldconfig")

Donc, en ne fournissant pas de fichier de configuration le fichier .config est au départ vide et on écrit ensuite l’ensemble des drapeaux que l’on veut. Voici un autre noyau personnalisé :

(define %macbook41-full-config
  (append %macbook41-config-options
          %file-systems
          %efi-support
          %emulation
          (@@ (gnu packages linux) %default-extra-linux-options)))

(define-public linux-libre-macbook41
  ;; XXX: Access the internal 'make-linux-libre*' procedure, which is
  ;; private and unexported, and is liable to change in the future.
  ((@@ (gnu packages linux) make-linux-libre*)
   (@@ (gnu packages linux) linux-libre-version)
   (@@ (gnu packages linux) linux-libre-gnu-revision)
   (@@ (gnu packages linux) linux-libre-source)
   '("x86_64-linux")
   #:extra-version "macbook41"
   #:extra-options %macbook41-config-options))

Dans l’exemple ci-dessus %fale-systems est un ensemble de drapeaux qui activent la prise en charge de différents systèmes de fichiers, %efi-support active la prise en charge de l’EFI et %emulation permet à une machine x86_64-linux de fonctionner aussi en mode 32-bits. %default-extra-linux-options sont l’ensemble de ces options et elles devaient être ajoutées puisqu’elles ont été remplacées dans le mot-clé extra-options.

Tout ça est bien beau, mais comment savoir quels modules sont requis pour un système en particulier ? Il y a deux ressources qui peuvent être utiles pour répondre à cette question : le manuel de Gentoo et la documentation du noyau. D’après la documentation du noyau, il semble que la commande make localmodconfig soit la bonne.

Pour lancer make localmodconfig on doit d’abord récupérer et décompresser le code source du noyau :

tar xf $(guix build linux-libre --source)

Une fois dans le répertoire contenant le code source lancez touch .config pour créer un fichier .config initialement vide pour commencer. make localmodconfig fonctionne en remarquant que avec déjà un .config et en vous disant ce qu’il vous manque. Si le fichier est vide, il vous manquera tout ce qui est nécessaire. L’étape suivante consiste à lancer :

guix environment linux-libre -- make localmodconfig

et regardez la sortie. Remarquez que le fichier .config est toujours vide. La sortie contient en général deux types d’avertissements. Le premier commence par « WARNING » et peut être ignoré dans notre cas. Le deuxième dit :

module pcspkr did not have configs CONFIG_INPUT_PCSPKR

Pour chacune de ces lignes, copiez la partie CONFIG_XXXX_XXXX dans le .config du répertoire et ajoutez =m pour qu’à la fin il ressemble à cela :

CONFIG_INPUT_PCSPKR=m
CONFIG_VIRTIO=m

Après avoir copié toutes les options de configuration, lancez make localmodconfig de nouveau pour vous assurer que vous n’avez pas de sortie commençant par « module ». Après tous ces modules spécifiques à la machine, il y en a encore quelques uns que nous devons aussi définir. CONFIG_MODULES est nécessaire pour que nous puissions construire et charger les modules séparément et ne pas tout construire dans le noyau. CONFIG_BLK_DEV_SD est requis pour lire les disques durs. Il est possible que vous aillez besoin de quelques autres modules.

Cet article n’a pas pour but de vous guider dans la configuration de votre propre noyau cependant, donc si vous décidez de construire un noyau personnalisé vous devrez chercher d’autres guides pour créer un noyau qui vous convient.

La deuxième manière de configurer le noyau utilise un peu plus les fonctionnalités de Guix et vous permettent de partager des bouts de configuration entre différents noyaux. Par exemple, toutes les machines avec un démarrage EFI ont besoin d’un certain nombre de configurations. Tous les noyaux vont probablement partager une liste de systèmes de fichiers à prendre en charge. En utilisant des variables il est facile de voir du premier coup quelles fonctionnalités sont activées pour vous assurer que vous n’avez pas des fonctionnalités dans un noyau qui manquent dans un autre.

Cependant, nous ne parlons pas de la personnalisation du disque de ram initial. Vous devrez sans doute modifier le disque de ram initial sur les machines qui utilisent un noyau personnalisé, puisque certains modules attendus peuvent ne pas être disponibles.


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