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.

Martin Scharrer
fonte
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
Steven Pritchard
fonte
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 .

maxschlepzig
fonte
É 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.

Eli Heady
fonte
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)

Gabriel Samfira
fonte
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)

Kevinoid
fonte
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.

Bhinesley
fonte
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

Existem xfsdump e xfsrestore para XFS, que é um sistema de arquivos Linux nativo há bastante tempo.

Cristian Ciupitu
fonte
0

Por que não simplesmente:

cp --sparse=always /dev/sda1 /mount/external/backup/sda1.raw
Zaz
fonte