22 Novembre 2024

Installare Macchine Virtuali in Ambiente Linux con KVM/QEMU

GUIDA DETTAGLIATA ALL'UTILIZZO DI QEMU/KVM LINUX

Un hypervisor om questo articolo KVM di Linux, noto anche come Virtual Machine Monitor (VMM), è un software che crea e gestisce macchine virtuali (VM). Il ruolo principale di un hypervisor è permettere a più sistemi operativi di condividere un singolo hardware fisico, consentendo l’esecuzione contemporanea di diverse applicazioni e sistemi operativi su un unico server o computer.

Gli hypervisor si dividono principalmente in due categorie: di tipo 1 (bare-metal) e di tipo 2 (hosted).

Hypervisor di Tipo 1 (Bare-metal)

Gli hypervisor di tipo 1 operano direttamente sull’hardware fisico, senza necessità di un sistema operativo host. Questi hypervisor sono noti per la loro efficienza e le alte prestazioni, poiché gestiscono direttamente le risorse hardware come CPU, memoria e storage. Esempi di hypervisor di tipo 1 includono VMware vSphere/ESXi, Microsoft Hyper-V, KVM (Kernel-based Virtual Machine) e Xen. Questi hypervisor sono ampiamente utilizzati nei datacenter e nelle infrastrutture cloud per la loro capacità di gestire grandi quantità di macchine virtuali con elevata affidabilità e sicurezza.

Hypervisor di Tipo 2 (Hosted)

Gli hypervisor di tipo 2, invece, funzionano sopra un sistema operativo host. Questo significa che devono essere installati su un sistema operativo già esistente, che gestisce le risorse hardware per conto dell’hypervisor. Gli hypervisor di tipo 2 sono generalmente più facili da installare e utilizzare, ma possono essere meno efficienti rispetto ai loro omologhi di tipo 1 a causa del layer aggiuntivo del sistema operativo host. Esempi di hypervisor di tipo 2 includono Oracle VM VirtualBox, VMware Workstation, Parallels Desktop e VMware Fusion. Questi hypervisor sono spesso utilizzati per scopi di sviluppo, testing e uso personale.

Funzionamento e Vantaggi

Indipendentemente dal tipo, un hypervisor consente la creazione di ambienti isolati, chiamati macchine virtuali, ognuna delle quali può eseguire un proprio sistema operativo e applicazioni come se fosse un computer fisico indipendente. Questo isolamento migliora la sicurezza e la stabilità, poiché un problema in una VM non influisce sulle altre VM o sull’hardware fisico.

Gli hypervisor offrono numerosi vantaggi, tra cui:

  • Efficienza delle risorse: Consentono un utilizzo ottimizzato delle risorse hardware.
  • Scalabilità: Facilitano l’espansione rapida e flessibile delle capacità di calcolo.
  • Isolamento: Forniscono ambienti isolati per testare e sviluppare applicazioni senza rischio per il sistema host.
  • Facilità di gestione: Permettono la migrazione live delle VM e una gestione centralizzata delle risorse.
 

KVM LINUX

KVM (Kernel-based Virtual Machine) è una tecnologia di virtualizzazione integrata nel kernel Linux, che trasforma Linux in un hypervisor di tipo 1 (bare-metal) con prestazioni elevate delle macchine virtuali simili al sistema host al costo di 0€. KVM consente di eseguire più macchine virtuali (VM) su un singolo host fisico, ognuna delle quali può eseguire il proprio sistema operativo, come Linux, Windows, BSD, e altri.

Caratteristiche Principali

  • Integrazione nel Kernel Linux: KVM è parte integrante del kernel Linux dal 2007, il che significa che qualsiasi distribuzione Linux moderna può utilizzarlo senza la necessità di installare software aggiuntivo. Questa integrazione garantisce alte prestazioni e una stretta interazione con il sistema operativo host.
  • Supporto per la Virtualizzazione Hardware: KVM sfrutta le estensioni di virtualizzazione hardware presenti nelle moderne CPU, come Intel VT-x e AMD-V, per migliorare le prestazioni delle macchine virtuali. Questo consente un’esecuzione quasi nativa delle VM, riducendo l’overhead tipico della virtualizzazione software.
  • Flessibilità e Scalabilità: KVM può gestire un ampio numero di VM, rendendolo adatto sia per ambienti di sviluppo e testing che per grandi datacenter e infrastrutture cloud. Può essere combinato con strumenti come QEMU per aumentare la compatibilità e la funzionalità.
  • Sicurezza: Grazie al suo design, KVM offre un buon livello di isolamento tra le VM, riducendo il rischio che un problema in una VM possa influenzare le altre o il sistema host. Inoltre, supporta tecnologie di sicurezza avanzate come SELinux per migliorare ulteriormente la protezione.
  • Open Source: Essendo un progetto open source, KVM beneficia di una comunità attiva che contribuisce al suo sviluppo e miglioramento continuo. Questo garantisce una rapida adozione delle ultime innovazioni e un elevato livello di supporto.

Utilizzo e Applicazioni

KVM LINUX è ampiamente utilizzato in ambienti server e cloud, dove la virtualizzazione è essenziale per l’efficienza delle risorse e la flessibilità operativa. È una scelta popolare per implementazioni di cloud privati e pubblici, spesso utilizzato insieme a piattaforme come OpenStack. Inoltre, è impiegato in scenari di sviluppo e testing, dove la capacità di creare e gestire rapidamente VM è cruciale.

In sintesi, KVM rappresenta una soluzione potente e flessibile per la virtualizzazione su Linux, offrendo elevate prestazioni, sicurezza e scalabilità, rendendolo ideale per una vasta gamma di applicazioni e ambienti IT.

Leggi: Comandi Linux per la Gestione dei Processi

QEMU

QEMU (Quick Emulator) è un emulatore e virtualizzatore open source che permette di eseguire diversi sistemi operativi su una varietà di architetture hardware. Sviluppato inizialmente da Fabrice Bellard, QEMU è ampiamente utilizzato per la sua versatilità e capacità di emulare differenti piattaforme hardware.

Caratteristiche Principali

  • Emulazione Completa: QEMU può emulare completamente una CPU e un set di periferiche, consentendo l’esecuzione di sistemi operativi e applicazioni su architetture diverse da quella dell’hardware host. Questo lo rende utile per lo sviluppo e il testing di software su varie piattaforme.
  • Virtualizzazione Hardware: Quando combinato con KVM (Kernel-based Virtual Machine), QEMU può sfruttare le estensioni di virtualizzazione hardware presenti nelle moderne CPU, come Intel VT-x e AMD-V. Questo migliora notevolmente le prestazioni delle macchine virtuali, avvicinandole a quelle native.
  • Ampio Supporto per Architetture: QEMU supporta un’ampia gamma di architetture, tra cui x86, ARM, PowerPC, SPARC, MIPS e molte altre. Questa flessibilità lo rende ideale per testare software su diverse piattaforme hardware senza bisogno di hardware fisico corrispondente.
  • Snapshot e Migrazione Live: QEMU offre funzionalità avanzate come la creazione di snapshot delle macchine virtuali e la migrazione live, che consente di spostare una VM da un host all’altro senza interruzioni significative del servizio.
  • Open Source e Personalizzabile: Come progetto open source, QEMU beneficia di una comunità attiva che contribuisce al suo sviluppo continuo. Gli utenti possono personalizzare e estendere QEMU in base alle loro specifiche esigenze.

Utilizzo e Applicazioni

QEMU è utilizzato in molteplici contesti, tra cui:

  • Sviluppo Software: Sviluppatori e tester utilizzano QEMU per eseguire software su diverse architetture senza dover disporre dell’hardware specifico.
  • Infrastrutture di Virtualizzazione: In combinazione con KVM, QEMU è alla base di molte soluzioni di virtualizzazione in datacenter e cloud, offrendo elevate prestazioni e flessibilità.
  • Formazione e Dimostrazioni: QEMU è utile per creare ambienti di laboratorio e simulare diversi scenari di rete e sistemi operativi, facilitando l’apprendimento e le dimostrazioni.

In sintesi, QEMU è un potente strumento di emulazione e virtualizzazione che, grazie alla sua flessibilità e ampia gamma di funzionalità, è diventato un componente essenziale in numerosi ambienti di sviluppo, testing e produzione.

Leggi: Le Migliori Distribuzioni Linux leggere del 2024

Requisiti Hardware

 

KVM richiede che il processore del sistema host abbia il supporto per la virtualizzazione(VT-x per Intel e AMD-V for Amd).

LC_ALL=C.UTF-8 lscpu | grep Virtualization

Requisiti Kernel

 

Occorre che i moduli kvm kvm_amd oppure kvm_intel siano correttamente caricati nel sistema:

zgrep CONFIG_KVM= /proc/config.gz

 

Se il terminale restitusce i valori “m” oppure “y” vuol dire che i moduli sono correttamente caricati. 

Si può verificare se i moduli sono caricati automaticamente mediante il seguente comando:

lsmod | grep kvm

Dispositivi para-virtualizzati

 

Virtio-API fornisce i dispositivi virtualizzati alle macchine virtuali, interponendosi tra l’Hypervisor in questo caso il nostro sistema Linux e le macchine virtuali.

Una lista di dispositivi virtuali:

  • network (virtio-net)
  • storage (virtio-blk)
  • controller (virtio-scsi)
  • serial (virtio-serial)
  • memoria (virtio-balloon)

Possiamo testare che i moduli siano caricati correttamente con il comando seguente:

zgrep VIRTIO /proc/config.gz

Installazione

Terminata la fase di check dei requisiti necessari, possiamo iniziare con l’installazione del nostro Hypervisor.

sudo apt install qemu-system      #per Debian
sudo pacman -S qemu-full          #per Arch Linux

 

A questo punto passiamo all’installazione delle librerie libvirt:

sudo apt install libvirt-daemon-system    #Debian
sudo pacman -S libvirt                    #Arch Linux

 

Installiamo anche i pacchetti bridge-utils virt-manager:

sudo apt install bridge-utils virt-manager       #Debian
sudo pacman -S bridge-utils virt-manager         #Arch Linux

 

Possiamo installare anche dei pacchetti per le funzionalità extra come: 

  • dnsmasq:funzionalità per piccole reti di computer come DNS Caching, DHCP server e avvio tramite nerwork  
  • dmidecode: serve per reperire le informazioni dell’hardware del computer contenute nel bios
sudo apt install dnsmasq dmidecode    #Debian
sudo pacman -S dnsmasq dmidecode      #Arch Linux

Scelta Client

 

Per accedere alle macchine virtuali che andremo successivamente a creare dobbiamo scegliere un client. In questo sito useremo virsh un client da linea di comando(già compreso nel pacchetto libvirt) e la coppia virt-viewer display remoto, virt-manager gestione grafica delle macchine virtuali.

Questa è una lista dei vari client disponibili:

  • virsh – linea di comando
  • Gnome Boxes – integrata nell’ambiente gnome
  • Libvirt SandBox – strumenti sandbox
  • Virt-Viewer – client display remoto
  • Virt-Manager – cliente gestione grafico
  • Qt VirtManager – grafica Qt
  • Cockpit – gestione con Web Browser
sudo apt install virt-viewer virt-manager        #Debian
sudo pacman -S virt-manager virt-viewer          #Arch Linux

Impostazione autorizzazione

 

A questo punto occorre fornire l’autorizzazione aggiungendo l’utente al gruppo libvirt:

sudo usermod -a -G libvirt andrea
sudo id andrea   #visualizza gruppi al quale appartiene andrea

Servizi Systemd

 

Avviamo il demone libvirtd che in esecuzione lato host esegue le operazione di gestione per le macchine virtuali. E’ consigliato di abilitare il demone in modo che si avvii automaticamente senza doverlo avviare manualmente ogni volta.

sudo systemctl start libvirtd
sudo systemctl start virtlogd

sudo systemctl enable libvirtd

Testiamo libvirt

 

Usiamo il client virsh per testare il corretto funzionamento di libvirt sia a livello di sistema che a livello utente:

virsh -c qemu:///system
virsh -c qemu:///session

Creazione Gestione Macchine Virtuali KVM LINUX

Pool

Dopo aver installato e testato il corretto funzionamento del nostro ambiente Hypervisor, possiamo all’installazione e gestione delle Macchine Virtuali.

Per prima cosa andremo a creare il pool, ovvero lo spazio solitamente una cartella del nostro filesystem, dove i volumi(dischi) delle nostre Macchine Virtuali sono posizionati. 

Il primo comando andrà a definire le proprietà del pool nel seguente formato:

$ virsh pool-define-as name type [source-host] [source-path] [source-device] [source-name] [target] [–source-format format]

Leggi: Kali Linux per la Sicurezza Informatica

##Definiamo le proprietà del pool

##Se vogliamo usare una cartella 
virsh pool-define-as <nome-del-pool> dir - - - - /home/username/.local/libvirt/images

##Se vogliamo usare un filesystem
virsh pool-define-as <nome-del-pool> fs - -  /dev/vg0/images - mntpoint

 

Costruiamo il pool:

virsh pool-build <nome-del-pool>
virsh pool-start <nome-del-pool>
virsh pool-autostart <nome-del-pool>

 

Visualizzare lista pool verifica corretta creazione:

virsh pool-list --all

 

Il comando che useremo per eventualmente cancellare un pool, dopo aver cancellato anche le macchine virtuali che hanno il disco-virtuale all’interno di esso:

virsh pool-undefine <nome-del-pool>

CREARE MACCHINA VIRTUALE

Per la creazione di una Macchina Virtuale possiamo percorrere due strade.

  • usare il client testuale virt-install 
  • usare il client grafico virt-manager.

Il primo è molto efficiente ma più complesso mentre il secondo più semplice consente di procedere in modo più dettagliato.

 

VIRT-INSTALL

Con virt-install le specifiche minime sono

  • –name
  • –memory
  • lo storage (–disk, –filesystem, –nodisk)
  • metodo di installazione (generalmente .iso o CD)
##Esempio di Arch Linux

virt-install \
--name arch-linux \
--memory 1024 \
--vcpus=2,maxvcpus=4 \
--cpu host \
--cdrom $HOME/Downloads/arch-linux_install.iso \
--disk size=20,format=qcow2 \
--network user \
--virt-type kvm
# Esempio installazione Debian con NAT e spice 
virt-install \
--name debina-vm \
--ram 1024 \
--vcpus 2 \
# percorso del pool
--disk path=/home/<username>/.local/libvirt/images/debian-vm.qcow2,size=30 \
--os-variant debian11 \
--cdrom=<percorso-file-iso>
--graphics spice \
--network network=default 
##Esempio macchina virtuale Windows

virt-install \
--name windows \
--vcpus 2 \
--memory 4096 \
--cdrom /percorso/installer.iso \
--disk size=40 \
--os-variant win10 \
--network bridge=br0,model=virtio \
--graphics spice \
--video qxl \
--sound ich9 \
--accelerate \
--boot cdrom,hd \
--hvm \
--virt-type=kvm

VIRT-MANAGER

 

virt-manager consente di creare una macchina virtuale in modo grafico dettagliando le caratteristiche e facilitando l’operazione. 

IMPORTARE UNA MACCHINA VIRTUALE

Importare una macchina virtuale con virt-install è un processo semplicissimo, occorre avere l’immagine del volume e conoscere il percorso dove è salvato:

virt-install \
--name demo \
--memory 512 \
--disk /home/user/VMs/mydisk.img \
--import

GESTIONE DELLE MACCHINE VIRTUALI

Dopo aver creato una macchina virtuale KVM LINUX, occorre compiere tutte le operazioni richieste alla fine della loro gestione. Il nome di una VM viene chiamato “dominio”.

Vediamole le operazioni:

Elencare le VMs:

virsh list --all

 

Avviare una VM:

virsh start 'nome-dominio'

 

Arresta una macchina virtuale:

virsh shutdown 'nome-dominio'

#Arresto forzato
virsh destroy 'nome-dominio'

 

Cancella una macchina virtuale:

virsh undefine 'nome-dominio'

 

Poiché i volumi delle VM vengono creati con la creazione delle macchine virtuali, questo comando aggiunge un volume addizionale, elenca i volumi esistenti, li reimposta e li cancella: 

#Crea volume
virsh vol-create-as 'nome-pool' 'nome-volume' \
10GiB --format aw|bochs|raw|qcow|qcow2|vmdk

virsh vol-upload --pool 'nome-pool' 'nome-volume' \
'/directory/volume'

#Elenca la lista dei volumi esistenti
virsh vol-list 'nome-pool'

#Reimposta le dimensioni del volume
virsh vol-resize --pool 'nome-pool' 'nome-volume' 12Gib

#Cancella un volume esistente
virsh vol-delete --pool 'nome-pool' 'nome-volume'

#Visualizzare tutti i dettagli volume usando il formato Xml
virsh vol-dumpxml --pool 'nome-pool' 'nome-volume'

AVVIO AUTOMATICO VMs

 

Possiamo scegliere di avviare le VMs automaticamente non appena si avvia il daemon libvirtd :

virsh autostart 'nome-dominio'

#Disabilitare avvio automatico con libvirtd
virsh autostart 'nome-dominio' --disable

A questo punto abilitiamo l’avvio automatico del daemon libvirtd all’avvio dell’host. Ogni volta che accenderemo o riavvieremo il nostro host, anche le macchine virtuali impostate si avvieranno automaticamente. Nello stesso modo si arresteranno prima che arresteremo l’host:

sudo systemctl enable libvirt-guests.service

MODIFICARE UNA VM

 

Ogni VMs nelle libreria API di libvirt sono configurare usando il formato dei documenti XML. Questo per facilitarne la modifica e le estensioni con i futuri rilasci di aggiornamenti:

virsh edit 'nome-dominio'

SNAPSHOT

 

Avere la possibilità di effettuare delle istantanee dell VMs è funzione importantissima per preservare il lavoro effettuato e riportare la VMs ad uno stato funzionante se qualche operazione è andata storta. Gli snapshot vengono memorizzati all’intero dei volumi in formato .qcow2 o .raw:

#Creazione shapshot
virsh snapshot-create-as --domain 'nome-dominio' 'nome-snapshot'

#Elenca snapshot esistenti
virsh snapshot-list 'nome-dominio'

#Ripristina una snapshot
virsh snapshot-reverse 'nome-dominio' 'nome-snapshot'

CONNETTERSI ALLE VMs

A questo punto non ci resta che connetterci alle nostre VMs e lo possiamo fare in tre modi:

  • ssh ; preferito in quanto è lo strumento più sicuro e minimale nella gestione server.
  • virt-viewer ; accesso alle VMs graficamente
  • virt-manager ; gestione grafica completa delle VMs
#Dopo aver abilitato openssh nella VM
ssh -p 'porta ssh' nome-user@indirizzo-ip

#virt-viewer
virt-viewer --connect qemu:///session

#virt-manager
virt-manager -c qemu:///session

Siamo al termine di questa guida in cui abbiamo prima analizzato le caratteristiche di QEMU/KVM, scoprendo che all’interno del kernel Linux risiede un motore potentissimo per la virtualizzazione usato anche dai datacenter. Poi abbiamo settato il nostro sistema per poterlo usare appieno ed infine abbiamo aggiunto tutti gli strumenti che ci servivano.

Il viaggio per sfruttare le funzionalità di un Hypervisor è appena iniziato. La parte più interessante forse risiede proprio nel networking, la migrazione delle VMs, l’impostazione di reti locali bridge, nat, dns, il bonding. Ma tutto questo richiede uno spazio ulteriore ed altre guide. 

Resta sintonizzato che proveremo ad aggiungerli nel prossimo futuro 😉 

By luc

Related Post

7 commento su “Installare Macchine Virtuali in Ambiente Linux con KVM/QEMU”
    1. Salve Luigi, grazie per il tuo commento.
      Deve disintallare Qemu le consiglio prima di accedere a virt-manager ed in ambiente grafico eliminare le macchine virtuali create compresi gli storage ed i pool.
      Oppure con linea di comando nel terminale “virsh undefine ‘nome-dominio'”

      Poi in archlinux:
      sudo pacman -Rsn qemu-full
      sudo pacman -Rsn virt-viewer /se installato
      sudo pacman -Rsn virt-manager
      sudo pacman -Rsn libvirt
      Usiamo le opzioni di pacman -R(remove) -s (recursive in modo da rimuovere anche i pacchetti che dipendono dal pacchetto selezionato a meno che siano richiesti da altri pacchetti) -n (nosave non salvare i file di configurazione).
      In questo modo avrai eliminato la macchina virtuale, il disco, e tutti i programmi legati alla gestione delle macchine virtuali.
      Riguardo a KVm ricorda che non potrai mai disinstallarlo poichè fa parte del kernel linux.
      Grazie

  1. Buongiorno,
    innanzi tutto grazie per questa guida interessante e dettagliata!
    E’ proprio vero che c’è sempre da imparare…..
    Chiedo una info da inesperto del mondo Linux …… mi sto approcciando negli ultimi tempi….
    Ho installato una vm Ubuntu Server 24.04 LTS su ProxMox.
    Con il comando : sudo kvm-ok
    mi restituisce:
    INFO: /dev/kvm exists
    KVM acceleration can be used.

    Quindi sembra tutto OK, ma quando provo ad installare un container su Docker ( installato sulla vm Ubuntu ) mi dice sempre:
    “ERROR: KVM acceleration not available (device file missing), this will cause a major loss of performance”

    Mi domando e chiedo: ma questo succede perché comunque io devo prima installare qemu-kvm oppure è già installato su Ubuntu Server di default e quindi dovrebbe funzionare?

    Grazie per l’aiuto!

    Marcello

    1. Ciao Marcello,
      grazie mille per il tuo commento.
      Il messaggio che ti viene restituito fa pensare che il supporto per KVM della macchina virtuale sia apposto.
      Ora proviamo a verificare che “qemu-kvm” sia installato sulla vm ubuntu server con questo comando:
      sudo apt update
      sudo apt install qemu-kvm
      a questo punto verifica che il tuo utente faccia parte del gruppo ‘kvm’
      id $USER
      altrimenti lo inseriamo
      sudo adduser $USER kvm
      controlla i permessi del dispositivo /dev/kvm
      ls -al /dev/kvm
      dovresi avere un risultato simile a questo
      crw-rw----+ 1 root kvm 10, 232 Aug 4 09:50 /dev/kvm
      a questo punto riavvia la vm
      sudo reboot
      e riprova per vedere se il problema è stato risolto

      grazie e fammi sapere

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *