introduction to libvirt

libvirtlogoNel mio ultimo post sul tema virtualizzazione ho parlato di come è possibile predisporre una macchina in modo da poter utilizzare con profitto la versione modificata di QEMU per  KVM compilando il tutto a partire dai sorgenti e di come si possono predisporre degli appositi script per rendere più semplice la gestione delle macchine virtuali, un metodo molto professionale alternativo a quello presentato per la gestione ed il deploy di un ambiente di virtualizzazione è quello di utilizzare libvirt.

Ma che cosa è libvirt? Cosa ci permette di fare? Quali tool ci vengono messi a disposizione? Come funziona?

A queste domande cercheremo di rispondere in seguito…

NB: in questo specifico post vedremo solo una overview su questo layer di gestione per  macchine virtuali, nel prossimo vedremo come passare da una configurazione basata sull’uso di QEMU standalone come presentato in questo post ad una configurazione con QEMU completamente gestito tramite le API di libvirt ed i suoi tools.

L’architettura

Libvirt è un toolkit il cui scopo è interagire con le capacità di virtalizzazione fornite dai recenti sistemi operativi, questo progetto opensource è sviluppato attorno a delle API pensate per essere stabili nel lungo periodo e poter gestire diversi hypervisor (il virtualizzatore scelto, o meglio, la tecnologia di virtualizzazione scelta) tra cui KVM, QEMU, XEN giusto per citarne alcuni.

Al suo interno sono integrate funzioni per gestire varie strategie di gestione remota, varie tecnologie di storage e vari aspetti delle macchine virtuali, fra cui la rete e i dischi, l’immagine che segue è stata presa dal sito web del progetto.

Orgaganizzazione di un nodo con libvirt

Organizzazione di un nodo con libvirt

Nella nomenclatura di libvirt col termine nodo si indica la singola macchina reale (sistema host) su cui si vogliono eseguire le macchine virtuali (sistemi guest), col termine hypervisor si indica il virtualizzatore (o meglio: la tecnologia di virtualizzazione) impiegato, col termine domain si indica il sistema virtualizzato (il guest) che si vuole eseguire sull’hypervisor scelto.

A questo punto pare chiaro qual è l’obiettivo di libvirt, vale a dire fornire un livello di gestione di domini su di un determinato nodo in maniera sicura e stabile. Il nodo può essere sia remoto che locale e ci vengono forniti tutti gli strumenti per gestire il life cycle dei domini indifferentemente dall’hypervisor utilizzato.

Sia l’organizzazione dei domini che l’organizzazione della rete vengono gestiti tramite appositi file xml opportunatamente strutturati. Stessa cosa per la gestione dello storage organizzata attorno a due concetti chiave: quello di volume, una singola unità di storage basata su device o file opportunatamente strutturati, e quello di pool, un apposito sistema in grado di gestire ed organizzare unità di storage in volumi.

La gestione della rete ci permette di organizzare la struttura della rete dal punto di vista logico completamente svincolata dal punto di vista fisico, tutto ciò che possiamo fare con switch e macchine reali possiamo farlo anche con bridge e macchine virtuali. Essa è basata essenzialmente su due concetti chiave: quello di shared physical device, ovvero un bridge contenete una delle interfacce reali sull’host in modo che il dominio appaia direttamente sulla nostra LAN, e quello di virtual network, un bridge contente solo interfacce virtuali, per fornire qualsiasi connettività alla rete è necessario impostare opportune regole di forward, in questo modo è possibile implementare politiche di filtering a livello IP e di NAT, un caso particolare di questa tipologia di rete è l’isolated networking, tipologia in cui non è fornita alcun tipo di forward e le macchine virtuali possono dialogare solo fra di loro. Col virtual networking è possibile assegnare a determinati bridge server dns e dhcp, il tutto è facilmente gestibile tramite file xml opportunatamente strutturati. Un esempio di ciò che si può fare è riassunto nell’immagine seguente (anch’essa presa dal sito web del progetto).

Rappresentazione logica di una topologia di rete virtuale

Rappresentazione logica di una topologia di rete virtuale utilizzabile con libvirt

Un programma di gestione che utilizzi libvirt può collegarsi ai vari nodi utilizzando uri opportunatamente strutturate, ad esempio l’uri qemu:///system è quella utilizzata di default per collegarsi al nodo locale, l’uri qemu+ssh://$nome_utente@$nome_host/system è utilizzabile per l’accesso remoto via tunnel ssh, etc… L’uri tuttavia cambia da virtualizzatore a virtualizzatore e, potenzialmente, da nodo a nodo. Soprattutto varia al variare della tecnologia utilizzata per il collegamento remoto (ad esempio se si usa ssh o tls etc…) ed al sistema di autenticazione utilizzato. Libvirt supporta vari linguaggi di programmazione tra cui si può citare C/C++, java, perl, python ed è disponibile su parecchi sistemi operativi.

I software disponibili

Ci sono svariate tipologie di software che utilizzano libvirt: ci sono software web based, ci sono applicazioni desktop e ci sono una quantità sempre crescente di applicazioni a riga di comando oltre a virsh, software fornito assieme alla libreria, che costituisce la management console base verso tutte le funzionalità offerte da libvirt.

Fra le applicazioni desktop meritano menzione virt-manager, una tool di gestione general purpose che ci permette di svolgere per via grafica praticamente tutte le più comuni operazioni, e virt-viewer, un tool che ci permette di agganciare la console grafica del guest tramite il protocollo VNC.

L’unica applicazione web-based degna di nota è oVirt, è pensata per gestire i domini di più nodi all’interno di un datacenter.

Esistono anche plugin per i più comuni sistema di monitoring tra cui merita sicuramente menzione nagios-virt.

Unico livecd disponibile è virt-p2v, tool che ci permette di migrare facilmente una macchina reale ad una macchina virtuale.

I tool a riga di comando invece sono numerosi:

  • virsh: in sostanza LA management console fornita con la libreria.
  • virt-install: comodo tool per configurare ed installare domini su di un nodo.
  • virt-clone: tool che permette di migrare un’immagine di una macchina virtuale ad un’altra con tutta la configurazione del dominio pre-esistente.
  • virt-image: altro comodo tool per creare l’xml di un dominio a partire da un template ed una serie di parametri passatigli.
  • virt-top: tool di monitoring che ci permette di controllare l’utilizzo di memoria, cpu e rete da parte delle macchine virtuali, praticamente applica il concetto che sta dietro al comando top alle macchine virtuali.
  • virt-convert: un tool che ci permette di convertire le virtual machine da un formato ad un altro.

Per oggi è tutto, nei prossimi giorni vedremo come configurare un host linux in modo da sfruttare le potenzialità di questa libreria e dei tools su di essa sviluppati.

Related post:

2 Comments

  1. Angelo says:

    Ciao complimenti per le informazioni che dai sul tuo sito, sono davvero utili.
    Ho un problema ho installato libvirt, e ho aggiunto il mio utente al gruppo con:

    sudo addgroup `id -un` libvirtd

    ma ogni volto che utilizzo la libreria mi chiede i permessi da root, ad esempio

    virsh start test1
    non va, mentre

    sudo virsh start test1
    va, come mai?

    Grazie. Angelo

  2. MRG says:

    Ciao e grazie per i complimenti, prima di risponderti avrei bisogno di sapere un paio di cose:
    1) Che distribuzione stai usando?
    2) Se esegui id -a fra i gruppi a cui appartiene l’utente che vuoi utilizzare compare libvirtd?