Wiki Ubuntu-it

Indice
Partecipa
FAQ
Wiki Blog
------------------
Ubuntu-it.org
Forum
Chiedi
Chat
Cerca
Planet
  • Pagina non alterabile
  • Informazioni
  • Allegati
  • Differenze per "Virtualizzazione/Kvm/Networking"
Differenze tra le versioni 7 e 54 (in 47 versioni)
Versione 7 del 22/03/2010 11.23.10
Dimensione: 15056
Autore: FabioMarconi
Commento:
Versione 54 del 24/10/2025 09.47.20
Dimensione: 13602
Autore: jeremie2
Commento: revisione
Le cancellazioni sono segnalate in questo modo. Le aggiunte sono segnalate in questo modo.
Linea 1: Linea 1:
## page was renamed from FabioMarconi/prove6/Configurazione della rete e bridging
##title KVM Networking
[[BR]]
[[Indice(depth=2 align=right)]]
= Configurazione della rete =

Esistono pochi metodi per consentire ad una macchina virtuale l'accesso ad una rete esterna. La configurazione predefinita per la rete virtuale è "usermode networking", che utilizza il protocollo SLIRP ed il traffico viene NATtato alla rete esterna per mezzo dell'interfaccia del host. Nel caso non si desiderino accessi ai servizi di rete nella macchina virtuale, saltare il passo successivo.

Per consentire l'accesso diretto di host esterni ai servizi sulla macchina virtuale è necessario configurare un bridge. In questo modo si rende possibile la connessione di interfacce virtuali alla rete esterna attraverso l'interfaccia fisica, rendendola così simile agli host del resto della rete.

'''Importante:''' Il bridging di rete non funziona quando la scheda di rete (es. eth1, ath0) è di tipo wireless (es. ipw3945), [http://www.linuxfoundation.org/en/Net:Bridge#It_doesn.27t_work_with_my_Wireless_card.21 as most wireless device drivers do not support bridging]!

'''Importante 2:''' Una rete bridged non funziona con le impostazioni predefinie. Dal rilascio del kernel 2.6.18 nel settembre 2006, è richiesto il permesso CAP_NET_ADMIN per utilizzare TUN/TAP in rete ([https://bugs.launchpad.net/ubuntu/+source/qemu/+bug/103010 bug #103010]).

 * '''QEMU non necessita di essere suid root.''' A partire dalla versione Intrepid è possibile assegnare ai binari qemu questo permesso usando lo strumento "setcap". Innanzitutto occorre installare gli strumenti per la gestione dei permessi di Linux (`sudo apt-get install libcap2-bin`) e scegliere:
  * Metodo più sicuro (possibile solo dalla versione Lucid in poi). Ciò assegna solamente a '''specifici utenti''' la possibilità di disturbare l'intera rete. Da usarsi con cautela.
   * Assegnare a qemu il permesso '''ereditabile''' CAP_NET_ADMIN:
   {{{
sudo setcap cap_net_admin=ei /usr/bin/qemu-system-*}}}
   * Installare il modulo PAM del permesso ereditabile:
   {{{
sudo apt-get install libcap2-bin}}}
   * Consentire ad utenti specifici di avere il permesso ereditabile CAP_NET_ADMIN editando il file `/etc/security/capability.conf`:
   {{{
cap_net_admin NOME-UTENT-QUI}}}
  * Metodo meno sicuro (per le versioni precedenti a Lucid). Questo assegna a '''tutti gli utenti''' la possibilità di disturbare tutta la rete sul sistema. Da usarsi con estrema cautela.
   * Assegnare a qemu '''forzatamente''' il permesso CAP_NET_ADMIN :
   {{{
sudo setcap cap_net_admin=ep /usr/bin/qemu-system-*}}}
 * Nota che i permessi di filesystem di cui sopra verranno persi ad ogni aggiornamento di qemu, dato che l'impostazione dei permessi di filesystem non è supportata dalla gestione pacchetti di Ubuntusince setting of the file system capability is not supported by Ubuntu packaging (vedere [https://wiki.ubuntu.com/Security/FilesystemCapabilties FilesystemCapabilities] per dettagli sui blockers). Per una miglior panoramica sui permessi Linux e QEmu vedere [http://www.friedhoff.org/posixfilecaps.html quanto scritto sopra].

'''Importante 3:''' A number of people are having problems with the network bridge losing connection with the client after large amounts of data transfer (eg. during rsync) For a Hardy or Intrepid host/client see [[#virtio|below]].

'''Warning 4:''' A network bridge configured as described here will not appear in virt-manager when using a remote management session, see [[https://bugs.launchpad.net/ubuntu/+source/libvirt/+bug/520386|bug #520386]].

== Simple file sharing ==
By default, if you enable the usermode networking using the '-net user' command-line option, the guest OS will get an IP address in the 10.0.2.0/24 address space and the host OS will be reachable at 10.0.2.2.

Thus, you should be able to ssh into the host OS (at 10.0.2.2) from inside the guest OS and thus use scp to copy files back and forth.

== Creating a network bridge on the host ==

Install the bridge-utils package:
{{{
sudo apt-get install bridge-utils
}}}

We are going to change the network configuration<<FootNote(This assumes you are not using NetworkManager to control your network cards (eth0 in the example's case). If you are using NetworkManager disable it or prevent it from controlling this card. Use the configuration for your card as the network configuration of the bridge (br0 in the example).)>>. To do it properly, we should first stop networking<<FootNote(This is needed for example when you move from DHCP to static address: it will stop the DHCP client, which a restart won't do if you changed the configuration already. If you are changing this remotely, then you should prepare your new configuration into a separate file and the use a script to stop networking, put the new configuration in place and start it back.)>>:
{{{
sudo invoke-rc.d networking stop
}}}

If you are on a remote connection, and so cannot stop networking, go ahead with the following commands, and use sudo invoke-rc.d networking restart at the end. If you made a mistake, it won't come back up, though.

To setup a bridge interface, edit /etc/network/interfaces and either comment or replace the existing config with ('''replace with the values for ''your'' network'''):

{{{
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet static
        address 192.168.0.10
        network 192.168.0.0
        netmask 255.255.255.0
        broadcast 192.168.0.255
        gateway 192.168.0.1
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0


}}}

or to use DHCP

{{{
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet manual

auto br0
iface br0 inet dhcp
        bridge_ports eth0
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0

}}}

This will create a virtual interface br0.

Now restart networking:

{{{
sudo /etc/init.d/networking restart
}}}

== Configuring ubuntu-vm-builder to create bridged guests by default ==

||This is handled by giving ubuntu-vm-builder the --bridge=br0 flag in karmic.||

Virtual machines are defined in XML files; ubuntu-vm-builder, the tool we will use to create VMs, bases them on the template file /etc/vmbuilder/libvirt/libvirtxml.tmpl (before Ubuntu 8.10 /usr/share/ubuntu-vm-builder/templates/libvirt.tmpl)

Open that file, and change:

{{{
    <interface type='network'>
#format wiki
#LANGUAGE it
<<BR>>
<<Indice(depth=2)>>
<<Informazioni(forum="http://forum.ubuntu-it.org/viewtopic.php?t=371617"; rilasci="25.10 25.04 24.04 22.04")>>

= Introduzione =

Questa guida illustra i metodi per configurare l'accesso di una macchina virtuale KVM a una rete esterna. La configurazione predefinita per la rete virtuale è il '''networking in usermode (NAT)''', che utilizza il protocollo SLIRP e il traffico NAT viene instradato alla rete esterna attraverso l'interfaccia dell'host. Se non si necessita di accessi diretti ai servizi di rete sulla macchina virtuale dall'esterno, la configurazione predefinita è sufficiente.

Per consentire l'accesso diretto di host esterni ai servizi sulla macchina virtuale (ad esempio, per un server web o un servizio SSH sulla VM), è necessario configurare un bridge di rete sull'host. In questo modo si rende possibile la connessione delle interfacce virtuali alla rete esterna attraverso l'interfaccia fisica, rendendo le VM simili agli host del resto della rete fisica.

{{{#!wiki important
Il bridging di rete '''non funziona''' quando la scheda di rete fisica (es. wlan0) è di tipo wireless. La maggior parte dei driver di dispositivi wireless non supporta il bridging diretto.
}}}

{{{#!wiki note
I permessi speciali per '''qemu-system-*''' tramite setcup menzionati in vecchie guide non sono più necessari né raccomandati con le moderne configurazioni di '''libvirt''' su Ubuntu 22.04. L'accesso a '''KVM''' è gestito tramite il demone '''libvirtd'''` e l'appartenenza al gruppo '''libvirt'''.
}}}

{{{#!wiki note
Un bridge di rete configurato manualmente seguendo queste istruzioni potrebbe non essere sempre visibile automaticamente in '''virt-manager''' durante una sessione di gestione remota se non è correttamente integrato con le configurazioni di '''libvirt'''. Tuttavia, per la gestione locale, '''virt-manager''' rileverà i bridge configurati tramite '''Netplan'''.
}}}

= Condivisione file semplice =

Lo '''usermode networking''' (NAT) abilitato di default o con l'opzione da linea di comando `-net user`, permette una facile condivisione di file.

 * '''Sistema Operativo ospite''': avrà un indirizzo IP compreso fra '''10.0.2.0''' a '''10.0.2.24'''.
 * '''Sistema Operativo host''': raggiungibile all'indirizzo IP '''10.0.2.2'''.

Dovrebbe essere possibile eseguire un SSH al '''Sistema Operativo host''' (al 10.0.2.2) dall'interno del '''Sistema Operativo ospite''' e quindi usare SCP per condividere i file tra i due sistemi.

= Configurazione Libvirt per il bridge =

Una volta che il bridge '''br0''' è attivo sull'host, è possibile configurare le macchine virtuali per utilizzarlo.

== Creazione nuove VM con virt-manager ==

 0. Creando una nuova macchina virtuale tramite '''virt-manager''' (interfaccia grafica), selezionare '''Rete di tipo bridge''' nella fase di configurazione della rete.
 0. Scegliere '''br0''' dall'elenco.

== Modifica VM esistenti con virt-manager ==

 0. Selezionare la VM desiderata in '''virt-manager'''.
 0. Fare clic prima su '''Apri''' per la console e quindi sull'icona delle informazioni ('''i''') per accedere ai dettagli hardware.
 0. Selezionare l'interfaccia di rete virtuale. Cambiare il '''Source mode''' in '''Bridge''' e selezionare '''br0''' come '''Source device'''.

== Modifica VM esistenti con virsh edit ==

 0. Per utenti avanzati è possibile modificare i parametri '''XML''' della VM con il comando da [[AmministrazioneSistema/Terminale|terminale]]:{{{
virsh edit [nome_della_vm]
}}}
 0. Individuare la sezione `interface type='network'` e modificarla in `interface type='bridge'` assicurandosi che `source` punti al bridge `br0`.<<BR>>Prima:{{{
<interface type='network'>
      <mac address='52:54:00:xx:yy:zz'/>
Linea 116: Linea 58:
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
Linea 117: Linea 61:
}}}

T
o:

{{{
    <interface type='bridge'>
}}}Dopo:{{{
<interface type='bridge'>
      <mac address='52:54:00:xx:yy:zz'/>
Linea 124: Linea 65:
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
Linea 127: Linea 70:
== Generating a KVM MAC ==

If you are managing your guests via command line, the following script might be helpful to generate a randomized MAC. If you are getting an error for 'rl', install the package 'randomize-lines'.
{{{
#!/bin/sh
echo -n "54:52:00"
for i in 1 2 3; do
        echo -n ":"
        for j in 1 2; do
                for k in 0 1 2 3 4 5 6 7 8 9 A B C D E F; do
                        echo $k
                done|rl|sed -n 1p
        done|while read m; do
                echo -n $m
        done
done
echo
}}}

== Converting an existing guest ==

If you have already created VMs before, you can make them use bridged networking if you change the XML definition (in /etc/libvirt/qemu/) for the network interface, adjusting the mac address as desired from:
{{{
    <interface type='network'>
      <mac address='00:11:22:33:44:55'/>
      <source network='default'/>
    </interface>
}}}
to:
{{{
    <interface type='bridge'>
      <mac address='00:11:22:33:44:55'/>
      <source bridge='br0'/>
    </interface>
}}}
'''Note: Make sure the first octet in your MAC address is EVEN (eg. 00:)''' as MAC addresses with ODD first-bytes (eg. 01:) are reserved for multicast communication and can cause confusing problems for you. For instance, the guest will be able to receive ARP packets and reply to them, but the reply will confuse other machines. This is not a KVM issue, but just the way Ethernet works.

You do not need to restart libvirtd to reload the changes; the easiest way is to log into virsh (a command line tool to manage VMs), stop the VM, reread its configuration file, and restart the VM:

{{{
yhamon@paris:/etc/libvirt/qemu$ ls
mirror.xml networks vm2.xml
yhamon@paris:/etc/libvirt/qemu$ virsh --connect qemu:///system
Connecting to uri: qemu:///system
Welcome to virsh, the virtualization interactive terminal.

Type: 'help' for help with commands
       'quit' to quit

virsh # list
 Id Name State
----------------------------------
 10 vm2 running
 15 mirror running

virsh # shutdown mirror
Domain mirror is being shutdown

virsh # define mirror.xml
Domain mirror defined from mirror.xml

virsh # start mirror
Domain mirror started

}}}

The VM "mirror" is now using bridged networking.

== DNS and DHCP Guests ==
libvirt uses dnsmasq to hand out IP addresses to guests which are configured to use dhcp. If on your host machine, you add 192.168.122.1 (the default IP of your host in libvirt) as your first nameserver in /etc/resolv.conf, then you can do name resolution for your guests. dnsmasq is smart enough to use the other 'nameserver' entries in your /etc/resolv.conf for resolving non-libvirt addresses. For example, if your current /etc/resolv.conf is:{{{
 {{{#!wiki note
Assicurarsi che il primo ottetto nell'indirizzo '''MAC''' sia pari (es. `00:`, `02:`). Indirizzi '''MAC''' con il primo ottetto dispari (es. `01`:) sono riservati a comunicazioni '''multicast''' e possono causare problemi di rete (ad esempio, le repliche '''ARP''' possono confondere altre macchine sulla rete). È una limitazione dello standard Ethernet non un difetto di '''KVM'''. Se si modifica il '''MAC''' manualmente è consigliabile generarlo in modo casuale (vedi [[#casuale|paragrafo]]) assicurandosi che rispetti questo requisito.
}}}

<<Anchor(casuale)>>
= Generazione KVM MAC casuale =

Per generare un indirizzo '''MAC casuale''' da assegnare a una VM assicurandosi che il primo ottetto sia pari, digitare ad esempio il comando:{{{
printf '52:54:00:%02x:%02x:%02x\n' $[ RANDOM % 256 ] $[ RANDOM % 256 ] $[ RANDOM % 256 ]
}}}
Questo comando genererà un MAC address che inizia con `52:54:00` che è il prefisso standard per le schede di rete '''QEMU/KVM''' e assicura che il primo ottetto sia pari (`52`).

= DNS e DHCP ospiti =

'''Libvirt''' utilizza '''dnsmasq''' per fornire indirizzi IP agli ospiti configurati per l'utilizzo di '''DHCP'''. Seguono alcuni esempi per consentire la risoluzione dei nomi degli ospiti dalla macchina host.

Se nella macchina host viene aggiunto '''192.168.122.1''' (l'indirizzo IP predefinito per l'host nella rete NAT di '''libvirt''') come primo nameserver in `/etc/resolv.conf` è possibile risolvere il nome degli ospiti. '''Dnsmasq''' è in grado di utilizzare altri nameserver in `/etc/resolv.conf` per risolvere indirizzi ''non-libvirt''.<<BR>>
Ad esempio se attualmente `/etc/resolv.conf` è:{{{
Linea 200: Linea 91:

Change this to be:{{{
modificandolo può diventare:{{{
Linea 206: Linea 96:

Now, if you have a virtual machine named 'hardy-amd64', after starting it, you can do: {{{
$ host hardy-amd64
hardy-amd64 has address <IP address given by dnsmasq>
}}}

Note that when using ssh you may need to use a trailing '.' after the hostname:{{{
$ ssh hardy-amd64.
}}}

Finally, for this to work, your guest must send its hostname as part of the dhcp request. This is done automatically on many operating systems. For systems that do not send this automatically and use dhcp3, you can adjust the dhclient.conf file. For example, on Ubuntu 6.06 LTS (Dapper), adjust /etc/dhcp3/dhclient.conf to have:{{{
send host-name "<your guest hostname here>";
}}}

'''IMPORTANT:''' Depending on your network configuration, your host's /etc/resolv.conf file might be periodically overwritten. You will have to either adjust the dhcp server on your network to hand out the additional libvirt name server for your libvirt hosts, or adjust each host machine accordingly. As there are many possible configurations for host machines, user's are encouraged to look at {{{resolvconf}}} and/or {{{man interfaces}}}.

== Booting Over the Network Using PXE ==

The current Ubuntu release does not ship pxe binary ROM images because the source code is not included to recreate the images in the upstream tarball. There may be a way to automate the creation of these files as part of the package. In order to use boot -n, you will need to download or create the appropriate ROM images from [[http://etherboot.org]]

KVM and QEMU can emulate a number of network cards. Here is the current ROM files

|| 'KVM Name' ''nic,model='' |||| 'Etherboot Identification' |||| 'Etherboot Filename' |||| 'KVM filename' ||
|| i82551 |||| |||| |||| pxe-i82551.bin||
|| i82557b |||| |||| |||| pxe-i82557b.bin ||
|| i82559er |||| |||| |||| pxe-i82559er.bin ||
|| ne2k_pci (default) |||| ns8390:rtl8029 -- [10ec,8029] |||| gpxe-0.9.3-rtl8029.rom |||| pxe-ne2k_pci.bin ||
|| ne2k_isa |||| |||| |||| pxe-ne2k_isa.bin ||
|| pcnet |||| |||| |||| pxe-pcnet.bin ||
|| rtl8139 |||| |||| |||| pxe-rtl8139.bin ||
|| e1000 |||| ((e1000:e1000-0x1026 -- [8086,1026])) |||| gpxe-0.9.3-e1000-0x1026.rom |||| pxe-e1000.bin ||
|| smc91c111 |||| |||| |||| pxe-smc91c111.bin ||
|| lance |||| |||| |||| pxe-lance.bin ||
|| mcf_fec |||| |||| |||| pxe-mcf_fec.bin ||

Copy the respective file to /usr/share/kvm and/or /usr/share/qemu.
Se il nome della macchina virtuale è '''hardy-amd64''', dopo l'avvio è possibile fare:{{{
host hardy-amd64
}}}che dovrebbe restituire l'indirizzo IP assegnato da '''dnsmasq'''. Notare che usando ssh potrebbe essere necessario aggiungere un punto finale dopo il nome dell'host:{{{
ssh hardy-amd64
}}}
Perché tutto funzioni l'ospite deve inviare il proprio hostname come parte della richiesta DHCP. Su molti sistemi operativi ciò avviene automaticamente. Ove ciò non avviene è possibile configurare il client DHCP dell'ospite. Ad esempio con '''dhclient''' è possibile impostare il file `dhclient.conf` (`/etc/dhcp/dhclient.conf` oppure `/etc/dhcp3/dhclient.conf` su sistemi più vecchi) per avere:{{{
send host-name "<hostname_dell_ospite>";
}}}

{{{#!wiki note
A seconda della configurazione di rete dell'host (specialmente con '''!NetworkManager''' o '''systemd-resolved'''), il file `/etc/resolv.conf` dell'host potrebbe essere periodicamente sovrascritto. È necessario impostare il server DHCP della rete per fornire il nome server aggiuntivo per gli host di '''libvirt''' oppure configurare `systemd-resolved` (su sistemi moderni) o `resolvconf` per mantenere l'impostazione.
}}}

= Avvio da rete con PXE =

L'avvio '''P'''reboot E'''x'''ecution '''E'''nvironment (PXE) permette alle macchine virtuali di avviarsi da una rete invece che da un disco locale o ISO.

'''KVM''' e '''[[Virtualizzazione/Qemu|QEMU]]''' possono emulare varie schede di rete e supportano l'avvio PXE. Per abilitare l'avvio PXE per una VM:

 0. assicurarsi che l'emulazione della scheda di rete sia compatibile con PXE. Molti modelli moderni ('''e1000''', '''virtio''', '''rtl8139''') supportano PXE.
 0. Configurare il server '''DHCP/PXE''' sulla rete. Un server DHCP sulla stessa rete del bridge '''br0''' (o della rete NAT se configurata) deve essere configurato per fornire i file di boot PXE.
 0. Abilitare l'avvio PXE nella configurazione della VM. Tramite '''virt-manager''' durante la creazione o la modifica di una VM è possibile configurare l'ordine di boot e selezionare '''Network boot (PXE)'''.<<BR>>Se si modifica il file XML della VM tramite '''virsh edit''', la sezione di boot dovrebbe includere `order='network'` per l'interfaccia desiderata:{{{
<os>
    <type arch='x86_64' machine='pc-q35-6.2'>hvm</type>
    <boot dev='network'/> <!-- Abilita l'avvio da rete -->
    <boot dev='hd'/>
</os>
}}} Oppure, per un controllo più granulare sull'interfaccia specifica:{{{
<interface type='bridge'>
    <mac address='52:54:00:xx:yy:zz'/>
    <source bridge='br0'/>
    <model type='e1000'/>
    <boot order='1'/> <!-- imposta questa interfaccia come prima per il boot -->
</interface>
<interface type='bridge'>
    ...
    <boot order='2'/>
</interface>
}}}

 {{{#!wiki note
L'elenco dei file ROM di '''Etherboot''' per specifici modelli di schede di rete (''pxe-i82551.bin'', ecc.) è una pratica più vecchia, spesso associata a '''QEMU''' standalone. Con '''libvirt''' l'avvio PXE è gestito più ad alto livello e non richiede la manipolazione manuale di questi file ROM nella maggior parte dei casi. '''libvirt''' si occupa dell'integrazione con il firmware virtuale ('''SeaBIOS''' o '''OVMF''') che gestisce l'avvio di rete.
}}}
Linea 244: Linea 141:
== Use virtio for Ubuntu Hardy/Intrepid or Windows guests ==

For Windows guests follow [[http://www.linux-kvm.com/content/tip-how-setup-windows-guest-paravirtual-network-drivers|this]] instruction.

You may find the performances of the network relatively poor (approx. 100/120mbits on my servers, which are quite fast). If you are running Ubuntu Hardy or Intrepid, you can enable virtio. Go to the definition file of your VM, and add the virtio line to the definition of your network interface:

{{{
    <interface type='bridge'>
      <mac address='52:54:00:a0:41:92'/>
= Virtio per prestazioni rete ottimali =

Per ottenere le migliori prestazioni di rete all'interno delle macchine virtuali è fortemente raccomandato l'utilizzo dei driver para-virtualizzati '''Virtio'''. Questi driver riducono il sovraccarico di emulazione hardware e aumentano significativamente la velocità migliorando le prestazioni della rete di un fattore significativo (spesso 10x o più) e correggendo i problemi di perdita di connessione o lentezza che potevano verificarsi con le emulazioni hardware complete.

 * '''Per ospiti Linux''': i kernel Linux moderni (da Ubuntu 8.04 in poi) hanno i driver '''Virtio''' già integrati. L'abilitazione di '''Virtio''' nella configurazione della VM è sufficiente.
 * '''Per ospiti Windows''': è necessario installare i '''Virtio-drivers''' all'interno della macchina virtuale Windows. Questi driver sono solitamente forniti come un'immagine ISO scaricabile (spesso chiamata `virtio-win.iso`) da siti come '''Fedora Koji'''. Dopo aver avviato la VM Windows occorre montare la ISO e installare i driver appropriati.

== Abilitare Virtio in una VM ==

 * '''Tramite virt-manager''': modificare i dettagli hardware della VM, selezionare l'interfaccia di rete e cambiare il '''Model device''' (o '''Tipo di modello''') in '''virtio'''.
 * '''Tramite virsh edit''': modificare il file XML della VM e aggiungere o modificare la linea `<model type='virtio'/>` all'interno della sezione dell'interfaccia di rete:{{{
<interface type='bridge'>
      <mac address='52:54:00:xx:yy:zz'/>
Linea 254: Linea 155:
      <model type='virtio'/>   <-- add this line, leave the rest       <model type='virtio'/> <!-- Aggiungere o modificare questa linea -->
Linea 256: Linea 157:
}}}

Or, if you're using KVM on the command line, add the options:
{{{
-net nic,model=virtio -net user
}}}

This improves the network performances by a lot (factor 10, nearly). But this works only with Ubuntu Hardy or Intrepid guests for the moment, which is why it is not by default.

Note that this also corrects the issue some are reporting with their network connections going away after a period of time or data transfer.

== Using multiple nics with multiple subnets i.e. vlans ==

You may experience some KVM host connectivity issues when using multiple nics, each on their own subnet/vlan (multiple default routes?). In my case SSH logins (to the KVM host) would take a long time and connectivity would be cut when I restarted the network interfaces making ssh sessions and virt-manager connections crash.

I needed multiple nics, each to be on a separate subnet (vlan). Each nic is then dedicated to a specific VM on the KVM host. The VM's then connect directly to the network using a bridge device.

I never experienced problems with KVM guest connectivity. Only the KVM Host.

I fixed the problem using the following configuration in /etc/network/interfaces on the KVM host. Please note the use of "manual" and "metric". YMMV. :D

Note: first make sure that the guestOS loads the right network drivers, this worked for me: remove network modules 8139cp and 8139too , then modprobe 8139cp

{{{
# This file describes the network interfaces available on your system
# and how to activate them. For more information, see interfaces(5).

# The loopback network interface
auto lo
iface lo inet loopback

auto eth0
iface eth0 inet dhcp
 metric 0
###################

auto eth1
iface eth1 inet manual

auto br1
iface br1 inet dhcp
        bridge_ports eth1
 bridge_stp off
 bridge_fd 0
 bridge_maxwait 0
 metric 1
###################

auto eth2
iface eth2 inet manual
 
auto br2
iface br2 inet dhcp
        bridge_ports eth2
        bridge_stp off
        bridge_fd 0
        bridge_maxwait 0
 metric 1
###################

# add more ethN and brN as needed
}}}

<<Include(KVM/Header)>>
}}}Oppure, se si gestisce KVM da linea di comando senza '''libvirt''', l'opzione QEMU è:{{{
-net nic,model=virtio ...
}}}

= NIC multipli con sottoreti/VLAN multiple =

È possibile configurare più interfacce di rete virtuali per una VM connettendo ciascuna a sottoreti o VLAN separate sull'host. Questo è utile per scenari complessi come router virtuali, firewall o host con servizi su reti isolate.<<BR>>
Se si necessitano più NIC, ciascuno deve essere su una sottorete separata (o VLAN). Ogni NIC viene quindi dedicato a una specifica VM o configurazione di rete sull'host '''KVM'''. La VM viene connessa alla rete utilizzando un dispositivo bridge.

I problemi di connettività dell'host '''KVM''' menzionati in passato (come lentezza nelle autenticazioni SSH o cadute di connessione) erano spesso legati a configurazioni errate di routing multiplo o di bridge. Con '''Netplan''' e una configurazione corretta questi problemi sono meno comuni.<<BR>>
Segue quindi un esempio di configurazione tramite '''Netplan''' per NIC multipli con bridge.

Assumendo di avere due interfacce fisiche '''enp0s31f6''' e '''enp0s31f7''' che si desidera dedicare a bridge separati '''br0''' e '''br1''':{{{
network:
  ethernets:
    enp0s31f6:
      dhcp4: no
      dhcp6: no
    enp0s31f7:
      dhcp4: no
      dhcp6: no
  bridges:
    br0:
      interfaces: [enp0s31f6]
      dhcp4: yes # Questo bridge otterrà un IP per l'host e le VM su questa rete
      parameters:
        stp: true
        forward-delay: 0
    br1:
      interfaces: [enp0s31f7]
      dhcp4: no # Questo bridge potrebbe non necessitare di un IP sull'host, solo per le VM
      parameters:
        stp: true
        forward-delay: 0
  version: 2
}}}

In questo esempio '''br0''' potrebbe essere utilizzato per la rete principale dell'host e alcune VM, mentre '''br1''' potrebbe essere dedicato esclusivamente a VM specifiche o a una sottorete isolata. Le metriche di routing predefinite di '''Netplan''' dovrebbero gestire correttamente l'instradamento se l'host necessita di accedere a entrambe le reti.

{{{#!wiki tip
Assicurarsi che il Sistema Operativo ospite carichi i giusti driver di rete (preferibilmente '''Virtio''').
}}}

= Ulteriori risorse =

 * [[https://help.ubuntu.com/community/KVM/Networking|Documento originale su wiki Ubuntu internazionate]]
 * [[https://libvirt.org/|Sito ufficiale di Libvirt]]
 * [[https://qemu.org/|Sito ufficiale di QEMU]]
 * [[https://netplan.io/|Sito ufficiale di Netplan]]
Linea 321: Linea 208:
----
CategoryHomepage CategoryInTraduzione
CategoryVirtualizzazione


Guida verificata con Ubuntu: 22.04 24.04 25.04 25.10

Problemi in questa pagina? Segnalali in questa discussione

Introduzione

Questa guida illustra i metodi per configurare l'accesso di una macchina virtuale KVM a una rete esterna. La configurazione predefinita per la rete virtuale è il networking in usermode (NAT), che utilizza il protocollo SLIRP e il traffico NAT viene instradato alla rete esterna attraverso l'interfaccia dell'host. Se non si necessita di accessi diretti ai servizi di rete sulla macchina virtuale dall'esterno, la configurazione predefinita è sufficiente.

Per consentire l'accesso diretto di host esterni ai servizi sulla macchina virtuale (ad esempio, per un server web o un servizio SSH sulla VM), è necessario configurare un bridge di rete sull'host. In questo modo si rende possibile la connessione delle interfacce virtuali alla rete esterna attraverso l'interfaccia fisica, rendendo le VM simili agli host del resto della rete fisica.

Il bridging di rete non funziona quando la scheda di rete fisica (es. wlan0) è di tipo wireless. La maggior parte dei driver di dispositivi wireless non supporta il bridging diretto.

I permessi speciali per qemu-system-* tramite setcup menzionati in vecchie guide non sono più necessari né raccomandati con le moderne configurazioni di libvirt su Ubuntu 22.04. L'accesso a KVM è gestito tramite il demone libvirtd` e l'appartenenza al gruppo libvirt.

Un bridge di rete configurato manualmente seguendo queste istruzioni potrebbe non essere sempre visibile automaticamente in virt-manager durante una sessione di gestione remota se non è correttamente integrato con le configurazioni di libvirt. Tuttavia, per la gestione locale, virt-manager rileverà i bridge configurati tramite Netplan.

Condivisione file semplice

Lo usermode networking (NAT) abilitato di default o con l'opzione da linea di comando -net user, permette una facile condivisione di file.

  • Sistema Operativo ospite: avrà un indirizzo IP compreso fra 10.0.2.0 a 10.0.2.24.

  • Sistema Operativo host: raggiungibile all'indirizzo IP 10.0.2.2.

Dovrebbe essere possibile eseguire un SSH al Sistema Operativo host (al 10.0.2.2) dall'interno del Sistema Operativo ospite e quindi usare SCP per condividere i file tra i due sistemi.

Configurazione Libvirt per il bridge

Una volta che il bridge br0 è attivo sull'host, è possibile configurare le macchine virtuali per utilizzarlo.

Creazione nuove VM con virt-manager

  1. Creando una nuova macchina virtuale tramite virt-manager (interfaccia grafica), selezionare Rete di tipo bridge nella fase di configurazione della rete.

  2. Scegliere br0 dall'elenco.

Modifica VM esistenti con virt-manager

  1. Selezionare la VM desiderata in virt-manager.

  2. Fare clic prima su Apri per la console e quindi sull'icona delle informazioni (i) per accedere ai dettagli hardware.

  3. Selezionare l'interfaccia di rete virtuale. Cambiare il Source mode in Bridge e selezionare br0 come Source device.

Modifica VM esistenti con virsh edit

  1. Per utenti avanzati è possibile modificare i parametri XML della VM con il comando da terminale:

    virsh edit [nome_della_vm]
  2. Individuare la sezione interface type='network' e modificarla in interface type='bridge' assicurandosi che source punti al bridge br0.
    Prima:

    <interface type='network'>
          <mac address='52:54:00:xx:yy:zz'/>
          <source network='default'/>
          <model type='virtio'/>
          <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
        </interface>

    Dopo:

    <interface type='bridge'>
          <mac address='52:54:00:xx:yy:zz'/>
          <source bridge='br0'/>
          <model type='virtio'/>
          <address type='pci' domain='0x0000' bus='0x01' slot='0x00' function='0x0'/>
        </interface>

    Assicurarsi che il primo ottetto nell'indirizzo MAC sia pari (es. 00:, 02:). Indirizzi MAC con il primo ottetto dispari (es. 01:) sono riservati a comunicazioni multicast e possono causare problemi di rete (ad esempio, le repliche ARP possono confondere altre macchine sulla rete). È una limitazione dello standard Ethernet non un difetto di KVM. Se si modifica il MAC manualmente è consigliabile generarlo in modo casuale (vedi paragrafo) assicurandosi che rispetti questo requisito.

Generazione KVM MAC casuale

Per generare un indirizzo MAC casuale da assegnare a una VM assicurandosi che il primo ottetto sia pari, digitare ad esempio il comando:

printf '52:54:00:%02x:%02x:%02x\n' $[ RANDOM % 256 ] $[ RANDOM % 256 ] $[ RANDOM % 256 ]

Questo comando genererà un MAC address che inizia con 52:54:00 che è il prefisso standard per le schede di rete QEMU/KVM e assicura che il primo ottetto sia pari (52).

DNS e DHCP ospiti

Libvirt utilizza dnsmasq per fornire indirizzi IP agli ospiti configurati per l'utilizzo di DHCP. Seguono alcuni esempi per consentire la risoluzione dei nomi degli ospiti dalla macchina host.

Se nella macchina host viene aggiunto 192.168.122.1 (l'indirizzo IP predefinito per l'host nella rete NAT di libvirt) come primo nameserver in /etc/resolv.conf è possibile risolvere il nome degli ospiti. Dnsmasq è in grado di utilizzare altri nameserver in /etc/resolv.conf per risolvere indirizzi non-libvirt.
Ad esempio se attualmente /etc/resolv.conf è:

search example.com
nameserver 10.0.0.1

modificandolo può diventare:

search example.com
nameserver 192.168.122.1
nameserver 10.0.0.1

Se il nome della macchina virtuale è hardy-amd64, dopo l'avvio è possibile fare:

host hardy-amd64

che dovrebbe restituire l'indirizzo IP assegnato da dnsmasq. Notare che usando ssh potrebbe essere necessario aggiungere un punto finale dopo il nome dell'host:

ssh hardy-amd64

Perché tutto funzioni l'ospite deve inviare il proprio hostname come parte della richiesta DHCP. Su molti sistemi operativi ciò avviene automaticamente. Ove ciò non avviene è possibile configurare il client DHCP dell'ospite. Ad esempio con dhclient è possibile impostare il file dhclient.conf (/etc/dhcp/dhclient.conf oppure /etc/dhcp3/dhclient.conf su sistemi più vecchi) per avere:

send host-name "<hostname_dell_ospite>";

A seconda della configurazione di rete dell'host (specialmente con NetworkManager o systemd-resolved), il file /etc/resolv.conf dell'host potrebbe essere periodicamente sovrascritto. È necessario impostare il server DHCP della rete per fornire il nome server aggiuntivo per gli host di libvirt oppure configurare systemd-resolved (su sistemi moderni) o resolvconf per mantenere l'impostazione.

Avvio da rete con PXE

L'avvio Preboot Execution Environment (PXE) permette alle macchine virtuali di avviarsi da una rete invece che da un disco locale o ISO.

KVM e QEMU possono emulare varie schede di rete e supportano l'avvio PXE. Per abilitare l'avvio PXE per una VM:

  1. assicurarsi che l'emulazione della scheda di rete sia compatibile con PXE. Molti modelli moderni (e1000, virtio, rtl8139) supportano PXE.

  2. Configurare il server DHCP/PXE sulla rete. Un server DHCP sulla stessa rete del bridge br0 (o della rete NAT se configurata) deve essere configurato per fornire i file di boot PXE.

  3. Abilitare l'avvio PXE nella configurazione della VM. Tramite virt-manager durante la creazione o la modifica di una VM è possibile configurare l'ordine di boot e selezionare Network boot (PXE).
    Se si modifica il file XML della VM tramite virsh edit, la sezione di boot dovrebbe includere order='network' per l'interfaccia desiderata:

    <os>
        <type arch='x86_64' machine='pc-q35-6.2'>hvm</type>
        <boot dev='network'/>  <!-- Abilita l'avvio da rete -->
        <boot dev='hd'/>
    </os>

    Oppure, per un controllo più granulare sull'interfaccia specifica:

    <interface type='bridge'>
        <mac address='52:54:00:xx:yy:zz'/>
        <source bridge='br0'/>
        <model type='e1000'/>
        <boot order='1'/> <!-- imposta questa interfaccia come prima per il boot -->
    </interface>
    <interface type='bridge'>
        ...
        <boot order='2'/>
    </interface>

    L'elenco dei file ROM di Etherboot per specifici modelli di schede di rete (pxe-i82551.bin, ecc.) è una pratica più vecchia, spesso associata a QEMU standalone. Con libvirt l'avvio PXE è gestito più ad alto livello e non richiede la manipolazione manuale di questi file ROM nella maggior parte dei casi. libvirt si occupa dell'integrazione con il firmware virtuale (SeaBIOS o OVMF) che gestisce l'avvio di rete.

Virtio per prestazioni rete ottimali

Per ottenere le migliori prestazioni di rete all'interno delle macchine virtuali è fortemente raccomandato l'utilizzo dei driver para-virtualizzati Virtio. Questi driver riducono il sovraccarico di emulazione hardware e aumentano significativamente la velocità migliorando le prestazioni della rete di un fattore significativo (spesso 10x o più) e correggendo i problemi di perdita di connessione o lentezza che potevano verificarsi con le emulazioni hardware complete.

  • Per ospiti Linux: i kernel Linux moderni (da Ubuntu 8.04 in poi) hanno i driver Virtio già integrati. L'abilitazione di Virtio nella configurazione della VM è sufficiente.

  • Per ospiti Windows: è necessario installare i Virtio-drivers all'interno della macchina virtuale Windows. Questi driver sono solitamente forniti come un'immagine ISO scaricabile (spesso chiamata virtio-win.iso) da siti come Fedora Koji. Dopo aver avviato la VM Windows occorre montare la ISO e installare i driver appropriati.

Abilitare Virtio in una VM

  • Tramite virt-manager: modificare i dettagli hardware della VM, selezionare l'interfaccia di rete e cambiare il Model device (o Tipo di modello) in virtio.

  • Tramite virsh edit: modificare il file XML della VM e aggiungere o modificare la linea <model type='virtio'/> all'interno della sezione dell'interfaccia di rete:

    <interface type='bridge'>
          <mac address='52:54:00:xx:yy:zz'/>
          <source bridge='br0'/>
          <model type='virtio'/> <!-- Aggiungere o modificare questa linea -->
        </interface>

    Oppure, se si gestisce KVM da linea di comando senza libvirt, l'opzione QEMU è:

    -net nic,model=virtio ...

NIC multipli con sottoreti/VLAN multiple

È possibile configurare più interfacce di rete virtuali per una VM connettendo ciascuna a sottoreti o VLAN separate sull'host. Questo è utile per scenari complessi come router virtuali, firewall o host con servizi su reti isolate.
Se si necessitano più NIC, ciascuno deve essere su una sottorete separata (o VLAN). Ogni NIC viene quindi dedicato a una specifica VM o configurazione di rete sull'host KVM. La VM viene connessa alla rete utilizzando un dispositivo bridge.

I problemi di connettività dell'host KVM menzionati in passato (come lentezza nelle autenticazioni SSH o cadute di connessione) erano spesso legati a configurazioni errate di routing multiplo o di bridge. Con Netplan e una configurazione corretta questi problemi sono meno comuni.
Segue quindi un esempio di configurazione tramite Netplan per NIC multipli con bridge.

Assumendo di avere due interfacce fisiche enp0s31f6 e enp0s31f7 che si desidera dedicare a bridge separati br0 e br1:

network:
  ethernets:
    enp0s31f6:
      dhcp4: no
      dhcp6: no
    enp0s31f7:
      dhcp4: no
      dhcp6: no
  bridges:
    br0:
      interfaces: [enp0s31f6]
      dhcp4: yes # Questo bridge otterrà un IP per l'host e le VM su questa rete
      parameters:
        stp: true
        forward-delay: 0
    br1:
      interfaces: [enp0s31f7]
      dhcp4: no # Questo bridge potrebbe non necessitare di un IP sull'host, solo per le VM
      parameters:
        stp: true
        forward-delay: 0
  version: 2

In questo esempio br0 potrebbe essere utilizzato per la rete principale dell'host e alcune VM, mentre br1 potrebbe essere dedicato esclusivamente a VM specifiche o a una sottorete isolata. Le metriche di routing predefinite di Netplan dovrebbero gestire correttamente l'instradamento se l'host necessita di accedere a entrambe le reti.

Assicurarsi che il Sistema Operativo ospite carichi i giusti driver di rete (preferibilmente Virtio).

Ulteriori risorse


CategoryVirtualizzazione