openstack neutron中定义了四种网络模式:
你可以选择编译进内核或者是编译成模块,然后重新编译内核并用新内核启动。如果你编译的是模块,那么在下步开始之前,你需要手工加载它。
开始编程
- # tenant_network_type = local
- # tenant_network_type = vlan
- # Example: tenant_network_type = gre
- # Example: tenant_network_type = vxlan
本文主要以vlan为例,并结合local来详细的分析下openstack的网络模式。
TUN/TAP虚拟网络设备为用户空间程序提供了网络数据包的发送和接收能力。他既可以当做点对点设备(TUN),也可以当做以太网设备(TAP)。实际上,不仅Linux支持TUN/TAP虚拟网络设备,其他UNIX也是支持的,他们之间只有少许差别。
原理简介
TUN/TAP虚拟网络设备的原理比较简单,他在Linux内核中添加了一个TUN/TAP虚拟网络设备的驱动程序和一个与之相关连的字符设备/dev/net/tun,字符设备tun作为用户空间和内核空间交换数据的接口。当内核将数据包发送到虚拟网络设备时,数据包被保存在设备相关的一个队列中,直到用户空间程序通过打开的字符设备tun的描述符读取时,它才会被拷贝到用户空间的缓冲区中,其效果就相当于,数据包直接发送到了用户空间。通过系统调用write发送数据包时其原理与此类似。
值得注意的是:一次read系统调用,有且只有一个数据包被传送到用户空间,并且当用户空间的缓冲区比较小时,数据包将被截断,剩余部分将永久地消失,write系统调用与read类似,每次只发送一个数据包。所以在编写此类程序的时候,请用足够大的缓冲区,直接调用系统调用read/write,避免采用C语言的带缓存的IO函数。
准备工作
首先你需要一个能工作的Linux操作系统,并且内核支持TUN/TAP虚拟网络设备,如果没有,请在内核中选中:
Device Drivers => Network device support => Universal TUN/TAP device driver support |
你可以选择编译进内核或者是编译成模块,然后重新编译内核并用新内核启动。如果你编译的是模块,那么在下步开始之前,你需要手工加载它。
root@gentux ~ # modprobe tun |
开始编程