Není uloženo v ten soubor. Je uložen v souborovém systému a všechny parametry jsou zkopírovány ručně jeden po druhém (ačkoli některé nelze zkopírovat vůbec).
To znamená, že většina operačních systémů ve skutečnosti nemá volání „kopírovat soubor s metadaty“. Program pro kopírování souborů pouze vytvoří nový soubor s názvem foobar.py
, zkopíruje celých 0 bajtů dat a poté použije utime() nebo SetFileTime(), aby jeho čas úpravy vypadal stejně jako originál. Podobně by byla oprávnění k souboru "zkopírována" jejich novým nastavením pomocí chmod() nebo zkopírováním atributu POSIX ACL.
Některá metadata se nezkopírují. Nastavení vlastnictví vyžaduje oprávnění uživatele root, takže kopie souborů někoho jiného patří vám a zabírají vaše disková kvóta. Na Unixech není možné ručně nastavit ctime (čas změny atributu); Obvykle se nekopíruje ani btime (čas narození/vytvoření).
Porovnejte cp -a foo bar
(která zkopíruje metadata) a cp foo bar
(což ne):
$ 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 …
Obecně se liší souborový systém od souborového systému, kde jsou metadata uložena. U souborových systémů ext2 jsou vámi zmíněná metadata (vlastník, skupina, oprávnění, čas) uložena v inode. Inode také ukládá (ukazuje na) bloky, které soubor zabírá na disku. Inode není uložit název souboru.
K těmto datům můžete přistupovat pomocí stat
systémové volání (man 2 stat
) a použijte stat
nástroj pro jeho tisk (man stat
). Podrobný popis polí inodů lze nalézt v linux/include/linux/fs.h
ve zdrojovém kódu jádra.
Existují další druhy metadat (např. oprávnění ACL), které jsou uloženy na různých místech.
Metadata se ve výchozím nastavení při kopírování souboru nezkopírují. Místo toho se vytvoří nový soubor s výchozími hodnotami metadat. Existují různé možnosti cp
(-p
, --preserve
), které instruují cp
také zkopírovat metadata přečtením starých metadat pomocí stat
a odpovídajícím způsobem upravit nová metadata.
V závislosti na souborovém systému jsou oblasti rezervovány buď (polo)staticky nebo dynamicky pro uchování metadat, jako jsou oprávnění, velikost a další (někdy také název souboru).
V Unixu jsou metadata uložena v inode ovládání datové oblasti, kde se soubor nachází (zatímco názvy souborů a související čísla inodů jsou uloženy v položce adresáře).
V některých souborových systémech jsou položky adresáře soubory jako kterékoli jiné, ale skryté. FAT a FAT32 jsou takové souborové systémy (kořenový adresář FAT je však "speciální"). Při vytváření souboru přidáte/upravíte záznam v souboru, který popisuje složku, kde se soubor nachází. Každá položka je dostatečně velká, aby se do ní vešla velikost souboru, jméno a datum a nic jiného (dlouhá jména zabírající více položek; výchozí velikost položky 32 bajtů může obsahovat jediné jméno ve starém formátu 8+3 znaků. To vše samozřejmě za předpokladu, že moje paměť funguje). Ext systém je podobný, ale položka adresáře má dynamickou velikost a obsahuje pouze jméno a ukazatel na inode; všechny ostatní informace jsou v inode. Tímto způsobem mohou dvě položky ukazovat na stejný soubor, což je užitečné pro správu duplicitních souborů.
V některých souborových systémech mohou být inody dostatečně velké, aby pojaly kromě metadat i malé množství dat, takže pokud se tam soubor vejde, nezabírá místo na disku navíc. Vytvoříte 45bajtový soubor a volné místo na disku se vůbec nezmění; tyto bajty jsou uloženy uvnitř inod. Myslím, že rodina ext* to podporuje (a také NTFS). To pomáhá spravovat velké množství velmi malých souborů.
V ještě dalších souborových systémech existuje to, co se rovná "fantomovému" souborovému systému podél hlavního systému, který ukládá tyto extra atributy. Nejen informace o souborech, ale možná i ikony souborů.
Některé systémy mají obojí:NTFS má úplná metadata adresáře fungující jako inode a možnost vytvářet alternativní datové toky držení dalších informací, které (zřejmě) nic nemění v "hlavním" souboru.