24

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

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

4 ответа4

27

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

Например:

$ 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/

источник

10

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

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

4

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

3

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .