Почему размер каталога всегда 4096 байт в Unix?

26

Я уверен, что файл каталога содержит гораздо меньше информации, чем 4096 байт. Я знаю, что размер сектора составляет 4096 байт. Но нормальные файлы меньшего размера существуют.

Почему Unix резервирует 4096 байт для каждой папки?

Lazer
источник

Ответы:

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/

источник

harrymc
источник
3
Спасибо за "пространство не освобождается, если файлы удалены" часть. Я восстановил резервную копию и не был уверен, почему два одинаковых каталога имели разные размеры.
Томаш Зелиньски,
11

Иногда 4096 байт является наименьшей единицей выделения для некоторых файловых систем. Вот почему в каталоге 4096.

То же самое относится и к файлам. Несмотря на то, что некоторые файлы могут содержать менее 4096, они фактически занимают как минимум 4096 места на диске.

Пабло Санта Круз
источник
4
Да, как сказал Пабло. Размер файла, который вы просматриваете, - это размер содержимого файла, а не размер файла. Размер этих маленьких файлов на диске фактически равен 4096, точно так же как каталог, поскольку он может только распределять дисковое пространство в блоках такого размера
Дэн МакГрат,
1
Это не имеет ничего общего с вопросом.
Harrymc
Это неверно Смотрите принятый ответ.
Дункан Х Симпсон
Некорректное? Разве это не комбинация обоих ответов? 4096 - размер страницы, для получения дополнительной информации см. Системы подкачки памяти.
Harrichael
5

4096 зарезервирован для уменьшения фрагментации, потому что часто фактический размер содержащихся метаданных будет колебаться в зависимости от содержимого каталога. Если он постоянно растет и сокращается (скажем, содержит файлы журнала или динамическое содержимое), это может снизить производительность. Скорее всего, этого не произойдет с одной папкой, но во всей файловой системе все сложится быстро.

MDMarra
источник
3

Это зависит от файловой системы. На ext2 / 3/4 это "is" 4096. На reiserfs это может быть 9608 (my $HOME), 1032 ( /tmp) или 48 (некоторые dir in /tmp).

По умолчанию в ext2 / 3/4 блок равен 4096 - и файл не может занять меньше этого. Если файл меньше, он все равно занимает целый блок. Поскольку бессмысленно спрашивать о логическом размере каталога, и эта информация, вероятно, в любом случае отсутствует на диске, и он должен сообщать о чем-то, он сообщает размер блока, умноженный на количество принятых блоков, то есть на занятое физическое пространство.

Мацей Печотка
источник
Я уверен, что размер файла также не сохраняется с файлами. Он вычисляется при необходимости. Но для файлов он сообщает actualразмер файла.
Лазер
1
Размер файла сохраняется вместе с индексом. Конечно, ext2 inode содержит размер в байтах внутри него. В противном случае было бы невозможно найти, где заканчивается файл, как \0является допустимым символом в двоичных файлах. PS. Можно создать ФС, который не хранит ее - но просто не очень знакомый (и, вероятно, не пользующийся популярностью).
Мацей Печотка