OpenWRT平台搭建及简单应用
2013-04-17 23:29 zmkeil 阅读(5165) 评论(2) 编辑 收藏 举报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最后,果然就是拷贝文件。