GNU/Linux >> Tutoriels Linux >  >> Debian

Noyaux personnalisés dans Ubuntu/Debian – comment, quand et pourquoi

Donc, vous avez décidé d'essayer cette chose dont vous avez entendu parler, appelée "compiler un noyau personnalisé". Si vous essayez cela comme passe-temps, ou parce que vous voulez apprendre une nouvelle compétence, très bien - lisez la suite.

Cependant, avant de commencer, nous allons essayer d'expliquer les situations où ce besoin se présente et comment y faire face. Notez qu'il s'agit d'un vaste sujet qui nécessite beaucoup plus en termes d'espace que ce que nous fournirons ici. Vous apprendrez les bases, ce dont vous avez besoin, ce qu'il faut faire et ce que vous obtiendrez.

Pour plus d'informations, comme d'habitude, Google est votre ami; De plus, la documentation résidant dans l'arborescence des sources du noyau répondra à de nombreuses questions. Alors, commençons par le début, avec une dernière note :si besoin est, nous publierons plus d'articles liés à la compilation du noyau concernant d'autres distributions.

Quand vous aurez besoin de compiler votre propre noyau

La première situation serait lorsque vous avez besoin d'un noyau plus récent que celui fourni par votre distribution, en particulier lorsque vous exécutez une distribution stable (par exemple, Debian stable, CentOS), parce que votre noyau ne prend pas en charge certaines fonctionnalités/pilotes dont vous avez besoin, ou simplement parce que vous vous sentez vous voulez essayer le dernier et le meilleur.

Un avertissement cependant : si vous voulez exécuter un noyau à la pointe de la technologie, assurez-vous qu'il sera compatible avec d'autres composants clés de votre système (comme la glibc), rappelez-vous que plus récent signifie moins de tests et (probablement) plus d'instabilité ; les mainteneurs du noyau de votre distribution font généralement du bon travail en rétroportant certaines nouvelles fonctionnalités vers des noyaux plus anciens et plus stables, alors assurez-vous que vous avez vraiment besoin d'être à la pointe de la technologie. Notre conseil est de ne pas utiliser ces noyaux (les noyaux à long terme feraient une exception ici) sur les systèmes de production. Comme dit, faites confiance aux mainteneurs de votre distribution.

La deuxième situation est que vous avez l'impression d'exécuter un noyau gonflé, avec de nombreux composants inutiles. Alors que le noyau ne charge que les modules correspondant à un matériel existant, une plus petite empreinte mémoire du noyau contribue généralement à la vitesse et au temps de démarrage.

# lspci -vv
# lsusb
# hwinfo
# cat /proc/cpuinfo

Les commandes ci-dessus vous aident à mieux connaître votre matériel. Notez ce que vous avez trouvé et assurez-vous d'exécuter les commandes ls* ci-dessus en tant que root, pour plus d'informations.

Une autre situation serait que vous souhaitiez aider à tester le noyau en exécutant la dernière version sur votre système. Les mêmes avertissements que ci-dessus s'appliquent :faites cela sur les systèmes de test, restez en contact avec l'amont au cas où vous trouveriez un bogue (lkml.org est la liste de diffusion principale du noyau - trafic élevé) et essayez d'être aussi utile que possible lorsqu'on vous demande des informations .Cela ne saurait être assez souligné :lisez la documentation, soit parce que vous vous trouvez dans une mauvaise situation, soit parce que vous souhaitez signaler un bogue, soit simplement parce que vous avez des questions.

Ensuite, vous voudrez peut-être être le gamin cool du quartier et exécuter le dernier et le meilleur, peut-être en jetant un coup d'œil à la source (à condition que vous soyez dans le coup et que vous ayez des connaissances en C et ASM) et même soumettre des correctifs. Vous voudrez peut-être regarder d'abord si votre distribution n'offre pas déjà un paquet de noyau plus récent, par exemple vous pouvez installer des noyaux de Debian experimental sur un système de test, si vous modifiez votre sources.list en conséquence. Encore une fois, travaillez avec les responsables si vous tombez sur un bogue.

Terminologie

Avant d'approfondir ce sujet quelque peu obscur, nous devrions clarifier (plus) quelques termes de base ; ceci est essentiel pour comprendre les parties clés des tests et de la compilation du noyau.

  • noyau – Le cœur du système d'exploitation, responsable de la gestion des ressources matérielles (E/S, réseau, CPU, mémoire…). Fondamentalement, c'est la partie essentielle du système d'exploitation responsable de tout le sale boulot. Les programmes utilisateur communiquent avec le noyau, demandant du temps CPU ou d'autres ressources par des bibliothèques système qui agissent comme intermédiaires entre l'espace utilisateur (voir ci-dessous) et le noyau/matériel. Les noyaux peuvent être monolithiques et micro-noyaux (pour plus d'informations, si vous êtes intéressé, voir Approches de conception à l'échelle du noyau sur Wikipedia.org . Les micro-noyaux (comme Minix) utilisent un schéma de conception qui divise le noyau du reste du noyau, et qui reste est divisé en composants, chacun faisant quelque chose de spécifique :E/S, mise en réseau, etc. Les noyaux monolithiques (Linux, BSD, Solaris), comme leur nom l'indique, comprennent la majeure partie du noyau en une seule unité, ayant des fonctionnalités supplémentaires (par exemple, des pilotes ) fournies par les modules. Il existe également des noyaux hybrides, une combinaison des deux, un bon exemple étant le noyau Windows.
  • espace utilisateur – tout ce qui, dans un système d'exploitation, ne fait pas partie du noyau (bibliothèques, applications) fait partie de l'espace utilisateur. Le nom est si évident.
  • module– comme indiqué précédemment, un module de noyau est un morceau de logiciel binaire qui "enseigne" au noyau comment "parler" avec un morceau de matériel ou fournir certaines fonctionnalités (par exemple, nfs)
  • compilateur – le compilateur est une application qui prend essentiellement le code écrit, tel que téléchargé par vous depuis kernel.org, et le transforme en binaires. Le compilateur que l'on trouve dans les distributions Linux s'appelle 'gcc', et cela signifie GNU Compiler Collection, qui a également besoin de composants essentiels à la construction de logiciels :des utilitaires trouvés dans les binutils comme l'assembleur (as) ou l'archiveur de bibliothèque (ar). Sur les systèmes Debian, ou Ubuntu, on peut trouver à quel paquet appartient un fichier en installant et en exécutant apt-file. En parlant de cela, voyons quels packages nous devons installer pour une construction de noyau réussie.
  • noyau de vanille – c'est le nom utilisé pour le noyau en amont, tel qu'il se trouve sur kernel.org, donc sans correctifs spécifiques à la distribution.

Veuillez noter que chaque fois que vous voyez une commande dans ce document commençant par l'invite '$' cela signifie que la commande devra être exécutée en tant qu'utilisateur normal et quotidien ; chaque fois que vous voyez le '#' prompt, cela signifie que la commande doit être exécutée en tant que root (nous utilisons sudo, mais ce n'est pas obligatoire). Le répertoire courant, sauf indication contraire, est celui contenant votre arborescence source, dans ce cas, linux-2.6.

Ce que vous devez installer

  • gcc – bien sûr, le compilateur est essentiel
  • binutils - ce paquet contient l'éditeur de liens, l'assembleur et d'autres utilitaires essentiels à la compilation de programmes écrits en C.
  • gcc-doc – le manuel et les pages d'informations pour gcc. Utile si vous voulez vous salir et modifier certains drapeaux de compilation. Utile de toute façon si vous voulez écrire ou compiler des packages C.
  • gdb – Le débogueur GNU. Pas obligatoire mais utile en cas de problème. Gdb-doc vous aidera également.
  • libreadline5-dev – pour utiliser l'interface de configuration du noyau basée sur ncurses. Vous pouvez utiliser d'autres interfaces (voir ci-dessous).
  • make - sera installé en tant que dépendance, mais quelques mots sont de rigueur. Consultez le manuel ou les livres, car ce n'est pas un sujet à expliquer à la légère dans un si court espace. Make est un utilitaire utilisé lors de la compilation de programmes C/C++, et ce qu'il fait, c'est qu'il regarde dans un Makefile, contenant des règles sur comment et dans quel ordre la construction doit se produire, et essaie d'exécuter ces directives. Lisez les Makefiles dans l'arborescence des sources pour avoir un aperçu.
  • git - Git est un VCS (système de contrôle de version), faisant ce que font cvs ou subversion, à savoir vous tenir au courant de la dernière arborescence du noyau.

Obtenir la source du noyau

Si vous souhaitez installer les sources depuis votre distribution, utilisez

# apt-get install linux-source-<version>

peut être récupéré à partir de l'émission :

uname -r

Utilisez ceci si vous souhaitez modifier votre noyau existant (ajout de pilotes, découpage, etc.). Sinon, vous voulez le noyau vanille. Vous pouvez l'obtenir sur www.kernel.org (nous suggérons wget ou curl ici en tant que gestionnaires de téléchargement) ou, si vous voulez la dernière version, vous utiliserez git. Nous vous recommandons de stocker la source dans le répertoire personnel de votre utilisateur, et la commande pour obtenir la dernière arborescence principale est (voir man git) :

$ git clone git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux-2.6.git linux-2.6

Dans le passé, nous avons trouvé que le mini-howto sur http://linux.yyz.us/git-howto.html était utile; consultez également kernelnewbies.org . La commande ci-dessus créera un dossier dans votre répertoire actuel nommé linux-2.6, qui pourra être mis à jour ultérieurement en y accédant et en lançant un simple

make clean; git pull 

Maintenant, une fois que vous avez la source, nous devrons configurer le noyau .

Configuration et construction

Si vous avez un fichier .config existant (le fichier qui contient les options pour la construction du noyau - ce qui entre et ce qui ne va pas), copiez-le dans linux-2.6 (depuis /boot/config- ou /proc/config .gz – la configuration actuelle). Si vous ne souhaitez pas modifier le .config existant, lancez simplement

$ make oldconfig

Sinon, lisez la suite. Si vous souhaitez modifier la configuration existante, lancez

$ make menuconfig

(recommandation :vous pouvez utiliser make config pour de nombreuses questions sur les options du noyau, ou make xconfig , qui nécessite des bibliothèques qt, pour un menu graphique plus agréable), et sélectionnez "Load an Alternate Configuration File" et appuyez sur entrée pour .config , le nom par défaut du fichier de configuration, ou tapez un autre nom de fichier déjà enregistré dans linux-2.6.

Après cela, commencez à parcourir les menus pour apporter les modifications nécessaires. La règle d'or ici est "si vous ne savez pas ce qu'il fait, ne le dérangez pas", au moins jusqu'à ce que vous obteniez de l'expérience. À la fin, dans le menu du haut, sélectionnez "Enregistrer un fichier de configuration alternatif", appuyez sur Entrée pour le nom par défaut (.config - recommandé) puis sur "Quitter" ci-dessous. Si vous voulez repartir de zéro, oubliez l'étape "Charger un fichier de configuration alternatif" et continuez. Lors de votre prochaine compilation du noyau, après avoir nettoyé et mis à jour l'arborescence, utilisez "make oldconfig" comme ci-dessus pour utiliser l'ancienne configuration. OK, maintenant nous avons la configuration adaptée à nos besoins qui n'attend plus qu'à être construite. Construire un noyau est aussi simple que de le configurer (!). Tapez simplement make et le résultat devrait ressembler à ceci :

$ make 

  HOSTCC  scripts/basic/fixdep 
  HOSTCC  scripts/kconfig/conf.o 
  SHIPPED scripts/kconfig/zconf.tab.c 
  SHIPPED scripts/kconfig/zconf.lex.c 
  SHIPPED scripts/kconfig/zconf.hash.c 
  HOSTCC  scripts/kconfig/zconf.tab.o 
  HOSTLD  scripts/kconfig/conf 
  
  CHK     include/linux/version.h 
  UPD     include/linux/version.h 
  CHK     include/generated/utsrelease.h 
  UPD     include/generated/utsrelease.h 
  CC        kernel/bounds.s 
  GEN     include/generated/bounds.h 
  CC        arch/x86/kernel/asm-offsets.s 
...

et , après un certain temps, selon la configuration de votre machine et du noyau, ce sera fait. Si vous voulez accélérer un peu les choses, utilisez le drapeau -jn pour faire, où n est le nombre de processeurs/cœurs + 1. Attention cependant, cela peut exposer des bogues dans le noyau ou construire l'infrastructure, donc si quelque chose ne va pas, réessayez en utilisant simplement make sans aucun drapeau. Si après avoir lu le manuel de gcc (et si vous êtes toujours sain d'esprit), vous vous sentez aventureux et souhaitez modifier certains drapeaux spécifiques au matériel, ou si vous avez envie d'optimiser le code, utilisez la page de manuel make pour savoir comment (principalement COPTS et CFLAGS ). Cependant, les optimisations supérieures à -O2 sont risquées.

Soyez prudent et attendez-vous à des pannes, le noyau peut se compiler sans problème, mais il peut agir bizarrement. N'oubliez pas de taper toutes les commandes en tant qu'utilisateur normal. Pas besoin de compiler en tant que root et les développeurs du noyau désapprouvent l'idée.

Installation

Installons maintenant les modules :cela doit être fait en tant que root, car les modules sont installés dans /lib, et l'utilisateur normal n'y a pas d'accès en écriture. Alors,

# make modules_install 

fait exactement cela, et cela doit être fait avant d'installer le noyau afin que les modules et le noyau installé soient synchronisés. Utiliser

# make install 

pour installer le noyau dans /boot, puis

# depmod 

et préparez-vous à créer un initramfs (système de fichiers RAM initial), qui est un système de fichiers temporaire chargé dans la RAM lors des premières étapes de démarrage, et est utilisé pour fournir des pilotes de base et d'autres installations afin que le système de fichiers racine soit monté. Plus d'informations peuvent être trouvées sur la page Initrd de Wikipedia. La commande nécessaire pour la tâche est update-initramfs (elle est également invoquée chaque fois qu'un nouveau noyau est installé, déclenché par le gestionnaire de packages) qui peut créer un initramfs ( -c ) ou mettre à jour un existant ( -u ) . La commande complète est

# update-initramfs -c -k  

La version est celle que vous verrez après la fin de 'make modules_install' (la dernière ligne de sa sortie sera "DEPMOD"). Si vous voulez avoir le numéro de version exact et plus long, vous pouvez donc dire aux développeurs quel "git moment" que vous avez utilisé, sélectionnez "Configuration générale" → "Ajouter automatiquement les informations de version à la chaîne de version" après avoir lancé menuconfig. La sortie sur mon système Ubuntu ressemble à ceci :

update-initramfs: Generating /boot/initrd.img-3.1.0-rc3+
...

Mettez à jour votre Grub pour qu'il remarque votre nouveau noyau avec

# update-grub

Sur ma machine de test Debian, la sortie ressemble à ceci :

Generating grub.cfg ... 
Found background image: /usr/share/images/desktop-base/desktop-grub.png 
Found linux image: /boot/vmlinuz-3.0.0-1-amd64 
Found initrd image: /boot/initrd.img-3.0.0-1-amd64 
Found linux image: /boot/vmlinuz-3.0.0-rc6-amd64 
Found initrd image: /boot/initrd.img-3.0.0-rc6-amd64 
Found linux image: /boot/vmlinuz-2.6.39-07727-gbd1bfe4 
Found initrd image: /boot/initrd.img-2.6.39-07727-gbd1bfe4 
Found linux image: /boot/vmlinuz-2.6.39-2-amd64 
Found initrd image: /boot/initrd.img-2.6.39-2-amd64 
Found linux image: /boot/vmlinuz-2.6.39-rc7-amd64 
Found initrd image: /boot/initrd.img-2.6.39-rc7-amd64 
Found linux image: /boot/vmlinuz-2.6.38.5 
Found initrd image: /boot/initrd.img-2.6.38.5 
Found linux image: /boot/vmlinuz-2.6.38.4-00001-gfaa8ee7 
Found initrd image: /boot/initrd.img-2.6.38.4-00001-gfaa8ee7 
Found linux image: /boot/vmlinuz-2.6.38.4 
Found initrd image: /boot/initrd.img-2.6.38.4 
Found linux image: /boot/vmlinuz-2.6.38-2-amd64 
Found initrd image: /boot/initrd.img-2.6.38-2-amd64 
Found linux image: /boot/vmlinuz-2.6.32-5-amd64 
Found initrd image: /boot/initrd.img-2.6.32-5-amd64 
Found memtest86+ image: /memtest86+.bin 
Found memtest86+ multiboot image: /memtest86+_multiboot.bin 
done 

Bien sûr, votre sortie ne sera pas exactement la même, mais le contour doit être le même; enfin, rappelez-vous :si vous le souhaitez, modifiez /etc/default/grub pour modifier certaines options avant update-grub et, en croisant les doigts, redémarrez votre machine pour tester le nouveau noyau.

En cas de problème

Les situations les plus courantes dans lesquelles votre nouveau noyau est inutilisable sont que vous ne pouvez pas le démarrer en premier lieu, ou qu'il démarre et qu'il n'a pas de pilote essentiel (par exemple des pilotes réseau). Habituellement, update-grub fait du bon travail en écrivant le fichier de menu grub, mais vous voudrez peut-être le vérifier quand même. Si vous passez grub, il y a de fortes chances que vous soyez trop zélé et que vous supprimiez un pilote essentiel pour le système, comme les parties liées au disque (ATA, SATA, SCSI…), ou peut-être NFS, si vous avez une racine montée sur NFS. Démarrez un noyau fonctionnel et reconfigurez-le, en utilisant Google et d'éventuelles autres sources, comme IRC .

Il y a de fortes chances que quelqu'un soit déjà tombé sur votre problème dans le passé et vous avez des chances de trouver une réponse. Si le problème est plus sérieux, et que vous êtes sûr d'avoir lu sur la nétiquette et comment poster sur la liste de diffusion du noyau, demandez gentiment. Il y a beaucoup de gens gentils et serviables, mais ils ont tendance à être moins gentils quand vous n'avez pas fait vos devoirs et/ou perdu leur temps. Si vous avez un /boot séparé, gardez à l'esprit qu'il n'est généralement pas très gros et qu'il peut rapidement se remplir de noyaux. De plus, /lib/modules a tendance à accumuler beaucoup d'espace dans /, alors assurez-vous de faire un peu de nettoyage de temps en temps. N'oubliez pas que le noyau est un logiciel complexe et que de nombreuses causes peuvent être à l'origine de vos problèmes. Si vous n'avez rencontré aucun problème en suivant ce guide, vous êtes prêt pour une configuration plus avancée du noyau Linux.


Debian
  1. Comment installer Python 3.7 sur Ubuntu, Debian et LinuxMint

  2. Debian – Comment faire avant le double démarrage de Windows 7 et Debian sur Efi ?

  3. Pourquoi Ubuntu a-t-il besoin de deux noyaux ?

  4. Comment installer Monit (surveillance des processus et des services) sur Ubuntu / Debian

  5. Comment compiler et installer wxWidgets sur Ubuntu/Debian/Linux Mint

Comment installer le dernier noyau sur Debian 11 et dérivés

Comment installer Zoom Ubuntu et les dérivés Debian

Comment installer Jitsi Meet sur Debian et Ubuntu

Comment installer ONLYOFFICE Docs sur Debian et Ubuntu

Comment créer un utilisateur Sudo sur Ubuntu et Debian

Comment installer Grafana sur Ubuntu 18.04 et Debian 8