web-dev-qa-db-fra.com

Comment un noyau montez-t-il la partition racine?

Ma question est en ce qui concerne le démarrage d'un système Linux à partir d'une partition distincte/de démarrage. Si la plupart des fichiers de configuration sont situés sur une partition distincte/séparée, comment le noyau le montez-en correctement au démarrage?

Toute élaboration sur ce serait bien. Je me sens comme si je me manque quelque chose de base. Je suis principalement préoccupé par le processus et l'ordre des opérations.

Merci!

EDIT: Je pense que ce dont j'avais besoin de demander était davantage dans les lignes du fichier DEV qui est utilisé dans le paramètre de noyau racine. Par exemple, disons que je donne mon mot root en tant que root =/dev/sda2. Comment le noyau a-t-il une cartographie du fichier/dev/sda2?

30
Mr. Shickadance

Linux bottes initialement avec un ramdisk (appelé initrd, pour "Ramdisk initial") comme /. Ce disque suffit simplement à trouver la partition racine réelle (y compris les modules de conducteur et de système de fichiers requis). Il monte la partition racine sur un point de montage temporaire sur le initrd, puis invoque pivot_root(8) pour échanger les points de montage root et temporaire, en laissant le initrd dans une position à être umountéd et le système de fichiers racine actuel sur /.

20
geekosaur

Dans les temps anciens, le noyau était codé dur pour connaître le périphérique majeur/le nombre mineur de la racine FS et monté ce dispositif après l'initialisation de tous les pilotes de périphérique, qui ont été construits dans le noyau. L'utilitaire rdev pourrait être utilisé pour modifier le numéro de périphérique racine dans l'image du noyau sans avoir à le recompiler.

Finalement, les chargeurs de démarrage sont venus et pourraient passer une ligne de commande au noyau. Si la root= L'argument a été passé, qui a dit au noyau où la racine FS était au lieu de la valeur intégrée. Les conducteurs nécessaires pour accéder à cela encore devaient être construits dans le noyau. Tandis que l'argument ressemble à un noeud de périphérique normal dans le /dev répertoire, il n'y a évidemment pas /dev Répertoire Avant que la racine FS soit monté, le noyau ne peut pas rechercher un nœud de dev. Au lieu de cela, certains noms de périphérique bien connus sont codés durs dans le noyau afin que la chaîne puisse être traduite au numéro de périphérique. Pour cette raison, le noyau peut reconnaître des choses comme /dev/sda1, mais pas plus de choses exotiques comme /dev/mapper/vg0-root ou un volume UUID.

Plus tard, le initrd est entré dans la photo. Outre le noyau, le chargeur de démarrage chargerait l'image initrd, qui était une image de système de fichiers compressé (image Gzipped ext2, image ROMFS Gzipped, Squashfs est enfin devenu dominant). Le noyau décompresserait cette image dans un ramdisk et montez le ramdisk comme la racine FS. Cette image contenait des pilotes supplémentaires et des scripts de démarrage au lieu d'un vrai init. Ces scripts de démarrage ont effectué diverses tâches pour reconnaître le matériel, activer des éléments tels que les matrices RAID et LVM, détecter les uuides et analyser la ligne de commande du noyau pour trouver la racine réelle, qui pourrait maintenant être spécifiée par UUID, étiquette de volume et autres choses avancées. Il a ensuite monté la vraie racine FS en /initrd, puis exécuté le pivot_root Appel système pour que le noyau Swap / et /initrd, puis exécutant /sbin/init sur la vraie racine, qui démonterait alors /initrd et libérer le ramdisk.

Enfin, aujourd'hui, nous avons le initramfs. Ceci est similaire au initrd, mais au lieu d'être une image de système de fichiers compressé qui est chargée dans un RAMDISK, il s'agit d'une archive CPIO compressée. Un TMPFS est monté comme une racine et l'archive y est extraite. À la place d'utiliser pivot_root, qui était considéré comme un hack sale, les scripts initramfs montent la racine réelle de /root, supprimez tous les fichiers de la racine TMPFS, puis chroot dans /root, et exec /sbin/init.

43
psusi

On dirait que vous demandez comment le noyau "savoir" quelle partition est la partition racine, sans accès aux fichiers de configuration sur/etc.

Le noyau peut accepter des arguments de ligne de commande comme n'importe quel autre programme. Grub, ou la plupart des autres chargeurs de démarreurs peuvent accepter des arguments de ligne de commande comme entrée d'utilisateur ou les stocker et effectuer diverses combinaisons d'arguments de ligne de commande disponibles via un menu. Le chargeur de démarrage transmet les arguments de la ligne de commande au noyau lorsqu'il le charge (je ne connais pas le nom ou la mécanique de la présente convention, mais il est probablement similaire à la manière dont une application reçoit des arguments de ligne de commande d'un processus d'appel dans un noyau en cours d'exécution).

Une de ces options de ligne de commande est root, où vous pouvez spécifier le système de fichiers racine, c'est-à-dire root=/dev/sda1.

Si le noyau utilise un initrd, le chargeur de démarrage est responsable du rachat du noyau où il se trouve, ou de mettre l'initial dans un emplacement de mémoire standard (je pense) - c'est au moins la façon dont il fonctionne sur mon gouruplug.

Il est tout à fait possible de ne pas spécifier une, puis de disposer de votre panique de noyau immédiatement après avoir démarré qu'il ne trouve pas de système de fichiers racine.

Il pourrait y avoir d'autres moyens de transmettre cette option au noyau.

3
LawrenceC

Grub monte le /boot Partition et exécute ensuite le noyau. Dans la configuration de Grub, il indique au noyau que d'utiliser comme périphérique racine.

Par exemple dans la grub menu.lst:

kernel /boot/linux root=/dev/sda2
1
jonescb

C'mon, GRUB ne "mont pas" ne "montez pas"/démarrage, il lit simplement "menu.lst" et certains modules, il ne fait pas partie du noyau Linux non plus. Quand vous appelez le noyau , vous passerez une argument "racine" avec la partition racine. Au pire, le noyau sait que juste/boot a été monté (lol).

Suivant: Geekosaure a raison, Linux utilise un premier ramdisk dans le format d'image comprimé, puis monte le système de fichiers racine réel en appelant pivot_root. Donc, Linux commence à fonctionner d'une image, puis à partir de votre lecteur de disque local.

1
D4RIO

Le chargeur de démarrage, que ce soit grub ou lilo ou quoi que ce soit, raconte le noyau où regarder avec le root= Drapeau et charte éventuellement une mémoire RAMDISK initiale dans la mémoire via initrd avant de démarrer le noyau.

Le noyau se charge ensuite, teste ses pilotes de matériel et de périphérique et regarde autour du système de ce qu'il peut voir (vous pouvez consulter cette information de diagnostic en tapant dmesg; de nos jours, il est probablement trop rapide pour voir) alors tente des tentatives monter la partition mentionnée dans le root= Paramètre.

Si un Initial est présent, il est monté d'abord et tous les modules/pilotes de périphérique sur elle sont chargés et sondés avant que le système de fichiers racine ne soit monté. De cette façon, vous pouvez compiler les pilotes pour vos disques durs en tant que modules et pour toujours pouvoir démarrer.

1
Shadur