#format wiki
#LANGUAGE it
<
>
<>
<>
= Introduzione =
La guide linkate nella pagina '''[[Virtualizzazione/Kvm|KVM]]''' trattano principalmente la gestione di '''KVM''' attraverso '''libvirt'''. In questa pagina viene spiegata la gestione diretta di '''KVM''' tramite i comandi QEMU/KVM, un metodo non raccomandabile per la gestione quotidiana ma utile in alcuni casi specifici.
= Gestione diretta di KVM =
'''KVM''' è un modulo del kernel Linux che permette a [[Virtualizzazione/Qemu|QEMU]] di sfruttare le capacità di virtualizzazione hardware ''Intel VT-x/AMD-V''. L'esecuzione diretta delle macchine virtuali avviene tramite l'eseguibile `qemu-system-x86_64` (o equivalente per altre architetture) che ha sostituito il comando `kvm` nelle versioni più recenti di Ubuntu.
La sintassi di base per avviare una macchina virtuale con `qemu-system-x86_64` è:{{{
qemu-system-x86_64 -m 512 -hda disk.img -cdrom ubuntu.iso -boot d -smp 2
}}}
* '''-m''': quantità di memoria RAM in MB da allocare alla macchina virtuale.
* '''-hda''': percorso del primo disco rigido virtuale. È possibile usare vari tipi di file immagine (`.img`, `.qcow2`, ecc..).
{{{#!wiki important
L'utilizzo diretto di partizioni o dischi fisici dell'host (es. `-hda /dev/sda`) è estremamente pericoloso e può portare alla perdita di dati o alla corruzione del sistema operativo host. Si raccomanda vivamente di utilizzare file immagine per i dischi delle macchine virtuali.
}}}
* '''-cdrom''': percorso di un'immagine ISO o di un lettore CD/DVD fisico per la macchina virtuale.
* '''-boot a, c, d''' o '''n''' definiscono la sequenza di avvio:
* '''a''': avvio da floppy,
* '''c''': avvio da disco rigido,
* '''d''': avvio da CD-ROM,
* '''n''': avvio da rete.
* '''-smp''': numero di processori virtuali (CPU) da allocare alla macchina virtuale.
* '''-alt-grab''': cambia la combinazione di tasti per "afferrare" e "rilasciare" il puntatore del mouse dalla combinazione predefinita '''Ctrl-Alt''' a '''Ctrl-Alt-Shift'''. Questo può essere utile per evitare conflitti con altre scorciatoie del sistema operativo host.
Per ulteriori opzioni, digitare:{{{
qemu-system-x86_64 --help
}}}
== Dispositivi di connessione bridged ==
Prima di avviare '''[[Virtualizzazione/Qemu|QEMU]]'''/'''[[Virtualizzazione/Kvm|KVM]]''' usando sistemi di connessione ''bridged'' come utente non root, sono necessarie alcune configurazioni.
0. Creare il bridge sull'interfaccia di rete dell'host, come descritto nella [[Virtualizzazione/Kvm/Networking#bridge-sull-host|relativa pagina]].
0. [[AmministrazioneSistema/InstallareProgrammi|Installare]] il pacchetto [[apt://uml-utilities|uml-utilities]] che fornisce lo strumento '''tunctl'''.
0. Per impostare i permessi al dispositivo '''tun''' aprire con i [[AmministrazioneSistema/PrivilegiDiAmministrazione|privilegi di amministrazione]] e un [[Ufficio/EditorDiTesto|editor di testo]] il file `/etc/udev/rules.d/40-permissions.rules` e aggiungere alla fine del file la seguente riga:{{{
KERNEL=="tun", GROUP="kvm", MODE="0660"
}}}
0. Salvare e chiudere il file.
0. Per rendere effettive le modifiche alle regole di '''udev''' e permettere la creazione di interfacce '''tun''', eseguire i comandi:{{{
sudo udevadm control --reload-rules
}}}{{{
sudo udevadm trigger
}}}Se queste operazioni non risolvono, un '''riavvio''' del sistema garantisce l'applicazione di tutte le modifiche.
0. Aprire con i [[AmministrazioneSistema/PrivilegiDiAmministrazione|privilegi di amministrazione]] e un [[Ufficio/EditorDiTesto|editor di testo]] il file `/etc/kvm/kvm-ifup` (o `qemu-ifup` a seconda della configurazione di QEMU) e aggiungere `sudo` davanti al comando `brctl` se QEMU/KVM non venisse eseguito come utente root:{{{
#!
#!/bin/sh
switch=(i) == "dev") print 1" up
sudo /usr/sbin/brctl addif ${switch} $1
exit 0
}}}
0. Salvare e chiudere il file appena modificato.
=== Avviare QEMU con interfaccia Bridge ===
0. Per lanciare '''QEMU/KVM''' con un'interfaccia bridged è utile uno script ''wrapper''. È possibile inserirlo in `~/bin` e nominarlo ad esempio '''qemu-bridge''', richiamandolo direttamente con il comando `qemu-bridge`.{{{
#!
#!/usr/bin/env bash
# script per gestire l'allocazione dell'interfaccia tap.
# per kernels >= 2.6.18.
# modificato da bodhi.zazen con l'ausilio di:
# http://calamari.reverse-dns.net:980/cgi-bin/moin.cgi/FrequentlyAskedQuestions#head-2511814cb92c14dbe1480089c04f83c281117a86.
# http://ubuntuforums.org/showthread.php?t=528046.
# http://howtoforge.com/virtualization-with-kvm-on-ubuntu-9.10.
# impostazione di una interfaccia tap per qemu.
# USERID - uid sotto il quale è in esecuzione qemu.
USERID=`whoami`
# generare un indirizzo macchina casuale peril nic di qemu .
# shell script preso in prestito dall'utente pheldens @ qemu forum.
ranmac=$(echo -n DE:AD:BE:EF ; for i in `seq 1 2` ; \
do echo -n `echo ":$RANDOM$RANDOM" | cut -n -c -3` ;done)
# specificare quale NIC usare - vedere qemu.org per altri NIC.
# model=r8169.
# impostare il modello di scheda di rete.
# http://howtoforge.com/virtualization-with-kvm-on-ubuntu-9.10.
model=rtl8139
iface=`sudo tunctl -b -u $USERID`
# avviare kvm con questi parametri.
# echo "rendere visibile l'interfaccia $iface con indirizzo macchina $ranmac".
# nohup aggiunto per consentire a kvm di essere indipendente dal terminale.
nohup kvm -net nic,vlan=0,macaddr=$ranmac -net tap,vlan=0,ifname=$iface $@
# kvm è stato fermato - non usare più l'interfaccia tap.
sudo tunctl -d $iface &> /dev/null
}}}
0. Rendere eseguibile lo script appena creato digitando in un terminale:{{{
chmod 0755 ~/bin/qemu-bridge
}}}
0. Modificare '''sudoers''' per consentire ai membri del gruppo '''KVM''' di eseguire lo script '''wrapper qemu-bridge''' e gestire le interfacce di rete necessarie senza richiedere la password di superutente. Prestare attenzione, poiché l'editore visudo è sensibile agli errori di sintassi.{{{
visudo
}}}
0. Aggiungere le seguenti righe alla fine del file per autorizzare i membri del '''gruppo KVM''' a configurare una interfaccia di rete bridged virtuale:{{{
%kvm ALL=(ALL) NOPASSWD: /sbin/ip, /usr/sbin/brctl, /usr/sbin/tunctl
}}}
0. Avviare '''QEMU/KVM''' da riga di comando utilizzando lo script wrapper. Non è necessario dichiarare un'interfaccia network direttamente, poiché gestita dallo script.{{{
qemu-bridge -m 512 -hda disk.img -cdrom ubuntu.iso -boot d -smp 2
}}}
== iptables ==
Aggiungere le seguenti regole a '''iptables''' se il firewall non è gestito da '''UFW''' o altri strumenti più recenti. Si ricorda che ad esempio in Ubuntu 22.04 '''nftables''' è il framework per la gestione del firewall predefinito, ma '''iptables''' è ancora supportato.
{{{#!wiki note
Se si utilizza '''UFW''' aggiungere le seguenti regole al file `/etc/ufw/before.rules` o configurare direttamente '''UFW''' per permettere il traffico di forwarding per le interfacce bridged.
}}}
* Autorizzare i pacchetti in ingresso per l'ospite kvm:{{{
IPTABLES -A FORWARD -d $IPADDR_FROM_GUEST_OS -j ACCEPT
}}}
* Autorizzare i pacchetti in uscita da kvm:{{{
IPTABLES -A FORWARD -s $IPADDR_FROM_GUEST_OS -j ACCEPT
}}}Sostituire `$IPADDR_FROM_GUEST_OS` con l'attuale indirizzo IP dell'ospite di '''QEMU/KVM'''.
{{{#!wiki tip
Si raccomanda di configurare per gli ospiti un indirizzo IP statico.
}}}
= Ulteriori risorse =
* [[https://help.ubuntu.com/community/KVM/Directly|Documento originale]]
----
CategoryVirtualizzazione