J'essaie de comprendre le processus de démarrage d'une machine dans son ensemble à partir du moment où vous appuyez sur le bouton d'alimentation. Il y a ce morceau du chargeur de démarrage à l'étape initramfs que je ne comprends pas très bien parmi d'autres petits bits.
Compte tenu de cette configuration Grub pour une entrée, tirée d'une récente installation par défaut d'Ubuntu:
insmod gzio
insmod part_msdos
insmod ext2
set root='(hd0,msdos1)'
search --no-floppy --fs-uuid --set=root 96fb7310-5adb-4f66-bf59-04acd08d76a3
echo 'Loading Linux x.y.z ...'
linux /vmlinuz-x.y.z root=/dev/mapper/some-device-name ro nomodeset
echo 'Loading initial ramdisk ...'
initrd /initrd.img-x.y.z
Qu'est-ce que cela fait réellement en termes d'état du système et de mémoire? Je comprends que la tâche de Grub est de "charger et exécuter le noyau" et qu'il possède son propre ensemble de modules pour accéder aux fichiers sur les périphériques (ou réseau) pour y accéder. Dans l'exemple ici insmod
s, set root
et search
- mais c'est juste du point de vue de Grub, et non partagé avec le noyau, non?
Je suppose également que Grub charge (une copie?) Du noyau dans la mémoire ( linux
commande ) et le lance pour démarrer l'exécution. (deux étapes différentes apparemment - alors, comment?) Les paramètres donnés peuvent être lus dans le noyau et interprétés (est-ce une grosse chaîne mappée en mémoire quelque part?) et fournir les options pour organiser les choses demandées.
Je vois également cette initrd
option. Cela pointe vers mes initramfs compressés par gzip, nécessaires pour démarrer le périphérique racine réel spécifié par root=
. Mais comment ces initramfs sont-ils fournis au noyau? Il ne reçoit aucune adresse mémoire à l'endroit où il peut le charger, ni ne peut y accéder lui-même, car il est déjà chargé avant le démarrage du noyau. Certaines documentations du noyau indiquent que ce «périphérique» du système de fichiers initramfs est accessible via /dev/ram0
, mais je ne vois pas comment il devient un fichier de périphérique accessible pour commencer. Il se passe quelque chose sous l'eau que je ne vois pas, je suppose.
Je ne vois pas non plus comment cela se rapporte aux autres chargeurs de démarrage, y compris les plates-formes intégrées, par exemple en utilisant U-boot / Coreboot. Est-ce que cela fait la même chose que Grub (mêmes adresses mémoire standard?) Et dans quelle mesure cela se compare-t-il à Grub en ce qui concerne le chargement du noyau / initrd?
Juste pour être clair sur mes questions, je pense que je comprends pourquoi les différentes étapes de démarrage existent et quelles transitions ont lieu, mais je ne vois pas comment elles se déroulent et quelles sont les responsabilités exactes de chacune des étapes. J'ai l'impression de manquer une "norme" à laquelle tout se résume.
J'apprécierais quelques explications à ce sujet.
la source
boot
commande implicite à la fin de la séquence. Je ne sais pas exactement ce qu'il fait dans Grub, mais si vous utilisez la ligne de commande Grub pour entrer ces commandes manuellement, vous devezboot
ou il restera assis pour toujoursgrub>
(ou du moins, jusqu'à ce que vous vous ennuyiez et éteignez l'ordinateur ). Les commandes précédentes configurent "simplement" un environnement.boot
va faire sauter le CPU à l'adresse du noyau chargé (démarrer l'exécution). Pour une entrée de menu, cela est implicitement défini. voyez ça .Réponses:
En général, il doit y avoir une sorte de protocole car il ne suffit généralement pas de charger un fichier en mémoire et de sauter à un emplacement spécifique, mais vous devez soit passer des arguments supplémentaires comme les paramètres du noyau, c'est-à-dire accéder aux arguments memdisk depuis DOS .
Comme cela dépend du matériel (le bras est différent de x86 par exemple), vous devez trouver les informations correctes, consultez cet article sur le bras de démarrage ou le protocole de démarrage Linux / x86 pour quelques exemples.
la source
Le chargeur de démarrage stocke l'initrd dans un emplacement en mémoire et indique au noyau l'adresse mémoire de l'image initrd. La plupart des systèmes Linux modernes utilisent le schéma initramfs utilisant dracut , qui est en fait une archive cpio (plutôt qu'une image disque) qui est décompressée dans un système de fichiers tmpfs créé par le noyau peu de temps après l'exécution.
la source