Préliminaires
Cette suite a fonctionné pour moi pour Ubuntu 12.04. Vous devez désactiver le pare-feu de votre ordinateur pendant que vous testez cela afin qu'il n'interfère pas.
Le fichier / etc / default / qemu-kvm doit être tel qu'initialement installé.
Vous aurez besoin d'avoir bridge-utils qemu-kvm et libvirt-bin installé . Tous les utilisateurs utilisant des machines virtuelles doivent être ajoutés au groupe libvirtd.
Il ne semble plus être nécessaire d'ajouter la capacité CAP_NET_ADMIN.
Configuration du réseau
Le mode réseau par défaut est le mode utilisateur, également appelé SLIRP. Il utilise un pont virbr0 prédéfini qui est routé NAT vers l'ordinateur invité. Le routage NAT utilise la fonction ip_forwarding du noyau et iptables . Le mode pont utilise un pont virtuel dans l'invité auquel l'interface Ethernet (non numérotée) se connecte, et sur lequel l'hôte et l'invité ont leurs interfaces réseau.
Les diagrammes suivants peuvent rendre les différences plus claires:
Vous pouvez voir comment le réseau d'utilisateurs par défaut est défini avec:
virsh net-dumpxml default
Je peux configurer le mode ponté avec les approches suivantes:
Dans / etc / network / interfaces (à partir de la partie passerelle du message que vous mentionnez dans votre question):
auto lo
iface lo inet loopback
#auto eth0
#iface eth0 inet dhcp
auto eth0
iface eth0 inet manuel
auto br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
Redémarrer; et assurez-vous que la mise en réseau sans fil n'est pas active. Vérifiez la route IP par défaut avec ip route
. Il doit utiliser l'interface br0.
NB Si votre Ethernet n'est pas connecté lorsque cette modification est effectuée, vous devez avoir votre câble Ethernet branché et obtenir un transporteur ou le démarrage se bloquera pendant deux minutes et vous n'aurez pas de capacité réseau C'est parce que l'interface eth0, par étant dans ce fichier, doit apparaître avant que le démarrage puisse continuer normalement.
NB Généralement, vous ne pouvez pas utiliser un réseau sans fil au lieu de eth0 en raison de leur incapacité à utiliser plusieurs adresses MAC (j'en déduis qu'ils ont besoin d'une seconde pour le pont).
Comme alternative, vous pouvez désactiver l'utilisation d'Ethernet et vous assurer qu'il n'a pas d'adresse IP et qu'il n'y a pas de route par défaut configurée avec ip route
. Ensuite:
sudo ifconfig eth0 0.0.0.0 up
sudo brctl addbr br0
sudo brctl addif br0 eth0
sudo ifconfig br0 up
sudo dhclient br0 &
Vous pouvez également fournir une adresse IP statique ici, ainsi que définir la route et l'adresse DNS par défaut. Pour cet exemple dhclient
fait cela.
Voici ma table de route:
$ ip route list
par défaut via 192.168.1.1 dev br0 métrique 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
Utilisation de kvm
Je peux ensuite démarrer une machine kvm pontée avec:
$ sudo kvm -name Quantal -m 1024 -hda foo.qcow2 --soundhw ac97 -device virtio-net,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0
Le -netdev tap
paramètre fait de sudo une exigence. Au démarrage de la machine virtuelle, qemu-kvm exécute les commandes suivantes:
ifconfig vnet0 0.0.0.0 up
brctl addif brctl addif br0 vnet0
Cela se fait par / etc / qemu-ifup
L'interface vnet0 de la machine virtuelle est ajoutée au pont br0 car la route par défaut ci-dessus utilise cette interface de pont. Si ce n'était pas le cas, l'interface tap à la place serait ajoutée à l'interface virbr0. Comme ce n'est pas connecté à Internet, NAT serait utilisé pour connecter l'invité à l'hôte et à Internet, dans mes expériences. Vous pouvez diriger le vnet0 vers un pont particulier dans / etc / default / qemu-kvm. En utilisant virt-manager ci-dessous, vous pouvez explicitement indiquer à quel pont se connecter.
En raison des commandes ci-dessus émises par qemu-kvm et du -netdev tap,id=tunnel,ifname=vnet0
paramètre, la machine virtuelle vm est connectée au tunnel vnet0 et le tunnel est connecté au pont br0.
Je peux maintenant directement ssh dans cette machine virtuelle invitée à partir d'un autre ordinateur de mon réseau.
Mon hôte ifconfig
(notez l'interface vnet0 qui apparaît sur mon réseau lorsque la machine virtuelle est en cours d'exécution):
$ ifconfig
br0 Lien encap: Ethernet HWaddr 00: 1e: 33: 88: 07: e5
inet addr: 192.168.1.45 Bcast: 255.255.255.255 Masque: 255.255.255.0
inet6 addr: fe80 :: 21e: 33ff: fe88: 7e5 / 64 Portée: Lien
UP BROADCAST RUNNING MULTICAST MTU: 1500 Métrique: 1
Paquets RX: 6526 erreurs: 0 abandonnées: 0 dépassements: 0 trame: 0
Paquets TX: 7543 erreurs: 0 abandonnées: 0 dépassements: 0 porteuse: 0
collisions: 0 txqueuelen: 0
Octets RX: 2712940 (2,7 Mo) Octets TX: 1071835 (1,0 Mo)
eth0 Link encap: Ethernet HWaddr 00: 1e: 33: 88: 07: e5
UP BROADCAST RUNNING MULTICAST MTU: 1500 Métrique: 1
Paquets RX: 7181 erreurs: 0 abandonnées: 0 dépassements: 0 trame: 0
Paquets TX: 7740 erreurs: 0 abandonnées: 0 dépassements: 0 porteuse: 0
collisions: 0 txqueuelen: 1000
Octets RX: 2974585 (2,9 Mo) Octets TX: 1096580 (1,0 Mo)
Interruption: 43 Adresse de base: 0x6000
lo Link encap: boucle locale
inet addr: 127.0.0.1 Mask: 255.0.0.0
inet6 addr: :: 1/128 Champ d'application: hôte
UP LOOPBACK RUNNING MTU: 16436 Métrique: 1
Paquets RX: 10 erreurs: 0 abandonnées: 0 dépassements: 0 trame: 0
Paquets TX: 10 erreurs: 0 abandonnées: 0 dépassements: 0 porteuse: 0
collisions: 0 txqueuelen: 0
Octets RX: 664 (664,0 B) Octets TX: 664 (664,0 B)
vnet0 Link encap: Ethernet HWaddr ca: 0c: 73: c3: bc: 45
inet6 addr: fe80 :: c80c: 73ff: fec3: bc45 / 64 Portée: Lien
UP BROADCAST RUNNING MULTICAST MTU: 1500 Métrique: 1
Paquets RX: 226 erreurs: 0 abandonné: 0 dépassements: 0 trame: 0
Paquets TX: 429 erreurs: 0 abandonnées: 0 dépassements: 0 porteuse: 0
collisions: 0 txqueuelen: 500
Octets RX: 26919 (26,9 Ko) Octets TX: 58929 (58,9 Ko)
virbr0 Link encap: Ethernet HWaddr d6: 18: 22: db: ff: 93
inet addr: 192.168.122.1 Bcast: 192.168.122.255 Masque: 255.255.255.0
UP BROADCAST MULTICAST MTU: 1500 Métrique: 1
Paquets RX: 0 erreurs: 0 abandonnées: 0 dépassements: 0 trame: 0
Paquets TX: 0 erreurs: 0 abandonnées: 0 dépassements: 0 porteuse: 0
collisions: 0 txqueuelen: 0
Octets RX: 0 (0,0 B) Octets TX: 0 (0,0 B)
Ma configuration de pont lors de l'exécution de la machine virtuelle:
$ brctl show
nom de pont id de pont interfaces compatibles STP
br0 8000.001e338807e5 pas eth0
vnet0
virbr0 8000.000000000000 oui
Notez que l'interface vnet0 de la machine virtuelle et l'interface eth0 sont connectées au pont br0.
Et les MAC sur l'interface br0:
$ brctl showmacs br0
port aucun addr mac est local? minuterie de vieillissement
1 00: 05: 5d: cf: 64: 61 non 2.54
1 00: 19: d2: 42: 5d: 3f non 36.76
1 00: 19: df: da: af: 7c no 2.86
1 00: 1e: 33: 88: 07: e5 oui 0,00
1 00: 60: 0f: e4: 17: d6 non 0,79
2 52: 54: 00: 12: 34: 56 non 0,80
1 58: 6d: 8f: 17: 5b: c0 non 5,91
1 c8: aa: 21: be: 8d: 16 non 167.69
2 ca: 0c: 73: c3: bc: 45 oui 0,00
Notez que l'interface br0 connecte mon ordinateur hôte au même pont utilisé par l'invité.
Vous pouvez vérifier que vous êtes ponté plutôt que NAT routé vers votre propre réseau en utilisant traceroute 8.8.8.8
. Si le premier nœud est le routeur de votre réseau plutôt que l'adresse IP de l'invité, votre réseau devrait fonctionner correctement.
Consultez cette documentation .
virt-manager
Assurez-vous que vous avez installé virt-manager
et hal
. Le hal
package est une dépendance suggérée pour virt-manager
et est utilisé pour déterminer la configuration réseau de votre système lors de la création ou de la modification d'invités.
Tout en ayant le pont br0 défini comme ci-dessus, j'ai créé une machine virtuelle avec virt-manager comme suit:
J'ai pu accéder directement au reste de mon réseau domestique et à Internet à partir de cet invité. J'ai également pu y accéder depuis l'autre ordinateur Ubuntu (non hôte, non invité) sur mon réseau domestique.
Voici la très longue kvm
commande exécutée par virt-manager (pour comparaison avec EApubs ou toute autre personne ayant des problèmes avec cela):
/ usr / bin / kvm -S -M pc-1.0 -enable-kvm -m 1024 -smp 1, sockets = 1, cores = 1, threads = 1 -name precise -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, drive = 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
Voici la partie réseau de la description de la machine virtuelle dans /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>
Selon ce lien, pour des performances et une fiabilité, il peut être préférable de définir le modèle de périphérique réseau sur virtio
, vous pouvez le faire en utilisant virt-viewer en appuyant sur le bouton i , en allant au paramètre NIC et en définissant le "Modèle de périphérique "à virtio
. Vous pouvez également ajouter ceci au XML ci-dessus en ajoutant la ligne:
<model type='virtio'/>
En résumé
Tout cela a pris le 12.04 était:
- Installation de virt-manager, bridge-utils, qemu-kvm et des packages associés
- Assurez-vous que chaque utilisateur souhaitant utiliser kvm se trouve dans le groupe libvirtd.
- Définir / etc / network / interfaces comme ci-dessus (qui correspond à l'article cité)
- Redémarrez, en vous assurant qu'Ethernet est branché et que la connexion sans fil (le cas échéant) est désactivée.
- Exécutez kvm sur une image directement avec, par exemple
-device e1000,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0
, ou créez une machine virtuelle avec virt-manager, en spécifiant le pont réseau br0 sous le panneau Étape 4-> Options avancées.
Aucune autre modification n'a été nécessaire pour la mise en réseau, les capacités, les modèles ou les configurations.
Pour exposer un service de votre nouvel invité à Internet, vous devez:
- Préparez et configurez tout service de pare-feu dont vous aurez besoin.
- Attribuez une adresse statique dans votre configuration d'invité ou dans votre service DHCP.
- Si vous utilisez un routeur NAT, ouvrez un port pour le service que vous implémentez en le dirigeant vers l'adresse IP de l'invité.
N'oubliez pas de tester et de réactiver le service de pare-feu pour votre ordinateur hôte. Il peut avoir besoin de n'importe quelle entrée pour transmettre le trafic à l'invité.
Voir https://help.ubuntu.com/community/KVM/Installation , https://help.ubuntu.com/community/KVM/Networking et https://help.ubuntu.com/12.04/serverguide/libvirt. html .
ifconfig
,brctl show
,brctl showmacs br0
etip route
. Sur l'invité:ifconfig
,ip route
,ping 8.8.8.8
,ping <your internet router>
ettraceroute 8.8.8.8
. Je ne peux pas dire que j'ai configuré kvm comme vous l'avez fait, mais j'ai obtenu un pontage pour travailler en utilisant lakvm
commande. J'ai dû déconnecter le sans fil pour que mon hôte se connecte à Internet et, comme le disent les instructions que vous avez citées, vous devez vous connecter à Internet avec Ethernet.