Vamos tomar como exemplo o seguinte cenário: dentre os servidores da empresa XYZ existe um FreeBSD (firewall, Squid, VPN, MTA, Whatever...) que precisa ser migrado para outro hardware por qualquer motivo, porém, se possível, sem downtime.
Para iniciar você precisa preparar a máquina "destino". Ou seja: alocar, energizar, preparar o raid (caso seja via hardware)... Deixar ela pronta para executar o procedimento.
Você também precisa ter em mãos o esquema de particionamento de disco e configurações de rede da máquina de "origem".
Será necessário para tal procedimento uma mídia com um sistema BSD que rode LIVE. Já utilizei o Freesbie e um DVD do FreeBSD por exemplo.
O próximo passo então será bootar a máquina "destino" com o BSD live e botar a mão na massa...
Preparando o clone
Após subir o sistema Live na máquina "destino", ou seja, a que será o clone do sistema em produção, configure a rede deixando o sistema apto a alcançar a "origem" do clone.
Com os dados que você colheu, agora é hora de preparar o disco da máquina:
# dd if=/dev/zero of=/dev/da0 bs=512 count=79
Isto exclui as informações de particionamento e etc do disco que será utilizado.
# fdisk - v - B - I /dev/da0
Com este comando você torna o disco bootável e cria um slice ocupando todo o espaço.
# bsdlabel -w -B /dev/da0s1
Criando uma tabela de partições.
# bsdlabel -e /dev/da0s1
Aqui você irá abrir o editor de partições do slice 1 no disco da0.
Uma rápida explicação sobre o bsdlabel:
Será apresentado a você uma tela como esta:
# size offset fstype [fsize bsize bps/cpg]
a: 6291456 16 unused 0 0
c: 314572800 0 unused 0 0 # "raw" part, don't edit
Cada letra aqui é uma partição. A "c" é utilizada pelo sistema e você não deve fazer qualquer alteração. A partição "a" está ocupando o total de espaço do disco. Podemos começar a editar.
Supondo que a máquina a ser clonada possui 3 partições: /var, /, /usr e 1024M de swap, então você precisará deixar o esquema de particionamento como mostrado abaixo:
# size offset fstype [fsize bsize bps/cpg]
a: 1G 16 4.2BSD * *
b: 1G * swap * *
c: 314572800 0 unused 0 0 # "raw" part, don't edit
d: 5G * 4.2BSD * *
e: * * 4.2BSD * *
Não se preocupe em alinhar as informações como numa tabela, depois que você salvar e sair (como no Vi), o próprio "bsdlabel" acerta as informações. Ao retornar você verá tudo formatado.
Então neste caso ficou assim: a partição "a" para o / com 1G de espaço, a partição "b" como swap, a "d" para o /var com 5G e a partição identificada como "e" ficou para o /usr. Notem que à frente da partição "e" existe um "*". Isso porque, como deixamos ela por último e esta partição irá usar todo o espaço restante do disco, não precisamos especificar todo o tamanho.
Para visualizar as partições criadas você pode utilizar o seguinte comando:
# ls -l /dev/da0s1*
Vamos então formatar e montar as partições recém-criadas:
# newfs -U /dev/da0s1a
# newfs -U /dev/da0s1d
# newfs -U /dev/da0s1e
# mount /dev/da0s1a /media
# mkdir /media/var
# mkdir /media/usr
# mount /dev/da0s1d /media/var
# mount /dev/da0s1e /media/usr
Feito isso, podemos iniciar a cópia do sistema.
Dump
Vá até o diretório que será o seu "/" e inicie o dump:
# cd /media
# ssh root@maquina_de_origem "dump -0af - /" | restore -rf -
Com isso você estará copiando todo o "/" da máquina a ser clonada.
Terminado o processo de dump vamos para a próxima partição.
# cd /media/var
# ssh root@maquina_de_origem "dump -0af - /var" | restore -rf -
Finalizando o processo, vamos iniciar o dump do /usr.
# cd /media/usr
# ssh root@maquina_de_origem "dump -0af - /usr" | restore -rf -
Pronto! Você clonou o sistema para um novo hardware. Agora muito cuidado! Se você simplesmente rebootar a máquina terá dois hardwares com mesmo nome e ip na rede.
Você já pode iniciar o processo de configuração do clone, como hostname, ip, carp etc. Lembrando que a raiz do sistema clonado é o /media.
Outro ponto importante: vamos supor que a máquina de "origem" possui um RAID feito com o gmirror e na máquina "destino" você simplesmente vai utilizar um RAID por hardware. Não esqueça de editar
/media/etc/fstab e tirar as informações do gmirror apontando para as partições corretas.
Para finalizar:
# reboot
Finalizando
Não cuidei de explicar nos mínimos detalhes de cada comando, nem em utilizar números mais realistas, por exemplo, o tamanho das partições. Basta apenas que você substitua os valores de acordo a sua realidade.
No caso de dúvidas, entre em contato.
Até a próxima.