GNU/Linux >> Tutoriels Linux >  >> Linux

Comment compiler un noyau Linux au 21e siècle

En informatique, un noyau est le logiciel de bas niveau qui gère la communication avec le matériel et la coordination générale du système. Mis à part certains micrologiciels initiaux intégrés à la carte mère de votre ordinateur, lorsque vous démarrez votre ordinateur, le noyau est ce qui permet de savoir qu'il possède un disque dur, un écran, un clavier et une carte réseau. C'est également le travail du noyau de s'assurer qu'un temps égal (plus ou moins) est accordé à chaque composant afin que vos graphiques, votre audio, votre système de fichiers et votre réseau fonctionnent tous correctement, même s'ils s'exécutent simultanément.

La quête de support matériel, cependant, est en cours, car plus le matériel est publié, plus un noyau doit adopter dans son code pour que le matériel fonctionne comme prévu. Il est difficile d'obtenir des chiffres précis, mais le noyau Linux est certainement parmi les meilleurs noyaux pour la compatibilité matérielle. Linux exploite d'innombrables ordinateurs et téléphones portables, des cartes système embarquées sur puce (SoC) pour les amateurs et les utilisations industrielles, des cartes RAID, des machines à coudre et bien plus encore.

Contenu associé

Au 20e siècle (et même dans les premières années du 21e), il n'était pas déraisonnable pour un utilisateur de Linux de s'attendre à ce qu'en achetant un tout nouveau matériel, il doive télécharger le tout dernier code source du noyau, compilez-le et installez-le afin qu'ils puissent obtenir de l'aide pour l'appareil. Dernièrement, cependant, vous auriez du mal à trouver un utilisateur Linux qui compile son propre noyau, sauf pour le plaisir ou le profit au moyen d'un matériel personnalisé hautement spécialisé. De nos jours, il n'est généralement pas nécessaire de compiler soi-même le noyau Linux.

Voici les raisons pour lesquelles, ainsi qu'un tutoriel rapide sur la façon de compiler un noyau lorsque vous en avez besoin.

Mettre à jour votre noyau existant

Que vous ayez un tout nouvel ordinateur portable doté d'une nouvelle carte graphique ou d'un chipset WiFi sophistiqué ou que vous veniez de ramener une nouvelle imprimante à la maison, votre système d'exploitation (appelé GNU+Linux ou simplement Linux, qui est aussi le nom du noyau ) a besoin d'un pilote pour ouvrir des canaux de communication à ce nouveau composant (carte graphique, puce WiFi, imprimante ou autre). Cela peut parfois être trompeur lorsque vous branchez un nouvel appareil et que votre ordinateur apparaît pour le reconnaître. Mais ne vous y trompez pas. Parfois, c'est c'est tout ce dont vous avez besoin, mais d'autres fois, votre système d'exploitation utilise simplement des protocoles génériques pour sonder un périphérique connecté.

Par exemple, votre ordinateur peut être en mesure d'identifier votre nouvelle imprimante réseau, mais parfois c'est uniquement parce que la carte réseau de l'imprimante est programmée pour s'identifier sur un réseau afin qu'elle puisse obtenir une adresse DHCP. Cela ne signifie pas nécessairement que votre ordinateur sait quelles instructions envoyer à l'imprimante pour produire une page de texte imprimé. En fait, vous pourriez dire que l'ordinateur ne "sait" même pas vraiment que le périphérique est une imprimante ; il peut seulement afficher qu'il y a un appareil sur le réseau à une adresse spécifique et l'appareil s'identifie avec la série de caractères p-r-i-n-t-e-r . Les conventions du langage humain n'ont aucun sens pour un ordinateur; ce dont il a besoin, c'est d'un pilote.

Les développeurs de noyau, les fabricants de matériel, les techniciens de support et les amateurs savent tous que du nouveau matériel est constamment publié. Beaucoup d'entre eux contribuent aux pilotes, soumis directement à l'équipe de développement du noyau pour inclusion dans Linux. Par exemple, les pilotes de carte graphique Nvidia sont souvent écrits dans le module du noyau Nouveau et, comme les cartes Nvidia sont courantes, le code est généralement inclus dans tout noyau distribué pour une utilisation générale (comme le noyau que vous obtenez lorsque vous téléchargez Fedora ou Ubuntu. Où Nvidia est moins courant, par exemple dans les systèmes embarqués, le module Nouveau est généralement exclu. Des modules similaires existent pour de nombreux autres appareils :les imprimantes bénéficient de Foomatic et CUPS, les cartes sans fil ont des modules b43, ath9k, wl, etc.

Les distributions ont tendance à inclure autant qu'elles le peuvent raisonnablement dans leurs versions de noyau Linux, car elles veulent que vous puissiez connecter un périphérique et commencer à l'utiliser immédiatement, sans installation de pilote requise. Pour l'essentiel, c'est ce qui se passe, surtout maintenant que de nombreux fournisseurs de périphériques financent désormais le développement de pilotes Linux pour le matériel qu'ils vendent et soumettent ces pilotes directement à l'équipe du noyau pour une distribution générale.

Parfois, cependant, vous exécutez un noyau que vous avez installé il y a six mois avec un nouveau périphérique passionnant qui vient d'arriver dans les magasins il y a une semaine. Dans ce cas, votre noyau n'a peut-être pas de pilote pour ce périphérique. La bonne nouvelle est que très souvent, un pilote pour ce périphérique peut exister dans une édition très récente du noyau, ce qui signifie que tout ce que vous avez à faire est de mettre à jour ce que vous utilisez.

Généralement, cela se fait via un gestionnaire de packages. Par exemple, sur RHEL, CentOS et Fedora :

$ sudo dnf update kernel

Sur Debian et Ubuntu, obtenez d'abord votre version actuelle du noyau :

$ uname -r
4.4.186

Rechercher des versions plus récentes :

$ sudo apt update
$ sudo apt search linux-image

Installez la dernière version que vous trouvez. Dans cet exemple, la dernière disponible est la 5.2.4 :

$ sudo apt install linux-image-5.2.4

Après une mise à niveau du noyau, vous devez redémarrer (sauf si vous utilisez kpatch ou kgraft). Ensuite, si le pilote de périphérique dont vous avez besoin se trouve dans le dernier noyau, votre matériel fonctionnera comme prévu.

Installer un module noyau

Parfois, une distribution ne s'attend pas à ce que ses utilisateurs utilisent souvent un périphérique (ou du moins pas assez pour que le pilote de périphérique doive être dans le noyau Linux). Linux adopte une approche modulaire des pilotes, de sorte que les distributions peuvent fournir des packages de pilotes séparés qui peuvent être chargés par le noyau même si le pilote n'est pas compilé dans le noyau lui-même. Ceci est utile, bien que cela puisse devenir compliqué lorsqu'un pilote n'est pas inclus dans un noyau mais est nécessaire au démarrage, ou lorsque le noyau est mis à jour à partir du pilote modulaire. Le premier problème est résolu avec un initrd (disque RAM initial) et est hors de portée de cet article, et le second est résolu par un système appelé kmod .

Le système kmod garantit que lorsqu'un noyau est mis à jour, tous les pilotes modulaires installés à ses côtés sont également mis à jour. Si vous installez un pilote manuellement, vous manquez l'automatisation fournie par kmod, vous devez donc opter pour un package kmod chaque fois qu'il est disponible. Par exemple, alors que les pilotes Nvidia sont intégrés au noyau en tant que pilote Nouveau, les pilotes Nvidia officiels sont distribués uniquement par Nvidia. Vous pouvez installer manuellement les pilotes de marque Nvidia en accédant au site Web, en téléchargeant le fichier .run et en exécutant le script shell qu'il fournit, mais vous devez répéter ce même processus après avoir installé un nouveau noyau, car rien n'indique à votre gestionnaire de packages que vous avez installé manuellement un pilote de noyau. Étant donné que Nvidia pilote vos graphiques, la mise à jour manuelle du pilote Nvidia signifie généralement que vous devez effectuer la mise à jour à partir d'un terminal, car vous n'avez pas de graphiques sans pilote graphique fonctionnel.

Cependant, si vous installez les pilotes Nvidia en tant que package kmod, la mise à jour de votre noyau met également à jour votre pilote Nvidia. Sur Fedora et associés :

$ sudo dnf install kmod-nvidia

Sur Debian et connexe :

$ sudo apt update
$ sudo apt install nvidia-kernel-common nvidia-kernel-dkms nvidia-glx nvidia-xconfig nvidia-settings nvidia-vdpau-driver vdpau-va-driver

Ce n'est qu'un exemple, mais si vous installez des pilotes Nvidia dans la vraie vie, vous devez également mettre le pilote Nouveau sur liste noire. Consultez la documentation de votre distribution pour connaître les meilleures étapes.

Télécharger et installer un pilote

Tout n'est pas inclus dans le noyau, et pas tout autre est disponible en tant que module noyau. Dans certains cas, vous devez télécharger un pilote spécial écrit et fourni par le fournisseur du matériel, et d'autres fois, vous avez le pilote mais pas l'interface pour configurer les options du pilote.

Deux exemples courants sont les imprimantes HP et les tablettes d'illustration Wacom. Si vous achetez une imprimante HP, vous disposez probablement de pilotes génériques capables de communiquer avec votre imprimante. Vous pourriez même être en mesure d'imprimer. Mais le pilote générique peut ne pas être en mesure de fournir des options spécialisées spécifiques à votre modèle, telles que l'impression recto verso, l'assemblage, les choix de bacs à papier, etc. HPLIP (le système d'imagerie et d'impression HP Linux) fournit des options pour gérer les tâches, ajuster les options d'impression, sélectionner les bacs à papier le cas échéant, etc.

HPLIP est généralement intégré dans les gestionnaires de packages ; recherchez simplement "hplip".

De même, les pilotes des tablettes Wacom, la principale tablette d'illustration pour les artistes numériques, sont généralement inclus dans votre noyau, mais les options permettant d'affiner les paramètres, telles que la sensibilité à la pression et la fonctionnalité des boutons, ne sont accessibles que via le panneau de contrôle graphique inclus par défaut avec GNOME mais installable en tant que package supplémentaire kde-config-tablet sur KDE.

Il existe probablement des cas extrêmes qui n'ont pas de pilotes dans le noyau mais proposent des versions kmod des modules de pilote sous forme de fichier RPM ou DEB que vous pouvez télécharger et installer via votre gestionnaire de packages.

Patch et compilation de votre propre noyau

Même dans l'utopie futuriste du XXIe siècle, certains fournisseurs ne comprennent pas suffisamment l'open source pour fournir des pilotes installables. Parfois, ces sociétés fournissent le code source d'un pilote, mais s'attendent à ce que vous téléchargiez le code, corrigiez un noyau, compiliez et installiez manuellement.

Ce type de modèle de distribution présente les mêmes inconvénients que l'installation de pilotes packagés en dehors du système kmod :une mise à jour de votre noyau casse le pilote car il doit être réintégré manuellement dans votre noyau chaque fois que le noyau est remplacé par un nouveau.

Cela est devenu rare, heureusement, parce que l'équipe du noyau Linux a fait un excellent travail en plaidant haut et fort pour que les entreprises communiquent avec elles, et parce que les entreprises acceptent enfin que l'open source ne disparaisse pas de sitôt. Mais il existe encore des appareils nouveaux ou hyper-spécialisés qui ne fournissent que des correctifs de noyau.

Officiellement, il existe des préférences spécifiques à la distribution sur la façon dont vous devez compiler un noyau pour que votre gestionnaire de paquets reste impliqué dans la mise à niveau d'une partie aussi vitale de votre système. Il y a trop de gestionnaires de paquets pour couvrir chacun; à titre d'exemple, voici ce qui se passe dans les coulisses lorsque vous utilisez des outils comme rpmdev sur Fedora ou build-essential et devscripts sur Debian.

Tout d'abord, comme d'habitude, déterminez la version du noyau que vous utilisez :

$ uname -r

Dans la plupart des cas, vous pouvez mettre à jour votre noyau en toute sécurité si vous ne l'avez pas déjà fait. Après tout, il est possible que votre problème soit résolu dans la dernière version. Si vous avez essayé et que cela n'a pas fonctionné, vous devez télécharger le code source du noyau que vous utilisez. La plupart des distributions fournissent une commande spéciale pour cela, mais pour le faire manuellement, vous pouvez trouver le code source sur kernel.org.

Vous devez également télécharger le patch dont vous avez besoin pour votre noyau. Parfois, ces correctifs sont spécifiques à la version du noyau, alors choisissez-les avec soin.

C'est traditionnel, ou du moins c'était à l'époque où les gens compilaient régulièrement leurs propres noyaux, de placer le code source et les correctifs dans /usr/src/linux .

Désarchivez la source du noyau et les fichiers de correctif si nécessaire :

$ cd /usr/src/linux
$ bzip2 --decompress linux-5.2.4.tar.bz2
$ cd  linux-5.2.4
$ bzip2 -d ../patch*bz2

Le fichier de correctif peut contenir des instructions sur la façon d'effectuer le correctif, mais ils sont souvent conçus pour être exécutés à partir du niveau supérieur de votre arborescence :

$ patch -p1 < patch*example.patch

Une fois le code du noyau corrigé, vous pouvez utiliser votre ancienne configuration pour préparer la configuration du noyau corrigé :

$ make oldconfig

Le make oldconfig La commande a deux objectifs :elle hérite de la configuration actuelle de votre noyau et vous permet de configurer de nouvelles options introduites par le correctif.

Vous devrez peut-être exécuter le make menuconfig , qui lance une liste d'options possibles basée sur ncurses et pilotée par menu pour votre nouveau noyau. Le menu peut être écrasant, mais comme il commence avec votre ancienne configuration comme base, vous pouvez parcourir le menu et désactiver les modules pour le matériel dont vous savez que vous n'avez pas et dont vous n'en avez pas besoin. Alternativement, si vous savez que vous avez du matériel et que vous voyez qu'il n'est pas inclus dans votre configuration actuelle, vous pouvez choisir de le construire, soit en tant que module, soit directement dans le noyau. En théorie, ce n'est pas nécessaire car vraisemblablement, votre noyau actuel vous traitait bien mais pour le patch manquant, et probablement le patch que vous avez appliqué a activé toutes les options nécessaires requises par n'importe quel appareil qui vous a incité à patcher votre noyau en premier lieu .

Compilez ensuite le noyau et ses modules :

$ make bzImage
$ make modules

Cela vous laisse avec un fichier nommé vmlinuz , qui est une version compressée de votre noyau amorçable. Enregistrez votre ancienne version et placez la nouvelle dans votre /boot répertoire :

$ sudo mv /boot/vmlinuz /boot/vmlinuz.nopatch
$ sudo cat arch/x86_64/boot/bzImage > /boot/vmlinuz
$ sudo mv /boot/System.map /boot/System.map.stock
$ sudo cp System.map /boot/System.map

Jusqu'à présent, vous avez patché et construit un noyau et ses modules, vous avez installé le noyau, mais vous n'avez installé aucun module. C'est la dernière étape de construction :

$ sudo make modules_install

Le nouveau noyau est en place et ses modules sont installés.

La dernière étape consiste à mettre à jour votre chargeur de démarrage afin que la partie de votre ordinateur qui se charge avant le noyau sache où trouver Linux. Le chargeur de démarrage GRUB rend ce processus relativement simple :

$ sudo grub2-mkconfig

Compilation du monde réel

Bien sûr, personne n'exécute ces commandes manuelles maintenant. Au lieu de cela, reportez-vous à votre distribution pour obtenir des instructions sur la modification d'un noyau à l'aide de l'ensemble d'outils de développement utilisé par les responsables de votre distribution. Cet ensemble d'outils créera probablement un nouveau package installable avec tous les correctifs intégrés, alertera le gestionnaire de packages de la mise à niveau et mettra à jour votre chargeur de démarrage pour vous.

Noyaux

Les systèmes d'exploitation et les noyaux sont des choses mystérieuses, mais il ne faut pas grand-chose pour comprendre sur quels composants ils sont construits. La prochaine fois que vous obtenez une technologie qui semble ne pas fonctionner sous Linux, respirez profondément, étudiez la disponibilité des pilotes et suivez le chemin de la moindre résistance. Linux est plus facile que jamais, et cela inclut le noyau.


Linux
  1. Comment mettre à niveau le noyau sur Linux Desktop

  2. Linux - Comment trouver les implémentations des appels système du noyau Linux ?

  3. Linux - Comment déterminer quel module corrompt le noyau ?

  4. Comment le nouveau support matériel est-il ajouté au noyau Linux ?

  5. Comment puis-je réserver un bloc de mémoire à partir du noyau Linux ?

Comment mettre à niveau le noyau Linux sur CentOS 7

Comment compiler un noyau - à la manière Debian

Comment installer le dernier noyau Linux sur CentOS 7

Comment afficher les informations sur le matériel sous Linux

Comment compiler le noyau Linux à partir de la source pour créer un noyau personnalisé

Comment Linux charge-t-il l'image 'initrd' ?