編譯 Open vSwitch v2.7.0 on Ubuntu 16.04.2 LTS

http://openvswitch.org

前言

雖然官方網站就有安裝指南,不過還是精簡了它寫一篇簡單易讀的中文版本給需要入門的朋友參考。

硬體或虛擬機建議配置: 2 Processors 4GB RAM

  • 編譯 Open vSwitch 源碼
  • Open vSwitch 初始化設定
  • 開機後自動載入 Open vSwitch kernel module

編譯 Open vSwitch 源碼

前置工具安裝

Ubuntu 16.04 預設似乎沒有 Python 2.7 需要補安裝,此外 python-pip 為Python 套件管理系統,主要用來安裝 Python 的 six 套件。

$ sudo apt-get update
$ sudo apt-get install -y dh-autoreconf libssl-dev libcap-ng-dev openssl python python-pip
$ sudo pip install six

下載及編譯 Open vSwitch 源碼

下載 Open vSwitch 最新的源碼包,可以從 http://openvswitch.org/releases/ 找到目前最新的版本為 2.7.0

$ wget http://openvswitch.org/releases/openvswitch-2.7.0.tar.gz
$ tar zxvf openvswitch-2.7.0.tar.gz && cd openvswitch-2.7.0

接著做 Bootstrapping, Configuring 和 make.

注意在 Configuring 的時候,給的選項是--with-linux 並指定 kernel build directory 的位置,原因是我們要編譯出 Linux kernel module 這樣一來我們就可以運行 kernel-based(效能較高)的 vSwitch.

$ ./boot.sh
$ ./configure --with-linux=/lib/modules/$(uname -r)/build
$ make -j

make 完之後切記檢查是否有 Error,沒問題之後開始安裝(需要 root 權限),此外編譯出 Kernel module 時需要用modules_install 安裝

$ sudo make install
$ sudo make modules_install

掛載 Kernel module(需要 root 權限)如果 modprobe 出錯,可以透過dmesg 檢查 kernel log messages 看問題在哪裡。

$ sudo /sbin/modprobe openvswitch
$ dmesg | tail # Check kernel log messages

透過 lsmod 來檢查模組是否正確掛載上。

$ /sbin/lsmod | grep openvswitch
lsmod

編譯及安裝在這邊告一段落,接下來會介紹怎麼將 Open vSwitch 初始化設定和將 Open vSwitch 設定開機自動化。


Open vSwitch 初始化設定

An overview of Openvswitch implementation

在初始化設定之前,先簡略介紹一下 Open vSwitch 基本原件組成,基本概念是三個主要元件四個基本指令

三個主要元件分別是:

  • ovs-vswitchd:Open vSwitch 最主要的 daemon
  • ovsdb-server:用來設定及操作 ovsdb 的 Server
  • ovsdb:Open vSwitch 的 Database

四個基本指令分別是:

  • ovs-vsctl : 用來設定 ovs-vswitchd 以及 ovsdb
  • ovs-ofctl : 用來管理和監控 OpenFlow switches
  • ovs-dpctl : 用來管理 Open vSwitch datapaths
  • ovs-appctl : 用來控制或詢問 Open vSwitch daemons

兩種方法可以用來啟動 Open vSwitch

  • 手動啟用 Option1:先創建 OVS Database 後其次初始化 Database 最後再手動啟動兩個主要的服務(ovsdb-server, ovs-vswitchd)
  • 自動啟用 Option2:透過 ovs-ctl 來啟動

手動啟用 Option1

手動啟用的好處是可以了解每個服務開啟的方式和 Log 位置,找問題比起來會比較有頭緒。強烈建議第一次安裝的朋友先使用這種方式。

先取得 root 權限,透過 ovsdb-tool 來建立 OVS Database 而 ovsdb-tool 會以 vswitch.ovsschema為樣板 (schema) 建立 conf.db

$ sudo -i
# mkdir -p /usr/local/etc/openvswitch
# ovsdb-tool create /usr/local/etc/openvswitch/conf.db vswitchd/vswitch.ovsschema

啟動 ovsdb-server

# mkdir -p /usr/local/var/run/openvswitch
# mkdir -p /usr/local/var/log/openvswitch
# ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach --log-file
ovsdb-server

可以看到 log 檔案的位置

/usr/local/var/log/openvswitch/ovsdb-server.log

使用 ovs-vsctl 初始化 Database,只需要在第一次使用 ovsdb-tool 來建立 OVS Database 的時候需要執行,任何時候執行這個指令,並不會造成什麼影響。

# ovs-vsctl --no-wait init

運行主要的 Open vSwitch daemon

# ovs-vswitchd --pidfile --detach --log-file
ovs-vswitchd

到這邊就算完成,可以開始使用 Open vSwitch 指令創建 bridge 加入 ports 等等。詳細的操作方法,有需要可以參考這篇文章 Open vSwitch Cheat Sheet

自動啟用 Option2

自動啟用非常容易,連創建 Database 和掛載 kernel modules 都免了 ovs-ctl 會偵測並自動創建。

# export PATH=$PATH:/usr/local/share/openvswitch/scripts
# ovs-ctl start
ovs-ctl

終止 Open vSwitch

如果有需要將 Open vSwitch 停止,可以透過 kill 指令將 ovsdb-serverovs-vswitchd 殺掉。

# kill `cd /usr/local/var/run/openvswitch && cat ovsdb-server.pid ovs-vswitchd.pid`

或是利用 ovs-ctl 來終止服務

# export PATH=$PATH:/usr/local/share/openvswitch/scripts
# ovs-ctl stop

重新啟動 Open vSwitch

因為沒有設定開機自動化,所以當重新開機的時候必須做幾個步驟重新啟動 Open vSwitch。

  • 透過 modprobe 過重新掛載 kernel modules
$ sudo /sbin/modprobe openvswitch
  • 再次啟動 ovsdb-server
# ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach --log-file
  • 再次啟動 ovs-vswitchd
# ovs-vswitchd --pidfile --detach --log-file

或是透過 ovs-ctl 來啟動 Open vSwitch 如果 kernel modules 沒載入,將會偵測自動載入

# export PATH=$PATH:/usr/local/share/openvswitch/scripts
# ovs-ctl start

開機後自動載入 Open vSwitch kernel module

編譯好的 kernel modules 預設是不會自動載入,可以透過修改 /etc/modules 來讓 Open vSwitch module 載入。

/etc/modules 加入 openvswitch 即可或是透過以下指令:

# echo "openvswitch" >> /etc/modules

另外如果是透過 ovs-ctl 來啟動 Open vSwitch 它的 kernel modules 將會偵測自動載入,就不需要這麼麻煩。