Вывод debugfs или dumpe2fs с пометкой htree root 0 означает, что для каталога используется нулевой (корневой) блок htree-индекса — это нормальное состояние для каталогов, чьи записи умещаются в один индексный блок без разбиения на листовые узлы. Такая строка сама по себе не является ошибкой: она лишь отражает структуру хеш-дерева, которое файловая система ext4 (и ext3 с включённой опцией dir_index) строит для ускоренного поиска файлов по имени.
Путаница возникает потому, что пользователи встречают эту пометку в двух разных контекстах: при рутинной диагностике каталога и при восстановлении удалённых данных, когда инструменты вроде extundelete или ручной разбор через debugfs показывают внутреннюю структуру индекса. Ниже разберём, как устроен htree, что именно означает root 0, когда стоит беспокоиться и какие проверки безопасно выполнить.
Что такое htree и зачем он нужен в ext4
В классической схеме каталог файловой системы — это линейный список записей вида «имя → inode». Когда в каталоге десятки тысяч файлов, линейный перебор становится узким местом: каждое обращение к файлу требует сканирования списка. Чтобы решить проблему, в ext3 была добавлена опция dir_index, а вместе с ней — структура htree (hash tree), основанная на хешах имён файлов.
Идея проста: имя файла прогоняется через хеш-функцию, и по значению хеша определяется блок, в котором лежит соответствующая запись каталога. Поиск превращается из O(n) в почти константный. При этом линейная структура каталога сохраняется для совместимости — индекс накладывается поверх неё.
- 🌳 Корневой блок (root) — хранится внутри первого блока каталога, сразу после записей . и ...
- 🍃 Листовые блоки (leaf nodes) — содержат пары «хеш → блок каталога» и появляются, когда каталог разрастается.
- 🔑 Хеш-функция — по умолчанию используется вариант half-MD4 или tea (зависит от настроек суперблока).
- 📦 Глубина дерева — для большинства каталогов равна 0, то есть есть только корень без листьев.
Что конкретно означает «htree root 0»
Обозначение root 0 указывает, что htree-индекс каталога состоит из одного корневого блока и не имеет листовых узлов. Это типичная картина для каталогов с небольшим и средним числом записей: все хеши умещаются в корневой блок, и разбиение не требуется. Число 0 здесь — не код ошибки и не счётчик, а указание на уровень/состояние дерева.
Когда каталог переполняется, файловая система выполняет операцию split: записи перераспределяются, появляются листовые блоки, и в выводе диагностических утилит структура становится вложенной. Увидеть это можно, например, командой debugfs -R "ls -l /большой_каталог" /dev/sdXN на отмонтированном разделе — для крупных каталогов структура вывода будет отличаться от компактного варианта с root 0.
💡Htree root 0 — это нормальное состояние индекса каталога: дерево состоит только из корневого блока без листьев. Это не ошибка и не признак повреждения.