Reanudar un DD de un disco completo


10

Estoy sobrescribiendo mi disco duro con datos aleatorios usando el viejo bien dd:

dd if=/dev/urandom of=/dev/disk/by-uuid/etc bs=512

Es una matriz de 2TB y mi MacBook (con Linux, ¿de acuerdo?) Solo puede escribir datos a alrededor de 3.7MB / s, lo cual es bastante patético ya que he visto que mi escritorio en casa hace 20MB / s. Cuando vaya a casa esta noche, me gustaría detener la ddcarrera aquí, llevarla a casa y ver qué tipo de progreso se puede hacer de la noche a la mañana con una máquina más poderosa.

He estado monitoreando el progreso usando un bucle simple:

while true; do kill -USR1 $PID ; sleep 10 ; done

El resultado se ve así:

464938971+7 records in
464938971+7 records out
238048755782 bytes (238 GB) copied, 64559.6 s, 3.7 MB/s

Si ddtuviera que reanudar el pase en casa, ¿cómo lo reiniciaría? Soy consciente del seekparámetro, pero ¿a qué lo apunto, el número de registro o el recuento de bytes?


1
¿Utilizo el número de registro? ¿Eso equivale al conteo escrito en bloque?
Naftuli Kay

2
El número de bloques = bytes totales / tamaño de bloque, en teoría debería ser 238048755782/512 = 464938976, pero tiene algunos registros parciales allí, así que restaría algunos bloques del número solo para estar seguro, por ejemploseek=464938960
don_crissti

Respuestas:


8

Como @don_crissti ya comentó, solo use seek=para reanudar.

dd if=/dev/urandom of=/dev/disk/by-uuid/etc bs=512 seek=464938971

GNU dd también admite la búsqueda en bytes, por lo que puede reanudar exactamente, independientemente del tamaño de bloque:

dd if=/dev/urandom of=/dev/disk/by-uuid/etc bs=1M \
   seek=238048755782 oflag=seek_bytes

Un tamaño de bloque más grande debería ayudar con las velocidades incluso para un dispositivo lento como /dev/urandom.

Si está buscando alternativas más rápidas, podría cryptsetup plainOpenhacerlo con una clave aleatoria y ponerla a cero, debería vencer /dev/urandompor un orden de magnitud (sin AES-NI) o incluso correr a toda velocidad (con AES-NI).

También podría usar shred -n 1si los datos pseudoaleatorios son lo suficientemente buenos para su caso de uso. shreddebería poder utilizar la velocidad total del disco, incluso en una máquina muy lenta.


No lo sabía plainOpenhasta ahora. ¡Excelente! Terminé mi codificación de una unidad de 2 TB en alrededor de 4 horas en lugar de 256 GB en más de 12 usando /dev/urandom.
Naftuli Kay

3

Sólo un recordatorio para las personas que deseen copiar en lugar de discos sólo asignaron al azar (que no es que común): se puede usar skip=BLOCKSpara iniciar la lectura en la posición correcta, y seek=BLOCKSpara empezar a escribir en la posición correcta. Ambas opciones usan bloques, no bytes. Al romper / reiniciar, es recomendable eliminar un montón de bloques por si acaso. Por lo general, vale la pena elevar el bsvalor por encima de 512, ya que puede alcanzar un mejor rendimiento si lee muchos datos seguidos.

En su caso, es un valor de bloque al que debe pasar seek. Tal vez debería intentar ajustar bspara ver si puede mejorar la velocidad, ya que /dev/randomdebería ir rápido (pseudoaleatorio y sin bloqueo cuando no tiene entropía disponible)


0

ddcon un tamaño de bloque pequeño como 512 bytes es probable que sea mucho más lento que el rendimiento máximo de su disco. Utilice un tamaño de bloque más alto (en una corazonada, diría que algunos MB) para un buen rendimiento. O use cat: en Linux encontré catque era tan rápido como ddcon el tamaño de bloque óptimo cuando estaba involucrado un solo disco (no sé si eso también es válido para OSX).

Para encontrar qué tan lejos catha llegado, ejecute lsof -p1234donde 1234 es la ID del catproceso.

Para reanudar desde una posición, use

{ dd bs=1 seek=123456; cat /dev/urandom; } >/dev/disk/…

donde 123456 es el desplazamiento en bytes.


0

Clonando un disco:

Ampliando esta respuesta desde este hilo, así es como se podría clonar un disco completo y reanudar:

Este ejemplo está optimizado para copiar desde un disco rotativo de 5400 rpm a un SSD en un sistema específico. gddrepresenta GNU dd:

> sudo gdd 'if=/dev/rdisk3' 'of=/dev/rdisk6' bs=4M status=progress
247426187264 bytes (247 GB, 230 GiB) copied, 2082 s, 119 MB/s
59012+0 records in
59011+0 records out
247510073344 bytes (248 GB, 231 GiB) copied, 2082.92 s, 119 MB/s

Puedo resumir esto de una de dos maneras:

> sudo gdd 'if=/dev/rdisk3' 'of=/dev/rdisk6' \
bs=4M \
seek=59011 skip=59011 \
status=progress

O:

> sudo gdd 'if=/dev/rdisk3' 'of=/dev/rdisk6' \
bs=4M \
seek=247510073344 skip=247510073344 \
oflag=seek_bytes iflag=skip_bytes \
status=progress

En el primer ejemplo, la razón por la que usamos 59011y no 59012, es porque 59011es cuántos registros de tamaño de bloque se copiaron completamente antes de ser interrumpidos. (registros).

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.