В 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. Верны ли они для других файловых систем, зависит от их реализации.
Но тебе повезло. При воссоздании того же количества файлов, которые вы уже удалили, размер каталога останется прежним. Только когда вы добавите больше файлов, оно увеличится.
Увеличение количества блоков, которое вы видите, связано с тем, как файловая система управляет своим хранилищем файлов и связанной с ними информацией об управлении файлами. В описанной вами ситуации это будет отображаться с шагом в 4 КБ, поэтому каждая «новая» / «уникальная» запись в файловой системе будет резервировать 4 КБ, независимо от того, заполняет ли фактический размер данных весь 4 КБ. Если связанные данные занимают весь 4 КБ, то другой блок 4 КБ резервируется и заполняется по мере необходимости для хранения всего связанного потока / последовательности данных.
В зависимости от «жесткого» или «мягкого» удаления, управляемого файловой системой, удаление не может (обычно не для функции «восстановить») немедленно освободить зарезервированные блоки. Некоторые файловые системы могут различать различные типы «удалений» и предоставлять соответствующие возможности управления блоками хранения.
Подход и реализация управления хранилищем различаются в зависимости от файловых систем, поэтому в операционных системах, поддерживающих множественные / модульные файловые системы, операционная система обычно предоставляет только «крючки» для интеграции файловой системы.
Добавляем бессвязный комментарий к хорошему ответу user48838:
Все является файлом, включая каталоги. Для хранения всей информации о файле вам понадобится место.
Также было бы допустимо показать, скажем, '64B used' для небольшого каталога и фактически показать объем используемого пространства, но мы все равно будем использовать несколько 4K на диске, поэтому было дизайнерским решением просто показать количество используемого пространства.
С точки зрения дизайна FS, зачем вам беспокоиться о вычислении того, что было использовано? Не обязательно. И тогда вам придется перемещать записи, чтобы не оставлять дыр… ick.
Когда происходит удаление и размер каталога падает, так что вы мог освободите блок, все это управление должно произойти, прежде чем вы действительно сможете это сделать. Зачем экономить несколько КБ? Скорее всего, вам все равно придется расширить его позже.
Оставлено в качестве упражнения для читателя: подумайте, почему ваш каталог / lost + found создан пустым, но занимает 16 КБ (по крайней мере, на ext3).