1.OpenWRT平台搭建
1.1環境准備
系統Ubuntu12.04,先安裝一些必要的軟件包:gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev git-core gawk。
注意,由於版本問題,需先將系統update,然后安裝這些軟件包,否則會導致gcc與g++版本沖突的問題。
1.2編譯固件
首先下載OpenWRT:
svn checkout svn://svn.openwrt.org/openwrt/trunk。
若是之前下載的,可更新一下:
./scripts/feeds update –a
./scripts/feeds install –a
注意這里下載的只是編譯固件用的控制文件,不包含源代碼。
然后運行make menuconfig,這里注意3點:
-
Target system,這個一定要選准;
-
Target Image,選擇固件image的格式,這里我們准備在x86的VM上運行,可以選擇VMDK,直接編譯出硬盤文件,並且包含grub
-
根據需要選擇軟件包,要想通過web登陸配置,4個地方要選:Base system-->uci,Libraries-->libuci-lua,LuCI全選,Network-->uhttpd。
注意軟件可以選擇M或y,前者表示只編譯出.ipk安裝包文件,用戶需要時將它上載到路由器中,opkg install xx.ipk安裝;后者表示直接編譯在固件中。
最后運行make,開始編譯。自動創建dl、build_dir兩個目錄,依次調用tools、toolchain、package、target目錄中的Makefile編譯(前兩者是工具,然后用這工具編譯后兩者)。自動根據指示下載所需的源碼包,放在dl目錄下,然后解壓到build_dir目錄中編譯。Build_dir中有3個子目錄,host中是與平台無關的一些工具,toolchain中是特定平台的工具,ulibc中是c庫、應用程序等。
1.3VMware中運行OpenWRT
啟動VMware,新建虛擬機(Custom),以編譯出的VMDK文件為硬盤,直接power on就可進入OpenWRT。在目錄/bin,/sur/bin等目錄下,有我們選擇安裝的應用程序的可執行文件,運行他們實現各種功能。
2.網絡配置的簡單示例
我們在虛擬機下運行,虛擬機的網絡模式有三種:nat、host-only、bridge。並且安裝完VMware后,主機中新增了兩塊虛擬網卡VMNet1,VMnet8,前者相當於所有host-only模式的VM的交換機,所有host-only模式的VM可通過它相互通信,但不同與外界通信;后者相當於所有nat模式的VM的交換機,不同之處在於,它可以NAT到主機的實際網口,去訪問外網(即相當於有個上行口)。Bridge模式指利用主機的實際網口與外界通信。
我們為OpenWRT的VM准備兩塊網卡,一塊是bridge模式,另一塊是host-only模式;同時運行另一VM(redHat),只有一塊host-only模式的網卡,如下圖:
OpenWRT的網絡配置文件為/etc/config/network,vim寫入如下
然后重啟網絡 /etc/init.d/network restart
再寫入兩條路由
Route add -net 10.10.10.0/24 dev eth0
Route add default dev eth1
再在VM-RedHat中寫入兩條路由(注意dev和gw的區別)
Route add -net 10.10.10.0/24 dev eth0
Route add default gw 10.10.10.130
這樣,實際局域網的主機就可通過OpenWRT這個路由器與host-only虛擬局域網的主機通信了,當然前提是各主機應設一條網關路由到192.168.68.187。
3.應用程序開發
應用程序開發方法有兩種。
3.1方法一
利用menuconfig,直接與固件一起編譯。即預先把相關文件放到trunk/package/myapp目錄下,make menuconfig時找到該軟件包,選擇(可以選y編譯進固件中,或M只編譯成.ipk包)即可。
比如,在package目錄下mkdir helloworld,里面放些什么則至關重要,可以參考其他包的內容,其中的Makefile的最關鍵的,其他都可選,比如我們這里還放了一個src子目錄,里面放helloworld.c ,Makefile(它是真正編譯用的)。
Makefile的內容可參考模板,一般分為很多節,第一節一般說明程序的名稱、版本等,第二節說明該軟件包的基本屬性(它是一般包,還是kernel包,SECTION,CATEGORY字段說明其在menuconfig中的位置,一定要寫准確,該包的依賴關系等)。注意Makefile中Tab符不能亂用,一般表示command,這里的屬性字段不能用Tab,只能用空格(由emasc中的高亮顯示可看出差別)。
后面幾節描述了它的編譯安裝方法。一般就是把src里的內容copy到build_dir/uClib下,然后用toolchain來編譯,最后install一節可以指明該app在固件中被放在哪個目錄下(/bin,或/usr/bin等)。
3.2方法二
利用SDK,就像android開發一樣,利用sdk編譯出軟件安裝包,上傳到設備,安裝即可使用。首先在make menuconfig的時候,把build SDK選項選上,那么,固件編譯好后,在trunk/bin/x86下就有一個SDK.tar文件,解壓,進入里面。
可以發現里面的內容和trunk主目錄下的非常相似,也有package,build_dir,dl等目錄,實際上它正是模擬了一個固件的編譯環境。這樣就簡單了,如方法一所述,在package目錄下建立我們的app子目錄,放入必要的文件,然后退回到SDK目錄,直接make即可。編譯好的ipk包在SDK/bin/x86/package下。
至於上傳ipk包到路由器上,對於實際設備,可用廠商提供的sftp、putty等工具,在VMware上沒找到什么方法,裝個ftp?
3.3為什么用ipk包
Ipk包是openwrt特有的,為什么用這個呢,直接把可執行文件copy到設備中不就行了嗎?回頭看看helloworld中的Makefile的最后一節install就明白了,ipk包里不僅有可執行文件,還有安裝該文件的具體指示,甚至還可以有其它一些配置、啟動文件,以及它們的安裝方式。
聯想network命令就是這樣的,進到package/conf下,看它的makefile最后,果然就是拷貝文件。