Suivant: L’API de création d’images du système Guix, Précédent: Connexion automatique à un TTY donné, Monter: Configuration du système [Table des matières][Index]
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)
;; Un fonction qui prend une architecture et une variante
;; Voir kernel-config si vous voulez un exemple.
(configuration-file #f)
(defconfig "defconfig")
(extra-options (default-extra-linux-options version)))
...)
Le paquet linux-libre
actuel pour la série 5.15.x, est déclaré comme
ceci :
(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))
Les clés qui n’ont pas de valeur associée prennent leur valeur par défaut
dans la définition de make-linux-libre
. Lorsque vous comparez les
deux bouts de code ci-dessus, remarquez le commentaire qui correspond à
#:configuration-file
. À cause de cela, il n’est pas facile d’inclure
une configuration personnalisée du noyau à partir de la définition, mais ne
vous inquiétez pas, il y a d’autres moyens de travailler avec ce qu’on a.
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 version) `(;; https://lists.gnu.org/archive/html/guix-devel/2014-04/msg00039.html ("CONFIG_DEVPTS_MULTIPLE_INSTANCES" . #true) ;; Modules requis pour 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) version))) (define-public linux-libre-macbook41 ;; XXX: Accède à la procédure interne « make-linux-libre* », qui est privée ;; et n'est pas exportée, et pourrait changer dans le futur. ((@@ (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. La
procédure default-extra-linux-options
est définie plus haut, et elles
devaient être utilisée pour éviter de perdre les options de configuration
par défaut 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 shell -D 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: L’API de création d’images du système Guix, Précédent: Connexion automatique à un TTY donné, Monter: Configuration du système [Table des matières][Index]