NOMBRE¶
pivot_root - 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.
pivot_root es específica de Linux y por tanto no portable.
HISTORIA¶
pivot_root fue introducida en Linux 2.3.41.
VÉASE TAMBIÉN¶
chdir(2),
chroot(2),
initrd(4),
pivot_root(8),
stat(2)