libvirt
con Ceph #
La libreria libvirt
consente di creare uno strato di astrazione della macchina virtuale tra le interfacce dell'Hypervisor e le applicazioni software che le utilizzano. Con libvirt
, sviluppatori e amministratori di sistema possono focalizzarsi su un framework di gestione, un'API e un'interfaccia shell (virsh
) comuni a Hypervisor diversi, tra cui QEMU/KVM, Xen, LXC o VirtualBox.
I dispositivi di blocco Ceph supportano QEMU/KVM. È possibile utilizzare i dispositivi di blocco Ceph con software che si interfaccia con libvirt
. Nella soluzione cloud si utilizza libvirt
per l'iterazione con QEMU/KVM e quest'ultimo esegue l'iterazione con i dispositivi di blocco Ceph tramite librbd
.
Per creare macchine virtuali in cui vengono utilizzati dispositivi di blocco Ceph, seguire le procedure riportate nelle sezioni seguenti. Negli esempi, sono stati utilizzati libvirt-pool
per il nome pool, client.libvirt
per il nome utente e new-libvirt-image
per il nome immagine. È possibile utilizzare qualsiasi valore desiderato, ma assicurarsi di sostituire tali valori quando si eseguono i comandi nelle procedure successive.
Per configurare Ceph per l'uso con libvirt
, eseguire i seguenti passaggi:
Creare un pool. Nell'esempio seguente viene utilizzato il nome pool libvirt-pool
con 128 gruppi di posizionamento.
ceph osd pool create libvirt-pool 128 128
Verificare l'esistenza del pool.
ceph osd lspools
Creare un utente Ceph. Nell'esempio seguente viene utilizzato il nome utente Ceph client.libvirt
e si fa riferimento a 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'
Verificare l'esistenza del nome.
ceph auth list
libvirt
accederà a Ceph tramite l'ID libvirt
, non il nome Ceph client.libvirt
. Per una spiegazione dettagliata della differenza tra ID e nome, vedere http://docs.ceph.com/docs/master/rados/operations/user-management/#user (in lingua inglese).
Utilizzare QEMU per creare un'immagine nel pool RBD. Nell'esempio seguente viene utilizzato il nome immagine new-libvirt-image
e si fa riferimento a libvirt-pool
.
Assicurarsi che il percorso del portachiavi utente "libvirt" sia specificato in
, ad esempio:keyring = /etc/ceph/client.libvirt.keyring
Se il portachiavi non esiste, crearlo con:
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
Verificare l'esistenza dell'immagine.
rbd -p libvirt-pool ls
È possibile utilizzare libvirt
senza un programma di gestione VM, ma è più semplice creare prima il dominio con virt-manager
.
Installare un programma di gestione delle macchine virtuali.
sudo zypper in virt-manager
Preparare/effettuare il download di un'immagine del sistema operativo che si desidera eseguire come virtualizzato.
Avviare il programma di gestione delle macchine virtuali.
virt-manager
Per creare una VM con virt-manager
, eseguire i passaggi seguenti:
Scegliere la connessione dall'elenco, fare clic con il pulsante destro del mouse su di essa e selezionare
.
libvirt-virtual-machine
.
Completare la configurazione e avviare la VM.
Verificare l'esistenza del dominio appena creato con sudo virsh list
. Se necessario, specificare la stringa di connessione, come
virsh -c qemu+ssh://root@vm_host_hostname/system list
Id Name State
-----------------------------------------------
[...]
9 libvirt-virtual-machine running
Eseguire il login alla VM e interromperla prima di configurarla per l'uso con Ceph.
Questo capitolo è incentrato sulla configurazione delle VM per l'integrazione con Ceph mediante l'uso di virsh
. Spesso per i comandi virsh
sono richiesti i privilegi radice (sudo
) e non verranno restituiti i risultati appropriati né notifiche in merito ai privilegi radice richiesti. Per informazioni sui comandi virsh
, fare riferimento a Virsh Command Reference (in lingua inglese).
Aprire il file di configurazione con virsh edit
vm-domain-name.
sudo virsh edit libvirt-virtual-machine
In <devices> deve essere presente una voce <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>
Sostituire /path/to/image/recent-linux.img
con il percorso dell'immagine del sistema operativo.
Utilizzare sudo virsh edit
al posto di un editor di testo. Se si modifica il file di configurazione in /etc/libvirt/qemu
con un editor di testo, è possibile che libvirt
non riconosca la modifica. Se è presente una discrepanza tra i contenuti del file XML in /etc/libvirt/qemu
e il risultato di sudo virsh dumpxml
vm-domain-name, la VM potrebbe non funzionare correttamente.
Aggiungere l'immagine Ceph RBD creata precedentemente come voce <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>
Sostituire monitor-host con il nome host e sostituire il pool e/o il nome immagine secondo necessità. È possibile aggiungere più voci <host> per i Ceph Monitor. L'attributo dev
è il nome dispositivo logico che verrà visualizzato nella directory /dev
della VM. L'attributo bus facoltativo indica il tipo di dispositivo disco da emulare. Le impostazioni valide sono specifiche per il driver (ad esempio ide, scsi, virtio, xen, usb o sata). Per informazioni dettagliate sull'elemento <disk> e i rispettivi elementi e attributi secondari, vedere Disks(in lingua inglese).
Salvare il file.
Se nel cluster Ceph è abilitata l'autenticazione (impostazione di default), è necessario generare un segreto. Aprire l'editor desiderato e creare un file denominato secret.xml
con il contenuto seguente:
<secret ephemeral='no' private='no'> <usage type='ceph'> <name>client.libvirt secret</name> </usage> </secret>
Definire il segreto.
sudo virsh secret-define --file secret.xml <uuid of secret is output here>
Ottenere la chiave client.libvirt
e salvare la stringa chiave in un file.
ceph auth get-key client.libvirt | sudo tee client.libvirt.key
Impostare l'UUID del segreto.
sudo virsh secret-set-value --secret uuid of secret \ --base64 $(cat client.libvirt.key) && rm client.libvirt.key secret.xml
È inoltre necessario impostare manualmente il segreto aggiungendo la seguente voce <auth>
all'elemento <disk>
immesso precedentemente (sostituendo il valore uuid con il risultato dell'esempio della riga di comando di cui sopra).
sudo virsh edit libvirt-virtual-machine
Quindi, aggiungere l'elemento <auth></auth>
al file di configurazione del dominio:
... </source> <auth username='libvirt'> <secret type='ceph' uuid='9ec59067-fdbc-a6c0-03ff-df165c0587b8'/> </auth> <target ...
L'ID di esempio è libvirt
, non il nome Ceph client.libvirt
generato al passaggio 2 della Sezione 16.1, «Configurazione di Ceph». Assicurarsi di utilizzare il componente ID del nome Ceph generato. Se per qualche motivo è necessario generare di nuovo il segreto, si dovrà eseguire sudo virsh secret-undefine
uuid prima di eseguire di nuovo sudo virsh secret-set-value
.
Una volta configurata la VM per l'uso con Ceph, è possibile avviarla. Per verificare che la VM e Ceph comunichino tra loro, è possibile eseguire la procedura seguente.
Verificare che Ceph sia in esecuzione:
ceph health
Verificare che la VM sia in esecuzione:
sudo virsh list
Verificare che la VM stia comunicando con Ceph. Sostituire vm-domain-name con il nome di dominio della VM:
sudo virsh qemu-monitor-command --hmp vm-domain-name 'info block'
Verificare che il dispositivo di &target dev='hdb' bus='ide'/>
venga visualizzato in /dev
o in /proc/partitions
:
ls /dev cat /proc/partitions