libvirt
com o Ceph #
A biblioteca libvirt
cria uma camada de abstração de máquina virtual entre as interfaces de hipervisor e os aplicativos de software que as utilizam. Com a libvirt
, os desenvolvedores e administradores de sistema podem se dedicar a uma estrutura comum de gerenciamento, API comum e interface de shell comum (virsh
) com vários hipervisores diferentes, incluindo QEMU/KVM, Xen, LXC ou VirtualBox.
Os dispositivos de blocos do Ceph suportam o QEMU/KVM. Você pode usá-los com um software que estabeleça interface com a libvirt
. A solução de nuvem usa a libvirt
para interagir com o QEMU/KVM, e o QEMU/KVM interage com os dispositivos de blocos do Ceph pela librbd
.
Para criar VMs que usam os dispositivos de blocos do Ceph, siga os procedimentos nas seções abaixo. Nos exemplos, usamos libvirt-pool
para o nome do pool, client.libvirt
para o nome de usuário e new-libvirt-image
para o nome da imagem. Você pode usar qualquer valor desejado, mas deve substituí-los durante a execução dos comandos nos procedimentos seguintes.
Para configurar o Ceph para uso com a libvirt
, execute as seguintes etapas:
Crie um pool. O exemplo a seguir usa o nome do pool libvirt-pool
com 128 grupos de posicionamento.
ceph osd pool create libvirt-pool 128 128
Verifique se o pool existe.
ceph osd lspools
Crie um Usuário do Ceph. O exemplo a seguir utiliza o nome de usuário do Ceph client.libvirt
e faz referência ao libvirt-pool
.
ceph auth get-or-create client.libvirt mon 'allow r' osd \ 'allow class-read object_prefix rbd_children, allow rwx pool=libvirt-pool'
Verifique se o nome existe.
ceph auth list
A libvirt
acessará o Ceph usando o ID libvirt
, não o nome do Ceph client.libvirt
. Consulte http://docs.ceph.com/docs/master/rados/operations/user-management/#user para ver uma explicação detalhada da diferença entre ID e nome.
Use o QEMU para criar uma imagem em seu pool RBD. O exemplo a seguir usa o nome da imagem new-libvirt-image
e faz referência ao libvirt-pool
.
Verifique se o caminho do chaveiro do usuário “libvirt” foi especificado em
. Por exemplo:keyring = /etc/ceph/client.libvirt.keyring
Se o chaveiro não existir, crie-o com:
root #
ceph auth get client.libvirt > /etc/ceph/client.libvirt.keyring
qemu-img create -f raw rbd:libvirt-pool/new-libvirt-image:id=libvirt 2G
Verifique se a imagem existe.
rbd -p libvirt-pool ls
É possível usar a libvirt
sem um gerenciador de VM, mas talvez você ache mais simples criar primeiro o domínio com virt-manager
.
Instale um gerenciador de máquina virtual.
sudo zypper in virt-manager
Prepare/faça download de uma imagem de OS do sistema que deseja virtualizar.
Inicie o gerenciador de máquina virtual.
virt-manager
Para criar uma VM com virt-manager
, execute as seguintes etapas:
Escolha a conexão na lista, clique o botão direito do mouse nela e selecione
(Novo).
libvirt-virtual-machine
.
Conclua a configuração e inicie a VM.
Verifique se o domínio recém-criado existe com sudo virsh list
. Se necessário, especifique a string de conexão, como
virsh -c qemu+ssh://root@vm_host_hostname/system list
Id Name State
-----------------------------------------------
[...]
9 libvirt-virtual-machine running
Efetue login na VM e pare-a antes de configurá-la para uso com o Ceph.
Neste capítulo, vamos nos concentrar na configuração de VMs para integração com o Ceph usando virsh
. Geralmente, os comandos virsh
exigem privilégios de root (sudo
) e não retornarão os resultados apropriados nem o notificarão sobre a necessidade dos privilégios de root. Para obter uma referência dos comandos virsh
, consulte Virsh Command Reference (Referência do comando virsh).
Abra o arquivo de configuração com virsh edit
vm-domain-name.
sudo virsh edit libvirt-virtual-machine
Em <devices>, deve haver uma entrada <disk>.
<devices> <emulator>/usr/bin/qemu-system-x86_64</emulator> <disk type='file' device='disk'> <driver name='qemu' type='raw'/> <source file='/path/to/image/recent-linux.img'/> <target dev='vda' bus='virtio'/> <address type='drive' controller='0' bus='0' unit='0'/> </disk>
Substitua /path/to/image/recent-linux.img
pelo caminho para a imagem do OS.
No lugar de um editor de texto, use sudo virsh edit
. Se você editar o arquivo de configuração em /etc/libvirt/qemu
com um editor de texto, a libvirt
poderá não reconhecer a mudança. Em caso de qualquer diferença entre o conteúdo do arquivo XML em /etc/libvirt/qemu
e o resultado de sudo virsh dumpxml
vm-domain-name, a VM pode não funcionar apropriadamente.
Adicione a imagem RBD do Ceph que você já criou como uma entrada <disk>.
<disk type='network' device='disk'> <source protocol='rbd' name='libvirt-pool/new-libvirt-image'> <host name='monitor-host' port='6789'/> </source> <target dev='vda' bus='virtio'/> </disk>
Substitua monitor-host pelo nome do seu host e substitua o nome do pool e/ou da imagem, conforme necessário. Você pode adicionar várias entradas <host> aos Ceph Monitors. O atributo dev
é o nome do dispositivo lógico que aparecerá no diretório /dev
da VM. O atributo de barramento opcional indica o tipo de dispositivo de disco a ser emulado. As configurações válidas são específicas do driver (por exemplo, ide, scsi, virtio, xen, usb ou sata). Consulte Disks (Discos) para obter detalhes do elemento <disk> e dos respectivos elementos filho e atributos.
Grave o arquivo.
Se a autenticação estiver habilitada no cluster do Ceph (que é o padrão), você deverá gerar um segredo. Abra o editor de sua preferência e crie um arquivo chamado secret.xml
com o seguinte conteúdo:
<secret ephemeral='no' private='no'> <usage type='ceph'> <name>client.libvirt secret</name> </usage> </secret>
Defina o segredo.
sudo virsh secret-define --file secret.xml <uuid of secret is output here>
Obtenha a chave client.libvirt
e grave a string de chave em um arquivo.
ceph auth get-key client.libvirt | sudo tee client.libvirt.key
Defina o UUID do segredo.
sudo virsh secret-set-value --secret uuid of secret \ --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
Você também deve definir o segredo manualmente adicionando a seguinte entrada <auth>
ao elemento <disk>
que você inseriu antes (substituindo o valor do uuid pelo resultado do exemplo de linha de comando acima).
sudo virsh edit libvirt-virtual-machine
Em seguida, adicione o elemento <auth></auth>
ao arquivo de configuração do domínio:
... </source> <auth username='libvirt'> <secret type='ceph' uuid='9ec59067-fdbc-a6c0-03ff-df165c0587b8'/> </auth> <target ...
O ID do exemplo é libvirt
, e não o nome do Ceph client.libvirt
, conforme gerado na etapa 2 da Seção 16.1, “Configurando o Ceph”. Use o componente de ID do nome do Ceph que você gerou. Se, por algum motivo, você precisar gerar novamente o segredo, terá que executar sudo virsh secret-undefine
uuid antes de executar sudo virsh secret-set-value
outra vez.
Após configurar a VM para uso com o Ceph, você poderá iniciá-la. Para verificar se a VM e o Ceph estão se comunicando, você pode executar os procedimentos a seguir.
Verifique se o Ceph está em execução:
ceph health
Verifique se a VM está em execução:
sudo virsh list
Verifique se a VM está se comunicando com o Ceph. Substitua vm-domain-name pelo nome do domínio da sua VM:
sudo virsh qemu-monitor-command --hmp vm-domain-name 'info block'
Verifique se o dispositivo de &target dev='hdb' bus='ide'/>
aparece em /dev
ou em /proc/partitions
:
ls /dev cat /proc/partitions