Почему «ls -l» выдает физический размер каталога, а логический размер файла?

Почему «ls -l» выдает физический размер каталога, а логический размер файла?

Я заметил, что ls -lсообщает физический размер для каталога, в то время как он сообщает логический размер для файла. Например, это пример вывода из ls -l:

drwxr-xr-x 2 chris chris 36864 2017-04-23 18:14 dir1 
-rw-r--r-- 1 chris chris 6     2017-04-23 18:10 file1.txt

dir1размер составляет 36864 байта, что кратно 4096 байтам (так что, вероятно, это физический размер).

При этом file1.txtразмер составляет 6 байт (что является логическим размером).

решение1

На самом деле, lsсообщает то, что ему говорит ядро: оно не делает ничего по-разному относительно размера в зависимости от того, является ли файл каталогом). А Linux сообщает логический размер. Но логический размер каталога — не очень интересное свойство: он зависит от формата файловой системы.

Тип файловой системы по умолчанию в большинстве дистрибутивов Linux — ext4, и, вероятно, вы используете именно его. Ext4 выделяет целые блоки для каталогов и управляет пространством внутри этих блоков по своему усмотрению. Он даже не освобождает блоки, если каталог уменьшается ( dir1будет по-прежнему иметь 9 блоков, даже если вы удалите все файлы в нем). Когда задается вопрос о размере файла, который является каталогом, ext4 возвращает размер, выделенный для каталога, и это всегда целое число блоков.

Разные типы файловых систем ведут себя по-разному. Например, в Btrfs экспериментально размер каталога может быть любым кратным 2.

решение2

Это особенность файловых систем ext2// , они сообщают размер каталогов в полных блоках. Если вы попробуете ext3сделать ext4то же самое с XFS, вы увидите более подробный размер.

На самом деле это не имеет значения. Для файлов «логический» размер имеет значение, поскольку приложение может зависеть от знания размера файла с точностью до байта: может иметь значение мусор в конце или некоторая структура данных может быть размещена в позиции относительно конца файла (например, архивы .zip).

Для каталогов "логический" размер не имеет значения, поскольку внутренняя структура хорошо известна, а в Linux программа пользовательского пространства даже не может напрямую прочитать содержимое каталога. Вместо этого чтение должно проходить через системные вызовы, сделанные именно для этой цели. И эти системные вызовы будут иметь дело с внутренней структурой каталога.

Связанный контент