При перемещении 700 тыс. файлов в один каталог в пределах одной файловой системы на устройстве не осталось места

При перемещении 700 тыс. файлов в один каталог в пределах одной файловой системы на устройстве не осталось места

Я использую следующую команду для поиска и перемещения огромного количества файлов на моем сервере:

find SomeDir/ -maxdepth 10 -type f -mtime +90 -exec mv {} SomeDir2/ \;

После перемещения около 700 000 файлов я получаю эту ошибку:

mv: cannot move ‘SomeDir/Dir1/Dir2/Dir3/file.jpg.gz’ to ‘SomeDir2/file.jpg.gz’: No space left on device

df -iимеет следующий результат:

/dev/sdb1           322125824 144163358 177962466   45% /files

df -hимеет следующий результат:

/dev/sdb1            4.8T  3.5T  1.1T   78%   /files

Я выполняю все операции /filesи никаких других каталогов

Файловая система — ext4.

ОБНОВЛЯТЬ

Как и предполагалось, я запускаю dmesg -Hwxи результатEXT4-fs warning (device sdb1): ext4_dx_add_entry:2016: Directory index full!

решение1

Вероятно, вы превысили max_dir_size_kbустановленное значение (или оставили значение по умолчанию) во время монтирования каталога:

Документация по Linux:

max_dir_size_kb=n
    This limits the size of the directories so that any
    attempt to expand them beyond the specified limit in
    kilobytes will cause an ENOSPC error. This is useful in
    memory-constrained environments, where a very large
    directory can cause severe performance problems or even
    provoke the Out Of Memory killer. (For example, if there
    is only 512 MB memory available, a 176 MB directory may
    seriously cramp the system's style.)

( ENOSPCпереводится как сообщение об ошибке No space left on deviceс perror)

Поэтому убедитесь, что эта опция не была указана (или указана с очень большим числом) во время монтирования.

Также замечания:

  • Слишком много файлов в одной папке — это звучит не очень хорошая идея. Может быть, вы хотите вместо этого реляционную базу данных? Хранилище объектов?
  • 4,8 ТБ: это не редкость для современных жестких дисков, но, честно говоря, в следующий раз, когда вы что-то настроите в наши дни, используйте пул хранения, такой как LVM. С ним вы можете иметь такие вещи, как снимки работающих систем.

решение2

С учетом новой информации:

Итак, прочитав строку linux/fs/ext4/namei.c 2007 в теге git v3.10 (т.е. вашего ядра), я думаю, что вам не повезло, и вам нужно настроить вашу файловую систему;

tune2fs -O large_dir /dev/sdb1

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

Убедитесь, что у вас есть резервные копии, или примените это к новой файловой системе, куда вы копируете эти файлы, а не перемещаете их в пределах той же файловой системы. Может показаться, что я фанат XFS (я не фанат, он просто работает), но я думаю, что это действительно не похоже на то, что ненастроенная ext4 — отличная файловая система для этого варианта использования.

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