br-linux

Artigos br-linux.org
Artigos sobre Linux em bom português, originais e com qualidade

Como copiar a imagem de um HD para outro usando o Linux
Publicado em 19 de agosto de 2004

Recentemente precisei fazer uma cópia de um HD para outro por suspeitas de que o primeiro estava com defeito. Encontrei um tutorial do Germano Barreiro (germanobarreiro[@]yahoo.com.br) que foi a salvação!
Depois de entrar em contato com ele e pedir permissão para publicá-lo aqui no br-linux.org estou disponibilizando este tutorial que mostra de modo fácil como criar imagem de um hd inteiro em outro hd ou em um arquivo para backup com o comando dd.

Confiram...

COMO COPIAR A IMAGEM DE UM HD PARA OUTRO USANDO LINUX


Por Germano Barreiro (germanobarreiro[@]yahoo.com.br)


Imagine que voce acabou de instalar um linux, configurou servicos, criou contas de usuarios, instalou e configurou uma ou outra aplicacao adicional baixada da internet. Agora, imagine que do seu lado tem outra maquina igualzinha e voce vai ter que fazer a mesma coisa nela, tudo de novo?

Provavelmente no minimo um suspiro de resignacao voce vai soltar antes de comecar. Agora imagine que voce nao tem so uma, mas cinquenta maquinas ali do lado esperando pelo mesmo tratamento... Dai voce nao vai mais estar suspirando, ira isso sim atras de alguma aplicacao capaz de gerar e copiar imagens de hds, como o Ghost(R) por exemplo. E talvez nem saiba voce que ja possui uma ferramenta que muito provavelmente podera resolver seu problema na linha de comando do linux mesmo. Essa solucao, ou melhor, comando, tem o simples e pequeno nome de dd (igual ao comando para apagar linhas no vi). Se voce visitar a man page do dd, recebera a explicacao de que ele copia e converte um arquivo, da entrada padrao para a saida padrao a nao ser que especificado em contrario. Mais um caso de man page que fala muito pouco em termos praticos, mas vamos esmiucar um pouco... Voce pode especificar outra entrada ou saida atraves das opcoes "if" e "of". Sendo que:

if = especifica o fluxo de entrada do comando
of = especifica o fluxo de saida do comando

Assim e que se voce executar o comando

# dd if=texto.txt of=texto2.txt

Tera algo equivalente a se tivesse executado

# cp texto.txt texto2.txt

O legal disso e que, se voce especificar um dispositivo de blocos como fluxo de entrada, fara uma leitura, bit a bit, desse dispositivo. Relembrando, um dispositivo de bloco pode ser um hd, uma particao de um hd, um cd, um disquete, ou afins... E se voce especificar como fluxo de saida um dispositivo de blocos, estara escrevendo nesse dispositivo os bytes que vierem pela entrada. Para dar um exemplo que vai deixar isso bem claro, vamos copiar um disquete usando o dd:

1. Insira o disquete original no drive, mas nao monte o seu sistema de arquivos
2. Execute o comando: dd if=/dev/fd0 of=disquete.img
3. Troque o disquete no drive por outro nao gravado
4. Execute o comando: dd if=disquete.img of=/dev/fd0

No passo 2, o dd leu o dispositivo de blocos /dev/fd0 (disquete) e jogou, byte a byte, tudo que conseguiu ler num arquivo chamado disquete.img. Esse arquivo sera uma imagem exata do sistema de arquivos contido no disquete, com tabelas de alocacao de arquivos e tudo mais. Quando executou o passo 4, voce jogou esse conteudo num outro disquete, bit a bit. O resultado sera que o segundo disquete sera uma copia perfeita do primeiro. E detalhe, se voce tivesse duas unidades de disquete (muito incomum nas maquinas de hoje, mas.....) poderia ter feito diretamente:

# dd if=/dev/fd0 of=/dev/fd1

Sendo /dev/fd0 a unidade que contem o disquete original. Se duvida que funcione, pode pegar um disquetinho e experimentar a vontade, eu espero :) Muito bem, agora imagine que ao inves de especificar dispositivos relativos a unidades de floppy disk, tivessemos especificado dispositivos como /dev/hda ou /dev/hdb, teria funcionado? SIM, pode ter certeza disso, e e aqui que voltamos ao problema de copiar a imagem deum hd. Retornando ao cenario inicial, voce tem uma maquina na qual acabou de instalar linux, e quer jogar a imagem daquela instalacao para outro hd igual ao da primeira maquina. Voce vai precisar colocar os dois hds em uma maquina de onde voce ja possa dar boot num linux que nao seja o do hd recem instalado, pois nenhum dos sistemas de arquivos no hd a ser lido pode estar montado. Entao o que voce pode fazer e instalar esses hds em /dev/hdc (ide2 master) e /dev/hdd (ide2 slave) numa maquina qualquer que ja tenha um hd com linux bootavel (ou entao use um desses live cd para dar boot) e execute:

# dd if=/dev/hdc of=/dev/hdd

E uma copia exata do hd no ide2 master sera feita no ide2 slave. Aqui cabe um aviso importante sobre linux em geral: se voce instalou o linux com o hd no primario master, e muda-lo para primario slave ou secundario master, o sistema nao vai dar boot. E ,obviamente, uma copia desses sistema tambem nao. Ou seja, quando for instalar esses hds numa maquina, certifique-se de que estao no mesmo ide e com a mesma configuracao (master ou slave) com que aquele linux foi instalado. Agora, a boa noticia e que a principio nao importa o SO que voce tem no hd original. O dd nao faz discriminacao :) Vai copiar bit a bit o que estiver no primeiro hd para o segundo. Legal ne?

Bom, isto aqui ja quebra um galho de quem tem que instalar varias maquinas em serie, e essas maquinas em geral costumam ser iguais entre si. Mas e se forem maquinas diferentes, com hds de capacidades diferente?


HDs DE DIFERENTES TAMANHOS

Primeiro entra uma regra simples e logica, se voce quer colocar um sistema de arquivos dentro de um dispositivo, este tem que ter espaco para tanto. Ou seja, sempre copie do hd menor para o hd maior, nunca o contrario. No mais, voce pode utilizar o procedimento que foi feito ate agora, que a unica consequencia e que sobrara espaco nao particionado ao final do hd de destino. O qual voce sempre pode, posteriormente, particionar e especificar um ponto de montagem para ele. Uma outra situacao e que voce pode desejar querer mover aquele linux para um outro hd com outro esquema de particionamento. Aqui entra de novo aquela caracteristica do linux: se voce especificou que o raiz vai ficar, por exemplo, em /dev/hda3 durante a instalacao no hd original, no novo hd este tambem vai ter que estar em /dev/hda3. Se especificou que o /boot tem que ficar em /dev/hda2, tambem tem que ficar em /dev/hda2 no novo hd. Mas a boa noticia e que nada impede essas particoes de estarem alguns blocos mais a frente ou mais para tras, o que nao pode e haver mais particoes antes das particoes a serem copiadas em relacao ao hd original. Isto posto, nada impede que voce faca algo como:

dd if=/dev/hdc2 of=/dev/hdd2 (admitindo que os hds estao no ide2 master e slave respectivamente)

E repetindo o comando para quantas particoes formarem seu sistema, nao esquecendo a de swap claro. De novo chamando a atencao, note que foi copiado hdd2 para hdd2, ou seja, segunda particao para segunda particao. Mas nao ha impedimento que no primeiro hd a primeira particao tenha 2G enquanto que no novo hd a primeira particao tenha 4G, fazendo com que a particao hdd2 fique bem adiante.

Note que, neste procedimento, voce nao copiou o boot loader para o segundo hd, ou seja, ele nao vai dar boot logo de cara. Voce vai ter que instala-lo manualmente. Se for o lilo, e se voce tiver o arquivo de configuracao do boot loader a ser instalado no novo hd no seu diretorio atual do linux que esta usando para executar a copia, voce pode fazer algo como:

# lilo -C arquivo_de_configuracao -b /dev/hdd

O arquivo de configuracao pode bem ser o /etc/lilo.conf copiado a partir do hd original, que voce montou num ponto qualquer antes de processar a copia, so para pegar esse arquivo, e logo depois desmontou. Nao e meu objetivo entrar em detalhes do comando mount aqui, a nao ser uma pequena dica mais a frente. Se voce nao tem familiaridade com esse comando, recomenda-se um pouco de estudo em cima dele e tambem sobre como o linux trata sistemas de arquivos antes de tentar algo deste material.

Uma ultima dica: eventualmente voce pode ter problemas por consequencia do lilo no linux em que voce executou a copia ser uma versao diferente daquele usado pelo linux que voce esta copiando. Pior, voce pode ter usado para boot um linux que so usa grub (ou seja, voce tentou o comando lilo e recebeu a classica mensagem de "command not found"). Nao se desespere, voce pode montar o hd original num ponto de montagem qualquer, tal como no comando:

# mount -t ext3 /dev/hdc1 /mnt/linuxorigem

Usar co comando chroot para mudar temporariamente a referencia da raiz do seu sistema de arquivos:

# chroot /mnt/linuxorigem

E agora que seu / esta temporariamente mudado para /mnt/linuxorigem, executar o comando:

# /sbin/lilo -b /dev/hdd

Depois e so dar exit para sair da "gaiola" onde se meteu :)
Possivelmente tambem poderia ter funcionado se tivesse feito algo como:

# /mnt/linuxorigem/sbin/lilo -C /mnt/linuxorigem/etc/lilo.conf -b /dev/hdd

Tudo depende de ate que ponto as bibliotecas do linux que usou para dar boot sao diferentes daquelas que o lilo do hd origem espera encontrar para sua execucao. Agora, se quer realmente se garantir contra sustos e nao ter que fazer essas acrobacias, use como boot um linux identico aquele instalado no hd origem, e o primeiro exemplo de uso do lilo nao te dara problemas. Note que esta preocupacao existe apenas para gerar copias bootaveis de hds onde voce copiou particoes em separado. Copiando hds inteiros, como no primeiro exemplo, faz com que passe a nao importar nem o SO ou SOs que estao ali. Voce tambem nao precisara se preocupar se a particao que copiou contem apenas dados, e nao um SO que precisa dar boot. Por fim, e obvio que se a maquina para a qual o hd recem escrito com o dd tiver componentes de hardware diferentes daquela onde o linux do hd original foi instalado, voce tera que reconfigurar video, som, rede, e tantos quantos forem os componentes de hardware que diferem.


FALANDO EM OUTROS SOs, NAO DA PROBLEMA MESMO?

Infelizmente eu nao tenho como ter testado com todos os SOs que existem pelo globo (e ainda bem que hoje temos tantas opcoes, nao? :) ). Mas vamos aos casos que ja testei:

HD so com linux: normal, ja vale tudo o que falei ate aqui sem por nem tirar nada.

HDs iguais, no original tem linux e windows: tambem sem problemas se feito como na primeira sessao deste texto.

HDS diferentes, no original tem linux e windows: atencao especial apenas para a particao windows. Apesar de que isto e uma materia sobre linux, nao me custa dar um conselho: execute o scandisk e o defrag antes de tentar a operacao. Se o windows e recem instalado, voce ate pode pular esses passos, mas eu tive uma experiencia recente com um windows98 ja em uso ha algum tempo, em que ele travava no hd para o qual foi copiado logo apos o boot. Executar aquelas duas aplicacoes antes de fazer a copia resolveu meu problema. A proposito, so testei isso ate hoje com windows da linha 98/Me usando fat. Nunca tentei com sistemas de arquivos ntfs para ver se funciona.


DA PARA GUARDAR A IMAGEM NUM ARQUIVO?

Lembra do exemplo da copia do disquete? Igual em tudo, mas voce vai ter que ter espaco para guardar o arquivo criado, que vai ter o mesmo tamanho que a particao/dispositivo que voce copiou. Isso mesmo que parte do sistema de arquivos sendo copiado esteja vazio. Ou seja, se voce esta copiando uma particao de 7G, mas ali dentro a soma dos arquivos guardados tem so 100K, ainda assim o arquivo que voce vai gerar vai ter 7G. O dd nao entende sistemas de arquivos, tudo que ele entende sao fluxos de bytes, assim ele le a particao inteira, ate onde nao tem gravado nada, e guarda. Isto posto, e so executar:

# dd if=/dev/hdb4 of=particao4.img

E sera criado o arquivo particao4.img, que contera uma imagem exata do sistema de arquivos naquela particao. Agora, o dispositivo conectado em /dev/hdb pode ate ser desconectado e, se mais tarde quiser restaurar aquela particao em outro hd, e so fazer:

# dd if=particao4.img of=/dev/hdb4

O mesmo vale para copias de hds inteiros. O problema de disponibilidade de espaco em disco pode ser diminuido com o auxilio do gzip:

# dd if=/dev/hdb | gzip > imagem_do_hd.img.gz

Esse comando gera a imagem do hd, mas que agora estara compactada pelo gzip. Obviamente para utiliza-la voce tera que descompacta-la:

# gzip -d -c imagem_do_hd.img.gz | dd of=/dev/hdb

A flag -c faz o gzip mandar os dados descompactados para a saida padrao ao inves de para um arquivo sem a extensao .gz, como faria normalmente. Nao esqueca que o dd, como dito no inicio do artigo, copia normalmente a partir da entrada padrao. Por isso aqui nao se especificou o parametro if= . O preco que se paga neste ultimo exemplo, claro, e um enorme acrescimo de tempo para a realizacao da compactacao e descompactacao. Uma outra aplicacao interessante a que isto nos leva, embora nao esteja relacionada a copia de hds, e gerar uma imagem iso a partir de um cd ja gravado, para depois ser usada na gravacao de um novo cd. Para fazer isso execute como no exemplo:

# dd if=/dev/cdrom of=slackware_cd1.iso

Depois, e so passar o arquivo gerado como argumento do cdrecord ou do seu programa de gravacao favorito. E uma ultima dica interessante: Sabia que e possivel montar esses arquivos que sao copias de sistemas de arquivos, como se fossem um dispositivo? Digamos que, no caso anterior, voce queira dar uma olhada nos arquivos que o cd continha, mas o cd criou pernas e sumiu e voce so ficou com o arquivo de imagem :) Nao e preciso gravar o cd para depois monta-lo, pode-ser perfeitamente montar o proprio arquivo de imagem como em:

# mount -t iso9660 slackware_cd1.iso /mnt/cdimg -o loop

O segredo esta justamente em passar o parametro -o loop no final do comando mount. Se nao funcionar, verifique se o seu kernel foi compilado com suporte a loopback device. Um jeito de checar isso e testar se e possivel carregar o modulo loop (embora esse tipo de suporte pode ter sido compilado embutido no kernel, mas se assim fosse voce nao teria problemas e nem teria que fazer esse teste). Por fim, para encerrar esse pequeno desvio (e praticamente o artigo), note que voce nao esta limitado a fazer isso so com imagens geradas a partir de cds. Pode ser feito com qualquer imagem desde que voce especifique o sistema de arquivos correto com -t. Obviamente, essas imagens sao montadas sempre como somente leitura. Nao da para modificar o conteudo de um arquivo de imagem usando essa tecnica. Para encerrar, note que as tecnicas apresentadas aqui resolvem situacoes simples, mas havendo a necessidade de algo mais "profissional", realmente e melhor procurar por um aplicativo dedicado a atender esse tipo de necessidade.


MAS DE ONDE VOCE TIROU ISSO?

Acontece que instalo linux desde antes dos CDs bootaveis, e nessa epoca o que os CDs traziam era uma imagem dos disquetes de boot, e um aplicativo para DOS chamado rawwrite (ou era rawrite?) que exatamente escrevia a imagem num disquete. Me perguntando na epoca como poderia proceder para gravar essas imagens em um disquete se meu SO ja fosse Linux, pesquisei a documentacao de texto dentro do CD e la estava a orientacao de como usar o dd para isso. A partir dai, foi so experimentar e expandir o conceito principal ;)

Autor: Germano Barreiro
Email: germanobarreiro[@]yahoo.com.br

Postado por fuji em agosto 19, 2004 10:01 AM

Comentários para "Como copiar a imagem de um HD para outro usando o Linux"

» Postado por: Daniel Fonseca ALves em agosto 20, 2004 09:02 AM, 200.150.42.:

    Bom tutorial Germano Barreiro.
    Complementando.
    Sim funciona em NTFS, fiz a cópia de uma HD com Windows 2000 Server para um outro HD e ficou perfeito.
    HDs com defeitos físicos podem atrapalhar a cópia, neste caso recomendo o dd_rescue que é um dd aprimorado e que server exatamente casos como este.

 

» Postado por: Jesse de Barros em agosto 24, 2004 11:29 AM, 200.158.104:

    Exelente artigo!, o melhor que já ví do Linux e veio a calhar estava precisando de algo assim, embora eu tenha o Ghost.

 

» Postado por: Jimi em agosto 27, 2004 10:56 AM, 201.2.210.1:

    Realmente, muito bom tutorial
    E ai experimentando mais um pouco mais um puco...

    Com duas placas de som
    /dev/dsp e /dev/dsp1 ou /dev/sound/dsp e /dev/sound/dsp1

    #dd if=/dev/dsp of=/dev/dsp1

    Fala ao MIC que esta ligado a "dsp" e ouve "dsp1"

    Alguma boa idéia para fazer com isso.
    Se alguém conseguir passar a saida via ARTs
    para usar o FreeReverb (No KDE), avise-me

    dd if=/dev/mouse /of=mouse
    Captura os dados do mouse e manda para um arquivo.
    Um dia pode-se precisar de uma idéia dessa.
    Será que é possivel passar os dados do mouse para o "dsp" só para ver que barulho faz? Não testei ainda.

 

» Postado por: M. Giovani em setembro 9, 2004 04:02 PM, 200.218.192:

    Parabeniso-o pelo artigo.

    Mas tentei fazer com um cd de PS1 e não deu certo (dd if=/dev/cdrom of=ps.iso). Foi criado um arquivo muito pequeno (de poucos bytes) e o comando parou retornando um erro de entrada e saida. Alguem pode me dar alguma dica?!!!!

    Grato.

 

» Postado por: Marcos em setembro 16, 2004 06:25 PM, 143.106.2.5:

    Não recomendo fazer a copia de uma partição via DD para um HD diferente do original (exceto se for o mesmo tamanho e modelo).
    O sistema funciona normal, mas tive vários problemas depois qdo fui tentar reparticionar: fdisk não funciona direito, PartitionMagic dava pau, etc.
    O problema é que o filesystem foi criado especificamente para um tamnho de partição. Qdo vc aumenta a partição sem mexer no filesystem, os programas se embananam... além disso, em geral, muda o tamanho da unidade de alocacao no disco (verifique com fdisk -l).
    Use a imagem do dd apenas como backup; se comprou HD maior, faça a cópia por tar.gz, pipe, cp xxx, etc.
    Nos outros casos, funciona perfeito.
    Nunca esquecer também do dd_rescue!

 

» Postado por: gbneves em setembro 17, 2004 01:43 PM, 201.8.13.22:

    Estou querendo trocar o meu hd que é de 20 gb por um de 40 mas não quero ter instalar o linux(red hat 7.2) novamente, pois trata-se de um servidor preciso de passo a passo alguém pode me ajudar?
    Obrigado.

 

» Postado por: André em outubro 2, 2004 11:20 AM, 200.148.38.:

    Alguem sabe se tem algo parecido para copiar HD c/ Novell?
    Obrigado

 

» Postado por: Ronaldo Queiroz em outubro 3, 2004 11:58 AM, 200.103.69.:

    Excelente artigo. Congratulações e, tomara que você continue motivado para nos presentear com mais materias Linux.

 

» Postado por: pai gow em outubro 8, 2004 05:26 AM, 210.210.72.:

 

» Postado por: Luiz Carlos em outubro 9, 2004 02:00 PM, 201.6.222.8:

    Gente.
    É por coisas como esta, que estou começando a usar Linux Kurumin, isto é, aprendendo Linux.
    Tem ferramenta de montão e boa. Sou sempre obrigado a usar Ghost ou outra coisa qualquer.
    Ótimo tutorial, gostei muito, especialmente por não fazer diferença entre SO, topa tudo
    Parabéns!

 

Antes de comentar...

- Preserve a qualidade desta discussão
- Leia os Termos de Uso.
- Este formulário deve ser usado para comentários sobre a notícia. Se você tem dúvidas ou precisa de ajuda, use o Fórum.
- Mantenha o foco nos argumentos e no assunto
- Não faça ataques pessoais.
- Pense 5 vezes antes de entrar em discussões inúteis, como "qual é a melhor distribuição/ambiente gráfico/linguagem de programação/etc.", mesmo se alguém já tiver provocado - um erro não justifica o outro
- Não seja um e-mala ;-)

Envie seu comentário









Lembrar as informações pessoais?


Atenção: Este formulário deve ser usado para comentários sobre a notícia. Se você tem dúvidas ou precisa de ajuda, use o Fórum, onde mais pessoas estarão disponíveis para respondê-lo..






Nota: os comentários pertencem a seus respectivos autores e são de responsabilidade de quem os postou. O restante desta nota está disponível sob a licença GNU FDL, exceto se explicitamente declarado em contrário.