在使用虚拟机搭建Openstack多节点环境时,虚拟机节点中的估算节点和控制节点起码须要两个网卡插口,并且默认的云端虚拟机只有一个网卡插口。所以须要在Linux虚拟机上搭建起码一块假网卡来完成Openstack多节点的搭建。先来介绍下tun/tap:一:tun/tap驱动程序实现了虚拟网卡的功能,tun表示虚拟的是点对点设备,tap表示虚拟的是以太网设备,这两种设备针对网路包施行不同的封装。

借助tun/tap驱动,可以将tcp/ip合同栈处理好的网路发包传给任何一个使用tun/tap驱动的进程,由进程重新处理后再发到化学链路中。

开源项目openvpn()和Vtun()都是借助tun/tap驱动实现的隧洞封装。

二:Tun/Tap驱动程序工作原理做为虚拟网卡驱动,Tun/Tap驱动程序的数据接收和发送并不直接和真实网卡打交道,他在Linux内核中添加了一个TUN/TAP虚拟网路设备的驱动程序和一个与之相关连的字符设备/dev/net/tun,字符设备tun作为用户空间和内核空间交换数据的插口。当内核将数据包发送到虚拟网路设备时,数据包被保存在设备相关的一个队列中,直至用户空间程序通过打开的字符设备tun的描述符读取时,它就会被拷贝到用户空间的缓冲区中,其疗效就相当于,数据包直接发送到了用户空间。通过系统调用write发送数据包时其原理与此类似。

在linux下,要实现内核空间和用户空间数据的交互,有多种形式:

(1)可以通用socket创建特殊套接字linux apache 虚拟主机,借助套接字实现数据交互;

linux虚拟网络设备_linux虚拟设备_linux虚拟化网络

(2)通过proc文件系统创建文件来进行数据交互;

(3)还可以使用设备文件的形式,访问设备文件会调用设备驱动相应的解释器,设备驱动本身就是内核空间和用户空间的一个插口,Tun/tap驱动就是借助设备文件实现用户空间和内核空间的数据交互。

linux虚拟设备_linux虚拟化网络_linux虚拟网络设备

从结构上来说,Tun/tap驱动并不单纯是实现网卡驱动linux虚拟网络设备,同时它还实现了字符设备驱动部份。以字符设备的方法联接用户空间和内核空间。下边是示意图:

linux虚拟设备_linux虚拟网络设备_linux虚拟化网络

这儿窃取下他人的图片。

Tun/tap驱动程序中包含两个部份,一部份是字符设备驱动linux虚拟网络设备,还有一部份是网卡驱动部份。借助网卡驱动部份接收来自TCP/IP合同栈的网路发包并发送或则反过来将接收到的网路发包传给合同栈处理,

而字符驱动部份则将网路发包在用户空间和内核空间之间传送linux端口映射,模拟化学链路的数据接收和发送。Tun/tap驱动挺好的实现了两种驱动的结合。

三:现今步入最为重要的安装步骤这篇文章主要针对centos7tun/tap网卡的安装,下边是具体的步骤:

//1. 确认内核是否支持tun/tap,确认内核是否有tun模块
  [root@guanxiaojue]# modinfo tun
  filename:       /lib/modules/2.6.34.7-56.fc13.i686.PAE/kernel/drivers/net/tun.ko
  alias:          char-major-10-200
  license:        GPL
  author:         (C) 1999-2004 Max Krasnyansky 
  description:    Universal TUN/TAP device driver
  srcversion:     880DE258930FE60D765B735
  depends:        
  vermagic:       2.6.34.7-56.fc13.i686.PAE SMP mod_unload 686 
//如上所示,则说明内核支持tun/tap虚拟网卡
//2.加载内核模块 
  [root@guanxiaojue ~]#  modprobe tun
  [root@guanxiaojue ~]# lsmod | grep tun
  tun                    10548  1 
//如上显示,则说明内核模块加载成功
//3.添加centos7的tunctl源
(1)创建下面的文件: /etc/yum.repos.d/nux-misc.repo:
    [nux-misc]
    name=Nux Misc
    baseurl=http://li.nux.ro/download/nux/misc/el7/x86_64/
    enabled=0
    gpgcheck=1
    gpgkey=http://li.nux.ro/download/nux/RPM-GPG-KEY-nux.ro
(2)安装tunctl rpm包
    # yum --enablerepo=nux-misc install tunctl
//4.使用tunctl新建虚拟网卡
(1)创建网卡的设备文件:
    [root@guanxiaojue ~]# tunctl -t tap0 -u root//如果是非root用户则需要sudo下2)设置虚拟网卡:
    [root@guanxiaojue ~]# ifconfig tap0 192.168.0.1  netmask 255.255.255.0 promisc
经过如上操作后,虚拟网卡已经建立和配置好了。
//5.作为系统服务启动网卡
编写配置脚本(符合chkconfig规范)
  [root@guanxiaojue ~]# cat /etc/init.d/config_tap 
  #!/bin/bash
  #
  # config_tap          Start up the tun/tap virtual nic
  #
  # chkconfig: 2345 55 25
  USER="root"
  TAP_NETWORK="192.168.0.1"
  TAP_DEV_NUM=0
  DESC="TAP config"
  do_start() {
    if [ ! -x /usr/sbin/tunctl ]; then
      echo "/usr/sbin/tunctl was NOT found!"
      exit 1
    fi
    tunctl -t tap$TAP_DEV_NUM -u root
    ifconfig tap$TAP_DEV_NUM ${TAP_NETWORK}  netmask 255.255.255.0 promisc
    ifconfig tap$TAP_DEV_NUM
  }
  do_stop() {
    ifconfig tap$TAP_DEV_NUM down 
  }
  do_restart() {
    do_stop
    do_start
  }
  check_status() {
    ifconfig tap$TAP_DEV_NUM 
  }
  case $1 in 
    start)    do_start;;
    stop)     do_stop;;
    restart)  do_restart;;
    status)
              echo "Status of $DESC: "
              check_status
              exit "$?"
              ;;
    *)
  echo "Usage: $0 {start|stop|restart|status}"
  exit 1 
  esac
可以根据具体需求修改此脚本
//6.加入到系统服务中
  [root@guanxiaojue ~]# chkconfig --add config_tap 
  [root@guanxiaojue ~]# chkconfig --level 345 config_tap on
操作完成后,就可以像其他标准服务一样,通过service config_tap start来进行创建和启动操作

欢迎加入:

Tagged:
Author

这篇优质的内容由TA贡献而来

刘遄

《Linux就该这么学》书籍作者,RHCA认证架构师,教育学(计算机专业硕士)。

发表回复