Provided by: manpages-de_4.13-4_all 

BEZEICHNUNG
path_resolution - Wie ein Pfadname zu einer Datei aufgelöst wird
BESCHREIBUNG
Einige UNIX/Linux-Systemaufrufe haben als Parameter einen oder mehrere Dateinamen. Ein Dateiname (oder
Pfadname) wird wie folgt aufgelöst:
Schritt 1: Start des Auflösungsprozesses
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 temporär ein anderes Wurzelverzeichnis
erhalten.
Ein Prozess kann einen komplett privaten Einhängenamensraum erhalten, falls er—oder einer seiner
Vorgänger—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 für den
Pfadauflösungsprozess 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 übergeben wurde). Das aktuelle Arbeitsverzeicnis wird vom Elternprozess geerbt und kann mittels des
Systemaufrufs chdir(2) geändert werden.
Pfadnamen, die mit dem Zeichen »/« beginnen, werden absolute Pfadnamen genannt. Alle anderen Pfadnamen
heißen relative Pfadnamen.
Schritt 2: Ablaufen entlang des Pfades
Das aktuelle Nachschlageverzeichnis wird auf das Nachschlage-Startverzeichnis gesetzt. Jetzt wird für
jede nicht abschließende Komponente des Pfadnamens diese im aktuellen Nachschlageverzeichnis
nachgeschlagen. Hierbei ist eine Komponente eine Teilzeichenkette, die durch das Zeichen »/« abgetrennt
wird.
Falls der Prozess über keine Suchberechtigungen im aktuellen Nachschlage-Verzeichnis verfügt, wird der
Fehler EACCES (»Keine Berechtigung«) zurückgeliefert.
Falls die Komponente nicht gefunden wird, wird der Fehler ENOENT (»Datei oder Verzeichnis nicht
gefunden«) zurückgeliefert.
Falls eine Komponente gefunden wird, aber weder ein Verzeichnis noch ein symbolischer Link ist, wird der
Fehler ENOTDIR (»Ist kein Verzeichnis«) zurückgeliefert.
Falls die Komponente gefunden wird und ein Verzeichnis ist, wird das aktuelle Nachschlage-Verzeichnis auf
dieses Verzeichnis gesetzt und zur nächsten Komponenten gewechselt.
Falls die Komponente gefunden wird und ein symbolischer Link (Symlink) ist, wird zuerst dieser
symbolische Link aufgelöst (mit dem anfänglichen Nachschlage-Verzeichnis). Im Fehlerfall wird dieser
Fehler zurückgeliefert. Falls das Ergebnis kein Verzeichnis ist, wird der Fehler ENOTDIR zurückgeliefert.
Falls die Auflösung des symbolischen Links erfolgreich ist und ein Verzeichnis zurückliefert, wird das
aktuelle Nachschlage-Verzeichnis auf dieses Verzeichnis gesetzt und zur nächsten Komponente gewechselt.
Bachten Sie, dass dieser Auflösungsprozess Rekursionen enthalten kann, falls die Präfixkomponente
(»dirname«) eines Pfadnamens einen Dateinamen enthält, der ein symbolischer Link ist, der sich auf ein
Verzeichnis auflöst (wobei die Präfixkomponente dieses Verzeichnisses einen symbolischen Link enthalten
könnte und so weiter). Um den Kernel gegen eine Stapelüberlauf und auch eine Diensteverweigerung zu
schützen, gibt es Begrenzungen zur Rekursionstiefe und der maximalen Anzahl an gefolgten symbolischen
Links. Ein Fehler ELOOP wird zurückgeliefert, wenn das Maximum überschritten wurde (»Zu viele Ebenen aus
symbolischen Links«).
Derzeit ist in Linux die maximale Anzahl von beim Auflösen von Pfadnamen gefolgten symbolischen Links auf
40 begrenzt. In Kerneln vor 2.6.18 war die Begrenzung der Rekursionstiefe 5. Seit Linux 2.6.18 wurde
diese Begrenzung auf 8 erhöht. In Linux 4.2 wurde der Code für die Pfadnamenauflösung überarbeitet, um
die Verwendung von Rekursion zu beseitigen, so dass die einzige verbliebene Begrenzung die maximalen 40
Auflösungen für den gesamten Pfadnamen ist.
Die Auflösung symbolischer Links während 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 Pfadauflösungsprozess betroffen ist – es mag ein
Verzeichnis oder keines sein müssen, abhängig 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 abschließenden Eintrags werden in den Handbuchseiten der
jeweiligen Systemaufrufe beschrieben.
. und ..
Herkömmlicherweise hat jedes Verzeichnis zwei Einträge (».« und »..«), die sich auf das Verzeichnis
selbst bzw. sein übergeordnetes Verzeichnis beziehen.
Der Pfadauflösungsprozess wird annehmen, dass diese zwei Einträge ihre konventionelle Bedeutung haben,
unabhängig davon, ob sie im physischen Dateisystem tatsächlich vorhanden sind.
Sie können nicht höher als die Wurzel aufsteigen: »/..« ist zu »/« identisch.
Einhängepunkte
Nach einem Befehl »mount Gerät Pfad« bezieht sich der Pfadname »Pfad« auf die Wurzel der
Dateisystemhierarchie auf dem Gerät »Gerät« und nicht auf etwas, worauf es sich vorher bezog.
Sie können sich außerhalb des eingehängten Dateisystems bewegen: »Pfad/..« bezieht sich auf das
übergeordnete Verzeichnis von »Pfad« außerhalb der Dateisystemhierarchie von »Gerät«.
Durchlauf von Einhängepunkten kann mittels openat2(2) mit dem gesetzten Schalter RESOLVE_NO_XDEV
verhindert werden (beachten Sie allerdings, dass dies auch den Durchlauf von Bind-Einhängungen
beschränkt).
Abschließende Schrägstriche
Falls ein Pfadname mit einem »/« endet, der die Auflösung der vorherigen Komponente gemäß Schritt 2
erzwingt: Sie muss existieren und sich auf ein Verzeichnis auflösen. Andernfalls wird ein abschließender
»/« ignoriert. (Oder ein Pfadname mit einem abschließenden »/« ist äquivalent zu einem Pfadnamen, der
durch Anhängen von ».« an ihn erhalten wird.)
Finaler Symlink
Falls die letzte Komponente des Pfadnamens ein symbolischer Link ist, hängt es vom Systemaufruf ab, ob
die Datei, auf die referenziert wird, ein symbolischer Link ist oder das Ergebnis der Pfadauflösung
seiner Inhalte. Beispielsweise wird der Systemaufruf lstat(2) auf einem Symlink agieren, während stat(2)
auf der Datei agiert, auf die der Symlink zeigt.
Längenbeschränkung
Es gibt eine maximale Länge für Pfadnamen. Falls der Pfadname (oder ein Zwischenpfadname, der beim
Auflösen von symbolischen Links erhalten wurde) zu lang ist, wird ein Fehler ENAMETOOLONG zurückgeliefert
(»Der Dateiname ist zu lang«).
Leere Pfadnamen
Im ursprünglichen UNIX bezogen sich leere Pfadnamen auf das aktuelle Verzeichnis. Heutzutage beschließt
POSIX, dass ein leerer Pfadname nicht erfolgreich aufgelöst werden darf. Linux liefert in diesem Fall
ENOENT zurück.
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 Eigentümerkennung der Datei ist. Die zweite Gruppe der drei wird verwandt, wenn die
Gruppenkennung der Datei entweder mit der effektiven Gruppenkennung des aufrufenden Prozesses
übereinstimmt oder eine der ergänzenden 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 Ausführberechtigung im Falle von gewöhnlichen Dateien oder die
Suchberechtigung im Falle von Verzeichnissen.
Linux verwendet fsuid anstelle der effektiven Benutzerkennung bei Berechtigungsprüfungen. Normalerweise
ist die fsuid identisch mit der effektiven Benutzerkennung, aber die fsuid kann mit dem Systemaufruf
setfsuid(2) geändert werden.
(Hier steht »fsuid« für etwas wie »Dateisystembenutzerkennung«. Das Konzept wurde für die Implementierung
von NFS-Servern im Benutzerbereich zu einem Zeitpunkt benötigt, 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 ähnliche Weise verwendet Linux die fsgid (»Dateisystemgruppenkennung«) anstelle der effektiven
Gruppenkennung. Siehe setfsgid(2).
Umgehen von Berechtigungsprüfungen: Superuser und Capabilitys
Auf einem traditionellen UNIX-System ist der Superuser (root, Benutzerkennung 0) allmächtig und umgeht
alle Berechtigungseinschränkungen beim Zugriff auf Dateien.
Unter Linux sind die Superuser-Privilegien in Capabilitys aufgeteilt (siehe capabilities(7)). Zwei
Capabilitys sind für Dateiberechtigungsüberprüfungen 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 Berechtigungsprüfungen außer Kraft, aber gewährt die
Ausführberechtigung nur, falls mindestens eines der drei Ausführ-Berechtigungs-Bits der Datei gesetzt
ist.
Die Capability CAP_DAC_READ_SEARCH gewährt Lese- und Suchberechtigungen für Verzeichnisse und
Leseberechtigungen für gewöhnliche Dateien.
SIEHE AUCH
readlink(2), capabilities(7), credentials(7), symlink(7)
KOLOPHON
Diese Seite ist Teil der Veröffentlichung 5.10 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 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 die
Mailingliste der Übersetzer.
Linux 11. April 2020 PATH_RESOLUTION(7)