Quand utiliseriez-vous pivot_root sur switch_root?

19

Je veux mieux comprendre le processus d'initialisation Linux afin de démarrer un système via ceph plutôt que nfs.

Dans le processus, je suis tombé sur 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 en utilisant le processus de démarrage pxe.

Quand utiliseriez-vous l'un sur l'autre? J'ai vu les deux utilisés dans certains scripts d'initialisation placés en racine.

Matt H
la source

Réponses:

16

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

  1. Alors 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.
  2. initrd est chargé dans ramdisk qui est un SYSTÈME DE FICHIERS réel .
  3. initramfs n'est pas un système de fichiers .
  4. Pour initrd pivot_root est utilisé et pour initramfs switch_root est utilisé.

Version plus longue

Maintenant, pour l'explication détaillée de ce que j'avais mis ci-dessus.

Bien qu'un initramfs et un initrd servent le même but, 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, d'autre part, 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 tmpfs. Cela a pour effet secondaire de rendre les initramfs un peu plus optimisés et capables 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 virtuel prédéfinies,

Il existe également une autre différence d'effets secondaires: 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 ram, le périphérique racine doit en fait être le ramdisk. Pour un initramfs, il y a un noyau "rootfs" qui devient le tmpfs dans lequel les initramfs sont décompressés (si le noyau charge un initramfs; sinon, le rootfs est simplement le système de fichiers spécifié via le paramètre de démarrage root = kernel), mais ce rootfs intérimaire ne doit pas être spécifié comme paramètre root = boot (et il n'y aurait aucun moyen de le faire, car il n'y a pas de périphérique attaché). 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 ce que le véritable périphérique racine est vous-même. De plus, puisque le "vrai" le périphérique racine avec un initrd est le ramdisk, le noyau doit vraiment basculer les périphériques racine d'un périphérique réel (le ramdisk) à l'autre (votre vraie 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. une commande différente doit être utilisée pour un initramfs. Busybox fournit switch_root pour accomplir cela, tandis que klibc propose new_root. une commande différente doit être utilisée pour un initramfs. Busybox fournit switch_root pour accomplir cela, tandis que klibc propose new_root.

Ramesh
la source
2
J'ai utilisé pivot_rootdans le passé pour les initramfs, switch_rootn'existait pas à l'époque. switch_rootsemble être une méthode pratique pivot_rootqui fait un peu plus de nettoyage et se déplace également /proc /sys, /devetc. et pas seulement la racine elle
Daniel Alder
2
Vous ne pouvez pas utiliser pivot_root sur un rootfs initramfs, vous obtiendrez un argument non valide. Vous ne pouvez faire pivoter que de vrais systèmes de fichiers.
TiCPU
@TiCPU Alors, comment Linux quitterait-il l'espace utilisateur précoce?
Melab
La solution proposée semble erronée. Linus lui-même dit que pivot_root () ou chroot () ne fera que changer la référence actuelle des processus pour /. Donc, d'après ma compréhension, cela pourrait être n'importe quel chemin et n'a rien à voir avec de véritables "disques".
erikbwork