Preliminari
Questo seguito ha funzionato per me per Ubuntu 12.04. Dovresti disabilitare il firewall del tuo computer mentre lo collaudi in modo che non interferisca.
Il file / etc / default / qemu-kvm dovrebbe essere come installato originariamente.
Sarà necessario disporre di bridge-utils qemu-kvm e libvirt-bin installati. Tutti gli utenti che utilizzano macchine virtuali dovrebbero essere aggiunti al gruppo libvirtd.
Sembra che non ci sia più alcuna necessità di aggiungere la funzionalità CAP_NET_ADMIN.
Configurazione di rete
La modalità di rete predefinita è la modalità Utente, chiamata anche SLIRP. Utilizza un bridge virbr0 predefinito che è NAT instradato al computer guest. Il routing NAT utilizza la funzione ip_forwarding del kernel e iptables . La modalità bridge utilizza un bridge virtuale nel guest a cui si connette l'interfaccia Ethernet (non numerata) e su cui sia l'host che il guest hanno le loro interfacce di rete.
I seguenti diagrammi possono rendere più chiare le differenze:
Puoi vedere come viene definita la rete utente predefinita con:
virsh net-dumpxml default
Posso impostare la modalità ponte con i seguenti approcci:
In / etc / network / interfaces (dalla parte ponte del post che menzioni nella tua domanda):
auto lo
iface lo inet loopback
#auto eth0
#iface eth0 inet dhcp
auto eth0
iface eth0 inet manual
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
riavviare; e assicurarsi che la rete wireless non sia attiva. Controllare la route IP predefinita con ip route
. Deve utilizzare l'interfaccia br0.
NB Se la tua Ethernet non è collegata quando viene apportata questa modifica, devi avere il cavo Ethernet collegato e ottenere un vettore o l'avvio si bloccherà per due minuti e non avrai la capacità di rete Questo perché l'interfaccia eth0, da trovandosi in questo file, deve apparire prima che l'avvio possa procedere normalmente.
NB In genere non è possibile utilizzare una rete wireless invece di eth0 a causa della loro incapacità di utilizzare più indirizzi MAC (deduco che ne abbia bisogno di una seconda per il bridge).
In alternativa è possibile disabilitare l'uso di Ethernet e assicurarsi che non abbia un indirizzo IP e che non sia impostato un percorso predefinito ip route
. Poi:
sudo ifconfig eth0 0.0.0.0 up
sudo brctl addbr br0
sudo brctl addif br0 eth0
sudo ifconfig br0 up
sudo dhclient br0 &
È inoltre possibile fornire un indirizzo IP statico qui, oltre a definire la route e l'indirizzo DNS predefiniti. Per questo esempio dhclient
fa questo.
Ecco la mia tabella di percorso:
$ route list ip
impostazione predefinita tramite 192.168.1.1 dev br0 metrica 100
169.254.0.0/16 dev br0 scope link metric 1000
192.168.1.0/24 dev br0 proto kernel scope link src 192.168.1.45
192.168.122.0/24 dev virbr0 proto kernel scope link src 192.168.122.1
Usando kvm
Posso quindi avviare una macchina kvm con bridge con:
$ sudo kvm -name Quantal -m 1024 -hda foo.qcow2 --soundhw ac97 -device virtio-net,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0
Il -netdev tap
parametro rende sudo un requisito. All'avvio della VM qemu-kvm esegue i seguenti comandi:
ifconfig vnet0 0.0.0.0 in su
brctl addif brctl addif br0 vnet0
Questo viene fatto da / etc / qemu-ifup
L'interfaccia vnet0 della VM viene aggiunta al bridge br0 perché la route predefinita sopra utilizza quell'interfaccia bridge. Se non ci fosse, invece, l'interfaccia tap sarebbe aggiunta all'interfaccia virbr0. Dato che non è connesso a Internet, nei miei esperimenti NAT verrebbe utilizzato per connettere l'ospite all'host e a Internet. Puoi indirizzare la vnet0 verso un bridge particolare in / etc / default / qemu-kvm. Utilizzando virt-manager di seguito è possibile indirizzare esplicitamente a quale bridge connettersi.
A causa dei comandi precedenti emessi da qemu-kvm e dal -netdev tap,id=tunnel,ifname=vnet0
parametro, la macchina virtuale vm è connessa al tunnel vnet0 e il tunnel è collegato al ponte br0.
Ora posso accedere direttamente a questo guest VM da un altro computer sulla mia rete.
Il mio host ifconfig
(notare l'interfaccia vnet0 che appare sulla mia rete quando la VM è in esecuzione):
$ ifconfig
br0 Link encap: Ethernet HWaddr 00: 1e: 33: 88: 07: e5
inet addr: 192.168.1.45 Bcast: 255.255.255.255 Maschera: 255.255.255.0
inet6 addr: fe80 :: 21e: 33ff: fe88: 7e5 / 64 Ambito: collegamento
UP BROADCAST RUNNING MULTICAST MTU: 1500 Sistema metrico: 1
Pacchetti RX: 6526 errori: 0 rilasciati: 0 sovraccarichi: 0 frame: 0
Pacchetti TX: 7543 errori: 0 rilasciati: 0 sovraccarichi: 0 portante: 0
collisioni: 0 txqueuelen: 0
Byte RX: 2712940 (2,7 MB) Byte TX: 1071835 (1,0 MB)
eth0 Link encap: Ethernet HWaddr 00: 1e: 33: 88: 07: e5
UP BROADCAST RUNNING MULTICAST MTU: 1500 Sistema metrico: 1
Pacchetti RX: 7181 errori: 0 rilasciati: 0 sovraccarichi: 0 frame: 0
Pacchetti TX: 7740 errori: 0 rilasciati: 0 sovraccarichi: 0 portante: 0
collisioni: 0 txqueuelen: 1000
Byte RX: 2974585 (2,9 MB) Byte TX: 1096580 (1,0 MB)
Interruzione: 43 Indirizzo base: 0x6000
lo Link encap: Local Loopback
inet addr: 127.0.0.1 Maschera: 255.0.0.0
inet6 addr: :: 1/128 Ambito: host
UP LOOPBACK RUNNING MTU: 16436 Metrico: 1
Pacchetti RX: 10 errori: 0 rilasciati: 0 sovraccarichi: 0 frame: 0
Pacchetti TX: 10 errori: 0 rilasciati: 0 sovraccarichi: 0 portante: 0
collisioni: 0 txqueuelen: 0
Byte RX: 664 (664,0 B) Byte TX: 664 (664,0 B)
vnet0 Link encap: Ethernet HWaddr ca: 0c: 73: c3: bc: 45
inet6 addr: fe80 :: c80c: 73ff: fec3: bc45 / 64 Ambito: collegamento
UP BROADCAST RUNNING MULTICAST MTU: 1500 Sistema metrico: 1
Pacchetti RX: 226 errori: 0 rilasciati: 0 sovraccarichi: 0 frame: 0
Pacchetti TX: 429 errori: 0 rilasciati: 0 sovraccarichi: 0 portante: 0
collisioni: 0 txqueuelen: 500
Byte RX: 26919 (26,9 KB) Byte TX: 58929 (58,9 KB)
virbr0 Link encap: Ethernet HWaddr d6: 18: 22: db: ff: 93
inet addr: 192.168.122.1 Bcast: 192.168.122.255 Maschera: 255.255.255.0
UP BROADCAST MULTICAST MTU: 1500 Metrico: 1
Pacchetti RX: 0 errori: 0 rilasciati: 0 sovraccarichi: 0 frame: 0
Pacchetti TX: 0 errori: 0 rilasciati: 0 sovraccarichi: 0 portante: 0
collisioni: 0 txqueuelen: 0
Byte RX: 0 (0,0 B) Byte TX: 0 (0,0 B)
La mia configurazione bridge durante l'esecuzione della VM:
$ brctl show
nome ponte ID ponte STP abilitato interfacce
br0 8000.001e338807e5 no eth0
vnet0
virbr0 8000.000000000000 sì
Si noti che sia l'interfaccia vnet0 della macchina virtuale sia l'interfaccia eth0 sono collegate al bridge br0.
E i MAC sono sull'interfaccia br0:
$ brctl showmacs br0
port no mac addr è locale? timer di invecchiamento
1 00: 05: 5d: cf: 64: 61 no 2.54
1 00: 19: d2: 42: 5d: 3f n. 36.76
1 00: 19: df: da: af: 7c n. 2.86
1 00: 1e: 33: 88: 07: e5 sì 0,00
1 00: 60: 0f: e4: 17: d6 n. 0,79
2 52: 54: 00: 12: 34: 56 no 0.80
1 58: 6d: 8f: 17: 5b: c0 no 5.91
1 c8: aa: 21: be: 8d: 16 no 167.69
2 ca: 0c: 73: c3: bc: 45 sì 0,00
Si noti che l'interfaccia br0 collega il mio computer host allo stesso bridge utilizzato dal guest.
Puoi controllare che sei in bridge piuttosto che NAT instradato alla tua rete usando traceroute 8.8.8.8
. Se il primo nodo è il router della tua rete anziché l'indirizzo IP dell'ospite, la tua rete dovrebbe funzionare correttamente.
Vedi questa documentazione .
virt-manager
Assicurati di aver installato virt-manager
e hal
. Il hal
pacchetto è una dipendenza suggerita per virt-manager
e viene utilizzato per determinare la configurazione di rete del sistema durante la creazione o la modifica dei guest.
Pur avendo definito il bridge br0 come sopra, ho creato una macchina virtuale con virt-manager come segue:
Sono stato in grado di andare direttamente al resto della mia rete domestica e su Internet da questo ospite. Sono stato anche in grado di inserirvi nell'altro computer Ubuntu (non host, non guest) sulla mia rete domestica.
Ecco il kvm
comando molto lungo eseguito da virt-manager (per il confronto con EApub o chiunque altro abbia problemi con questo):
/ usr / bin / kvm -S -M pc-1.0 -enable-kvm -m 1024 -smp 1, socket = 1, core = 1, thread = 1-name preciso -uuid f057a729-eda6-4b85-84dc-f100c9ae3789 - nodefconfig -nodefaults -chardev socket, id = charmonitor, path = / var / lib / libvirt / qemu / precise.monitor, server, nowait -mon chardev = charmonitor, id = monitor, mode = control -rtc base = utc -no- shutdown -drive file = / media / natty / home / gruber / ubuntu-kvm / tmpW8gSGB.qcow2, if = none, id = drive-ide0-0-0, format = qcow2 -device ide-drive, bus = ide.0 , unità = 0, unità = drive-ide0-0-0, id = ide0-0-0, bootindex = 1 -netdev tap, fd = 18, id = hostnet0 -device rtl8139, netdev = hostnet0, id = net0, mac = 52: 54: 00: 0e: da: 9b, bus = pci.0, addr = 0x3 -chardev pty, id = charserial0 -device isa-serial, chardev = charserial0, id = serial0 -usb -vnc 127.0.0.1: 0 -vga cirrus -device intel-hda, id = sound0, bus = pci.0, addr = 0x4 -device hda-duplex, id = sound0-codec0, bus = sound0.0,cad = 0 -device virtio-balloon-pci, id = balloon0, bus = pci.0, addr = 0x5
Ecco la parte di rete della descrizione della macchina virtuale in /etc/libvirt/qemu/quantal.xml
<interface type='bridge'>
<mac address='52:54:00:b0:8e:aa'/>
<source bridge='br0'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
Secondo questo link, per prestazioni e affidabilità, potrebbe essere meglio impostare il modello di dispositivo di rete su virtio
, è possibile farlo nel virt-viewer premendo il pulsante i , andando all'impostazione NIC e impostando "Modello dispositivo "a virtio
. Puoi anche aggiungerlo all'XML sopra aggiungendo la riga:
<model type='virtio'/>
In sintesi
Tutto questo il 12.04 è stato:
- Installazione di virt-manager, bridge-utils, qemu-kvm e pacchetti correlati
- Assicurati che ogni utente che desideri usare kvm sia nel gruppo libvirtd.
- Definire / etc / network / interfaces come sopra (che corrispondono all'articolo citato)
- Riavvia, assicurandoti che Ethernet sia collegato e che il wireless (se presente) sia spento.
- Esegui kvm contro un'immagine direttamente con, ad esempio
-device e1000,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0
, oppure crea una macchina virtuale con virt-manager, specificando la rete Bridge br0 nel pannello Passaggio 4> Opzioni avanzate.
Non sono state necessarie ulteriori modifiche a reti, funzionalità, modelli o configurazioni.
Per esporre un servizio nel tuo nuovo ospite su Internet dovresti:
- Preparare e configurare qualsiasi servizio firewall necessario.
- Assegna un indirizzo statico nella configurazione del tuo ospite o nel tuo servizio DHCP.
- Se si utilizza un router NAT, aprire una porta per il servizio che si sta implementando indirizzandolo all'indirizzo IP del guest.
Ricordare di testare e riattivare il servizio firewall per il computer host. Potrebbe essere necessario l'ingresso per inoltrare il traffico all'ospite.
Vedi https://help.ubuntu.com/community/KVM/Installation , https://help.ubuntu.com/community/KVM/Networking e https://help.ubuntu.com/12.04/serverguide/libvirt. html .
ifconfig
,brctl show
,brctl showmacs br0
, eip route
. Sul ospite:ifconfig
,ip route
,ping 8.8.8.8
,ping <your internet router>
, etraceroute 8.8.8.8
. Non posso dire di aver configurato kvm nel modo in cui lo hai fatto tu, ma ho iniziato a lavorare a ponte usando ilkvm
comando. Ho dovuto disconnettere la connessione wireless in modo che il mio host si connettesse a Internet e, come dicono le indicazioni citate, è necessario connettersi a Internet con Ethernet.