Я использую следующую команду для поиска и перемещения огромного количества файлов на моем сервере:
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
установленное значение (или оставили значение по умолчанию) во время монтирования каталога:
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 — отличная файловая система для этого варианта использования.