Cómo llenar un disco duro en Linux

24

Estoy haciendo algunas pruebas de un fragmento de código y quiero llenar un disco duro con datos. Descubrí que ddpuede crear archivos enormes en un instante, pero dfno está de acuerdo. Esto es lo que probé:

dd if=/dev/zero of=filename bs=1 count=1 seek=$((10*1024*1024*1024))

ls -lhmuestra un archivo 10G. Sin embargo, df -hmuestra que la partición no se redujo. Entonces, ¿qué necesito hacer para dfreconocer que los datos ahora están tomados? Espero algo rápido que codifique en una prueba unitaria.

Usuario1
fuente
Tendrá más suerte si pregunta en serverfault.com
Por cierto, 10 * 1024 * 1024 * 1024 es lo mismo que 10 * 2 ** 30, un poco más simple.
deltaray

Respuestas:

26

El problema con el seek=<big number>truco es que el sistema de archivos es (generalmente) inteligente: si parte de un archivo nunca se ha escrito (y por lo tanto es todo ceros), no se molesta en asignarle espacio, así que, como usted ' visto, puede tener un archivo de 10GB que no ocupa espacio (esto se conoce como un "archivo disperso", y puede ser muy útil en algunos casos, por ejemplo, ciertas implementaciones de bases de datos).

Puede forzar la asignación del espacio con (por ejemplo):

dd if=/dev/zero of=filename bs=$((1024*1024)) count=$((10*1024))

lo que llevará mucho más tiempo, pero en realidad llenará el disco. Recomiendo hacer que el tamaño del bloque sea mucho más alto que uno, porque esto determinará cuántas llamadas al sistema ddrealiza el proceso: cuanto menor sea el tamaño del bloque, más syscalls y, por lo tanto, más lento se ejecutará. (Aunque más allá de 1 MB más o menos, probablemente no hará mucha diferencia e incluso puede ralentizar las cosas ...)

psmears
fuente
Usualmente uso bs = (cualquiera que sea la mitad del tamaño de caché en la unidad que estoy escribiendo). Esto ha funcionado bien hasta la fecha cuando se crean imágenes de particiones en discos duros más grandes para luego redimensionarlas. ETA: la palabra crítica MEDIO.
atroon el
20

Como otra opción para esto, puede usar el sí junto con una sola cadena y es aproximadamente 10 veces más rápido que ejecutar dd if = / dev / urandom of = largefile. Me gusta esto

yes abcdefghijklmnopqrstuvwxyz0123456789 > largefile
deltaray
fuente
Esto es, sorprendentemente, casi tan rápido como usar dd if = / dev / zero of = filename bs = 1M.
bhinesley 01 de
La sintaxis también es fácil de recordar.
AWT
7

Ha creado lo que se conoce como un "archivo disperso", un archivo que, debido a que la mayoría está vacío (es decir, se lee como \ 0), no ocupa espacio en el disco además de lo que está realmente escrito (1B, después de 10GB de brecha).

No creo que pueda crear archivos enormes, ocupando espacio en disco real en un instante; ocupar espacio físico significa que el sistema de archivos necesita asignar bloques de disco a su archivo.

Creo que está atrapado con el antiguo "dd if = / dev / zero of = filename bs = 100M count = 100", que está limitado por la velocidad de escritura secuencial de su unidad.

qdot
fuente
6

Si solo está probando casos con sistemas de archivos llenos, quizás Fallocate sea lo suficientemente bueno. ¡Y más rápido también! p.ej

Falocate -l 150G

uchihaangel
fuente
3
Esto necesita un nombre de archivo que se especifique: fallocate -l 150G foo. Sin embargo, +1 por mencionar la herramienta.
Kamil Maciorowski
3

Deje de usar seeky use un muy grande bsy / o count. Como está haciendo un archivo escaso , y obviamente no necesita hacer eso.

Ignacio Vazquez-Abrams
fuente
3

Si quiere literalmente llenar el disco duro, haga esto:

dd if=/dev/zero of=zeros bs=1M

Opcionalmente, puede especificar el recuento si desea limitar el tamaño, pero si omite el recuento, solo se ejecutará hasta que se quede sin espacio en disco.

dd if=/dev/zero of=zeros bs=1M count=10240

Como mencionó psmears, obtendrá un mejor rendimiento si establece el tamaño del bloque en 1 MB (bs = 1M) en lugar de 1 B (bs = 1). Esto todavía tomará un tiempo, pero si desea verificar el progreso de su comando, abra una consola separada y ejecute estos comandos:

ps aux | grep dd

Use el PID de dd en este comando (reemplace PID con el PID de dd):

kill -USR1 PID

Luego ve a ver tu terminal dd. Por supuesto, esto es de uso limitado cuando solo está tratando de llenar la unidad (puede usar df o du para verificar el espacio libre en el disco o el tamaño del archivo, respectivamente). Sin embargo, hay otros momentos en que es útil hacer que la salida dd avance.

Crédito adicional: un uso práctico para poner a cero el espacio libre es que, luego, puede eliminar los archivos "cero" y dd toda la partición (o disco, si ha puesto a cero todas las particiones) a un archivo de imagen de disco (digamos , disk-backup.dd), luego comprima el archivo. El espacio libre ahora es altamente compresible, por lo que su imagen dd comprimida será mucho más pequeña que el dispositivo de bloque original cuyo contenido contiene.

Travesuras: comprime un archivo de ceros grande y envíalo por correo electrónico a todos tus amigos. Diles que es algo realmente genial.

robar
fuente
2

Crea un archivo de 1 TB no disperso con el siguiente comando:

dd if=/dev/zero of=bigfile1 bs=10000000000 count=512

Esto fue útil para probar lo que sucede cuando se superan las cuotas o cuando se llena un sistema de archivos.

df -h muestra el espacio disponible cada vez más pequeño.

usuario75112
fuente