29

Скажи, Джонни делает ПУСТОЙ файл. Это называется foobar.py . Когда Джонни позволяет это выполнить, он запускает chmod 755 foobar.py . Файл теперь содержит метаданные

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

Где все эти метаданные хранятся в этом файле? Размер файла равен 0, так как он хранит метаданные при переносе на другой диск?

3 ответа3

42

Он не хранится в этом файле. Он хранится в файловой системе, и все параметры копируются вручную по одному (хотя некоторые не могут быть скопированы вообще).

То есть большинство операционных систем на самом деле не имеют вызова "копировать файл с метаданными". Программа file-copy просто создает новый файл с именем foobar.py , копирует все 0 байтов данных, затем использует utime() или SetFileTime(), чтобы время его модификации выглядело так же, как и у оригинала. Аналогично, права доступа к файлу можно "скопировать", заново установив их с помощью chmod() или скопировав атрибут POSIX ACL.

Некоторые метаданные не копируются. Установка собственности требует привилегий суперпользователя, поэтому копии файлов Чужих принадлежат вам и занять свою дисковую квоту. Ctime (время изменения атрибута) невозможно установить вручную в Unix; btime (время рождения / создания) обычно тоже не копируется.

Сравните cp -a foo bar (который копирует метаданные) и cp foo bar (который не копирует):

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

Обычно она отличается от файловой системы к файловой системе, где хранятся метаданные. В файловых системах семейства ext2 упомянутые вами метаданные (владелец, группа, права доступа, время) хранятся в inode. Индод также хранит (указатели) блоки, которые файл занимает на диске. Индод не хранит имя файла.

Вы можете получить доступ к этим данным с помощью системного вызова stat (man 2 stat) и использовать инструмент stat для его печати (man stat). Подробное описание полей inode можно найти в linux/include/linux/fs.h в исходном коде ядра.

Существуют другие виды метаданных (например, разрешения ACL), которые хранятся в разных местах.

Метаданные не копируются по умолчанию при копировании файла. Вместо этого создается новый файл со значениями метаданных по умолчанию. Существуют различные опции для cp (-p , --preserve), которые инструктируют cp также копировать метаданные, читая старые метаданные с помощью stat и соответственно изменяя новые метаданные.

4

В зависимости от файловой системы области зарезервированы (полу) статически или динамически для хранения метаданных, таких как разрешения, размер и другие (иногда также и имя файла).

В Unix метаданные хранятся в inode, контролирующем область данных, в которой находится файл (в то время как имена файлов и соответствующие номера inode хранятся в записи каталога).

В некоторых файловых системах записи каталога являются файлами, как и любые другие, но скрыты от глаз. FAT и FAT32 являются такими файловыми системами (хотя корневой каталог FAT является "специальным"). Когда вы создаете файл, вы добавляете / редактируете запись в файле, которая описывает папку, в которой находится файл. Каждая запись достаточно велика для хранения размера файла, имени и даты и ничего больше (длинные имена занимают несколько записей; размер записи по умолчанию 32 байта может содержать одно имя в старом 8+3 символьном формате. Все это, конечно, при условии, что моя память работает). Система Ext похожа, но запись каталога имеет динамический размер и содержит только имя и указатель inode; Вся остальная информация находится в inode. Таким образом, две записи могут указывать на один и тот же файл, что полезно для управления дублирующимися файлами.

В некоторых файловых системах inode может быть достаточно большим, чтобы содержать небольшой объем данных в дополнение к метаданным, так что, если файл может туда поместиться, он не займет дополнительное дисковое пространство. Вы создаете 45-байтовый файл, и свободное место на диске не меняется вообще; эти байты хранятся внутри inode. Я думаю, что семейство ext * поддерживает это (и NTFS тоже). Это помогает управлять большим количеством очень маленьких файлов.

В других файловых системах есть то, что составляет "фантомную" файловую систему вдоль основной, которая хранит эти дополнительные атрибуты. Не только информация о файле, но, возможно, и значки файлов .

Некоторые системы имеют и то и другое: NTFS имеет полные метаданные каталогов, работающие в стиле inode, и возможность создавать альтернативные потоки данных, содержащие дополнительную информацию, которая (очевидно) ничего не меняет в "основном" файле.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .