¿Qué hace `dd if = / dev / zero of = / dev / sda`

19

Editado: no ejecute esto para probarlo a menos que desee destruir datos.

¿Podría alguien ayudarme a entender lo que tengo?

  1. dd if=/dev/zero of=/dev/sda bs=4096 count=4096

    P: ¿Por qué específicamente 4096 count?

  2. dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr blockdev --getsz /dev/sda - 4096)

    P: ¿Qué hace exactamente esto?

J H
fuente
44
¿Dónde encontraste este código malicioso?
Suici Doga
10
Este no es un código malicioso.
Michael Hampton
12
@MichaelHampton: s /icious / destructive / Si bien publicar código destructivo no es malicioso per se, publicarlo sin una advertencia clara de que puede destruir datos IS.
Ben Voigt
1
Es mejor pensar en DD como 'Destructor de disco' cuando alguien en Internet le dice que ejecute un comando como este.
Bobby Sacamano
3
en realidad DD significa descripción de datos
Suici Doga

Respuestas:

43

dd if = / dev / zero of = / dev / sda bs = 4096 count = 4096 P: ¿por qué 4096 se usa particularmente para el contador?

Esto pondrá a cero los primeros 16 MiB de la unidad. 16 MiB es probablemente más que suficiente para destruir cualquier estructura de "inicio de disco" mientras es lo suficientemente pequeño como para que no demore mucho.

dd if = / dev / zero of = / dev / sda bs = 512 count = 4096 seek = $ (expr blockdev --getsz / dev / sda - 4096)

P: ¿Qué hace esto exactamente?

blockdev --getszobtiene el tamaño del dispositivo de bloque en "sectores de 512 bytes". Entonces, este comando parece que estaba destinado a poner a cero los últimos 2 MiB de la unidad.

Lamentablemente, este comando tiene una sintaxis rota. Espero que el comando originalmente fuera

dd if=/dev/zero of=/dev/sda bs=512 count=4096 seek=$(expr `blockdev --getsz /dev/sda` - 4096)

y los backticks se perdieron en algún lugar a lo largo de la línea de personas que lo copiaron / pegaron entre diferentes entornos.

Las tablas de partición antiguas, los metadatos LVM, los metadatos de incursión, etc. pueden causar problemas al reutilizar una unidad. Poner a cero las secciones al inicio y al final de la unidad generalmente evitará estos problemas, mientras que es mucho más rápido que poner a cero toda la unidad.

lavado
fuente
44
Gracias. Esta respuesta parece cumplir más con lo que estaba buscando. Los dos comandos se usan después de delpart. Se utilizan para limpiar un disco para reutilizarlo como limpio.
JH
expr blockdev --getsz /dev/sda - 4096sería un error de sintaxis de expr. Creo que el comando previsto era ...seek="$(expr "$(blockdev --getsz /dev/sda)" - 4096)". O mejor:...seek="$(($(blockdev --getsz /dev/sda) - 4096))"
Stéphane Chazelas
1
Supongo que originalmente hubo retrocesos en el comando y se los comieron en algún momento.
plugwash
16

Esto borrará el primero 4096*4096=16MBy el último 512*4096=2MBde su disco duro, que contienen estructuras importantes útiles para la recuperación. Supongo que este código fue publicado maliciosamente.

Nunca me he encontrado con una situación en la que especificar explícitamente countotro que no sea 1útil. Yo he borrado el primer bloque si quería asegurarse de que no estaba dejando ningún rastro de la MBR detrás ...

o11c
fuente
8
Esto no es necesariamente malicioso, he tenido algunos programas de formato incorrectos que se niegan a escribir una nueva etiqueta si la actual está dañada, por lo que tuve que poner a cero manualmente los primeros bytes como este.
Shelvacu
1
@shelvacu Me sorprendería si el disco manipulado de esta manera lo fuera sda. Más probable sdbo sdc. Pero puedo estar equivocado, por supuesto ...
yo '
77
Esto no es malicioso. Borra la GPT al comienzo del disco y la GPT de respaldo al final del disco.
Michael Hampton
2
@shelvacu: Es destructivo. Si se publicaron comandos destructivos sin una explicación de lo que hace, es malicioso. Si iban acompañados de una explicación, ¿por qué OP pregunta al respecto aquí?
Ben Voigt
2
Entonces, ¿quién, en su mente perfecta, copiará / pegará los códigos encontrados en cualquier lugar sin saber su propósito? No es malicioso porque no sacudiré ningún dispositivo extraño que pueda encontrar en el metro.
Magno C
4

Esos comandos sobrescribirán su dispositivo sda con ceros: el primero hará los primeros 16 MB (tamaño de bloque de 4096 y recuento de 4096 bloques) y el segundo sobrescribirá los últimos 2 MB (tamaño de bloque 512 con 4096 bloques) con ceros. (No se está borrando técnicamente, y eso se relaciona con mi primer punto a continuación).

(esa fue la parte ya mencionada en otras respuestas, incluida aquí para completar)

Otra cosa que vale la pena mencionar es que el tamaño del bloque tiene efectos, pero generalmente solo se ven en operaciones de alto volumen. La forma más eficiente (más rápida) de ejecutar el comando es si el tamaño del bloque del comando coincide con el tamaño de acceso del dispositivo; de lo contrario, se pierde tiempo.

Si está interesado, puede intentar crear un archivo con un millón de fragmentos de 1 bloque, y un archivo con 1 millón de fragmentos de bloque y ver la diferencia:

[user@host tmp]$ time dd if=/dev/zero of=/tmp/test1 bs=1 count=1000000
1000000+0 records in
1000000+0 records out
1000000 bytes (1.0 MB) copied, 2.44439 s, 409 kB/s

real    0m2.447s
user    0m0.177s
sys     0m2.269s
[user@host tmp]$ time dd if=/dev/zero of=/tmp/test2 bs=1000000 count=1
1+0 records in
1+0 records out
1000000 bytes (1.0 MB) copied, 0.00155357 s, 644 MB/s

real    0m0.003s
user    0m0.001s
sys     0m0.002s
[user@host tmp]$ ls -al test*
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test1
-rw-rw---- 1 user grp 1000000 Apr  8 15:51 test2

Como puede ver, el tamaño de bloque tiene un impacto masivo en la eficiencia. Tal vez sea una barra lateral para el OP, pero siento que todavía es relevante.

TL; DR: No ejecute código arbitrario que encuentre en la red, o que alguien en quien no confía le dé. Arruinará tu día.

Tim S.
fuente
77
+1 para la Don't execute arbitrary code you find on the netlínea
Sergiy Kolodyazhnyy
77
"Tenga en cuenta que este proceso es extremadamente tedioso y / o costoso y requiere un equipo extremadamente específico". Deja de difundir esta información errónea. La última vez que esto fue incluso teóricamente posible fue hace décadas en una tecnología que muchas generaciones está obsoleta ahora. Nadie ha demostrado este tipo de recuperación en unidades modernas, incluso en respuesta a desafíos públicos con premios en metálico, por ejemplo hostjury.com/blog/view/195/…
Andrew Medico
Eliminé esa sección; supongo que ha pasado un tiempo desde que escuché por primera vez sobre eso. Sin embargo, diré que "teóricamente" era la palabra clave, pero estoy divagando.
Tim S.
2

Otros han explicado lo que hacen, así que me saltearé eso.

El punto de ddtener una separación bsy un countargumento es que bscontrola cuánto se escribe a la vez . La especificación de valores realmente grandes para bsrequerirá un búfer realmente grande en el programa, y ​​la especificación de valores inferiores al tamaño de bloque del dispositivo será lenta porque el núcleo tiene que construir un bloque completo para escribir en el dispositivo (en casos como este puede probablemente guarde las escrituras en un búfer hasta que haya un bloque completo, en otros casos, podría tener que leer lo que ya está en el disco). Como los dos comandos usan valores diferentes para bs, eso me lleva a pensar que podría haberlos encontrado en dos sitios diferentes. Los discos duros solían tener un tamaño de bloque de 512 bytes, correspondiente albs=512del último comando, pero algunos (6-8 creo) hace años comenzaron a hacer discos con un tamaño de bloque de 4096 bytes, haciendo bs=4096una mejor elección para los discos modernos.

Henrik - deja de lastimar a Monica
fuente
1
El punto ideal para bses mucho más alto que eso . Un solo comando SATA puede leer o escribir múltiples sectores, por lo que el núcleo fusiona las E / S antes de enviarlas. Cualquier lugar desde bs=64khasta bs=1024kes razonable (el tamaño de caché L3 es a menudo 4-8MiB). A menudo uso bs=128k, que es la mitad del tamaño de caché L2 en las CPU Intel modernas. ( ddincluye dos operaciones de memcpy: en la read(2)fuente (incluso si es / dev / zero), y write(2). IIRC, sddtenía una opción para escribir ceros, lo que ahorraría un poco de tiempo de CPU. Realmente solo es relevante si el destino es algo que no sea un disco).
Peter Cordes
Para ver que se iostat -x 4produce la fusión de la solicitud de E / S, observe la salida de o algo así y observe las columnas rrqm / s (solicitudes de lectura fusionadas por segundo) y wrqm / s.
Peter Cordes
1

ADVERTENCIA: dd if=/dev/zero of=/dev/ se utiliza para limpiar una unidad o dispositivo antes de copiar datos forenses. La unidad o dispositivo siempre debe desinfectarse antes de copiar información de un sistema bajo investigación forense para mitigar la contaminación cruzada. Por lo tanto, no es un comando incorrecto, el usuario final debe comprender para qué se utiliza o destruirán sus datos. Si esto es lo que desea, entonces verifique la operación de escritura cero dd if=/dev/sda | hexdump -C | head.

Fuente: Guía práctica para investigaciones forenses informáticas por el Dr. Darren Hayes

SierraJuliet
fuente
1

Utilizo dd if=/dev/zero of=/dev/sdX oflag=syncpara probar la calidad de una unidad USB o tarjeta MicroSD insertada ANTES de usarla con gparted, fdisk o dd con una imagen de disco. Creo que esta es una idea prudente, especialmente con los medios MicroSD que tienen un mal historial de calidad.

Por supuesto, tenga cuidado con of = sdX porque no hay perdón con un borrado accidental del disco. Verifique que X = letra de unidad del objetivo deseado.

Ricardo
fuente