¿Cuándo utilizarías pivot_root sobre switch_root?

19

Quiero comprender mejor el proceso de inicio de Linux para arrancar en red un sistema a través de ceph en lugar de nfs.

En el proceso me he encontrado con dos formas de cambiar de raíz. Uno llamado switch_root y el otro llamado pivot_root. Estas secuencias de comandos se ejecutan desde un sistema de archivos en memoria (initramfs) obtenido a través de tftp utilizando el proceso de arranque pxe.

¿Cuándo usarías uno sobre el otro? He visto ambos utilizados en algunos guiones de inicio colocados en la raíz.

Matt H
fuente

Respuestas:

16

Encontré una maravillosa explicación aquí . Sin embargo, permítanme tratar de poner un formato más corto de lo que entendí en la respuesta.

Versión más corta

  1. Mientras el sistema arranca, necesita un espacio de usuario temprano. Se puede lograr usando initramfs o initrd.
  2. initrd se carga en ramdisk, que es un SISTEMA DE ARCHIVO real .
  3. initramfs no es un sistema de archivos .
  4. Para initrd pivot_root se usa y para initramfs switch_root se usa.

Versión más larga

Ahora, a la explicación detallada de lo que había puesto arriba.

Si bien tanto un initramfs como un initrd tienen el mismo propósito, hay 2 diferencias. La diferencia más obvia es que un initrd se carga en un disco RAM. Consiste en un sistema de archivos real (típicamente ext2) que está montado en un disco ram. Un initramfs, por otro lado, no es un sistema de archivos. Es simplemente un archivo cpio (comprimido) (de tipo newc) que se descomprime en un tmpfs. Esto tiene el efecto secundario de hacer que initramfs sea un poco más optimizado y capaz de cargarse un poco antes en el proceso de arranque del kernel que un initrd. Además, el tamaño de los initramfs en la memoria es menor, ya que el núcleo puede adaptar el tamaño de los tmpfs a lo que realmente se carga, en lugar de depender de tamaños de disco ram predefinidos,

También hay otra diferencia de efectos secundarios: cómo se maneja el dispositivo raíz (y cómo cambiarlo). Dado que un initrd es un sistema de archivos real descomprimido en ram, el dispositivo raíz debe ser el disco ram. Para un initramfs, hay un kernel "rootfs" que se convierte en el tmpfs en el que se desempaqueta initramfs (si el kernel carga un initramfs; si no, entonces el rootfs es simplemente el sistema de archivos especificado a través del parámetro de arranque root = kernel), pero este rootfs provisional no debe especificarse como el parámetro root = boot (y no habría forma de hacerlo, ya que no hay ningún dispositivo conectado). Esto significa que aún puede pasar su dispositivo raíz real al núcleo cuando usa un initramfs. Con un initrd, debe procesar cuál es el dispositivo raíz real usted mismo. Además, desde lo "real" el dispositivo raíz con un initrd es el ramdisk, el núcleo realmente tiene que cambiar los dispositivos raíz de un dispositivo real (el ramdisk) al otro (su raíz real). En el caso de un initramfs, el espacio initramfs (tmpfs) no es un dispositivo real, por lo que el kernel no cambia dispositivos reales. Por lo tanto, mientras que el comando pivot_root se usa con un initrd, se debe usar un comando diferente para un initramfs. Busybox proporciona switch_root para lograr esto, mientras que klibc ofrece new_root. Se debe usar un comando diferente para un initramfs. Busybox proporciona switch_root para lograr esto, mientras que klibc ofrece new_root. Se debe usar un comando diferente para un initramfs. Busybox proporciona switch_root para lograr esto, mientras que klibc ofrece new_root.

Ramesh
fuente
2
Solía pivot_rooten el pasado para initramfs, switch_rootno existía en ese momento. switch_rootparece ser un método de conveniencia de pivot_rootla que hace un poco más de limpieza y también se mueve /proc /sysy /devetc, y no sólo la propia raíz
Daniel Alder
2
No puede usar pivot_root en un initramfs rootfs, obtendrá un argumento no válido. Solo puede pivotar sistemas de archivos reales.
TiCPU
@TiCPU Entonces, ¿cómo podría Linux salir del espacio de usuario inicial?
Melab
La solución proporcionada parece estar equivocada. El propio Linus dice que pivot_root () o chroot () solo cambiarán la referencia de los procesos actuales para /. Entonces, según tengo entendido, podría ser cualquier camino y no tiene nada que ver con los "discos" reales.
erikbwork