¿Manera de llenar / usar instantáneamente mucho espacio en disco?

46

En una VM Linux, me gustaría PROBAR el monitoreo de NAGIOS más profundamente que simplemente apagar la VM o desconectar la NIC virtual; Me gustaría probar o "aplicar una alarma de espacio en disco" al ocupar varios% del espacio libre durante un corto período de tiempo.

Sé que podría usar un

dd if=/dev/zero of=/tmp/hd-fillup.zeros bs=1G count=50

o algo así ... pero esto lleva tiempo y carga el sistema y requiere de nuevo tiempo al eliminar los archivos de prueba con rm.

¿Hay alguna forma rápida (casi instantánea) de llenar una partición que no cargue el sistema y tome mucho tiempo? Estoy pensando en algo que asigna espacio, pero no lo "llena".

Axel Werner
fuente
lo siento, olvidé mencionar que es un sistema de archivos >> ext3.
Axel Werner
Debe actualizarlo a ext4 para admitir Falocate.
Rui F Ribeiro
1
Zip bomb siempre funciona
galois
1
@jaska Haz que sea una respuesta. Fue la primera idea que tuve al leer el título ...
Crowley
¿Por qué no lo usas /dev/full? (Suponiendo que exista). Prueba echo 'test' > /dev/fullcon Debian.
Ismael Miguel

Respuestas:

64

La forma más rápida de crear un archivo en un sistema Linux es usar fallocate:

fallocate -l 50G file 

Del hombre:

Fallocate se utiliza para manipular el espacio en disco asignado para un archivo, ya sea para desasignarlo o preasignarlo.
Para los sistemas de archivos que admiten la llamada al sistema de Falcocate, la preasignación se realiza rápidamente asignando bloques y marcándolos como no inicializados, sin requerir IO a los bloques de datos. Esto es mucho más rápido que crear un archivo al llenarlo con ceros.
Compatible con XFS (desde Linux 2.6.38), ext4 (desde Linux 3.0), Btrfs (desde Linux 3.7) y tmpfs (desde Linux 3.5).

Rui F Ribeiro
fuente
1
¿Por qué lo estás pasando sudo?
gerrit
1
@gerrit Agregó ese punto a la respuesta.
Rui F Ribeiro
3
" fallocatenecesita privilegios de root" No en mi sistema (Linux Mint 17.3, aguas abajo de Ubuntu, por lo tanto Debian). (sistema de archivos ext4)
TJ Crowder
1
+1 aunque el OP mencionó explícitamente que su sistema de archivos es ext3.
syneticon-dj
1
@RuiFRibeiro, gracias! para sles11sp4 he podido crear un archivo, formatearlo con ext4, pero no he podido montarlo en modo RW. más tarde encontré un mensaje de kernel en / var / log / messages que decía que ext4 solo se admite como de solo lectura. : /
Axel Werner
13

Otras alternativas incluyen:

  1. para cambiar los umbrales de alarma a algo cercano o inferior al uso actual, o
  2. para crear una partición de prueba muy pequeña con inodos, tamaño u otros atributos limitados.

Ser capaz de probar cosas como correr en el porcentaje reservado raíz, si lo hay, también puede ser útil.

thrig
fuente
el porcentaje reservado de la raíz normalmente es del 10% a menos que lo modifique; termina siendo un desperdicio demasiado grande del sistema en particiones grandes / discos modernos. Al definir alarmas, es mejor que ya lo tenga en cuenta.
Rui F Ribeiro
+1 para lo primero. cien veces cierto ¿Por qué demonios debería crear algo en el disco de una máquina? ¿Qué pasa si algo (como coredump, trabajo por lotes que genera grandes archivos temporales, ...) sucede en el momento de mi prueba y todo el disco se come accidentalmente?
Fiisch
2
@Fisch - ¿Por qué? Para asegurarse de que su umbral de alerta es correcto y que no está haciendo algo como establecer accidentalmente el porcentaje libre de inodo en lugar del porcentaje libre de espacio en disco (que he visto hacer antes). Si algo falla porque llenó un disco hasta el umbral de alerta, entonces su umbral de alerta es demasiado bajo; el punto principal de la alerta es que se supone que debe alertarlo antes de que las cosas comiencen a romperse.
Johnny
Gato, buen punto. Pero no hay solución para mí. No tengo control sobre la configuración de VM (no puedo alterar particiones o discos virtuales), ni control sobre el servidor NAGIOS.
Axel Werner
2
@AxelWerner ¿Puede montar en bucle un archivo como partición "falsa"? Eso aún le permitiría realizar la prueba sin afectar seriamente nada. Formatee con uno de los sistemas de archivos compatibles y también puede jugar con Falcocate.
Tonny
9
  1. fallocate -l 50G big_file

  2. truncate -s 50G big_file

  3. dd of=bigfile bs=1 seek=50G count=0

Como esas tres formas pueden llenar una partición rápidamente.

Si te gusta usar dd , por lo general puedes probarlo con seek . Solo establece seek=file_size_what_you_needy establece count=0. Eso le dirá al sistema que hay un archivo , y su tamaño es el que configuró, pero el sistema no lo creará en realidad. Y de esta manera, puede crear un archivo que sea más grande que el tamaño de la partición.


Ejemplo, en una partición ext4 con menos de 3G disponible. Use dd para crear un archivo 5T que exista como metadatos, y que prácticamente no requiera espacio en bloque.

df -h . ; dd of=biggerfile bs=1 seek=5000G count=0 ; ls -log biggerfile ; df -h .

Salida:

Filesystem      Size  Used Avail Use% Mounted on
/dev/sda9        42G   37G  2.8G  94% /home
0+0 records in
0+0 records out
0 bytes copied, 4.9296e-05 s, 0.0 kB/s
-rw-rw-r-- 1 5368709120000 Jun 29 13:13 biggerfile
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda9        42G   37G  2.8G  94% /home
Siete
fuente
1
¿Puedes agregar más información a tu respuesta?
gato
Solo agrego más pensamiento en una pregunta terminada para personas que buscan la misma pregunta de otra manera. ignóralo, ¿y si no lo eres?
Se ven
Este count=0método es bastante interesante, he agregado un ejemplo.
agc
77
Tenga en cuenta que el ddejemplo anterior bien puede asignar un archivo disperso. En ese caso, el tamaño del archivo es 50G, en realidad solo usa un bloque (o ni siquiera) y, por lo tanto, el disco no se llena. YMMV.
MAPA
2
Probé su sugerencia en mi sistema de archivos ext3. No funcionó como se esperaba. truncate y dd crearon un archivo con un tamaño de archivo grande, pero "df -h" no lo reconoció. todavía muestra el mismo espacio libre en hd.
Axel Werner
0

También puede aprovechar la herramienta de estrés que es compatible con una gran cantidad de sistemas basados ​​en Linux:

stress-ng --fallocate 4 --fallocate-bytes 70% --timeout 1m --metrics --verify --times
theosophe74
fuente