web-dev-qa-db-fra.com

Comment Linux charge-t-il l'image'IdRD '?

J'ai essayé de comprendre le processus de démarrage, mais il y a juste une chose qui va au-dessus de ma tête ..

Dès que le noyau Linux a été démarré et le système de fichiers racine (/) montés, les programmes peuvent être exécutés et d'autres modules du noyau peuvent être intégrés pour fournir des fonctions supplémentaires. Pour monter le système de fichiers racine, certaines conditions doivent être remplies. Le noyau a besoin des pilotes correspondant pour accéder au périphérique sur lequel le système de fichiers racine se trouve (en particulier les pilotes SCSI). Le noyau doit également contenir le code nécessaire pour lire le système de fichiers (ext2, ReiserFS, romfs, etc.). Il est également concevable que le système de fichiers racine est déjà chiffré. Dans ce cas, un mot de passe est nécessaire pour monter le système de fichiers.

Le disque virtuel initial (également appelé initdisk ou initrd) permet de résoudre précisément les problèmes décrits ci-dessus. Le noyau Linux fournit une possibilité d'avoir un petit système de fichiers chargé à un RAM disque et les programmes en cours d'exécution là-bas avant que le système de fichiers racine réelle est monté. Le chargement de initrd est assurée par le chargeur de démarrage (GRUB, LILO, etc.). chargeurs de démarrage seulement besoin routines BIOS pour charger des données à partir du support de démarrage. Si le chargeur de démarrage est en mesure de charger le noyau, il peut également charger le disque virtuel initial. pilotes spéciaux ne sont pas nécessaires.

Si/boot n'est pas une autre partition, mais il est présent dans la partition /, puis ne doit pas le chargeur de démarrage nécessite les pilotes SCSI pour accéder à l'image " initrd " et l'image du noyau? Si vous ne pouvez accéder aux images directement, alors pourquoi exactement nous avons besoin des pilotes SCSI ??

14
rpthms

Nigher, je vais essayer de répondre à votre question, mais pour une description plus complète du processus de démarrage, essayez article IBM .

Ok, je suppose que vous utilisez GRUB ou grub2 comme votre chargeur de démarrage pour explication. Tout d'abord, lorsque BIOS accède à votre disque pour charger le chargeur de démarrage, il utilise ses routines intégrées pour Accès au disque, qui sont stockés dans la célèbre interruption 13H.LoLoader (et le noyau de la phase de configuration) utilisent ces routines lorsqu'ils accèdent le disque. Notez que le BIOS fonctionne en mode de processeur en mode réel (16 bits), il ne peut donc pas aborder plus de 2 ^ 20 octets de RAM (2 ^ 20 pas 2 ^ 16 car chaque adresse en mode réel est composée de décalage SEGm_Address * 16 +, où l'adresse de segment et le décalage sont de 16 bits , voir http://fr.wikipedia.org/wiki/x86_memory_sersation ). Ainsi, ces routines ne peuvent donc pas accéder à plus d'une mib de RAM, ce qui est une limitation stricte et un inconvénient majeur.

BIOS charge le code de démarrage de démarrage à partir du MBR - les premiers 512 octets de votre disque et l'exécute. Si vous utilisez Grub, ce code est GRUB Étadition 1. Ce code Loads GRUB Étape 1.5, situé soit dans les 32 premiers kib Espace, appelé région de compatibilité DOS ou à partir d'une adresse fixe du système de fichiers. Il n'a pas besoin de comprendre le système de fichiers pour le faire, car, même l'étape 1.5 est dans le système de fichiers, c'est un code "brut" et peut être directement chargé vers RAM et exécuté: - http://www.pixelbeat.org/docs/disk/ . Chargement de l'étage1.5 du disque à RAM Utilisez des routines d'accès au disque BIOS.

enter image description here

Stage1.5 contient les utilitaires du système de fichiers, de sorte qu'il puisse lire la stade2 du système de fichiers (Eh bien, il utilise toujours le BIOS 13H pour lire du disque à la RAM, mais il peut désormais déchiffrer des informations de système de fichiers sur INODES, etc. et obtenir le code brut hors de la disque). Les bioses plus anciennes pourraient ne pas être en mesure d'accéder à l'ensemble de la HD en raison des limitations de leur mode d'adressage de disque - elles peuvent utiliser un système de secteur de la tête de cylindre, incapable d'aborder plus que le premier 8 GiB d'espace disque : http://fr.wikipedia.org/wiki/cylinder-head-sector .

Étagère2 Charge le noyau In RAM (à nouveau, à l'aide des utilitaires de disque BIOS). S'il s'agit de 2,6 ans et plus de noyau, il est également composé d'initiation dans l'intérieur, donc pas besoin de charger C'est un noyau plus âgé, le chargeur de démarrage chargait également une image intite autonome dans la mémoire, de sorte que le noyau puisse le monter et obtenir des pilotes pour le montage du système de fichiers réel à partir du disque.

Le problème est que le noyau (et le ramdisk) pèse plus d'une mib, ainsi de les charger dans RAM Vous devez charger le noyau à 1 mib, puis passer au mode protégé (32 bits), Déplacez le noyau chargé en mémoire haute (libérer la première mib pour le mode réel), puis retournez à nouveau sur le mode Real (16 bits), obtenez à nouveau RamDisk à partir du disque sur 1 mib (s'il s'agit d'un noyau initrd et plus ancien séparé), éventuellement commutateur. À nouveau protégé (32 bits), mettez-le à l'endroit où il appartient, revenez éventuellement en mode réel (ou non: https://stackoverflow.com/questions/4821911/DOES-GRUB-SWITCH-A- Mode protégé ) et exécutez le code du noyau. AVERTISSEMENT: Je ne suis pas tout à fait sûr de la minutie et de la précision de cette partie de la description.

Maintenant, Lorsque vous exécutez enfin le noyau, vous l'avez déjà et que Ramdisk est chargé dans RAM par bootloader, le noyau peut donc utiliser des utilitaires de disque de Ramdisk pour vous monter Véritable système de fichiers racine et racine de pivot. Les pilotes RAMFS sont présents dans le noyau, il peut donc comprendre le contenu de InitiMRAMFS, bien sûr.

21
Boris Burkov

Je crois, cela se résume à ce qui comporte des supports de bootloader particuliers. Par exemple. Il n'est pas nécessaire de connaître un système de fichiers particulier de votre partition combinée (boot + root). Dans ce cas, vous venez de créer une partition de démarrage distincte à condition de telle sorte qu'il fonctionne avec votre chargeur de démarrage, et toute autre complexité de la monté de votre partition racine est laissée sur le noyau et l'image initiale amorçée à partir de la partition de démarrage. BootLoader sait comment accéder aux périphériques SCSI (et d'autres périphériques également, selon le chargeur de démarrage utilisé) soit en utilisant ses propres pilotes ou en utilisant des routines de BIOS. De plus, il sait lire certains systèmes de fichiers, etc.

Considérer par exemple. Offre de démarrage de l'UEFI, où réellement le micrologiciel de l'UEFI sait déjà accéder à la partition EFI, lisez-la et chargez le noyau Linux à partir de là sans besoin d'un chargeur de démarrage intermédiaire. Dans ce cas, l'image Linux vit séparée de la partition racine et du micrologiciel UEFI n'a pas besoin de connaître tous les systèmes de fichiers exotiques pour y accéder. Je crois que la séparation des images "Boot" de la partition "racine" a beaucoup de sens. Sinon, pour quoi que ce soit d'autre, c'est une nécessité lors de la configuration du cryptage des systèmes de fichiers racines.

1
Miroslav Koškár

Juste pour l'enregistrement, si un chargeur de démarrage n'est pas charger initrd, il est intéressant de tester un autre chargeur de démarrage; Je viens de courir dans une situation comme --- ceci Lorsque Lilo ignorait silencieusement une initiale de taille moyenne correctement spécifiée (<4 Mo; Rootfs Sing Ext4 sur un SATA SSD; GPT) et GRUB 2.00 a réussi.

Le processus de démarrage s'est terminé rapidement avec un typique

RAMDISK: Couldn't find valid RAM disk image starting at 0.
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(8,3)
0
Michael Shigorin