前言
《使用Libvirt创建虚拟机》一文中,我们学会了使用Libvirt创建虚拟机的方法。
但是,文中创建的虚拟机只能在宿主机node0上访问,node1就无法访问,也就是说虚拟机和宿主机外部的网络还没有打通。
本文,就来研究一下虚拟机网络配置的方法,使得node1也可以访问到node0中的虚拟机。
网络配置1
最简单的实现方法,就是VM要有一个对外提供服务的IP,这个IP不依赖于宿主机,而是和宿主机的IP同级。
参考KVM 以及桥接网络配置和libvirt kvm 虚拟机上网 – Bridge桥接进行配置。
1、在node0的网络配置中进行修改:
1 | #auto eth0 |
使用br0替代eth0,eth0做流量转发。
2、重启网络
1 | /etc/init.d/networking restart |
3、修改路由(可选)
1 | route -n |
同样的,在node1中也配置br0。
下面参考虚拟机在线添加网卡,添加网卡。
4、添加网卡
1 | virsh domiflist cirros |
如果在实例开机状态下添加网卡,需要重启实例后才能看到。
5、网卡信息保存到配置文件
1 | virsh dumpxml cirros >/etc/libvirt/qemu/cirros.xml |
PS:删除网卡
1 | virsh detach-interface cirros --type bridge --mac 52:54:00:09:36:ad |
6、登录实例后,配置新网卡的IP
1 | sudo vi /etc/network/interfaces |
添加eth1的配置:
1 | auto eth1 |
7、重启实例
1 | 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配置
1 | virsh edit cirros |
找到:
1 | <interface type='bridge'> |
把source中的br0改为eth0。
2、重启实例
1 | virsh shutdown cirros |
报错:
1 | error: Failed to start domain cirros |
想法是美好的,但是行不通啊!
参考Attaching a Virtual NIC Directly to a Physical Interface进行修改,但是又报出了其他错误:
1 | error: Failed to start domain cirros |
参考Using KVM with Libvirt and macvtap Interfaces也许可以解决,但是感觉好麻烦,所以决定放弃这个方案。
网络配置3
如果,再创建一个网桥,这个网桥不指定IP呢?如下图:
1、创建新网桥br1
1 | vim /etc/network/interfaces |
添加:
1 | auto br1 |
2、启动br1
1 | ifup br1 |
报错:
1 | device eth0 is already a member of a bridge; can't enslave it to bridge br1. |
由上可知,一个物理网卡,只能绑定到一个网桥上。所以,这个想法也是行不通的。
网络配置4
那么,把br1绑定到eth2(eth1是上网网卡)上面呢?如下图:
1、修改br1配置
1 | vim /etc/network/interfaces |
如下修改:
1 | auto eth2 |
2、启动br1
1 | ifup eth2 |
3、编辑cirros配置,修改br0为br1,重启cirros。
结果,vm0到switch0依然不通。证明这个方案也不行。
网络配置5
网络配置2、3、4都不行,看来拍脑门想出来的方法不太靠谱。实际上网络配置1应该是可以的,但是,却无法连通,问题出在哪里呢?莫非,是因为virtualbox?virtualbox有多种网络模式,node1和node2使用的是Host-only Adapter,如果换成Bridged Adapter呢?那就试试吧!结果,依然失败。
后记
还能不能愉快地玩耍了?明明很简单的桥接,为啥就不通呢?诡异,实在诡异。郝同学表示已经无能为力,留个坑吧!