Clone a partição inteira ou o disco rígido para um arquivo esparso


35

Eu gosto de clonar uma partição inteira ou um disco rígido inteiro em um disco externo maior, mas gosto de criar um arquivo esparso. Costumo usar ddpara clonagem, mas ele não suporta arquivos esparsos. Como solução alternativa, usei algo como:

cp --sparse=always <(dd if=/dev/sda1 bs=8M) /mount/external/backup/sda1.raw

No entanto, isso é um pouco complicado para o meu gosto e não me permite retomar o processo se abortado. É engraçado que exista uma ferramenta NTFS para isso ( ntfsclone), mas essa ferramenta não existe para os sistemas de arquivos nativos do Linux (EXT2-4).

Existe alguma ferramenta melhor para isso, por exemplo, uma ddvariante com suporte escasso? Não procuro algum software proprietário para backups em disco, mas simplesmente desejo fazer uma cópia esparsa de clone que possa montar como dispositivo de loop, se necessário.


7
+1 para uso criativo de cp, nunca me ocorreu que você pudesse copiar esparsamente uma imagem de disco. Eu sempre os comprimia se precisava economizar espaço. Agora, por que isso não é uma resposta em uma pergunta?
Caleb

Respostas:


21

Você quer dd_rescue.

dd_rescue -a -b 8M /dev/sda1 /mount/external/backup/sda1.raw

11
Ótimo! O manual diz "Se o processo de cópia for interrompido pelo usuário, é possível continuar em qualquer posição posteriormente". e "-a gravação de arquivo spArse (padrão = não)". Exatamente o que eu quero! Obrigado!
Martin Scharrer

3
Procurando dd_rescueonline, descobri que também existe uma ferramenta diferente chamada ddrescue(sem o sublinhado) que foi desenvolvida independentemente, dd_rescuemas parece fazer basicamente o mesmo. Eu apenas mencionei isso aqui como FYI geral.
Martin Scharrer

Sim, dd_rescuee ddrescuenão são a mesma coisa. Teoricamente, eles fazem o mesmo trabalho, mas geralmente tive mais sorte com o antigo / original dd_rescue.
Steven Pritchard

11
Caso alguém esteja se perguntando, você pode parar a cópia a qualquer momento com Ctrl-C. Ele mostrará sua posição atual e você pode usar esse valor para reiniciar adicionando -se a posição ao comando original. (Então ele ficaria assim dd_rescue -a -b 8M -s 42000k /dev/sda1 /mount/external/backup/sda1.raw.)
Steven Pritchard

11
@ Steven Pritchard: Não há necessidade de lembrar a posição. Especifique um terceiro nome de arquivo, que será o arquivo de log, e, na reinicialização, ele lerá e continuará de onde parou.
Tanith Rosenbaum

20

Apenas para completar, a chamada para ddrescue . O sinalizador --sparseou -Spermite que o destino seja gravado esparsamente:

$ ddrescue -S -b8M /dev/sda1 /mount/external/backup/sda1.raw

Ou com opção longa:

$ ddrescue --sparse --block-size 8M /dev/sda1 /mount/external/backup/sda1.raw

Ou se você prefere MiBs :

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw

Para permitir que o resgate seja interrompido e retomado, você também pode usar um arquivo de log:

$ ddrescue -S -b8Mi /dev/sda1 /mount/external/backup/sda1.raw ~/sda1.rescue.log

Note que GNU ddrescuee dd_rescuesão programas diferentes. Mas o GNU ddrescueparece ser mais difundido. Por exemplo, ele já está empacotado com GRML .


É necessário haver um tratamento especial da imagem ao restaurar, você pode fornecer o comando usado para restaurar um ddrescue?
precisa saber é o seguinte

Em teoria, o meio de armazenamento que você está usando para o resgate é suposto ser mais confiável, para que possa normalmente só usar dd para escrever para o disco de substituição: dd if=sda1.raw of=/dev/sdb1. No entanto, para usar o ddrescue na restauração, basta alterar a origem / destino usado para o resgate para a nova origem / destino, de preferência com um novo arquivo de log. Se possível (geralmente não), é possível usar o ddrescue para copiar dados diretamente do disco de origem defeituoso para um disco de substituição.
ZaTricky 15/0518

3

Houve um patch oferecido em 2007 para fornecer suporte a arquivos esparsos no GNU dd, mas parece que ele não foi convertido em coreutils (pelo menos não no 8.4). Duvido que o dd tenha mudado muito desde então, o patch pode se aplicar à versão atual sem muito trabalho.

Também estou realmente impressionado com o uso criativo de cpsua pergunta, e isso me colocou no caminho de usá-lo para realizar a retomada (retomando aqui de ~ 80M na fonte):

cp --sparse=always \
  <(dd if=/dev/sda1 bs=8M skip=10) /dev/stdout \
  | dd bs=8M seek=10 of=/mount/external/backup/sda1.raw

Edit: arranhar isso. O segundo dd, é claro, estaria procurando a posição errada no arquivo de saída, já que não tem o mesmo comprimento que a entrada.


11
Como é o caso da resposta de bhinesley, seria melhor registrar o progresso do dd para uma retomada precisa. Se você usasse essa abordagem para a primeira execução e os currículos e registrasse os dois dds paralelos de forma independente, você saberia até que ponto da saída procurar. Se eu tiver tempo, tentarei resolver isso.
Eli Heady

2
Obrigado pelo link para o patch. Eu estava começando a pensar em programar algo parecido sozinho :-) Arquivos esparsos não podem ser canalizados para que seu código não funcione.
Martin Scharrer

Sim, eu acabei de descobrir isso sozinho. Oh, bem, foi divertido encontrar novos usos loucos cp- obrigado!
Eli Heady

11
dd commit em 2012: git.savannah.gnu.org/cgit/coreutils.git/commit/… "dd: adicione suporte à opção conv = sparse" ("(iwrite): converta uma gravação de um bloco NUL em uma busca se solicitado. ")
osgx 19/05/19

1

Apenas adicionando meus 2 centavos. Outra maneira de criar um arquivo esparso a partir de um disco bruto é com o qemu-img usando algo como:

qemu-img convert -f raw /dev/sda /tmp/sda.raw

Você pode usar isso em uma única partição também. Além disso, você tem a opção de converter o disco / partição bruta para qualquer outro formato que o qemu-img suporte (QCOW2, VHD [x], vmdk, etc)


1

Outra opção é rsync . Por exemplo:

rsync -SP --copy-devices /dev/sda1 /mount/external/backup/sda1.raw

Explicação:

  • -S/ --sparsepara pular blocos esparsos na gravação
  • -P/ --partial --progresspara mostrar progresso e manter arquivos parcialmente transferidos
  • --copy-devices copiar o conteúdo do dispositivo

Você pode adicionar --appendpara continuar uma cópia interrompida (ou --append-verifypara confirmar a soma de verificação nas correspondências de dados novos e antigos).

Edit : Acabei de perceber que o copy-devices.diff está em consideração e pode não estar presente em muitos sistemas (embora esteja incluído no Fedora , Ubuntu , Debian e outros)


0

Nota: isso não funciona pelos motivos descritos nos comentários, estou deixando aqui para referência.

Monitore as estatísticas do dd usando kill -USR1:

$ cp --sparse=always <(dd if=/dev/urandom bs=8M) \
    /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Continue usando skip / seek:

$ i_bytes= # get from the last dd statistic
$ o_bytes=`du -b /mount/external/backup/sda1.raw | cut -f 1`   
$ cp --sparse=always <(dd if=/dev/urandom bs=8M skip=$i_bytes \
    seek=$o_bytes) /mount/external/backup/sda1.raw&
$ watch kill -USR1 `pidof -s /bin/dd`

Sem $ i_bytes, seria mais difícil retomar. Provavelmente, é mais fácil registrar as estatísticas do dd em um arquivo, caso a máquina travar ou algo assim.


O segundo cpsubstituirá apenas o arquivo existente, não é? Eu conheço as skipe outras opções de dd. A questão é a cpparte.
Martin Scharrer

Hm, sim, você está certo.
bhinesley


0

Por que não simplesmente:

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.