¿Puedo quedarme sin espacio en disco creando una gran cantidad de archivos vacíos?

35

Es bien sabido que los archivos de texto vacíos tienen cero bytes:

ingrese la descripción de la imagen aquí

Sin embargo, cada uno de ellos contiene metadatos , que según mi investigación, se almacenan en inodes y usan espacio .

Dado esto, me parece lógico que es posible llenar un disco simplemente creando archivos de texto vacíos. ¿Es esto correcto? Si es así, ¿cuántos archivos de texto vacíos necesitaría para llenar un disco de, digamos, 1 GB?


Para hacer algunas comprobaciones, ejecuto df -ipero aparentemente esto muestra el% de inodes que se utilizan (?) En lugar de cuánto pesan.

Filesystem             Inodes  IUsed    IFree IUse% Mounted on
udev                   947470    556   946914    1% /dev
tmpfs                  952593    805   951788    1% /run
/dev/sda2            28786688 667980 28118708    3% /
tmpfs                  952593     25   952568    1% /dev/shm
tmpfs                  952593      5   952588    1% /run/lock
tmpfs                  952593     16   952577    1% /sys/fs/cgroup
/dev/sda1                   0      0        0     - /boot/efi
tmpfs                  952593     25   952568    1% /run/user/1000
/home/lucho/.Private 28786688 667980 28118708    3% /home/lucho
luchonacho
fuente
Relacionado: unix.stackexchange.com/q/62049
moooeeeep

Respuestas:

40

Esta salida sugiere 28786688inodos en general, después de lo cual el próximo intento de crear un archivo en el sistema de archivos raíz (dispositivo /dev/sda2) volveráENOSPC ("No queda espacio en el dispositivo").

Explicación: en el diseño original del sistema de archivos * nix, el número máximo de inodos se establece en el momento de creación del sistema de archivos. Se asigna un espacio dedicado para ellos. Puede quedarse sin inodos antes de quedarse sin espacio para datos, o viceversa. El sistema de archivos predeterminado de Linux más comúnext4 todavía tiene esta limitación. Para obtener información sobre los tamaños de inodo en ext4, consulte la página de manual de mkfs.ext4.

Linux soporta otros sistemas de archivos sin esta limitación. Encendido btrfs, el espacio se asigna dinámicamente. "La estructura de inodo es relativamente pequeña y no contendrá datos de archivos incrustados ni datos de atributos extendidos". (ext3 / 4 asigna algo de espacio dentro de los inodes para atributos extendidos ). Por supuesto, aún puede quedarse sin espacio en disco creando demasiados metadatos / entradas de directorio.

Pensando en ello, tmpfs es otro ejemplo donde los inodes se asignan dinámicamente. Es difícil saber qué df -isignificaría en la práctica el número máximo de inodos reportados por estos sistemas de archivos. No atribuiría ningún significado al valor que se muestra.


"XFS también asigna inodes dinámicamente. También lo hace JFS. Lo mismo hizo / reiserfs. Lo mismo ocurre con F2FS. Los sistemas de archivos tradicionales de Unix asignan inodos estáticamente en tiempo mkfs, y también lo hacen FSes modernos como ext4 que rastrean su herencia, pero en estos días eso es La excepción, no la regla.

"Por cierto, XFS le permite establecer un límite en el porcentaje máximo de espacio utilizado por los inodes, por lo que puede quedarse sin inodos antes de llegar al punto en el que no puede agregar archivos existentes. (El valor predeterminado es 25% para FSes menos de 1 TB, 5% para sistemas de archivos de hasta 50 TB, 1% para más grande que eso.) De todos modos, este uso del espacio en metadatos (inodes y mapas de extensión) se reflejará en forma regular df -h"- Peter Cordes en un comentario a esta respuesta

sourcejedi
fuente
Entonces, ¿estás diciendo que si creo 28786688-667980=28118708archivos vacíos, en efecto me quedaré sin inodos y "romperé mi sistema"?
luchonacho
1
XFS también asigna inodes dinámicamente. También lo hace JFS. Lo mismo hizo / hace reiserfs. También lo hace F2FS . Los sistemas de archivos tradicionales de Unix asignan inodos estáticamente en tiempo mkfs, y también lo hacen los FS modernos como ext4 que rastrean su herencia, pero en estos días esa es la excepción, no la regla. (A menos que pese las cosas por base instalada, en lo que probablemente sea exacto decir que la mayoría de los sistemas de archivos actualmente en disco en sistemas * nix en la naturaleza tienen inodos asignados estáticamente).
Peter Cordes
Por cierto, XFS le permite establecer un límite en el porcentaje máximo de espacio utilizado por los inodes, por lo que puede quedarse sin inodos antes de llegar al punto en el que no puede agregar archivos existentes. (El valor predeterminado es 25% para FSes menores de 1TB, 5% para sistemas de archivos de hasta 50TB, 1% para mayores que eso). De todos modos, este uso de espacio en metadatos (inodes y mapas de extensión) se reflejará en df -h@luchonacho.
Peter Cordes
26

Crear archivos vacíos implica usar lo siguiente:

  • inodes, uno por archivo;
  • entradas de directorio adicionales, también una por archivo, pero agregadas.

El número de inodos disponibles a menudo se determina cuando se crea un sistema de archivos, y no se puede cambiar (algunos sistemas de archivos como Btrfs o XFS asignan inodos dinámicamente). Eso es lo que mide df -i. Cuando te quedas sin inodos, no puedes crear nuevos archivos o directorios, incluso si tienes espacio en disco disponible.

Las entradas de directorio también ocupan espacio, desde el espacio disponible en disco. Puede ver esto mirando el tamaño de un directorio: siempre es un múltiplo del tamaño del bloque, y cuando un directorio contiene muchos archivos, su tamaño aumenta. Si se queda sin espacio en disco, es posible que no pueda crear nuevos archivos o directorios en un directorio que esté "lleno" ( es decir , donde agregar un nuevo archivo implicaría asignar un nuevo bloque), incluso si tiene inodos disponibles.

Entonces, sí, es posible quedarse sin espacio en disco utilizando solo archivos vacíos.

Stephen Kitt
fuente
¿Entonces necesitaría crear suficientes archivos vacíos para llegar al 100% de uso de inodes?
luchonacho
@luchonacho sí, efectivamente un archivo vacío por inodo.
Stephen Kitt
También tenga en cuenta los atributos extendidos que pueden agregar espacio además de eso. Por ejemplo, si el directorio tiene muchas ACL predeterminadas, la creación de un archivo necesitará espacio para almacenar esas ACL.
Stéphane Chazelas
OK, estoy corregido. La cosa es que me parece extraño tanto con las fuentes renderizadas como de ancho fijo en mi navegador. Por curiosidad, ¿cómo los insertas? ¿Tiene su teclado una tecla diferente para ese personaje y la U + 0022?
Stéphane Chazelas
Gracias, por curiosidad, verifiqué si estaban en el diseño de mi teclado del Reino Unido y, de hecho, están en AltGr + Shift + V / B (comillas dobles sin shift). Sin embargo, me quedaré con U + 0022.
Stéphane Chazelas
7

Argumento de lógica pura:

Un nombre de archivo consta de una cantidad de bytes distinta de cero. Incluso con la compresión máxima teórica en un hipotético sistema de archivos diseñado para permitir la cantidad máxima absoluta de nombres de archivo, cada nombre de archivo consumirá al menos un bit en algún lugar de su disco físico. Probablemente más, pero "1 bit por archivo" es el mínimo trivial.

Calcule la cantidad de bits que posiblemente caben en sus platos, y ese es un número máximo teórico de archivos (vacíos o no vacíos) que puede almacenar en él.

Entonces, la respuesta es sí. Eventualmente, se quedará sin espacio, sin importar qué almacenamiento esté usando, si continúa agregando archivos vacíos. Obviamente se acabará mucho antes del máximo calculado de esta manera, pero se acabará.

AnoE
fuente
0

Simplemente no, pero puede quedarse sin inodos en Linux, que será lo mismo que quedarse sin espacio.

puedes probar algo como esto en tu caparazón n=0; while :; do touch $n; let n=n+1; done

Solo asegúrese de ejecutarlo en la máquina virtual o se quedará sin inodos muy rápido.

in1t3r
fuente
¿Qué está haciendo ese comando?
luchonacho
Comienza mientras el bucle infinito verdadero que a su vez crea un nombre de archivo que es un entero a partir de 0 y luego 1 2 3 ... eventualmente creará suficientes archivos para usar todos los inodos del sistema de archivos.
in1t3r
1
Si ejecuta ese comando en su / partición si es independiente, entonces / partición no tendrá problemas, simplemente no podría escribir más en su / partición home. Mi sugerencia crea un directorio llamado inodetest cd en él y luego ejecuta el comando después de ver errores que ya no puedes crear en el sistema de archivos, presiona ctrl + C y ejecuta rm -fr inodetestpara deshacerte de todos esos archivos vacíos y volver a funcionar normalmente. :)
in1t3r
0

No puede llenar el disco haciendo archivos vacíos; el disco todavía tendrá mucho espacio para nuevos archivos. Pero sí, puede agotar el suministro finito de inodos libres del sistema de archivos, momento en el que no puede crear archivos nuevos (aunque su disco, en lo que respecta al espacio utilizado, está prácticamente vacío). Solo se usa la lista de inodos del sistema de archivos, no el disco ... por lo que el sistema de archivos está lleno, mientras que el disco está prácticamente vacío. La tabla de inodo usa espacio en el disco, pero la tabla no crece cuando agrega archivos, al igual que una hoja de papel no crece cuando escribe en sus líneas.

(una respuesta en un comentario de Baard Kopperud)

luchonacho
fuente
¿No estás seguro de que necesitamos otra respuesta que diga lo mismo ?
Jeff Schaller