- 深入理解OpenStack Neutron
- 李宗標
- 1026字
- 2019-01-04 06:09:56
第2章 Linux虛擬網絡基礎
Neutron在構建網絡服務時,利用了很多Linux虛擬網絡功能(Linux內核中的虛擬網絡設備以及其他網絡功能)。為了對Neutron有一個全面的理解,掌握一些Linux虛擬網絡知識是必要的。本章將從使用方法入手,對與Neutron密切相關的Linux虛擬網絡功能進行簡單介紹。
2.1 tap
Linux在談到tap時,經常會與tun并列談論。兩者都是操作系統內核中的虛擬網絡設備。tap位于二層,tun位于三層。需要說明的是,這里所說的設備(Device)是Linux的概念,不是我們平時生活中所說的設備。比如,生活中,我們常常把一臺物理路由器稱為一臺設備,如圖2-1所示。

圖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
使用ifconfig -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的用法。