Convertendo Máquina Virtual Linux do Hyper-V para o XCP-NG (V2V – Virtual to Vitual)
A carreira de um profissional de TI é desafiadora, são inúmeros os desafios que nos são propostos a cada dia, o que exige deste tipo de profissional uma quantidade gigantesca de tempo investido em pesquisas, leituras de livros, blogs, etc. e uma infinidade de implementações para correções de erros, implantação de novas soluções, etc. Recentemente precisei migrar um Data Center com Hyper-V (Microsoft Hyper-V, codinome Viridian e anteriormente conhecido como Virtualização no Windows Server, é uma tecnologia de virtualização baseada em Hipervisor nativo.) para XCP-NG (Baseado no XenServer, o XCP-ng é o resultado de uma cooperação maciça entre indivíduos e empresas, para entregar um produto sem limitações, com todos os bits disponíveis no GitHub!), não vou discutir aqui as vantagens entre usar um ou o outro, mas gosto da ideia de usar software livre e gosto mais ainda do fato dele ser imune a maioria das pragas virtuais que assolam o dia a dia do profissional de TI.
Indo direto ao assunto após preparar o servidor com o XCP-NG comecei o processo de migração/conversão com o Clonezilla (que basicamente é um sistema de clonagem de disco similar a tantos outros como True Image, Norton Ghost, gosto de usá-lo pelo fato de ser Open Source e suporta vários tipos de sistema de arquivos, no entanto não vou entrar em detalhes do uso do mesmo pois não é o objetivo desse artigo).
Basicamente o que fiz foi desligar a VM Hyper-V, baixar a imagem iso da ferramenta no site oficial do projeto, setar o boot pala iso, daí usei a opção no Clonezilla no modo “remote-source Enter source mode of remote device cloning” com isso será possível disponibilizar o disco de origem da VM no Hyper-V de forma remota, isso significa que será possível realizar uma cópia direta de disco para disco através da rede, feito isso após alguns passos a VM de origem estará pronta para enviar os dados via rede, aguardando apenas a “solicitação” da VM de destino no XCP-NG, para que isso ocorra é necessário criar uma VM com as mesmas características de processador, memória, discos, interface de rede, etc. no destino, inserir a imagem iso do Clonezilla e fazer a inicialização da VM pela iso, nas opções do Clonezilla subir ele no modo “remote-dest Enter destination mode of remote device cloning”, nesse modo será realizada uma cópia direta de disco para disco através da rede, com isso será possível receber o disco da VM de origem lá do Hyper-V de forma remota na VM de destinho no XCP-NG,.
O procedimento é simples e o tempo será diretamente proporcional ao tamanho do disco a ser clonado. Com o processo finalizado é hora de remover as medias e realizar a reinicialização da VM no XCP-G, mas para minha surpresa a VM ligou e não carregou o sistema operacional em questão um Debian 9 que rodava o Bacula (Servidor de Backup Open Source), apresentando a seguinte mensagem:
ALERTA! /dev/sda1 does not exist. Dropping to a shell!
Como descrito no inicio deste post nos é exigido algumas horas de pesquisas com leituras em fóruns e afins, logo descobri que se tratava de um problema no GRUB (O Grub é o gerenciador de boot do GNU/Linux) que por algum motivo na conversão entre hypervisores de famílias tão distintas não é incomum problemas do tipo.
Para correção rápida do problema o primeiro passo é baixar uma imagem de uma distro live como o ubuntu ou linux mint, iniciar a VM pela iso baixada, feito isso pressione o botão “Try Ubuntu” ou similar (dependendo da versão do seu sistema baixado).
Ao termino da carga do sistema operacional da Iso do liveCD (sem instalar), abra um terminal e execute o comando abaixo.
$ sudo fdisk -l
/dev/xvda1 2048 39063551 19530752 83 Linux
/dev/xvda5 39065600 41064447 999424 82 Linux swap / Solaris
Verifiquei que as as partições estavam com endereçamento completamente diferente da mensagem de alerta, onde exibia o endereçamento da partição como /dev/sda1, observe no retorno do comando fdisk -l que as partições no disco no XCP-NG são reconhecidos como /dev/xvdx (fomato dos discos no Hypervisor XEN, que nomeia os discos como “xvdx” as unidades, e as vms o reconhecem assim.) logo entendi que o primeiro ajuste a ser feito era no fstab (um arquivo de configuração do sistema localizado em /etc/fstab em sistemas operacionais Unix e sistemas de computadores Unix-like), para tal será necessário montar as partições e fazer as devidas alterações e só então instalaremos o Grub no /xvda.
Montei a partição que o Debian está instalado, no caso /dev/xvda1, no diretório /mnt.
$ sudo mount /dev/xvda1 /mnt
Executei os comandos abaixo, com a opção bind, (opção –bind monta um diretório local em um diretório dentro de uma partição remota).
$ sudo mount --bind /dev /mnt/dev
$ sudo mount --bind /dev/pts /mnt/dev/pts
$ sudo mount --bind /proc /mnt/proc
$ sudo mount --bind /sys /mnt/sys
Entrei em modo chroot (O comando chroot do sistema operacional Unix é uma operação que muda o diretório root do processo corrente e de seus processos filhos.) com o comando abaixo:
$ sudo chroot /mnt
O primeiro passo foi editar o /mnt/etc/fstab e alterar todas as referencias ao disco de /dev/sda para /dev/xvda, o procedimento pode ser feito de várias maneiras bem como usando um dos vários editores de texto do linux, usei o vi com o seguinte comando dentro do arquivos editado em modo de comando:
:%s/sda/xvda/g (Encontra cada ocorrência de sda (em todas as linhas) e substitui por xvda)
O próximo passo foi instalar o grub no HD com o seguinte comando:
$ sudo grub-install /dev/xvda
$ sudo update-grub
Sai do modo chroot:
exit
Desmontei todas as partições.
$ sudo umount /mnt/sys
$ sudo umount /mnt/proc
$ sudo umount /mnt/dev/pts
$ sudo umount /mnt/dev
$ sudo umount /mnt
$ sudo reboot
Pronto, agora o sistema reiniciou sem erros.