Openvswitch原理與程式碼分析(1):總體架構

來源:互聯網
上載者:User
一、Opevswitch總體架構

 

Openvswitch的架構網上有如下的圖表示:

 

 

 

每個模組都有不同的功能 ovs-vswitchd 為主要模組,實現交換器的守護進程daemon

 

在Openvswitch所在的伺服器進行ps aux可以看到以下的進程

root 1008 0.1 0.8 242948 31712 ? S<Ll Aug06 32:17 ovs-vswitchd unix:/var/run/openvswitch/db.sock -vconsole:emer -vsyslog:err -vfile:info --mlockall --no-chdir --log-file=/var/log/openvswitch/ovs-vswitchd.log --pidfile=/var/run/openvswitch/ovs-vswitchd.pid --detach --monitor

 

注意這裡ovs-vswitchd監聽了一個原生db.sock檔案

  openvswitch.ko為Linux核心模組,支援資料流在核心的交換

 

我們使用lsmod列舉載入到核心的模組:

~# lsmod | grep openvswitch

openvswitch 66901 0

gre 13808 1 openvswitch

vxlan 37619 1 openvswitch

libcrc32c 12644 2 btrfs,openvswitch

 

既有Openvswitch.ko,也有 ovsdb-server 輕量級資料庫伺服器,儲存配置資訊,ovs-vswitchd通過這個資料庫擷取配置資訊

 

通過ps aux可以看到如下進程

root 985 0.0 0.0 21172 2120 ? S< Aug06 1:20 ovsdb-server /etc/openvswitch/conf.db -vconsole:emer -vsyslog:err -vfile:info --remote=punix:/var/run/openvswitch/db.sock --private-key=db:Open_vSwitch,SSL,private_key --certificate=db:Open_vSwitch,SSL,certificate --bootstrap-ca-cert=db:Open_vSwitch,SSL,ca_cert --no-chdir --log-file=/var/log/openvswitch/ovsdb-server.log --pidfile=/var/run/openvswitch/ovsdb-server.pid --detach –monitor

 

可以看出,ovsdb-server將配置資訊儲存在conf.db中,並通過db.sock提供服務,ovs-vswitchd通過這個db.sock從這個進程讀取配置資訊。

/etc/openvswitch/conf.db是json格式的,可以通過命令ovsdb-client dump將資料庫結構列印出來。

 

資料庫結構包含如下的表格。

 

 

資料庫結構如下:

 

 

通過ovs-vsctl建立的所有的橋接器,網卡,都儲存在資料庫裡面,ovs-vswitchd會根據資料庫裡面的配置建立真正的橋接器,網卡。

ovs-dpctl 用來配置switch核心模組。

ovs-vsctl 查詢和更新ovs-vswitchd的配置。

ovs-appctl 發送命令訊息,運行相關daemon。

ovs-ofctl 查詢和控制OpenFlow交換器和控制器。

  二、Openvswitch的代碼結構

 

Openvwitch進行資料流交換的主要邏輯都是在ovs-vswitchd和openvswitch.ko裡面實現的。

 

 

ovs-vswitchd會從ovsdb-server讀取配置,然後調用ofproto層進行虛擬網卡的建立或者流表的操作。

Ofproto是一個庫,實現了軟體的交換器和對流表的操作。

Netdev層抽象了串連到虛擬交換器上的網路裝置。

Dpif層實現了對於流表的操作。

 

對於OVS來講,有以下幾種網卡類型

1). netdev: 通用網卡裝置 eth0 veth

接收: 一個nedev在L2收到報文後回直接通過ovs接收函數處理,不會再走傳統核心協議棧.

發送: ovs中的一條流指定從該netdev發出的時候就通過該網卡裝置發送

2). internal: 一種虛擬網卡裝置

接收: 當從系統發出的報文路由尋找通過該裝置發送的時候,就進入ovs接收處理函數

發送: ovs中的一條流制定從該internal裝置發出的時候,該報文被重新注入核心協議棧

3). gre device: gre裝置. 不管使用者態建立多少個gre tunnel, 在核心態有且只有一個gre裝置

接收: 當系統收到gre報文後,傳遞給L4層解析gre header, 然後傳遞給ovs接收處理函數

發送: ovs中的一條流制定從該gre裝置發送, 報文會根據流表規則加上gre頭以及外層包裹ip,尋找路由發送

 

 

在如上的代碼結構中,vswitchd中就是ovs-vswitchd的入口代碼,ovsdb就是ovsdb-server的代碼,ofproto即上述的中間抽象層,lib下面有netdev,dpif的實現,datapath裡面就是核心模組openvswitch.ko的代碼。

  三、ovs-vswitchd和openvswitch.ko的互動方式netlink

 

datapath 運行在核心態,ovs-vswitchd 運行在使用者態,兩者通過netlink 通訊。

netlink 是一種靈活和強大的處理序間通訊機制(socket),甚至可以溝通使用者態和核心態。

netlink 是全雙工系統的。作為socket,netlink 的地址族是AF_NETLINK(TCP/IP socket 的地址族是AF_INET)

目前有大量的通訊情境應用了netlink,這些特定擴充和設計的netlink 通訊bus,被定義為family。比如NETLINK_ROUTE、NETLINK_FIREWALL、NETLINK_ARPD 等。

因為大量的專用family 會佔用了family id,而family id 數量自身有限(kernel 允許32個);同時為了方便使用者擴充使用,一個通用的netlink family 被定義出來,這就是generic netlink family。

 

要使用generic netlink,需要熟悉的資料結構包括genl_family、genl_ops 等。

 

 

下面寫一個generic netlink的簡單一實例

定義family如下

/* attributes */ enum { DOC_EXMPL_A_UNSPEC, DOC_EXMPL_A_MSG, __DOC_EXMPL_A_MAX, }; #define DOC_EXMPL_A_MAX (__DOC_EXMPL_A_MAX - 1) /* attribute policy */ static struct nla_policy doc_exmpl_genl_policy[DOC_EXMPL_A_MAX + 1] = { [DOC_EXMPL_A_MSG] = { .type = NLA_NUL_STRING }, }; /* family definition */ static struct genl_family doc_exmpl_gnl_family = { .id = GENL_ID_GENERATE, .hdrsize = 0, .name = "DOC_EXMPL", .version = 1, .maxattr = DOC_EXMPL_A_MAX, };

 

定義op如下

/* handler */ int doc_exmpl_echo(struct sk_buff *skb, struct genl_info *info) { /* message handling code goes here; return 0 on success, negative values on failure */ } /* commands */ enum { DOC_EXMPL_C_UNSPEC, DOC_EXMPL_C_ECHO, __DOC_EXMPL_C_MAX, }; #define DOC_EXMPL_C_MAX (__DOC_EXMPL_C_MAX - 1) /* operation definition */ struct genl_ops doc_exmpl_gnl_ops_echo = { .cmd = DOC_EXMPL_C_ECHO, .flags = 0,

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.