Autor Subscrever este autor
Avatar do usuário
josh
Aprendiz
Aprendiz
 
Artigos: 2
Registro: 20 Mar 2013, 23:08
Localização: São Paulo - Francisco Morato
Distro utilizada: Manjaro
Versão: 0.8.4
Ambiente: OpenBox
Pesquisar artigos

Exportar artigo
Compartilhar em
Blogger Delicioso Digg Facebook Feed amigo Google Linked In Live Mixx MySpace Netvibes Reddit Stumble Upon Technorati Twitter Wordpress
 

Como copiar a imagem de um HD para outro usando o Linux

ID do artigo: 85
Adaptado por: josh
Adaptado em: 27 Mar 2013, 20:19
Descrição do artigo: Recentemente precisei fazer uma copia de um HD para outro por suspeitas de que o primeiro estava com defeito.
Link externo para este artigo:
http://www.manjaro-linux.com.br/forum/kb.php?a=85

Imagem

Imagine que você acabou de instalar um Linux, configurou serviços, criou contas de usuários, instalou e configurou uma ou outra aplicação adicional baixada da internet. Agora, imagine que do seu lado tem outra maquina igualzinha e você vai ter que fazer a mesma coisa nela, tudo de novo?

Provavelmente no mínimo um suspiro de resignação você vai soltar antes de começar. Agora imagine que você não tem SO uma, mas cinquenta maquinas ali do lado esperando pelo mesmo tratamento... Dai você não vai mais estar suspirando, ira isso sim atrás de alguma aplicação capaz de gerar e copiar imagens de HDs, como o Ghost(R) por exemplo. E talvez nem saiba você que já possui uma ferramenta que muito provavelmente poderá resolver seu problema na linha de comando do Linux mesmo. Essa solução, ou melhor, comando, tem o simples e pequeno nome de dd (igual ao comando para apagar linhas no vi). Se você visitar a man page do dd, recebera a explicação de que ele copia e converte um arquivo, da entrada padrão para a saída padrão a não ser que especificado em contrario. Mais um caso de man page que fala muito pouco em termos práticos, mas vamos esmiuçar um pouco... Você pode especificar outra entrada ou saída através das opções "if" e "of". Sendo que:

if = especifica o fluxo de entrada do comando
of = especifica o fluxo de saída do comando

Assim e que se você executar o comando

Código: Selecionar todos
dd if=texto.txt of=texto2.txt


Terá algo equivalente a se tivesse executado

Código: Selecionar todos
cp texto.txt texto2.txt


O legal disso e que, se você especificar um dispositivo de blocos como fluxo de entrada, fará uma leitura, bit a bit, desse dispositivo. Relembrando, um dispositivo de bloco pode ser um HD, uma partição de um HD, um CD, um disquete, ou Pen Drives ou até mesmo um HD externo... E se você especificar como fluxo de saída um dispositivo de blocos, estará escrevendo nesse dispositivo os bytes que vierem pela entrada. Para dar um exemplo que vai deixar isso bem claro, vamos copiar um Pen Drive usando o dd:

1. Insira o Pen Drive na entrada USB, mas não monte o seu sistema de arquivos
2. Execute o comando: dd if=/dev/sdb1 of=imagem.img
3. Troque o Pen Drive por outro não gravado
4. Execute o comando: dd if=imagem.img of=/dev/sdb1

No passo 2, o dd leu o dispositivo de blocos /dev/sdb1 ((pen drive) e jogou, byte a byte, tudo que conseguiu ler num arquivo chamado imagem.img. Esse arquivo será uma imagem exata do sistema de arquivos contido no pen drive, com tabelas de alocação de arquivos e tudo mais. Quando executou o passo 4, você jogou esse conteúdo num outro pen drive, bit a bit. O resultado será que o segundo pen drive será uma copia perfeita do primeiro. E detalhe, se você tivesse duas unidades de pen drives (muito comum nas maquinas de hoje, mas.....) poderia ter feito diretamente:

Código: Selecionar todos
dd if=/dev/sdb1 of=/dev/sdb2


Sendo /dev/sdb1 a unidade que contem o pen drive original. Se duvida que funcione, pode pegar um Pen Drivezinho e experimentar a vontade, eu espero :) Muito bem, agora imagine que ao invés de especificar dispositivos relativos a unidades de USB, tivéssemos 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 de um HD. Retornando ao cenário inicial, você tem uma maquina na qual acabou de instalar Linux, e quer jogar a imagem daquela instalação para outro HD igual ao da primeira maquina. Você vai precisar colocar os dois HDs em uma maquina de onde você já possa dar boot num Linux que não seja o do HD recém instalado, pois nenhum dos sistemas de arquivos no HD a ser lido pode estar montado. Então o que você pode fazer e instalar esses hds em /dev/hdc (ide2 master) e /dev/hdd (ide2 slave) numa maquina qualquer que já tenha um HD com Linux bootável (ou então use um desses live CD para dar boot) e execute:

Código: Selecionar todos
dd if=/dev/hdc of=/dev/hdd


E uma copia exata do HD no ide2 master será feita no ide2 slave. Aqui cabe um aviso importante sobre Linux em geral: se você instalou o Linux com o HD no primário master, e muda-lo para primário slave ou secundário master, o sistema não vai dar boot. E ,obviamente, uma copia desses sistema também não. Ou seja, quando for instalar esses hds numa maquina, certifique-se de que estão no mesmo ide e com a mesma configuração (master ou slave) com que aquele Linux foi instalado. Agora, a boa noticia e que a principio não importa o SO que você tem no HD original. O dd não faz discriminação :) Vai copiar bit a bit o que estiver no primeiro HD para o segundo. Legal né?

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 lógica, se você quer colocar um sistema de arquivos dentro de um dispositivo, este tem que ter espaço para tanto. Ou seja, sempre copie do HD menor para o HD maior, nunca o contrario. No mais, você pode utilizar o procedimento que foi feito ate agora, que a única consequência e que sobrara espaço não particionado ao final do HD de destino. O qual você sempre pode, posteriormente, particionar e especificar um ponto de montagem para ele. Uma outra situação e que você pode desejar querer mover aquele Linux para um outro HD com outro esquema de particionamento. Aqui entra de novo aquela característica do Linux: se você especificou que o raiz vai ficar, por exemplo, em /dev/hda3 durante a instalação no HD original, no novo HD este também vai ter que estar em /dev/hda3. Se especificou que o /boot tem que ficar em /dev/hda2, também tem que ficar em /dev/hda2 no novo HD. Mas a boa noticia e que nada impede essas partições de estarem alguns blocos mais a frente ou mais para trás, o que não pode e haver mais partições antes das partições a serem copiadas em relação ao HD original. Isto posto, nada impede que você faca algo como:

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

E repetindo o comando para quantas partições formarem seu sistema, não esquecendo a de swap claro. De novo chamando a atenção, note que foi copiado hdd2 para hdd2, ou seja, segunda partição para segunda partição. Mas não há impedimento que no primeiro HD a primeira partição tenha 160GB enquanto que no novo HD a primeira partição tenha 500G, fazendo com que a partição hdd2 fique bem adiante.

Note que, neste procedimento, você não copiou o boot loader para o segundo HD, ou seja, ele não vai dar boot logo de cara. Você vai ter que instala-lo manualmente. Se for o lilo, e se você tiver o arquivo de configuração do boot loader a ser instalado no novo HD no seu diretório atual do Linux que esta usando para executar a copia, você pode fazer algo como:

lilo -C arquivo_de_configuração -b /dev/hdd

O arquivo de configuração pode bem ser o /etc/lilo.conf copiado a partir do HD original, que você montou num ponto qualquer antes de processar a copia, SO para pegar esse arquivo, e logo depois desmontou. Não e meu objetivo entrar em detalhes do comando Mountain aqui, a não ser uma pequena dica mais a frente. Se você não tem familiaridade com esse comando, recomenda-se um pouco de estudo em cima dele e também sobre como o Linux trata sistemas de arquivos antes de tentar algo deste material.

Uma ultima dica: eventualmente você pode ter problemas por consequência do lilo no Linux em que você executou a copia ser uma versão diferente daquele usado pelo Linux que você esta copiando. Pior, você pode ter usado para boot um Linux que SO usa grub (ou seja, você tentou o comando lilo e recebeu a clássica mensagem de "command not found"). Não se desespere, você pode montar o HD original num ponto de montagem qualquer, tal como no comando:

Código: Selecionar todos
mount -t ext4 /dev/hdc1 /mnt/linuxorigem


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

Código: Selecionar todos
chroot /mnt/linuxorigem


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

Código: Selecionar todos
/sbin/lilo -b /dev/hdd


Depois e SO dar exit para sair da "gaiola" onde se meteu :)
Possivelmente também poderia ter funcionado se tivesse feito algo como:

Código: Selecionar todos
/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 são diferentes daquelas que o lilo do HD origem espera encontrar para sua execução. Agora, se quer realmente se garantir contra sustos e não ter que fazer essas acrobacias, use como boot um Linux idêntico aquele instalado no HD origem, e o primeiro exemplo de uso do lilo não te dará problemas. Note que esta preocupação existe apenas para gerar copias bootáveis de hds onde você copiou partições em separado. Copiando hds inteiros, como no primeiro exemplo, faz com que passe a não importar nem o SO ou SOs que estão ali. Você também não precisara se preocupar se a partição que copiou contem apenas dados, e não um SO que precisa dar boot. Por fim, e óbvio que se a maquina para a qual o HD recém escrito com o dd tiver componentes de hardware diferentes daquela onde o Linux do HD original foi instalado, você terá que reconfigurar vídeo, som, rede, e tantos quantos forem os componentes de hardware que diferem.

Falando em outros SOs, não dá problema mesmo?

Infelizmente eu não tenho como ter testado com todos os SOs que existem pelo globo (e ainda bem que hoje temos tantas opções, não? :) ). Mas vamos aos casos que já testei:

HD SO com Linux: normal, já vale tudo o que falei ate aqui sem por nem tirar nada.

HDs iguais, no original tem Linux e Windows: também sem problemas se feito como na primeira sessão deste texto.

HDS diferentes, no original tem Linux e Windows: atenção especial apenas para a partição Windows. Apesar de que isto e uma matéria sobre Linux, não me custa dar um conselho: execute o scandisk e o defrag antes de tentar a operação. Se o Windows e recém instalado, você ate pode pular esses passos, mas eu tive uma experiência recente com um Windows 7 já em uso há algum tempo, em que ele travava no HD para o qual foi copiado logo após o boot. Executar aquelas duas aplicações antes de fazer a copia resolveu meu problema. A propósito, SO testei isso ate hoje com Windows da linha XP /vista /7 usando NTFS. Nunca tentei com sistemas de arquivos fat, fat32 para ver se funciona.

Da para guardar a imagem num arquivo?

Lembra do exemplo da copia do Pen Drive? Igual em tudo, mas você vai ter que ter espaço para guardar o arquivo criado, que vai ter o mesmo tamanho que a partição/dispositivo que você copiou. Isso mesmo que parte do sistema de arquivos sendo copiado esteja vazio. Ou seja, se você esta copiando uma partição de 160GB, mas ali dentro a soma dos arquivos guardados tem SO 100MB, ainda assim o arquivo que você vai gerar vai ter 160GB. O dd não entende sistemas de arquivos, tudo que ele entende são fluxos de bytes, assim ele lê a partição inteira, ate onde não tem gravado nada, e guarda. Isto posto, e SO executar:

Código: Selecionar todos
dd if=/dev/hdb4 of=particao4.img


E será criado o arquivo particao4.img, que conterá uma imagem exata do sistema de arquivos naquela partição. Agora, o dispositivo conectado em /dev/hdb pode ate ser desconectado e, se mais tarde quiser restaurar aquela partição em outro HD, e SO fazer:

Código: Selecionar todos
dd if=particao4.img of=/dev/hdb4


O mesmo vale para copias de hds inteiros. O problema de disponibilidade de espaço em disco pode ser diminuído com o auxilio do gzip:

Código: Selecionar todos
dd if=/dev/hdb | gzip > imagem_do_hd.img.gz


Esse comando gera a imagem do HD, mas que agora estará compactada pelo gzip. Obviamente para utiliza-la você terá que descompacta-la:

Código: Selecionar todos
gzip -d -c imagem_do_hd.img.gz | dd of=/dev/hdb


A flag -c faz o gzip mandar os dados descompactados para a saída padrão ao invés de para um arquivo sem a extensão .gz, como faria normalmente. Não esqueça que o dd, como dito no inicio do artigo, copia normalmente a partir da entrada padrão. Por isso aqui não se especificou o parâmetro if= . O preço que se paga neste ultimo exemplo, claro, e um enorme acréscimo de tempo para a realização da compactação e descompactação. Uma outra aplicação interessante a que isto nos leva, embora não esteja relacionada a copia de hds, e gerar uma imagem ISO a partir de um DVD já gravado, para depois ser usada na gravação de um novo DVD. Para fazer isso execute como no exemplo:

Código: Selecionar todos
dd if=/dev/cdrom of=Manjaro_cd1.iso


Depois, e SO passar o arquivo gerado como argumento do cdrecord ou do seu programa de gravação favorito. E uma ultima dica interessante: Sabia que e possível montar esses arquivos que são copias de sistemas de arquivos, como se fossem um dispositivo? Digamos que, no caso anterior, você queira dar uma olhada nos arquivos que o DVD continha, mas o DVD criou pernas e sumiu e você SO ficou com o arquivo de imagem :) Não e preciso gravar o DVD para depois monta-lo, pode-se perfeitamente montar o próprio arquivo de imagem como em:

Código: Selecionar todos
mount -t iso9660 Manjaro_cd1.iso /mnt/dvdimg -o loop


O segredo esta justamente em passar o parâmetro -o loop no final do comando mount. Se não funcionar, verifique se o seu kernel foi compilado com suporte a loopback device. Um jeito de checar isso e testar se e possível carregar o modulo loop (embora esse tipo de suporte pode ter sido compilado embutido no kernel, mas se assim fosse você não teria problemas e nem teria que fazer esse teste). Por fim, para encerrar esse pequeno desvio (e praticamente o artigo), note que você não esta limitado a fazer isso so com imagens geradas a partir de DVDs. Pode ser feito com qualquer imagem desde que você especifique o sistema de arquivos correto com -t. Obviamente, essas imagens são montadas sempre como somente leitura. Nao da para modificar o conteúdo de um arquivo de imagem usando essa técnica. Para encerrar, note que as técnicas apresentadas aqui resolvem situações 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 você tirou isto?

Acontece que instalo Linux desde 2007 dos CDs bootáveis, e nessa época eu usava Slackware traziam era uma imagem dos disquetes de boot, e um aplicativo para shell chamado rawwrite (ou era rawrite?) que exatamente escrevia a imagem num disquete. Me perguntando na época como poderia proceder para gravar essas imagens em um disquete se meu SO já fosse Linux, pesquisei a documentação de texto dentro do CD e la estava a orientação de como usar o dd para isso. A partir dai, foi so experimentar e expandir o conceito principal se pode usar isso infinitamente ah algum tempo eu trabalhava em uma escola de informática e la tinha 90 computadores isso mesmo 90 e eu dava aula de Hardware e também era técnico de la então eu fazia isso os micros tinham o mesmo hardware então pra mim era fácil carregava um DVD com a imagem da ISO e depois usava um Livecd e era só mandar bala hehehe...

Aqui eu vou deixar como usar o comando mount e como identificar o unidade de disco

/dev/sda1 e sda4 são meus HDs

/dev/sr0 é meu leitor de DVD

/dev/sdc1 é meu Pen Drive

Vocês podem ver a imagem que eu fiz e ditei no GIMP

Imagem

Referência

Os créditos por este texto são para josh.

Mudanças

- josh, 27/03/2013, correções pontuais.
- Holmes, 27/03/2013, adequar algumas coisas no texto.
- Holmes, 27/03/2013, corrigir o link da imagem.

Conteúdo distribuído sob a licença GNU FDL

Este artigo foi editado por Holmes em 28 Mar 2013, 10:48


^ Voltar ao Topo