Назад | Перейти на главную страницу

Монотонный рост размера каталога Linux / количества блоков

В Linux (возможно, в зависимости от размера блока файловой системы), когда я создаю каталог и stat он возвращает размер 4096. Я могу создавать файлы в этом каталоге до определенного момента, не увеличивая воспринимаемый размер каталога (как сообщает stat).

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

Вот небольшой пример:

[root@uxlabtest:/]$ mkdir test
[root@uxlabtest:/]$ stat test
  File: `test'
  Size: 4096            Blocks: 8          IO Block: 4096   directory
Device: fd00h/64768d    Inode: 1396685     Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2011-07-26 14:06:04.000000000 -0400
Modify: 2011-07-26 14:06:04.000000000 -0400
Change: 2011-07-26 14:06:04.000000000 -0400

Затем коснитесь кучи файлов:

[root@uxlabtest:/]$ for i in `seq 1 10000`; do touch /test/$i; done
[root@uxlabtest:/]$ stat test
  File: `test'
  Size: 155648          Blocks: 312        IO Block: 4096   directory
Device: fd00h/64768d    Inode: 1396685     Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2011-07-26 14:06:04.000000000 -0400
Modify: 2011-07-26 14:06:56.000000000 -0400
Change: 2011-07-26 14:06:56.000000000 -0400

Затем удалите файлы:

[root@uxlabtest:/]$ rm -rf /test/*
[root@uxlabtest:/]$ stat test
  File: `test'
  Size: 155648          Blocks: 312        IO Block: 4096   directory
Device: fd00h/64768d    Inode: 1396685     Links: 2
Access: (0755/drwxr-xr-x)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2011-07-26 14:07:11.000000000 -0400
Modify: 2011-07-26 14:07:12.000000000 -0400
Change: 2011-07-26 14:07:12.000000000 -0400

Мои вопросы:

Вот ответы, которые верны для ext2 / ext3 / ext4. Верны ли они для других файловых систем, зависит от их реализации.

  1. user48838 правильно ответил на этот вопрос. Чем больше файлов, тем больше метаданных. Они выделяются блоками по 4 КБ или имеют любой другой размер, определенный во время создания файловой системы.
  2. Да, это особенность / проблема реальной файловой системы
  3. В файловой системе ext3 это невозможно. Только воссоздав (пустой) каталог
  4. Исходный код около Вот и в связанных файлах

Но тебе повезло. При воссоздании того же количества файлов, которые вы уже удалили, размер каталога останется прежним. Только когда вы добавите больше файлов, оно увеличится.

Увеличение количества блоков, которое вы видите, связано с тем, как файловая система управляет своим хранилищем файлов и связанной с ними информацией об управлении файлами. В описанной вами ситуации это будет отображаться с шагом в 4 КБ, поэтому каждая «новая» / «уникальная» запись в файловой системе будет резервировать 4 КБ, независимо от того, заполняет ли фактический размер данных весь 4 КБ. Если связанные данные занимают весь 4 КБ, то другой блок 4 КБ резервируется и заполняется по мере необходимости для хранения всего связанного потока / последовательности данных.

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

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

Добавляем бессвязный комментарий к хорошему ответу user48838:

Все является файлом, включая каталоги. Для хранения всей информации о файле вам понадобится место.

Также было бы допустимо показать, скажем, '64B used' для небольшого каталога и фактически показать объем используемого пространства, но мы все равно будем использовать несколько 4K на диске, поэтому было дизайнерским решением просто показать количество используемого пространства.

С точки зрения дизайна FS, зачем вам беспокоиться о вычислении того, что было использовано? Не обязательно. И тогда вам придется перемещать записи, чтобы не оставлять дыр… ick.

Когда происходит удаление и размер каталога падает, так что вы мог освободите блок, все это управление должно произойти, прежде чем вы действительно сможете это сделать. Зачем экономить несколько КБ? Скорее всего, вам все равно придется расширить его позже.

Оставлено в качестве упражнения для читателя: подумайте, почему ваш каталог / lost + found создан пустым, но занимает 16 КБ (по крайней мере, на ext3).