Utilizo el siguiente comando para buscar y mover una gran cantidad de archivos en mi servidor:
find SomeDir/ -maxdepth 10 -type f -mtime +90 -exec mv {} SomeDir2/ \;
Después de mover unos 700.000 archivos, aparece este error:
mv: cannot move ‘SomeDir/Dir1/Dir2/Dir3/file.jpg.gz’ to ‘SomeDir2/file.jpg.gz’: No space left on device
df -i
tiene el siguiente resultado:
/dev/sdb1 322125824 144163358 177962466 45% /files
df -h
tiene el siguiente resultado:
/dev/sdb1 4.8T 3.5T 1.1T 78% /files
Hago toda la operación en /files
y ningún otro directorio.
El sistema de archivos es ext4
.
ACTUALIZAR
Como se sugirió, ejecuto dmesg -Hwx
y la salida esEXT4-fs warning (device sdb1): ext4_dx_add_entry:2016: Directory index full!
Respuesta1
Probablemente esté excediendo max_dir_size_kb
el conjunto (o dejado el valor predeterminado) en el momento del montaje del directorio:
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
se traduce en el mensaje de error No space left on device
con perror
)
Por lo tanto, asegúrese de que esa opción no se haya especificado (o se haya especificado con un número muy grande) en el momento del montaje.
Además, comenta:
- Demasiados archivos en una carpeta no parece una buena idea. ¿Quizás prefieras una base de datos relacional? ¿Almacenamiento de objetos?
- 4,8 TB: eso no es raro en los discos duros modernos, pero, sinceramente, la próxima vez que configures algo hoy en día, utiliza un grupo de almacenamiento como LVM. Con eso puedes tener cosas como instantáneas de sistemas en vivo.
Respuesta2
Con la información recién obtenida:
Entonces, al leer linux/fs/ext4/namei.c línea 2007 en la etiqueta git v3.10 (es decir, su kernel), creo que no tiene suerte y necesita ajustar su sistema de archivos;
tune2fs -O large_dir /dev/sdb1
debería permitirte tener más dx_entries
por directorio, pero honestamente, nunca lo he hecho. Como siempre, tenga copias de seguridad.
Asegúrese de tener copias de seguridad o aplíquelo a un nuevo sistema de archivos donde copie estos archivos en lugar de moverlos dentro del mismo sistema de archivos. Puede parecer que soy un fanático de XFS (no lo soy, simplemente funciona), pero creo que esto realmente no suena como si un ext4 sin ajustar fuera un excelente sistema de archivos para este caso de uso.