ext4 Ubuntu 18.04 Ошибка файловой системы «Структура нуждается в очистке»

ext4 Ubuntu 18.04 Ошибка файловой системы «Структура нуждается в очистке»

Я хочу подготовить диск на 24 ТБ, чтобы иметь возможность хранить огромное количество каталогов и файлов в одном каталоге (пожалуйста, не говорите мне менять эту стратегию, это структура, используемая программным обеспечением, которое является для нас черным ящиком, поэтому мы не можем изменить этот подход). Как я полностью исследовал, файловая система ext4 имеет возможность хранить миллиарды файлов в одном каталоге, но ее следует подготовить с использованием некоторых специальных флагов и параметров. Вот что я использовал на основе своего исследования:

sudo mke2fs -T news /dev/sdb1
sudo tune2fs -O dir_index /dev/sdb1
sudo tune2fs -O large_dir /dev/sdb1
sudo tune2fs -O dir_nlink /dev/sdb1


sudo mkdir /hdd
sudo gedit /etc/fstab

- add following to the end of the file:
/dev/sdb1    /hdd    ext4    defaults,noatime    0    0

sudo mount /hdd

Для проверки структуры я подготовил bash-скрипты, которые создают каталоги и файлы в одном каталоге. Что-то вроде этого:

for ((i = 1000000; i <= 200000000; i++))
do
  sudo mkdir "/hdd/largedir/$i" -p
  sudo cp "sample-file.jpg" "/hdd/largedir/$i"
  if (( $i % 1000 == 0 ));
  then
    echo "$i created";
  fi;
done

После нескольких часов работы, когда я проверил систему, она выдала следующую ошибку:

Structure needs cleaning

В моих тестах эта ошибка выводится не для всех файлов и каталогов. Например, я могу создать каталог с именем "10000", но не могу создать каталог с именем "1000". Я также изменил алгоритм хэширования с помощью этой команды:

sudo tune2fs -E "hash_alg=tea" /dev/sdb1

и перезагрузил и перемонтировал систему, но проблема все еще существует. Кто-нибудь знает, в чем проблема и почему эта ситуация возникла в файловой системе? Файловая система ext4 недостаточно мощна для такой большой структуры? Я читал на некоторых страницах об использовании xfs вместо ext4 для большого количества файлов. Это действительно так?

Вы видите, что во время работы с файлом не произошло ни потери питания, ни сбоев в системе. Я не ожидал такого поведения, когда все было в порядке.

-- ОТРЕДАКТИРОВАНО для получения дополнительной информации: --

Информация об иноде для диска выглядит следующим образом:

Filesystem        Inodes     IUsed     IFree IUse% Mounted on
/dev/sdb1      421216256 183643803 237572453   44% /hdd

Информация о пространстве следующая:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sdb1        26T  3.1T   21T  13% /hdd

Я проверил файловую систему, и она ext4 (как показано в различных инструментах). Например, gparted показывает файловую систему раздела как ext4. Что касается функций, ни одна из вышеперечисленных функций не была включена по умолчанию в моем Ubuntu 18.04 LTS. Я получил несколько ошибок во время моих старых тестов и, наконец, добрался до этого.

решение1

С помощью этой команды sudo mke2fs -T news /dev/sdb1вы не обязательно создаете файловую систему ext4, ноехт2файловая система.

Предполагая, что ваш Ubuntu 18.04 имеет по сути тот же /etc/mke2fs.confфайл, что и мой Debian 10, то dir_indexон уже включен как текущий базовый набор функций для всех файловых систем ext2/3/4, созданных с использованием modern mke2fs. И dir_nlinkвключен по умолчанию дляext4Тип файловой системы.

На странице руководства mke2fs.conf(5)говорится: «Если и пользователь, и mke2fs.confфайл не указали тип файловой системы по умолчанию, mke2fsбудет использоваться тип файловой системы по умолчаниюext3если журнал был запрошен через параметр командной строки, илиехт2если не."

Согласно /etc/mke2fs.confфайлу, -T newsопция только определяет inode_ratio = 4096опцию, ничего больше. Так что если вы не используете форму mkfs.ext4вместо plain mke2fs, вы можете получитьехт2Файловая система, предназначенная для файлов со средним размером 4 КБ или меньше.

В Debian нет указанного fs_type =в [defaults]разделе mke2fs.conf, а вы не включили эту -jопцию в свою mke2fsкоманду, поэтому, если Ubuntu mke2fs.confи Debian одинаковы (как это обычно бывает), ваша команда могла выдать вам 24 ТБехт2файловая система, которая, вероятно, никем не была тщательно протестирована.

На ext4(5)странице руководства говорится, что 64bitфункция файловой системы будет установлена ​​автоматически по мере необходимости, что может объяснить, почему инструменты не сообщали об ошибках. Также там говорится, что эта dir_indexфункция игнорируется файловыми системами ext2.

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

Не могли бы вы отредактировать фактический tune2fs -l /dev/sdb1вывод вашего исходного вопроса, чтобы нам не пришлось гадать, что могло произойти, а что нет?

"Структура нуждается в очистке" — это, по-видимому, текст по умолчанию, соответствующий EUCLEANкоду ошибки ядра, который указывает на то, что файловая система повреждена и требуется ее проверка. На файловой системе такого размера это займет довольно много времени и оперативной памяти. И, конечно, файловую систему нужно размонтировать во время проверки.

решение2

На самом деле после множества тестов я пришел к выводу, что ext4 не может делать такие вещи (хранить миллиарды файлов в одном каталоге). И после моих исследований того, как это сделать в Linux, результаты (на самом деле, также мои практические тесты) показывают, что для такого сценария мне следует использовать XFS вместо ext4, которая действительно создана для выполнения этой задачи.

Связанный контент