Куди йдуть метадані, коли ви зберігаєте файл?


28

Скажімо, Джонні створює файл EMPTY. Це називається foobar.py. Коли Джонні дозволяє його виконати, він біжить chmod 755 foobar.py. Тепер файл має метадані

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

Де всі ці метадані зберігаються у цьому файлі? Розмір файлу дорівнює 0, тож як він зберігає метадані при перенесенні на інший диск?


1
Я не експерт, але, мабуть, загальна відповідь полягає в тому, що коли у вас є жорсткий диск і ви робите 1+ розділи, ви форматуєте розділ за допомогою файлової системи, наприклад, Windows має тенденцію використовувати ntfs, а Linux може використовувати ex2, то Основна частина цього розділу призначена для вмісту файлу, але деяка невелика кількість його зарезервована для інших матеріалів, включаючи метадані.
барлоп

@barlop по суті правильний. Обидві системи використовують деякий простір для запису, де зберігаються файли; у NTFS "головна таблиця файлів" зберігає метадані, у ext2 + це "inode".
pjc50

@ pjc50 спасибі і метаданих убік, як називається річ, що знаходиться поза розділами? Я думаю, це залежить від того, чи є річ MBR чи GPT. У MBR річ називається MBR .. Як це називається в GPT? (Я розумію, що GPT має застарілий MBR, але чи є у нього теж своя річ, поза всіма розділами?)
barlop

Пов’язано: (в основному те саме, але питання стосується конкретно Windows) Як метадані файлу зберігаються у Windows?
gronostaj

2
"chmod 755 ... У файлі зараз є метадані ... -rw-r - r-- ...", ви маєте на увазі -rwxr-xr-x.
JoL

Відповіді:


42

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

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

Деякі метадані не копіюються. Встановлення права власності вимагає кореневих привілеїв, тому копії чужих файлів належать вам і займають вашу дискову квоту. Ctime (час зміни атрибутів) неможливо встановити вручну на Unixes; btime (час народження / створення) зазвичай також не копіюється.

Порівняйте cp -a foo bar(що копіює метадані) та cp foo bar(що ні):

$ strace -v cp foo bar
…
відкритий ("foo", O_RDONLY) = 3
відкритий ("бар", O_WRONLY | O_TRUNC) = 4
read (3, "тест \ n", 131072) = 5
написати (4, "тест \ n", 5) = 5
прочитати (3, "", 131072) = 0
закрити (4) = 0
закрити (3) = 0
…
$ strace -v cp -o 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
 - дані копіюються
відкритий ("foo", O_RDONLY | O_NOFOLLOW) = 3
відкритий ("бар", O_WRONLY | O_TRUNC) = 4
read (3, "тест \ 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
 - ACIX-файлів POSIX немає, тому базовий 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
закрити (4) = 0
закрити (3) = 0
…

3
для доповнення цієї відповіді слід зазначити: - при копіюванні на інший диск: метадані зчитуються з джерела та відтворюються на цілі, якщо налаштування (або параметри) апридатки (наприклад: зберігати дату, зберігати права чи навіть зберігати " все ") використовували (як ви згадали). 2) Альтернативою є спочатку зробити архів (.zip, .tar тощо) файлів і витягнути з цього архіву на цільовий, ще раз надавши програмі деяке місце (у форматі архіву), щоб знайти метадані, а конкретні параметри / налаштування дозволяють зберігати (або ні) ці метадані.
Олів'є Дулак

До другого абзацу: Що з stat (2)?
кіт

Дякую, що ви дали детальну відповідь на це одне питання, про яке я розмірковував.
молодшийрубіст

11

Зазвичай він відрізняється від файлової системи до файлової системи, де зберігаються метадані. У сімействі файлових систем ext2 метадані, які ви згадали (власник, група, дозволи, час), зберігаються в inode . Inode також зберігає (вказівники на) блоки, які файл займає на диску. Inode не зберігає ім'я файлу.

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

Існують інші види метаданих (наприклад, дозволи ACL ), які зберігаються в різних місцях.

Метадані не копіюються за замовчуванням під час копіювання файлу. Натомість створюється новий файл із значеннями метаданих за замовчуванням. Існують різні варіанти cp( -p, --preserve), які вказують cpтакож копіювати метадані, читаючи старі метадані з statта відповідно змінюючи нові метадані.


4

Залежно від файлової системи області резервуються або (напів-) статично, або динамічно, щоб містити метадані, такі як дозволи, розмір та інші (іноді також ім'я файлу).

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

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

У деяких файлових системах inodes може бути достатньо великим, щоб зберігати невелику кількість даних на додаток до метаданих, так що якщо файл може вміститися там, він не займає зайвого дискового простору. Ви створюєте 45-байтний файл, і вільний простір на диску зовсім не змінюється; ці байти зберігаються всередині inode. Я думаю, що сім'я ext * підтримує це (і також NTFS). Це допомагає керувати великою кількістю дуже малих файлів.

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

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


2
Імена файлів не зберігаються разом із файлом, вони є частиною inode каталогу. Ось чому важкі зв’язки працюють
Sobrique

ця відповідь суперечить dirkt's про те, де зберігаються імена файлів, мені цікаво, що це правильно
cat

Вибачте, я змішав речі, і @dirkt має на це право . Фіксуюча відповідь.
LSerni

Вони є частиною каталогу , але зазвичай не є частиною inode каталогу. Це специфічно для FS, але якщо ви думаєте про каталог як спеціальний файл, то його вміст буде переліком файлів (імена та їхні вставки).
grawity
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.