Que se passe-t-il à chaque étape du processus de construction du noyau Linux?

27

J'ai lu de nombreux didacticiels sur la façon de créer des noyaux personnalisés et de démarrer Ubuntu à l'aide de ces noyaux, et j'ai suivi avec succès les guides et les noyaux personnalisés démarrés, mais je ne comprends pas ce que font chacune des commandes des guides et ce qui se passe réellement avec chaque commande.

La procédure décrite sur le site d'Ubuntu fait beaucoup de travail avec fakeroot, dpkg, make-kpkg, certains initramfs, et d' autres choses horribles que les œuvres mais simplement ne me aide pas à comprendre ce qui se passe.

  • Quelle est la sortie de makedans un répertoire du noyau Linux?
  • Crée-t-il une "image de noyau compressée"?
  • Quel est le nom du fichier "image du noyau compressé" et où est-il placé?
  • Que fait make modules-il?
  • Doit make modulesêtre fait avant ou après make?
  • Ne makeconstruit pas mes modules automatiquement?
  • Quel est le processus (en anglais, pas seulement la liste des commandes) pour ajouter des noyaux nouvellement construits à la liste des noyaux amorçables?
  • Que fait make install-il?
  • L' make installajoutera- t- il à ma liste de noyaux amorçables pour que je n'ai plus rien à faire?
  • Y a-t-il un équivalent make modules_install?
AnkurVj
la source
Cela devrait être divisé en plusieurs questions.
Ciro Santilli 新疆 改造 中心 法轮功 六四 事件

Réponses:

34

Du haut...

  • makecompile et lie l'image du noyau. Il s'agit d'un seul fichier nommé vmlinuz.
  • make modulescompile des fichiers individuels pour chaque question à laquelle vous avez répondu Mpendant la configuration du noyau. Le code objet est lié à votre noyau fraîchement construit. (Pour les réponses aux questions Y, celles-ci font déjà partie vmlinuzet pour les réponses aux questions, Nelles sont ignorées).
  • make installinstalle votre noyau intégré dans /vmlinuz.
  • make modules_installinstalle vos modules du noyau dans /lib/modulesou /lib/modules/<version>.

Quant à l'ajouter à la liste des noyaux disponibles, cela est pris en charge par le chargeur de démarrage. C'est différent pour chaque chargeur de démarrage, mais grubc'est le plus courant sur x86 et amd64 donc je vais le décrire. C'est en fait assez simple. Grub regarde dedans /, /bootet /lib/modulespour tout ce qui ressemble à ça pourrait être un noyau fonctionnel et l'ajoute. Et oui, c'est une description trop simplifiée.

Ce "truc horrible" supplémentaire dans la documentation Ubuntu est un truc supplémentaire pour créer un debpaquet. Lorsque vous le faites pour plus que vous, il est préférable de le conditionner. Vous basculerez dans le temps.

La construction du noyau et des modules est conservée séparément, car pour les personnes qui en ont besoin (c'est-à-dire les développeurs du noyau), elles n'apportent souvent des modifications qu'à un module. Ils peuvent appliquer leurs modifications, reconstruire et installer uniquement les modules. Cela fait gagner beaucoup de temps quand il faut le faire 20 fois par jour. Il ne sera jamais mis à jour pour avoir une seule make everythingcommande. Au lieu de cela, exécutez make && make modules && make install && make modules_install comme la documentation le dit . Le processus de construction favorise les développeurs du noyau, pas vous. Et c'est comme ça que ça devrait être.

En réalité, il n'y a presque aucune raison pour quiconque, sauf les développeurs de noyau ou les conditionneurs de distribution, de compiler un noyau. Dans presque toutes les circonstances, la fonctionnalité de noyau que vous souhaitez a déjà été conçue pour vous et est disponible dans l'un des noyaux pré-emballés. Il y a des exceptions, mais elles sont extrêmement rares de nos jours.

Non pas que je vous décourage de créer votre propre noyau, je vous encourage en fait à le faire. Je pense que la construction de votre noyau à partir de zéro est une pratique inestimable pour apprendre comment tout cela fonctionne là-bas. En partie, parce que peut-être un jour vous serez l'exception qui doit le faire. Mais cela vous apprend également beaucoup sur le noyau et le processus de démarrage en général. Vous serez une meilleure personne pour l'avoir fait.

bahamat
la source
1
Merci beaucoup pour la description lisible par l'homme du processus. J'ai quelques doutes. Ma compilation du noyau a produit vmlinux et non vmlinuz. Je pense que la différence est la compression. Dois-je compresser l'image manuellement? Un /vmlinuzrépertoire se trouve-t-il dans le dossier racine? quand je fais une installation, ce répertoire sera-t-il créé et un nouveau noyau y sera-t-il placé? Est-ce que make modules_installremplacer mes modules installés? Supposons que je place mon vmlinux dans le répertoire / boot, dois-je faire autre chose (comme éditer les fichiers de configuration grub et faire grub-update ou quelque chose après ça?)
AnkurVj
3
Vous avez raison, la différence est la compression. C'est la commande make bzimagequi fait ça. /vmlinuzest un fichier binaire, pas un répertoire. Je ne fabrique que des noyaux packagés depuis environ 5 ans, donc je ne me souviens pas exactement du comportement d' modules_installun noyau directement installé. Grub trouvera votre noyau /bootsans aide. Oui, vous devez toujours exécuter grub-updateaprès l'installation d'un nouveau noyau.
bahamat
donc j'aurais dû faire à la make bzimageplace de make? Dois-je faire un make cleanet make bzimageencore? En /vmlinuzvoulez - vous dire le fichier sera créé dans le répertoire racine ou dans le répertoire source du noyau Linux?
AnkurVj
1
Peu importe que votre noyau soit compressé ou non. Non compressé, il prend juste un peu plus d'espace disque. Tout ce qui /est préfixé est un chemin absolu, donc oui, c'est un fichier à la racine.
bahamat
1
@GuyAvraham Les modules répondus Ysont compilés en (c'est-à-dire qu'ils font partie de vmlinuz). Les modules répondus Msont compilés en modules chargeables. Les modules répondus Nne sont pas compilés. make modules_installne s'applique qu'à ceux qui ont répondu M.
bahamat