it-swarm-pt.tech

Usando DD para clonagem de disco

Há várias perguntas sobre ferramentas de clonagem de disco e dd foi sugerido pelo menos uma vez. Eu já considerei usar dd eu mesmo, principalmente devido à facilidade de uso, e que está prontamente disponível em praticamente todas as distribuições Linux inicializáveis.

Qual é a melhor maneira de usar dd para clonar um disco? Fiz uma rápida pesquisa no Google e o primeiro resultado foi uma aparente tentativa falhada . Existe algo que eu preciso fazer depois de usar dd, ou seja, existe algo que NÃO PODE ser lido usando dd?

187
falstro

o dd é certamente a melhor ferramenta de clonagem, ele criará uma réplica 100% simplesmente usando o seguinte comando. Eu nunca tive problemas com isso.

dd if=/dev/sda of=/dev/sdb bs=32M

Esteja ciente de que ao clonar todos os bytes, você não deve usá-lo em uma unidade ou partição que está sendo usada. Especialmente aplicativos como bancos de dados não conseguem lidar muito bem com isso e você pode acabar com dados corrompidos.

165
Adam Gibbins

Para economizar espaço, você pode compactar os dados produzidos pelo dd com o gzip, por exemplo:

dd if=/dev/hdb | gzip -c  > /image.img

Você pode restaurar seu disco com:

gunzip -c /image.img.gz | dd of=/dev/hdb

Para economizar ainda mais espaço, desfragmentar a unidade/partição que você deseja clonar anteriormente (se apropriado) e zerar todo o espaço restante não utilizado, facilitando a compactação do gzip:

mkdir /mnt/hdb
mount /dev/hdb /mnt/hdb
dd if=/dev/zero of=/mnt/hdb/zero

Espere um pouco, o dd eventualmente falhará com uma mensagem "disco cheio" e:

rm /mnt/hdb/zero
umount /mnt/hdb
dd if=/dev/hdb | gzip -c  > /image.img

Além disso, você pode executar um processo dd em segundo plano para relatar o status enviando um sinal com o comando kill, por exemplo:

dd if=/dev/hdb of=/image.img &
kill -SIGUSR1 1234

Verifique seu sistema - o comando acima é para Linux, OSX e BSD. Os comandos dd diferem nos sinais que eles aceitam (o OSX usa SIGINFO - você pode pressionar Ctrl+T para relatar o status).

119
David Hicks

[~ # ~] cuidado [~ # ~] : a dd em um sistema de arquivos ao vivo pode corromper os arquivos. O motivo é simples: ele não entende a atividade do sistema de arquivos que pode estar acontecendo e não faz nenhuma tentativa de mitigá-la. Se uma gravação estiver parcialmente em andamento, você receberá uma gravação parcial. Isso geralmente não é bom para as coisas e geralmente fatal para os bancos de dados. Além disso, se você errar os erros de digitação if e dos parâmetros ai de você. Na maioria dos casos, rsync é uma ferramenta igualmente eficaz escrita após o advento de multitarefa , e fornecerá visualizações consistentes de arquivos individuais .

No entanto, o DD deve capturar com precisão o estado do bit de uma unidade desmontada. Carregadores de inicialização, volumes llvm, UUIDs de partição e etiquetas etc. Apenas verifique se você possui uma unidade capaz de espelhar a unidade de destino pouco a pouco.

39
jldugger

Ao usar o dd para clonar um disco que pode conter setores defeituosos, use "conv = noerror, sync" para garantir que ele não pare quando encontrar um erro e preencha os setores ausentes com bytes nulos. Geralmente, é a primeira etapa que eu tomo se tentar recuperar de um disco com falha ou com falha - obtenha uma cópia antes de fazer qualquer tentativa de recuperação e faça a recuperação no disco bom (clonado). Deixo para a ferramenta de recuperação lidar com os setores em branco que não puderam ser copiados.

Além disso, você pode achar que a velocidade do dd pode ser afetada pela configuração bs (tamanho do bloco). Normalmente, eu tento bs = 32768, mas você pode testá-lo em seus próprios sistemas para ver o que funciona melhor para você. (Isso pressupõe que você não precisa usar um tamanho de bloco específico por outro motivo, por exemplo, se estiver gravando em uma fita.)

26
TimB

Para clonar um disco, tudo o que você realmente precisa fazer é especificar a entrada e a saída para o dd:

dd if=/dev/hdb of=/image.img

Obviamente, verifique se você tem permissões adequadas para ler diretamente em/dev/hdb (eu recomendo executar como root) e se/dev/hdb não está montado (você não deseja copiar enquanto o disco estiver sendo alterado - a montagem como somente leitura também é aceitável). Uma vez concluído, o image.img será um clone de byte por byte de todo o disco.

Existem algumas desvantagens em usar o dd para clonar discos. Primeiro, o dd copiará todo o seu disco, até mesmo o espaço vazio, e se for feito em um disco grande, poderá resultar em um arquivo de imagem extremamente grande. Segundo, o dd não fornece absolutamente nenhuma indicação de progresso, o que pode ser frustrante porque a cópia demora muito tempo. Terceiro, se você copiar esta imagem para outras unidades (novamente, usando o dd), elas deverão ser tão grandes ou maiores que o disco original, mas você não poderá usar nenhum espaço adicional que possa ter no disco de destino até que você redimensione suas partições.

Você também pode fazer uma cópia direta de disco para disco:

dd if=/dev/hdb of=/dev/hdc

mas você ainda está sujeito às limitações acima em relação ao espaço livre.

No que diz respeito a problemas ou problemas, dd, na maioria das vezes, faz um excelente trabalho. No entanto, há um tempo atrás, eu tinha um disco rígido que estava prestes a morrer, então usei o dd para tentar copiar quais informações eu poderia obter antes que ele morresse completamente. Foi então aprendido que o dd não lida muito bem com erros de leitura - havia vários setores no disco que o dd não conseguia ler, fazendo com que o dd desistisse e parasse a cópia. Na época, eu não conseguia encontrar uma maneira de dizer ao dd para continuar, apesar de encontrar um erro de leitura (embora ele aparece como se tivesse essa configuração), então eu passei bastante tempo especificando manualmente pule e procure pular as seções ilegíveis.

Passei algum tempo pesquisando soluções para esse problema (depois de concluir a tarefa) e encontrei um programa chamado ddrescue , que, segundo o site, funciona como dd, mas continua lendo mesmo que encontre um problema. erro. Na verdade, nunca usei o programa, mas vale a pena considerar, especialmente se o disco do qual você está copiando for antigo, o que pode ter setores defeituosos, mesmo que o sistema pareça bom.

17
Kyle Cronin

Se a unidade de origem estiver danificada, você terá mais sorte usando dd_rhelp com dd_rescue (minha preferência pessoal) ou GNU ddrescue ).

A razão por trás disso é que, com erros de leitura, dd continua tentando e tentando e tentando - potencialmente esperando por um longo tempo até que ocorra o tempo limite. dd_rescue faz coisas inteligentes, como ler até um erro, escolher um ponto mais adiante no disco e ler de volta para o último erro, e dd_rhelp é basicamente um dd_rescue gerenciador de sessões - iniciando e retomando de forma inteligente dd_rescue corre para torná-lo mais rápido novamente.

O resultado final de dd_rhelp é o máximo de dados recuperados em um tempo mínimo. Se você sair dd_rhelp executando, no final, ele executa exatamente o mesmo trabalho que dd ao mesmo tempo. No entanto, se dd encontrar erros de leitura no byte 100 do seu disco de 100 Gb, você terá que esperar muito tempo para recuperar os outros 9.999.900 bytes *, enquanto dd_rhelp + dd_rescue recuperaria a maior parte dos dados muito mais rapidamente.

11
Ben Williams

O disco de origem não deve ter nenhum sistema de arquivos montado. Como um usuário capaz de ler o dispositivo de bloco (raiz funciona), execute 'dd if =/dev/sda ....'

Agora, uma das coisas legais aqui é que você está criando um fluxo de bytes ... e pode fazer muito com isso: compactá-lo, enviá-lo pela rede, dividi-lo em blobs menores etc.

Por exemplo:

dd if=/dev/sda | ssh [email protected] "cat > backup.img"

Mas mais poderosamente:

dd if=/dev/sda | pv -c | gzip | ssh [email protected] "split -b 2048m -d - backup-`hostname -s`.img.gz"

O exemplo acima copia uma imagem compactada do disco rígido de origem para um sistema remoto, onde a armazena em pedaços 2G numerados usando o nome do host de origem, mantendo você atualizado sobre o andamento.

Observe que, dependendo do tamanho do disco, velocidade da CPU na origem, velocidade da CPU no destino, velocidade da rede, etc. Você pode pular a compactação ou fazer a compactação no lado remoto ou ativar a compactação do ssh.

7
retracile

Para clonar um disco, tudo o que você realmente precisa fazer é especificar a entrada e a saída para dd:

dd if=/dev/hdb of=hdb.img

Obviamente, verifique se você tem permissões adequadas para ler diretamente de /dev/hdb (Eu recomendaria executar como root), e que /dev/hdb não está montado (você não deseja copiar enquanto o disco estiver sendo alterado). Depois de concluído, hdb.img será um clone de byte por byte de todo o disco.

Existem algumas desvantagens em usar dd para clonar discos. Primeiro, dd copiará todo o seu disco, mesmo espaço vazio, e se for feito em um disco grande, poderá resultar em um arquivo de imagem extremamente grande. Segundo, dd não fornece absolutamente nenhuma indicação de progresso, o que pode ser frustrante porque a cópia demora muito tempo. Terceiro, se você copiar esta imagem para outras unidades (novamente, usando o dd), elas deverão ser tão grandes ou maiores que o disco original, mas você não poderá usar nenhum espaço adicional que possa ter no disco de destino até que você redimensione suas partições.

Você também pode fazer uma cópia direta de disco para disco:

dd if=/dev/hdb of=/dev/hdc

mas você ainda está sujeito às limitações acima em relação ao espaço livre.

A primeira desvantagem pode ser resolvida ao compactar os dados à medida que você faz a cópia. Por exemplo:

dd if=/dev/hdb | gzip -9 > hdb.img.gz

A segunda desvantagem pode ser resolvida usando a ferramenta pipeview (pv). Por exemplo:

dd if=/dev/hdb | (pv -s `fdisk -l /dev/hdb | grep -o '[0-9]*\{1\} MB' | awk '{print $1}'`m) | cat > hdb.img

Não conheço nenhuma maneira de superar a terceira desvantagem.

Além disso, você pode acelerar o tempo de cópia dizendo a dd para trabalhar com grandes quantidades de dados. Por exemplo:

dd if=/dev/hdb of=hdb.img bs=1024
6
James Sumners

Outra coisa legal que você pode fazer com os discos dd e de resgate é copiar dados pela rede:

remote_machine$ nc -l -p 12345

local_machine$ dd if=/dev/sda | nc remote_machine 12345

Você pode colar o gzip nesses dois pipelines se a rede não for local. Para o progresso, use pv. Para fazer com que o netcat do local_machine feche após a cópia, adicione -w 5 ou alguma coisa.

5
user5692

Lembre-se de que o dd cria um cópia exata, incluindo todo o espaço em branco.

Que significa:

  1. A segunda unidade deve ter pelo menos o tamanho da primeira
  2. Se a segunda unidade for maior, será desperdiçado espaço extra (o sistema de arquivos pode ser expandido)
  3. Se a unidade de origem não estiver cheia, o dd perderá muito tempo copiando o espaço em branco.
  4. Você pode copiar a unidade inteira ou uma única partição dessa maneira.
  5. Se for uma unidade inicializável, tenho certeza que você precisará instalar o gerenciador de inicialização após usar o dd

Espero que seja útil

4
Brent
dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror

Isso copiará o disco e ignorará os blocos com erros, o que é muito importante.

Essas são as opções básicas e essenciais para usar o dd para clonar ou resgatar um disco.

Eu não queria postar outra resposta, mas não havia boas respostas com as opções essenciais "conv = sync, noerror" entre as 25 já postadas.

4
Sam Watkins

Você poderia tentar algo assim

 dd se =/dev/sda2 de =/dev/sdb2 bs = 4096 conv = sincronização, noerror 

pular todos os erros e ter o clone exato de uma partição ou disco rígido

3
hirol

Outro grande recurso é copiar MBRs, tabelas de partição e registros de inicialização.

Somente

dd if=/dev/sda of=parttable bs=512 count=1

e a outra direção quando você está escrevendo. Polonês com fdisk depois.

Você se sente muito mais seguro ao fazer backup da sua tabela de partições.

Além disso, torna a migração para outro disco rígido (enquanto altera a estrutura da partição) uma alegria.

3
alamar

Para referência futura, pode ser interessante verificar ddrescue . Ele salvou meu dia algumas vezes.

3
Anders Hansson

Esse é um tipo de hack barato, mas é uma maneira rápida e suja de monitorar seu processo de DD.

Execute seu comando dd. Abra um novo Shell e faça um ps awx para encontrar o PID do seu processo de dd. Agora, no novo tipo de shell, assista -n 10 kill -USR1 {pid do seu processo DD}

Isso não fará nada na janela de saída do relógio, mas, de volta ao DD Shell original, o DD começará a emitir relatórios de status a cada 10 segundos. Você pode alterar o -n 10 no comando watch para qualquer outro período de tempo, é claro.

Tachyon

3
Tachyon

A maioria das informações foi descrita em remessas inseridas anteriores, mas nem todas foram descritas.

No linux, você pode clonar o disco rígido ou particionar pelo comando dd. Atenção, quando você cometer um erro, perderá todos os seus dados.

Inicialmente, o destino não deve estar em uso, a fonte secundária não deve ser usada ou remontada no modo somente leitura. Caso contrário, a cópia será danificada. Se a remontagem for impossível, faça da unidade inicializável (hdd/ssd/pendrive) qualquer distribuição Linux ao vivo. Eu prefiro o knoppix, mas essa é a sua escolha. Se for possível, você pode inicializar ou alterar o nível do sistema em 1, para o modo de usuário único, ou pode reiniciar o sistema diretamente no modo de usuário único, depende da distribuição. Se você clonar apenas uma partição, essa partição deve ser desmontada ou remontada no RO:

umount /mountpoint_or_device

ou

remount -o,ro /mountpoint_or_device

Se você deseja clonar todo o disco rígido, desmonte ou remonte todas as partições.

Você deve identificar o dispositivo de origem e destino. observe o dmesg, aqui estão armazenadas todas as informações necessárias sobre o dispositivo, com o fornecedor etc. a identificação alternativa pode ser baseada no tamanho do dispositivo, se for diferente. Em seguida, o destino deve ser o mesmo ou maior que a origem. você deve calcular a origem, por exemplo: fdisk -l/dev/sda, exceto a geometria da partição (pode haver GPT), irá buscar: 1. tamanho total do disco com GB e bytes 2. geometria histórica e número total do setor, informações muito importantes 3. tamanho do bloco em bytes, geralmente é 512.

por exemplo:

# fdisk -l /dev/sda

Disk /dev/sda: 21.5 GB, 21474836480 bytes
255 heads, 63 sectors/track, 2610 cylinders, total 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000f1d1e

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    40136703    20067328   83  Linux
/dev/sda2        40138750    41940991      901121    5  Extended
/dev/sda5        40138752    41940991      901120   82  Linux swap /     Solaris

em seguida, vamos tentar com mais de 512 divisores, temos 41943040 setores físicos:

41943040/256 = 163840, muito bom, podemos fazer cópias em massa de 256 setores. podemos mais? vamos tentar: 41943040/1024 = 40960, acho que isso é suficiente, vamos selecionar este. Vamos contar o tamanho do grupo de setores: 512 (tamanho do setor) * 1024 = 524288 bytes eq 512K. Então, podemos usar o parâmetro bs = 512K ou menos, mas divida-o por 2 ^ x. Para discos rígidos modernos com grande cache interno, isso é bastante prático. para unidades antigas com cache muito menor, um valor de 32K ou menos é suficiente.

Depois da preparação, podemos fazer uma cópia: dd se =/dev/source_devide de =/dev/destination_device bs = 32K e a cópia será feita. Preste atenção, qualquer erro substituirá seus dados de importação e importação. No destino, todos serão substituídos.

Se você tentar recuperar dados no disco de origem danificado, use melhor o tamanho do setor nativo, geralmente este é 512 bytes e adicione a opção conv = notrunc. caso contrário, os buracos na fonte descartados por setores defeituosos serão unidos pela mudança de setor no destino. Isso danificará a cópia com poucas chances de reparo. então o comando será:

dd if=/dev/source of=/dev/destination bs=512 conv=notrunc  

, e aguarde muito tempo quando a unidade e o sistema desistem e andam setor por setor até o fim.

o dd é uma ferramenta útil para mover a partição para um novo local. Simplesmente crie uma partição, faça dd para uma nova partição (isso pode ser maior, muito maior) e, se possível, expanda o sistema de arquivos copiados para preencher todas as novas partições, ext3/ext4/xfs/zfs/btrfs têm esse recurso. Finalmente, você deve alterar/etc/fstab e, em seguida, desmontar/montar, se possível, ou reiniciar o sistema.

Claro que você pode clonar qualquer tipo de partição. O comando dd não analisa o tipo de sistema de arquivos, não faz nada com sua estrutura. esse comando pode ser usado para clonar NTFS ou outros tipos de partição.

Existe algum truque. Quando você não definiu o parâmetro, o dd colocará a saída em seu stdout. você pode fazer uma cópia bruta compactada do disco ou partição, por exemplo:

dd if=/dev/sda bs=512 | gzip >/any/place/computerOne_sda.gz

Claro que isso deve ser feito offline. você pode restaurar isso:

zcat /any/place/computerOne_sda.gz| dd of=/dev/sda bs=512   

, todo o disco rígido sda será substituído por esse backup e todos os dados atuais serão perdidos. Você pode fazer isso também com a partição NTFS do Windows e o disco rígido usado por isso. Claro que você pode usar outro comando de compactação, dependendo de sua escolha.

2
Znik

Como copiar usando o dd (neste caso, para uma máquina remota, mas o mesmo princípio se aplica a uma cópia local) que mostra o progresso.

Ele funciona armazenando o pid através do descritor de arquivo 3 em/tmp/pid, que é então usado para as mortes subsequentes com o sinal USR1. Uma ruga era filtrar a saída do progresso no stderr para apenas uma linha através da filtragem do stderr através de um subshell.

(dd bs=1M if=$lv-snapshot & echo $! >&3 ) 3>/tmp/pid  2> >(grep 'copied' 1>&2) | gzip --fast | ssh $DEST "gzip -d | dd bs=1M of=$lv" &
# Need this sleep to give the above time to run
sleep 1
PID=$(</tmp/pid)

while kill -0 $PID; do
  kill -USR1 $PID
  sleep 5
done
2
Edward Groenendaal

o dd fornece informações de progresso - bem, a maioria das versões no linux. Já vi alguns que não lembram, mas não se lembram, do sabor unix.

A página de manual diz: O envio de um sinal USR1 para um processo 'dd' em execução faz com que imprima as estatísticas de E/S para erro padrão e depois retome a cópia.

Eu uso esse recurso regularmente.

2
Steven

Alguém tinha que dizer o seguinte: experimente o Clonezilla (http: // clonezilla.org/)

O que você ganha? Copiar apenas partes usadas do sistema de arquivos. O Clonezilla usa dd, grub, sfdisk, parted, partimage, ntfsclone e/ou partclone. Dependendo das opções que você escolher.

Documentação decente pode ser encontrada em: http: // clonezilla.org/clonezilla-live/doc/

2
Roflo

Você pode criar um arquivo de imagem compactada da partição (ou disco) rapidamente usando bzip2 ou gzip em vez de dd. Isso é bom para armazenar imagens em mídia removível:

bzip2 -c /dev/sdaX >imagefile.bz2
or
gzip -c /dev/sdaX >imagefile.gz

Se o disco já tiver sido muito usado antes, você poderá aprimorar a compactação preenchendo todo o espaço não utilizado com zeros antes da imagem:

mkdir /mnt/mymountpoint
mount /dev/sdaX /mnt/mymountpoint
cat /dev/zero >/mnt/mymountpoint/dummyfile.bin
(Wait for it to end with a "disk full" error)
rm /mnt/mymountpoint/dummyfile.bin
umount /mnt/mymountpoint

Para restaurar a imagem em outro disco, tudo o que você precisa fazer é:

bzcat imagefile.bz2 >/dev/sdbY
or
zcat imagefile.gz >/dev/sdbY
1
JCCyC

Uma coisa que você deve estar ciente ao fazer dd de um disco completo é que isso substituirá o registro mestre de inicialização do disco receptor. Contém a tabela de partições e outras informações vitais. Se o novo disco não for o mesmo que o disco antigo, isso poderá criar todos os tipos de tabelas. Copiar sobre partições é geralmente mais seguro (e as partições de troca não precisam ser copiadas)

0
Paul de Vrieze

Estou fora da função de administrador há muitos anos, mas sei que 'dd' está pronto para o trabalho. Eu usei essa técnica regularmente no final dos anos 80 nos computadores Sun Sparc e 386i. Eu tinha um cliente solicitando mais de 30 sistemas 386i executando o software CAD que foi distribuído em várias fitas QIC.

Instalamos no primeiro computador, configuramos o aplicativo, executamos o sys-unconfig do SunOS, colocamos a unidade em uma caixa de sapatos com um endereço SCSI diferente e, em seguida, passamos a 'dd' para as outras 30 unidades.

0
pbrooks100

Apenas um aviso para iniciantes que precisa ser dito: Pelo menos em algumas versões, bs = X significa que a memória para o tamanho de X será literalmente alocada. bs = 2 GB em um sistema com 1 GB de RAM e troca insuficiente fará com que coisas ruins aconteçam.

0
rackandboneman

Por alguma razão, o dd falha ao criar imagens de CDs com faixas de áudio. Você precisa usar o cdrdao ou algo semelhante para obter uma imagem + arquivo TOC.

0
Matt

Para volumes NTFS, prefiro usar ntfsclone . Faz parte do pacote ntfsprogs .

0
Ed Brannin

Como outros mencionaram acima, um dos truques ao clonar um sistema de arquivos montado é a potencial corrupção de dados. Obviamente, isso não se aplica a clones de unidade completa, mas se você estiver usando LVM, poderá capturar instantaneamente o LogicalVolume e dd a partir do instantâneo para obter uma imagem consistente.

0
Ophidian