Compile OpenWRT with Open vSwitch

雖然說在 google 上很多資料都說,Open vSwitch 已經加入到 OpenWRT 的 packages repository,而且在 GitHub 上也有看到 Open vSwitch 的身影。但是實際上,在官方的 repository 中並沒有 Open vSwitch。因此決定自行編譯。

實驗環境


開始編譯

sudo apt-get -y install build-essential subversion git-core libncurses5-dev zlib1g-dev gawk flex quilt libssl-dev xsltproc libxml-parser-perl unzip
user@localhost:~$ git clone git://git.openwrt.org/14.07/openwrt.git
user@localhost:~$ cd openwrt
user@localhost:~/openwrt$ mv feeds.conf.default feeds.conf
user@localhost:~/openwrt$ ./scripts/feeds update -a
指令結束後,會看到當前目錄下多了一個資料夾,名稱為 **feeds**,裡面將會根據 feeds.conf 的每個項目,一個項目將會產生兩個目錄、一個 soft-link,例如:
user@localhost:~/openwrt$ ls -lh feeds/
drwxrwxr-x 13 user user 4.0K  3月  9 14:24 packages
lrwxrwxrwx  1 user user   25  3月  9 14:52 packages.index -> packages.tmp/.packageinfo
drwxrwxr-x  3 user user 4.0K  3月  9 14:24 packages.tmp
user@localhost:~/openwrt$ ls feeds/packages/net/ | grep openvswtich
user@localhost:~/openwrt$ ls feeds/oldpackages/net/ | grep openvswitch
如果有,則跳過此步驟;反之,則新增 Open vSwitch repo:
user@localhost:~/openwrt$ echo 'src-git openvswitch git://github.com/pichuang/openvwrt.git' >> feeds.conf
user@localhost:~/openwrt$ ./script/feeds update -a
然後打上 libatomic patch:
user@localhost:~/openwrt$ wget https://gist.githubusercontent.com/pichuang/7372af6d5d3bd1db5a88/raw/4e2290e3e184288de7623c02f63fb57c536e035a/openwrt-add-libatomic.patch -q -O - | patch -p1
執行完之後,在 feeds 資料夾裡面看到 openvswitch:
user@localhost:~/openwrt$ ls -lh feeds/ | grep openvswitch
drwxrwxr-x  4 user user 4.0K  3月  9 14:52 openvswitch
lrwxrwxrwx  1 user user   28  3月  9 14:52 openvswitch.index -> openvswitch.tmp/.packageinfo
drwxrwxr-x  3 user user 4.0K  3月  9 14:52 openvswitch.tmp
- **更改 Open vSwitch 版本**
    原本的 maintainer 已經不再維護了,因此版本還是 2.3.0。如果想要更改版本,則編輯 `feeds/openvswitch/openvswitch/Makefile`
PKG_RELEASE:=1
PKG_VERSION:=2.3.0
    修改 `PKG_RELEASE` 與 `PKG_VERSION` 這兩個值:
PKG_RELEASE:=0
PKG_VERSION:=2.3.1
    然後再次執行 `feeds update`
user@localhost:~/openwrt$ ./scripts/feeds update openvswitch
    這時候就可以看到 `feeds/openvswitch.index` 裡面,Open vSwitch 的版本就改成了 **2.3.1-0**
Source-Makefile: feeds/openvswitch/openvswitch/Makefile
Package: openvswitch-ipsec
Version: 2.3.1-0
user@localhost:~/openwrt$ ./scripts/feeds install -a
user@localhost:~/openwrt$ make menuconfig
接下來會開啟編譯選單:<br />

make_menuconfig.jpg

利用上下左右、M、空白鍵來切換與選擇不同的編譯選項。在選擇編譯選項時,原則上是:
1. 系統預設值保留不變,除非要拿掉甚麼功能,ex: ppp。
2. 盡量將需要編譯的項目選擇為 **M**,而不是 <strong>*</strong>,除非認定必要存在。

選擇的過程中或是離開前,選擇 **save** 可以將選項儲存起來,檔名保留為 **.config** (檔名不可以變更)。<br />

save_config.jpg

- **Target Profile**

    如果 OpenWRT 是要自己使用的,可以指定要編譯哪些 firmware,這樣可以節省不少編譯時間。<br />
    選擇 `Target Profile` -> 選擇指定的 device 名稱,例如: TP-Link TL-W1043N/ND<br />

custom_profile.jpg

- **Open vSwitch**
    1. 選擇 `Network` -> `openvswitch-common`、`openvswitch-ipsec`、`openvswitch-switch` <br /><br />

choice_openvswitch.jpg 2. 選擇 Advanced configuration options (for developers) -> Target Options -> 取消勾選 Build packages with MPIS16 instructions 3. 選擇 Advanced configuration options (for developers) -> Toolchain Options -> Binutils Version ->Linaro binutils 2.24

- **Luci** (Option.)

    如果想要網頁管理介面,可以選擇加裝 luci<br />
    選擇 `Luci` -> `Collections` -> `luci`<br />

luci.jpg

user@localhost:~/openwrt$ echo '#CONFIG_KERNEL_BRIDGE is not set' >> .config
這個步驟再每一次 `make menuconfig` 之後都要執行一次<br />
然後開始編譯 OpenWRT<br/>
user@localhost:~/openwrt$ make V=s
編譯完成後的檔案會放在 `openwrt/bin/`

user@localhost:~/openwrt$ sudo apt-get -y install nginx
- 編輯 `/etc/nginx/sites-available/default`,在 **server** 的設定裡面,新增以下 location 片段:
location /openwrt/downloads {
    alias /home/user/openwrt/bin;
    autoindex on;
}
    請根據喜好與系統狀態去設定:
    - URL: `/openwrt/downloads`
    - PATH (編譯後的 firmware 放置位置): `/home/user/openwrt/bin`

- 重啟 nginx
user@localhost:~/openwrt$ sudo service nginx restart
然後打開瀏覽器,輸入網址: `http://<<your ip>>/openwrt/downloads`,應該要出現類似以下的畫面:<br />

custom_repository_1.jpg 點擊 ar71xx 後: custom_repository_2.jpg


使用 OpenWRT

接下來就可以利用 Luci 、Sysupgrade 指令、AP 原廠的管理介面等方法去燒 OpenWRT。 OpenWRT 第一次開機時,要使用 telnet 的方式連入

telnet 192.168.1.1

進入系統之後,更換 root 密碼。登出之後,接下來就改用 ssh (或是 Luci) 登入。


Reference