Qemu: Comunicazione fra più virtual machine

Se si crea una rete fra le virtual machine è possibile scambiare file, collegarsi a Internet e controllare ogni virtual machine dall’esterno.

A partire dalla versione 0.6.0 di QEMU, si possono creare delle VLAN fra le virtual machine.

Schede Ethernet

QEMU fornisce il supporto a 4 schede ethernet: NE2000 PCI, RTL8139, PCNET e NE2000 ISA.

Queste quattro vengono presentate al sistema operativo sulla virtual machine come hardware disponibile.

E’ opportuno configurare le schede al momento dell’avvio di una virtual machine (la prima riga per scegliere la scheda NE2000 PCI, la seconda per RTL8139 e la terza per la PCNET):

 

$ qemu -hda /imma.img -net nic,model=ne2k_pci -net user
$ qemu -hda /imma.img -net nic,model=rtl8139 -net user
$ qemu -hda /imma.img -net nic,model=pcnet -net user

L’ultima scheda di rete fa uso del bus ISA per cui è necessario abilitarne il supporto:

$ qemu -hda /imma.img -M isapc -net nic,model=nek2_isa -net user

Di default non specificando il modello della scheda verrà scelta NE2000 PCI:

$ qemu -hda /imma.img -net nic

Queste schede di rete ethernet in genere sono riconosciute dal sistema operativo sulla virtual machine che supportano il plug and play.

Nel caso che il sistema operativo ospitato non supporti questa caratteristica, bisogna installare i driver.

Per Linux volendo usare la scheda ethernet NE2000 PCI, sulla macchina guest:

$ modprobe ne2k-pci

$ dhclient eth0

Attenzione: per Windows for Workgroup 3.11, Windows NT 4 e OS/2 warp 4 bisogna scegliere la scheda RTL8139 perché quella preimpostata non è viene riconosciuta.

 

Può capitare che si possa navigare su Internet con la macchina virtuale ma i siti non siano raggiungibili perchè manca il supporto al DNS (Domain name service). Bisogna aggiungere i nomi dei DNS all’interno del sistema operativo ospite.

 

 

Adoperare una VLAN usando TCP e UDP

Se si hanno più macchine virtuali che usano la stessa scheda di rete è necessario scegliere per le schede dei MAC address diversi (scheda NE2000 PCI con indirizzo MAC 52:54:00:12:34:56):

$ qemu -hda /imma.img -net nic,macaddr=52:54:00:12:34:56

Naturalmente ogni virtual machine deve avere un indirizzo differente.

Se le virtual machine sono più di due si possono usare i protocolli TCP o UDP.

Per adoperare il protocollo UDP fra tre virtual machine, bisogna avviare le macchine usando i parametri:

$ qemu -hda imma1.img -net nic,macaddr=52:54:00:12:34:56

-net socket,mcast=230.0.0.1:1234

$ qemu -hda imma2.img -net nic,macaddr=52:54:00:12:34:57

-net socket,mcast=230.0.0.1:1234

$ qemu -hda imma3.img -net nic,macaddr=52:54:00:12:34:58

-net socket,mcast=230.0.0.1:1234

Il primo comando serve per avviare la virtual machine (l’immagine imma1.img) con scheda ethernet NE2000 PCI avente indirizzo mac 52:54:00:12:34:56 e indirizzo multicast 230.0.0.1 sulla porta 1234. Il secondo comando e il terzo servono per avviare rispettivamente la seconda e l’ultima virtual machine.

Ora bisogna assegnare un indirizzo IP alle virtual machine. Alla prima si può assegnare 10.0.2.16, alla seconda 10.0.2.17 e alla terza 10.0.2.18.

Se si usa Linux sulle macchine virtuali è possibile assegnare un indirizzo IP digitando:

# ifconfig eth0 10.0.2.16

nella shell della macchina virtuale con scheda avente mac address 52:54:00:12:34:56

#ifconfig eth0 10.0.2.17

nella shell della seconda virtual machine ovvero quella con mac address 52:54:00:12:34:57

#ifconfig eth0 10.0.2.18

dalla riga di comando della terza macchina virtuale che possiede una scheda con indirizzo mac 52:54:00:12:34:58

Per controllare che il collegamento funzioni basta usare il monitor delle virtual machine; il monitor si attiva premendo CTRL + ALT + 2 mentre si è nella finestra della macchina virtuale.

Qui si può digitare.

(qemu) info network

Nella prima macchina virtuale dovrebbe apparire:

 

VLAN 0 devices:

socket: mcast=230.0.0.1:1234

ne2000 pci macaddr=52:54:00:12:34:56

 

Facendo la stessa cosa per le altre due macchine, dovrebbero apparire reciprocamente:

VLAN 0 devices:

socket: mcast=230.0.0.1:1234

ne2000 pci macaddr=52:54:00:12:34:57

VLAN 0 devices:

socket: mcast=230.0.0.1:1234

ne2000 pci macaddr=52:54:00:12:34:58

Come si può notare, è stata creata una VLAN 0 fra le tre macchine virtuali. E’ possibile specificare un altro numero per la VLAN:

$ qemu -hda imma.img -net nic,vlan=2

Così questa macchina virtuale usa la scheda di default collegata alla VLAN 2.

Per creare una virtual lan usando il protocollo TCP, invece che UDP:

$ qemu -hda imma1.img -net nic,macaddr=52:54:00:12:34:56

-net socket,listen=localhost:1234

$ qemu -hda imma2.img -net nic,macaddr=52:54:00:12:34:57

-net socket,connect=localhost:1234

Come per UDP bisogna assegnare l’indirizzo IP alle schede delle virtual machine (per Linux):

# ifconfig eth0 10.0.2.16

nella shell della macchina virtuale con scheda avente mac address 52:54:00:12:34:56

#ifconfig eth0 10.0.2.17

nella shell della seconda virtual machine ovvero quella con mac address 52:54:00:12:34:57

Usando il monitor delle istanze di QEMU (CTRL + ALT +2):

(qemu) info network

VLAN 0 devices:

socket: connection from 127.0.0.1:1472

ne2000 pci macaddr=52:54:00:12:34:56

 

 

(qemu) info network

VLAN 0 devices:

socket: connect to 127.0.0.1:1234

ne2000 pci macaddr=52:54:00:12:34:57

Note: Aggiungendo -net user come parametro all’avvio di QEMU (sia per UDP che per TCP) viene usata una pila che contiene il traffico delle reti virtuali, così non è necessario usare le macchine come root o amministratore.

 

Collegamento a Internet per più virtual machine

Se si vuole collegare delle macchine virtuali ad Internet è opportuno convogliare le richieste verso il sistema operativo ospitante e successivamente indirizzare le comunicazioni in direzione della scheda di rete fisica del computer. Oppure dirigere il traffico su una macchina virtuale che lo direziona al computer collegato a Internet.

Questo schema illustra la rete:


Descrizione della rete: Computer è il nodo rappresentato dalla macchina fisica che è collegata ad Internet mediante una connessione. Virtual Machine 1 è una macchina virtuale che funziona da tramite fra tutte le virtual machine e il computer. Quindi basta fermare Virtual Machine 1 (d’ora in poi VM1) per interrompere l’accesso a Internet alle altre macchine virtuali. Virtual machine 2 e Virtual Machine 3 (VM2 e VM3) sono collegate a VM1.

Occorre avviare la prima, la seconda e la terza virtual machine così:

$ qemu -hda imma1.img -net nic,vlan=1,macaddr=52:54:00:12:34:55 -net user,vlan=1

-net nic,vlan=2,macaddr=52:54:00:12:34:57

-net nic,model=rtl8139,vlan=2,macaddr=52:54:00:12:34:56

-net socket,vlan=2,listen=localhost:1234

 

$ qemu -hda imma2.img

-net nic,vlan=2,macaddr=52:54:00:12:34:01

-net socket,vlan=2,connect=localhost:1234

$ qemu -hda imma3.img

-net nic,vlan=2,macaddr=52:54:00:12:34:02

-net socket,vlan=2,connect=localhost:1234

Schede, e il loro Mac address, che compongono la virtual lan numero due.

Ora è necessario impostare le schede della VM1, in una console del sistema operativo ospite digitare (VM1 funziona da router per le virtual machine):

# dhcpcd eth0


Poi controllare che ifconfig abbia assegnato alla seconda NE2000 l’interfaccia eth1 e alla RTL8139 abbia attribuito l’interfaccia eth2 (lo si puo fare digitando come root ifconfig al terminale).

In seguito è richiesto di dare un indirizzo IP alle due schede dalla VLAN2.

# ifconfig eth1 192.168.10.2

# ifconfig eth2 192.168.10.3

Sulla VM2 è opportuno impartire i comandi:

# ifconfig eth0 192.168.10.4

# route add default gw 192.168.10.2 eth0

Sulla VM3 invece:

# ifconfig eth0 192.168.10.5

# route add default gw 192.168.10.3 eth0

Così diventerà la VLAN 2:

Controllando nei rispettivi QEMU monitor digitando:

(qemu) info network

Dovrebbero apparire rispettivamente per la prima, la seconda e la terza virtual machine:

VLAN 1 devices:

user redirector

ne2000 pci macaddr=52:54:00:12:34:55

VLAN 2 devices:

ne2000 pci macaddr=52:54:00:12:34:57

rtl8139 pci macaddr=52:54:00:12:34:56

socket : connection from 127.0.0.1:1477

VLAN 2 devices:

ne2000 pci macaddr=52:54:00:12:34:01

socket: connect to 127.0.0.1:1234

VLAN 2 devices:

ne2000 pci macaddr=52:54:00:12:34:02

socket: connect to 127.0.0.1:1234
Attenzione: L’accesso a Internet sarà possibile solo usando VM1 per dare la possibilità anche alle altre macchine di accedervi è necessario attivare l’inoltro dei pacchetti digitando (sulla macchina che si vuole usare come router, in questo caso VM1):

# echo 1 > /proc/sys/net/ipv4/ip_forward

Risoluzione di problemi:

Se avviando una virtual machine abilitando una scheda di rete NE2000, questa non risulta presente nel sistema operativo ospite è possibile che la scheda non sia stata riconosciuta:

Se si sta usando Linux, digitare nella virtual machine:

# modprobe ne2k-pci

# dhclient eth0

Puo anche darsi che la scheda sia disabilita, per controllare che sia presente basta usare il comando:

# ifconfig -a

Questo è quello che dovrebbe apparire:

eth0 Link encap:Ethernet HWaddr 52:54:00:12:34:56

BROADCAST MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

Interrupt:9 Base address:0x300

 

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

UP LOOPBACK RUNNING MTU:16436 Metric:1

RX packets:6 errors:0 dropped:0 overruns:0 frame:0

TX packets:6 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:420 (420.0 b) TX bytes:420 (420.0 b)

 

Per assegnare l’indirizzo IP 10.0.2.16 alla scheda eth0:

# /sbin/ifconfig eth0 10.0.2.16

Per verificare l’attribuzione:

# /sbin/ifconfig

Dovrebbe uscire:

 

eth0 Link encap:Ethernet HWaddr 52:54:00:12:34:56

inet addr:10.0.2.16 Bcast:10.255.255.255 Mask:255.0.0.0

UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1

RX packets:0 errors:0 dropped:0 overruns:0 frame:0

TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:100

RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)

Interrupt:9 Base address:0x300

 

lo Link encap:Local Loopback

inet addr:127.0.0.1 Mask:255.0.0.0

UP LOOPBACK RUNNING MTU:16436 Metric:1

RX packets:6 errors:0 dropped:0 overruns:0 frame:0

TX packets:6 errors:0 dropped:0 overruns:0 carrier:0

collisions:0 txqueuelen:0

RX bytes:420 (420.0 b) TX bytes:420 (420.0 b)

 

Guida tratta da:

How to use a Network (http://www.h7.dion.ne.jp/~qemu-win/howtonetwork-en.html)

 

Una risposta

  1. r. ha detto:

    Ottimo articolo! Ci ho trovato il parametro che mi mancava 🙂

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *