SDN学习之路——第五天

  • Post author:
  • Post category:其他


这个系列的本意是督促我每天学习,但后来我发现我高估了自己(我并非每天都可以完成我的学习内容和这样一篇学习博客的),所以这篇这个系列其实并非真正意义上的按天来计算的。

言归正传,上篇博客提到要使用mininet来模拟实验,但实际操作中发现mininet本身并不支持ryu,好像也没办法模拟路由节点(或许有,但是我太菜啦,没有找到方法),所以在漫长的一段时间的折腾后,不得不放弃了mininet,而采用一种新的思路:在两台服务器上安装虚拟机来模拟主机,这些服务器被称为宿主机,两台宿主机通过交换机与另一台服务器相连,这台服务器上操作具体的路由设置,因此称为路由服务器;



实验拓扑

拓扑图



宿主机



安装openvswitch

具体的功能和代码实现前面已经学习过,所以在这里直接安装

sudo apt-get install openvswitch-switch



qemu-kvm



qemu

QEMU是一个主机上的VMM(virtual machine monitor),通过动态二进制转换来模拟CPU,并提供一系列的硬件模型,使guest os认为自己和硬件直接打交道,其实是同QEMU模拟出来的硬件打交道,QEMU再将这些指令翻译给真正硬件进行操作。通过这种模式,guest os可以和主机上的硬盘,网卡,CPU,CD-ROM,音频设备和USB设备进行交互。但由于所有指令都需要经过QEMU来翻译,因而性能会比较差。



kvm

Kernel-based Virtual Machine的简称,是一个开源的系统虚拟化模块,自Linux 2.6.20之后集成在Linux的各个主要发行版本中。它使用Linux自身的调度器进行管理,KVM的虚拟化是基于硬件的完全虚拟化,所以需要硬件支持(如Intel VT技术或者AMD V技术)。KVM中,虚拟机被实现为常规的 Linux 进程,由标准 Linux 调度程序进行调度;虚机的每个虚拟 CPU 被实现为一个常规的 Linux 进程,这使得 KMV 能够使用 Linux 内核的已有功能。但是,KVM 本身不执行任何硬件模拟,需要客户空间程序通过 /dev/kvm 接口设置一个客户机虚拟服务器的地址空间,向它提供模拟的 I/O,并将它的视频显示映射回宿主的显示屏。这个应用程序目前所用较多的就是上述的QEMU。



安装qemu-kvm

qemu-kvm架构

Qemu模拟其他的硬件,如Network, Disk,同样会影响这些设备的性能,于是产生了pass through半虚拟化设备virtio_blk, virtio_net,提高设备性能。

  1. 安装qemu-kvm
sudo apt install libvirt qemu-kvm virt-manager
  1. 新建虚拟机
  • virt-install
virt-install \ --name=h181 \ --location=/xx/xx/ubuntu-server14.0.2.iso \ --nongraphics \ --ram=2048 \ --network bridge=br0 \ --os-type=linux \ --extra-args='console=tty0 console=ttyS0,115200n8 serial'

其中extra-args是为了设置虚拟机的console,如果不设置可能会出现当你virt console h181时完全没反应的情况。

  • virt-manager
sudo virt-manager

之后按照提示即可,个人觉得这种方式还是比第一种简单一点

  • 使用 qemu-img 和 qemu-kvm 命令行方式安装

    这种方式我还没有尝试过,感兴趣的话可以去尝试搜索一下



根据拓扑图创建网络

  1. 宿主机A上创建三个虚拟机
  2. 然后创建一个ovs bridge,命名为Access,
sudo ovs-vsctl add-br Access
  1. 将3个虚拟机桥接到该br上

    桥接到Access

但是当你想要启动的时候会提示”unable to add bridge Access port vnet0 :operation not supported”,这是因为启动虚拟机时 libvirt 会尝试 linux 默认的LinuxBridge,而不是openvswitch,所以需要修改虚拟机的配置文件

homer@homer:~/~$ sudo vim /etc/libvirt/qemu/h181.xml
……
<interface type='bridge'>
      <mac address='52:54:08:9a:4e:ac'/>
      <source bridge='Access'/>
      <virtualport type='openvswitch' />
      <model type='virtio'/>
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
</interface>
……

之后再启动虚拟机即可,或者先sudo virsh define /etc/libvirt/qemu/h181.xml再启动,此时查看ovs:

homer@homer:~$ sudo ovs-vsctl show
9811bcfb-752f-4421-8228-d1c932f68b5b
	Bridge "Access"
		Port "vnet1"
			interface "vnet1"
		Port "vnet0"
			interface "vnet0"
		Port "vnet2"
			interface "vnet2"
		Port "Access"
			interface "Access"
				type: internal
	ovs-version: "2.5.5"
  1. 然后将这些port设置为access模式
homer@homer:~$ sudo ovs-vsctl set port vnet0 vlan_mode=access tag=261
homer@homer:~$ sudo ovs-vsctl set port vnet1 vlan_mode=access tag=265
homer@homer:~$ sudo ovs-vsctl set port vnet2 vlan_mode=access tag=291
homer@homer:~$ sudo ovs-vsctl show
9811bcfb-752f-4421-8228-d1c932f68b5b
	Bridge "Access"
		Port "vnet1"
			tag: 261
			interface "vnet1"
		Port "vnet0"
			tag: 265
			interface "vnet0"
		Port "vnet2"
			tag: 291
			interface "vnet2"
		Port "Access"
			interface "Access"
				type: internal
	ovs-version: "2.5.5"
  1. 将服务器的网卡也绑定到Access上的一个port,并设置为trunk模式
homer@homer:~$ sudo ovs-vsctl add-port Access eno49
homer@homer:~$ sudo ovs-vsctl set port eno49 vlan_mode=trunk trunk=261,265,291
homer@homer:~$ sudo ovs-vsctl show
9811bcfb-752f-4421-8228-d1c932f68b5b
	Bridge "Access"
		Port "eno49"
			trunks: [261,265,291]
			interface "eno49"
		Port "vnet1"
			tag: 261
			interface "vnet1"
		Port "vnet0"
			tag: 265
			interface "vnet0"
		Port "vnet2"
			tag: 291
			interface "vnet2"
		Port "Access"
			interface "Access"
				type: internal
	ovs-version: "2.5.5"



Router服务器

调用ovs生成若干个bridge,作为虚拟路由节点(Router),再在这些bridge上创建若干port,为每个port打上相应的vlan tag,作为路由接口,同时生成一个专用bridge,上面配置所有相关路由节点对应的port,配置vlan tag,再将服务器的网卡接口绑定到一个port,作为最终的网络流量出入口。

后台程序启动Ryu主程序(此时为SDN控制器角色),启动后通过OpenFlow通道与之前配置的brige(作为路由节点,此时为OpenFlow交换机角色)建立连接关系,计算生成任意两个节点间的最短路径,以此为依据生成路由表路由,通过HTTP 的POST方式传递到已经启动的Ryu主程序,再由SDN控制器将这些接收到的配置信息处理后,以流表的形式下下发到每个路由节点。



版权声明:本文为ssdut_wmh原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。