Clone seu HD, compactando e visualizando a cópia em tempo real com o comando dd

Publicado por rodtec em 20/04/2010

[ Hits: 20.510 ]

 


Clone seu HD, compactando e visualizando a cópia em tempo real com o comando dd



Hoje precisei clonar um HD de um servidor (Sun Sparc Ultra10, rodando Debian), então vasculhei o Google buscando encontrar a melhor forma de fazer isso a partir de um terminal ssh, pois a máquina física está em produção em um datacenter, e não pode parar.

Encontrei várias matérias sobre como clonar HDs com o dd, inclusive aqui no VOL tem uma ótima. Porém todas que encontrei não falavam como executar o dd, acompanhando a evolução do processo de clonagem. Algumas matérias sugeriam outras soluções além do dd, mas no meu caso era impraticável, pois o servidor não tem acesso à internet para poder baixar nada. Então tinha que ser com o dd mesmo.

Outro problema foi que o HD secundário que armazenaria o clone tem tamanho inferior ao HD master, e desta forma eu teria que clonar compactando os dados simultaneamente.

Então mesclei várias informações de artigos diferentes, resultando numa eficiente dica de:

1. clonagem de hd a quente (com o sistema rodando)
2. compactação da imagem clonada simultaneamente
3. visualização da evolução da clonagem

Descrevo a solução abaixo (parte do princípio que a máquina tenha 2 HDs instalados):

Cenário:
  • HD1 (hda) 120GB (só 20GB em uso)
  • HD2 (hdc) 80GB

1. Primeiro vamos montar o HD slave no sistema (todos os comandos executados como root).

Criar uma pasta "imagem" no hd master para receber o ponto de montagem do hdc slave:

# mkdir imagem

Montar o hdc slave no sistema, na pasta "imagem":

# mount -t ext3 /dev/hdc1 imagem

Checando se a partição montou de acordo como esperado:

# df -h
/dev/hdc1        74G  270M   70G   1% /root/imagem

Se aparecer uma informação parecida com a linha acima, mostra que o hdc está montado no caminho /root/imagem, então está tudo bem, e nesse caso temos 70GB para uso. No meu caso, utilizei hdc1 pois é a partição ativa do meu HD slave. Se o seu for diferente, basta alterar o número. Vamos continuar como processo.

Comando para gerar a imagem-clone de hda para hdc compactando com o gzip:

# dd if=/dev/hda | gzip -9f | of=imagem/backup.iso bs=64k

No comando acima, dd if=/dev/hda significa a origem dos dados a serem clonados, no meu caso o hda. Entre dois pipes (|), o comando | gzip -9f| significa que ao mesmo tempo que o dd clona o hda ele compacta com o gzip no nível mais eficiente de compactação (que vai de 1 a 9), no caso o nível 9; o "f" significa forçar a compactação para evitar qualquer problema. O restante da linha de comando, of=imagem/backup.iso, significa a saída dos dados, o destino do clone.

No caso "imagem" é a pasta criada por mim para receber o arquivo-clone, e "backup.iso" é a imagem-clone propriamente dita, que ficará armazenada na pasta "imagem" que está montada com o hdc. O final do comando, bs=64k, é um comando extra para o dd, que fará a cópia-clone em blocos de 64k.

Com isso temos a linha de comando completa para fazer a imagem de hda para hdc.

Porém, o dd é um comando bem hard, e não tem um mostrador da evolução do clone. Dependendo da origem a ser clonada, pode demorar horas. Mas como vamos saber quando terminará?

Como eu já disse antes, esta foi uma das minha dificuldades. Então através de outro terminal ssh (ou se você estiver no console a máquina, pode abrir outro terminal com os comandos ALT+F2, ALTF3, ALTF4 etc, lembrando que você retorna para o terminal principal com ALT+F1).

Já no outro terminal ssh, digite os comandos abaixo.

Comando para descobrir o número do processo dd rodando:

# top
4839 root      25   0  2080  784  392 R 41.2  0.2  31:19.38 gzip

Na tabela mostrada pelo top, procure a coluna COMMAND (mais à direita) , a linha do dd executando. Identifique nesta linha o número do processo (PID - process ID), que fica mais à esquerda. No meu caso, o processo referente ao dd, como mostrado na linha acima, foi de PID 4839.

De posse deste número do PID, vamos executar o comando abaixo:

# watch kill -USR1 $44853; sleep 1;

Na linha de comando acima, o serviço "watch" mantém na tela ao vivo, em tempo real o que vem a seguir na linha de comando. O restante do comando, kill -USR1 é um recurso do comando dd que faz aparecer na tela a quantidade já executada da cópia-clone. E $44853 onde apenas 4853 é o número do PID descoberto como top. Altere este número para o do PID correspondente ao seu dd em execução. Ao final, sleep 1;, faz com que o processo de visualização ser finalizado. O watch faz o comando ser executado em loop, como se você tivesse várias vezes digitando ele no prompt.

Então você verá aparecer na tela a informação da clonagem a cada 2 segundos, conforme abaixo:

36090146+0 records in
336090145+0 records out
172078154240 bytes (172 GB) copied, 4686.54 seconds, 36.7 MB/s

336234848+0 records in
336234847+0 records out
172152241664 bytes (172 GB) copied, 4688.49 seconds, 36.7 MB/s

336395536+0 records in
336395536+0 records out
172234514432 bytes (172 GB) copied, 4690.53 seconds, 36.7 MB/s

336555610+0 records in
336555610+0 records out
172316472320 bytes (172 GB) copied, 4692.56 seconds, 36.7 MB/s

Pode observar que vai aumentando, linha após linha.

Espero que tenha ajudado.

Outras dicas deste autor
Nenhuma dica encontrada.
Leitura recomendada

Docker: Persistindo dados -BTSync

Montando pasta compartilhada do Windows em diretório do Linux

Instalando Samba4 no CentOS 7

Nautilus-Terminal no Gnome 3

Recuperando sistema de arquivos em modo read-only

  

Comentários
[1] Comentário enviado por denaum em 23/04/2010 - 16:42h

muito boa a dica, vlw

[2] Comentário enviado por rsteodoro em 26/04/2010 - 10:27h

Dez !

[3] Comentário enviado por cristianopolla em 24/06/2010 - 15:12h

Boa dica, estou nessa mesma situação, tenho um servidor em produção com HD maior e quero fazer imagem para um HD menor, agora te pergunto:

1) já restaurou essa imagem? funcionou perfeitamente?
2) como o servidor está produção (a quente), verificou se alguns arquivos foram corrompidos (quais)? Pois aqueles que constantemente variam (ex. logs) possivelmente apresentarão algum problema.

Parabéns, abração.

[4] Comentário enviado por rodtec em 24/06/2010 - 15:22h

Cristiano,
Aqui não tive problema nenhum, funcionou perfeitamente.
Na verdade como a cópia foi com o DD, eu não precisei restaurar. Testei o HD clonado em uma máquina com a mesma configuração de hardware e o sistema subiu normalmente, só não chequei a rede, para não conflitar coma máquina existente.
Abs

[5] Comentário enviado por cristianopolla em 28/06/2010 - 10:15h

Blz rodtec,
"Restaurar" foi justamente nesse sentido, colocar para rodar ;)
Mas corrigindo uma dúvida, você gravou em .iso, mesmo assim funcionou sem ter que fazer mais nada???
Farei o teste por aqui, qualquer coisa eu posto.
Abração

[6] Comentário enviado por jeffersonpgodoy em 21/12/2011 - 08:26h

Bom dia!

Estou seguindo sua dica e criando uma imagem da minha máquina para clonar as outras estações da minha rede.

Vc pode me informar como faço para restaurar a imagem no outro hd?

Não tenho muita experiência com lunix, mas tô fazendo o possível para aprender.

Obrigado pela atenção.

[7] Comentário enviado por alexandremc em 19/02/2014 - 16:17h

Oi amigo

Olha nunca consegui com essa dica.

Eu uso o pv.

apt-get install pv

Eu uso assim:

Não Compactado
dd if=ORIGEM |pv| dd of=DESTINO

Compactado
dd if=ORIGEM |pv|gzip -9f| dd of=DESTINO

Abraços

[8] Comentário enviado por iganem em 27/03/2014 - 18:25h

Comando para descobrir o número do processo dd rodando:

# top
4839 root 25 0 2080 784 392 R 41.2 0.2 31:19.38 gzip

Na tabela mostrada pelo top, procure a coluna COMMAND (mais à direita) , a linha do dd executando. Identifique nesta linha o número do processo (PID - process ID), que fica mais à esquerda. No meu caso, o processo referente ao dd, como mostrado na linha acima, foi de PID 4839.

De posse deste número do PID, vamos executar o comando abaixo:

# watch kill -USR1 $44853; sleep 1;

Na linha de comando acima, o serviço "watch" mantém na tela ao vivo, em tempo real o que vem a seguir na linha de comando. O restante do comando, kill -USR1 é um recurso do comando dd que faz aparecer na tela a quantidade já executada da cópia-clone. E $44853 onde apenas 4853 é o número do PID descoberto como top. Altere este número para o do PID correspondente ao seu dd em execução. Ao final, sleep 1;, faz com que o processo de visualização ser finalizado. O watch faz o comando ser executado em loop, como se você tivesse várias vezes digitando ele no prompt.

Muito bom cara, inclusive a opção bs=MB, salvou 50% de um tempo que eu não poderia perder! rs...
Obrigado!

[9] Comentário enviado por iganem em 28/03/2014 - 10:44h

e ainda
"
Da pra otimizar o uso do dd Linux
# dd if=/dev/hdorigem of=/dev/hddestino bs=100M conv=noerror

bs => tamanho do bloco a ser copiado - depende da RAM da maquina, quanto maior, mais rapido.
conv=noerror => ideal para discos problematicos (quando ha necessidade de copia para analise forense ou outros fins). Continua o processo mesmo encontrando erros.

[]'s

Jairo Willian"

[10] Comentário enviado por rodpas em 21/08/2014 - 12:32h

Boa tarde rodtec,

tudo bem, cara eu executei os passos fiz a imagem de um server meu aqui de 73Gb HD.

Porem eu usei essa imagem para restaurar em uma outra maquina mais nova aqui com 500Gb de HD e hardware diferente.

Foi restaurado perfeito sem problemas.

Inicia o GRUB normal....mas quando está subindo o sistema ele para leitura e apresenta a mensagem:


"BusyBox v1.1.3 (Debian 1:1.1.3-2ubuntu3) Built-in shell (ash)
Enter 'help' for a list of built-in commands.

/bin/sh: can't access tty; job control turned off
(initramfs)"

E para já tentei mudar editar o boot e nada!

Você teve exito em restaurar a imagem???

Alguma ideia da mensagem???


Abraço!


Obrigado!


[11] Comentário enviado por dessoy em 05/03/2015 - 17:49h

Parabéns. Artigo claro, conciso e esclarecedor. Obrigado!



Contribuir com comentário