Enthält der Schrägstrich (/) den Namen des Linux-Stammverzeichnisses?

46

Ist der Schrägstrich ( /) wirklich Teil des Namens des Linux-Stammverzeichnisses? Oder ist es nur ein Symbol dafür?

Was ist mit /etcund so weiter?

Aktualisieren

Angenommen, es /dev/sda2ist das Blockiergerät eines Linux-Stammverzeichnisses.

$ sudo debugfs / dev / sda2
debugfs 1.44.1 (24. März 2018)
debugfs:   pwd
[pwd] INODE: 2 PATH: /
[root] INODE: 2 PATH: /
debugfs:   stat /
Inode: 2    Typ: Verzeichnis     Modus: 0755 Flags: 0x80000
Generation: 0 Version: 0x00000000: 00000077
Benutzer: 0 Gruppe: 0 Projekt: 0 Größe: 4096
Datei-ACL: 0
Links: 25 Anzahl der Blöcke: 8
Fragment: Adresse: 0 Nummer: 0 Größe: 0
 ctime: 0x5b13c9f1: 3f017990 - Sun Jun 3 15:28:57 2018
 atime: 0x5b13ca0f: 3b3ee380 - Sun Jun 3 15:29:27 2018
 mtime: 0x5b13c9f1: 3f017990 - Sun Jun 3 15:28:57 2018
crtime: 0x5aad1843: 00000000 - Sat Mar 17 16:59:39 2018
Größe der zusätzlichen Inode-Felder: 32
EXTENTS:
(0): 9249

Es gibt dort also ein Verzeichnis, Inode 2, aber es hat keinen Namen.

mlibre
quelle
1
In Bezug auf Ihr letztes Update werden einige debugfsAusgaben angezeigt. Können Sie klären, wie dies die Frage ändert?
Kusalananda
Das tut es nicht. Ich wollte nur die Antworten vervollständigen. aber ich wollte keinen weiteren hinzufügen. Also habe ich es aktualisiert. Wenn Sie Thease-Zeile in Ihre Antwort setzen können, werden sie gelöscht
mlibre

Antworten:

61

Der POSIX.1-2008 Standard besagt

Ein Pfadname, der aus einer einzelnen /besteht, wird in das Stammverzeichnis des Prozesses aufgelöst. Ein Nullpfadname kann nicht erfolgreich aufgelöst werden.

Die Norm unterscheidet ferner zwischen Dateinamen und Pfadnamen . /ist der Pfadname für den Pfad des Stammverzeichnisses. Der Name des Verzeichnisses ist "das Stammverzeichnis", aber im Dateisystem ist es namenlos, es hat keinen Dateinamen. Wenn es einen Dateinamen hätte, wäre dieser Name ein Verzeichniseintrag im Verzeichnis über dem Stammverzeichnis, und es gibt kein solches Verzeichnis.

Das Zeichen /kann niemals Teil eines Dateinamens sein, da es das Pfadtrennzeichen ist.

Zur Verdeutlichung: /ist nicht der Name des Stammverzeichnisses, sondern der Pfad zu diesem, sein Pfadname .

/etcist ein anderer Pfadname. Es ist der Name des absoluten Pfades zum etcVerzeichnis. Der Name des Verzeichnisses an diesem Pfad lautet etc(der Dateiname lautet etc).

/usr/local/bin/curlDer Pfadname der curlausführbaren Datei entspricht /etcdem Pfadnamen des etcVerzeichnisses.

Kusalananda
quelle
"Wenn es einen Dateinamen hätte, wäre dieser Name ein Verzeichniseintrag im Verzeichnis über dem Stammverzeichnis." Es wären zwei Dinge, technisch gesehen - Inode-Nummer und Name (wie wir wissen, Inode 2). Es ist auch interessant zu bemerken, dass es auf /..verweist /und /einen eigenen Verzeichniseintrag hat - das ist das gute alte /.; alle diese 3 Dinge zeigen auf die gleiche Inode - 2.
Sergiy Kolodyazhnyy
@SergiyKolodyazhnyy Technisch gesehen ist das Stammverzeichnis "pro Prozess", was in Chroot-Umgebungen wichtig ist. In einer Chroot wäre die Inode-Nummer des Root-Verzeichnisses keine bestimmte Nummer (es wäre die Inode-Nummer der Chroot-Root). Ich denke auch, dass die Nummer 2 (in nicht gewurzelten Situationen) vom verwendeten Dateisystem abhängt.
Kusalananda
Mir ist auch aufgefallen, dass dies /als pro-Prozess-Root definiert ist, aber ich wusste nicht, dass Inode in chrootnicht unbedingt 2 ist. Sehr interessante Tatsache. Es stellt sich auch die Frage, in welchem /Verzeichnis sich privilegierte Kernel-Prozesse befinden. Bedeutet das, dass nur User-Space-Prozesse zugeordnet sind /?
Sergiy Kolodyazhnyy
37

Schrägstrich ist ein Trennzeichen ; Verzeichnisnamen enthalten keine Separatoren, aber voll Pfadnamen sind die Separatoren.

Die "Root-Ebene" / hat also keinen Namen . Auf den meisten Unix-ähnlichen Systemen wird dies wie als Sonderfall behandelt .und ..(obwohl natürlich kein Unterschied zwischen den beiden auf der obersten Ebene gibt es).

Nomenklatur kann abweichen. POSIX.1-2017 listet beispielsweise einige häufig verwendete Definitionen auf :

  • 3.2 Absoluter Pfadname

    Ein Pfadname, der mit einem oder mehr als zwei <slash>Zeichen beginnt . Siehe auch Pfadname .

  • 3.271 Pfadname

    Eine Zeichenfolge, mit der eine Datei identifiziert wird. Im Kontext von POSIX.1-2008 kann ein Pfadname auf {PATH_MAX} Bytes beschränkt sein, einschließlich des abschließenden Null-Bytes. Es enthält optionale Anfangszeichen <slash>, gefolgt von null oder mehr durch <slash>Zeichen getrennten Dateinamen . Ein Pfadname kann optional ein oder mehrere nachgestellte <slash>Zeichen enthalten. Mehrere aufeinanderfolgende <slash>Zeichen werden als dasselbe Zeichen betrachtet <slash>, mit Ausnahme von genau zwei führenden <slash>Zeichen.

    Hinweis: Wenn ein Pfad von nur besteht aus dem tragbaren Dateinamen - Zeichensatz Zeichen - Bytes entspricht (siehe Tragbares Dateiname - Zeichensatz ), <slash>Zeichen und ein einzelner Abschluss<NUL>Zeichen, der Pfadname kann in allen unterstützten Gebietsschemas als Zeichenfolge verwendet werden. Andernfalls ist der Pfadname möglicherweise nur eine Zeichenfolge (und keine Zeichenfolge). Da außerdem die Einzelbytecodierung des <slash>Zeichens in allen Ländereinstellungen gleich sein und nicht <slash>in einem Mehrbytezeichen vorkommen muss, sind Verweise auf ein Zeichen in einem Pfadnamen genau definiert, auch wenn der Pfadname kein Zeichen ist Zeichenfolge. Diese Eigenschaft gilt jedoch nicht unbedingt für die verbleibenden Zeichen im portablen Dateinamenzeichensatz.

  • 3.272 Pfadname-Komponente

    Siehe Dateiname unter Dateiname .

  • 3.170 Dateiname

    Eine Folge von Bytes bestehend aus 1 bis {NAME_MAX}Bytes, die zum Benennen einer Datei verwendet werden. Die den Namen bildenden Bytes dürfen die Zeichen <NUL>oder nicht enthalten <slash>. Im Kontext eines Pfadnamens muss jedem Dateinamen ein <slash>oder ein <NUL>Zeichen folgen . An anderer Stelle bildet ein Dateiname gefolgt von einem <NUL>Zeichen eine Zeichenfolge (jedoch nicht unbedingt eine Zeichenfolge). Die Dateinamen sind punktiert und dot-dothaben eine besondere Bedeutung. Ein Dateiname wird manchmal als "Pfadname-Komponente" bezeichnet. Siehe auch Pfadname .

Also ... wenn Sie suchen , Klarstellung , dass vielleicht nicht die erste Adresse sein. Tutorials wie diese Seite mit UNIX-Konzepten sind hilfreich, um beispielsweise darauf hinzuweisen, dass "vollständiger Pfadname" gleichbedeutend mit "absoluter" Pfadname "ist.

Thomas Dickey
quelle
3
Nitpick: Punkt und Punkt-Punkt sind Dateinamen, keine Pfadnamen. Tatsächlich hat der POSIX-Standard die merkwürdige Formulierung "Als Sonderfall kann sich Punkt-Punkt im Stammverzeichnis auf das Stammverzeichnis selbst beziehen." (meine Betonung).
Kusalananda
Das Lesen der Spezifikation auf den Buchstaben /ist also kein gültiger Dateiname oder eine Pfadname-Komponente, und es ist keine Zeichenfolge, die solche Komponenten enthält, aber es ist immer noch ein vollständig gültiger Pfadname für ein bestimmtes Verzeichnis. Was existieren muss, obwohl der Teil, der dies verlangt, seinen "Namen" nicht erwähnt. Irgendwie finde ich das etwas amüsant.
Ilkkachu
Es wird in POSIX beantwortet : Es enthält optionale Anfangszeichen, gefolgt von null oder mehr Dateinamen, die durch Zeichen getrennt sind.
Thomas Dickey
@ Kusalananda überprüfen Sie die technischen Gründe für Ihre Betonung. Das in der Spezifikation definierte may ist eine eindeutige Erklärung zur Sicherheit in Bezug auf Implementierungstests. wo möglicherweise verwendet wird, die Knospung spec sichert anhaftende von definiertem Verhalten. in anderen Worten, jede Implementierung kann verlassen sich auf ..in /Verknüpfung /.
mikeserv
19

In Unix haben Dateien (und Verzeichnisse sind nur Dateien) keine "Namen". Links haben Namen, Links sind Einträge in einem Verzeichnis, die Dateinamen zuordnen.

Sie könnten sagen, dass Links Dateien Namen geben , aber beachten Sie: Dies impliziert, dass eine Datei mehr als einen Namen haben kann, da sie mehr als einen Link haben kann.

Da es sich bei dem Stammverzeichnis um das Stammverzeichnis handelt, gibt es kein übergeordnetes Verzeichnis, in dem eine Verknüpfung zu diesem Verzeichnis bestehen könnte. Daher kann diesem Verzeichnis kein Name zugeordnet werden. Theoretisch wäre es möglich, in einem anderen Verzeichnis einen Link zum Stammverzeichnis hinzuzufügen, aber die meisten Unices verbieten das Hinzufügen von Links zu vorhandenen Verzeichnissen, da dies zu Zyklen in der Dateisystemhierarchie (die eigentlich ein gerichteter Graph ist) und zum Erkennen von Zyklen führen kann in einem Graphen ist teuer, aber das Nichterkennen kann zu einer unendlichen Rekursion führen, wenn versucht wird, Namen innerhalb des Kernels aufzulösen.

Grundsätzlich hat das Stammverzeichnis keinen Namen, da sich kein Verzeichnis darüber befindet, in dem der Name aufgezeichnet werden kann.

Wie in anderen Antworten erwähnt, müssen wir zwischen einem Namen und einem Pfad (Name) unterscheiden. Das Root-Verzeichnis kann über den Pfad (Name) angesprochen werden /.

Jörg W. Mittag
quelle
Ja, Dateien können genau wie Personen mehrere Namen haben. Der Ehemann meiner jüngeren Tochter trägt normalerweise seinen zweiten Vornamen, aber er muss natürlich auch auf seinen Vornamen antworten. Der Hauptname des Stammverzeichnisses ist "/", ausgesprochen "Schrägstrich", da sein absoluter Pfadname "/" ist (und Namen, die auf relativen Pfadnamen basieren, sind nicht besonders hilfreich). (Nennt man es "root", besteht Verwechslungsgefahr mit "/ root", was immer "slash root" heißen sollte.
Monty Harder
1
Mir gefällt der Punkt, dass es keinen Namen gibt, weil es kein höheres Verzeichnis gibt, in dem dieser Name aufgezeichnet werden kann. Das klärt das Konzept schön.
Joe
7

Die Verwendung des Wortes "Name" ist etwas flexibel; es kann sich auf einen "vollständig qualifizierten Pfadnamen" beziehen; es könnte sich auf den "Verzeichniseintrag" beziehen; Es könnte sich auf den "Dateinamen" beziehen, der an verschiedene Funktionen oder Routinen übergeben wird.

So sind zum Beispiel /etc/foound /var/tmp/../../etc/foound /tmp/../../../../../../fooalle Möglichkeiten, auf dieselbe Datei zu verweisen; Es sind alles gültige Namen , wie sie sich fooim /etcVerzeichnis befinden.

Kehren wir also zu den Grundlagen zurück.

Ein Dateiname in Unix besteht aus Komponenten, die durch das Verzeichnis-Trennzeichen voneinander getrennt sind /. Die einzige Einschränkung für Komponenten ist, dass sie die /Zeichen oder NUL nicht enthalten dürfen . alles andere ist erlaubt.

So ist der „vollständig qualifizierte Pfadname“ von /etcdem vollen string: /etc. Dies bedeutet, dass sich die etcKomponente im Stammverzeichnis befindet.

Ebenso /x/y/z/foohätte die fooKomponente im /x/y/zVerzeichnis.

Das Stammverzeichnis ist jetzt insofern eindeutig, als es keine Komponente in einem übergeordneten Verzeichnis enthält. es nur den vollständigen Pfad wie sein Name: /.

Stephen Harris
quelle