Quiero tener un disco de 24TB preparado para poder contener una gran cantidad de directorios y archivos en un solo directorio (Por favor, no me digan que cambie esta estrategia, es una estructura utilizada por un software que es una caja negra para nosotros). por lo que no podemos cambiar este enfoque). Como he investigado a fondo, el sistema de archivos ext4 tiene la capacidad de almacenar miles de millones de archivos en un directorio, pero debe prepararse utilizando algunas opciones y parámetros especiales. Esto es lo que he usado según mi investigación:
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
Para probar la estructura, preparé scripts bash que crean directorios y archivos en un solo directorio. Algo como esto:
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
Después de horas de trabajo, cuando revisé el sistema me estaba imprimiendo este error:
Structure needs cleaning
En mis pruebas, imprime este error no para todos los archivos y directorios. Por ejemplo, puedo crear un directorio llamado "10000" pero no puedo crear un directorio llamado "1000". También cambié el algoritmo hash usando este comando:
sudo tune2fs -E "hash_alg=tea" /dev/sdb1
y reinicié y volví a montar el sistema, pero el problema aún existe. ¿Alguien sabe cuál es el problema y por qué se ha producido esta situación en el sistema de archivos? ¿El sistema de archivos ext4 no es lo suficientemente fuerte para tener una estructura tan grande? He leído en algunas páginas sobre el uso de xfs en lugar de ext4 para una gran cantidad de archivos. ¿Es realmente cierto?
Verá que durante la operación del archivo, no se produjo ninguna pérdida de energía ni fallas en el sistema. No esperaba tal comportamiento cuando todo estaba bien.
-- EDITADO para más información: --
La información de inodo para el disco es la siguiente:
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/sdb1 421216256 183643803 237572453 44% /hdd
La información del espacio es la siguiente:
Filesystem Size Used Avail Use% Mounted on
/dev/sdb1 26T 3.1T 21T 13% /hdd
Revisé el sistema de archivos y es ext4 (como se muestra en varias herramientas). Por ejemplo, gparted muestra el sistema de archivos de la partición como ext4. En cuanto a las funciones, ninguna de las funciones anteriores estaba habilitada de forma predeterminada en mi ubuntu 18.04 LTS. Llegué a varios errores durante mis pruebas anteriores y finalmente llegué a este.
Respuesta1
Con el comando sudo mke2fs -T news /dev/sdb1
no necesariamente estás creando un sistema de archivos ext4, sino unext2sistema de archivos.
Suponiendo que su Ubuntu 18.04 tiene esencialmente el mismo /etc/mke2fs.conf
archivo que mi Debian 10, entonces dir_index
ya está habilitado como el conjunto de funciones base actual para todos los sistemas de archivos ext2/3/4 creados con moderno mke2fs
. Y dir_nlink
está habilitado de forma predeterminada para elext4tipo de sistema de archivos.
La mke2fs.conf(5)
página de manual dice: "si tanto el usuario como el mke2fs.conf
archivo no especifican un tipo de sistema de archivos predeterminado, mke2fs
utilizarán un tipo de sistema de archivos predeterminado deext3si se solicitó un diario a través de una opción de línea de comando, oext2si no."
Según el /etc/mke2fs.conf
archivo, la -T news
opción solo especifica la inode_ratio = 4096
opción, nada más. Entonces, a menos que use el mkfs.ext4
formulario en lugar del simple mke2fs
, es posible que obtenga unext2Sistema de archivos diseñado para archivos con tamaños promedio de 4 kB o menos.
Debian no tiene lo fs_type =
especificado en la [defaults]
sección de mke2fs.conf
, y no incluyes la -j
opción para tu mke2fs
comando, por lo que si el de Ubuntu mke2fs.conf
es igual al de Debian (como suele ser), es posible que tu comando te haya dado 24 TB.ext2sistema de archivos, que es algo que probablemente nadie haya probado particularmente bien.
La ext4(5)
página de manual dice que la 64bit
función del sistema de archivos se configurará automáticamente según sea necesario, lo que podría explicar por qué las herramientas no informaron ningún error. También dice dir_index
que los sistemas de archivos ext2 ignoran la función.
Según experiencias pasadas con sistemas de archivos de varios terabytes ext3
, habría esperado tiempos enormes de creación y verificación de sistemas de archivos. Para su caso de uso, la presencia o ausencia de la dir_index
función puede mejorar o perjudicar el rendimiento de la aplicación.
¿Podría editar el tune2fs -l /dev/sdb1
resultado real de su pregunta original para eliminar la necesidad de que adivinemos qué pudo haber sucedido o no?
"La estructura necesita limpieza" parece ser el texto predeterminado correspondiente al EUCLEAN
código de error del kernel, lo que indica que el sistema de archivos está dañado y es necesario verificarlo. En un sistema de archivos de este tamaño, esto requerirá bastante tiempo y RAM. Y, por supuesto, es necesario desmontar el sistema de archivos mientras se verifica.
Respuesta2
En realidad, después de muchas pruebas, llegué al punto en que parece que ext4 no tiene la capacidad de hacer tal cosa (contener miles de millones de archivos en un directorio). Y siguiendo mis investigaciones sobre cómo hacer esto en Linux, los resultados (de hecho, también mis pruebas prácticas) muestran que para tal escenario, debería usar XFS en lugar de ext4, que realmente está diseñado para realizar esta tarea.