《OpenWrt移植简介及平台应用》由会员分享,可在线阅读,更多相关《OpenWrt移植简介及平台应用(41页珍藏版)》请在金锄头文库上搜索。
1、 OpenWrt移植简介及平台应用移植简介及平台应用OpenWrt简介OpenWrt编译环境搭建OpenWrt编译及其常见问题OpenWrt固件升级如何在OpenWRT环境下做开发相关资源收集目录目录OpenWrt简介OpenWrt是一个高度模块化、高度自动化的嵌入式Linux系统,拥有强大的网络组件,常常被用于工控设备、电话、小型机器人、智能家居、路由器以及VOIP设备中。OpenWrt支持各种处理器架构,无论是对ARM,X86,PowerPC或者MIPS都有很好的支持。其多达3000多种软件包,囊括从工具链(toolchain),到内核(linuxkernel),到软件包(packages
2、),再到根文件系统(rootfs)整个体系,使得用户只需简单的一个make命令即可方便快速地定制一个具有特定功能的嵌入式系统来制作固件。其模块化设计也可以方便的移植各类功能到OpenWrt下,加快开发速度。OpenWrt简介OpenWrt的特点OpenWrt提供了一个完全可写文件系统及软件包管理,它通过简单易用的方式,最大限度地降低了嵌入式linux开发的门槛,并充分释放并挖掘嵌入式设备的潜能,它允许您使用软件包的概念来定制嵌入式设备,这使得它能适用于绝大多数应用。对于开发人员,OpenWrt提供简单易用的环境框架来构建应用程序。对于用户来说,这意味着完全定制的自由,它通过您预想不到的方式让你
3、了解嵌入式是什么。开源和FREEOpenWrt项目是GPL许可下的完全自由和开放源码的项目。项目打算将源代码永久存放于OpenWrt站点,以便易于获得源代码。轻松和自由的入门为什么选择OpenWrt为什么使用OpenWrt?GNU为我们提供了很多免费的软件,我们可以用一个很低的价钱购买像WRT54G的硬件,做成一个小型的Linux系统,现在OpenWrt已经提供了近千个多个已编译好的软件,而且数量还在不断增加,而OpenWrtSDK更是简化了嵌入软件开发的工序。为什么学习OpenWrt?你不需要对MIPS处理器有很深入的了解,也不用懂得如何去设计一个ARM或MIPS处理器专用的linux内核,
4、因为这些在网上已有人为你做好,你只需懂得如何安装和使用就行了,不过你也可以去找到相关的资料。如果你对Linux系统有一定的认识,并想学习或接触嵌入式Linux的话,OpenWrt很适合你,你将学会一些无线路由器的基本知识,以及一般嵌入式Linux的开发过程.为什么选择OpenWrt通过openwrt快速构建一个应用平台,openwrt从交叉编译器,到linux内核,再到文件系统甚至bootloader都整合在了一起,形成了一个SDK环境。随着Linux的成熟,大量不同的处理器内核和应用软件相继出现,当你熟悉这些嵚入式Linux的基本开发流程后,你不再局限于MIPS处理器和无线路由器,你可以尝试
5、在其它处理器,或者非无线路由器的系统移植嵌入式Linux,定制合适自己的应用软件,并建立一个完整的嵌入式产品。OpenWrt编译环境搭建首先,要有支持编译Openwrt的操作系统。实体机或者虚拟机(Vmware或者Qemu)里的操作系统都行,这里推荐使用Linux系统。bsd和macosx系统也可以编,但不推荐,且未验证是否可编译成功。下文中我使用的是Ubuntu操作系统,使用apt-get来管理包。OpenWrt编译环境搭建第二步,就是安装所需要的各种软件包,包括编译器,解压工具,特定的库等.这些工作可以简单的通过键入以下命令(通常需要root或者是sudo权限),以root权限安装下列软件
6、包(可能并不完整,会有提示,提示缺少即装就可以了):32位(x86)请执行下列命令:#apt-getinstallbuild-essentialasciidocbinutilsbzip2gawkgettextgitlibncurses5-devlibz-devpatchunzipzlib1g-dev64位(x86_64)请执行下列命令(多装了哪些库或软件包呢?请您仔细看一看哦):#apt-getinstallbuild-essentialasciidocbinutilsbzip2gawkgettextgitlibncurses5-devlibz-devpatchunzipzlib1g-devi
7、a32-libslib32gcc1libc6-dev-i386OpenWrt编译环境搭建参考本列表中所列的编译环境所需要软件包或库。某些依赖的为库或软件包也许操作系统中已经安装过,此时apt-get会作出提示(提示您忽略或重新安装的)OpenWrt编译环境搭建最后下载一份完整的Openwrt源码到编译环境中。关于Openwrt的源代码下载,途径有二,一是通过svn,一是通过git,建议使用svn,因为Openwrt主要以svn来维护Openwrt系统的版本。另外,请注意Openwrt中不同的分支版本,一个是用得较多的开发快照,俗称trunk,二是稳定版,俗称backfire。OpenWrt编译
8、环境搭建安装Subversion若你想通过svn下载源代码,你需安装Subversion。Subversion,或称SVN,是OpenWrt的project中用来控制版本的系统,它非常类似的CVS的界面和使用条款。执行下述命令即可安装SVN,很容易的:#apt-getinstallsubversionOpenWrt编译Subversion安装完毕,通过SVN命令可获取得到一份OpenWrt纯净源代码。您还得创建一个目录以便存放获取得到的Openwrt源代码,要获取源代码你还得输入subversion命令来获取(svn里这种操作称之为checkout)。OpenWrt编译编译流程编译流程编译专属
9、于您的设备的特定Openwrt固件以一下五个步骤:通过Subversion命令获得源代码;更新(或安装)packagefeeds创建一个默认配置以检查编译环境是否搭建好了(假如需要的话);用Menuconfig来配置即将编译生成的固件映像文件的配置项;最后开始编译固件;OpenWrt编译下载源代码最后,下载一份完整的OpenWrt源代码。你可选择:下载稳定发行版,或下载开发版(俗称“trunk”版)。使用发行版的源码Openwrt公开发行的稳定版为OpenWrt10.03backfire。此版本是最稳定的,但也许不包括最新更新的补丁或最新编写的出的新功能。下述代码即举例说明了通过svn从bra
10、ndkfire获得backfire源代码(此版本意思是从trunk分支的补丁也在backfire版本中了,即包含修复补丁):OpenWrt编译#mkdirOpenWrt/#cdOpenWrt/#svnco您也可以通过下述命令,下载不含修复补丁的backfire的原版源码:#svncosvn:/svn.openwrt.org/openwrt/tags/backfire_10.03注解:上述svn命令将在当前目录创建一个OpenWrt/backfire/子目录,此目录包含此命令获取到的源代码。OpenWrt编译使用开发版源代码当前的开发版本分支(trunk)已包含最新的实验补丁。此分支或许还突破了
11、Openwrt原来所不支持的硬件设备的限制哦,惊喜的同时也有风险存在。mkdirOpenWrt/cdOpenWrt/svnco/(回车后等待下载)svn回滚或svn指定版本需要的版本是28007,操作:svnco-r28007回滚或到指定版本:svnup-r28007指定LUCI版本cdtrunk/feeds/lucisvnup-rr7612OpenWrt编译关于关于OpenWrt DreamboxOpenWrt中文网创建于2010年2月14日建立了技术论坛、开发站点、下载中心。主要是为openwrt的中文化,以及固件的易用性。获取Dreamboxtrunk开发版SVN代码库#svncoope
12、nwrt-pandoraboxOpenWrt编译开始准备编译首先跟进并更新源代码因Openwrt的源代码随时都会变动,故此命令将确保您所获取得到的源码的最新性。如果你用的是backfire版本的源码:cdOpenWrt/backfire/如果你用的是trunk版本的源码:cdOpenWrt/trunk/svnup./scripts/feedsupdate-a./scripts/feedsinstall-aOpenWrt编译下一步是检查编译环境,若可进行编译则生成默认配置:makedefconfig若defconfig回显提示缺少软件包或编译库等依赖,则按提示安装所缺软件包或库等即可,不难的,细
13、心点就行。进入编译组件包菜单makemenuconfigOpenWrt编译makemenuconfig会有一个编译管理器,在里面可以选择型号、OP功能组件,需要用到方向键、回车键、空格键。方向键是移动光标,回车键是确认,空格键是选择(在选项框按下空格键,*号是编译进固件,M是编译但是不编译进固件)。1.选择CPU型号TargetSystemAtherosAR71xx/AR7240/AR913x/AR934x2.选择路由型号TargetProfile-TP-LINKTL-WR7033.添加luciLuCICollectionsluciOpenWrt编译4.添加luci的中文语言包LuCITran
14、slations-luci-i18n-chinese5.添加DDNSLuCIApplicationsluci-app-ddns.6.添加USB挂载Basesystemblock-mount7.添加硬盘格式支持KernelmodulesFilesystemskmod-fs-ext48.添加UTF8编码KernelmodulesNativeLanguageSupportkmod-nls-utf89.添加USB扩展支持KernelmodulesUSBSupportkmod-usb-storage-extras.110.添加自动挂载工具UtilitiesFilesystembadblocksOpenW
15、rt编译开始编译makeV=99,最后会得到一个4M的带中文luci的TL-WR703N固件。网上固件下载网址:http:/在编译的时候需要比较长的时间,因为要下载很多软件包,假如编译下载不成功,可以退出,自己去下载后放入DL的文件夹下,再继续编译。如果出现编译错误,请再次检查开始编译前那些依赖程序装好了没有,如果还有错误请看后面的编译出现的常见问题。OpenWrt编译若编译成功,会出现如下图所示:OpenWrt编译编译成功后,在/OpenWrt/trunk/bin/ar71xx目录下可见如下2个固件,openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-f
16、actory.bin出厂带配置的固件openwrt-ar71xx-generic-tl-wr703n-v1-squashfs-sysupgrade.bin在原来的openwrt基础上更新的固件OpenWrt编译内核配置makekernel_menuconfig命令是进去配kernel这和普通的linuxkernel的makemenuconfig没有什么区别,在machineselection加一个选择board,选TL-WR703Nsupprot。其他需要什么就配置什么,与linux内核一样。配置完后重新编译。OpenWrt编译修改默认SSID,添加WIFI配置修改mac80211.sh文件,
17、位于package/mac80211/files/lib/wifioptiondisabled1改成0,默认开启wifi。optiondisabled0下添加optionhtmodeHT40+optionchannel1optioncountryCNoptiontxpower17optionssidOpenWrt-wr703optionhtmodeHT40+使用40MHz频宽,但只支持1-7信道。HT40-,支持5-13信道。HT20支持1-13信道,20MHz频宽optionchannel1使用信道1,1-13之间。若有限定频宽,信道参考如上。optioncountryCN设定wifi标准为
18、中国optiontxpower17发射功率为17dBm,大约50mW。按实际板子的功率来设置。OpenWrt编译修改root密码由于openwrt默认是没有密码的,所以ssh没法连接,只能连接telnet,我们只要做到让openwrt开启时就配置好密码就可以了!修改shadow文件,位于package/base-files/files/etc如需要密码为root:root:$1$ioSWlaew$jwhT3BwuHTq7vKlYWXwpV0:15811:0:99999:7:将密码修改成root。编译的常见问题一、普遍问题a.在menuconfig中找不到所需的组件,用脚本./scripts/f
19、eeds安装对应的package,嫌麻烦直接-a,就是时间长点。b.编译完成后bin目录下找不到生成的固件,恭喜你,你犯了跟我一样2B的错误,你选择的组件过大,导致所需的固件大小操作targets源代码中的限制,解决方法,如果确定你的flash比较大,修改源代码,各个路由器不同网上找,否则减少组件,只选择最基本的组件。c.编译错误,查看错误信息。make的时候加参数V=99,为便于查找错误可以重导向一下2&1参考:make-j2V=992&1|teeopenwrt.log编译的常见问题二、openwrt中root用户鉴权问题,开始编译可能会出错,信息如下:pleasedonotcompilea
20、sroot。在/trunk/include/prereq-build.mk中修改如下:把root改为noroot,这样编译就可以用root用户了。不受限制。defineRequire/non-root# $(shellwhoami)!=root$(shellwhoami)!=norootendef编译的常见问题三、修改固件大小修改分区大小,在trunk/tools/firmware-utils/src/mktplinkfw.c.id=TL-WR703Nv1,.hw_id=HWID_TL_WR703N_V1,.hw_rev=1,.layout_id=4Mlzma,/只改此,8Mlzma除了mkt
21、plinkfw.c那个文件,你还需要修改这个trunk/target/linux/ar71xx/image/Makefile找自己对应的路由型号的那行代码然后将“4Mlzma”改成“8Mlzma”OpenWrt固件升级在webluci界面中选择系统备份/升级,添加升级的固件文件,执行升级。OpenWrt固件升级因为版本不同,所以有些在webluci界面上更新固件会提示文件格式不对,或者内核启动不了,只能在uboot下采用tftp来烧写,pc上ip:192.168.1.100(bin固件放在tftpboot文件夹),路由器:,在uboot下采用如下命令,setenvserveripsetenvi
22、paddrtftpboot0x80000000openwrt-ar71xx-generic-tl-wr703-v1-squashfs-factory.binerase0x9f020000+0x3c00000x7c0000(8M)cp.b0x800000000x9f0200000x7c0000bootm0x9f020000如何在OpenWRT环境下做开发在之前编译的OpenWrt开发环境下,在执行makemenuconfig后,会出现下图:下图蓝色光标一栏选中表示我们需要编译一个SDK开发环境(默认情况下,此项未勾选)。然后在make编译后在bin文件夹下的packages中有SDK定制环境包如
23、何在OpenWRT环境下做开发packages文件夹:里面包含了我们在配置文件里设定的所有编译好的软件包。默认情况下,会有默认选择的软件包。(3)OpenWrt-SDK.*.tar.bz2:这个也就是我们定制编译好的OpenWRTSDK环境。我们将用这个来进行OpenWrt软件包的开发。例如,我所编译好的SDK环境包为:/bin/ar71xx/可以从名称上看出,targetsystem是ar71xx,hostsystem是Linux-i686,使用的编译工具以及库是。需要注意的是,编译完成后,一定要将编译好的bin目录进行备份(如果里面东西对你很重要的话),因为在下次编译之前,执行makecl
24、ean会将bin目录下的所有文件给清除掉!如何在OpenWRT环境下做开发更改原有packages在编译根目录下会有一个dl的目录,这个目录其实是“download”的简写,在编译前期,需要从网络下载的数据包都会放在这个目录下,这些软件包的一个特点就是,会自动安装在所编译的固件中,也就是我们makemenuconfig的时候,为固件配置的一些软件包。如果我们需要更改这些源码包,只需要将更改好的源码包打包成相同的名字放在这个目录下,然后开始编译即可。编译时,会将软件包解压到build_dir目录下。当然,你也可以自己在dl里面创建自己的软件包,然后更改相关的配置文件,让openwrt可以识别这个
25、文件包。由于我的项目更改的内容是底层的,需要跟固件一起安装。所以,我使用的方法就是直接更改dl目录下软件包,然后重新进行固件编译。感觉类似于Linux的内核编译。如何在OpenWRT环境下做开发新建自己的packages新建的package,而这个package又不需要随固件一起安装,换句话说,就是可以当做一个可选软件包的话。我们可以利用我们的SDK环境来单独编译,编译后会生成一个ipk的文件包。然后利用opkginstallxxx.ipk来安装这个软件。下面具体说下,如何编译一个helloword的软件包。(1)首先,编写helloworld程序,编写helloworld.c/*Hellow
26、orld.c*ThemostsimplisticCprogrameverwritten.*Anepilepticmonkeyoncrackcouldwritethiscode.*/#include#includeintmain(void)printf(Hell!Oworld,whywontmycodecompile?nn);return0;如何在OpenWRT环境下做开发编写Makefile文件#buildhelloworldexecutablewhenuserexecutesmakehelloworld:helloworld.o$(CC)$(LDFLAGS)helloworld.o-ohel
27、loworldhelloworld.o:helloworld.c$(CC)$(CFLAGS)-chelloworld.c#removeobjectfilesandexecutablewhenuserexecutesmakecleanclean:rm*.ohelloworld在这两个文件的目录下,执行make应该可以生成helloworld的可执行文件。执行helloworld后,能够打印出“Hell!Oworld,whywontmycodecompile?”。这一步,主要保证我们的源程序是可以正常编译的。下面我们将其移植到OpenWRT上。如何在OpenWRT环境下做开发将.tar.bz2解压
28、tarxvfOpenWrt-SDK-ar71xx-for-Linux-i686-gcc-4.3(3)进入SDKcd可以看到里面的目录结构跟我们之前source的目录结构基本相同,所需要编译的软件包,需要放置在package目录下(4)在package目录下创建helloworld目录cdpackagemkdirhelloworldcdhelloworld(5)创建src目录,拷贝helloworld文件mkdirsrccp/home/wrt/test/helloworld.csrccp/home/wrt/test/Makefilesrc(6)在helloworld目录下创建Makefile文件
29、这个Makefile文件是给OpenWRT读的,而之前写的那个Makefile文件是针对helloworld给编译其读的。两个Makefile不在同一层目录下。touchMakefilevimMakefile(下面的对象makefile打开方式用文本格式)如何在OpenWRT环境下做开发(7)返回到SDK的根目录执行make进行编译编译过程会在build_dir目录下完成编译结果会放在bin/yourtarget/package目录下helloworld_1_ar71xx.ipk(8)上传helloworld_1_ar71xx.ipk使用sftp软件上传helloworld_1_ar71xx.ipk至路由器执行opkginstallhelloworld_1_ar71xx.ipk输入hello然后按Tab键,发现openwrt中已经有helloworld可执行命令。执行helloworld查看程序的效果。Hell!Oworld,whywontmycodecompile?openwrt资源收集1、openwrt中文网http:/2、恩山无线论坛openwrt专版3、openwrt官网https:/openwrt.org/