Provided by: manpages-de-dev_2.16-1_all bug

BEZEICHNUNG

       pivot_root - die Wurzeleinhängung ändern

ÜBERSICHT

       int pivot_root(const char *neue_Wurzel, const char *alte_Wurzel);

       Hinweis: Es gibt keinen Glibc-Wrapper für diesen Systemaufruf; siehe ANMERKUNGEN.

BESCHREIBUNG

       pivot_root()   changes  the  root mount in the mount namespace of the calling process. More precisely, it
       moves the root mount to the directory put_old and makes new_root the new root mount. The calling  process
       must have the CAP_SYS_ADMIN capability in the user namespace that owns the caller's mount namespace.

       pivot_root()   changes  the root directory and the current working directory of each process or thread in
       the same mount namespace to new_root if they point to the old root directory. (See also  NOTES.)  On  the
       other hand, pivot_root()  does not change the caller's current working directory (unless it is on the old
       root directory), and thus it should be followed by a chdir("/") call.

       Die folgenden Einschränkungen gelten:

       -  Neue_Wurzel und alte_Wurzel müssen Verzeichnisse sein.

       -  Die  neue_Wurzel  und  die  alte_Wurzel  dürfen sich nicht in der gleichen Einhängung wie die aktuelle
          Wurzel befinden.

       -  Die alte_Wurzel muss sich unterhalb  der  neuen_Wurzel  befinden,  das  heißt,  Hinzufügen  einer  von
          nicht-negativen  Anzahl  von  /..  zum  Pfadnamen,  der  auf  die  alte_Wurzel zeigt, muss das gleiche
          Verzeichnis wie die neue_Wurzel ergeben.

       -  Neue_Wurzel muss ein Pfad zu einem Einhängepunkt sein, aber darf nicht "/" sein. Ein Pfad,  der  nicht
          bereits ein Einhängepunkt ist, kann umgewandelt werden, indem er auf sich selbst bind-eingehängt wird.

       -  Der  Ausbreitungstyp  von  neue_Wurzel  und  seiner  Elterneinhängung  dürfen  nicht  MS_SHARED  sein;
          entsprechend falls alte_Wurzel ein bestehender Einhängepunkt  ist,  darf  sein  Ausbreitungstyp  nicht
          MS_SHARED  sein.  Diese  Einschränkungen stellen sicher, dass pivot_root() niemals Änderungen in einen
          anderen Einhänge-Namensraum ausbreitet.

       -  Das aktuelle Wurzelverzeichnis muss ein Einhängepunkt sein.

RÜCKGABEWERT

       Bei Erfolg wird Null zurückgegeben. Bei  einem  Fehler  wird  -1  zurückgegeben  und  errno  entsprechend
       gesetzt.

FEHLER

       pivot_root()  kann  jeden  der  von stat(2) zurückgegebenen Fehler zurückgeben. Zusätzlich kann Folgendes
       zurückgegeben werden:

       EBUSY  Die neue_Wurzel oder die alte_Wurzel sind in der aktuellen Wurzeleinhängung. (Dieser Fehler  deckt
              den pathologischen Fall ab, wenn die neue_Wurzel "/" ist.)

       EINVAL neue_Wurzel ist kein Einhängepunkt.

       EINVAL Die alte_Wurzel ist nicht in oder unterhalb der neuen_Wurzel.

       EINVAL Das aktuelle Wurzelverzeichnis ist kein Einhängepunkt (wegen eines früher ausgeführten chroot(2)).

       EINVAL Die aktuelle Wurzel ist auf dem Rootfs (anfänglichen Ramfs-)Dateisystem; siehe ANMERKUNGEN.

       EINVAL Entweder  der Einhängepunkt unter neue_Wurzel oder die Elterneinhängung dieses Einhängepunktes hat
              den Ausbreitungstyp MS_SHARED.

       EINVAL alte_Wurzel ist ein Einhängepunkt und der Ausbreitungstyp ist MS_SHARED.

       ENOTDIR
              neue_Wurzel oder alte_Wurzel ist kein Verzeichnis.

       EPERM  Der aufrufende Prozess verfügt nicht über die CAP_SYS_ADMIN-Capability.

VERSIONEN

       pivot_root() wurde in Linux 2.3.41 eingeführt.

KONFORM ZU

       pivot_root() ist Linux-spezifisch und daher nicht portierbar.

ANMERKUNGEN

       Glibc stellt keinen Wrapper für diesen Systemaufruf bereit; rufen Sie ihn mittels syscall(2) auf.

       Eine Befehlszeilenschnittstelle für diesen Systemaufruf wird durch pivot_root(8) bereitgestellt.

       pivot_root()  allows the caller to switch to a new root filesystem while at the same time placing the old
       root mount at a location under new_root from where it can subsequently be unmounted. (The  fact  that  it
       moves  all processes that have a root directory or current working directory on the old root directory to
       the new root frees the old root directory of users, allowing the old root  mount  to  be  unmounted  more
       easily.)

       Der typische Anwendungsfall von pivot_root() ist während des Systemstarts, wenn das System ein temporäres
       Wurzeldateisystem  einhängt,  zum  Beispiel  ein  initrd(4).  Danach  wird  das  reale  Wurzeldateisystem
       eingehängt und eventuell in die aktuelle Wurzel aller relevanten Prozesse  und  Threads  verwandelt.  Ein
       moderner  Anwendungsfall  ist  die  Einrichtung  eines  Wurzeldateisystems  während  der  Erzeugung eines
       Containers.

       The fact that pivot_root()  modifies process root and current working directories in the manner noted  in
       DESCRIPTION  is  necessary  in  order to prevent kernel threads from keeping the old root mount busy with
       their root and current working directories, even if they never access the filesystem in any way.

       Das Rootfs (anfängliche Ramfs) kann  nicht  mittels  pivot_root  erreicht  werden.  Die  in  diesem  Fall
       empfohlene  Methode zur Änderung des Wurzeldateisystems ist das Löschen sämtlicher Inhalte im Rootfs, das
       Rootfs mit der neuen Wurzel übereinzuhängen, stdin/stdout/stderr an das neue /dev/console anzuhängen  und
       das neue init(1) auszuführen. Helferprogramme für diesen Prozess existieren: siehe switch_root(8).

   pivot_root(".", ".")
       Neue_Wurzel  und  alte_Wurzel  können  das  gleiche  Verzeichnis  sein. Die folgende Sequenz erlaubt eine
       Pivot-Root-Aktion, ohne dass ein temporäres Verzeichnis angelegt und wieder entfernt werden muss:

           chdir(neue_Wurzel);
           pivot_root(".", ".");
           umount2(".", MNT_DETACH);

       This sequence succeeds because the pivot_root()  call stacks the old root mount point on top of  the  new
       root  mount point at /. At that point, the calling process's root directory and current working directory
       refer to the new root mount point (new_root). During the subsequent  umount()  call,  resolution  of  "."
       starts  with  new_root  and  then moves up the list of mounts stacked at /, with the result that old root
       mount point is unmounted.

   Geschichtliches
       Viele Jahre lang enthielt diese Handbuchseite den folgenden Text:

              pivot_root() kann die aktuelle Wurzel  und  das  aktuelle  Arbeitsverzeichnis  von  Prozessen  und
              Threads  ändern,  welche  das  alte  Wurzelverzeichnis  nutzen, muss dies aber nicht. Der Prozess,
              welcher pivot_root() aufruft,  muss  sicherstellen,  dass  Prozesse  mit  Wurzel-  oder  aktuellem
              Arbeitsverzeichnis  in  jedem Fall korrekt arbeiten. Ein einfacher Weg hierzu ist die Änderung von
              Wurzel- und aktuellem Arbeitsverzeichnis auf die neue_Wurzel, bevor pivot_root() aufgerufen wird.

       Dieser Text, der geschrieben wurde, bevor, die Implementierung  des  Systemaufrufs  im  Kernel  überhaupt
       abgeschlossen  war,  beabsichtigte  seinerzeit  möglicherweise,  die  Benutzer  zu  warnen, dass sich die
       Implementation bis zur finalen Veröffentlichung ändern könnte. Jedoch ist das im  Abschnitt  BESCHREIBUNG
       angegebene  Verhalten  seit  der  Erstveröffentlichung dieses Systemaufrufs konsistent geblieben und wird
       sich nun nicht ändern.

BEISPIEL

       Das   untenstehende   Programm   beschreibt   die   Verwendung   von   pivot_root()    innerhalb    eines
       Einhängenamensraums,   der   mit   clone(2)   erstellt  wurde.  Nach  dem  »Pivoten«  zu  dem  im  ersten
       Befehlszeilenargument  des  Programms  benannten  Wurzelverzeichnis  führt  der  mit  clone(2)   erzeugte
       Kindprozess das in den übrigen Befehlszeilenargumenten benannte Programm aus.

       We demonstrate the program by creating a directory that will serve as the new root filesystem and placing
       a copy of the (statically linked) busybox(1)  executable in that directory.

           $ mkdir /tmp/rootfs
           $ ls -id /tmp/rootfs    # Inode-Anzahl des neuen Wurzelverzeichnisses zeigen
           319459 /tmp/rootfs
           $ cp $(which busybox) /tmp/rootfs
           $ PS1='bbsh$ ' sudo ./pivot_root_demo /tmp/rootfs /busybox sh
           bbsh$ PATH=/
           bbsh$ busybox ln busybox ln
           bbsh$ ln busybox echo
           bbsh$ ln busybox ls
           bbsh$ ls
           busybox  echo     ln       ls
           bbsh$ ls -id /          # Mit der Inode-Anzahl oben vergleichen
           319459 /
           bbsh$ echo 'Hallo Welt'
           Hallo Welt

   Programmquelltext

       /* pivot_root_demo.c */

       #define _GNU_SOURCE
       #include <sched.h>
       #include <stdio.h>
       #include <stdlib.h>
       #include <unistd.h>
       #include <sys/wait.h>
       #include <sys/syscall.h>
       #include <sys/mount.h>
       #include <sys/stat.h>
       #include <limits.h>

       #define errExit(Nachricht)    do { perror(Nachricht); exit(EXIT_FAILURE); \
                               } while (0)

       static int
       pivot_root(const char *neue_Wurzel, const char *alte_Wurzel)
       {
           return syscall(SYS_pivot_root, neue_Wurzel, alte_Wurzel);
       }

       #define STACK_SIZE (1024 * 1024)

       static int              /* Startfunktion für geklontes Kind */
       child(void *arg)
       {
           char **args = arg;
           char *neue_Wurzel = args[0];
           const char *alte_Wurzel = "/altes_Wurzeldateisystem";
           char path[PATH_MAX];

           /* Ensure that 'new_root' and its parent mount don't have
              shared propagation (which would cause pivot_root() to
              return an error), and prevent propagation of mount
              events to the initial mount namespace */

           if (mount(NULL, "/", NULL, MS_REC | MS_PRIVATE, NULL) == 1)
               errExit("mount-MS_PRIVATE");

           /* Sicherstellen, dass 'neue_Wurzel' ein Einhängepunkt ist */

           if (mount(neue_Wurzel, neue_Wurzel, NULL, MS_BIND, NULL) == -1)
               errExit("mount-MS_BIND");

           /* Ein Verzeichnis anlegen, zu dem die alte Wurzel »pivoted« wird */

           snprintf(path, sizeof(path), "%s/%s", neue_Wurzel, alte_Wurzel);
           if (mkdir(path, 0777) == -1)
               errExit("mkdir");

           /* Und das Wurzeldateisystem »pivoten« */

           if (pivot_root(neue_Wurzel, Pfad) == -1)
               errExit("pivot_root");

           /* Das aktuelle Arbeitsverzeichnis auf »/« ändern */

           if (chdir("/") == -1)
               errExit("chdir");

           /* Die alte Wurzel aushängen und den Einhängepunkt entfernen*/

           if (umount2(put_old, MNT_DETACH) == -1)
               perror("umount2");
           if (rmdir(put_old) == -1)
               perror("rmdir");

           /* Den in argv[1] … angegebenen Befehl ausführen */

           execv(args[1], &args[1]);
           errExit("execv");
       }

       int
       main(int argc, char *argv[])
       {
           /* Einen Kindprozess in einem neuen Einhängenamensraum erzeugen */

           char *stack = malloc(STACK_SIZE);
           if (stack == NULL)
               errExit("malloc");

           if (clone(child, stack + STACK_SIZE,
                       CLONE_NEWNS | SIGCHLD, &argv[1]) == -1)
               errExit("clone");

           /* Elternprozess fällt bis hierher durch; wartet auf Kindprozess */

           if (wait(NULL) == -1)
               errExit("wait");

           exit(EXIT_SUCCESS);
       }

SIEHE AUCH

       chdir(2), chroot(2), mount(2), stat(2), initrd(4), mount_namespaces(7), pivot_root(8), switch_root(8)

KOLOPHON

       Diese  Seite  ist  Teil  der  Veröffentlichung  5.03  des Projekts Linux-man-pages. Eine Beschreibung des
       Projekts, Informationen, wie Fehler gemeldet werden können sowie die aktuelle Version dieser Seite finden
       sich unter https://www.kernel.org/doc/man-pages/.

ÜBERSETZUNG

       Die deutsche Übersetzung dieser Handbuchseite wurde von Mario Blättermann  <mario.blaettermann@gmail.com>
       und Helge Kreutzmann <debian@helgefjell.de> erstellt.

       Diese  Übersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer
       bezüglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG übernommen.

       Wenn Sie Fehler in der Übersetzung dieser  Handbuchseite  finden,  schicken  Sie  bitte  eine  E-Mail  an
       <debian-l10n-german@lists.debian.org>.

Linux                                            2. August 2019                                    PIVOT_ROOT(2)