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?
la source
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?
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 root
de 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.
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.xz
fichier 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 :)
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]/.config
fichier, 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.gz
nouveau 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 config
programmes ci-dessous, vous .config
serez 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).
Créer une .config
uration.
[src]/.config
est 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 Y
par 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 config
est 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 oldconfig
est comme, make config
sauf que si vous avez déjà une .config
version 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 menuconfig
est 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 -dev
paquet 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 xconfig
est une interface graphique complète. Cela nécessite qmake
et le -dev
paquet 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 menuconfig
pour 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 ...
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/modules
du 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 M
option (= 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").
Construisez et installez le noyau.
La prochaine étape est facile. Pour faire le noyau, lancez simplement make
dans le [src]
répertoire. Si vous êtes sur un système multi-core, vous pouvez ajouter -j N
pour accélérer les choses, où N
est le nombre de noyaux que vous souhaitez dédier + 1. Il n'y a pas test
ou 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/modules
correspondant 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 install
installer 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]/boot
un fichier nommé bzImage
4 , où [ARCH]
est x86
si 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 /boot
et 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/modules
créé parmake modules_install
, qui comprendra la chaîne « version locale », par exemple System.map-3.13.3-mykernel
.
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_custom
fichier 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 linux
ligne, qui indique votre système de fichiers racine (celui avec /sbin/init
et /lib/modules
). La version UUID de cela est root=UUID=[the UUID]
.
Vous pouvez regarder votre existant /boot/grub2/grub.cfg
pour 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 menuentry
is a bonne idée). Vous pourrez le supprimer plus tard si tout se passe bien.
Vous pouvez également simplement insérer le menuentry
dans grub.cfg
directement, 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 .config
vous 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]/.config
sur 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.
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/source
et /lib/modules/X.X.X/build
le /usr/src
ré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 .h
fichiers /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).
Voici quelques ressources:
[src]/README
comprend un bref guide pour la construction et l'installation.
Le [src]/Documentation
ré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_install
nouveau. 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 modprobe
pour 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.
localmodconfig
et des outils comme lestreamline_config.pl
script; une approche utile pour travailler à partir de votre configuration existante ...initramfs
est 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é ...initramfs
Ce 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.