Wann würden Sie pivot_root über switch_root verwenden?

19

Ich möchte den Linux-Init-Prozess besser verstehen, um ein System über ceph anstatt über nfs zu starten.

Dabei bin ich auf zwei Arten des Root-Wechsels gestoßen. Einer heißt switch_root, der andere pivot_root. Diese Skripte werden von einem In-Memory-Dateisystem (initramfs) ausgeführt, das über tftp mithilfe des pxe-Startprozesses abgerufen wurde.

Wann würden Sie eins übereinander verwenden? Ich habe gesehen, dass beide in einigen Init-Skripten verwendet werden, die in root abgelegt sind.

Matt H
quelle

Antworten:

16

Ich habe hier eine wunderbare Erklärung gefunden . Lassen Sie mich jedoch versuchen, das, was ich in der Antwort verstanden habe, in einem kürzeren Format wiederzugeben.

Kürzere Version

  1. Während das System startet, benötigt es einen frühen Benutzerbereich. Dies kann entweder mit initramfs oder initrd erreicht werden.
  2. initrd wird in die Ramdisk geladen, bei der es sich um ein tatsächliches Dateisystem handelt .
  3. initramfs ist nicht ein Dateisystem .
  4. Für initrd pivot_root wird verwendet und für initramfs switch_root wird verwendet.

Längere Version

Nun zu der detaillierten Erklärung dessen, was ich oben angegeben hatte.

Während sowohl ein initramfs als auch ein initrd den gleichen Zweck erfüllen, gibt es zwei Unterschiede. Der offensichtlichste Unterschied ist, dass eine initrd in eine Ramdisk geladen wird. Es besteht aus einem tatsächlichen Dateisystem (normalerweise ext2), das auf einer Ramdisk gemountet ist. Ein initramfs hingegen ist kein Dateisystem. Es ist einfach ein (komprimiertes) cpio-Archiv (vom Typ newc), das in ein tmpfs entpackt wird. Dies hat den Nebeneffekt, dass die initramfs etwas optimiert werden und im Kernel-Boot-Prozess etwas früher geladen werden können als eine initrd. Außerdem ist die Größe der initramfs im Speicher kleiner, da der Kernel die Größe der tmpfs an das tatsächlich Geladene anpassen kann, anstatt sich auf vordefinierte Ramdisk-Größen zu verlassen.

Es gibt noch einen weiteren Nebenwirkungsunterschied: Wie wird mit dem Root-Gerät (und dem Wechsel zu ihm) umgegangen? Da es sich bei einer initrd um ein in RAM entpacktes Dateisystem handelt, muss das Root-Gerät tatsächlich die RAM-Disk sein. Für ein initramfs gibt es einen Kernel "rootfs", der zum tmpfs wird, in das das initramfs entpackt wird (wenn der Kernel ein initramfs lädt; wenn nicht, dann ist das rootfs einfach das über den root = kernel-Boot-Parameter angegebene Dateisystem), aber Dieses vorläufige rootfs sollte nicht als root = boot-Parameter angegeben werden (und es gibt keine Möglichkeit, dies zu tun, da kein Gerät daran angeschlossen ist). Dies bedeutet, dass Sie Ihr echtes Root-Gerät bei Verwendung eines initramfs weiterhin an den Kernel übergeben können. Mit einer initrd müssen Sie das eigentliche Root-Gerät selbst verarbeiten. Auch seit dem "echten" Root-Gerät mit einer initrd ist die Ramdisk, der Kernel muss wirklich Root-Geräte von einem realen Gerät (der Ramdisk) zum anderen (Ihrem realen Root) wechseln. Im Fall eines initramfs ist der initramfs-Space (der tmpfs) kein echtes Gerät, so dass der Kernel keine echten Geräte wechselt. Während also der Befehl pivot_root mit einem initrd verwendet wird, muss für ein initramfs ein anderer Befehl verwendet werden. Busybox bietet dazu switch_root, klibc new_root. für ein initramfs muss ein anderer befehl verwendet werden. Busybox bietet dazu switch_root, klibc new_root. für ein initramfs muss ein anderer befehl verwendet werden. Busybox bietet dazu switch_root, klibc new_root.

Ramesh
quelle
2
Ich habe pivot_rootin der Vergangenheit für initramfs verwendet, switch_rootgab es damals noch nicht. switch_rootscheint eine bequeme Methode zu sein, pivot_rootdie mehr aufräumt und sich auch bewegt /proc /sysund so weiter /devund nicht nur die Wurzel selbst
Daniel Alder
2
Sie können pivot_root nicht für ein initramfs-rootfs verwenden, Sie erhalten ein ungültiges Argument. Sie können nur echte Dateisysteme pendeln.
TiCPU
@TiCPU Wie würde Linux dann den frühen Benutzerbereich verlassen?
Melab
Die bereitgestellte Lösung scheint falsch zu sein. Linus selbst sagt, dass pivot_root () oder chroot () nur die aktuelle Prozessreferenz für ändern /. Nach meinem Verständnis kann es sich also um einen beliebigen Pfad handeln, der nichts mit tatsächlichen "Festplatten" zu tun hat.
Erikbwork