Как возможно создать более 65000 записей в каталоге ext4, несмотря на отсутствие флага large_dir?

Вопрос или проблема

Итак, я пытаюсь немного лучше понять флаги функций файловой системы.

Согласно тому, что я нашел, в man ext4 один каталог в файловой системе ext4 может содержать до 64,998 подкаталогов.

Обычно ext4 позволяет иноду иметь не более 65,000 жестких ссылок. Это относится как к обычным файлам, так и к каталогам, что означает, что в каталоге не может быть более 64,998 подкаталогов (поскольку каждая из записей ‘.’ и ‘..’, а также запись каталога для каталога в его родительском каталоге учитывается как жесткая ссылка).

Используя функцию файловой системы large_dir, это ограничение должно быть снято:

Эта функция увеличивает предел количества файлов на каталог, увеличивая максимальный размер каталогов и, для каталогов с хэшированными b-деревьями (см. dir_index), максимальную высоту хэшированного b-дерева, используемого для хранения записей каталога.

С помощью tune2fs я проверил включенные функции на своей локальной файловой системе ext4:

$ sudo tune2fs -l /dev/disk/azure/scsi1/lun10-part1 | grep "Filesystem features"
Функции файловой системы:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum

Функция dir_nlink включена, но, как я понял из документации, она не должна позволять иметь более 65,000 подкаталогов в каталоге:

Эта функция снимает это ограничение, заставляя ext4 использовать количество ссылок равное 1, чтобы указать, что количество жестких ссылок на каталог неизвестно, когда количество ссылок может превышать максимальное предельное значение.

Флаг dir_index также включен, но я не понимаю, как основная структура данных влияет на ограничения подкаталогов:

Используйте хэшированные b-деревья для ускорения поиска имен в больших каталогах. Эта функция поддерживается файловыми системами ext3 и ext4, и игнорируется файловыми системами ext2.

Тем не менее, я могу создать более 65000 подкаталогов. Мне еще предстоит найти фактический предел, так как скрипт, который я оставил работающим, все еще продолжается:

for i in {1..500000}
do
  mkdir dir_$i
done

Есть ли перекрытия между флагами функций ext4? Включение dir_nlink или dir_index эквивалентно включению large_dir? И если нет – позволяют ли эти флаги установить предел подкаталогов между использованием и не использованием флага large_dir?

Это версии, которые я использую:

$ uname -a
Linux test-subdirectories 6.5.0-1024-azure #25~22.04.1-Ubuntu SMP Mon Jun 17 18:38:57 UTC 2024 x86_64 x86_64 x86_64 GNU/Linux

$ cat /etc/os-release
PRETTY_NAME="Ubuntu 22.04.2 LTS"
NAME="Ubuntu"
VERSION_ID="22.04"
VERSION="22.04.2 LTS (Jammy Jellyfish)"
VERSION_CODENAME=jammy
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=jammy

Есть ли что-то, что я упускаю – или что-то, что мне следует проверить – чтобы понять ограничения подкаталогов в ext4?

Насколько я могу судить, отрывок из руководства, который вы цитируете –

Обычно ext4 позволяет иноду иметь не более 65,000 жестких ссылок. Это относится как к обычным файлам, так и к каталогам, что означает, что в каталоге не может быть более 64,998 подкаталогов (поскольку каждая из записей ‘.’ и ‘..’, а также запись каталога для каталога в его родительском каталоге учитывается как жесткая ссылка).

– не имеет ничего общего с large_dir и все имеет отношение к dir_nlink. Цитируемый параграф конкретно говорит о количестве жестких ссылок на одну запись (от записей подкаталогов .. к родительскому каталогу), а не о количестве записей в самих подкаталогах.

Функция large_dir кажется позволяет каталогам иметь более 2 ГБ записей (см. другую тему о размере записи; по-видимому, трудно точно рассчитать для файловых систем dir_index, но это определенно не связано с пределом в 65k).

Ответ или решение

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

Общее Описание

В файловой системе ext4, по умолчанию, количество жестких ссылок на директорию ограничено 65000. Это означает, что в каталоге может содержаться не более 64998 подкаталогов. Это ограничение объясняется тем, что каждая директория имеет свои записи «.» (ссылка на саму директорию) и «..» (ссылка на родительскую директорию), что уменьшает доступное количество жестких ссылок. Таким образом, физически вы не можете иметь больше 64998 подкаталогов в директории, если не используете специальный флаг.

Флаги Файловой Системы

Флаг large_dir в ext4 увеличивает лимит на количество файлов в каталоге, позволяя использовать большие структуры данных, такие как хэшированные b-деревья, что особенно полезно для каталога с большим количеством записей. Но если этот флаг не установлен, остаются другие механизмы, которые могут влиять на возможность создания значительного количества подкаталогов.

  1. Флаг dir_nlink: Этот флаг отменяет ограничения по жестким ссылкам на директории. Если он включен, ext4 может использовать специальное значение для указания на то, что количество жестких ссылок превышает 65000, что позволяет пересекать предельные значения.

  2. Флаг dir_index: Хотя этот флаг не влияет непосредственно на максимальное количество подкаталогов, он повышает скорость поиска по именам в больших каталогах посредством использования хэшированных b-деревьев.

Учитывая описанные флаги, можно предположить, что включение dir_nlink позволяет создавать больше подкаталогов без строгого обращения к ограничению в 65000. Флаг dir_index не увеличивает этот предел, но он способен улучшить время, необходимое для поиска в больших каталогах.

Вывод

Таким образом, несмотря на отсутствие флага large_dir, вы можете создать более 65000 подкаталогов из-за того, что флаг dir_nlink обходит жесткие ограничения, позволяя использовать механизм работы с директориями, который не следит очень строго за количеством жестких ссылок.

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

Рекомендации

  1. Проверяйте флаги: Всегда убедитесь в том, какие флаги активно работают на вашем файловом уровне. Это даст вам представление о том, что возможно, а что нет.

  2. Документация и обновления: Не забывайте следить за документацией и изменениями в ядре Linux и реализации файловых систем, так как потенциальные изменения могут влиять на пределы и функциональность.

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

Оцените материал
Добавить комментарий

Капча загружается...