-
libvirt e LVM2
Uma ótima forma de criar uma estrutura para suportar máquinas virtuais é a parceria entre libvirt e LVM2. No meu caso em específico, uso o emulador qemu-kvm para rodar minhas máquinas virtuais. A seguir, apresentarei como se cria um pool de volumes lógicos no libvirt e como converter máquinas já criadas em arquivos de imagens.
Antes de tudo, é necessário que já tenha sido criado um grupo virtual. Como isso não está no escopo do post, recomendo navegar por esse howto. Com o grupo criado e ativado, vamos criar a definição do pool para o libvirt. Abra um editor de texto, como o vim, e coloque nele o seguinte texto:
<pool type='logical'> <name>logical</name> <source> <device path='/dev/sdb1'/> <name>logical</name> <format type='lvm2'/> </source> <target> <path>/dev/logical</path> </target></pool>
Nesse exemplo, vamos assumir que a partição que compõe o grupo logico é o /dev/sdb1. Após, salve com um nome sugestivo, como por exemplo logical.xml. Agora só resta registrar no libvirt.
virsh pool-define logical.xml
Mesmo registrado, o sistema ainda não ativou o pool. É recomendado que ele seja marcado como autostart, para que caso o libvirt pare, ele ative automaticamente o pool. Para isto, basta os seguintes comandos:
virsh pool-autostart logical virsh pool-start logical
Com o pool inicializado, agora só resta criar um volume lógico dentro dele:
virsh vol-create-as logical disco_teste 10GB
Este comando criará um volume lógico de nome disco_teste no grupo logical tendo como capacidade 10GiB
Convertendo arquivos de imagens em volumes lógicos
Caso já tenha uma máquina virtual configurada em um arquivo de imagem nos formatos suportados pelo qemu, basta convertê-lo usando o próprio qemu-img para o formato desejado. Na versão 0.12.4 os formatos suportados são: cow, qcow, vdi, vmdk, cloop, dmg, bochs, qcow2, host_device, raw entre outros.
Antes de começar, é preciso criar um volume lógico com o mesmo tamanho da imagem existente. Para ter o valor correto, use a ferramenta qemu-img para saber o tamanho total da imagem:
qemu-img info disco.img
Ele retornará algo como:
image: disco.img file format: qcow2 virtual size: 10G (10737418240 bytes) disk size: 4.0G cluster_size: 65536
Veja que, embora o arquivo tenha tamanho de 4GB, ele pode crescer até o tamanho virtual, que é de 10GB para esta imagem. Agora, crie um volume lógico com este tamanho seguindo o modelo logo acima.
Eu conheço duas formas de levar o arquivo de imagem para um volume lógico. A primeira é usando o qemu-img para já gravar a imagem no volume:
qemu-img convert -f qcow2 -O host_device disco.img /dev/logical/disco_teste
Ou então, com uma etapa a mais, e portanto mais demorada, transformando a imagem do formato nativo para raw e depois transferindo os dados de forma bruta para o volume com o dd:
qemu-img convert -f qcow2 -O raw disco.img disco.raw dd if=disco.raw of=/dev/logical/disco_teste
O resultado de ambos é o mesmo. Desde que tenha um domínio registrado com esse disco, agora é só usar o volume lógico recém criado. A definição de um disco em volume lógico segue o modelo:
<devices> ... <disk type='block' device='disk'> <source dev='/dev/logical/disco_teste'/> <target dev='sdc' bus='scsi'/> </disk> ... </devices>