Чому розмір каталогу завжди становить 4096 байтів в unix?


26

Я впевнений, що файл каталогу містить набагато менше інформації, ніж 4096 байт. Я знаю, що розмір сектора становить 4096 байт. Але нормальні файли менші, ніж вони, є.

Чому Unix резервує 4096 байт для кожної папки?

Відповіді:


30

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

Наприклад:

$ mkdir testdir
$ cd testdir
$ ls -ld .
drwxr-xr-x 2 matthew matthew 4096 2007-12-03 20:28 ./
$ for ((i=0; i<1000; i++)); do touch some_longish_file_name_$i; done
$ ls -ld .
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 ./
$ rm some_longish_file_name_*
$ ls -ld .
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 ./
$ cd ..
$ ls -ld testdir
drwxr-xr-x 2 matthew matthew 36864 2007-12-03 20:29 testdir/
$ rmdir testdir ; mkdir testdir
$ ls -ld testdir
drwxr-xr-x 2 matthew matthew 4096 2007-12-03 20:29 testdir/

джерело


3
Дякуємо за те, що "простір не звільнено, якщо файли видалено". Я відновив резервну копію і не знав, чому два ідентичні каталоги мали різні розміри.
Томаш Зелінський

11

Іноді 4096 байт - це найменша одиниця розподілу для деяких файлових систем. Ось чому каталог має 4096.

Те саме стосується файлів. Незважаючи на те, що деякі файли можуть повідомляти менше 4096, вони фактично займають принаймні 4096 пам’яті з диска.


4
Так, як сказав Пабло. Розмір, який ви дивитесь у файлі, - це розмір вмісту файлів, а не розмір файлів на диску. Розмір диска цих маленьких файлів насправді становить 4096, як і каталог, оскільки він може виділяти дисковий простір лише в блоках такого розміру
Ден МакГрат

1
Це не має нічого спільного з питанням.
harrymc

Це неправильно. Дивіться прийняту відповідь.
Дункан X Сімпсон

Неправильно? Чи не поєднання обох відповідей? 4096 - розмір сторінки, для отримання додаткової інформації див. Системи підкачки пам'яті.
Harrichael

5

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


3

Це залежить від файлової системи. Для ext2 / 3/4 це "є" 4096. На рейзерфі може бути 9608 (мій $HOME) 1032 ( /tmp) або 48 (деякий dir in /tmp).

За замовчуванням у ext2 / 3/4 блок становить 4096 - і файл не може займати менше цього. Якщо файл менший, він все одно займає цілий блок. Оскільки безглуздо запитувати про логічний розмір каталогів, і ця інформація, ймовірно, все одно не є на диску, і вона повинна щось повідомляти, вона повідомляє розмір блоку, менший за кількість взятих блоків, тобто фізичний простір, який було взято.


Я впевнений, що розмір файлу також не зберігається разом із файлами. Він обчислюється при необхідності. Але для файлів він повідомляє actualрозмір файлу.
Лазер

1
Розмір файлу зберігається разом з inode. Напевно ext2 inode містить розмір у байтах всередині нього. В іншому випадку неможливо було б знайти, де закінчується файл, як він \0є юридичним символом у двійкових файлах. PS. Можна створити FS, які не зберігають його, але просто не по-домашньому (і, мабуть, немає інших популярних).
Maciej Piechotka
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.