expert:recompilation_noyau
no way to compare when less than two revisions
Différences
Ci-dessous, les différences entre deux révisions de la page.
— | expert:recompilation_noyau [2018/11/17 12:53] (Version actuelle) – créée - modification externe 127.0.0.1 | ||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | =====Compilation du noyau Linux===== | ||
+ | Ce tutoriel a pour but de donner des informations générales sur la compilation d'un noyau Linux. De nombreuses distributions disposent d' | ||
+ | |||
+ | Le noyaux Linux est au cœur des distributions GNU-Linux, il agit comme le métronome du système, sert d' | ||
+ | |||
+ | Pour avoir une perspective historique sur la création et l' | ||
+ | |||
+ | < | ||
+ | |||
+ | < | ||
+ | * **kernel** est le mot anglais pour **noyau**, vous le rencontrerez souvent dans des articles ou tutoriels même francophones, | ||
+ | * Les **sources** sont le code du noyau (ou de tout autre logiciel) avant sa compilation sous forme binaire destiné à être exécuté. Le noyau Linux est écrit en différents langages de programmation (majoritairement " | ||
+ | * **compiler** est l' | ||
+ | * **module** est parfois utilisé de manière interchangeable avec " | ||
+ | * **initrd** ou **initramfs** est un système de fichier initial temporaire, chargé en mémoire vive par le chargeur d' | ||
+ | </ | ||
+ | |||
+ | ====Pourquoi compiler son noyau ?==== | ||
+ | | ||
+ | Toutes les distributions fournissent un noyau déjà compilé et prêt à l' | ||
+ | Compiler votre noyau vous permet de bénéficier des avancées de la dernière version, de choisir le mode de compilation des pilotes (en module ou à l' | ||
+ | Si la principale raison de compiler votre noyau est d' | ||
+ | Enfin n' | ||
+ | Finalement la meilleur raison sera sans doute pour certains : "parce que c'est possible !"\\ | ||
+ | |||
+ | Du côté des **mauvaises raisons** on peut citer le besoin de compiler un module externe, pour cela il suffira d' | ||
+ | Penser que le dernier-nouveau-tout-neuf noyau sera nécessairement mieux (plus " | ||
+ | "Ma distribution " | ||
+ | "Le nouveau système de fichier " | ||
+ | |||
+ | |||
+ | ====Travail préliminaire : RTFM (lisez la documentation) !==== | ||
+ | |||
+ | Avant de se lancer tête baissée dans la compilation proprement dite un minimum de préparation s' | ||
+ | * Votre distribution utilise-t-elle un disque initial de démarrage (" | ||
+ | * Quel est le système de fichier utilisé ? (ext2/3/4, reiserfs, etc...) | ||
+ | * Quels sont les modules nécessaires au fonctionnement de votre matériel ? Le type de votre processeur (Intel, AMD, autre), son architecture (x86 ou x86_64, ppc ou ia64 peut-être) ? Autant de questions auxquelles vous devez pouvoir répondre pour éviter de vous retrouver dans une impasse. | ||
+ | | ||
+ | De nombreuses distributions proposent également une méthode spécifique de compilation du noyau, il est en général plus facile et plus sûr de l' | ||
+ | |||
+ | Dans les sources du noyau sont également disponibles de la documentation générale, ou des documentations spécifiques à un module ou une fonction. Pour avoir un aperçu rapide de ce qui pourrait vous intéresser regardez le fichier " | ||
+ | |||
+ | |||
+ | ====Récupérer les sources==== | ||
+ | |||
+ | Pour compiler un noyau vous devez disposer de ses sources, la version de référence, | ||
+ | Vous pouvez également utiliser les sources fournies par votre distribution, | ||
+ | |||
+ | En plus de ces sources vous pouvez utiliser des versions particulières, | ||
+ | |||
+ | Il existe deux familles du noyau Linux actives à ce jour, la 2.6.* et 3.* Celle qui vous intéresse est sans aucun doute la 3.*.\\ | ||
+ | Ensuite vous devrez choisir une version particulière, | ||
+ | Voyez [[https:// | ||
+ | |||
+ | * Fichiers en " | ||
+ | * Fichiers " | ||
+ | * Fichiers " | ||
+ | * Fichiers " | ||
+ | |||
+ | Capture d' | ||
+ | |||
+ | {{ expert: | ||
+ | |||
+ | < | ||
+ | < | ||
+ | |||
+ | ====Installer un environnement de compilation==== | ||
+ | |||
+ | Compiler un noyau nécessite comme toute compilation de disposer d'un certain nombre d' | ||
+ | Des dépendances supplémentaires peuvent être nécessaires pour utiliser des interfaces de configuration conviviales " | ||
+ | |||
+ | |||
+ | ====Où compiler==== | ||
+ | |||
+ | Les sources du noyau installé résident généralement dans /usr/src/ (ou / | ||
+ | |||
+ | < | ||
+ | $ cd ~/ | ||
+ | |||
+ | ====Mise en place des sources==== | ||
+ | |||
+ | Vous pouvez récupérer les sources par divers moyens, si vous installez un paquet source de votre distribution vous trouverez sans doute les sources dans /usr/src, d'où vous pourrez les déplacer. Si vous souhaitez utiliser d' | ||
+ | Pour l' | ||
+ | |||
+ | < | ||
+ | $ tar xJf linux-3.16.1.tar.xz | ||
+ | $ mv linux-3.16.1 linux-3.16.1-perso</ | ||
+ | |||
+ | < | ||
+ | |||
+ | ====Configuration==== | ||
+ | |||
+ | Cette étape est la plus importante, elle implique des choix qui vont déterminer la réussite de votre compilation, | ||
+ | On ne détaillera pas ici les options de compilation disponibles, | ||
+ | Une bonne façon de ne pas se perdre dans les options est d' | ||
+ | |||
+ | < | ||
+ | |||
+ | On utilise cette commande pour identifier et copier le fichier de configuration du noyau en cours d' | ||
+ | |||
+ | Ici nous allons copier ce fichier et l' | ||
+ | |||
+ | < | ||
+ | $ make oldconfig</ | ||
+ | |||
+ | Remarquez bien que la première commande est effectuée __à l' | ||
+ | |||
+ | < | ||
+ | |||
+ | Voir [[commande: | ||
+ | |||
+ | La commande "make oldconfig" | ||
+ | La capture d' | ||
+ | |||
+ | {{ expert: | ||
+ | Un extrait d'un dialogue "make oldconfig" | ||
+ | |||
+ | < | ||
+ | # CPU Frequency scaling | ||
+ | # | ||
+ | CONFIG_CPU_FREQ=y | ||
+ | CONFIG_CPU_FREQ_TABLE=y | ||
+ | # CONFIG_CPU_FREQ_DEBUG is not set | ||
+ | CONFIG_CPU_FREQ_STAT=m | ||
+ | # CONFIG_CPU_FREQ_STAT_DETAILS is not set | ||
+ | # CONFIG_CPU_FREQ_DEFAULT_GOV_PERFORMANCE is not set | ||
+ | # CONFIG_CPU_FREQ_DEFAULT_GOV_POWERSAVE is not set | ||
+ | # CONFIG_CPU_FREQ_DEFAULT_GOV_USERSPACE is not set | ||
+ | CONFIG_CPU_FREQ_DEFAULT_GOV_ONDEMAND=y | ||
+ | # CONFIG_CPU_FREQ_DEFAULT_GOV_CONSERVATIVE is not set | ||
+ | CONFIG_CPU_FREQ_GOV_PERFORMANCE=y | ||
+ | CONFIG_CPU_FREQ_GOV_POWERSAVE=m | ||
+ | CONFIG_CPU_FREQ_GOV_USERSPACE=m | ||
+ | CONFIG_CPU_FREQ_GOV_ONDEMAND=y | ||
+ | CONFIG_CPU_FREQ_GOV_CONSERVATIVE=m</ | ||
+ | Extrait d'un fichier de configuration. | ||
+ | |||
+ | Certaines options peuvent présenter une information supplémentaire en fonction de leur état de développement (et de stabilité) : **(NEW)** pour les options nouvelles (donc peu testées) mais qui ne devraient pas poser de problèmes, **(EXPERIMENTAL)** pour les options en cours de développement et qui ne devraient être utilisées que par des développeurs ou un public de testeurs conscients des risques encourus. Enfin certaines options portent le label explicite **(DANGEROUS)**, | ||
+ | Un mot sur les options sous la rubrique " | ||
+ | |||
+ | < | ||
+ | Le choix d'une interface de configuration n'a pas d' | ||
+ | |||
+ | Quelques exemples d' | ||
+ | |||
+ | " | ||
+ | |||
+ | {{: | ||
+ | |||
+ | |||
+ | Il existe des options de configuration rapide qui peuvent être pratiques : | ||
+ | |||
+ | * **make listnewconfig** permet de voir une liste de toutes les nouvelles options, et qui ne sont donc pas encore configurées dans le fichier de configuration. | ||
+ | |||
+ | * **make oldnoconfig** configure toutes les nouvelles options (voir ci-dessus) à " | ||
+ | | ||
+ | * **make localconfig** ne configure que les modules nécessaires à votre système, il faut parfois ajouter des modules pour les appareils connectés ponctuellement. C'est un bon point de départ pour un noyau minimal.\\ | ||
+ | \\ | ||
+ | |||
+ | |||
+ | ==Identifier son noyau avec " | ||
+ | |||
+ | Si vous désirez différencier clairement votre noyau vous pouvez lui assigner un suffixe personnalisé via la variable " | ||
+ | |||
+ | < | ||
+ | PATCHLEVEL = 16 | ||
+ | SUBLEVEL = 1 | ||
+ | EXTRAVERSION = -perso | ||
+ | NAME = Museum of Fishiegoodies</ | ||
+ | |||
+ | À noter que cet exemple est tiré d'un noyau réel (3.16.1), la variable " | ||
+ | |||
+ | ====Identifier son matériel==== | ||
+ | |||
+ | Pour choisir les options de configurations vous aurez besoin de connaître votre matériel, pour cela il y quelques commandes de base qu'il est utile de connaître : | ||
+ | |||
+ | < | ||
+ | $ lspci -nnv</ | ||
+ | |||
+ | La première commande met à jour la base de données des identifiants pci, la seconde liste avec des informations détaillées les périphériques pci présents. | ||
+ | |||
+ | < | ||
+ | $ lsusb -v</ | ||
+ | |||
+ | Comme précédemment mais pour les périphériques usb cette fois. | ||
+ | |||
+ | < | ||
+ | |||
+ | Vous renseigne sur votre processeur, son modèle et ses capacités (" | ||
+ | |||
+ | Le programme le plus polyvalent est peut-être " | ||
+ | |||
+ | < | ||
+ | |||
+ | vous renseignera de manière détaillé sur les périphériques réseaux présent sur votre machine. Pour connaître le liste des options lancez " | ||
+ | |||
+ | Voyez [[materiel: | ||
+ | |||
+ | Ces informations sont surtout importantes si vous souhaitez compiler un noyau minimal, avec uniquement les modules nécessaires à votre matériel et rien de plus. En dehors de cette approche vous compilerez sûrement bien plus que nécessaire sous forme de modules, laissant au noyau le soin de charger le nécessaire. | ||
+ | Il y a plusieurs raisons à vouloir limiter le nombre de modules au strict nécessaire, | ||
+ | |||
+ | ====Initrd (initramfs) ou pas ?==== | ||
+ | |||
+ | |||
+ | Les mêmes contraintes s' | ||
+ | Les distributions ont en général une démarche opposée, un nombre maximum de pilotes sont compilés en modules, et seront chargés à la demande, et un disque initial assure le démarrage avec une grande souplesse quant à la prise en charge du matériel (l' | ||
+ | Un exemple de choix déterminant en fonction de l' | ||
+ | |||
+ | < | ||
+ | |||
+ | |||
+ | ====La compilation==== | ||
+ | |||
+ | Si votre configuration est faite, vous pouvez passer à la compilation. Une simple commande suffit : | ||
+ | |||
+ | < | ||
+ | |||
+ | Ensuite il faut un peu de patience, d' | ||
+ | Attention, par défaut " | ||
+ | |||
+ | |||
+ | ====Installation==== | ||
+ | |||
+ | Votre noyau est prêt à être mis en place, l' | ||
+ | Heureusement il y a un script pour simplifier tout ça, il suffit de passer les commandes : | ||
+ | |||
+ | < | ||
+ | |||
+ | Vous devez utiliser des droits root pour cette étape, la seule du processus qui les nécessite. Un mot sur l' | ||
+ | |||
+ | ==== Appliquer un patch ==== | ||
+ | |||
+ | " | ||
+ | |||
+ | < | ||
+ | $ zcat patch-version_du_patch.gz | joe</ | ||
+ | |||
+ | Ici on utilise une redirection " | ||
+ | |||
+ | Un patch peut simplement avoir pour but de passer d'une révision (ou version) de noyau à la suivante, dans ce cas il évite de télécharger l' | ||
+ | |||
+ | **Appliquer un patch** n'a rien de difficile, mais il faut s' | ||
+ | |||
+ | Pour passer à la version 2.6.34 du noyau on appliquera au sources original de la version précédente (2.6.33) le patch " | ||
+ | |||
+ | Pour un patch compressé en " | ||
+ | < | ||
+ | ou pour un patch compressé en " | ||
+ | < | ||
+ | |||
+ | L' | ||
+ | |||
+ | La commande est à effectuer à l' | ||
+ | |||
+ | Donc de manière générale un patch 2.6.xx s' | ||
+ | < | ||
+ | |||
+ | À la fin du processus vous obtiendrez des sources 2.6.33 prêtes à recevoir un patch de version vers 2.6.34. | ||
+ | |||
+ | <note warning> | ||
+ | |||
+ | Comme souvent dans le monde GNU-Linux il y a plusieurs façons de faire la même chose, voici quelques autres possibilités pour appliquer un patch : | ||
+ | |||
+ | *Si le patch n'est pas compressé : | ||
+ | < | ||
+ | * Comme alternative à "gzip -cd" on peut utiliser " | ||
+ | * Comme alternative à "bzip2 -cd" on peut utiliser " | ||
+ | |||
+ | Un autre type de patch disponible est le patch de révision stable (" | ||
+ | |||
+ | Enfin on trouve les patchs " | ||
+ | |||
+ | < | ||
+ | $ cd ../ | ||
+ | $ mv linux-2.6.33.3/ | ||
+ | |||
+ | Les deux lignes qui suivent l' | ||
+ | |||
+ | Un dernier exemple avec un patch " | ||
+ | |||
+ | < | ||
+ | |||
+ | Cela ne suffit pas à avoir un noyau " | ||
+ | |||
+ | ==Des options pratiques, des erreurs== | ||
+ | |||
+ | " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | * " | ||
+ | | ||
+ | Pour les patcheurs en série les développeurs ont préparé **un script qui permet d' | ||
+ | |||
+ | < | ||
+ | |||
+ | Le premier point " | ||
+ | |||
+ | |||
+ | L' | ||
+ | |||
+ | Si vous avez déjà appliqué un patch, ou que vous cherchiez à l' | ||
+ | |||
+ | < | ||
+ | |||
+ | Cela signifie que les modifications que le patch doit effectuer ont été détectées comme déjà présentes dans les sources, dans ce cas le comportement par défaut est de passer en mode " | ||
+ | |||
+ | Si vous avez déjà utilisé les sources pour une compilation, | ||
+ | |||
+ | < | ||
+ | |||
+ | En cas d' | ||
+ | |||
+ | ==== À venir ==== | ||
+ | |||
+ | < | ||
+ | no init found | ||
+ | attempted to kill init! | ||
+ | waiting for root fs ... | ||
+ | unable to mount root fs</ | ||
+ | Un petit aperçu de ce à quoi on s' | ||
+ | |||
+ | Diagnostiquer les messages d' | ||
+ | |||
+ | |||
+ | ====Liens==== | ||
+ | |||
+ | * [[http:// | ||
+ | * [[http:// | ||
+ | * [[https:// | ||
+ | * [[http:// | ||
+ | * [[debian: | ||
+ | * [[opensuse: | ||
+ | * [[debian: | ||
+ | \\ | ||
+ | |||
+ | ---------------------------------------------------- | ||
+ | |||
+ | [[expert: | ||
+ | \\ | ||
+ | |||
+ | [[http:// |
expert/recompilation_noyau.txt · Dernière modification : 2018/11/17 12:53 de 127.0.0.1