No queda espacio en el dispositivo al mover archivos de 700k a un único directorio dentro del mismo FS

No queda espacio en el dispositivo al mover archivos de 700k a un único directorio dentro del mismo FS

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 -itiene el siguiente resultado:

/dev/sdb1           322125824 144163358 177962466   45% /files

df -htiene el siguiente resultado:

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

Hago toda la operación en /filesy ningún otro directorio.

El sistema de archivos es ext4.

ACTUALIZAR

Como se sugirió, ejecuto dmesg -Hwxy la salida esEXT4-fs warning (device sdb1): ext4_dx_add_entry:2016: Directory index full!

Respuesta1

Probablemente esté excediendo max_dir_size_kbel conjunto (o dejado el valor predeterminado) en el momento del montaje del directorio:

documentos de 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.)

( ENOSPCse traduce en el mensaje de error No space left on devicecon 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_entriespor 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.

información relacionada