dd corriendo más allá del final del dispositivo de entrada
Estoy tratando de usarlo dd
para clonar un disco duro que reparé. Estoy tratando de dd
copiar los datos de la unidad en trozos de 10 GB, sin embargo, está transfiriendo más datos de los que la unidad debería contener. La unidad en sí funciona y la partición en ella se puede montar.
Usando df -h
obtuve el tamaño de la unidad en 1000204886016 bytes (unidad de 1TB).
Inicialmente intenté:
sudo dd if=/dev/sdb of=/dev/sdd status=progress
Sin embargo, eso se ralentizó después de aproximadamente 300 GB y finalmente falló debido a un error de lectura. Decidí intentar copiarlo en trozos de 10GB. Calculé que leer 10GB con un tamaño de bloque de 128kByte requiere copiar 78125 bloques.
Para hacer esto estoy usando:
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=n
dd
informaba que se transfirieron 10240000000 bytes cada vez. Para calcular el valor de búsqueda para cada iteración, agregué los bytes transferidos y resté 1 GB para asegurarme de que hubiera algo de superposición. La secuencia resultante es:
seek=0
seek=9240000000
seek=18480000000
seek=27720000000
seek=36960000000
...
seek=1071840000000
Los escribí en un script de shell con comandos dd discretos y los ejecuté. Dejé la última iteración libre para copiar tantos datos como fuera necesario.
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=0
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=9240000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=18480000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=27720000000
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress oflag=seek_bytes seek=36960000000
...
sudo dd if=/dev/sdb of=/dev/sdd bs=128k status=progress oflag=seek_bytes seek=1071840000000
Debería haber pasado mucho más allá del final de la unidad en esa última iteración, sin embargo, simplemente continuó. El clon se monta, pero está claramente dañado y faltan datos.
- ¿Hay algún problema con mis matemáticas o con los argumentos que utilicé
dd
? - ¿Existe una mejor manera de escribir un comando 'dd' para obtener los datos en trozos de 10GB?
Respuestas
El problema es que está asumiendo que seek
toma un valor de byte, cuando en realidad toma un recuento de bloques. Usted debe estar utilizando seek=0
, 78125
, 156250
, etc.
Sin embargo, puede simplificarlo mucho deshaciéndose de dd
:
split -b 10G < /dev/sdd
Estoy tratando de usar dd para clonar un disco duro que reparé
No lo hagas.
Úselo en su ddrescuelugar, que se adapta bien a bloques ilegibles y otros errores de medios.
Descubrí que la razón por la que mi solución falló fue malinterpretar lo que hacía la bandera de búsqueda. Solo estaba cambiando la ubicación de escritura en la unidad de salida. Entonces, el script simplemente copiaba los primeros 10 GB una y otra vez en la salida. Nunca llegaría al final del dispositivo.
Para cambiar la entrada, también se debe usar la bandera de omisión:
sudo dd if=/dev/sdb of=/dev/sdd bs=128k count=78125 status=progress skip=n seek=n
La configuración oflag=seek_bytes
y iflag=skip_bytes
permitirá que las matemáticas se realicen en bytes en lugar de bloques.
Sin embargo, las opciones presentadas por roaima (use ddrescue) y ese otro tipo ( split -b 10G < /dev/sdd
) son una mejor manera de recuperar unidades dañadas y realizar transferencias segmentadas respectivamente.