Usando DD para clonagem de disco

182

Houve várias perguntas sobre as ferramentas de clonagem de disco e ddforam sugeridas pelo menos uma vez. Eu já considerei ddme usar , 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 ddpara clonar um disco? Eu fiz uma pesquisa rápida no Google, e o primeiro resultado foi uma aparente tentativa fracassada . Existe algo que eu precise fazer depois de usar dd, ou seja, há algo que NÃO PODE ser lido usando dd?

falstro
fonte
Estou ciente de como o dd funciona, minha pergunta foi mais direcionada a problemas conhecidos relacionados ao dd ao clonar discos (conforme descrito no link), talvez isso não esteja muito claro. O que a resposta dele contém e a sua não é "nunca tive problemas com ela". Também votei na sua resposta, pois você definitivamente apresentou alguns pontos interessantes (eu gosto do que não indica indicação de progresso).
Falstro 6/05/09
1
Parece que você tem a Spolsky Bump: joelonsoftware.com/items/2009/05/29.html
Kyle Cronin
não vi isso aqui quando eu perguntei (e respondeu) uma pergunta semelhante sobre superusuário - superuser.com/questions/11453/...
Warren
3
É irônico que Joel tenha se vinculado à pergunta como um bom exemplo de falha no servidor, embora nenhuma das respostas tenha sido boa. Não havia uma resposta entre 25 (excluindo comentários) com as ddopções corretas para ignorar blocos defeituosos - o que é essencial ao clonar discos para recuperação. Eu adicionei uma resposta melhor, o que pode clonar discos tendo blocos ruins:dd if=/dev/sda of=/dev/sdb bs=4096 conv=sync,noerror
Sam Watkins
Eu acho que o dd restore pode "falhar" se falar sobre sistemas de arquivos dependentes da geometria da unidade e a restauração for feita em discos rígidos não idênticos? Eu experimentei algumas falhas no dd restore e acho que esse foi o problema no meu caso.
Marco

Respostas:

160

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.

Adam Gibbins
fonte
12
Claro, desde que / dev / sdb é pelo menos tão grande como / dev / sda ...
Eddie
22
adicione um "bs = 100M conv = notrunc" e é muito mais rápido na minha experiência.
6249 Tim Williscroft
127
apenas ter muito cuidado com o 'eu' e as letras 'O' ...
bandi
17
Ninguém parece conhecer esse truque ... dd é um programa de cópia assimétrico, o que significa que ele lerá primeiro, depois escreverá e depois voltará. Você pode canalizar dd para si e forçá-lo a realizar a cópia de forma simétrica, como este: dd if=/dev/sda | dd of=/dev/sdb. Nos meus testes, executar o comando sem o pipe me proporcionou uma taxa de transferência de ~ 112kb / s. Com o tubo, eu tenho ~ 235kb / s. Nunca tive problemas com esse método. Boa sorte!
Mistiry 19/10/10
13
@ Misty, esse não é o significado da palavra simétrico.
Psusi 10/10/12
113

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+ Tpara relatar o status).

David Hicks
fonte
2
Isso também funciona com fs "modernos" como um BTRFS, NILFS, [o que você pode sonhar]?
Steve Schnepp
O DD funciona em dispositivos de bloco, um nível de abstração menor que o sistema de arquivos, portanto, sim. Na verdade, eu ainda não tentei. Hmm, o NILFS parece interessante, vou ter que dar uma olhada nisso.
David Hicks
4
+1 para o kill -SIGUSR1 %1comando OSX dd aceita SIGUSR1 ... super útil, obrigado!
Stuartc
1
+1 porque Kill -SIGUSR1 1234eu estava procurando por isso.
hot2use
2
Deveria ser dd if=/dev/hdb | gzip -c > /image.img.gz:?
Mike Causador
37

ATENÇÃO : a instalação de um sistema de arquivos ativo pode corromper 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ê estragar o erro de digitação se e dos parâmetros, ai de você. Na maioria dos casos, o rsync é uma ferramenta igualmente eficaz escrita após o advento da 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.

jldugger
fonte
7
Suspeito que essa syncnão seja a resposta para problemas de corrupção de arquivos. O que acontece se um daemon ou algo assim grava mais arquivos após sync, durante a ddoperação?
Excluído
5
É uma boa idéia para desmontar a unidade primeiro (ou remontar como somente leitura), mas nem sempre é possível
Alex Bolotov
1
Nesse caso, você usa o rsync e permite que o arquivo manipule a mágica para obter um arquivo consistente e permite que a semântica de Copiar na gravação manipule as gravações recebidas.
jldugger
4
Gostaria de acrescentar que a execução do dd em um sistema de arquivos montado NÃO CORROMPA os arquivos no sistema de arquivos montado, mas o que se quer dizer aqui é que a cópia do sistema de arquivos estará necessariamente em bom estado.
3molo
1
O uso rsyncgarantirá que os dados internos no sistema de arquivos de destino sejam consistentes. Isso não garantirá que os dados contidos nos arquivos sejam consistentes; para isso, será necessário bloquear os arquivos e qualquer programa que grave nos arquivos precisará respeitar esses bloqueios.
Martin Geisler
26

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, essa é 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 mais rápido 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.)

TimB
fonte
13
Se você tem um disco com setores defeituosos, realmente deve usar 'ddrescue' em vez de dd. É muito mais eficiente e tem uma chance muito melhor de recuperar mais dados. (Não obtê-lo confundido com dd_rescue, que não é tão bom)
davr
3
não deve usar um tamanho de bloco grande se tentar pular blocos defeituosos, ou pulará demais. 4096 é grande o suficiente.
Sam Watkins
17

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 de / dev / hdb (eu recomendaria 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, 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 as informações que eu poderia obter antes que ele morresse completamente. Foi então aprendido que o dd não lida muito bem com os 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. No momento, não consegui encontrar uma maneira de dizer ao dd para continuar, apesar de encontrar um erro de leitura (embora pareça ter essa configuração), por isso passei bastante tempo especificando manualmente pular e tentar pular o 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, de acordo com o site, funciona como dd, mas continua lendo mesmo que encontre um erro. Na verdade, nunca usei o programa, mas vale a pena considerar, especialmente se o disco do qual você está copiando for antigo, que pode ter setores defeituosos, mesmo que o sistema pareça bom.

Kyle Cronin
fonte
7
... o dd não fornece absolutamente nenhuma indicação de progresso ... - bem, isso não é verdade - existe uma maneira meio complicada de mostrar o progresso - você precisa descobrir o processo do dd ('ps -a | grep dd') e depois envie o sinal USR1 para esse processo - 'kill -USR1 <dd_pid_here>' (sem <>) que força o dd a mostrar informações de progresso.
Michal Bernhard
4
"vários setores no disco que o dd não conseguiu ler": acho que conv=sync,noerrorajudaria.
Gauthier
2
As conv=sync,noerroropções são essenciais, elas permitem que o dd pule blocos defeituosos e zere-os na imagem para que as coisas estejam alinhadas corretamente. Suportes para as poucas pessoas que comentaram algo sobre isso.
Sam Watkins
1
O GNU ddrescuefornece indicador de progresso sem opções especiais, e você pode parar a cópia e continuar de onde parou.
endolith 25/02
2
Uma maneira menos complicada de obter progresso com o dd é adicionar a opção #status=progress
James James
11

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

A razão por trás disso é que, com erros de leitura, ddcontinua tentando e tentando e tentando - potencialmente esperando por um longo período de tempo. dd_rescuefaz coisas inteligentes, como ler até um erro, depois escolher um ponto mais adiante no disco e ler de volta para o último erro, e dd_rhelpé basicamente um dd_rescuegerenciador de sessões - iniciando e retomando inteligentemente as dd_rescueexecuções para torná-lo mais rápido novamente.

O resultado final dd_rhelpé o máximo de dados recuperados em tempo mínimo. Se você sair em dd_rhelpexecução, no final, ele fará exatamente o mesmo trabalho que ddno mesmo horário. No entanto, se ddocorrerem erros de leitura no byte 100 do seu disco de 100 Gb, será necessário aguardar muito tempo para recuperar os outros 9.999.900 bytes *, enquanto o dd_rhelp+ dd_rescuerecuperaria a maior parte dos dados muito mais rapidamente.

Ben Williams
fonte
1
Alguns ajuda para escolher entre dd_rescue e ddrescue: askubuntu.com/a/211579/50450
Johann
7

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 user@backupserver "cat > backup.img"

Mas mais poderosamente:

dd if=/dev/sda | pv -c | gzip | ssh user@backupserver "split -b 2048m -d - backup-`hostname -s`.img.gz"

A cópia 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. Talvez você queira pular a compactação ou fazer a compactação no lado remoto ou ativar a compactação do ssh.

retrátil
fonte
A tubulação +1 através do gzip pode economizar muito tempo e largura de banda!
M. Dudley
Devo também observar que adicionar 'bs = 1M' ao comando dd geralmente melhorará bastante a velocidade.
26812 retracile
6

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ê possui permissões adequadas para ler diretamente /dev/hdb(recomendo executar como root) e /dev/hdbse não está montado (você não deseja copiar enquanto o disco estiver sendo alterado). Depois de concluído, hdb.imgserá um clone de byte por byte de todo o disco.

Existem algumas desvantagens em usar ddpara clonar discos. Primeiro, ddcopiará todo o seu disco, mesmo o espaço vazio, e se for feito em um disco grande, poderá resultar em um arquivo de imagem extremamente grande. Segundo, não ddfornece 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 pvferramenta pipeview ( ). 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 ddpara trabalhar com grandes pedaços de dados. Por exemplo:

dd if=/dev/hdb of=hdb.img bs=1024
James Sumners
fonte
1
Você já disse como superar a terceira desvantagem ... redimensionar as partições. Ampliar uma partição geralmente é uma operação segura e rápida (em comparação com encolhimento ou movimentação, que é lenta e mais perigosa, pois move dados).
davr
O gzipping não funcionará com um disco usado por algum tempo, pois será preenchido com dados atuais ou excluídos. O gzip funcionará apenas se o espaço vazio for zerado, o que é apenas o caso de um disco novo.
Tozz
3
@ Tozz: Você pode melhorar a compressibilidade de uma imagem do sistema de arquivos preenchendo o sistema de arquivos com um arquivo preenchido com 0, sincronizando-o com o disco e excluindo-o. dd if=/dev/zero bs=1M of=/balloon; sync; rm /balloon (Inteligência Modulo extra na camada de sistema de ficheiros.)
retracile
5

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 progredir, use pv. Para fazer com que o netcat do local_machine feche após a cópia, você pode adicionar -w 5algo assim.

user5692
fonte
9
isto não está correto. O comando 'remote_machine' está faltando alguma coisa, como > disk_backup.imgou |dd of=/dev/sdbou outra coisa, dependendo do que você deseja fazer. Suponho que você não deseja despejar uma imagem de disco no stdout.
davr
1
E gzip nas duas extremidades para minimizar ainda mais os dados enviados.
3molo
4

Lembre-se de que o dd faz uma 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 de que você precisará instalar o gerenciador de inicialização após usar o dd

Espero que seja útil

Brent
fonte
8
Se você estiver clonando todo o disco rígido, também estará clonando o carregador de inicialização.
Cristian Ciupitu
bem, apenas um pensamento, mas você não poderia usar o gparted para ressuscitar a partição / disco que está sendo copiado para o que for usado - e então solte o dd? Supondo que seja uma imagem única, ele deve atenuar esse problema.
Bbqchickenrobot 24/03/12
3

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

Anders Hansson
fonte
3

Outro recurso importante é 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 fdiskdepois.

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.

alamar
fonte
3

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 shell DD 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


fonte
OS X não tem watchdisponível e -USR1mata dd. Porém, o seguinte comando funciona: while [ true ]; do killall -INFO dd; sleep 30; done
Adam Franco
Eu não acho que isso seja muito prático para um iniciante, eles podem ser melhor atendidos com o pvcomando.
Robbie Mckennie
Descobri que você também pode enviar um SIGINFO usando CTRL-T no dd. É mais fácil do que o loop while e o CD OSX 10.6 que eu tenho não tem killall. Aprendi isso em en.wikipedia.org/wiki/Unix_signal#Sending_signals
Citizen Kepler
3
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.

Estas 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.

Sam Watkins
fonte
1
Na verdade, foi mencionado anteriormente, em uma resposta e pelo menos dois comentários.
Michael Hampton
1
@ Michael, a resposta que você vinculou não contém um comando de exemplo completo e tem outras falhas - não é uma boa ideia usar um tamanho de bloco grande conv=sync,noerror, pois pulará muitos dados para cada bloco defeituoso. Essas opções são essenciais para a "clonagem de recuperação" e não é bom ter que pesquisar nos comentários. A resposta mais popular é adequada se os discos não tiverem blocos defeituosos, por exemplo, para clonar um disco novo, mas não para recuperação.
Sam Watkins
@ Michael, o exemplo que dei é um comando que usei várias vezes para recuperação profissional de disco. Embora existam outras ferramentas que podem fazer um trabalho um pouco melhor, o exemplo que dei é melhor na clonagem de recuperação de disco do que qualquer outro ddexemplo aqui, além de ser adequado para clonar um disco sem erros. Portanto, considero minha resposta a melhor aqui sobre como "usar o DD para clonagem de disco". Não adicionei informações sobre o monitoramento do progresso, compactação etc., porque queria simplificá-lo e me concentrar em fornecer uma resposta curta que atenda ao básico.
Sam Watkins
3

Você poderia realmente 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

Sam Watkins
fonte
Deve ser conv = sync, noerror. A opção sync é necessária ou os blocos com erros serão removidos em vez de copiados como zeros.
23814 Sam Watkins #
2

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

A página de manual diz: Enviar 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 continue a cópia.

Eu uso esse recurso regularmente.

Steven
fonte
Embora útil, duvido que seja prático para um iniciante.
Robbie Mckennie
2

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/


fonte
Achei a documentação um pouco difícil, e a clonagem de uma unidade PATA Linux para uma unidade SATA não me deixou com algo que eu pudesse inicializar (ainda). Mas muito mais rápido do que o dd, e funcionou muito bem nas atualizações do meu laptop.
jbdavid
2

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
Edward Groenendaal
fonte
Não é realmente relevante para a questão, mas é um truque shell puro utilizando um sub-shell e descritores (maior do que stderr) arquivo de alta para transmitir dados fora dele, +1
falstro
Eu estava me referindo a esta página para obter diferentes opções de dd ao clonar discos, então parecia um local adequado no momento para colocar o resultado final do que eu usava para clonar, especialmente porque eu achava que era muito legal :)
Edward Groenendaal
2

A maioria das informações foi descrita em remessas inseridas anteriormente, 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 para 1, no modo de usuário único, ou você pode reiniciar o sistema diretamente no modo de usuário único, dependendo 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. veja 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 mais 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 of = / 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 resgatar 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.

Znik
fonte
1

Você pode criar um arquivo de imagem compactado da partição (ou disco) rapidamente usando bzip2ou em gzipvez 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
JCCyC
fonte
Promovido o truque para preencher o espaço restante com zeros. Esperto!
Confusão
Eu precisava disso! O cartão SD foi usado anteriormente para captura de vídeo e estava cheio de porcaria, a compactação não ajudou em nada.
Cody Smith #
0

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.

Matt
fonte
0

Uma observação sobre a velocidade: na minha experiência, dd é duas vezes mais rápido se você especificar bs = 1024 em vez do padrão bs = 512. O uso de um tamanho de bloco ainda maior não proporciona aceleração perceptível em bs = 1024.


fonte
4
os clusters de disco geralmente estão em torno de 4k agora, portanto, usar 4096 é provavelmente uma boa opção e até 8192 se você quiser ler 2 clusters de cada vez. Não vá muito grande, porém, como você tiver problemas memória fragmentada
user4767
0

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)

Paul de Vrieze
fonte
0

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 que solicitou mais de 30 sistemas 386i executando software CAD 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.

pbrooks100
fonte
0

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.

Ophidian
fonte
0

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.

rackandboneman
fonte