Vorbereitungen
Das Folgende funktionierte bei mir für Ubuntu 12.04. Sie sollten die Firewall Ihres Computers beim Testen deaktivieren, damit sie nicht stört.
Die Datei / etc / default / qemu-kvm sollte wie ursprünglich installiert sein.
Sie müssen die Bridge- Utils qemu-kvm und libvirt-bin installiert haben. Alle Benutzer, die virtuelle Maschinen verwenden, sollten der Gruppe libvirtd hinzugefügt werden.
Es scheint keine Notwendigkeit mehr zu bestehen, CAP_NET_ADMIN-Funktionen hinzuzufügen.
Netzwerkeinrichtung
Der Standardnetzwerkmodus ist der Benutzermodus, auch SLIRP genannt. Es verwendet eine vordefinierte virbr0-Brücke, die NAT-fähig ist und auf den Gastcomputer geroutet wird. Das NAT-Routing verwendet die Kernel-Funktion ip_forwarding und iptables . Im Bridge-Modus wird eine virtuelle Bridge im Gast verwendet, mit der die (nicht nummerierte) Ethernet-Schnittstelle verbunden ist und auf der sowohl der Host als auch der Gast über ihre Netzwerkschnittstellen verfügen.
Die folgenden Abbildungen können die Unterschiede verdeutlichen:
Sie können sehen, wie das Standardbenutzernetzwerk definiert ist mit:
virsh net-dumpxml default
Ich kann den Bridged-Modus mit den folgenden Ansätzen einrichten:
In / etc / network / interfaces (aus dem überbrückenden Teil des Posts, den Sie in Ihrer Frage erwähnt haben):
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 aus
bridge_fd 0
bridge_maxwait 0
Neustart; und stellen Sie sicher, dass das drahtlose Netzwerk nicht aktiv ist. Überprüfen Sie die Standard-IP-Route mit ip route
. Es muss die br0-Schnittstelle verwenden.
NB Wenn Ihr Ethernet nicht angeschlossen ist, wenn diese Änderung vorgenommen wird, müssen Sie Ihr Ethernet-Kabel eingesteckt haben und einen Netzbetreiber besorgen. Andernfalls bleibt der Startvorgang zwei Minuten lang hängen und Sie haben keine Netzwerkfähigkeit. Das liegt an der eth0-Schnittstelle von Wenn Sie sich in dieser Datei befinden, muss sie aufgerufen werden, bevor der Startvorgang normal fortgesetzt werden kann.
NB Im Allgemeinen können Sie kein drahtloses Netzwerk anstelle von eth0 verwenden, da sie nicht mehrere MAC-Adressen verwenden können (ich schätze, dass sie eine zweite für die Bridge benötigen).
Alternativ können Sie die Verwendung von Ethernet deaktivieren und sicherstellen, dass es keine IP-Adresse hat und dass keine Standardroute eingerichtet ist ip route
. Dann:
sudo ifconfig eth0 0.0.0.0 up
sudo brctl addbr br0
sudo brctl addif br0 eth0
sudo ifconfig br0 up
sudo dhclient br0 &
Sie können hier auch eine statische IP-Adresse sowie die Standardroute und die DNS-Adresse angeben. In diesem Beispiel dhclient
wird dies ausgeführt.
Hier ist meine Routentabelle:
$ ip Routenliste
Standardmäßig über 192.168.1.1 dev br0 metric 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
Mit kvm
Ich kann dann eine überbrückte KVM-Maschine booten mit:
$ sudo kvm -name Quantal -m 1024 -hda foo.qcow2 --soundhw ac97 -device virtio-net,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0
Der -netdev tap
Parameter macht sudo zu einer Anforderung. Beim Start der VM führt qemu-kvm die folgenden Befehle aus:
ifconfig vnet0 0.0.0.0 up
brctl addif brctl addif br0 vnet0
Dies erledigt / etc / qemu-ifup
Die vnet0-Schnittstelle der VM wird der br0-Brücke hinzugefügt, da die oben angegebene Standardroute diese Brückenschnittstelle verwendet. Wäre dies nicht der Fall, würde stattdessen die Tap-Schnittstelle zur virbr0-Schnittstelle hinzugefügt. Da dies nicht mit dem Internet verbunden ist, wird NAT in meinen Experimenten verwendet, um den Gast mit dem Host und dem Internet zu verbinden. Sie können das vnet0 auf eine bestimmte Bridge in / etc / default / qemu-kvm richten. Mit dem unten stehenden virt-manager können Sie explizit festlegen, zu welcher Bridge eine Verbindung hergestellt werden soll.
Aufgrund der obigen Befehle von qemu-kvm und des -netdev tap,id=tunnel,ifname=vnet0
Parameters ist die virtuelle Maschine vm mit dem Tunnel vnet0 und der Tunnel mit der Brücke br0 verbunden.
Ich kann jetzt direkt von einem anderen Computer in meinem Netzwerk auf diese Gast-VM zugreifen.
Mein Host ifconfig
(beachten Sie die vnet0-Schnittstelle, die in meinem Netzwerk angezeigt wird, wenn die VM ausgeführt wird):
$ ifconfig
br0 Verbindungskapsel: Ethernet HWaddr 00: 1e: 33: 88: 07: e5
inet addr: 192.168.1.45 Bcast: 255.255.255.255 Mask: 255.255.255.0
inet6 addr: fe80 :: 21e: 33ff: fe88: 7e5 / 64 Scope: Link
UP BROADCAST RUNNING MULTICAST MTU: 1500 Metrisch: 1
RX-Pakete: 6526 Fehler: 0 verworfen: 0 Überläufe: 0 Rahmen: 0
TX-Pakete: 7543 Fehler: 0 verworfen: 0 Überläufe: 0 Träger: 0
Kollisionen: 0 txqueuelen: 0
Empfangsbytes: 2712940 (2,7 MB) Sendebytes: 1071835 (1,0 MB)
eth0-Verbindungskapsel: Ethernet HWaddr 00: 1e: 33: 88: 07: e5
UP BROADCAST RUNNING MULTICAST MTU: 1500 Metrisch: 1
Empfangspakete: 7181 Fehler: 0 Verworfen: 0 Überläufe: 0 Rahmen: 0
TX-Pakete: 7740 Fehler: 0 verworfen: 0 Überläufe: 0 Träger: 0
Kollisionen: 0 txqueuelen: 1000
Empfangsbytes: 2974585 (2,9 MB) Sendebytes: 1096580 (1,0 MB)
Interrupt: 43 Basisadresse: 0x6000
lo Link encap: Lokales Loopback
inet addr: 127.0.0.1 Mask: 255.0.0.0
inet6 addr: :: 1/128 Gültigkeitsbereich: Host
UP LOOPBACK RUNNING MTU: 16436 Metrisch: 1
Empfangspakete: 10 Fehler: 0 fallen gelassen: 0 Überläufe: 0 Rahmen: 0
TX-Pakete: 10 Fehler: 0 fallen gelassen: 0 Überläufe: 0 Träger: 0
Kollisionen: 0 txqueuelen: 0
Empfangsbytes: 664 (664,0 B) Sendebytes: 664 (664,0 B)
vnet0 Verbindungskapsel: Ethernet HWaddr ca: 0c: 73: c3: bc: 45
inet6 addr: fe80 :: c80c: 73ff: fec3: bc45 / 64 Gültigkeitsbereich: Link
UP BROADCAST RUNNING MULTICAST MTU: 1500 Metrisch: 1
RX-Pakete: 226 Fehler: 0 verworfen: 0 Überläufe: 0 Rahmen: 0
TX-Pakete: 429 Fehler: 0 verworfen: 0 Überläufe: 0 Träger: 0
Kollisionen: 0 txqueuelen: 500
Empfangsbytes: 26919 (26,9 KB) Sendebytes: 58929 (58,9 KB)
virbr0 Verbindungskapsel: Ethernet HWaddr d6: 18: 22: db: ff: 93
inet addr: 192.168.122.1 Bcast: 192.168.122.255 Mask: 255.255.255.0
UP BROADCAST MULTICAST MTU: 1500 Metrisch: 1
Empfangspakete: 0 Fehler: 0 Verworfen: 0 Überschreitungen: 0 Rahmen: 0
TX-Pakete: 0 Fehler: 0 verworfen: 0 Überläufe: 0 Träger: 0
Kollisionen: 0 txqueuelen: 0
RX-Bytes: 0 (0,0 B) TX-Bytes: 0 (0,0 B)
Meine Bridge-Konfiguration beim Ausführen der VM:
$ brctl show
Brückenname Brücken-ID STP-fähige Schnittstellen
br0 8000.001e338807e5 no eth0
vnet0
virbr0 8000.000000000000 ja
Beachten Sie, dass sowohl die vnet0-Schnittstelle der virtuellen Maschine als auch die eth0-Schnittstelle mit der br0-Brücke verbunden sind.
Und die MACs auf der br0-Schnittstelle:
$ brctl showmacs br0
port no mac addr ist lokal? Alterungs-Timer
1 00: 05: 5d: cf: 64: 61 no 2.54
1 00: 19: d2: 42: 5d: 3f no 36.76
1 00: 19: df: da: af: 7c no 2.86
1 00: 1e: 33: 88: 07: e5 yes 0.00
1 00: 60: 0f: e4: 17: d6 no 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 ja 0,00
Beachten Sie, dass die br0-Schnittstelle meinen Host-Computer mit derselben Bridge verbindet, die vom Gast verwendet wird.
Sie können mithilfe von überprüfen, ob Sie überbrückt sind, anstatt NAT an Ihr eigenes Netzwerk weiterzuleiten traceroute 8.8.8.8
. Wenn der erste Knoten der Router Ihres Netzwerks ist und nicht die IP-Adresse des Gasts, sollte Ihr Netzwerk ordnungsgemäß funktionieren.
Siehe diese Dokumentation .
virt-manager
Achten Sie darauf , dass Sie installiert haben virt-manager
und hal
. Das hal
Paket ist eine empfohlene Abhängigkeit für virt-manager
und wird verwendet, um die Netzwerkkonfiguration Ihres Systems beim Erstellen oder Bearbeiten von Gästen zu bestimmen.
Während die br0-Brücke wie oben definiert wurde, habe ich mit virt-manager eine virtuelle Maschine wie folgt erstellt:
Von diesem Gast konnte ich direkt in mein restliches Heimnetzwerk und ins Internet gehen. Ich konnte auch von einem anderen Ubuntu-Computer (nicht vom Host, nicht vom Gast) in meinem Heimnetzwerk darauf zugreifen.
Hier ist der sehr lange kvm
Befehl, den virt-manager ausführt (zum Vergleich mit EApubs oder anderen, die Probleme damit haben):
/ usr / bin / kvm -S-M pc-1.0 -enable-kvm -m 1024 -smp 1, Sockets = 1, Cores = 1, Threads = 1 -name präzise -uid f057a729-eda6-4b85-84dc-f100c9ae3789 - nodefconfig -nodefaults -chardev socket, id = charmonitor, path = / var / lib / libvirt / qemu / precision.monitor, server, nowait -mon chardev = charmonitor, id = monitor, mode = control -rtc base = utc -no- Shutdown -Drive -Datei = / media / natty / home / gruber / ubuntu-kvm / tmpW8gSGB.qcow2, wenn = keine, id = Laufwerk-ide0-0-0, Format = qcow2 -Device-ide-Laufwerk, 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
Hier ist der Netzwerkabschnitt der Beschreibung der virtuellen Maschine 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>
Laut diesem Link ist es aus Gründen der Leistung und Zuverlässigkeit am besten, das Netzwerkgerätemodell so einzustellen virtio
, dass Sie dies im virtuellen Viewer tun können, indem Sie die i- Taste drücken, zur NIC-Einstellung wechseln und das "Gerätemodell" einstellen "zu virtio
. Sie können dies auch zum obigen XML-Code hinzufügen, indem Sie die folgende Zeile einfügen:
<model type='virtio'/>
Zusammenfassend
Das alles dauerte am 12.04 war:
- Installation von virt-manager, bridge-utils, qemu-kvm und verwandten Paketen
- Stellen Sie sicher, dass alle Benutzer, die kvm verwenden möchten, zur Gruppe libvirtd gehören.
- Definiere / etc / network / interfaces wie oben (passend zum zitierten Artikel)
- Starten Sie den Computer neu und vergewissern Sie sich, dass das Ethernet angeschlossen und drahtlos (falls vorhanden) ausgeschaltet ist.
- Führen Sie kvm entweder direkt mit einem Image aus
-device e1000,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0
, oder erstellen Sie mit virt-manager eine virtuelle Maschine, indem Sie unter Schritt 4-> Erweiterte Optionen die Netzwerkbrücke br0 angeben.
An Netzwerken, Funktionen, Vorlagen oder Konfigurationen waren keine weiteren Änderungen erforderlich.
Um einen Dienst in Ihrem neuen Gast dem Internet zugänglich zu machen, sollten Sie:
- Bereiten Sie den gewünschten Firewall-Dienst vor und konfigurieren Sie ihn.
- Weisen Sie entweder eine statische Adresse in Ihrer Gastkonfiguration oder in Ihrem DHCP-Dienst zu.
- Wenn Sie einen NAT-Router verwenden, öffnen Sie einen Port für den Dienst, den Sie implementieren, und leiten Sie ihn an die IP-Adresse des Gasts weiter.
Denken Sie daran, den Firewall-Dienst für Ihren Host-Computer zu testen und erneut zu aktivieren. Möglicherweise ist ein Eintrag erforderlich, um den Datenverkehr an den Gast weiterzuleiten.
Siehe https://help.ubuntu.com/community/KVM/Installation , https://help.ubuntu.com/community/KVM/Networking und https://help.ubuntu.com/12.04/serverguide/libvirt. html .
ifconfig
,brctl show
,brctl showmacs br0
, undip route
. Auf dem Gast:ifconfig
,ip route
,ping 8.8.8.8
,ping <your internet router>
, undtraceroute 8.8.8.8
. Ich kann nicht behaupten, dass ich kvm so konfiguriert habe, wie Sie es getan haben, aber ich habe es geschafft, mithilfe deskvm
Befehls eine Brücke zur Arbeit zu schlagen . Ich musste die drahtlose Verbindung trennen, damit mein Host eine Verbindung zum Internet herstellen konnte, und wie in den von Ihnen angegebenen Anweisungen angegeben, müssen Sie eine Verbindung zum Internet über Ethernet herstellen.