Posible pausar dd, cambiar el destino a un disco más grande y luego continuar?

Estoy copyndo un disco a un file, pero subestimé la cantidad de espacio que tomaría. Así que me estoy quedando sin espacio en la unidad de destino y no quiero abortar el process (ha estado funcionando bastante time en una unidad dañada).

Por supuesto, puedo pausar dd usando CTRL-Z, y me gustaría cambiar la unidad de destino por una más grande y copyr el file a la unidad más grande, luego reanudar dd. ¿Alguna idea sobre cómo lograr esto?

dd if=/dev/sdc conv=sync,noerror bs=64M | gzip -c -9 > /media/extD/drive.img.gz 

EDITAR: para aquellos que mencionan ddrescue como una mejor herramienta para usar, tienes razón. Sin embargo, por la razón que sea, ddrescue no dejó de molestarme y de cometer errores, mientras que dd simplemente ha estado trajinando sin quejas.

Es posible, pero un poco doloroso.

Primero, sepa que dd imprime su position actual en una copy (bytes copydos) si envió la señal USR1 . así que encuentre el PID de dd , usando ya sea ps o algo como pidof o pgrep (no POSIX y no en todos los sistemas de unix-y IIRC).

Un command ps que funciona para mí (también usa awk , en un entorno Debian ):

 ps aux|awk '/dd/ {print $2}'|grep -v awk 

grep -v awk es necesario para evitar que el PID de awk imprima.

Teniendo el PID de dd , envíe la señal USR1 :

 kill -USR1 [pid of dd] 

la window de console en la que se ejecuta dd imprimirá cuántos bytes se copyn. Ahora puede matar a dd por real (ctrl + c, kill -9 , lo que sea). No recuerdo si dd informa su progreso en el aborto si se mata de esta manera en POSIX , así que primero envíe la señal USR1 .

dd puede ahora haber copydo algunos bytes más desde que lo detuvo, así que ejecute:

 head -c [number of bytes reported copied from dd] > \ /path/to/drive/you/are/moving/to/filename.bin 

para poner una copy truncada en el disco de destino. En lugar de la cantidad precisa de bytes, puede elegir algo divisible por el tamaño de bloque que desee, para acelerar la transferencia cuando reanude la copy. Simplemente tome nota de lo que elija, y asegúrese de que solo está truncando, no creciendo, la image.

Una vez que haya copydo esto en la nueva unidad, ejecute:

 dd if=/dev/sdc bs=64M skip=[truncated size divided by block size, eg 64000000] \ of=/path/to/part2 

Si tiene espacio para el rest de la image en el disco original más pequeño, elimine la image no truncada que copió en el nuevo disco en la parte 1 para liberar espacio, y en su lugar dd dúclelo en ese disco. Cuando se completa la transferencia, puede ejecutar

 cat /path/to/part2 >> /path/to/part1 

para agregar la parte 2 al final de la parte 1 , ¡creando una image de disco completa! Tenga en count que necesitará al less la misma cantidad de espacio libre en el disco en el que se encuentra la parte 1 para todas las partes dos que se anexen.

Si no te importa hacer toda la transferencia, yo haría cat /dev/sdc | gzip -c - > /path/to/imagefile.img.gz cat /dev/sdc | gzip -c - > /path/to/imagefile.img.gz para crear un file comprimido gzip. Esto se puede escribir en una partición del disco duro con algo como zcat /path/to/imagefile.img.gz > /dev/sdX .

[copydo de mi comentario en la respuesta]

además, creo (pero no lo recuerdo con certeza) que dd escribe en stdout si = no está especificado. Si esto es cierto, puede omitir la escritura de part2 en un file separado y usar:

 dd bs=64M skip=[skip-block-count] if=/dev/sdc >> /path/to/part1 

@MatijaNalis ha sugerido correctamente utilizar dd_rescue o ddrescue (dos progtwigs diferentes que realizan la misma tarea) para copyr la image del disco. Haría esto si tu partición / unidad tiene sectores erróneos u otras fallas de hardware.

No puede pausar el process y reanudarlo después de mover el file en otra unidad¹. Sin embargo, no es necesario que hagas eso. Simplemente elimine el process dd , realice la transferencia de files e inicie un nuevo process de copy para el rest de los datos.

Para ver dónde se detiene la primera parte, ejecute gzip -l /media/extD/drive.img.gz . El número "descomprimido" es la cantidad de bytes que se copyron, y es el desplazamiento donde debe comenzar el nuevo process de copy.

Para copyr el rest de los datos, dile a dd que comience en ese desplazamiento NNNN .

  dd if = / dev / sdc conv = sync, noerror, iflag = skip_bytes, skip = NNNN bs = 64M |
 gzip -c -9 >> /media/extE/drive.img.gz

No recomiendo usar dd para copyr datos. Contrariamente a una leyenda común, no hay magia en dd que le permita acceder a los discos: la magia está en /dev/sdc . Además, dd puede perder datos de forma silenciosa : creo que con las banderas conv=sync,noerror solo reemplaza algunos datos por ceros, por lo que todos los datos que se copyn exitosamente terminan en la location correcta, pero hazlo bajo tu propio riesgo.

Para copyr una image de disco de un disco en funcionamiento, solo use cp o cat . Para copyr una parte, tail -c +$((start_offset+1)) | head -c $bytes_to_copy tail -c +$((start_offset+1)) | head -c $bytes_to_copy .

Para rescatar datos de un disco que falla, use ddrescue . Ddrescue es inteligente al omitir datos ilegibles y realiza un seguimiento de lo que se lee con éxito. Hace múltiples pases; con discos duros defectuosos, dejar que la unidad descanse un poco e intentarlo de nuevo a menudo puede permitirle recuperar todo, incluso si algunos sectores son ilegibles en el primer bash.

ddrescue puede usar su copy parcial existente y completarla , pero deberá mantenerla sin comprimir.

¹ En realidad, puede, con ptrace , conectarse al process con un depurador, pausarlo, actualizar sus estructuras internas de datos para apuntar al nuevo file, reanudar. Pero incluso si estuviera familiarizado con la forma de hacerlo, sería más complicado que agregar una solución sencilla.