Вывод 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 — это нормальное состояние индекса каталога: дерево состоит только из корневого блока без листьев. Это не ошибка и не признак повреждения.