Configuration, compilation et installation d'un noyau Linux personnalisé

38

Je voudrais essayer d'utiliser un noyau autre que celui fourni par ma distribution - soit ailleurs, soit personnalisé. Est-ce difficile ou dangereux?

Où est-ce que je commence?

boucle d'or
la source

Réponses:

51

Construire un noyau personnalisé peut prendre beaucoup de temps - principalement dans la configuration, car les ordinateurs modernes peuvent le faire en quelques minutes - mais cela n’est pas particulièrement dangereux si vous conservez votre noyau actuel en état de fonctionnement et assurez-vous de le quitter. en option via votre chargeur de démarrage (voir l'étape 6 ci-dessous). De cette façon, si votre nouveau ne fonctionne pas, vous pouvez simplement redémarrer l'ancien.

Dans les instructions suivantes, les chemins dans l’arborescence des sources se présentent sous la forme suivante [src]/whatever: où se [src]trouve le répertoire dans lequel vous avez installé la source, par exemple /usr/src/linux-3.13.3. Vous voudrez probablement faire ce genre su rootde choses car l’arborescence source devrait rester sécurisée en termes d’autorisations en écriture (elle devrait appartenir à root).

Certaines étapes sont facultatives, mais vous devriez quand même les lire car elles contiennent des informations nécessaires à la compréhension du reste du processus.

  1. Téléchargez et décompressez l'archive source.

    Ceux-ci sont disponibles sur kernel.org . Les plus récentes sont répertoriées sur la page d'accueil, mais si vous regardez à l'intérieur du /pub/répertoire, vous trouverez une archive qui remonte à la version 1.0. Sauf si vous avez une raison particulière de faire autrement, vous feriez mieux de choisir simplement la "dernière écurie". Au moment d'écrire ces lignes, il s'agit d'un tar.xzfichier de 74 Mo.

    Une fois le fichier compressé téléchargé, vous devez le décompresser quelque part. La place normale est dans /usr/src. Placez le fichier là-bas et:

    tar -xJf linux-X.X.X.tar.xz
    

    Notez que les distributions individuelles recommandent généralement l’utilisation de l’un de leurs paquets sources à la place de l’arbre à la vanille. Celui-ci contient des correctifs spécifiques à la distribution, qui peuvent vous intéresser ou non. Cela correspondra également aux en-têtes du noyau utilisés pour compiler certains outils de l'espace utilisateur, même s'ils sont vraisemblablement identiques.

    En plus de 15 ans de construction de noyaux personnalisés (principalement sur Fedora / Debian / Ubuntu), je n'ai jamais eu de problème à utiliser le code source vanilla 1 . Cela ne fait toutefois pas beaucoup de différence, si ce n’est le fait que si vous voulez le tout dernier noyau, votre distribution ne l’a probablement pas encore emballé. Le chemin le plus sûr reste donc d’utiliser le paquet distro, qui devrait s’installer dans /usr/src. Je préfère la dernière écurie pour pouvoir jouer le rôle de cobaye avant qu'il ne soit intégré à la distribution :)

  2. Commencez avec une configuration de base [facultatif].

    Vous n'êtes pas obligé de faire cela - vous pouvez simplement plonger et créer une configuration à partir de rien. Cependant, si vous ne l'avez jamais fait auparavant, attendez -vous à beaucoup d'essais et d'erreurs. Cela signifie également que vous devez lire la plupart des options (il y en a des centaines). Un meilleur pari consiste à utiliser votre configuration existante, si disponible. Si vous avez utilisé un paquet source de la distribution, il contient probablement déjà un [src]/.configfichier, vous pouvez donc l'utiliser. Sinon, vérifiez a /proc/config.gz. Ceci est une fonctionnalité optionnelle ajoutée dans le noyau 2.6. S'il existe, copiez-le dans le niveau supérieur de l'arborescence source et gunzip -c config.gz > .config.

S'il n'existe pas, c'est peut-être parce que cette option a été configurée en tant que module. Essayez sudo modprobe configs, puis vérifiez /procà config.gznouveau le répertoire .

La configuration de la distribution n’est pas très idéale dans la mesure où elle inclut presque tous les pilotes matériels possibles. Cela n’affecte pas beaucoup les fonctionnalités du noyau, car ce sont des modules et la plupart d’entre eux ne seront jamais utilisés, mais cela augmente considérablement le temps nécessaire à la construction. Il est également gênant dans la mesure où il est nécessaire qu’initramfs contienne certains modules de base (voir l’étape 4 ci-dessous). Cependant, il s’agit probablement d’un meilleur point de départ que celui par défaut.

Notez que les options de configuration changent d’une version du noyau à l’autre, et que lorsque vous exécutez l’un des make configprogrammes ci-dessous, vous .configserez d’abord analysé et mis à jour pour correspondre à la nouvelle version. Si la configuration provient d'une version beaucoup plus ancienne, cela peut conduire à des résultats étranges, alors faites attention lorsque vous effectuez la configuration. Autant que je sache, cela ne fonctionnera pas du tout (en utilisant une configuration d'une version plus récente).

  1. Créer une .configuration.

    [src]/.configest un fichier texte utilisé pour configurer le noyau. Ne modifiez pas ce fichier directement . Changer d’options n’est souvent pas une simple question de remplacer un Ypar un N, etc. il existe généralement un ensemble d'interdépendances et de possibilités de ramification. A la place, vous souhaitez utiliser l'une des cibles de configuration du fichier makefile du noyau (à savoir, entrez make _____sur la ligne de commande du répertoire source de niveau supérieur):

    • make configest le plus fondamental mais probablement pas au goût de la plupart des gens. C'est une séquence de questions - beaucoup de questions - et si vous changez d'avis, vous devez recommencer.

    • make oldconfigest comme, make configsauf que si vous avez déjà une .configversion précédente, vous passerez des questions sauf celles concernant les nouvelles options. Il peut encore y en avoir beaucoup et la plupart d'entre elles ne vous intéresseront pas, alors encore une fois, je ne le recommande pas.

    • make menuconfigest ma méthode préférée (et je pense que la plupart des autres). Il construit et exécute une interface TUI (menus colorés qui fonctionneront sur un terminal). Cela nécessite que le -devpaquet pour ncurses soit installé. C'est assez explicite, à l'exception de la recherche qui est accessible via /; le F1 "aide" fournit une explication pour l'option en cours. Il existe une version alternative make nconfig, avec quelques fonctionnalités supplémentaires, dans laquelle F2 "syminfo" est l'équivalent de la F1 de menuconfig.

    • make xconfigest une interface graphique complète. Cela nécessite qmakeet le -devpaquet pour Qt être installé, car là encore, c'est un programme qui est compilé et construit. Si vous ne les utilisiez pas auparavant, le téléchargement pourrait être considérable. La raison menuconfigpour laquelle je préfère la version graphique est que les hiérarchies d’options sont présentées en utilisant des écrans successifs dans la première, mais ouverts en accordéon dans la seconde.

    Une des premières choses à faire (mais ce n’est pas obligatoire) est d’ajouter une chaîne "Version locale" (sous Configuration générale ). La raison en est mentionnée au n ° 5 ci-dessous.

    "Labyrinthine" est un bon moyen de décrire la hiérarchie des options, et entrer dans les détails avec cela va bien au-delà de la portée d'un Q & R comme celui-ci. Si vous voulez vous asseoir et tout parcourir, réservez des heures . Greg Kroah-Hartman (responsable du développement depuis longtemps pour le noyau Linux) a un livre en ligne gratuit sur le noyau (voir Références ci-dessous) qui contient un chapitre sur la configuration , bien qu'il ait été écrit en 2006. Mon conseil est de commencer avec une base raisonnable à partir de votre noyau de distribution actuel (comme indiqué en # 2), puis parcourez-le et décochez toutes les choses dont vous savez que vous n’avez pas besoin. Vous voudrez probablement aussi changer certaines options du "module" en "intégrées", ce qui nous amène à mon point suivant ...

  2. A propos de initramfs[facultatif]

    Un "initramfs" est un système de fichiers compressé intégré au noyau et / ou chargé au démarrage. Son objectif principal est d'inclure les modules dont le noyau aura besoin avant de pouvoir accéder à ceux /lib/modulesdu système de fichiers racine - par exemple, les pilotes du périphérique contenant ce système de fichiers. Distros les utilise toujours partiellement, car les pilotes sont incompatibles et ne peuvent donc pas tous être intégrés au noyau. Celles qui conviennent au système actuel sont sélectionnées depuis l’intérieur du fichier initramfs.

    Cela fonctionne bien et ne représente aucun inconvénient, mais c'est probablement une complication inutile lors de la construction de votre propre noyau. 2 Le problème, c'est que si vous n'utilisez pas initramfs, vous devez vous assurer que les pilotes de votre système de fichiers racine (et du périphérique sur lequel il est installé) sont intégrés au noyau. In menuconfig, c'est la différence entre une Moption (= module) et une option *(= intégrée). Si vous n'obtenez pas ce droit, le système échouera tôt dans le processus de démarrage. Ainsi, par exemple, si vous avez un disque dur SATA et un système de fichiers racine Ext4, vous avez besoin de pilotes pour ces fonctions intégrées. [Si quelqu'un peut penser à autre chose qui est un must-have, laissez un commentaire et je vais l'incorporer ici].

    Si vous souhaitez utiliser un initramfs, vous devez sélectionner les options appropriées dans la configuration générale . Il y a un guide squelette à la création d' un construit dans le noyau en [src]/Documentation/filesystems/ramfs-rootfs-initramfs.txt, mais notez que les distros ne le font pas; ils utilisent un fichier cpio externe compressé. Cependant, cette documentation contient une discussion de ce qui devrait être dans le initramfs(voir "Contenu d’initramfs").

  3. Construisez et installez le noyau.

    La prochaine étape est facile. Pour faire le noyau, lancez simplement makedans le [src]répertoire. Si vous êtes sur un système multi-core, vous pouvez ajouter -j Npour accélérer les choses, où Nest le nombre de noyaux que vous souhaitez dédier + 1. Il n'y a pas testou check. Une fois que c'est fait, vous pouvez make modules. Sur une boîte rapide, tout cela devrait prendre <10 minutes.

    Si tout va bien, make INSTALL_MOD_STRIP=1 modules_install. Cela créera un répertoire /lib/modulescorrespondant au numéro de version du noyau plus la chaîne "Version locale" mentionnée à l'étape 3, le cas échéant. Si vous n'avez pas utilisé de chaîne "Version locale", faites attention si vous avez déjà un noyau de la même version dont vous dépendez , car ces modules les remplaceront. 3 INSTALL_MOD_STRIP=1 est facultatif, pour la signification, voir ici .

    Vous pouvez ensuite make installinstaller le noyau dans un emplacement par défaut. Ma recommandation, cependant, est de le faire vous-même pour vous assurer qu'aucun fichier existant ne soit écrasé. Recherchez dans [src]/arch/[ARCH]/bootun fichier nommé bzImage4 , où [ARCH]est x86si vous êtes sur un ordinateur x86 ou x86-64 (et quelque chose d'autre si vous êtes sur quelque chose d'autre). Copiez cela dans /bootet renommez-le en quelque chose de plus spécifique et informatif (peu importe quoi). Faites la même chose avec [src]/System.map, mais renommez-le selon le schéma suivant:

    System.map-[VERSION]
    

    Ici, [VERSION]est exactement le même que le nom du répertoire /lib/modulescréé parmake modules_install , qui comprendra la chaîne « version locale », par exemple System.map-3.13.3-mykernel.

  4. Configurez le chargeur de démarrage GRUB 2.

    Si vous n'utilisez pas grub(la majorité des utilisateurs de bureau Linux le sont), cela ne s'applique évidemment pas à vous. Vous devriez avoir un /etc/grub.d/40_customfichier avec pas grand chose dedans. Si ce n'est pas le cas, créez-le appartenant à root et chmod 755(il doit être exécutable). Ajoutez à cela:

    menuentry 'My new kernel, or whatever' {
        set root='hd0,1'
        linux /boot/[name-of-kernel] root=/dev/sda1 [other kernel options]
    }
    

    Si vous utilisez un initramfs, vous devriez également avoir une dernière ligne initrd /path/to/initramfs. Attention à la set root=ligne. L'exemple suppose que grub a été installé sur la première partition du premier disque dur (hd0,1). Si vous avez plusieurs lecteurs, vous pouvez utiliser l’UUID de la partition à la place et remplacer cette ligne par:

        search --no-floppy --fs-uuid --set=root [the UUID of the partition]
    

    À moins que grub ne se trouve pas sur votre système de fichiers racine, cela devrait également correspondre à la root=directive sur la linuxligne, qui indique votre système de fichiers racine (celui avec /sbin/initet /lib/modules). La version UUID de cela est root=UUID=[the UUID].

    Vous pouvez regarder votre existant /boot/grub2/grub.cfgpour un indice sur le nom de l'appareil. Voici un bref guide sur ce type de larve 2. Une fois que vous êtes heureux, lancez grub2-mkconfig -o /boot/grub2/grub.cfg(mais sauvegardez d’abord votre actuel grub.cfg). Vous voudrez peut-être ensuite modifier ce fichier et déplacer votre entrée en haut. Il devrait toujours contenir une liste pour votre ancien noyau (en cours d’exécution), et votre distribution pourrait avoir un mécanisme qui dupliquerait automatiquement une entrée pour le nouveau noyau (car elle a été trouvée dans /boot; Fedora le fait, par conséquent, en utilisant un titre distinct avec menuentryis a bonne idée). Vous pourrez le supprimer plus tard si tout se passe bien.

    Vous pouvez également simplement insérer le menuentrydans grub.cfgdirectement, mais certaines distributions l’écraseront lorsque leur noyau sera mis à jour (alors que l’utilisation /etc/grub.d/le gardera intégré).

    C'est ça. Tout ce que vous devez faire maintenant est de redémarrer. Si cela ne fonctionne pas, essayez de déduire le problème de la sortie d'écran, redémarrez en choisissant un ancien noyau et revenez à l'étape 3 (sauf utilisez le que .configvous avez déjà et ajustez-le). Ce peut être une bonne idée d’entre make clean(ou make mrproper) entre les tentatives, mais assurez-vous d’abord de copier [src]/.configsur une sauvegarde, car elle sera effacée. Cela permet de s'assurer que les objets utilisés dans le processus de construction ne sont pas périmés.

  5. En ce qui concerne les en-têtes de noyau et. Al.

    Une chose que vous devriez probablement faire est symlink ( ln -s -i) /lib/modules/X.X.X/sourceet /lib/modules/X.X.X/buildle /usr/srcrépertoire où se trouve l’arborescence source (conservez-la). Cela est nécessaire pour que certains outils de l'espace utilisateur (et les installateurs de pilotes tiers) puissent accéder à la source du noyau en cours d'exécution.

    Un problème lié à cela concerne les .hfichiers /usr/include, etc. Ceux-ci changent très progressivement et sont compatibles avec les versions antérieures . Vous avez deux choix:

    • Laissez ceux utilisés par votre distribution. Si vous mettez régulièrement à jour l'ensemble du système, la distribution en installera de temps en temps de nouveaux. Il s'agit donc de l'option "moins compliquée".

    • Utilisez make headers_install.

    Comme ils sont rétrocompatibles (ce qui signifie qu'un programme construit avec une bibliothèque C utilisant des en-têtes de noyau plus anciens doit s'exécuter sur un noyau plus récent), vous n'avez pas à vous inquiéter à ce sujet. Le seul problème potentiel serait si vous construisez un noyau personnalisé et le garder pendant un certain temps, au cours de laquelle la distro met à jour le paquet « kernel-headers » à une nouvelle version que celles utilisées pour construire votre noyau, et il se révèle être un peu incompatibilité (qui ne s'appliquerait qu'aux logiciels compilés ultérieurement à partir des sources).

Les références

Voici quelques ressources:

  • [src]/README comprend un bref guide pour la construction et l'installation.

  • Le [src]/Documentationrépertoire contient de nombreuses informations pouvant être utiles lors de la configuration.

  • Une grande partie du livre Linux Kernel in a Nutshell de Greg KH (disponible gratuitement en tant que série de fichiers PDF) concerne la construction du noyau.

  • Grub 2 a un manuel en ligne .


1. "Vanille" fait référence à la source officielle originale, telle que trouvée sur kernel.org. La plupart des distributions utilisent cette source de vanille et ajoutent quelques personnalisations mineures.

2. Notez que dans certaines circonstances, il faut un initramfs, car un espace utilisateur est nécessaire pour monter le système de fichiers racine, par exemple, s'il est chiffré ou réparti sur une matrice RAID complexe.

3. Toutefois, cela ne supprimera pas les modules déjà présents si vous ne les avez pas construits, ce qui signifie que vous pourrez ajouter un module ultérieurement en modifiant simplement votre configuration et en l'exécutant à make modules_installnouveau. Notez que la construction de certains modules peut nécessiter des modifications du noyau lui-même, auquel cas vous devez également remplacer le noyau. Vous serez en mesure de dire quand vous essayez d'utiliser modprobepour insérer le module.

4. Ce fichier peut porter un nom différent si vous avez utilisé une option de compression non standard. Je ne suis pas sûr de toutes les possibilités.

boucle d'or
la source
3
Upvote. Vous voudrez peut-être ajouter une mention localmodconfiget des outils comme le streamline_config.plscript; une approche utile pour travailler à partir de votre configuration existante ...
jasonwryan
1
Ceci est probablement suffisamment détaillé pour être une question de type canonique par initiative de @ terdon. Envisagez de fournir une réponse à sa question sur les méta. Ou je pourrais, si vous préférez. Il semble que ce soit peut-être l'intention, puisque vous avez quand même posé la question. Inclure des méthodes spécifiques à la distribution pour la construction de paquets binaires serait également utile, à mon avis.
Faheem Mitha
1
FYI: initramfsest censé être utilisé presque toujours. Par exemple, configurer rootfs sur LVM + RAID en nécessite souvent un. La racine cryptée le fait certainement. Même les configurations RAID raisonnablement compliquées le font. L'assemblage automatique dans le noyau de tableaux même triviaux est en réalité déconseillé ...
derobert
2
@derobert: Cela pose la question que "presque toujours" Linux est utilisé pour faire fonctionner un serveur d'entreprise. initramfsCe que je veux dire, c’est que si vous n’avez pas besoin d’en utiliser un, vous n’avez pas à le faire et cela simplifie le processus. Quoi qu'il en soit, j'ai ajouté une note de bas de page sur les racines cryptées, etc.
goldilocks
Veuillez inclure des détails sur la fonctionnalité efi-stub d’EFI et de Linux.
IW16