Я уверен, что файл каталога содержит гораздо меньше информации, чем 4096 байт. Я знаю, что размер сектора составляет 4096 байт. Но нормальные файлы меньшего размера существуют.
Почему Unix резервирует 4096 байт для каждой папки?
Это начальный размер, необходимый для хранения метаданных о файлах, содержащихся в этом каталоге (включая имена). Первоначальное распределение равняется размеру одного сектора, но при необходимости может вырасти выше этого. После выделения пространство не освобождается, если файлы удаляются, чтобы уменьшить фрагментацию.
Например:
$ 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/
Иногда 4096 байт является наименьшей единицей выделения для некоторых файловых систем. Вот почему в каталоге 4096.
То же самое относится и к файлам. Несмотря на то, что некоторые файлы могут содержать менее 4096, они фактически занимают как минимум 4096 места на диске.
4096 зарезервирован для уменьшения фрагментации, потому что часто фактический размер содержащихся метаданных будет колебаться в зависимости от содержимого каталога. Если он постоянно растет и сокращается (например, содержит файлы журнала или динамическое содержимое), это может снизить производительность. Скорее всего, этого не произойдет с одной папкой, но во всей файловой системе все сложится быстро.
Это зависит от файловой системы. На ext2/3/4 это "is" 4096. На reiserfs это может быть 9608 (мой $HOME
), 1032 (/tmp
) или 48 (какой-то dir in /tmp
).
По умолчанию в ext2/3/4 блок равен 4096 - и файл не может занять меньше этого. Если файл меньше, он все равно занимает целый блок. Поскольку бессмысленно спрашивать о логическом размере каталога, и эта информация, вероятно, в любом случае отсутствует на диске, и он должен сообщать что-то, он сообщает размер блока, умноженный на количество принятых блоков, т.е.