Libvirt虚拟机网络配置

文章目录
  1. 1. 前言
  2. 2. 网络配置1
  3. 3. 网络配置2
  4. 4. 网络配置3
  5. 5. 网络配置4
  6. 6. 网络配置5
  7. 7. 后记
  8. 8. 书签

前言

通过《使用Libvirt创建虚拟机》一文,我们已经学会使用Libvirt创建虚拟机的方法,而且学会了虚拟机的一些基本配置方法。但是,文中创建的虚拟机只能在node0上访问,node1就无法访问,也就是说无法对外网提供服务。

本文,就来研究一下虚拟机网络配置的方法,使得node1也可以访问到node0中的虚拟机。最简单的实现方法,就是VM要有一个对外提供服务的IP,这个IP不依赖于宿主机,而是和宿主机的IP同级。

网络配置1

参考KVM 以及桥接网络配置libvirt kvm 虚拟机上网 – Bridge桥接进行配置。

1、在node0的网络配置中进行修改:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#auto eth0
#iface eth0 inet static
#address 192.168.56.200
#netmask 255.255.255.0

auto eth0
iface eth0 inet manual
up ifconfig $IFACE 0.0.0.0 up
up ifconfig $IFACE promisc

auto br0
iface br0 inet static
address 192.168.56.200
netmask 255.255.255.0
gateway 192.168.56.1
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

使用br0替代eth0,eth0做流量转发。

2、重启网络
/etc/init.d/networking restart

3、修改路由(可选)

1
2
3
route -n
route del -net 192.168.56.0/24 dev eth0
route add -net 192.168.56.0/24 dev br0

同样的,在node1中也配置br0。

下面参考虚拟机在线添加网卡,添加网卡。

4、添加网卡

1
2
3
virsh domiflist cirros
virsh attach-interface cirros --type bridge --source br0 --config
virsh domiflist cirros


如果在实例开机状态下添加网卡,需要重启实例后才能看到。

5、网卡信息保存到配置文件

1
2
virsh dumpxml cirros >/etc/libvirt/qemu/cirros.xml 
virsh define /etc/libvirt/qemu/cirros.xml

PS:删除网卡

1
virsh detach-interface cirros --type bridge --mac 52:54:00:09:36:ad

6、登录实例后,配置新网卡的IP
sudo vi /etc/network/interfaces,添加eth1的配置:

1
2
3
4
auto eth1
iface eth1 inet static
address 192.168.56.202
netmask 255.255.255.0

7、重启实例
sudo reboot
至此,实例桥接网络配置完成。

8、测试网络
在node0上ping 192.168.56.202 -c2,正常。
在node1上ping 192.168.56.202 -c2,不通。
在virtualbox宿主机上ping 192.168.56.202 -c2,不通。

以上,我们的配置失败了,因为除了node0,其他机器无法访问实例。下面我们来分析一下当前网络,如下图:

经过测试,node0到switch0是通的,node0到vm0是通的,但是vm0到switch0不通。诡异,理论上应该是通的啊!

网络配置2

那么,怎么打通vm0到switch0呢?最容易想到的,是把vm0直接连接到eth0上,而br0单纯作为node0的管理网络。修改后的方案如下图:

1、修改cirros配置
virsh edit cirros,找到:

1
2
3
4
5
6
<interface type='bridge'>
<mac address='52:54:00:09:36:ad'/>
<source bridge='br0'/>
<model type='rtl8139'/>
<address type='pci' domain='0x0000' bus='0x00' slot='0x06' function='0x0'/>
</interface>

把source中的br0改为eth0。

2、重启实例

1
2
virsh shutdown cirros
virsh start cirros

报错:

1
2
error: Failed to start domain cirros
error: Unable to add bridge eth0 port vnet1: Operation not supported

想法是美好的,但是行不通啊!参考Attaching a Virtual NIC Directly to a Physical Interface进行修改,但是又报出了其他错误:

1
2
error: Failed to start domain cirros
error: error creating macvtap interface macvtap0@eth0 (52:54:00:c8:33:b3): Device or resource busy

参考Using KVM with Libvirt and macvtap Interfaces也许可以解决,但是感觉好麻烦,所以决定放弃这个方案。

网络配置3

如果,再创建一个网桥,这个网桥不指定IP呢?如下图:

1、创建新网桥br1
vim /etc/network/interfaces,添加:

1
2
3
4
5
6
auto br1
iface br1 inet dhcp
bridge_ports eth0
bridge_stp off
bridge_fd 0
bridge_maxwait 0

2、启动br1
ifup br1,报错:

1
2
3
device eth0 is already a member of a bridge; can't enslave it to bridge br1.
Internet Systems Consortium DHCP Client 4.3.3
......

由上可知,一个物理网卡,只能绑定到一个网桥上。所以,这个想法也是行不通的。

网络配置4

那么,把br1绑定到eth2(eth1是上网网卡)上面呢?如下图:

1、修改br1配置
vim /etc/network/interfaces,如下修改:

1
2
3
4
5
6
7
8
9
10
11
auto eth2
iface eth2 inet manual
up ifconfig $IFACE 0.0.0.0 up
up ifconfig $IFACE promisc

auto br1
iface br1 inet dhcp
bridge_ports eth2
bridge_stp off
bridge_fd 0
bridge_maxwait 0

2、启动br1

1
2
ifup eth2
ifup br1

3、编辑cirros配置,修改br0为br1,重启cirros。
结果,vm0到switch0依然不通。证明这个方案也不行。

网络配置5

网络配置2、3、4都不行,看来拍脑门想出来的方法不太靠谱。实际上网络配置1应该是可以的,但是,却无法连通,问题出在哪里呢?莫非,是因为virtualbox?virtualbox有多种网络模式,node1和node2使用的是Host-only Adapter,如果换成Bridged Adapter呢?那就试试吧!结果,依然失败。

后记

还能不能愉快地玩耍了?明明很简单的桥接,为啥就不通呢?诡异,实在诡异。小编表示已经无能为力,留个坑吧!

书签

KVM/Networking

Networking

VirtualNetworking

KVM and OVS on Ubuntu 16.04

ubuntu16.04 配置kvm openvswitch 桥接环境

Open vSwitch + libvirt 搭建vlan网络

How to Put a KVM Guest Domain on a Bridged Network