Wiki Ubuntu-it

Indice
Partecipa
FAQ
Wiki Blog
------------------
Ubuntu-it.org
Forum
Chiedi
Chat
Cerca
Planet
  • Pagina non alterabile
  • Informazioni
  • Allegati


Guida verificata con Ubuntu: 22.04 24.04 25.04 25.10

Problemi in questa pagina? Segnalali in questa discussione

Introduzione

La guide linkate nella pagina 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 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..).

    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 QEMU/KVM usando sistemi di connessione bridged come utente non root, sono necessarie alcune configurazioni.

  1. Creare il bridge sull'interfaccia di rete dell'host, come descritto nella relativa pagina.

  2. Installare il pacchetto uml-utilities che fornisce lo strumento tunctl.

  3. Per impostare i permessi al dispositivo tun aprire con i privilegi di amministrazione e un 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"
  4. Salvare e chiudere il file.
  5. 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.

  6. Aprire con i privilegi di amministrazione e un 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
  7. Salvare e chiudere il file appena modificato.

Avviare QEMU con interfaccia Bridge

  1. 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
  2. Rendere eseguibile lo script appena creato digitando in un terminale:

    chmod 0755 ~/bin/qemu-bridge
  3. 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
  4. 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
  5. 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.

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.

    Si raccomanda di configurare per gli ospiti un indirizzo IP statico.

Ulteriori risorse


CategoryVirtualizzazione