Куда идут метаданные при сохранении файла?

28

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

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

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

juniorRubyist
источник
1
я не эксперт, но я предполагаю, что общий ответ таков: когда у вас жесткий диск и вы создаете разделы 1+, вы форматируете раздел с помощью файловой системы, например, Windows имеет тенденцию использовать ntfs, а linux может использовать ex2, тогда Основная часть этого раздела предназначена для содержимого файлов, но небольшая его часть зарезервирована для других вещей, включая метаданные.
Барлоп
@ barlop по существу правильно. Обе системы используют место для записи, где хранятся файлы; в NTFS «главная таблица файлов» хранит метаданные, в ext2 + она находится в «inodes».
pjc50
@ pjc50 спасибо. и метаданные в сторону, как называется вещь, которая находится за пределами разделов? Я полагаю, это зависит от того, является ли MBR или GPT. В MBR это называется MBR. Как это называется в GPT? (Я понимаю, что у GPT есть устаревшая MBR, но у нее тоже есть своя вещь, кроме всех разделов?)
barlop
Связанный: (в основном то же самое, но вопрос конкретно о Windows) Как метаданные файла хранятся в Windows?
Гроностай
2
"chmod 755 ... Файл теперь содержит метаданные ... -rw-r - r-- ..." Вы имеете в виду -rwxr-xr-x.
JoL

Ответы:

42

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

То есть большинство операционных систем на самом деле не имеют вызова «копировать файл с метаданными». Программа для копирования файлов просто создает новый файл с именем 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
запись (4, "тест \ n", 5) = 5
читать (3, "", 131072) = 0
close (4) = 0
close (3) = 0
...
$ strace -v cp -a foo bar
...
 - исходные метаданные извлекаются
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
 - данные копируются
open ("foo", O_RDONLY | O_NOFOLLOW) = 3
open ("bar", O_WRONLY | O_TRUNC) = 4
read (3, "test \ n", 131072) = 5
запись (4, "тест \ n", 5) = 5
читать (3, "", 131072) = 0
 - время модификации копируется
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
                    {tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
 - собственность копируется (только с 'sudo [strace] cp')
fchown (4, 1000, 1000) = 0
 - расширенные атрибуты копируются (xdg.origin.url устанавливается браузерами, 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 ACL отсутствуют, поэтому базовый ACL создается из st_mode
 - (в этом случае простой fchmod () также будет работать)
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (данные отсутствуют)
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
...
grawity
источник
3
в дополнение к этому ответу вы должны упомянуть: - при копировании на другой диск: метаданные считываются из источника и воспроизводятся на целевом устройстве, если соответствующие параметры (или параметры) (например, сохранить дату, сохранить права или даже сохранить) все ") были использованы (как вы упомянули). 2) Альтернативой является сначала сделать архив (.zip, .tar и т. Д.) Файлов и извлечь из этого архива целевой объект, еще раз предоставив программе некоторое место (в формате архива) для поиска метаданных, и конкретные параметры / настройки позволяют сохранять (или нет) эти метаданные.
Оливье Дюлак
Ко второму абзацу: а как насчет stat (2)?
кот
Спасибо, что дали мне подробный ответ на этот вопрос, который я обдумывал.
juniorRubyist
11

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

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

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

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

dirkt
источник
4

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

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

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

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

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

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

LSerni
источник
2
Имена файлов не сохраняются вместе с файлом, они являются частью индекса каталога. Вот почему трудные ссылки работают
Sobrique
этот ответ противоречит dirkt о том, где хранятся имена файлов, я задаюсь вопросом, что правильно
кот
Извините, я все перепутал, и @dirkt имеет на это право . Исправление ответа.
LSerni
Они являются частью каталога , но обычно не являются частью его каталога. Это специфично для FS, но если вы думаете о каталоге как о специальном файле, то его содержимым будет список файлов (имен и их inode).
grawity