LinuxPedia

Wiki libre et indépendant dédié à GNU-Linux et BSD.

Outils pour utilisateurs

Outils du site


opensuse:compilation_noyau

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

opensuse:compilation_noyau [2018/11/17 13:53] (Version actuelle)
Ligne 1: Ligne 1:
 +======Recompilation manuelle du noyau======
 +
 +===À propos===
 +
 +Cet article est le résultat d'un travail de réécriture,​ réalisé à partir d'un document déjà présent depuis près de deux ans sur Linuxpedia. Il a été revu par Agemen, car il comportait de nombreux trous et erreurs. Cette révision s'est grandement appuyée sur un article provenant de feu la documentation d'​[[http://​www.alionet.org|Alionet]],​ d'où sont tirées les quelques références à openSUSE, et les manipulations de RPM ;-) . J'​espère que vous profiterez au mieux de ce travail.
 +
 +
 +
 +
 +===== Qu'est ce que le Noyau =====
 +
 +Le noyau, dans votre distribution,​ en général, c'est Linux. C'est un bout de code, ou plutôt un très gros ensemble de plein de bouts de codes, qui une fois compilés réalisent une tâche tout à fait centrale pour votre système. En effet, le noyau est chargé de réaliser l'​interface entre le matériel et le reste des logiciels. Pour l'​utilisateur,​ la tâche du noyau est donc on ne peut plus importante. Si nous nous servons en effet de logiciels sans vraiment nous soucier de ce qu'il y a en dessous, il est important de se rappeler que tous ces programmes communiquent avec le matériel, ne serait-ce que le micro-processeur et la mémoire ;)
 +
 +
 +Petite note pour la suite : kernel, c'est noyau, mais en anglais... les origines disparates de ce document provoquent une utilisation sans distinction des deux termes ;-)
 +
 +===== Numérotation du Noyau =====
 +
 +{{:​noyau.png|}}
 +
 +=====Pourquoi compiler son noyau ? =====
 +À cette question, pas de réponse unique. La première fois que j'ai recompilé mon noyau, c'​était,​ en toute franchise, pour voir comment ça se passait. Par simple curiosité donc. Et ça m'a pris une dizaine d'​heures,​ temps de compilation exclue... Mais j'​avais moins de doc à l'​époque qu'il n'y en a maintenant.
 +
 +Plus pragmatiquement,​ la recompilation du noyau peut être motivée par le besoin, ou l'​envie,​ de bénéficier de nouvelles fonctionnalités. Cela se traduit d'un point de vue logiciel, avec par exemple le support de nouveaux systèmes de fichiers (récemment encore, l'​Ext4),​ et du point de vue matériel. En effet, toutes les révisions du noyau s'​accompagnent de nouveaux pilotes, et donc du support de nouveaux périphériques.
 +
 +Il peut également s'agir d'​optimiser les performances de sa machine, en choisissant soigneusement ce qui est intégré directement,​ mis sous forme de module, ou exclu.
 +
 +Enfin, la compilation manuelle du noyau peut avoir valeur de test. Une façon de contribuer à son développement,​ c'est d'​installer les différentes RC afin de faire remonter les bugs aux développeurs.
 +
 +=====Différentes versions du noyau...=====
 +
 +Certaines distributions viennent avec un noyau modifié, afin d'en optimiser les performances pour l'​utilisation qui en sera faite. Une nouvelle fois, openSUSE est un bon exemple. Elle met à disposition cinq kernels :
 +
 +  * Desktop : optimisations pour l'​utilisation sur machine de bureau
 +  * pae : kernel avec support de plus de 4GB de RAM sur un système 32 bits
 +  * server : optimisations pour les serveurs
 +  * debug : kernel compilé avec les options debug
 +  * default : le kernel par défaut, avec quelques modifications made in suse.
 +
 +Les sources sont communes à tous ces noyaux, qui ont en fait été compilés avec des options différentes. Tous les noyaux sont issus des sources du kernel default. Ces sources ont été légèrement modifiées depuis celles du kernel **Vanilla** : le kernel vanilla est le noyau d'​origine,​ sans patch ou autres modifications par les développeurs d'une distribution.
 +
 +=====Connaître sa version du kernel=====
 +Utilisez la commande ​
 +
 +  uname -r
 +
 +===== Etapes pour compiler son noyau =====
 +==== Trouver l'​archive ====
 +
 +La première étape, bien entendu, consiste à récupérer les sources du noyau que vous voulez compiler. Il y a plusieurs façons de procéder. La plupart des distributions proposeront ces sources empaquetées,​ et mises dans les dépôts officiels. Pour openSUSE, par exemple, un simple ​
 +
 +  zypper in kernel-sources
 +  ​
 +Vous permettra d'​avoir à votre disposition les sources du noyau que vous utilisez. Peu d'​intérêt,​ me direz vous, sauf si vous voulez apprendre à compiler la chose, ou si vous voulez tenter d'​optimiser les performances de votre noyau.
 +
 +Certaines distributions proposeront également des versions plus récentes que celle utilisée par le système. Charge à vous de trouver dans quel dépôt, et d'​installer le paquet.
 +
 +Enfin, il est possible de récupérer directement les sources du dernier noyau stable sur [[http://​kernel.org|sur kernel.org]]. Prenez la dernière version **stable**, sauf si vous voulez effectuer des tests. Évitez, à ce stade, de récupérer un pré-patch, ce n'est pas vraiment notre but ;)
 +
 +L'​archive téléchargée se présente sous la forme :
 +
 +%%linux-x.x.xx.x.tar.bz2%%
 +
 +Copiez cette archive dans un répertoire de travail. Par tradition, vous pouvez placer l'​archive dans /usr/src . C'est ici que sont placées les sources du noyau par certaines distribution,​ c'est ici qu'​elles sont placées usuellement.
 +
 +
 +==== Extraire l'​archive ====
 +
 +Il vous faut ensuite extraire cette archive :
 +
 +  # tar xjvf linux*.tar.bz2
 +
 +Ou bien :
 +
 +  # tar xzvf linux*.tar.gz
 +
 +Vous avez alors un répertoire linux.x.xx.xx-xx qui apparaît. Rentrez dans ce dossier avant de passer à la suite ;-) .
 +
 +==== Trouver des patchs ====
 +=== Quels patchs appliquer à quelle version ? ===
 +
 +Un patch noyau va mettre à jour le code source seulement d'une version spécifique du noyau à une autre version spécifique. Voici comment les différents patchs peuvent être appliqués :
 +
 +  * Les **patchs pour noyau stable** s'​appliquent sur une version de base du noyau.
 +    //Exemple : Le patch 2.6.21.10 s'​applique uniquement sur une version 2.6.21. Un 2.6.21.10 ne s'​applique pas sur une version 2.6.21.9, ou sur tout autre version.//
 +  * Les **patchs pour noyau de base** s'​appliquent seulement sur la version précédente de version de base du noyau.
 +    //Exemple : Le patch 2.6.23 s'​applique seulement sur la version 2.6.22 du noyau. Il ne s'​applique pas sur une version 2.6.22.y, ou sur tout autre version.//
 +  * Les **patchs incrémentaux** mettent à jour une version spécifique vers une autre version spécifique.
 +    //Exemple : Le patch 2.6.22.10-11 s'​applique sur une version 2.6.22-10 uniquement pour obtenir une version 2.6.22.11//
 +
 +
 +==== Appliquer des patchs ====
 +
 +
 +=== Mise à jour ===
 +
 +Pour installer un patch pour passer d'une version à l'​autre,​ récupérez les archives via votre navigateur préféré, puis décompressez-les :
 +
 +  # bzip2 -d patch-<​version>​.tar.bz2 /usr/src/
 +ou bien
 +  # gunzip -d patch-<​version>​.tar.gz /usr/src/
 +
 +Ensuite, appliquez les patchs sur les sources comme ceci :
 +
 +  # cd /​usr/​src/​linux
 +  # patch -p1 < patch-<​version> ​
 +
 +
 +Vous pouvez également utiliser ceci :
 +
 +  # bzip2 -dc /​usr/​src/​patch-<​version>​.bz2 | patch -p1 --dry-run
 +  # bzip2 -dc /​usr/​src/​patch-<​version>​.bz2 | patch -p1
 +
 +ou bien
 +
 +  # gunzip -c /​usr/​src/​patch-<​version>​.gz | patch -p1 --dry-run
 +  # gunzip -c /​usr/​src/​patch-<​version>​.gz | patch -p1
 +
 +La première commande est juste un test, mais n'​affecte pas l'​état de vos sources. S'il ne semble pas y avoir d'​erreur,​ vous pouvez exécuter la deuxième commande qui applique effectivement le patch.
 +
 +Pour installer une série de patchs incrémentaux placés dans ''/​usr/​src/'',​ utilisez cette commande automatique pour vous simplifier la vie :
 +
 +  # linux/​scripts/​patch-kernel linux
 +
 +=== Vérification ===
 +
 +Vous pouvez vérifier que le patching des sources s'est bien effectué en tapant ​
 +
 +  # make kernelversion
 +  2.6.22.1
 +
 +ou
 +
 +  # head -n 5 Makefile
 +  VERSION = 2
 +  PATCHLEVEL = 6
 +  SUBLEVEL = 22
 +  EXTRAVERSION = .1
 +  NAME = Holy Dancing Manatees, Batman!
 +
 +
 +
 +===== Configurer le noyau =====
 +
 +
 +==== Récupération de la configuration ====
 +
 +Cette étape optionnelle permet de récupérer les paramètres déjà définis dans le noyau courant, ce qui est intéressant si vous avez déjà personnalisé votre noyau courant et que vous désirez l'​utiliser comme base pour le nouveau noyau. Pour effectuer ceci, exécutez les commandes suivantes :
 +
 +  # zcat /​proc/​config.gz > .config
 +  # make oldconfig.
 +
 +La configuration du noyau courant est contenu dans le fichier ''/​proc/​config.gz''​. La commande ''​make oldconfig''​ utilise le fichier ''/​usr/​src/​linux/​.config''​ (issu de la commande précédente) comme modèle pour la configuration du nouveau kernel. Si le fichier ''​.config''​ n'​existe pas, la configuration par défaut incluse dans les sources du noyau sera utilisée.
 +
 +Sur les sources de noyau openSUSE, ces 2 opérations peuvent être simplement faites par l'​alias suivant :
 +
 +  # make cloneconfig
 +
 +Sur d'​autres distributions,​ en particulier de type Debian/​Ubuntu on utilisera :
 +
 +<​code>​$ cp /​boot/​config-$(uname -r) .config
 +$ make oldconfig</​code>​
 +
 +Les droits root ne seront nécessaires que si vous pratiquez votre compilation dans un répertoire sur lequel vous n'avez pas de droits d'​écriture (par exemple /usr/src ), ce qui est en général une mauvaise pratique.
 +
 +
 +==== Lancer l'​interface de configuration ====
 +
 +Il existe plusieurs méthodes pour configurer le noyau. L'​ancienne consistait à éditer le fichier de configuration à la main. Inutile de dire que cette méthode est assez faible... nous disposons désormais d'​outils plus agréables à utiliser : menuconfig et xconfig. La différence ? Menuconfig peut être lancé dans un terminal sans l'aide de X, il est aussi moins esthétique. Xconfig, lui, utilise les librairies graphiques gtk ou qt, selon votre système.
 +
 +Notez que pour utiliser xconfig sur certaines distributions,​ vous devrez autoriser root à accédez à X. Le système vous jettera, sans ça, par mesure de sécurité. Dans ce cas, essayez de recourir à xdg-su, ou kdesu, ou gnomesu... ;) ou faites un petit
 +
 +  sux
 +  ​
 +avant de lancer la configuration graphique.
 +
 +Voici comment lancer la configuration :
 +
 +  $ make menuconfig
 +
 +Commencez par vous balader dans les options de configuration si vous n'​êtes pas encore familier de ce genre d'​exercice. Si vous avez utilisé le fichier de config '​origine de votre distro, vous observerez que beaucoup de cases dont vous n'avez pas besoin sont cochées pour assurer la portabilité du noyau sur des machines différentes.
 +
 +Toutes les options de configuration du noyau ne peuvent malheureusement pas être décrites ici en détail. Utilisez les nombreux textes d'aide intégrés pour la configuration. La documentation mise à jour du noyau est également placée dans ''/​usr/​src/​linux/​Documentation''​.
 +
 +Naviguez dans le menu de configuration et effectuez vos modifications et choix.
 +
 +Soyez sur de spécifier une **chaîne d'​identification de version** du noyau dans
 +
 +  General Setup --->
 +     ​(-default) Local version - append to kernel release
 +
 +La chaîne standard est ''​-default'',​ mais vous pouvez mettre une chaîne différente qui vous aide à identifier spécifiquement vos changements effectués sur la configuration du noyau (par ex. ''​-custom''​ ou ce que vous voulez).
 +
 +A noter que si vous compilez 2 versions différentes à partir des mêmes sources, **il est primordial d'​utiliser des chaînes différentes**,​ sinon le deuxième noyau risque d'​écraser le premier (si installation en manuel) ou de ne pas pouvoir être installé du tout (si installation via RPM).
 +
 +==== En module ou en dur? ====
 +
 +La phase de configuration nous permet de choisir quelles parties du noyau nous allons compiler. Mieux, elle permet d'​inclure certaines parties en tant que modules. Les parties résultantes pourront être chargées à la volée par le noyau, en fonction des besoins du moment.
 +
 +Le noyau est composé d'un programme central, le noyau dur installé dans le répertoire /boot et de programmes périphériques,​ les modules que le noyau dur charge selon ses besoins. Les modules sont copiés dans /​lib/​modules.
 +
 +Basiquement,​ les composants non requis pour le démarrage du système doivent être compilés comme modules. Ceci assure que le kernel ne devient pas trop gros et ne puisse être chargé par le BIOS ou par un chargeur de démarrage. Aussi, intégrer le driver ou la fonction dans le noyau le rend (en théorie) plus stable et plus sécurisé.
 +
 +//Exemple : Les drivers pour ext3, les drivers SCSI sur les systèmes basés sur SCSI et les drivers similaires devraient être compilés dans le noyau. En contraste, les autres, comme isofs, msdos, ou le son, qui ne sont pas requis pour le démarrage du système, devraient être compilés comme modules.//
 +
 +Mais notez que ce n'est pas forcément une règle stricte à respecter. Les drivers scsi ne sont pas forcément intégrés au noyau. Il faut alors que le ramdisk intègre les drivers et que le noyau les monte tout de suite après. Idemment, les drivers son peuvent être intégrés au noyau sans problème. C'est même obligatoire pour certaines cartes. Le problème est que s'il y a des mises à jour d'alsa par exemple, il faut recompiler le noyau, alors qu'une mise à jour du module correspondant est plus rapide.
 +
 +=== Ou sont situés tous ces fichiers ? ===
 +
 +  * Les sources du noyau sont situés dans ''/​usr/​src/​linux-<​version>/''​. Il y a également un lien symbolique ''/​usr/​src/​linux/''​qui pointe vers ce répertoire.
 +  * Le noyau est situé dans le repertoire ''/​boot/''​.
 +  * Les modules kernel sont situés dans ''/​lib/​modules/<​version>/''​.
 +
 +=== Quels fichiers composent le noyau ? ===
 +
 +Le noyau est composé de 3 parties :
 +  * **vmlinuz** est l'​image du noyau - le fichier qui contient le noyau.
 +  * **System.map** est le fichier qui contient les symboles noyau requis par les modules pour assurer le lancement avec succès des fonctions du noyau.
 +  * **initrd** - //initial ram disk// - est un fichier qui charge les drivers compilés en modules nécessaire au démarrage du noyau.
 +
 +Ces trois fichiers sont dépendants et chacun est régénéré à chaque compilation.
 +
 +====Comment savoir ce dont j'ai besoin ?====
 +
 +Il existe 3 commandes de base permettant de savoir ce que son matériel a dans le ventre.
 +  * ''​lspci''​ : Permet d'​afficher tous les dispositifs PCI. Utilisez la commande ''​lspci -v''​ pour obtenir plus d'​informations,​ ou ''​lspci -vv''​ pour en obtenir encore plus
 +  * ''​lsusb''​ : Permet de connaître la liste du matériel usb connecté à votre machine
 +  * ''​lsmod''​ : Permet de lister tous les modules du noyau qui sont actuellement chargés.
 +
 +Il vous sera sans doute nécessaire de faire une petite analyse de votre système afin de déterminer quels modules peuvent être compilés en dur, si vous souhaiter alléger votre noyau en incluant uniquement les modules correspondants à votre système ou si vous voulez gagner du temps à la compilation.
 +
 +Notez que vous pouvez sans vous poser de questions compiler tous les modules livrés avec les sources pour éviter les mauvaises surprises (oubli d'un module), au prix d'un temps de compilation plus long et d'un espace sur le disque dur légèrement réduit.
 +
 +Pour savoir quels modules sont chargés sur mon système, j'ai l'​habitude de procéder comme suit. Pour chaque entrée de menuconfig, je lis la description fournie. Quand les indications ne sont pas assez explicites pour savoir si j'ai besoin de la chose ou pas, ou pour savoir quelle version d'un module j'​utilise,​ je fais un petit
 +  ​
 +  lsmod|grep nomdumodule
 +  ​
 +C'est très simple, ça mange pas de pain, et pourtant c'est à peu près tout ce dont on a besoin ;-)
 +
 +=====Compilation et installation=====
 +
 +==== Compiler le noyau ====
 +
 +Vous serez heureux d'​apprendre que vous venez de faire le plus dur. Nous allons passer au plus long : la compilation. pour compilez, tapez :
 +
 +  $ make
 +
 +Et allez vous préparer un café.
 +
 +astuce : Si vous voulez continuer à vous servir de votre ordinateur pendant la compilation,​ attribuez au processus la priorité la plus basse :
 +
 +  $ nice -n 19 make
 +
 +Si vous possédez un processeur dualcœur ou biprocesseur (et que vous ne souhaitez pas trop utiliser votre PC pendant la compilation),​ il est plus intéressant de lancer la commande :
 +
 +  $ make -j 2
 +
 +Certaines distributions,​ notamment openSUSE, vous permettent d'​obtenir un rpm au terme de la compilation. Pour cela, utilisez la commande
 +
 +  make rpm
 +
 +
 +==== Installer le noyau ====
 +
 +À partir de maintenant, les opérations devront être réalisées en root, ou avec sudo pour les dérivées d'​Ubuntu
 +
 +**Installation des modules** :
 +
 +  # make modules_install
 +
 +**Installation du noyau** :
 +
 +  # make install
 +
 +Exemple du contenu de /boot :
 +  boot.0300
 +  boot.0800
 +  boot_message.txt
 +  config -> config-2.6.23.12
 +  config-2.6.22.9
 +  config-2.6.23.12
 +  initrd.splash
 +  map
 +  README.initrd -> /​usr/​doc/​mkinitrd-1.1.3/​README.initrd
 +  splash.bmp
 +  System.map -> System.map-2.6.23.12
 +  System.map-2.6.22.9
 +  System.map-2.6.23.12
 +  vmlinuz -> vmlinuz-2.6.23.12
 +  vmlinuz-2.6.22.9
 +  vmlinuz-2.6.23.12
 +
 +
 +=== Installation via RPM ===
 +Pour les systèmes supportant la manipulation ;-)
 +Installer maintenant votre paquet RPM du noyau comme ceci :
 +
 +  # cd /​usr/​src/​packages/​RPMS/<​arch>/​
 +  # rpm -ivh kernel-<​version>​.<​arch>​.rpm
 +
 +Note pour les utilisateurs d'​openSUSE : vous pouvez transférer ce paquet RPM sur un autre système openSUSE et l'​installer de la même manière, ce qui signifie que vous n'avez pas besoin de compiler à nouveau le noyau pour ce système. Particulièrement pratique quand on a une parc où toutes les machines sont identiques ;-)
 +
 +==== Réinitialisation du secteur de démarrage ====
 +
 +Il faut maintenant recréer le ram disk initial pour le nouveau noyau, sinon le système ne sera certainement pas capable de redémarrer le nouveau noyau.
 +
 +  # mkinitrd
 +
 +Notons que cette commande recréer un nouveau ram disk pour chacun des noyaux en présence détectés dans ''/​boot/''​.
 +
 +==== Configurer le chargeur de démarrage ====
 +Il est utile de créer un lien symbolique vers le nouveau kernel et d'​utiliser toujours ce lien symbolique dans Lilo ou Grub, et d'​ajouter une entrée pour les vieux kernel.
 +  # cd /boot
 +  # ln -sf vmlinux-x.x.xx.x vmlinuz
 +  # ln -sf System.map-x.x.xx.x System.map
 +  # ln -sf config-x.x.xx.x config
 +== Lilo ==
 +Extrait d'un %%/​etc/​lilo.conf%%
 +  # nouveau kernel
 +  image = /​boot/​vmlinuz
 +    root = /dev/sda2
 +    label = Zenwalk
 +    initrd = /​boot/​initrd.splash
 +    read-only
 +  # ancien kernel y.y.yy.y
 +  image = /​boot/​vmlinuz-y.y.yy.y
 +    root = /dev/sda2
 +    label = Zenwalk-old1
 +    initrd = /​boot/​initrd.splash
 +    read-only
 +  # ancien kernel z.z.zz.z
 +  image = /​boot/​vmlinuz-z.z.zz.z
 +    root = /dev/sda2
 +    label = Zenwalk-old2
 +    initrd = /​boot/​initrd.splash
 +    read-only
 +Bien sûr ici **%%root =%%** est un exemple et est à adapter à votre configuration.
 +Ensuite il suffit de réinstaller Lilo :
 +  # lilo -v
 +
 +== Grub ==
 +
 +Vérifiez le fichier ''/​boot/​grub/​menu.lst''​ afin de voir si la nouvelle entrée permettant à Grub de booter sur le nouveau kernel a été créée. Si besoin, copiez la section concernant votre noyau actuelle et adaptez la au nouveau noyau. Ceci vous permettra de booter sur votre ancien noyau si un problème se présente.
 +
 +Une section-type se présente comme ceci :
 +
 +  title openSUSE 10.x
 +  root (hd0,0)
 +  kernel /​boot/​vmlinuz root=/​dev/​hda1 vga=0x31a resume=/​dev/​hda3 splash=silent showopts
 +  initrd /​boot/​initrd-<​version>​
 +
 +Notez qu'en cas de besoin, Grub vous permet en tout temps de booter sur n'​importe quel kernel, mais au prix de quelques commandes à taper.
 +
 +=====Une dernière chose...=====
 +
 +si vous voulez essayer le noyau fraîchement compilé... il faut redémarrer :-p
 +
 +
 +
 +===== Configurer le noyau =====
 +
 +
 +**Note : Concernant le message d'​erreur fréquent du kernel panic avec les noyaux 2.6, il est impératif de monter le système de fichier ext3 en YES c'est a dire directement dans le noyau et ne surtout pas utiliser en MODULE , faute de quoi vous ne rebooteriez pas avec votre nouveau noyau qui se trouve forcement sur une partition ext3. **
 +
  
opensuse/compilation_noyau.txt · Dernière modification: 2018/11/17 13:53 (modification externe)