OpenWRT 是一個 Open Source 的 Linux AP 專案,可以在市面上尋找目前已經支援的裝置,買回來自己更新韌體,跟刷 Andriod 手機有類似的快感…,他還附有幾個網頁介面能裝,例如 Luci 非常具有 Linux hacker 味道不親和的介面…。紀錄一下建立的環境跟額外編譯 ovs 模組的指令。
只是蠻多的硬體配置都有點弱,這台 AG300H 配備蠻好的,如果不用考慮價格的話值得考慮…。
如果要自己準備編譯環境,找一台電腦裝 Ubuntu 就差不多了,剩下的交叉編譯環境 OpenWRT 官方都已經幫你準備好了。
這台是 MIPS 的 CPU Atheros AR7161@680MHz,記憶體 128MB,Flash 32MB。
目前有穩定版本 backfire,但是這台目前只有 trunk 版本有支援,先用 git 抓 source 。目前最新版的核心是採用 Linux 3.3.8
$ git clone git://nbd.name/openwrt.git
$ cd openwrt $ make menuconfig Target System > Atheros AR7XXXX/AR9XXXX Target Profile > Buffalo WZR-HP-AG300H Kernel modules > Network Support > kmod-bridge (M) $ make kernel_menuconfig Network Support > Network Options > Open vSwitch(M)
裡面的設定很多都能調整,Profile 是幫你指定這台裝置所有的週邊,如果要額外一些驅動可以再加。然後就能開始編譯了~
$ make -j 3
最後就會產生出。
$ openwrt/staging_dir # toolchain $ openwrt/build_dir # kernel $ openwrt/bin # result
接著是自己編譯 ovs,其實上面的設定就有包含編譯核心內的 ovs 了,只是如果要一些非核心 ovs 的功能就要自己編譯了,就是透過他產生出來的 toolchain ,可以參考 openflow – DDWRT 。
$ wget http://openvswitch.org/releases/openvswitch-1.7.0.tar.gz $ tar zxvf openvswitch-1.7.0.tar.gz $ cd openvswitch-1.7.0 $ vim config $ chmod 755 config $ ./config
依照目錄跟 toolchain 的名稱設定。
#!/bin/bash export WORKING=/home/mlwmlw/openwrt-ag300h export TOOLCHAIN_PATH=$WORKING/staging_dir/toolchain export PATH=$TOOLCHAIN_PATH/bin/:$PATH export NAME=mips-openwrt-linux-uclibc export LINUX=$WORKING/build_dir/linux-ar71xx_generic/linux-3.3.8/ export STAGING_DIR=$WORKING/staging_dir ./configure --with-linux=$LINUX KARCH=mips CC=$NAME-gcc AR=$NAME-ar LD=$NAME-ld RANLIB=$NAME-ranlib STRIP=$NAME-strip --host=mips CFLAGS="-std=gnu99 -g -I$TOOLCHAIN_PATH/include/ -L$TOOLCHAIN_PATH/lib/" --disable-ssl make ARCH=mips CC=$NAME-gcc AR=$NAME-ar LD=$NAME-ld RANLIB=$NAME-ranlib STRIP=$NAME-strip
qemu
可以編譯成 taget 是 mips qemu,然後用 qemu 跑模擬測試看看。要注意是 qemu-system-mips or qemu-system-mipsel 是看你編譯成 big-endian or little endian
$ sudo aptitude install qemu-kvm-extras $ qemu-system-mips -kernel openwrt-malta-be-vmlinux.elf -m 16 -nographic
如果要連結 openwrt vm 跟 host 的網路按照上面連結的設定是。
$ qemu-system-mips -kernel openwrt-malta-be-vmlinux.elf -m 16 -net nic -net tap -nographic
但是好似怪怪的,只是還不太懂 nic 跟 tap 有什麼差別,而且好似要先用 tun 建立一個 tap,並且指定 tap 名稱。在把 tap 加到 bridge 裡面,這樣就能互通了。
$ sudo tunctl # tap0 $ brctl addif br0 tunctl $ ifconfig br0 10.1.1.123/24 $ sudo qemu-system-mips -kernel openwrt-malta-be-vmlinux.elf -m 16 -net nic -net tap,ifname=tap0 -nographic openwrt # ifconfig eth0 10.1.1.1 netmask 255.255.255.0 openwrt # ping 10.1.1.123