Convertendo Maquinas Virtuais HVM para PVM e PVM para HVM

De Xen-BR wiki

Xen-BR 
Convertendo Máquinas Virtuais HVM para PVM e PVM para HVM

Xenlogo.png




Tabela de conteúdo

Considerações iniciais

Antes de criar suas máquinas virtuais, siga esses conselhos:

* Não crie um arquivo para o raiz do sistema e outro para swap.
* Comece a utilizar o bootloader pygrub disponibilizado pelo Xen.

Os conselhos acima são para facilitar a sua vida quando você necessitar converter uma máquina virtual de HVM para PVM. A idéia é ter um único dispositivo de blocos virtualizado, a MBR (master boot record) onde tenha a sua tabela de partições e o bootloader grub gravado neste setor.

Criando o dispositivo de blocos para uma máquina virtual passível de conversão

Você precisará de algumas ferramentas antes de iniciar a tarefa. São elas:

* multipath-tools
* lvm2

Instale ambas em seu sistema e crie um volume lógico:

pvcreate /dev/sda7
vgcreate vmd /dev/sda7
vgchange -a y
lvcreate -L 100G -n vm001-disk vmd

Note que em /dev/mapper há o volume lógico vmd-vm001-disk, no qual vamos trabalhar.

Particionando e acessando as partições no dispositivo de blocos

Com o fdisk, crie as partições necessárias no dispositívo. Lembre-se que a sintaxe do comando do fdisk abaixo é necessária já que o dispositivo ainda não possui informações dos setores:

# fdisk -b 512 -C 4096 -H 16 -S 32 /dev/mapper/vmd-vm001-disk

Após criada a tabela de partições vamos agora deixar as partições visíveis. Para este exemplo criei 3 partições: /boot com 200M, / com 10G e a swap com 1G:

# kpartx -a /dev/mapper/vmd-vm001-disk

Perceba que em /dev/mapper existe agora mais 3 dispositivos mapeados. Cada dispositivo tem um dígito no final identificando qual é o número da partição do dispositivo de blocos pai:

# ls /dev/mapper/vmd-vm001-disk*
/dev/mapper/vmd-vm001-disk   /dev/mapper/vmd-vm001-disk1   /dev/mapper/vmd-vm001-disk2   /dev/mapper/vmd-vm001-disk3

Onde:

/dev/mapper/vmd-vm001-disk - Dispositívo de blocos pai - O volume lógico em si.
/dev/mapper/vmd-vm001-disk1 - Partição virtual /dev/hda1 para o /boot com 200M.
/dev/mapper/vmd-vm001-disk2 - Partição virtual /dev/hda2 para o / com 10G.
/dev/mapper/vmd-vm001-disk3 - Partição virtual /dev/hda3 para a swap com 1G.

Formate as partições de acordo com o sistema de arquivos que será utilizado. Recomendo fortemente utilizar ext3 para a /boot e /:

# mkfs.ext3 /dev/mapper/vmd-vm001-disk1
# mkfs.ext3 /dev/mapper/vmd-vm001-disk2
# mkswap /dev/mapper/vmd-vm001-disk3

Monte as partições;

# mount /dev/mapper/vmd-vm001-disk2 /mnt
# mkdir /mnt/boot
# mount /dev/mapper/vmd-vm001-disk1 /mnt/boot

Utilize o debootstrap por exemplo para instalar o Linux nas partições:

# debootstrap --arch amd64 etch /mnt http://ftp.debian.org/debian

Copie agora alguns arquivos do /boot do seu Dom0 para /mnt/boot:

# cp -a /boot/*2.6.18* /mnt/boot
# mkdir /mnt/boot/grub
# cp /boot/grub/stage* /boot/grub/e2fs_stage1_5 /mnt/boot/grub

Crie o /mnt/boot/grub/menu.lst com as entradas necessárias dos kerneis para a sua máquina virtual. este arquivo será utilizado tanto por PVM quanto por HVM:

default         0
timeout         5
color cyan/blue white/blue

# Entrada para PVM
title           PVM - Debian GNU/Linux, kernel 2.6.18-xen
root            (hd0,0)
kernel          /vmlinuz-2.6.18-xen root=/dev/hda2 ro
initrd          /initrd.img-2.6.18-xen
savedefault

# Entrada para HVM
title           HVM - Debian GNU/Linux, kernel 2.6.18-4-686
root            (hd0,0)
kernel          /vmlinuz-2.6.18-4-amd64 root=/dev/hda2 ro
initrd          /initrd.img-2.6.18-4-amd64
savedefault

É importante salientar que, dependendo da configuração do seu sistema, poderá haver diferenças à configuração apresentada acima. Salve o arquivo e copie os módulos do kernel para PVM:

# cp -a /lib/modules/2.6.18-xen /mnt/lib/modules/

Desmonte as partições:

# umount /mnt/boot && umount /mnt/

Desmapeie o dispositivo /dev/mapper/vmd-vm001-disk

# kpartx -d /dev/mapper/vmd-vm001-disk

Gravando o grub na MBR

Execute o GRUB e aponte para o dispositivo /dev/mapper/vmd-vm001-disk:

# grub
   GNU GRUB  version 0.97  (640K lower / 3072K upper memory)

      [ Minimal BASH-like line editing is supported.   For
        the   first   word,  TAB  lists  possible  command
        completions.  Anywhere else TAB lists the possible
        completions of a device/filename. ]

grub> device (hd0) /dev/mapper/vmd-vm001-disk

grub> root (hd0,0)
 Filesystem type is ext2fs, partition type 0x83

grub> setup (hd0)
 Checking if "/boot/grub/stage1" exists... no
 Checking if "/grub/stage1" exists... yes
 Checking if "/grub/stage2" exists... yes
 Checking if "/grub/e2fs_stage1_5" exists... yes
 Running "embed /grub/e2fs_stage1_5 (hd0)"...  15 sectors are embedded.
succeeded
 Running "install /grub/stage1 (hd0) (hd0)1+15 p (hd0,0)/grub/stage2 /grub/menu.lst"... succeeded
Done.
grub> quit

Criando a configuração para a máquina virtual

A idéia é ter uma configuração que seja portável facilmente para PVM quanto para HVM. Abaixo a configuração:

builder = 'linux'
name ='vm-0001'
memory = 512
disk = ['phy:/dev/saruman/alambix.disk,hda,w' ]
vif = ['bridge=xenbr3']
vcpus = 1
cpus = '1'

if builder == 'linux':
    bootloader = '/usr/bin/pygrub'
    on_poweroff = 'destroy'
    on_reboot = 'restart'
    on_crash = 'restart'
    extra = 'xencons=xvc console=xvc0 video=xenfb'
    vfb = [ 'type=vnc,vncunused=1' ]
elif builder == 'hvm':
    kernel = '/usr/lib/xen/boot/hvmloader'
    device_model = '/usr/lib/xen/bin/qemu-dm'
    boot = 'c'
    vnc = 1
    apic = 1
    acpi = 1
    restart = 'onreboot'
    vncunused = 1

Perceba que, alterando somente a variável builder, você pula de pvm para hvm com facilidade. No entanto, é necessário que no arquivo menu.lst do GRUB da sua máquina virtual seja alterado o kernel padrão alterando a variável 'default'.

>> Marco Sinhoreli <<

Arquivo:Exemplo.jpg
Ferramentas pessoais