Как рассчитывается размер каталога?

Как рассчитывается размер каталога?

Я запустил это на своем экземпляре CentOS 7.3.

[user01@ ~]$ rm -rf my-very-own-directory/
[user01@ ~]$ mkdir my-very-own-directory/ 
[user01@ ~]$ stat my-very-own-directory/ | grep "Size"
  Size: 6           Blocks: 0          IO Block: 4096   directory
[user01@ ~]$ mkdir my-very-own-directory/00
[user01@ ~]$ stat my-very-own-directory/ | grep "Size"
  Size: 16          Blocks: 0          IO Block: 4096   directory
[user01@ ~]$ date > my-very-own-directory/date.txt 
[user01@ ~]$ stat my-very-own-directory/ | grep "Size"
  Size: 32          Blocks: 0          IO Block: 4096   directory
[user01@ ~]$ echo "content" > my-very-own-directory/content
[user01@ ~]$ stat my-very-own-directory/ | grep "Size"
  Size: 47          Blocks: 0          IO Block: 4096   directory
  • Первоначальное создание => размер = 6
  • Добавьте запись с длиной имени 2 байта => размер 16 (6 + 8 + 2)
  • Добавьте еще одну запись с длиной имени 4 байта => размер 32 (16 + 8 + 8)
  • Добавьте еще одну запись с длиной имени 7 байт => размер 47 (32 + 8 + 7)

2 вопроса:

  1. Созданный каталог имеет размер 6. Почему?
  2. Каждая новая запись в каталог, будь то файл подкаталога, будет увеличивать размер 'my-very-own-directory'. Вопрос в том, что размер увеличивается на 8 + (длина имени файла / имени каталога). Почему 8?

решение1

Формат каталога полностью зависит от файловой системы.

Как минимум, запись каталога должна содержать имя файла и номер инода.

Чтобы использоватьext4Файловая система Linux(и более старые версии) в качестве примера, исходная запись каталога имела номер inode (4 байта), длину имени файла (2 байта) и общую длину записи (2 байта), а также само имя файла. (IIRC общая длина указана явно, чтобы обеспечить возможность заполнения и т. п.)

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

Хотя на ext4, размер каталога отображается только как кратное размеру блока, т.е. пустой каталог имеет размер 4096и не увеличивается до тех пор, пока не будет создано достаточно файлов, чтобы потребовалось выделение для него нового блока данных.

RHEL 7 использует XFS в качестве файловой системы по умолчанию, так что, возможно, вы используете именно ее.XFS имеет ряд форматов каталогов, а краткая форма, используемая для небольших каталогов, по сути имеет тот же минимальный набор: номер inode + имя файла + длина имени файла + общая длина.

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