Detto questo, proviamo a configurare il nostro hypervisor KVM su un server Debian 9 .
Abilitazione delle estensioni VT-x o AMD-V
Idealmente, avrai bisogno di un'installazione pulita della tua distribuzione Linux preferita su una macchina (non una VM) che ha una CPU abbastanza moderna. La maggior parte delle moderne CPU Intel supporta le estensioni VT-x e, allo stesso modo, AMD ha le sue estensioni AMD-V. Queste estensioni sono "miglioramenti" integrati nel silicio della CPU che consentono una virtualizzazione più rapida e sicura. Devi abilitare queste estensioni dal menu BIOS/UEFI della tua scheda madre. Fare riferimento al manuale della scheda madre per ulteriori informazioni.
Se non vuoi sporcare la tua workstation Linux perfettamente funzionante, puoi utilizzare una macchina virtuale nel cloud per eseguire questi esperimenti. DigitalOcean, ad esempio, offre macchine virtuali con la virtualizzazione annidata abilitata. Ciò ti consente di eseguire VM all'interno della tua VM ospitata nel cloud (questo è noto come virtualizzazione nidificata). Ovviamente, questo sarà un modo molto inefficiente per eseguire praticamente un hypervisor, ma come esperimento andrà benissimo. Assicurati di avere almeno 4 GB di memoria e più di 2 CPU.
Dopo aver abilitato le suddette estensioni, puoi verificarlo eseguendo lscpu e cercando la voce Virtualizzazione:
$ lscpu… .
Virtualizzazione: VT-x
… .
Ora che abbiamo le estensioni abilitate, è tempo di salire ulteriormente nello stack.
Installazione di KVM e QEMU
KVM (o Kernel-Based Virtual Machine) è costituito da alcuni moduli del kernel Linux che sfrutteranno le estensioni della CPU che abbiamo abilitato in precedenza. QEMU d'altra parte consiste in una serie di programmi utente che ci forniscono capacità di emulazione. Come software autonomo QEMU può essere utilizzato per eseguire programmi da un'architettura, come ARM, su un'altra come x86_64 e viceversa. Può essere utilizzato per eseguire qualsiasi cosa, da un singolo file binario a un sistema operativo completo.
Lo useremo, ovviamente, solo per virtualizzare i sistemi operativi x86_64 su piattaforma x86_64. E per questo abbiamo bisogno di un solo pacchetto:
$ sudo apt install qemu-kvmPuoi verificare che il pacchetto abbia caricato tutti i moduli richiesti, eseguendo:
$ lsmod | grep kvmkvm_intel 200704 0
kvm 598016 1 kvm_intel
irqbypass 16384 1 kvm
Questo è tutto ciò di cui hai bisogno, in teoria. Ma presto ti renderai conto che è pratico. Le macchine virtuali sono enormemente complesse e abbiamo bisogno di un wrapper software per gestire tutte le varie richieste come networking, gestione del filesystem, ecc. in modo abbastanza automatizzato (e scalabile). Per fare ciò abbiamo bisogno della libreria/demone di virtualizzazione Libvirt.
Installazione di Libvirt
Libvirt è una parte essenziale del tuo stack di virtualizzazione. Il demone libvirtd esegue i servizi relativi alla virtualizzazione in background. Servizi che ascoltano richieste come "Crea una VM", "Distruggi una VM", "Crea una rete", ecc. E le esegue al loro interno utilizzando le utilità di base di Linux come binari qemu, iptables, ecc.
Libvirt è molto generalizzato e può essere utilizzato per gestire guest KVM, contenitori LXC e stack di virtualizzazione Xen. Per ora ci concentreremo solo su Libvirt per gli ospiti KVM. Libvirtd espone un'API che può essere utilizzata da applicazioni GUI come virt-manager o oVirt o strumenti da riga di comando come virt-install, virsh, ecc. Possiamo scrivere anche i nostri client personalizzati che utilizzano la stessa API standard. Useremo gli strumenti della riga di comando, come virsh e virt-install, in modo da mantenere le cose standardizzate.
Installiamo tutti questi strumenti:
$ apt install libvirt-clients libvirt-daemon-system virtinstAvremo anche bisogno di un altro pacchetto libguestfs-tools, per aiutarci a modificare o modificare i dischi rigidi e i filesystem della VM guest.
grande! Ora abbiamo installato l'intero stack e sappiamo come è strutturata l'architettura. Per utilizzare libvirt (e strumenti correlati) aggiungi il tuo utente ai gruppi libvirt-qemu e libvirt.
$ sudo usermod -aG libvirt$ sudo usermod -aG libvirt-qemu
Oppure esegui i comandi come utente root.
Virsh e avvio della rete predefinita
L'utilità della riga di comando virsh è qualcosa che utilizzerai molto quando gestisci le tue VM. Puoi semplicemente digitare virsh e trascinarlo nell'interfaccia della riga di comando di virsh o digitare virsh
Il primo comando virsh che utilizzeremo invocherà la rete predefinita a cui una VM può connettersi:
$ virsh net-autostart predefinito$ virsh net-start default
Questo avvierà la rete predefinita e farà in modo che venga avviata automaticamente al riavvio dell'host. Per controllare i dettagli su questa rete predefinita usa il comando:
$ virsh net-dumpxml defaultIl file xml può mostrarti la gamma di possibili indirizzi IP e il modo in cui comunicheranno con il mondo esterno. Fondamentalmente, il traffico arriverà a loro tramite un NAT e non faranno parte della rete esterna del tuo host. È possibile utilizzare Bridge Networking per esporre ogni VM alla LAN della macchina host.
Per avviare una macchina virtuale
Per avviare una macchina virtuale abbiamo bisogno di un supporto di installazione (come l'ISO di installazione per qualsiasi sistema operativo) e quante CPU e quanta memoria devono essere allocate alla VM e se ha bisogno di VNC. Questo passaggio è dove puoi davvero apprezzare un programma di installazione della GUI come virt-manager, tuttavia, lo faremo usando un comando virt-install piuttosto complesso.
Mi piace mantenere tutti i miei supporti di avvio su /var/lib/libvirt/boot e tutte le macchine virtuali e il loro disco rigido virtuale su /var/lib/libvirt/images (la posizione predefinita) questo semplifica l'organizzazione.
$ cd /var/lib/libvirt/boot$ wget http://releases.ubuntu.com/18.04.2/ubuntu-18.04.2-desktop-amd64.iso
Il comando sopra recupera l'ISO desktop di Ubuntu, puoi facilmente ottenere CentOS o qualsiasi altra distribuzione che desideri.
Per creare una nuova VM e avviarla eseguire:
$ virt-install --virt-type kvm \--nome mia VM \
--memoria 2048 --vcpus=2 \
--cdrom /var/lib/libvirt/boot/ubuntu-18.04.2-desktop-amd64.iso\
--dimensione del disco=40 \
--grafica vnc, ascolta=0.0.0.0,porta=5900 \
--noautoconsole
Il comando sopra è, infatti, complicato. Suggerisco di salvare questi comandi in file di testo ed eseguirli come script eseguibili ogni volta che crei una nuova VM. La maggior parte dei parametri come virt-type e virt-name sono piuttosto autoesplicativi. Sono solo noiosi da scrivere.
L'ultima opzione per il display VNC avvierà un server VNC e ti consentirà di accedere alla console in remoto alla tua VM, collegandoti alla porta 5900 dell'host. Apri un client VNC sul desktop e vai all'IP del tuo host KVM sulla porta 5900. Assicurati di raggiungere l'IP dell'host e non l'IP della VM. Il tuo VNC si collegherà all'uscita video della tua VM e potrai procedere con l'installazione.
Dove andare dopo??
Da qui in poi puoi provare a mettere in pausa, fermare ed eliminare le VM. È inoltre possibile modificare l'infrastruttura sottostante aggiungendo pool per l'archiviazione e configurando reti bridge. Tutti i file di configurazione, per singole VM, interfacce di rete e storage pool sono archiviati in /etc/libvirt/ e /etc/libvirt/qemu.
A volte dovrai eliminare fisicamente i file del disco rigido salvati in /lib/libvirt/images anche dopo aver rimosso la VM da libvirt. Per automatizzare ulteriormente le cose, prova a importare immagini qcow2 che la maggior parte delle distribuzioni Linux come Ubuntu e CentOS. Questi hanno il sistema operativo preinstallato al loro interno.
Conclusione
Configurarlo non è facile come configurare VirtualBox e il motivo alla base di ciò è molteplice. La maggior parte dello stack è complicata perché è progettata per essere modulare e altamente scalabile. Non fa alcuna supposizione su dove stai eseguendo la VM. L'ambiente può essere un desktop personale o un data center. Lavorare con una GUI può aiutare a ridurre in una certa misura questa complessità. Tuttavia, questi sistemi sono progettati per funzionare con un'API REST per connettersi ai sistemi di fatturazione, ai sistemi di monitoraggio e così via della tua organizzazione. Non vengono quasi mai toccati da un essere umano dopo essere stati schierati.
Detto questo, l'automazione è il nome del gioco con libvirt e qemu-kvm. Sfoglia la documentazione ufficiale e scrivi il tuo fantastico script per far girare una flotta di VM e facci sapere se hai trovato utile questo tutorial.