Яка концепція створення файлу з нульовими байтами в Linux?


32

Якщо я виконую наступне:

touch /tmp/test

а потім виконуйте

ls -la /tmp/

Я міг бачити testфайл з 0 байтами в каталозі.

Але як операційна система обробляє концепцію 0 байт . Якщо я висловлюся це як мирянин:

0 Байт - це зовсім не пам'ять, тому нічого не створюється.

Створення файлу, повинно або має, принаймні, вимагати певної пам'яті, правда?


Відповіді:


63

У файлі (приблизно) три окремі речі:

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

Коли ви створюєте порожній файл, ви створюєте лише вкладку і запис каталогу, що вказує на цю ділу. Те саме для розріджених файлів ( dd if=/dev/null of=sparse_file bs=10M seek=1).

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

Я тут спростив речі, але ви розумієте.


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

4
@ Теофраст Добре. Я зробив можливе спростити справи. Насправді між списком блоків та записами в каталозі є метадані, що відносяться до файлу (згаданому номером inode) і містять атрибути файлу (власник, дозволи, ...) та розширені атрибути. Список блоків є там. Отже всі записи каталогів не вказують безпосередньо на список блоків (спосіб FAT), а на метадані.
— xhienne

6
Повинні бути три окремі речі: Список блоків, що містять дані; самі блоки ; і запис каталогу (або записи), який вказує на список блоків.
— Wildcard

@Wildcard Я подав редагування, щоб зробити його трьома речами, і назвав inode за її назвою. І inode, і каталоги є метаданими; але вони різні види метаданих. У файлі завжди є одна inode і принаймні одна запис каталогу. Цей вклад може містити порожній список блоків даних.
— Monty Harder

1
@Wildcard Навіть якщо ви новачок, важливо розуміти різницю між inode та каталогом. Коли хтось змінить дозволи / права власності на "ім'я каталогу" і думає, що інші посилання на той самий inode збережуть старі дозволи / права власності, може статися щось дуже погано. Нам не потрібно заглиблюватися в подробиці того, як inode посилаються на прямі блоки, непрямі блоки, блоки вдвічі та вдвічі непрямі, щоб зрозуміти, що це список блоків. Або що список може бути порожнім.
— Monty Harder

24

touchстворить індексний дескриптор , і ls -iчи statбуде відображатися інформація про инода:

$ touch test
$ ls -i test
28971114 test
$ stat test
  File: ‘test’
  Size: 0           Blocks: 0          IO Block: 4096   regular empty file
Device: fc01h/64513d    Inode: 28971114    Links: 1
Access: (0664/-rw-rw-r--)  Uid: ( 1000/1000)   Gid: ( 1000/1000)
Access: 2017-03-28 17:38:07.221131925 +0200
Modify: 2017-03-28 17:38:07.221131925 +0200
Change: 2017-03-28 17:38:07.221131925 +0200
 Birth: -

Зауважте, що testвикористовується 0 блоків. Для зберігання відображуваних даних inode використовує деякі байти. Ці байти зберігаються в таблиці inode. Подивіться на сторінку ext2 для прикладу структури inode .


19

ls(або добре, stat(2)системний виклик) повідомляє вам розмір вмісту файлу. Скільки місця потрібна файловій системі для ведення бухгалтерського обліку, це не є частиною цього, і, як детальна інформація про реалізацію, програми взагалі не повинні турбуватись або навіть знати про них. Зростання видимих ​​деталей про реалізацію зробить абстракцію файлової системи менш корисною.


9

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


4
Якщо ви подивитесь на простір, який займає запис каталогу, якщо у вас є каталог, що містить тисячу файлів розміром 0 байт, то каталог буде більшим, ніж запис каталогу, який містить всього 2 величезні файли.
— Марк Стюарт

2
реквізит для згадки про те, що файл - це абстрактне поняття, яке не тісно пов'язане з його фізичним поданням, наприклад, на диску.
— Флоріан Кастеллайн

5

Проста відповідь: Тому що це визначено саме так.

Більш довга відповідь: Це визначено таким чином, оскільки деякі операції концептуально простіші:

  • Якщо файл містить 20 букв "А", а ви видалите всі "А", то файл стане на 20 байт коротшим. Та сама операція над файлом, яка складалася лише з "AAAAAAAAAAAAAAAAAAAAA", повинна мати справу з особливим випадком зникаючого файлу.
  • Більш практично, видалення останнього рядка текстового файлу потребує спеціального обліку.
  • Текстовим редакторам, які регулярно створюють резервну копію, потрібен спеціальний код для вирішення ситуації, коли користувач може видалити останній рядок, перейти до обіду, а потім повернутися та додати ще один рядок. Подальші ускладнення виникають, якщо деякі інші користувачі створили файл з цим іменем в середній час.

Ви можете зробити більше: * Файли журналу помилок, як правило, створюються порожніми, заповнюються лише тоді, коли трапляється помилка. * Щоб дізнатися, скільки помилок трапилось, ви рахуєте кількість рядків у файлах журналу. Якщо файл журналу порожній, кількість помилок дорівнює нулю, що має ідеальний сенс. * Іноді ви бачите файли, де весь відповідний текст є у назві файлу, наприклад this-is-the-logging-directory. Це не дозволяє адміністраторам надмірних видалень видаляти порожні каталоги після встановлення, а також запобігає помилкам, коли програма або користувач випадково створює файл, де програма хотіла б побачити каталог пізніше. gitПрограма (і інші) , як правило, ігнорують порожні каталоги, і якщо проект / адміністратор / користувач хоче мати запис про те , що каталог існує , навіть якщо він не має ніякого корисного змісту (поки), ви можете побачити порожній файл з ім'ямemptyабо empty.directory.

Жодні операції не ускладнюються:

  • Зв’язування файлів: це просто неоперація з порожнім файлом.
  • Пошук рядка у файлі: це стосується стандартного випадку "якщо файл коротший за пошуковий термін, він не може містити пошуковий термін".
  • Читання з файлу: програми повинні мати справу з тим, щоб потрапити в кінець файлу, перш ніж вони отримали те, що очікували, тож знову ж таки справа файлу нульової довжини не передбачає додаткового мислення для програміста: він просто натисне в кінці -файл з початку.

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

Загалом, всі вищезазначені причини, крім тих, що стосуються імен файлів, стосуються послідовностей. Найбільш помітно для рядків, які є послідовностями символів: Рядки нульової довжини є звичайним явищем у програмах. Рядок зазвичай заборонено на рівні користувача, якщо вони не мають сенсу: ім'я файлу - це рядок, і більшість файлових систем не дозволяють порожній рядок як ім'я файлу; внутрішньо, створюючи імена файлів з фрагментів, програма цілком може мати порожній рядок як один із фрагментів.


1

Використовуючи найпростішу аналогію:

Порівняємо файл з, скажімо, склянкою води.

'touch / tmp / test' дуже схоже на створення порожнього келиха, без води у ньому. Склянка порожня, тому її розмір дорівнює нулю. Але скло все-таки існує.

У мовній системі файлів скло є метаданими, тоді як вміст скла - це дані. Метадані містять усілякі матеріали, як згадувалось у попередніх публікаціях.

Файли з нульовим розміром можуть бути корисними. Одним із прикладів є використання їх як сухаря, де саме його існування може бути використане для позначення якогось стану (тобто, якщо файл існує: тоді зробіть щось; якщо ні: ігноруйте).


0

Подумайте про це так: скажіть, що програма відстежує SQL запити, надіслані на ваш сервер. Програма хоче вказати, що вона записує запити в звичайний текстовий файл, але жодних запитів ще не записано. Як це має виглядати? Я б стверджував, що це повинен бути файл нульового розміру в /var/log/acme-sql-server/queries.log. Таким чином, ви могли зрозуміти, коли почався журнал (час створення файлу), коли він востаннє оновлювався (тобто коли він був створений), скільки запитів було записано (кількість нових рядків у файлі = 0) та хто робить журнал (Acme SQL Server). У таких випадках корисно мати концепцію порожнього файлу, який все-таки існує у певному місці.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.