转自:http://www.cnblogs.com/zmkeil/archive/2013/04/17/3027385.html
对于HG255D参照这里:http://www.right.com.cn/forum/forum.php?mod=viewthread&tid=131349
这里也可以参考:http://blog.csdn.net/eldn__/article/details/9707065
(本文在20160815有更新)
1.OpenWRT平台搭建
1.1环境准备
系统Ubuntu12.04(我用的是最新debian 7.3.0),先安装一些必要的软件包:apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev git-core gawk libssl-dev
注意,由于版本问题,需先将系统update,然后安装这些软件包,否则会导致gcc与g++版本冲突的问题。
1.2编译固件
首先下载OpenWRT:
svn checkout svn://svn.openwrt.org/openwrt/trunk。 (这个鬼东西行FQ,大家各施各法吧)
20160815更新,好像svn.openwrt.org不好用了,连翻了强都不行,如果喜欢用trunk的,可以改用github的更方便一点:
svn checkout https://github.com/openwrt/openwrt.git
如果你想用旧版的,可以用git.openwrt.org的源码:
git clone git://git.openwrt.org/15.05/openwrt.git
20190323更新:获取最新的源码
git clone https://git.openwrt.org/openwrt/openwrt.git/
或:
git clone https://github.com/openwrt/openwrt.git
(如需要编译指定版本的openwrt,可以参考这里:
https://www.right.com.cn/forum/forum.php?mod=viewthread&tid=431935)
git branch -a
git checkout 想要的branch (例如:
openwrt@bogon:~/openwrt$ git branch -a
* master
remotes/origin/HEAD -> origin/master
remotes/origin/lede-17.01
remotes/origin/master
remotes/origin/openwrt-18.06
openwrt@bogon:~/openwrt$ git checkout openwrt-18.06
Branch openwrt-18.06 set up to track remote branch openwrt-18.06 from origin.
Switched to a new branch 'openwrt-18.06'
openwrt@bogon:~/openwrt$
若是之前下载的,可更新一下:
./scripts/feeds update –a
./scripts/feeds install –a (第一次建议使用 ./feeds install -a -p luci命令,可以在下面的菜单中增加LUCI更多的选择项)
注意这里下载的只是编译固件用的控制文件,不包含源代码。
对于HG255D要修改一下:
找到trunk/target/linux/ramips/image/目录下的Makefile文件。搜索HG255D,把下列2行前面的#去掉
然后运行make menuconfig,这里注意3点:
Target system,这个一定要选准;(我是给HG255D用的,所以选:(Ralink RT288x/RT3xxx))
Target Image,选择固件image的格式,这里我们准备在x86的VM上运行,可以选择VMDK,直接编译出硬盘文件,并且包含grub
根据需要选择软件包,要想通过web登陆配置,4个地方要选:Base system-->uci,Libraries-->libuci-lua,LuCI全选,Network-->uhttpd。
Target Profile选HG255D
注意软件可以选择M或y,前者表示只编译出.ipk安装包文件,用户需要时将它上载到路由器中,opkg install xx.ipk安装;后者表示直接编译在固件中。
最后运行make (第一次建议用 make V=99可以看到编译过程的信息,包括出错信息,以后可以直接用make -j 2运用多内核提高编译速度),开始编译。自动创建dl、build_dir两个目录,依次调用tools、toolchain、 package、target目录中的Makefile编译(前两者是工具,然后用这工具编译后两者)。自动根据指示下载所需的源码包,放在dl目录下,然后解压到build_dir目录中编译。Build_dir中有3个子目录,host中是与平台无关的一些工具,toolchain中是特定平台的工具,ulibc中是c库、应用程序等。
可以先下载一些包到/dl目录:
autoconf-2.68.tar.bz2
automake-1.11.6.tar.xz
bc-1.06.95.tar.bz2
binutils-2.22.tar.bz2
bison-3.0.2.tar.xz
cmake-2.8.12.2.tar.gz
e2fsprogs-1.42.8.tar.gz
findutils-4.4.2.tar.gz
flex-2.5.38.tar.bz2
gcc-linaro-4.8-2014.01.tar.xz
gdb-linaro-7.6-2013.05.tar.bz2
genext2fs-1.4.1.tar.gz
gmp-5.1.3.tar.xz
ipkg-utils-1.7.tar.gz
libelf-0.8.13.tar.gz
libtool-2.4.tar.gz
linux-3.10.32.tar.xz
lzma-4.65.tar.bz2
m4-1.4.17.tar.xz
mklibs_0.1.35.tar.gz
mm-common-0.9.6.tar.xz
mpc-1.0.1.tar.gz
mpfr-3.1.2.tar.bz2
mtd-utils-1.4.5.tar.gz
patch-2.7.1.tar.xz
pkg-config-0.28.tar.gz
quilt-0.61.tar.gz
scons-2.3.0.tar.gz
sed-4.2.2.tar.bz2
squashfs4.2.tar.gz
u-boot-2013.07-rc1.tar.bz2
uClibc-0.9.33.2.tar.bz2
util-macros-1.11.0.tar.bz2
xfce4-dev-tools-4.8.0.tar.bz2
xz-5.0.5.tar.bz2
yaffs2_android-2008-12-18.tar.bz2
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最后,果然就是拷贝文件。