Scroll to navigation

PIVOT_ROOT(2) Linux-Programmierhandbuch PIVOT_ROOT(2)

BEZEICHNUNG

pivot_root - die Dateisystemwurzel ä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 verschiebt die Dateisystemwurzel des aktuellen Prozesses in das Verzeichnis alte_Wurzel und macht neue_Wurzel zur neuen Dateisystemwurzel.

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

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.

Der vorige Absatz ist absichtlich etwas ungenau, da sich die Implementation von pivot_root() in der Zukunft ändern kann. Zum Zeitpunkt der Erstellung dieses Dokuments ändert pivot_root() das Wurzel- und Arbeitsverzeichnis jedes Prozesses oder Threads auf die neue_Wurzel, falls diese auf das alte Wurzelverzeichnis zeigen. Dies ist notwendig, damit die Kernel-Threads nicht das alte Wurzelverzeichnis weiterhin mit ihrem alten Wurzel- und Arbeitsverzeichnis belegen, selbst wenn sie in keiner Weise auf das Dateisystem zugegriffen haben. In der Zukunft könnte ein neuer Mechanismus bewirken, dass die Kernel-Threads auf jeglichen Zugriff auf das Dateisystem verzichten, so dass dieser recht unsichere alte Mechanismus aus pivot_root() entfernt werden kann.

Beachten Sie, dass sich das auch auf den aufrufenden Prozess auswirkt: pivot_root() kann sein aktuelles Arbeitsverzeichnis ändern, muss aber nicht. Es wird daher empfohlen, chdir("/") unmittelbar nach pivot_root() aufzurufen.

Die folgenden Einschränkungen gelten für die neue_Wurzel und die alte_Wurzel:

  • Sie müssen Verzeichnisse sein.
  • Die neue_Wurzel und die alte_Wurzel dürfen sich nicht im gleichen Dateisystem befinden wie die aktuelle Wurzel.
  • Die alte_Wurzel muss sich unterhalb der neuen_Wurzel befinden, das heißt, Hinzufügen einer von null verschiedenen Anzahl von /.. zur Zeichenkette, die auf die alte_Wurzel zeigt, muss das gleiche Verzeichnis wie die neue_Wurzel ergeben.
  • In der alten_Wurzel darf kein weiteres Dateisystem eingehängt sein.

In pivot_root(8) finden Sie zusätzliche Anwendungsbeispiele.

Falls die aktuelle Wurzel kein Einhängepunkt ist (zum Beispiel nach chroot(2) oder pivot_root(), siehe auch unten), wird nicht das alte Wurzelverzeichnis, sondern der Einhängepunkt des Dateisystems eingehängt, das in der alten_Wurzel eingehängt ist.

neue_Wurzel muss ein Einhängepunkt sein. (Falls es nicht anderweitig ein Einhängepunkt ist, reicht es aus, neue_Wurzel auf sich selbst bind-einzuhängen.)

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.

RÜCKGABEWERT

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

FEHLER

pivot_root() kann (in errno) 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 im aktuellen Wurzeldateisystem oder ein Dateisystem ist bereits in der alten_Wurzel eingehängt.
EINVAL
neue_Wurzel ist kein Einhängepunkt.
EINVAL
Die alte_Wurzel ist nicht unterhalb der neuen_Wurzel.
EINVAL
Die aktuelle Wurzel ist auf dem Rootfs (anfänglichen Ramfs-)Dateisystem.
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

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

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).

FEHLER

pivot_root() sollte nicht das Wurzel- und Arbeitsverzeichnis aller anderen Prozesse im System ändern müssen.

Einige der weniger bekannten Anwendungen von pivot_root() können schnell in den Wahnsinn führen.

SIEHE AUCH

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

KOLOPHON

Diese Seite ist Teil der Veröffentlichung 5.02 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>.

2. August 2019 Linux