Je souhaite mieux comprendre le processus d'initialisation de Linux afin de démarrer un système sur ceph plutôt que sur nfs.
Au cours du processus, j'ai rencontré deux formes de changement de racine. L'un appelé switch_root et l'autre appelé pivot_root. Ces scripts sont exécutés à partir d'un système de fichiers en mémoire (initramfs) obtenu via tftp à l'aide du processus de démarrage pxe.
Quand utiliseriez-vous l'un plutôt que l'autre ? J'ai vu les deux utilisés dans certains scripts d'initialisation placés à la racine.
Réponse acceptée :
J'ai trouvé une merveilleuse explication ici. Cependant, permettez-moi d'essayer de mettre dans un format plus court ce que j'ai compris dans la réponse.
Version plus courte
- Pendant que le système démarre, il a besoin d'un espace utilisateur précoce. Cela peut être
réalisé en utilisant initramfs ou initrd. - initrd est chargé dans le disque virtuel qui est un réel SYSTÈME DE FICHIERS .
- initramfs n'est pas un système de fichiers .
- Pour initrd
pivot_root
est utilisé et pour initramfsswitch_root
est utilisé.
Version plus longue
Passons maintenant à l'explication détaillée de ce que j'avais mis ci-dessus.
Bien qu'un initramfs et un initrd aient le même objectif, il y a
2 différences. La différence la plus évidente est qu'un initrd est
chargé dans un disque virtuel. Il se compose d'un système de fichiers réel (généralement
ext2) qui est monté sur un disque virtuel. Un initramfs, en revanche,
n'est pas un système de fichiers. Il s'agit simplement d'une archive cpio (compressée) (de type
newc) qui est décompressée dans un fichier tmpfs. Cela a pour effet secondaire de rendre
l'initramfs un peu plus optimisé et capable de se charger un peu
plus tôt dans le processus de démarrage du noyau qu'un initrd. De plus, la taille
des initramfs en mémoire est plus petite, car le noyau peut adapter la taille
des tmpfs à ce qui est réellement chargé, plutôt que de s'appuyer sur
des tailles de disque mémoire prédéfinies, et il peut également nettoyer la RAM qui était
utilisée alors que les disques RAM ont tendance à rester utilisés (en raison des détails de l'implémentation
de pivot_root).Il existe également une autre différence d'effet secondaire :la façon dont le périphérique racine (et
le passage à celui-ci) est géré. Puisqu'un initrd est un système de fichiers réel
décompressé dans la RAM, le périphérique racine doit en fait être le disque RAM. Pour
un initramfs, il existe un noyau "rootfs" qui devient le tmpfs dans lequel
l'initramfs est décompressé (si le noyau charge un initramfs ; si
ce n'est pas le cas, alors le rootfs est simplement le système de fichiers spécifié via le paramètre de démarrage du noyau root=
), mais ce rootfs intermédiaire ne doit pas
être spécifié comme paramètre de démarrage root=(et il n'y aurait aucun moyen de le faire, puisqu'aucun appareil n'y est connecté). Cela signifie que vous
pouvez toujours transmettre votre véritable périphérique racine au noyau lorsque vous utilisez un
initramfs. Avec un initrd, vous devez traiter vous-même quel est le véritable périphérique racine
. De plus, puisque le « vrai » périphérique racine avec un initrd
est le disque virtuel, le noyau doit vraiment basculer les périphériques racine d'un
périphérique réel (le disque virtuel) à l'autre (votre véritable racine). Dans le cas
d'un initramfs, l'espace initramfs (le tmpfs) n'est pas un vrai périphérique,
donc le noyau ne change pas de vrais périphériques. Ainsi, alors que la commande
pivot_root est utilisée avec un initrd, une commande différente doit être utilisée
pour un initramfs. Busybox fournit switch_root pour accomplir cela,
tandis que klibc propose new_root.