整了一上午也没能把在本机上跑的mininet网络中的host与虚拟机连接成功,于是就先放一放,尝试直接连接硬件设备就好了。在官方的例子中,有一个例子hwintf.py就是来为这件事情工作的,可以先看其源码:
#!/usr/bin/python
"""
This example shows how to add an interface (for example a real
hardware interface) to a network after the network is created.
"""
import re
import sys
from mininet.cli import CLI
from mininet.log import setLogLevel, info, error
from mininet.net import Mininet
from mininet.link import Intf
from mininet.topolib import TreeTopo
from mininet.util import quietRun
def checkIntf( intf ):
"Make sure intf exists and is not configured."
config = quietRun( 'ifconfig %s 2>/dev/null' % intf, shell=True )
if not config:
error( 'Error:', intf, 'does not exist!\n' )
exit( 1 )
ips = re.findall( r'\d+\.\d+\.\d+\.\d+', config )
if ips:
error( 'Error:', intf, 'has an IP address,'
'and is probably in use!\n' )
exit( 1 )
if __name__ == '__main__':
setLogLevel( 'info' )
# try to get hw intf from the command line; by default, use eth1
intfName = sys.argv[ 1 ] if len( sys.argv ) > 1 else 'eth1'
info( '*** Connecting to hw intf: %s' % intfName )
info( '*** Checking', intfName, '\n' )
checkIntf( intfName )
info( '*** Creating network\n' )
net = Mininet( topo=TreeTopo( depth=1, fanout=2 ) )
switch = net.switches[ 0 ]
info( '*** Adding hardware interface', intfName, 'to switch',
switch.name, '\n' )
_intf = Intf( intfName, node=switch )
info( '*** Note: you may need to reconfigure the interfaces for '
'the Mininet hosts:\n', net.hosts, '\n' )
net.start()
CLI( net )
net.stop()
其中的函数checkInf()是用来确认是否存在你想加入的物理接口以及该接口是否在占用。比如我主机中存在一个物理网卡eno1,如果我想要把它接入到网络中,我应该在bash中运行:
sudo python Downloads/mininet/examples/hwintf.py eno1
这时候会出现错误信息Error: eno1 has an IP address,and is probably in use!,说明该接口被占用了,这是当然了,因为我还在上着网呢,肯定显示被占用了。为了让该网卡闲置,在bash中输入:
sudo ifconfig eno1 0.0.0.0
再次运行例子,就可以看到进入到了mininet界面中了,在其中运行dump可以查看所有节点的信息,如交换机s1的信息:
<OVSSwitch s1: lo:127.0.0.1,s1-eth1:None,s1-eth2:None,eno1:None pid=24613>
可以观察到,出现了eno1这个物理网卡接口。
在checkInf()中检查不存在物理网络的错误也运行一下作为例子,在bash中直接运行:
sudo python Downloads/mininet/examples/hwintf.py
会显示错误信息:Error: eth1 does not exist! 因为在默认情况下,如果没有在bash中输入接口名字,它是缺省为eth1的,当然我的物理接口中不存在eth1,所以就报错不存在这个eth1了。
在上述的代码中主要是分为了两个大步骤:第一是检查该物理接口、第二是设置该物理接口连接到给定交换机。
checkIntf( intfName )
_intf = Intf( intfName, node=switch ) 这两句是最重要的语句
因为刚刚领到的笔记本是一台magic book,没有以太网的接口,木有的办法,只能等到在京东上买的usb转接口来了看看能不能直接在该物理接口上实现连接硬件。
后续连接时候再进行更新。
emmm......
emmm........
中午乘着工友在睡觉,把工友的电脑当做小白鼠试了一下,当运行完:
sudo python Downloads/mininet/examples/hwintf.py eno1
把我的网口用网线插到了我工友的电脑上,然后修改一下IP和mask IP地址,改成和mininet中的host在同一网段即可,为
IP:10.0.0.3, mask IP:255.0.0.0
然后打开了一下h1的xterm ,于是乎开始尝试ping那台主机了。
ping 10.0.0.3 #ping成功了,但是时间较长,1.2-1.5ms之间
ping 10.0.0 2 #ping h2,时间为0.4-0.5ms之间
ping 10.0.0.1 #ping 自己,时间为0.04-0.06ms之间
可以看出之间硬件链接成功了,只是数据交换的速度看起来比模拟出来的host也慢很多。
不过这是添加新的主机到原有的模拟网络上,有没有方法把模拟网络中的host直接换成物理主机呢,这个还需要研究。