“Copiando” um Linux

Esses dias, um amigo meu comprou um SSD para o notebook dele, e queria copiar o Linux dele para o SSD. O detalhe, ele não queria instalar o linux novamente, e queria manter o diretório /home dele no HD antigo. Depois de fazer o processo, resolvemos que seria uma boa idéia postar sobre como fazer isso.

Inicialmente, é importante falar (para quem não conhece direito) que o Linux tem uma estrutura de diretórios bem peculiar. Todos os dados pessoais estão apenas no diretório /home, as informações de boot estão no diretório /boot, e outras informações estão em outros lugares. Logo, tudo o que se precisa fazer é mover os diretórios para o novo HD (no caso, o SSD) e deixar o diretório /home no HD antigo. Mas tem um pouco mais do que isso.

Alguns diretórios, especificamente o /dev, /proc e /sys não devem ser copiados pois são diretórios “virtuais”. Logo, pulamos esses, o pulamos o /home e então copiamos os outros. Obviamente, precisamos rodar todos os comandos como super-usuário, algo como:

sudo cp /bin /sbin /usr /opt .... /mnt/path_aonde_esta_montado_o_hd -av

Logo depois, teremos que fazer uma atualização em nossa fstab. Uma idéia básica é a seguinte: você terá já uma entrada para o diretório “/” em sua fstab, e a idéia é que mudaremos o HD que monta o / para outro HD – no nosso caso, o SSD. Eu começaria criando na raíz do SSH um diretório como “/old“. Veremos porque disso em pouco  tempo. Para ver o que faremos em nosso fstab, vou deixar aqui uma cópia de como está o meu:

# /etc/fstab: static file system information.
#
# <file system> <mount point> <type> <options> <dump> <pass>
# / was on /dev/sdb1 during installation
UUID=74860647-654b-49bb-b225-dd86487a44e4 / ext4 noatime,errors=remount-ro 0 1

tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0

A idéia é que vamos mudar quem é a partição /, e adicionar outra no lugar. Depois disso, iremos montar essa nossa partição atual em /old, e montar o home em /old/home. Costumo fazer esse passo do /old pois é simples de, caso algo aconteça de errado, voltar à versão anterior do Linux. Digamos então que o SSD (ou o segundo HD) está em /dev/sdb, e que copiamos nosso sistema para /dev/sdb1. Podemos então montar nossa raíz com a seguinte linha: 

/dev/sdb1  /  ext4  noatime,errors=remount-ro  0 1

Depois disso, adicionamos um /old na nossa fstab. O resultado ficará assim:

/dev/sdb1 / ext4 noatime,errors=remount-ro 0 1

UUID=74860647-654b-49bb-b225-dd86487a44e4 /old ext4 noatime,errors=remount-ro 0 1

Mas, ainda faltam coisas a serem feitas. Notavelmente, falta adicionar o diretório home, e o tmpfs. Para tal, eu faço um “bind” com o diretório /old/home, da seguinte maneira:

/dev/sdb1 / ext4 noatime,errors=remount-ro 0 1

UUID=74860647-654b-49bb-b225-dd86487a44e4 /old ext4 noatime,errors=remount-ro 0 1

/old/home /home none bind  0 1

tmpfs /tmp tmpfs defaults,noatime,mode=1777 0 0

Só isso já atualiza nosso fstab. Claro que temos que fazer essa alteração no fstab que está no segundo HD (no caso, o SSD), caso contrário nada vai mudar (já que nosso segundo HD será o primário). Feito isso, podemos entrar em nosso SSD e instalar o Grub lá. O processo é chamado de chroot.

Chroot nada mais é do que “Change Root”, ou seja, entrar num ambiente linux que não é o que estamos agora. Para tal, primeiro precisamos montar o dev, proc, etc em  nosso novo ambiente. Digamos que o segundo HD esteja montado em /mnt/hd2. Teremos que montar os diretórios especiais da seguinte maneira:

sudo mkdir /mnt/hd2/dev /mnt/hd2/proc /mnt/hd2/sys
sudo mount -o bind /dev /mnt/hd2/dev
sudo mount -o bind /proc /mnt/hd2/proc
sudo mount -o bind /sys /mnt/hd2/sys

Então, fazemos o chroot com:

sudo chroot /mnt/hd2

Agora, vamos atualizar o GRUB. Existe o comando grub-mkconfig que montará um config de seu grub. Vamos usá-lo para atualizar o /boot/grub/grub.cfg, e então vamos instalar o novo grub com grub-install. Os comandos abaixo fazem isso:

grub-mkconfig > /boot/grub/grub.cfg
grub-install /dev/sdb

Agora, é reiniciar o computador, mudar o HD bootável na BIOS, e iniciar o sistema pelo segundo HD. Se algo der errado, podemos mudar de novo o HD bootável para o primeiro, e iniciar o linux antigo-ele está inalterado. Porém, vale lembrar que uma vez que o segundo HD está configurado corretamente, o ideal é deletar o sistema inteiro do primeiro HD, e deixar apenas a pasta home. Afinal, estamos perdendo espaço em um HD, já que estamos usando outro…

Por fim, no computador de meu amigo, a BIOS não deixava iniciar pelo segundo HD. Para corrigir isso, acabamos instalando (de dentro do CHROOT) o GRUB no primeiro HD mesmo, usando grub-install /dev/sda. Claro que não é o ideal, porém no nosso caso, funcionou corretamente.

Esse exemplo é interessante pois mostra quão versátil é o Linux. Caso o que estejamos fazendo seja simplesmente trocando um HD defeituoso por outro bom, podemos usar a mesma técnica (claro que sem a especificidade de não copiar o diretório home, não fazer a alteração na fstab para montar o antigo HD em /old nem o bind do home, etc – porém, você ainda precisará alterar a fstab, caso contrário ele procurará um HD com UUID diferente do seu, o que daria erro). Caso estejamos, por exemplo, fazendo uma “imagem” e instalando em vários computadores diferentes, também podemos usar essa técnica. Praticamente podemos usar isso também para instalar um linux em um pen-drive ou outro HD externo, também.

Por fim, o ponto mais crítico dessa instalação é a instalação do GRUB. Praticamente qualquer coisa pode ser corrigida sem necessitar de um CD de recuperação, exceto se o grub der falha. Logo, é recomendável um CD nesses casos.

Advertisements
This entry was posted in Infra estrutura e SO and tagged , . Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s