《深入理解OpenStack Neutron》—2 Linux虚拟网络基础
第2章
Linux虚拟网络基础
Neutron在构建网络服务时,利用了很多Linux虚拟网络功能(Linux内核中的虚拟网络设备以及其他网络功能)。为了对Neutron有一个全面的理解,掌握一些Linux虚拟网络知识是必要的。本章将从使用方法入手,对与Neutron密切相关的Linux虚拟网络功能进行简单介绍。
2.1 tap
Linux在谈到tap时,经常会与tun并列谈论。两者都是操作系统内核中的虚拟网络设备。tap位于二层,tun位于三层。需要说明的是,这里所说的设备(Device)是Linux的概念,不是我们平时生活中所说的设备。比如,生活中,我们常常把一台物理路由器称为一台设备,
如图2-1所示。
而Linux所说的设备,其背后指的是一个类似于数据结构、内核模块或设备驱动这样的含义。像tun/tap这样的设备,它的数据结构如下:
struct tun_struct {
char name[8]; // 设备名
unsigned long flags; // 区分tun和tap设备
struct fasync_struct *fasync; // 文件异步通知结构
wait_queue_head_t read_wait; // 等待队列
struct net_device dev; // Linux抽象网络设备结构
struct sk_buff_head txq; // 网络缓冲区队列
struct net_device_stats stats; // 网卡状态信息结构
};
我们看到,甚至连数据结构,tap与tun的定义都是同一个,两者仅仅是通过一个Flag来区分。不过从背后所承载的功能而言,两者还是有比较大的区别:tap位于网络OSI模型的二层(数据链路层),tun位于网络的三层。本节暂时只介绍tap,tun会在后面的章节专门介绍。
tap从功能定位上来讲,位于数据链路层,数据链路层的主要协议有:
1)点对点协议(Point-to-Point Protocol);
2)以太网(Ethernet);
3)高级数据链路协议(High-Level Data Link Protocol);
4)帧中继(Frame Relay);
5)异步传输模式(Asynchronous Transfer Mode)。
但是tap只是与其中一种协议以太网(Ethernet)协议对应。所以,tap有时也称为“虚拟以太设备”。
要想使用Linux命令行操作一个tap,首先Linux得有tun模块(Linux使用tun模块实现了tun/tap),检查方法如下:
# 如果敲击 Linux 命令行 modinfo tun,有如下输出,则说明具有 tun 模块
modinfo tun
filename: /lib/modules/4.5.5-300.fc24.x86_64/kernel/drivers/net/tun.ko.xz
alias: devname:net/tun
alias: char-major-10-200
......
当Linux版本具有tun模块时,还得看看其是否已经加载,检查方法如下:
lsmod | grep tun
tun 28672 2
如果已经加载,则会出现上述的“tun***”那一行。如果没有加载,则使用如下命令进行加载:
modprobe tun
当我们确认Linux加载了tun模块以后,我们还需要确认Linux是否有操作tun/tap的命令行工具tunctl。在Linux中输入以下命令:
tunctl help
输入这个命令后,如果Linux有输出,则说明OK,否则我们执行如下命令行以安装tunctl:
yum install tunctl
具备了tun和tunctl以后,我们就可以创建一个tap设备了,命令行也很简单,如下:
tunctl -t tap_test
Set 'tap_test' persistent and owned by uid 0
我们可以通过如下命令来查看刚刚创建的tap(名字是tap_test):
ip link list
...
13: tap_test: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN mode DEFAULT
group default qlen 1000
link/ether 2e:72:30:19:4e:bb brd ff:ff:ff:ff:ff:ff
我们也可以通过如下命令来查看:
ifconfig -a
...
tap_test: flags=4098<BROADCAST,MULTICAST> mtu 1500
ether 2e:72:30:19:4e:bb txqueuelen 1000 (Ethernet)
...
通过上面的命令行输出,我们看到,这个tap_test还没有绑定IP地址。执行如下命令,给其绑定IP地址:
# 使用 ip addr 命令绑定 IP 地址命令
ip addr add local 192.168.100.1/24 dev tap_test
# 或者使用 ifconfig 命令绑定 IP 地址命令
ifconfig tap_test 192.168.100.1/24
使用ifconf?ig -a命令再查看一下:
ifconfig -a
......
tap_test: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 192.168.100.1 netmask 255.255.255.0 broadcast 0.0.0.0
......
配置完IP以后,一个tap设备就创建完毕了。我们会在后面的章节中通过测试用例,继续讲述tap的用法。
- 点赞
- 收藏
- 关注作者
评论(0)