Es ist nicht in gespeichert diese Datei. Es wird im Dateisystem gespeichert, und alle Parameter werden einzeln manuell kopiert (obwohl einige überhaupt nicht kopiert werden können).
Das heißt, die meisten Betriebssysteme haben nicht wirklich einen Aufruf „Datei mit Metadaten kopieren“. Das Dateikopierprogramm erstellt einfach eine neue Datei mit dem Namen foobar.py
, kopiert die gesamten 0 Bytes an Daten und verwendet dann utime() oder SetFileTime(), damit die Änderungszeit genauso aussieht wie die des Originals. Ebenso würden Dateiberechtigungen "kopiert", indem sie mit chmod() neu gesetzt oder das POSIX-ACL-Attribut kopiert werden.
Einige Metadaten werden nicht kopiert. Das Festlegen der Eigentümerschaft erfordert Root-Rechte, sodass Kopien der Dateien einer anderen Person Ihnen gehören und Ihre belegen Festplattenkontingent. Die ctime (Änderungszeit des Attributs) kann unter Unix nicht manuell eingestellt werden; btime (Geburts-/Erstellungszeit) wird normalerweise auch nicht kopiert.
Vergleiche cp -a foo bar
(der Metadaten kopiert) und cp foo bar
(was nicht der Fall ist):
$ strace -v cp foo bar … open("foo", O_RDONLY) = 3 open("bar", O_WRONLY|O_TRUNC) = 4 read(3, "test\n", 131072) = 5 write(4, "test\n", 5) = 5 read(3, "", 131072) = 0 close(4) = 0 close(3) = 0 …
$ strace -v cp -a foo bar … -- original metadata is retrieved 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 -- data is copied open("foo", O_RDONLY|O_NOFOLLOW) = 3 open("bar", O_WRONLY|O_TRUNC) = 4 read(3, "test\n", 131072) = 5 write(4, "test\n", 5) = 5 read(3, "", 131072) = 0 -- modifiction time is copied utimensat(4, NULL, [{tv_sec=1482909419, tv_nsec=879714332}, {tv_sec=1482909415, tv_nsec=816363098}], 0) = 0 -- ownership is copied (only with 'sudo [strace] cp') fchown(4, 1000, 1000) = 0 -- extended attributes are copied (xdg.origin.url is set by browsers, 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 are not present, so a basic ACL is built from st_mode -- (in this case, a simple fchmod() would work as well) fgetxattr(3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (No data available) fsetxattr(4, "system.posix_acl_access", "\2\0\0\0\1\0\6\0\377\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 …
Es unterscheidet sich im Allgemeinen von Dateisystem zu Dateisystem, wo die Metadaten gespeichert werden. Auf der ext2-Familie von Dateisystemen werden die von Ihnen erwähnten Metadaten (Eigentümer, Gruppe, Berechtigungen, Zeit) im Inode gespeichert. Der Inode speichert (Zeiger auf) auch die Blöcke, die die Datei auf der Festplatte belegt. Der Inode nicht den Dateinamen speichern.
Auf diese Daten können Sie mit dem stat
zugreifen Systemaufruf (man 2 stat
) und verwenden Sie den stat
Werkzeug zum Ausdrucken (man stat
). Eine ausführliche Beschreibung der Inode-Felder finden Sie in linux/include/linux/fs.h
in der Kernelquelle.
Es gibt andere Arten von Metadaten (z. B. ACL-Berechtigungen), die an anderen Stellen gespeichert werden.
Metadaten werden standardmäßig nicht kopiert, wenn Sie die Datei kopieren. Stattdessen wird eine neue Datei mit Standard-Metadatenwerten erstellt. Es gibt verschiedene Optionen für cp
(-p
, --preserve
), die cp
anweisen auch Metadaten zu kopieren, indem Sie die alten Metadaten mit stat
auslesen und die neuen Metadaten entsprechend ändern.
Je nach Dateisystem werden Bereiche entweder (semi-)statisch oder dynamisch reserviert, um Metadaten wie Berechtigungen, Größe und andere (manchmal auch den Dateinamen) aufzunehmen.
In Unix werden Metadaten im Inode gespeichert Steuern des Datenbereichs, in dem sich die Datei befindet (während Dateinamen und zugehörige Inode-Nummern in einem Verzeichniseintrag gespeichert werden).
In manchen Dateisystemen sind Verzeichniseinträge Dateien wie alle anderen, aber 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 bzw. bearbeiten ihn, der den Ordner beschreibt, in dem sich die Datei befindet. Jeder Eintrag ist groß genug, um Dateigröße, Name und Datum und sonst nichts 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 im Inode. Auf diese Weise können zwei Einträge auf dieselbe Datei verweisen, was nützlich ist, um doppelte Dateien zu verwalten.
In einigen Dateisystemen können Inodes groß genug sein, um zusätzlich zu den Metadaten eine kleine Datenmenge aufzunehmen, sodass die Datei, wenn sie dort hineinpasst, keinen zusätzlichen Speicherplatz belegt. Sie erstellen eine 45-Byte-Datei und der freie Speicherplatz ändert sich überhaupt nicht; diese Bytes werden innerhalb gespeichert der Inod. 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 noch anderen Dateisystemen gibt es neben dem Hauptdateisystem so etwas wie ein "Phantom" -Dateisystem, das diese zusätzlichen Attribute speichert. Nicht nur Dateiinformationen, sondern möglicherweise auch Dateisymbole.
Einige Systeme haben beides:NTFS hat die vollständigen Verzeichnis-Metadaten, die auf Inode-ähnliche Weise arbeiten, und die Möglichkeit, alternative Datenströme zu erstellen enthält weitere Informationen, die (anscheinend) nichts in der "Haupt"-Datei ändern.