path_resolution(7) Miscellaneous Information Manual path_resolution(7) BEZEICHNUNG path_resolution - Wie ein Pfadname zu einer Datei aufgelost wird BESCHREIBUNG Einige UNIX/Linux-Systemaufrufe haben als Parameter einen oder mehrere Dateinamen. Ein Dateiname (oder Pfadname) wird wie folgt aufgelost: Schritt 1: Start des Auflosungsprozesses Falls der Pfadname mit dem Zeichen >>/<< beginnt, wird das Wurzelverzeichnis des aufrufenden Prozesses als Startverzeichnis beim Nachschlagen verwandt. Ein Prozess erbt sein Wurzelverzeichnis von seinem Elternprozess. Normalerweise wird dies das Wurzelverzeichnis der Dateihierarchie sein. Durch die Verwendung des Systemaufrufs chroot(2) kann ein Prozess ein anderes Wurzelverzeichnis erhalten oder er kann mittels openat2(2) mit dem gesetzten Schalter RESOLVE_IN_ROOT temporar ein anderes Wurzelverzeichnis erhalten. Ein Prozess kann einen komplett privaten Einhangenamensraum erhalten, falls er-oder einer seiner Vorganger-durch einen Systemaufruf von clone(2) mit gesetztem Schalter CLONE_NEWNS gestartet wurde. Dieser handhabt den >>/<<-Anteil des Pfadnamens. Falls der Pfadname nicht mit dem Zeichen >>/<< beginnt, ist das Nachschlage-Startverzeichnis fur den Pfadauflosungsprozess das aktuelle Arbeitsverzeichnis des Prozesses - oder im Falle von Systemaufrufen im Stil von openat(2), das Argument dfd (oder das aktuelle Arbeitsverzeichnis, falls AT_FDCWD als Argument dfd ubergeben wurde). Das aktuelle Arbeitsverzeicnis wird vom Elternprozess geerbt und kann mittels des Systemaufrufs chdir(2) geandert werden. Pfadnamen, die mit dem Zeichen >>/<< beginnen, werden absolute Pfadnamen genannt. Alle anderen Pfadnamen heissen relative Pfadnamen. Schritt 2: Ablaufen entlang des Pfades Das aktuelle Nachschlageverzeichnis wird auf das Nachschlage-Startverzeichnis gesetzt. Jetzt wird fur jede nicht abschliessende Komponente des Pfadnamens diese im aktuellen Nachschlageverzeichnis nachgeschlagen. Hierbei ist eine Komponente eine Teilzeichenkette, die durch das Zeichen >>/<< abgetrennt wird. Falls der Prozess uber keine Suchberechtigungen im aktuellen Nachschlage-Verzeichnis verfugt, wird der Fehler EACCES (>>Keine Berechtigung<<) zuruckgeliefert. Falls die Komponente nicht gefunden wird, wird der Fehler ENOENT (>>Datei oder Verzeichnis nicht gefunden<<) zuruckgeliefert. Falls eine Komponente gefunden wird, aber weder ein Verzeichnis noch ein symbolischer Link ist, wird der Fehler ENOTDIR (>>Ist kein Verzeichnis<<) zuruckgeliefert. Falls die Komponente gefunden wird und ein Verzeichnis ist, wird das aktuelle Nachschlage-Verzeichnis auf dieses Verzeichnis gesetzt und zur nachsten Komponenten gewechselt. Falls die Komponente gefunden wird und ein symbolischer Link ist, wird zuerst dieser symbolische Link aufgelost (mit dem anfanglichen Nachschlage-Verzeichnis). Im Fehlerfall wird dieser Fehler zuruckgeliefert. Falls das Ergebnis kein Verzeichnis ist, wird der Fehler ENOTDIR zuruckgeliefert. Falls die Auflosung des symbolischen Links erfolgreich ist und ein Verzeichnis zuruckliefert, wird das aktuelle Nachschlage-Verzeichnis auf dieses Verzeichnis gesetzt und zur nachsten Komponente gewechselt. Bachten Sie, dass dieser Auflosungsprozess Rekursionen enthalten kann, falls die Prafixkomponente (>>dirname<<) eines Pfadnamens einen Dateinamen enthalt, der ein symbolischer Link ist, der sich auf ein Verzeichnis auflost (wobei die Prafixkomponente dieses Verzeichnisses einen symbolischen Link enthalten konnte und so weiter). Um den Kernel gegen eine Stapeluberlauf und auch eine Diensteverweigerung zu schutzen, gibt es Begrenzungen zur Rekursionstiefe und der maximalen Anzahl an gefolgten symbolischen Links. Ein Fehler ELOOP wird zuruckgeliefert, wenn das Maximum uberschritten wurde (>>Zu viele Ebenen aus symbolischen Links<<). Derzeit ist in Linux die maximale Anzahl von beim Auflosen von Pfadnamen gefolgten symbolischen Links auf 40 begrenzt. In Linux vor 2.6.18 war die Begrenzung der Rekursionstiefe 5. Seit Linux 2.6.18 wurde diese Begrenzung auf 8 erhoht. In Linux 4.2 wurde der Code fur die Pfadnamenauflosung uberarbeitet, um die Verwendung von Rekursion zu beseitigen, so dass die einzige verbliebene Begrenzung die maximalen 40 Auflosungen fur den gesamten Pfadnamen ist. Die Auflosung symbolischer Links wahrend dieser Stufe kann mittels openat2(2) durch den gesetzten Schalter RESOLVE_NO_SYMLINKS verhindert werden. Schritt 3: Finden des finalen Eintrags Das Nachschlagen der finalen Komponente des Pfadnamens erfolgt genau wie der von allen anderen Komponenten, wie im vorherigen Schritt beschrieben, mit zwei Unterschieden: (i) die finale Komponente muss kein Verzeichnis sein (zumindest soweit, wie der Pfadauflosungsprozess betroffen ist - es mag ein Verzeichnis oder keines sein mussen, abhangig von den Anforderungen des spezifischen Systemaufrufs) und (ii) es ist nicht unbedingt ein Fehler, falls die Komponente nicht gefunden wird - vielleicht wird sie gerade erstellt. Die Details der Behandlung des abschliessenden Eintrags werden in den Handbuchseiten der jeweiligen Systemaufrufe beschrieben. . und .. Herkommlicherweise hat jedes Verzeichnis zwei Eintrage (>>.<< und >>..<<), die sich auf das Verzeichnis selbst bzw. sein ubergeordnetes Verzeichnis beziehen. Der Pfadauflosungsprozess wird annehmen, dass diese zwei Eintrage ihre konventionelle Bedeutung haben, unabhangig davon, ob sie im physischen Dateisystem tatsachlich vorhanden sind. Sie konnen nicht hoher als die Wurzel aufsteigen: >>/..<< ist zu >>/<< identisch. Einhangepunkte Nach einem Befehl mount Gerat Pfad bezieht sich der Pfadname >>Pfad<< auf die Wurzel der Dateisystemhierarchie auf dem Gerat >>Gerat<< und nicht auf etwas, worauf es sich vorher bezog. Sie konnen sich ausserhalb des eingehangten Dateisystems bewegen: >>Pfad/..<< bezieht sich auf das ubergeordnete Verzeichnis von >>Pfad<< ausserhalb der Dateisystemhierarchie von >>Gerat<<. Durchlauf von Einhangepunkten kann mittels openat2(2) mit dem gesetzten Schalter RESOLVE_NO_XDEV verhindert werden (beachten Sie allerdings, dass dies auch den Durchlauf von Bind-Einhangungen beschrankt). Abschliessende Schragstriche Falls ein Pfadname mit einem >>/<< endet, der die Auflosung der vorherigen Komponente gemass Schritt 2 erzwingt: die Komponente vor dem Schragstrich existiert entweder und wird zu einem Verzeichnis aufgelost oder sie benennt ein Verzeichnis, das sofort nach der Auflosung des Pfadnamens erstellt werden soll. Andernfalls wird ein abschliessender >>/<< ignoriert. Finaler symbolischer Link Falls die letzte Komponente des Pfadnamens ein symbolischer Link ist, hangt es vom Systemaufruf ab, ob die Datei, auf die referenziert wird, ein symbolischer Link ist oder das Ergebnis der Pfadauflosung seiner Inhalte. Beispielsweise wird der Systemaufruf lstat(2) auf einem symbolischen Link agieren, wahrend stat(2) auf der Datei agiert, auf die der symbolische Link zeigt. Langenbeschrankung Es gibt eine maximale Lange fur Pfadnamen. Falls der Pfadname (oder ein Zwischenpfadname, der beim Auflosen von symbolischen Links erhalten wurde) zu lang ist, wird ein Fehler ENAMETOOLONG zuruckgeliefert (>>Der Dateiname ist zu lang<<). Leere Pfadnamen Im ursprunglichen UNIX bezogen sich leere Pfadnamen auf das aktuelle Verzeichnis. Heutzutage beschliesst POSIX, dass ein leerer Pfadname nicht erfolgreich aufgelost werden darf. Linux liefert in diesem Fall ENOENT zuruck. Berechtigungen Die Berechtigungsbits einer Datei bestehen aus drei Gruppen von drei Bits: siehe chmod(1) und stat(2). Die erste Gruppe der drei wird verwandt, wenn die effektive Benutzerkennung des aufrufenden Prozesses identisch zu der Eigentumerkennung der Datei ist. Die zweite Gruppe der drei wird verwandt, wenn die Gruppenkennung der Datei entweder mit der effektiven Gruppenkennung des aufrufenden Prozesses ubereinstimmt oder eine der erganzenden Gruppenkennungen des aufrufenden Prozesses ist (wie durch setgroups(2) gesetzt). Falls nichts davon zutrifft, wird die dritte Gruppe verwandt. Von den drei verwandten Bits bestimmt das erste Bit die Leseberechtigung, das zweite die Schreibberechtigung und das letzte die Ausfuhrberechtigung im Falle von gewohnlichen Dateien oder die Suchberechtigung im Falle von Verzeichnissen. Linux verwendet fsuid anstelle der effektiven Benutzerkennung bei Berechtigungsprufungen. Normalerweise ist die fsuid identisch mit der effektiven Benutzerkennung, aber die fsuid kann mit dem Systemaufruf setfsuid(2) geandert werden. (Hier steht >>fsuid<< fur etwas wie >>Dateisystembenutzerkennung<<. Das Konzept wurde fur die Implementierung von NFS-Servern im Benutzerbereich zu einem Zeitpunkt benotigt, zu dem ein Prozess ein Signal zu einem anderen Prozess mit der gleichen effektiven Benutzerkennung senden konnte. Dies ist jetzt veraltet. Niemand sollte setfsuid(2) verwenden.) Auf ahnliche Weise verwendet Linux die fsgid (>>Dateisystemgruppenkennung<<) anstelle der effektiven Gruppenkennung. Siehe setfsgid(2). Umgehen von Berechtigungsprufungen: Superuser und Capabilitys Auf einem traditionellen UNIX-System ist der Superuser (root, Benutzerkennung 0) allmachtig und umgeht alle Berechtigungseinschrankungen beim Zugriff auf Dateien. Unter Linux sind die Superuser-Privilegien in Capabilitys aufgeteilt (siehe capabilities(7)). Zwei Capabilitys sind fur Dateiberechtigungsuberprufungen relevant: CAP_DAC_OVERRIDE und CAP_DAC_READ_SEARCH. (Ein Prozess hat diese Capabilitys, falls seine fsuid 0 ist.) Die Capability CAP_DAC_OVERRIDE setzt alle Berechtigungsprufungen ausser Kraft, aber gewahrt die Ausfuhrberechtigung nur, falls mindestens eines der drei Ausfuhr-Berechtigungs-Bits der Datei gesetzt ist. Die Capability CAP_DAC_READ_SEARCH gewahrt Lese- und Suchberechtigungen fur Verzeichnisse und Leseberechtigungen fur gewohnliche Dateien. SIEHE AUCH readlink(2), capabilities(7), credentials(7), symlink(7) UBERSETZUNG Die deutsche Ubersetzung dieser Handbuchseite wurde von Helge Kreutzmann erstellt. Diese Ubersetzung ist Freie Dokumentation; lesen Sie die GNU General Public License Version 3 oder neuer bezuglich der Copyright-Bedingungen. Es wird KEINE HAFTUNG ubernommen. Wenn Sie Fehler in der Ubersetzung dieser Handbuchseite finden, schicken Sie bitte eine E-Mail an die Mailingliste der Ubersetzer . Linux man-pages 6.06 31. Oktober 2023 path_resolution(7)