Как длина имени файла влияет на оставшееся место на диске?

Как длина имени файла влияет на оставшееся место на диске?

Я понимаю, что это зависит от файловой системы. В частности, я думаю о файловых системах серии EXT. Я не совсем понимаю, как иноды влияют на дисковое пространство и как хранится само имя файла. По этому вопросу также трудно получить релевантные результаты поиска. Вот почему я спрашиваю здесь. В Linux максимальная длина имени файла обычно составляет 255 или 256 символов. Когда создается файловая система, этот объем пространства «зарезервирован» для каждого имени файла? Другими словами, не влияет ли фактическое имя файла на дисковое пространство, потому что максимальное количество уже использовано? Или это сложнее, чем это?

Предположим, у меня есть файл с именем «joe.txt», и я переименовываю его в «joe2.txt». Уменьшился ли объем доступного дискового пространства после этого? Как насчет более длинных имен, таких как «joe_version.txt» или «joe_original_version_with_bug_that_Jim_solved.txt»? Меня беспокоят пороги в 8, 16, 32, 64 и т. д. символов. Я буду хранить миллионы изображений. Раньше я никогда не беспокоился о такой проблеме, поэтому я не совсем уверен, как это работает.

Хотя EXT — единственная файловая система, которую я использую, обсуждение FAT и других может быть полезно кому-то еще, у кого есть похожий вопрос.


person SO Stinks    schedule 23.09.2010    source источник


Ответы (2)


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

Итак, чтобы ответить на ваш вопрос, при создании файловой системы для имен файлов не резервируется место, но после создания файла байты NAME_MAX зарезервированы для имени. Более того, для индекса каталога, как я понимаю, по крайней мере на ext2/3/4 пространство выделяется в дисковом блоке (4 КБ, если вы не делаете что-то очень странное) с гранулярностью по мере необходимости. т.е. каталог занимает не менее 4 КБ (плюс запись в индексном узле родительского каталога), и если список пар (имя файла, индексный дескриптор) не умещается в эти 4 КБ (минус другие накладные расходы, например разрешения каталога), он выделяет новый блок размером 4 КБ для продолжения списка и т. д. (ext2/3 использует непрямую схему блоков, тогда как ext4 использует экстенты).

person janneb    schedule 21.10.2010
comment
Я надеялся, что больше людей в конечном итоге прокомментируют ваш ответ и подтвердят его. Я думаю, что это правильно, но я все еще не знаю на 100%. - person SO Stinks; 28.04.2011
comment
Обратите внимание, что программы не должны слепо предполагать, что общесистемное NAME_MAX действительно может быть использовано. Многие файловые системы поддерживают такое количество байтов, которое может полностью отличаться от символов в часто используемой кодировке UTF-8. Кроме того, если текущее монтирование, например. ecryptfs фактический предел может быть больше 160 байт. Чтобы получить реальный лимит, запустите getconf NAME_MAX /path/to/directory - person Mikko Rantalainen; 05.02.2021
comment
Об ответе на исходный вопрос: хранение имен файлов зависит от файловой системы, и некоторые файловые системы могут не резервировать 255 байтов для каждого имени файла, а сжимать записи каталога, чтобы максимально уместить их в один блок диска. Кроме того, большинство файловых систем по историческим причинам по-прежнему рассчитаны на дисковые блоки размером 512 байт, поэтому, если изменение уместится в существующем блоке, пространство не потребуется. Если изменение не подходит, дополнительные блоки резервируются до тех пор, пока данные не будут соответствовать. - person Mikko Rantalainen; 05.02.2021

FAT16 предварительно выделяет.

FAT32 использует обходной путь для предоставления длинных имен файлов; по мере того, как имя файла становится длиннее, требуются дополнительные блоки файла каталога для хранения дополнительных символов, а файл каталога является обычным файлом, поэтому он занимает дополнительное место на диске. Однако наименьшее выделение — это один кластер, поэтому, если дополнительное хранилище имен файлов не превышает границы кластера, никакое дополнительное дисковое пространство не потребляется из того, что вы могли бы использовать в противном случае.

Я не знаком с тем, как имена файлов обрабатываются в файловых системах типа UNIX.

person Community    schedule 21.10.2010