官术网_书友最值得收藏!

第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這樣的設備,它的數據結構如下參考http://blog.chinaunix.net/uid-7220314-id-208711.html。

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

主站蜘蛛池模板: 蓬莱市| 卢龙县| 建湖县| 慈溪市| 龙陵县| 石台县| 博爱县| 延安市| 开鲁县| 兴国县| 阳山县| 丽江市| 囊谦县| 吉安市| 武义县| 丰镇市| 龙江县| 嘉善县| 绥滨县| 荣成市| 醴陵市| 泰兴市| 庆安县| 化德县| 正安县| 成武县| 图们市| 东山县| 宜兰县| 民权县| 阿尔山市| 阿拉善左旗| 禄劝| 凤山县| 瓮安县| 抚松县| 津市市| 离岛区| 侯马市| 修武县| 卢氏县|