quinta-feira, 18 de setembro de 2014

Converter máquina Física para Virtual no KVM

Um dos momentos mais importantes no trabalho com máquinas virtuais é a transformação das máquinas físicas para virtuais.
Normalmente encontramos na internet milhares de tutoriais de "como instalar KVM" e "criar máquinas virtuais novas". Porém, quando pouco se acha sobre administrar um servidor já em uso.
Nas instruções a seguir vou considerar que o servidor KVM já está em uso e queremos transferir uma máquina física para uma virtual nesse servidor.

Primeiramente observe se existe espaço em disco suficiente para essa operação pois o HD da máquina física será copiado integralmente.

Para essa ação utilizaremos os programas virt-v2v e virt-p2v no sistema operacional CentOS 6.5.
Nada será feito no Sistema Operacional da máquina física a ser virtualizada. A única ação nessa máquina será desligá-la e inicializar com cd-rom.


Então, vamos ao trabalho...

No Hospedeiro:
1- Instale os programas

# yum install virt-v2v   virt-p2v

A  instalação irá baixar o arquivo virt-p2v-09.1-2.20130730.1.el6.centos.iso na pasta /usr/share/virt-p2v. Claro que esse nome pode mudar conforme a versão do programa.
Grave um cd com essa imagem. 

Edite o arquivo /etc/virt-v2v.conf adicionando as seguintes linhas dentro da tag virt-v2v, ou seja, antes de "
":


      libvirt
     
            default
     

     
     
     

* Para agilizar esse tutorial, preenchi os campos nesse exemplo com dados sem nenhuma regra específica, mas se você pretende importar várias máquinas pode analisar os dados e preencher conforme sua necessidade, senão poderá alterar diretamente na máquina após a importação

Na máquina física:
1- Inicialize com o CD-Rom gravado no passo anterior;

2- Caso não haja servidor DHCP em sua rede, será mostrada uma tela para configuração de rede, configure a rede na mesma rede do Hospedeiro.

3- Será solicitado então:
---- Nome do host: Que você deve preencher com o IP do Hospedeiro;
---- Usuário:  Nesse caso o campo já vem preenchido com o "root". É o root do hospedeiro;
---- Senha: É a senha do usuário root no Hospedeiro;


Então é só escolher as informações inerentes a sua máquina física e iniciar a operação. 
Em um disco de 500GB o tempo da conversão foi de aproximadamente 5 horas, mas isso varia conforme a qualidade dos discos e das conexões de rede envolvidos.


Mudar status de interface de rede de máquina virtual no KVM

Para emular a desconexão do cabo de rede em uma máquina virtual no KVM devemos seguir os seguintes passos:

- Ligar a máquina virtual;

No hospedeiro:

# virsh

virsh # domiflist

Receberá a mensagem abaixo:

Interface  Type       Source     Model       MAC
------------------------------------------------------- 

vnet3      bridge     br0        -           50:e5:49:00:00:33

Observe o nome da interface da máquina em questão.

Então desative-a com o comando:

virsh # domif-setlink vnet3  down

Para reativar:

virsh # domif-setlink   vnet3 up



Observações:
As inscrições "virsh #" é o prompt de comando do virsh, não será digitado.

sexta-feira, 12 de setembro de 2014

Trabalhar com arquivo de imagem de dispositivo.

Quando copiamos o conteúdo de uma partição de disco em um arquivo através do comando dd, a montagem desse arquivo é bem simples, vejamos para exemplificar:

Tenho um disco com /dev/sda1 e /dev/sda2. Vou criar um arquivo com a imagem de cada partição com o seguinte comando:

# dd  if=/dev/sda1    of=arquivo_sda1.iso
# dd  if=/dev/sda2    of=arquivo_sda2.iso

Claro que o bom senso diz que devemos fazer isso com o dispositivo desmontado e, principalmente, não ser o disco em uso no momento.

Para montar o arquivo e ler seu conteúdo em outro computador:

# mkdir /mnt/sda1
# mount -t auto -o loop arquivo_sda1.iso /mnt/sda1


# mkdir /mnt/sda2
# mount -t auto -o loop arquivo_sda2.iso /mnt/sda2

* Não vou entrar em detalhes sobre isso aqui porque tem milhões de tutoriais e explicações detalhadas sobre isso na internet, não vou plantar mais do mesmo.

O problema é quando copiamos o conteúdo de um dispositivo inteiro que está particionado. Isso não tem muitos tutoriais por aí. Por exemplo:

Um disco de sistema de 500 GB particionado assim:

/dev/sda1
/dev/sda2
/dev/sda3

Executamos a cópia assim:

# dd if=/dev/sda  of=imagem_de_disco_sda.iso


Pronto, já temos a bomba!!!!! rsrsrs
Na hora de montar essas partições é que vem o problema pois é um único dispositivo.


Então vamos a solução tão simples que creio que por isso que tem tão pouco na internet.


# losetup -P /dev/loop0 imagem_de_disco_sda.iso 

Com a opção -P (maiúscula) o sistema criar tantos dispositivos quantas forem as partições do disco da seguinte forma, no nosso caso:

/dev/loop0p1
/dev/loop0p2
/dev/loop0p3

Então para montar as partições:

# mkdir /mnt/loop0p1
# mount -t auto /dev/loop0p1 /mnt/loop0p1

# mkdir /mnt/loop0p2
# mount -t auto /dev/loop0p2 /mnt/loop0p2

# mkdir /mnt/loop0p3
# mount -t auto /dev/loop0p3 /mnt/loop0p3
 

* a opção "-t auto" pode mudar dependendo do sistema de arquivo que existir na partição. Sugiro o uso do comando blkid para identificar os Sistemas de Arquivo de cada partição.
* A extensão ".iso" no arquivo de imagem é meramente ilustrativa, pode ser qualquer nome.


Um pouco mais...
Há casos que alguns sistemas operacionais não possuem o aplicativo losetup, em substituição vem o kpartx, como o CentOS 6.5. Então vou aproveitar e explicar como usar esse comando também:

# kpartx -av imagem_de_disco_sda.iso
Vai ser mostrada a seguinte saída:

add map loop0p1 (253:4): 0 16002 linear /dev/loop0 63
add map loop0p2 (253:5): 0 4415 linear /dev/loop0 16065

Diferente do losetup, ele não cria os atalhos /dev/loop0p1 e /dev/loop0p2. Mas observer uma sequência numérica na saída do comando, "253:4" e "253:5".
Se você listar o conteúdo de /dev/block, vai ver esses números lá apontando para dm-x que também tem links em /dev/mapper/loop0pX.
Tá, é uma confusão que não vem ao caso explicar agora.

A referência numéria no /dev/block é a que vai aparecer com mais frequência, então vamos utilizá-la para nosso exemplo:

Então, agora é só montar o dispositvo:

# mount -t auto /dev/block/253:4 /mnt/loop0p1
# mount -t auto /dev/block/253:5 /mnt/loop0p2


Pronto.
Já estão montados os dispositivos.