天天看点

编译定制:编译OpenWrt固件

转载自:http://www.wtoutiao.com/p/g73XZ6.html

编译定制:编译OpenWrt固件

驿外断桥边,寂寞开无主。已是黄昏独自愁,更著风和雨。无意苦争春,一任群芳妒。零落成泥碾作尘,只有香如故~

经过了30余个章节,经过了被无数学员催着想要知道怎么编译的过程。终于教程进入到第四大部分。hoowa从来没有说过关于编译OpenWrt很多人都很好奇如何编译,其实编译本身是非常简单的事情,只是它需要积累很多其他的基础。没有人可以通过看一本书学会一项技能,看这本书同样也不能,学会一项技能靠的是自己的努力。

从4.0开始,我们的教程将围绕编译、驱动、定制OpenWrt系统。这部分将包含了AxWRT系统如何产生的、如何根据板子去定制系统,以及如何完成简单的内核驱动程序驱动外围硬件。知识量尤为大,如果只是会个编译系统,那么不需要具备什么知识(同样,刚才讲过了,编译个系统尤为简单,但是稍微深入点都需要具备一定基础,想学会编译系统就能定制OpenWrt简直是痴人说梦!),如果想把这一大部分完全吃透,需要具备一定C语言基础。

OpenWrt编译环境

编译与交叉编译

将源代码产生CPU可以执行的目标程序这一过程叫编译,就像不同的语言之间翻译一样。通过对OpenWrt系统的编译,可以产生用来运行在教学板上的程序。

为何要交叉编译?

简单的说,就是在一种CPU上产生另外一种CPU可以执行的目标程序。因为路由器的CPU性能实在是太低了,用其自身去完成这个编译的过程是非常非常漫长的(几天时间),而是用我们现在的电脑,可以在几个小时甚至几十分钟内产生,所以叫交叉编译。

Host:宿主机,专有名词,表示用来编译用的机器,一般是我们的电脑或虚拟机

Target:目标机,在这里就表示我们的教学板

AxWRT与OpenWrt关系

在刚开始的章节我们有介绍过AxWRT就是基于OpenWrt所产生的一个用于教学的版本。AxWRT在源代码层面与OpenWrt的Barrier Breaker发行版几乎完全一致,区别在于:

根据教学板的接口定义AxWRT专门处理了

删除掉了与教学板无关的其他硬件支持

由于官方OpenWrt不同程度的存在一些软件包的Bug在教学过程中做了部分软件包的修正

捆绑了所需要的feeds中的软件包,节省编译时需要连接网上资源的步骤

AxWRT源代码:http://www.geeqee.com/axwrt/system/

AxWRT的SVN源代码仓库:http://www.geeqee.com/opensvn/axwrt/

OpenWrt的版本关系

OpenWrt存在很多发行版几乎没间隔一段时间的发行版都有一定变化,有的变化非常大。目前已知的发行版有:

开发代号Backfire 10.03.1:2012年发行

开发代号Attitude Adjustment 12.09:2013年发行

开发代号Barrier Breaker 14.07:2014年发行

开发代号Trunk:主线版本,无明确版本号,每一年根据Trunk产生一个发行版。

OpenWrt官方预编译好发行版本:http://downloads.openwrt.org/

OpenWrt官方源代码下载:https://dev.openwrt.org/wiki/GetSource

相比较Trunk中的内容比较新,但是存在诸多Bug。各发行版功能比较稳定,适于产品开发。一个标准的官方源代码,不一定适合你手中的硬件,这个时候就需要进行定制,这个定制的过程包括参数定义及编译。如果所使用的硬件没有被OpenWrt官方所支持,就需要有具备嵌入式Linux经验的工程是进行移植。

准备编译环境

在开始编译之前,需要准备一系列系统环境和软件包。在编译时我们可以使用在第二大部分中所创建的Centos虚拟机或是独立电脑。

现在准备好你的编译用系统,并且将其开机确保网络连接畅通!

编译所需的电脑

独立电脑,安装Centos操作系统或是安装Ubuntu操作系统亦可

CPU性能足够,首次编译所需要时间在30分钟到5个小时之间,视电脑性能而定,多核处理器效率更高。具备至少2G以上内存

至少20G的硬盘空间,硬盘的读写速度直接影响到编译速度,SSD固态硬盘是最好的

Centos所需编译软件包YUM安装

YUM是Centos系统下的安装工具,可以安装上我们全部所需的编译用软件包。

YUM工具安装时候会有提示是否继续,输入y确认继续完成安装,如果过程中有下载失败的软件包,可以再重复执行安装,YUM会自动找到没有完成的部分给予完成。

Development Tools中包含了大量编译用工具,时间较长,如果网络不好只能等待。

[[email protected]_host ~]# yum groupinstall "Development Tools"
[[email protected]_host ~]# yum install wget ncurses-devel zlib-devel vim-enhanced      

Ubuntu所需编译软件包

sudo apt-get install gcc g++ binutils patch bzip2 flex bison make autoconf gettext texinfo unzip sharutils subversion libncurses5-dev ncurses-term zlib1g-dev gawk asciidoc libz-dev      

OpenWrt固件生成

编译基本上干了啥

编译大约做了以下几件事情

首先通过刚才所下载的那些编译用的工具编译完成交叉编译工具

根据预设的参数和类型,使用交叉编译工具分别编译完成内核和个软件包

将编译好的东西打包成固件文件(一般以bin结尾)

收工!

获取AxWRT源代码

在编译OpenWrt的过程中,不能使用root超级用户,因此以下例程以帐号hoowa进行操作,请各位自己创建一个普通帐号完成后续操作。

以下两种方式获取源代码都可以!

返回当前账户主目录

[[email protected]_host /]$ cd ~
[[email protected]_host ~]$      

通过SVN方式获得源代码

svn co --username axwrt --password axwrt http://www.geeqee.com/opensvn/axwrt/trunk
[[email protected]_host ~]$ mv trunk axwrt      

通过HTTP方式获得源代码

[[email protected]_host ~]$ wget http://www.geeqee.com/axwrt/system/source.tgz
[[email protected]_host ~]$ tar zxf source.tgz
[[email protected]_host ~]$ mv source axwrt      

获取软件包源代码

OpenWrt在编译过程中,会去不同的网站下载所需要的软件包,比如内核他就去kernel.org下载等等,这个量很大,而且国内的网络不好,速度巨慢,为了节省这个时间hoowa已经做好了一个软件包列表来缩短AxWRT的编译时间。

这部分包很大,容量超过500MB,可以使用wget命令直接下载,也可以别的方式下载传到电脑中

[[email protected]_host ~]$ cd axwrt/
[[email protected]_host axwrt]$ wget http://www.geeqee.com/axwrt/system/srcpkgs.tar
[[email protected]_host axwrt]$ tar xf srcpkgs.tar
[[email protected]_host axwrt]$ mv srcpkgs dl      

请将srcpkgs.tar在你的电脑上保留住,以后还可以继续用,真心是节省时间啊。

OpenWrt菜单选项配置

OpenWrt菜单选择非常丰富,默认的AxWRT已经预设好了选项,如果只想体验下编译可以不做修改,如果选择错某些菜单选项可能导致编译失败,解决办法就是不断的尝试!

首次进入菜单选项,需要点时间,系统要收集整理已经预设的软件包

[[email protected]_host axwrt]$ make menuconfig      

进入后屏幕中将显示出来菜单选项如图:

编译定制:编译OpenWrt固件

图4001

选项菜单的使用

1.通过键盘上下可以更换选项

2.有--->符号的选项代表有子菜单

3.通过按回车进入选项或修改选项的值

4.通过键盘左右可以选择和点击屏幕下面的按钮:Select选择、Exit退出、Help帮助、Save保存、Load读取

5.最终确认选择Save后再选择Exit完成确认退出

选项有很多种大体上作用如下表所描述

选项 作用

Target System 目标设备芯片类型,AxWRT系统只保留了Ralink RT288x/RT3xxx。教学板MT7620芯片就是RT系列的升级版

Subtarget 目标子类型,一般是具体板子类型

Target Profile 针对不同路由器的版本再做的一个明确选项参数,一般默认即可

Target Images 生成的固件文件采用何种分区格式

Global build settings 编译时的一些全局参数,这些参数与Linux内核或GCC编译器相关

Advanced configuration options 高级选项参数,用于OpenWrt开发人员,一般用不上

Build the OpenWrt Image Builder 除了编译固件,再编译一个固件编译环境,可以分发给团队中的其他人使用。一般是厂商不想开放自己的全部源代码,给第三方合作伙伴提供这玩意

Build the OpenWrt SDK 产生OpenWrt SDK环境,就是另外一个开发环境

Build the OpenWrt based Toolchain 单独编译出OpenWrt的交叉编译工具

Image configuration 编译好的固件所附带的参数信息

Package features 一些软件包特性

Base system 基本系统命令软件包

Administration 高级管理命令软件包

Boot Loaders 引导程序,教学板不用固件附带,所以这里无选项

Development 开发用工具包

Firmware 不要被名字混淆了,这个的意思是,固件中是否带某些其他外围芯片的固件

Kernel modules 内核编译参数,这里的参数都来自芯片厂对内核的预设配置

Languages 编程语言软件包

Libraries 库软件包

LuCI OpenWrt下顶顶大名的LuCI界面包

Mail 电子邮件相关的软件包

Multimedia 多媒体软件包

Network 与网络相关的软件包

Sound 声音相关的软件包

Utilities 工具软件包

Video Streaming 视频流服务软件包

并不是所有软件包都选上了,实际上如果所有软件包都选上了一方面编译时间可能要按天计算,另外一方面用来存放固件的FLASH容量也不足以安装,所以OpenWrt的选择菜单在软件包选上有两种策略:

Buildin:绑定,直接将所选择软件包绑定到固件中

Module:模块,所选择软件包不绑定到固件中,以模块的形式存在,在需要时候使用opkg命令安装

更换两种策略的方式很简单,选中要更换策略的软件包,按空格键,如果显示为[*]则表示绑定,如果显示为[M]则表示模块。

hoowa推荐第一次编译不要去调整软件包,软件包存在很多依赖关系,先成功一次,然后再去选择哪些想要,哪些不想要!

编译固件

编译使用make指令可以满足多种不同的功能,选择一种方式来完成编译即可。

不显示信息直接编译

[[email protected]_host axwrt]$ make      

采用双核编译,采用多核编译可以节省至少30%的编译时间,但是由于软件包依赖原因可能会产生编译错误,并且不易于查找错误。参数-j 后面跟随线程的数量,根据CPU的配置来填写。

[[email protected]_host axwrt]$ make -j 2      

显示全部信息采用双核编译(挂起到后台处理,但是前台显示编译信息)

[[email protected]_host axwrt]$ make V=99 -j 2 &      

最Nice稳妥的单编译参数(挂起到后台处理,但是前台显示编译信息)

[[email protected]_host axwrt]$ make V=99 &      

关于编译中断了?

如果编译过程中遇到错误或手工停止掉编译都没问题,只要重复执行编译命令,他会从中断的地方继续编译。

首次编译!

OpenWrt首次编译因为要先编译交叉编译工具,因此所花费的时间是最长的,之后只要没执行过清理,再编译就会只编译改变的地方,那样编译时间就很短了。

清理编译

有的时候我们需要清理掉已经做过的某些编译操作。

清理掉包括已编译好:固件、软件包

[[email protected]_host axwrt]$ make clean      

清理掉包括已编译好:交叉编译工具、固件、软件包

[[email protected]_host axwrt]$ make dirclean      

清理掉所有内容(包含axwrt定义的软件包信息,这个清理将返回OpenWrt原始状态)

[[email protected]_host axwrt]$ make distclean      

编译完成后

编译完成后在axwrt/bin目录下就会有所编译出来的固件文件以及所有的软件包文件。将其中以sysupgrade.bin结尾的文件提出,使用之前章节所学习的方法就可以烧写到教学板中进行测试。

[[email protected]_host axwrt]$ ls bin/ramips/
md5sums                                               openwrt-ramips-mt7620n-root.squashfs  openwrt-ramips-mt7620n-vmlinux.bin  packages
openwrt-ramips-mt7620n-mr808-squashfs-sysupgrade.bin  openwrt-ramips-mt7620n-uImage.bin     openwrt-ramips-mt7620n-vmlinux.elf      

OpenWrt源码预设

Feeds源

OpenWrt的源码中仅包含了基本软件,其他软件都是从外围源上下载的软件包。这些软件包统称为Feeds源。

查看当前Feeds源的下载地址

[[email protected]_host axwrt]$ cat feeds.conf.default
src-git packages https://github.com/openwrt/packages.git;for-14.07
src-git luci https://github.com/openwrt/luci.git;luci-0.12
src-git routing https://github.com/openwrt-routing/packages.git;for-14.07
src-git telephony https://github.com/openwrt/telephony.git;for-14.07
src-git management https://github.com/openwrt-management/packages.git;for-14.07
src-git oldpackages http://git.openwrt.org/14.07/packages.git      

默认的时候是通过这个位置获得的软件包,下载全部Feeds源并且安装到源代码中的语法如下

./scripts/feeds update -a
./scripts/feeds install -a      

在教学系统AxWRT中已经下载完成全部Feeds软件包,只是默认没有选中,如想生成一个不包含任何东西的纯净系统,要清理掉全部信息

make distclean      

所有来自Feeds的软件包都被下载到feeds/文件夹下并且生成了相应的索引文件用于OpenWrt的菜单选项显示用。

OPKG自定义软件仓库

我们知道在AxWRT系统中的软件包管理工具opkg可以在线下载软件包,这个在线下载的地址也是可以配置的。

在OpenWrt菜单选项中:

1.选中Image configuration,然后进入

2.选中Version configuration options,然后进入

3.在Release repository处按回车,填写OPKG的下载地址

而相应的,将编译好的固件中bin/ramips/packages文件夹复制到所填写的那个OPKG地址中就可以实现自己的软件仓库。

预设编译参数文件

在获得AxWRT或完成基本的配置进行编译之前OpenWrt系统已经完成了一个预设编译参数文件,这个文件包含了全部配置信息,有兴趣的可以看下。

当前预设编译参数文件

axwrt/.config      

上一次预设编译参数文件

axwrt/.config.old      

开发人员会经常对着两个文件进行对比操作来检查对软件包或配置所做的修改影响了什么。

OpenWrt文件夹作用

文件夹名称 作用

bin/ 编译完成后的固件文件以及软件包

build_dir/ build_dir/host/ 用于编译支持的宿主系统运行程序

build_dir/target_xxx 所有软件包的编译过程文件夹

build_dir/toolchain_xxx 交叉编译工具

config/ 菜单选项的基本菜单

dl/ 各类软件包下载后源代码存放位置

docs/ OpenWrt的官方文档

feeds/ feeds源的软件包描述和配置

include/ 编译的参数描述

package/ 基本软件包描述和配置(feeds源也会软连接到这里)

scripts/ 用于完成编译的脚本程序

staging_dir/ 存放编译后的目录结构,固件通过这里的结构生成

target/ 存放各类CPU和芯片和电路板参数与专有驱动

tmp/ 临时文件

toolchain/ 交叉编译工具的源文件

tools/ 用于辅助编译的各类工具编译参数

Target/linux下平台预设文件

大部分文件夹都是用于参数整个编译流程的,其中最主要的是target/linux与package/(下章将专门讲解软件包如何制作)。Target/Linux中包含的东西拥有以下作用:

1.描述厂商芯片标准

2.描述芯片类型

3.描述芯片的驱动

4.描述针对不同的板子所使用的驱动类型

5.与菜单选项中的Target系列选项有直接对应关系

AxWRT的Target/linux下内容

[[email protected]_host axwrt]$ ls target/linux/
generic  Makefile  ramips      

AxWRT经过精简,取消了很多教学用不上的CPU类型支持。所保留的有两个为:

generic/ 通用标准信息

ramips/ 针对MTK公司的芯片

各种不同的芯片类型在target/linux/xxx下面具体内容多少都有一定区别,这是因为各芯片厂商的芯片表述都不一致的原因,这里我们仅以ramips文件夹说明。

target/linux/ramips

文件夹名称 作用

base-files/ 用于ramips芯片的固件中的普通文件,这些文件都将直接打包到固件中

dts/ Linux系统硬件驱动设备树文件,这个是OpenWrt BB版开始为MTK芯片新引进的表达方式

files/ 驱动或芯片汇编程序源代码

image/ 针对这个芯片的固件编译参数

mt7620a/ 针对MT7620A这款芯片的配置参数以及与其相关的板子说明

mt7620n/ 针对MT7620N这款芯片的配置参数以及与其相关的板子说明

mt7621/ 针对MT7621芯片的配置参数(BB版对7621支持还不成熟)

patches-3.10/ 针对内核版本3.10的芯片相关补丁,默认BB版主内核

rt288x/ 针对RT288x系列芯片的配置参数以及板子说明

rt305x/ 针对RT305x系列芯片的配置参数以及板子说明

rt3883/ 针对RT3883系列芯片的配置参数以及板子说明

OpenWrt官方版编译

OpenWrt官方版与AxWRT教学系统大体上编译流程差不多,也可以使用srcpkgs.tar加速,但效果不明显,因为官方版的软件包一旦变化还是要重新下载。如果愿意折腾,也可以折腾一下,但是那玩意Bug有时候会让编译者卡住,这个时候就需要编译者有耐心去修改Bug了,可不要指望老师们解决,老师们不是神解决不了这么多。

下载源代码

git clone git://git.openwrt.org/14.07/openwrt.git      

下载和安装Feeds软件包

cd openwrt
./scripts/feeds update -a
./scripts/feeds install -a      

进入菜单选项进行配置

make menuconfig      

开始编译

make V=99      

hoowa送给学习这章的同学

关于编译

OpenWrt的编译是一个熟练的过程,通过反复操作逐步熟悉系统的每个细节,关键在于建立一种自我提升的能力,OpenWrt系统变化非常快,如果学生不能跟随这种变化,那就只能继续使用AxWRT教学系统。

要问hoowa编译过多少次,hoowa自己统计过应该不少于100次以上。

关于硬件支持

目标类型的相关几个选项,直接影响到编译出来的东西是在哪里运行的。这些东西不是天然就有的,实际上是由OpenWrt开发组、芯片厂商、嵌入式工程师所贡献到项目中的,如果想要为某一款芯片增加这种支持,那么需要具备这些技能:

熟悉芯片

得到原厂的SDK资料

熟悉C语言

熟悉Makefile编写

熟悉Linux内核

熟悉OpenWrt系统

更显然的说,做这件事情需要的是嵌入式驱动和系统级工程师来完成的。

那么我们这些软件出身的人可以干嘛?简单!实现将自己的定制OpenWrt系统完美运行在市面上的路由器产品上。学习完第四大部分所有章节后,即可实现这个目的。