pivot_root(2) cambia el sistema de ficheros raíz

SINOPSIS

#include <linux/unistd.h>

_syscall2(int,pivot_root,const char *,new_root,const char *,put_old)

int pivot_root(const char *new_root, const char *put_old);

DESCRIPCIÓN

pivot_root mueve el sistema de ficheros raíz del proceso actual al directorio put_old y establece el nuevo sistema de ficheros raíz para el proceso actual en new_root.

El uso habitual de pivot_root es durante la puesta en marcha del sistema, cuando el sistema monta un sistema de ficheros raíz temporal (p.e un initrd), monta el sistema de ficheros raíz real, y finalmente convierte al último en el sistema raíz para todos los procesos o hilos importantes.

pivot_root puede o no cambiar el directorio raíz actual y el directorio de trabajo actual (cwd) de cualquier proceso o hilo que use el directorio raíz antiguo. El invocador de pivot_root debe asegurarse de que los procesos que tengan como directorio raíz o de trabajo actual el antiguo directorio raíz funcionen correctamente en ambos casos. Una manera sencilla de asegurar ésto es cambiar su directorio raíz y de trabajo actual a new_root antes de invocar a pivot_root.

La explicación en el párrafo de arriba no es muy completa ya que la implementación de pivot_root puede cambiar en el futuro. En el momento de escribir este documento, pivot_root cambia el directorio raíz y de trabajo actual de cada proceso o hilo a new_root si apuntan al antiguo directorio raíz. Ésto es necesario para impedir que los hilos del núcleo mantengan el antiguo directorio raíz ocupado con su directorio raíz y de trabajo actual, incluso cuando nunca acceden al sistema de ficheros de ninguna manera. En el futuro, puede haber un mecanismo para que los hilos del núcleo renuncien explícitamente a cualquier acceso al sistema de ficheros, tal mecanismo intrusivo puede ser eliminado de pivot_root.

Observe que ésto también se aplica al proceso actual: pivot_root puede o no afectar a su directorio de trabajo actual. Se recomienda por tanto llamar a chdir("/") inmediatamente después de pivot_root.

Las siguientes restricciones se aplican a new_root y put_old:

-
Deben ser directorios.
-
new_root y put_old no deben estar en el mismo sistema de ficheros que el directorio raíz actual.
-
put_old debe estar debajo de new_root, es decir, añadir un número distinto de cero de /.. a la cadena apuntada por put_old debe resultar el mismo directorio que new_root.
-
Ningún otro sistema de ficheros puede estar montado en put_old.

Véase también pivot_root(8) para ejemplos adicionales de uso.

Si el directorio raíz actual no es un punto de montaje (p.e. después de chroot(2) o pivot_root, véase también abajo), el punto de montaje de ese sistema de ficheros es montado en put_old, no el antiguo directorio raíz.

OBSERVACIONES

new_root no tiene que ser un punto de montaje. En este caso, /proc/mounts mostrará el punto de montaje del sistema de ficheros que contiene a new_root como directorio raíz (/).

VALOR DEVUELTO

En caso de éxito, se devuelve cero. En caso de error, se devuelve -1, y se modifica errno con el valor apropiado.

ERRORES

pivot_root puede devolver (en errno) cualquierda de los errores devueltos por stat(2). Adicionalmente, puede devolver:

EBUSY
new_root o put_old están en el sistema de ficheros raíz actual, o ya hay un sistema de ficheros montado en put_old.
EINVAL
put_old no está debajo de new_root.
ENOTDIR
new_root o put_old no es un directorio.
EPERM
El proceso actual no tiene la capacidad de administrador.

FALLOS

pivot_root no tendría que cambiar el directorio raíz y de trabajo actual de todos los otros procesos del sistema.

Algunos de los usos más oscuros de pivot_root pueden llevar rápidamente a la locura.

CONFORME A

pivot_root es específica de Linux y por tanto no portable.

HISTORIA

pivot_root fue introducida en Linux 2.3.41.