É possível, mas meio doloroso.
Primeiro, saiba que dd
imprime sua posição atual em uma cópia (bytes copiados), se enviado ao sinal USR1 . então encontre o PID de dd
, usando ps
ou algo como pidof
ou pgrep
(não POSIX e não em todos os sistemas unix-y IIRC ).
Um comando ps
que funciona para mim (também usando awk
, em um ambiente debian ):
ps aux|awk '/dd/ {print $2}'|grep -v awk
grep -v awk
é necessário para evitar que o PID de awk
também seja impresso.
Tendo o PID de dd
, envie o sinal USR1 :
kill -USR1 [pid of dd]
a janela do console dd
está sendo executada, imprimirá quantos bytes serão copiados. Agora você pode matar dd
para real (ctrl + c, kill -9
, whatever). Eu não me lembro se dd
informa seu progresso em abortar se for morto dessa forma em POSIX , então envie primeiro o sinal USR1 .
dd
pode ter copiado mais alguns bytes desde que você o parou, então execute:
head -c [number of bytes reported copied from dd] > \
/path/to/drive/you/are/moving/to/filename.bin
para colocar uma cópia truncada no disco de destino. Em vez do número exato de bytes, você pode querer escolher algo divisível pelo tamanho do bloco desejado, para acelerar a transferência quando retomar a cópia. Apenas anote tudo o que você escolher e verifique se está apenas truncando e não aumentando a imagem.
Depois de copiá-lo para a nova unidade, execute:
dd if=/dev/sdc bs=64M skip=[truncated size divided by block size, e.g. 64000000] \
of=/path/to/part2
Se você tiver espaço para o restante da imagem no disco original menor, exclua a imagem não truncada que você copiou para o novo disco em parte 1 para liberar espaço e tenha dd
saída para esse disco em seu lugar. Quando a transferência estiver completa, você pode executar
cat /path/to/part2 >> /path/to/part1
para adicionar parte 2 ao final da parte 1 , criando uma imagem de disco completa! Note que você precisará de pelo menos o espaço livre no disco em que a parte 1 está localizada para que toda a parte dois seja anexada a ela.
Se você não se importar em fazer toda a transferência, eu faria cat /dev/sdc | gzip -c - > /path/to/imagefile.img.gz
para criar um arquivo comprimido gzip. Isso pode ser gravado em uma partição do disco rígido com algo como zcat /path/to/imagefile.img.gz > /dev/sdX
.
[copiado do meu comentário para a resposta]
adicionalmente, eu acho (mas não me lembro ao certo) que dd escreve para stdout if of = não é especificado. Se isso for verdade, você pode pular escrevendo part2 para um arquivo separado e usar:
dd bs=64M skip=[skip-block-count] if=/dev/sdc >> /path/to/part1
A @MatijaNalis sugeriu, com razão, usar dd_rescue
ou ddrescue
(dois programas diferentes que realizam a mesma tarefa) para copiar a imagem do disco. Eu faria isso se sua partição / unidade tivesse setores errôneos ou outras falhas de hardware.