Le noyau entier est-il chargé en mémoire au démarrage?


14

J'ai lu ce document IBM populaire (je le vois référé assez souvent sur le web) expliquant la fonction du disque RAM initial.

J'ai heurté un mur en conceptualisant comment cela fonctionne.

Dans le doc, il est écrit

Le chargeur de démarrage, tel que GRUB, identifie le noyau à charger et copie cette image du noyau et tout initrd associé en mémoire

Je suis déjà confus: copie-t-il le noyau entier dans la mémoire ou seulement une partie de celui-ci? Si le noyau entier est en mémoire, alors pourquoi avons-nous même besoin du disque RAM initial?

Je pensais que le but d'initrd était de pouvoir avoir une petite image généralisée du noyau et initrd y installera les bons modules avant que l'image du noyau ne soit chargée. Mais si le noyau entier est déjà en mémoire, pourquoi avons-nous besoin d'initrd?

Cela soulève également une autre chose qui m'embrouille - où se trouvent les modules chargés dans le noyau? Tous les modules du noyau sont-ils stockés dans initrd?


Oui. Le noyau entier. Et ses premiers rootfs. Mais les noyaux Linux n'ont pas utilisé initrd depuis de nombreuses années.
mikeserv

Oui, je lisais ça. Son été largement remplacé par des initramfs non? Et c'est toujours un processus similaire avec initramfs correct?
user1028270

1
il a été complètement remplacé pour tous les noyaux depuis la série 2.6. Mais le processus est quelque peu similaire, sauf que initramfs n'est jamais démonté - c'est toujours là et c'est toujours root, aussi. Vous devez monter votre développeur racine dessus, en fait. Il y a aussi les avantages de ne pas avoir besoin d'émuler un dev de bloc séparé et similaire.
mikeserv

Cool, je vais lire cet article auquel vous avez lié. Les modules du noyau sont donc stockés dans les rootfs initramfs?
user1028270

1
@edwardtorvalds - c'est tout géré par udevgénéralement, et oui, automatiquement.
mikeserv

Réponses:


17

Le noyau entier est chargé en mémoire au démarrage, généralement avec un de initramfsnos jours. (Il est toujours possible de configurer un système pour démarrer sans, initramfsmais c'est inhabituel sur les ordinateurs de bureau et les serveurs.)

Le initramfsrôle est de fournir les fonctionnalités nécessaires pour monter les "vrais" systèmes de fichiers et continuer le démarrage du système. Cela implique des modules du noyau, ainsi que divers binaires: vous avez besoin d'au moins udev, peut-être de la mise en réseau, et kmodqui charge les modules.

Les modules peuvent être chargés dans le noyau après le démarrage, il n'y a donc pas de préparation spéciale du noyau par le initramfs. Ils peuvent être stockés n'importe où: le initramfs, /lib/modulessur le vrai système de fichiers, dans une arborescence de développement si vous développez un module ... Il initramfssuffit de contenir les modules nécessaires pour monter le système de fichiers racine (qui contient le reste).


OK, ça a du sens pour moi. Je pense que je confondais l'image du noyau et le système de fichiers qu'il utilise, qui sont évidemment totalement séparés.
user1028270

5

Le noyau entier (mais pas ses modules) sera chargé en mémoire. S'il y a des modules dont le noyau aura besoin avant que des systèmes de fichiers ne soient disponibles (cela signifie généralement les pilotes des systèmes de fichiers et de leurs périphériques), alors ces modules seront dans les initramfs (en mémoire), et le noyau les chargera à partir de là. D'autres modules peuvent être chargés ultérieurement à partir du système de fichiers.


3

Le noyau dans les configurations Linux modernes est fortement basé sur les modules, c'est-à-dire que le noyau proprement dit (chargé au démarrage dans la RAM) ne comprend que le strict minimum, tout le reste est compilé sous forme de modules (chargeable à l'exécution). Pour que cela fonctionne même lorsque, par exemple, les périphériques ou systèmes de fichiers requis pour le démarrage sont des modules, an initramfsest chargé avec le noyau (comme son nom l'indique, il s'agit d'une zone RAM avec un système de fichiers simple, monté au démarrage). Ce système de fichiers temporaire est monté sur /et contient des programmes de démarrage et les modules requis. Une fois le démarrage initramfsterminé, Linux exécute un pivot_root(8), montant le réel /et jetant le initramfscontenu.

Le point de cette complexité est que, par exemple, une distribution peut compiler un noyau (noyau minimal et ensemble complet de modules), et lors de l'installation du noyau, créer une version initramfsadaptée au matériel et à la configuration de la machine cible. Tout cela est nécessaire en raison de la grande variété d'appareils et de configurations des "ordinateurs personnels".


Ça ne marche pas pivot_root.
mikeserv
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.