GNU/Linux >> Tutoriels Linux >  >> Linux

Où vont les métadonnées lorsque vous enregistrez un fichier ?

Il n'est pas stocké dans ce fichier. Il est stocké dans le système de fichiers et tous les paramètres sont copiés manuellement un par un (bien que certains ne puissent pas du tout être copiés).

C'est-à-dire que la plupart des systèmes d'exploitation n'ont pas vraiment d'appel "copier le fichier avec les métadonnées". Le programme de copie de fichier crée simplement un nouveau fichier nommé foobar.py , copie l'intégralité des 0 octets de données, puis utilise utime() ou SetFileTime() pour que son heure de modification soit identique à celle de l'original. De même, les autorisations de fichiers seraient "copiées" en les définissant à nouveau à l'aide de chmod() ou en copiant l'attribut POSIX ACL.

Certaines métadonnées ne sont pas copiées. Définir la propriété nécessite des privilèges root, donc les copies des fichiers de quelqu'un d'autre vous appartiennent et occupent votre quota de disque. Le ctime (temps de changement d'attribut) est impossible à définir manuellement sur les Unix ; btime (heure de naissance/création) n'est généralement pas copié non plus.

Comparez cp -a foo bar (qui copie les métadonnées) et cp foo bar (ce qui n'est pas le cas) :

$ 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
…

Il diffère généralement d'un système de fichiers à l'autre où les métadonnées sont stockées. Sur la famille de systèmes de fichiers ext2, les métadonnées que vous avez mentionnées (propriétaire, groupe, autorisations, heure) sont stockées dans l'inode. L'inode stocke également (des pointeurs vers) les blocs que le fichier occupe sur le disque. L'inode ne le fait pas stocker le nom du fichier.

Vous pouvez accéder à ces données avec le stat appel système (man 2 stat ), et utilisez le stat outil pour l'imprimer (man stat ). Une description détaillée des champs inode peut être trouvée dans linux/include/linux/fs.h dans la source du noyau.

Il existe d'autres types de métadonnées (par exemple, les autorisations ACL) qui sont stockées à différents endroits.

Les métadonnées ne sont pas copiées par défaut lorsque vous copiez le fichier. Au lieu de cela, un nouveau fichier avec des valeurs de métadonnées par défaut est créé. Il existe différentes options pour cp (-p , --preserve ) qui indique cp pour copier également les métadonnées, en lisant les anciennes métadonnées avec stat et modifier les nouvelles métadonnées en conséquence.


Selon le système de fichiers, des zones sont réservées de manière (semi-)statique ou dynamique pour contenir des métadonnées telles que les autorisations, la taille et autres (parfois aussi le nom du fichier).

Sous Unix, les métadonnées sont stockées dans l'inode contrôler la zone de données où réside le fichier (tandis que les noms de fichier et les numéros d'inode associés sont stockés dans une entrée de répertoire).

Dans certains systèmes de fichiers, les entrées de répertoire sont des fichiers comme les autres, mais cachés. FAT et FAT32 sont de tels systèmes de fichiers (le répertoire racine de FAT est cependant "spécial"). Lorsque vous créez un fichier, vous ajoutez/modifiez une entrée dans le fichier qui décrit le dossier où réside le fichier. Chaque entrée est suffisamment grande pour stocker la taille du fichier, le nom et la date, et rien d'autre (des noms longs occupant plusieurs entrées; la taille d'entrée par défaut de 32 octets peut contenir un seul nom dans l'ancien format de 8+3 caractères. Tout cela, bien sûr , en supposant que ma mémoire fonctionne). Ext system est similaire, mais l'entrée de répertoire est dimensionnée dynamiquement et ne contient que le nom et le pointeur d'inode; toutes les autres informations sont dans l'inode. De cette façon, deux entrées peuvent pointer vers le même fichier, ce qui est utile pour gérer les fichiers en double.

Dans certains systèmes de fichiers, les inodes peuvent être suffisamment volumineux pour contenir une petite quantité de données en plus des métadonnées, de sorte que si le fichier peut y tenir, il n'occupe pas d'espace disque supplémentaire. Vous créez un fichier de 45 octets et l'espace disque libre ne change pas du tout; ces octets sont stockés à l'intérieur l'inode. Je pense que la famille ext * prend en charge cela (et NTFS aussi). Cela permet de gérer un grand nombre de très petits fichiers.

Dans d'autres systèmes de fichiers encore, il existe ce qui équivaut à un système de fichiers "fantôme" le long du système principal, qui stocke ces attributs supplémentaires. Non seulement les informations sur les fichiers, mais également les icônes de fichiers.

Certains systèmes ont les deux :NTFS a les métadonnées complètes du répertoire fonctionnant à la manière d'un inode et la possibilité de créer des flux de données alternatifs contenant d'autres informations qui ne changent (apparemment) rien dans le fichier "principal".


Linux
  1. Le fichier de métadonnées ne correspond pas à la somme de contrôle - erreur YUM !

  2. Les utilitaires Linux sont-ils intelligents lors de l'exécution de commandes canalisées ?

  3. Exécuter une commande où un fichier est trouvé ?

  4. Encodage d'un fichier Zip ?

  5. Linux - Cp perd les métadonnées du fichier ?

Que faire lorsque vous voyez l'erreur "Le référentiel n'a pas de fichier de version" dans Ubuntu

Linux – Où sont les métadonnées pour les fichiers PDF ? Puis-je insérer des métadonnées dans n'importe quel fichier PDF ?

Linux - Que se passe-t-il lorsque vous vous synchronisez sans chemin de destination ? ?

Problème "Le fichier de métadonnées ne correspond pas à la somme de contrôle" lorsque Yum installe ou met à jour le package

Que signifie l'astérisque après un nom de fichier lorsque vous tapez `ls -l` ?

Comment enregistrer + fermer le fichier lors de l'édition en bash ?