web-dev-qa-db-fra.com

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

Dites que Johnny crée un fichier VIDE. Cela s'appelle foobar.py. Lorsque Johnny autorise l'exécution, il exécute chmod 755 foobar.py. Le fichier contient maintenant les métadonnées de

-rw-r--r-- 1 johnny staff    0 Dec 27 22:53 foobar.py

Où se trouvent toutes ces métadonnées stockées dans ce fichier? La taille du fichier est 0. Comment conserve-t-il les métadonnées lorsqu’elles sont transférées sur un autre lecteur?

29
juniorRubyist

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 (même si certains ne peuvent pas être copiés du tout).

Autrement dit, la plupart des systèmes d'exploitation ne disposent pas vraiment d'un 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 les 0 octets de données en entier, puis utilise utime () ou SetFileTime () pour que son heure de modification soit identique à celle de l'original. De même, les autorisations sur les fichiers seraient "copiées" en les redéfinissant à l'aide de chmod () ou en copiant l'attribut POSIX ACL.

Certaines métadonnées ne sont pas copiées. La définition de la propriété nécessite des privilèges root. Par conséquent, les copies des fichiers de quelqu'un d'autre vous appartiennent et occupent votre quota de disque . Il est impossible de définir manuellement ctime (attribut change time) sur 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 (qui ne le fait pas):

 $ strace -v cp foo bar 
… 
 ouvert ("foo", O_RDONLY) = 3 
 ouvert ("bar", O_WRONLY | O_TRUNC) = 4 
 lire (3, "test\n", 131072) = 5 
 écrire (4, "test\n", 5) = 5 
 lire (3, "", 131072) = 0 
 Fermer (4) = 0 
 Fermer (3) = 0 
… 
 $ strace -v cp - un foo bar 
… 
 - les métadonnées d'origine sont récupérées 
 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 
 - les données sont copiées 
 Ouvert ("foo", O_RDONLY | O_NOFOLLOW) = 3 
 Ouvert ("bar", O_WRONLY | O_TRUNC) = 4 
 read (3, "test\n", 131072) = 5 
 écrire (4, "test\n", 5) = 5 
 read (3, "", 131072) = 0 
 - le temps de modification est copié 
 utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332}, 
 {tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0 
 - la propriété est copiée (uniquement avec 'Sudo [strace] cp') 
 fchown (4, 1000, 1000) = 0 
 - les attributs étendus sont copiés (xdg.Origin.url est défini par les navigateurs, wget) 
 flistxattr (3, NULL, 0) = 0 
 flistxattr (3, "user.xdg.Origin.url\0", 20) = 20 
 fgetxattr (3, "user.xdg.Origin.url", "https: // superutilisateur. com/", 22) = 22 
 fsetxattr (4," user.xdg.Origin.url "," https://superuser.com/ ", 22, 0) = 0 
 - - Les ACL POSIX n'étant pas présents, une ACL de base est construite à partir de st_mode 
 - (dans ce cas, un simple fchmod () fonctionnerait aussi) 
 Fgetxattr (3, "system.posix_acl_access ", 0x7ffc87a50be0, 132) = -1 ENODATA (aucune donnée disponible) 
 Fsetxattr (4," system.posix_acl_access ","\2\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 
 Fermer ( 4) = 0 
 Fermer (3) = 0 
… 
43
grawity

Il diffère généralement d'un système de fichiers à l'autre, dans lequel 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 (les pointeurs vers) les blocs que le fichier occupe sur le disque. L'inode ne stocke pas le nom de fichier .

Vous pouvez accéder à ces données avec l'appel système stat (man 2 stat) et utiliser l'outil stat pour les imprimer (man stat). Une description détaillée des champs inode se trouve 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 à des emplacements différents.

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 ordonnent à cp de copier également les métadonnées en lisant les anciennes métadonnées avec stat et en les modifiant en conséquence.

12
dirkt

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

Sous Unix, les métadonnées sont stockées dans l’inode contrôlant 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 masqués. FAT et FAT32 sont de tels systèmes de fichiers (le répertoire racine de FAT est "spécial" cependant). Lorsque vous créez un fichier, vous ajoutez/modifiez une entrée dans le fichier qui décrit le dossier dans lequel se trouve le fichier. Chaque entrée est suffisamment grande pour stocker la taille du fichier, le nom, la date et rien d'autre (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 caractères 8 + 3. Tout cela, bien sûr. , en supposant que ma mémoire fonctionne). Le système Ext est similaire, mais l'entrée de répertoire est de taille dynamique et ne contient que le nom et le pointeur 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. Ainsi, 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 disponible ne change pas du tout. ces octets sont stockés à l'intérieur de l'inode. Je pense que la famille ext * supporte cela (et NTFS aussi). Cela aide à gérer un grand nombre de très petits fichiers.

Dans d’autres systèmes de fichiers, il existe un système de fichiers "fantôme" qui stocke ces attributs supplémentaires. Non seulement les informations sur les fichiers, mais éventuellement aussi les icônes de fichiers .

Certains systèmes ont les deux: NTFS possède les métadonnées de l'annuaire complet fonctionnant comme un inode, et la possibilité de créer des flux de données alternatifs contenant des informations supplémentaires qui ne modifient (apparemment) rien dans le fichier "principal".

4
LSerni