Wohin gehen Metadaten, wenn Sie eine Datei speichern?

28

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?

juniorRubyist
quelle
1
Ich bin kein Experte, aber ich denke, die allgemeine Antwort ist, dass wenn Sie eine Festplatte haben und 1+ Partitionen erstellen, Sie die Partition mit einem Dateisystem formatieren, z Ein Großteil dieser Partition ist für den Inhalt von Dateien bestimmt, ein kleiner Teil davon ist jedoch für andere Dinge, einschließlich Metadaten, reserviert.
Barlop
@barlop im Wesentlichen richtig. Beide Systeme belegen Speicherplatz für die Speicherung von Dateien. in NTFS speichert die "master file table" die Metadaten, in ext2 + sind es "inodes".
PJC50
@ pjc50 danke. Abgesehen von den Metadaten: Wie heißt das außerhalb der Partitionen befindliche Objekt? Ich nehme an, es hängt davon ab, ob das Ding MBR oder GPT ist. Im MBR heißt das Ding MBR. Wie heißt es im GPT? (Ich verstehe, dass GPT einen älteren MBR hat, aber hat es auch ein eigenes Ding außerhalb aller Partitionen?)
Barlop
Verwandte Themen: (Grundsätzlich dasselbe, aber die Frage bezieht sich speziell auf Windows.) Wie werden die Dateimetadaten in Windows gespeichert?
Gronostaj
2
"chmod 755 ... Die Datei enthält jetzt die Metadaten von ... -rw-r - r-- ..." Sie meinen -rwxr-xr-x.
JoL

Antworten:

42

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) und cp foo bar(was nicht):

$ strace -v cp foo bar
…
open ("foo", O_RDONLY) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
read (3, "test \ n", 131072) = 5
Schreiben Sie (4, "Test \ n", 5) = 5
read (3, 131072) = 0
close (4) = 0
close (3) = 0
…
$ strace -v cp -a foo bar
…
 - Die ursprünglichen Metadaten werden abgerufen
lstat ("foo", {st_dev = makedev (254, 0), st_ino = 60569468, st_mode = S_IFREG | 0644,
             st_nlink = 1, st_uid = 1000, st_gid = 1000, st_blksize = 4096, st_blocks = 8,
             st_size = 5, st_atime = 2016-12-28T09: 16: 59 + 0200.879714332,
             st_mtime = 2016-12-28T09: 16: 55 + 0200.816363098,
             st_ctime = 2016-12-28T09: 16: 55 + 0200.816363098}) = 0
 - Daten werden kopiert
open ("foo", O_RDONLY | O_NOFOLLOW) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
read (3, "test \ n", 131072) = 5
Schreiben Sie (4, "Test \ n", 5) = 5
read (3, 131072) = 0
 - Die Änderungszeit wird kopiert
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
                    {tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
 - das Eigentum wird kopiert (nur mit 'sudo [strace] cp')
fchown (4, 1000, 1000) = 0
 - Erweiterte Attribute werden kopiert (xdg.origin.url wird von Browsern gesetzt, wget)
flistxattr (3, NULL, 0) = 0
flistxattr (3, "user.xdg.origin.url \ 0", 20) = 20
fgetxattr (3, "user.xdg.origin.url", "https://superuser.com/", 22) = 22
fsetxattr (4, "user.xdg.origin.url", "https://superuser.com/", 22, 0) = 0
 - POSIX-ACLs sind nicht vorhanden, daher wird eine Basis-ACL aus st_mode erstellt
 - (in diesem Fall würde auch ein einfaches fchmod () funktionieren)
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (Keine Daten verfügbar)
fsetxattr (4, "system.posix_acl_access", "\ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 6 \ 0 \ 377 \ 377 \ 377 \ 4 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 ", 28, 0) = 0
close (4) = 0
close (3) = 0
…
Grawity
quelle
3
Als Ergänzung zu dieser Antwort sollten Sie Folgendes erwähnen: - Beim Kopieren auf ein anderes Laufwerk: Die Metadaten werden von der Quelle gelesen und auf dem Ziel reproduziert, wenn die entsprechenden Einstellungen (oder Optionen) vorhanden sind (z. B. Datum beibehalten, Rechte beibehalten oder sogar beibehalten). alles ") wurde benutzt (wie du erwähnt hast). 2) Eine Alternative besteht darin, zuerst ein Archiv (.zip, .tar usw.) der Dateien zu erstellen und aus diesem Archiv auf dem Ziel zu extrahieren, wobei dem Programm erneut ein Platz (im Archivformat) eingeräumt wird, um die Metadaten zu finden. und bestimmte Optionen / Einstellungen erlauben es einem, diese Metadaten beizubehalten (oder nicht).
Olivier Dulac
Zum zweiten Absatz: Was ist mit stat (2)?
Katze
Vielen Dank, dass Sie mir eine ausführliche Antwort auf diese eine Frage gegeben haben, über die ich nachgedacht habe.
juniorRubyist
11

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 statSystemaufruf ( man 2 stat) auf diese Daten zugreifen und sie mit dem statTool ausdrucken ( man stat). Eine detaillierte Beschreibung der Inode-Felder finden Sie linux/include/linux/fs.hin 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 anweisen cp, auch Metadaten zu kopieren, indem die alten Metadaten mit gelesen statund die neuen Metadaten entsprechend geändert werden.

dirkt
quelle
4

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.

LSerni
quelle
2
Dateinamen werden nicht mit der Datei gespeichert, sondern sind Teil des Verzeichnisknotens. Deshalb funktionieren harte Links
Sobrique
Diese Antwort widerspricht Dirks, wo die Dateinamen gespeichert sind, ich frage mich, welche richtig ist
Katze
Sorry, ich habe Sachen durcheinander gebracht, und @dirkt hat das Recht dazu . Fixing Antwort.
LSerni
Sie sind Teil des Verzeichnisses , aber normalerweise nicht Teil des Inodes des Verzeichnisses. Es ist FS-spezifisch, aber wenn Sie sich ein Verzeichnis als eine spezielle Datei vorstellen, dann ist sein Inhalt die Liste der Dateien (Namen und deren Inodes).
Grawity