Angenommen, Johnny erstellt eine leere Datei. Es heißt foobar.py
. Wenn Johnny zulässt, dass es ausgeführt wird, rennt er davon chmod 755 foobar.py
. Die Datei hat jetzt die Metadaten von
-rw-r--r-- 1 johnny staff 0 Dec 27 22:53 foobar.py
Wo sind all diese Metadaten in dieser Datei gespeichert? Die Größe der Datei ist 0. Wie werden die Metadaten gespeichert, wenn sie auf ein anderes Laufwerk übertragen werden?
Antworten:
Es ist nicht in dieser Datei gespeichert . Es wird im Dateisystem gespeichert und alle Parameter werden einzeln manuell kopiert (einige können jedoch überhaupt nicht kopiert werden).
Das heißt, die meisten Betriebssysteme verfügen nicht wirklich über einen Aufruf zum Kopieren von Dateien mit Metadaten. Das Dateikopierprogramm erstellt einfach eine neue Datei mit dem Namen
foobar.py
, kopiert die gesamten 0-Byte-Daten und verwendet dann utime () oder SetFileTime () , damit die Änderungszeit mit der des Originals übereinstimmt . Ebenso werden Dateiberechtigungen "kopiert", indem sie mit chmod () neu festgelegt werden oder indem das POSIX-ACL-Attribut kopiert wird.Einige Metadaten werden nicht kopiert. Das Festlegen des Eigentums erfordert Root-Rechte, sodass Kopien der Dateien anderer Personen Ihnen gehören und Ihr Datenträgerkontingent belegen . Die ctime (Attributänderungszeit) kann unter Unixes nicht manuell eingestellt werden. btime (Geburts- / Erstellungszeit) wird normalerweise auch nicht kopiert.
Vergleichen
cp -a foo bar
(die Kopien Metadaten) undcp foo bar
(was nicht):quelle
Sie unterscheidet sich im Allgemeinen von Dateisystem zu Dateisystem, in dem die Metadaten gespeichert sind. In der ext2-Dateisystemfamilie werden die von Ihnen genannten Metadaten (Eigentümer, Gruppe, Berechtigungen, Uhrzeit) im Inode gespeichert . Der Inode speichert auch (Zeiger auf) die Blöcke, die die Datei auf der Festplatte belegt. Die Inode ist nicht speichert die Dateinamen.
Sie können mit dem
stat
Systemaufruf (man 2 stat
) auf diese Daten zugreifen und sie mit demstat
Tool ausdrucken (man stat
). Eine detaillierte Beschreibung der Inode-Felder finden Sielinux/include/linux/fs.h
in der Kernel-Quelle.Es gibt andere Arten von Metadaten (z. B. ACL-Berechtigungen ), die an verschiedenen Orten gespeichert werden.
Metadaten werden beim Kopieren der Datei nicht standardmäßig kopiert. Stattdessen wird eine neue Datei mit Standardmetadatenwerten erstellt. Es gibt verschiedene Optionen für
cp
(-p
,--preserve
), die anweisencp
, auch Metadaten zu kopieren, indem die alten Metadaten mit gelesenstat
und die neuen Metadaten entsprechend geändert werden.quelle
Je nach Dateisystem werden Bereiche entweder (semi-) statisch oder dynamisch reserviert, um Metadaten wie Berechtigungen, Größe und andere (manchmal auch den Dateinamen) zu speichern.
Unter Unix werden Metadaten im Inode gespeichert, der den Datenbereich steuert, in dem sich die Datei befindet ( während Dateinamen und zugehörige Inode-Nummern in einem Verzeichniseintrag gespeichert werden ).
In einigen Dateisystemen sind Verzeichniseinträge Dateien wie alle anderen, jedoch nicht sichtbar. FAT und FAT32 sind solche Dateisysteme (das Stammverzeichnis von FAT ist jedoch "speziell"). Wenn Sie eine Datei erstellen, fügen Sie einen Eintrag in der Datei hinzu, der den Ordner beschreibt, in dem sich die Datei befindet. Jeder Eintrag ist groß genug, um Dateigröße, Namen und Datum und nichts anderes zu speichern (lange Namen, die mehrere Einträge belegen; die Standardeintragsgröße von 32 Byte kann einen einzelnen Namen im alten 8 + 3-Zeichenformat enthalten. All dies natürlich vorausgesetzt mein Gedächtnis funktioniert). Das Ext-System ist ähnlich, aber der Verzeichniseintrag hat eine dynamische Größe und enthält nur den Namen und den Inode-Zeiger. Alle anderen Informationen befinden sich in der Inode. Auf diese Weise können zwei Einträge auf dieselbe Datei verweisen. Dies ist nützlich, um doppelte Dateien zu verwalten.
In einigen Dateisystemen können Inodes groß genug sein, um zusätzlich zu den Metadaten eine kleine Datenmenge aufzunehmen. Wenn die Datei dort hineinpasst, belegt sie keinen zusätzlichen Speicherplatz. Sie erstellen eine 45-Byte-Datei, und der freie Speicherplatz ändert sich überhaupt nicht. Diese Bytes werden in der Inode gespeichert . Ich denke, dass die ext * -Familie dies unterstützt (und auch NTFS). Dies hilft bei der Verwaltung einer großen Anzahl sehr kleiner Dateien.
In anderen Dateisystemen gibt es ein "Phantom" -Dateisystem neben dem Hauptdateisystem, das diese zusätzlichen Attribute speichert. Nicht nur Dateiinformationen, sondern möglicherweise auch Dateisymbole .
Einige Systeme verfügen über beides: NTFS verfügt über die vollständigen Verzeichnismetadaten, die inode-artig arbeiten, und die Möglichkeit, alternative Datenströme mit weiteren Informationen zu erstellen , die (anscheinend) nichts an der "Haupt" -Datei ändern.
quelle