Ist der Schrägstrich ( /
) wirklich Teil des Namens des Linux-Stammverzeichnisses? Oder ist es nur ein Symbol dafür?
Was ist mit /etc
und so weiter?
Aktualisieren
Angenommen, es /dev/sda2
ist 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.
linux
filesystems
filenames
fhs
mlibre
quelle
quelle
debugfs
Ausgaben angezeigt. Können Sie klären, wie dies die Frage ändert?Antworten:
Der POSIX.1-2008 Standard besagt
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 ./etc
ist ein anderer Pfadname. Es ist der Name des absoluten Pfades zumetc
Verzeichnis. Der Name des Verzeichnisses an diesem Pfad lautetetc
(der Dateiname lautetetc
)./usr/local/bin/curl
Der Pfadname dercurl
ausführbaren Datei entspricht/etc
dem Pfadnamen desetc
Verzeichnisses.quelle
/..
verweist/
und/
einen eigenen Verzeichniseintrag hat - das ist das gute alte/.
; alle diese 3 Dinge zeigen auf die gleiche Inode - 2./
als pro-Prozess-Root definiert ist, aber ich wusste nicht, dass Inode inchroot
nicht 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/
?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
3.271 Pfadname
3.272 Pfadname-Komponente
3.170 Dateiname
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.
quelle
/
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...
in/
Verknüpfung/
.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
/
.quelle
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/foo
und/var/tmp/../../etc/foo
und/tmp/../../../../../../foo
alle Möglichkeiten, auf dieselbe Datei zu verweisen; Es sind alles gültige Namen , wie sie sichfoo
im/etc
Verzeichnis 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
/etc
dem vollen string:/etc
. Dies bedeutet, dass sich dieetc
Komponente im Stammverzeichnis befindet.Ebenso
/x/y/z/foo
hätte diefoo
Komponente im/x/y/z
Verzeichnis.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:
/
.quelle