准备工作
以下方法适用于Ubuntu 12.04。在测试过程中,您应该禁用计算机的防火墙,以免干扰。
/etc/default/qemu-kvm文件应保持原始安装状态。
您需要安装bridge-utils
、qemu-kvm
和libvirt-bin
。任何使用虚拟机的用户都应该添加到libvirtd组中。
似乎不再需要添加CAP_NET_ADMIN权限。
网络设置
默认的网络模式是用户模式,也称为SLIRP。它使用预定义的virbr0桥接,该桥接通过NAT路由到宿主机。NAT路由使用内核的ip_forwarding功能和iptables。桥接模式使用虚拟桥接连接到客户机上的(未编号的)以太网接口,宿主机和客户机都在这个接口上有自己的网络接口。
以下图示可能更清晰地解释了不同之处:
你可以看到如何使用以下代码定义默认的用户网络:
virsh net-dumpxml default
我可以通过以下方法设置桥接模式:
在/etc/network/interfaces文件中(从您在问题中提到的桥接部分):
自动 lo
iface lo inet loopback
#自动 eth0
#iface eth0 inet dhcp
自动 eth0
iface eth0 inet manual
自动 br0
iface br0 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0
重新启动,并确保无线网络处于非活动状态。使用ip route命令检查默认IP路由。它必须使用br0接口。
注意:如果在进行此更改时未连接以太网,您需要将以太网电缆插入并获得载波,否则启动将停顿两分钟,并且您将无法进行网络操作。这是因为eth0接口在此文件中,必须在启动正常进行之前启动。
注意:通常情况下,您不能使用无线网络替代eth0,因为它们无法使用多个MAC地址(我推断它们需要第二个MAC地址用于桥接)。
作为一种替代方案,您可以禁用以太网的使用,并确保它没有IP地址,也没有使用
ip route
设置默认路由。然后:
sudo ifconfig eth0 0.0.0.0 up
sudo brctl addbr br0
sudo brctl addif br0 eth0
sudo ifconfig br0 up
sudo dhclient br0 &
您也可以在此处提供静态IP地址,并定义默认路由和DNS地址。 对于此示例,dhclient
将执行此操作。
这是我的路由表:
$ip route list
default via 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
使用kvm
然后我可以使用以下命令启动一个桥接的kvm虚拟机:
$ sudo kvm -name Quantal -m 1024 -hda foo.qcow2 --soundhw ac97 -device virtio-net,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0
-netdev tap
参数使sudo成为必需品。当启动虚拟机时,qemu-kvm运行以下命令:
ifconfig vnet0 0.0.0.0 up
brctl addif brctl addif br0 vnet0
这是通过/etc/qemu-ifup完成的。
将虚拟机的vnet0接口添加到br0桥接器中,因为上面的默认路由使用了该桥接器接口。如果没有它,tap接口将被添加到virbr0接口中。在我的实验中,由于virbr0接口未连接到互联网,因此会使用NAT将虚拟机连接到主机和互联网。您可以在/etc/default/qemu-kvm中将vnet0定向到特定的桥接器。在下面的virt-manager中,您可以明确指定连接到哪个桥接器。
由于qemu-kvm发出的上述命令以及-netdev tap,id=tunnel,ifname=vnet0
参数,该虚拟机与vnet0隧道连接,并且该隧道与br0桥接器相连。
我现在可以从我的网络上的另一台计算机直接ssh登录到这个虚拟机。
我的主机ifconfig
(注意运行虚拟机时出现的vnet0接口):
$ifconfig
br0 链路类型: 以太网 硬件地址: 00:1e:33:88:07:e5
IP地址: 192.168.1.45 广播地址: 255.255.255.255 子网掩码: 255.255.255.0
IPv6地址: fe80::21e:33ff:fe88:7e5/64 范围: 链路
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
接收数据包:6526 错误:0 丢弃:0 过载:0 帧:0
发送数据包:7543 错误:0 丢弃:0 过载:0 载波:0
冲突:0 发送队列长度:0
接收字节:2712940 (2.7 MB) 发送字节:1071835 (1.0 MB)
eth0 链路类型: 以太网 硬件地址: 00:1e:33:88:07:e5
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
接收数据包:7181 错误:0 丢弃:0 过载:0 帧:0
发送数据包:7740 错误:0 丢弃:0 过载:0 载波:0
冲突:0 发送队列长度:1000
接收字节:2974585 (2.9 MB) 发送字节:1096580 (1.0 MB)
中断:43 基址:0x6000
lo 链路类型: 本地环回
IP地址: 127.0.0.1 子网掩码: 255.0.0.0
IPv6地址: ::1/128 范围: 主机
UP LOOPBACK RUNNING MTU:16436 Metric:1
接收数据包:10 错误:0 丢弃:0 过载:0 帧:0
发送数据包:10 错误:0 丢弃:0 过载:0 载波:0
冲突:0 发送队列长度:0
接收字节:664 (664.0 B) 发送字节:664 (664.0 B)
vnet0 链路类型: 以太网 硬件地址: ca:0c:73:c3:bc:45
IPv6地址: fe80::c80c:73ff:fec3:bc45/64 范围: 链路
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
接收数据包:226 错误:0 丢弃:0 过载:0 帧:0
发送数据包:429 错误:0 丢弃:0 过载:0 载波:0
冲突:0 发送队列长度:500
接收字节:26919 (26.9 KB) 发送字节:58929 (58.9 KB)
virbr0 链路类型: 以太网 硬件地址: d6:18:22:db:ff:93
IP地址: 192.168.122.1 广播地址: 192.168.122.255 子网掩码: 255.255.255.0
UP BROADCAST MULTICAST MTU:1500 Metric:1
接收数据包:0 错误:0 丢弃:0 过载:0 帧:0
发送数据包:0 错误:0 丢弃:0 过载:0 载波:0
冲突:0 发送队列长度:0
接收字节:0 (0.0 B) 发送字节:0 (0.0 B)
在运行VM时,我的桥接配置如下:
$brctl show
bridge name bridge id STP enabled interfaces
br0 8000.001e338807e5 no eth0
vnet0
virbr0 8000.000000000000 yes
请注意,虚拟机的vnet0接口和eth0接口都连接到br0桥接器。
而且,在br0接口上的MAC地址为:
$brctl showmacs br0
端口编号 MAC地址 是否本地 过期计时器
1 00:05:5d:cf:64:61 否 2.54
1 00:19:d2:42:5d:3f 否 36.76
1 00:19:df:da:af:7c 否 2.86
1 00:1e:33:88:07:e5 是 0.00
1 00:60:0f:e4:17:d6 否 0.79
2 52:54:00:12:34:56 否 0.80
1 58:6d:8f:17:5b:c0 否 5.91
1 c8:aa:21:be:8d:16 否 167.69
2 ca:0c:73:c3:bc:45 是 0.00
请注意,br0接口将我的主机连接到由客户机使用的同一网桥。
你可以通过使用
traceroute 8.8.8.8
来检查你是否是通过桥接而不是NAT路由连接到自己的网络。如果第一个节点是你网络的路由器而不是客户端的IP地址,那么你的网络应该正常工作。
请参考
这份文档。
确保你已经安装了
virt-manager
和
hal
。
hal
软件包是
virt-manager
的建议依赖项,并且在创建或编辑虚拟机时用于确定系统的网络配置。
在上述定义了br0桥接的情况下,我使用virt-manager创建了一个虚拟机,步骤如下:
![enter image description here](https://istack.dev59.com/PEeql.webp)
我能直接从这个访客连接到我的家庭网络和互联网。我还能够从我家网络上的其他(非主机、非访客)Ubuntu计算机通过ssh登录到它。
以下是由virt-manager运行的非常长的kvm命令(供与EApubs或其他遇到问题的人进行比较):
/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
这是在/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>
根据
this链接,为了提高性能和可靠性,最好将网络设备模型设置为
virtio
。您可以通过在virt-viewer中按下
i按钮,进入NIC设置,并将"Device model"设置为
virtio
来实现这一点。您还可以通过添加以下行到上面的XML中来实现此功能:
<model type='virtio'/>
总结
在12.04上所需的全部步骤如下:
- 安装virt-manager、bridge-utils、qemu-kvm和相关软件包。
- 确保每个希望使用kvm的用户都在libvirtd组中。
- 将/etc/network/interfaces定义为上述内容(与引用的文章相匹配)。
- 重新启动计算机,确保以太网已连接,并关闭无线网络(如果有的话)。
- 要么直接对镜像运行kvm,例如:
-device e1000,netdev=tunnel -netdev tap,id=tunnel,ifname=vnet0
,要么使用virt-manager创建一个虚拟机,在第4步->高级选项面板下指定网络桥接br0。
网络、功能、模板或配置不需要进行进一步更改。
要将新客户机中的服务暴露给互联网,您应该执行以下操作:
- 准备并配置所需的防火墙服务。
- 在客户机配置或DHCP服务中分配静态地址。
- 如果使用NAT路由器,请打开一个端口,将其指向正在实施的服务,并将其定向到客户机的IP地址。
记得测试并重新启用防火墙服务,以便为您的主机计算机转发流量可能需要的任何条目。
请参阅
https://help.ubuntu.com/community/KVM/Installation,
https://help.ubuntu.com/community/KVM/Networking和
https://help.ubuntu.com/12.04/serverguide/libvirt.html。
ifconfig
、brctl show
、brctl showmacs br0
和ip route
。在客户机上:ifconfig
、ip route
、ping 8.8.8.8
、ping <您的互联网路由器>
和traceroute 8.8.8.8
。我不能说我已经按照您的方式配置了kvm,但是我已经成功使用kvm
命令进行了桥接。我确实不得不断开无线连接,以便我的主机能够连接到互联网,并且正如您引用的说明所说,您需要使用以太网连接到互联网。 - John S Gruberbrctl showmacs br0
列表中? - John S Gruber