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.