完全新手教程:编译openwrt全过程

此文在www.openwrt.org.cn发现,但编译过程有些问题,出现bug,最终找到解决方法,在这里我用红字标记,大家一定要注意。

 原作者地址是http://www.openwrtdl.com/wordpress/openwrt-full-tutorial,在软件的圈子里我们的共享精神发扬的广度决定了我们技术的进步速度。。。感谢openwrt.org.cn

学习openwrt还是建议能够学习的更深层次,重点推荐几个文章


固件生成过程:


http://www.openwrtdl.com/wordpress/openwrt%E7%94%9F%E6%88%90%E5%9B%BA%E4%BB%B6firmware%E6%B5%81%E7%A8%8B


ipk生成过程:


http://www.openwrtdl.com/wordpress/openwrt%E4%B8%8Bipk%E7%94%9F%E6%88%90%E8%BF%87%E7%A8%8B%E5%8F%8A%E5%8E%9F%E7%90%86


ipk文件结构:


http://www.openwrtdl.com/wordpress/openwrt%E7%9A%84ipk%E6%96%87%E4%BB%B6%E7%BB%93%E6%9E%84%E5%8F%8A

 

    我也搞不懂为什么,我想玩编译的时候,搜来搜增没搜到什么菜鸟教程,没玩过LINUX的一般会觉得很难,就跟我一样,我也是从未玩过LINUX。也许也因为并不难,所以网上比较少详细的教程,就连官方WIKI也都是比较简要地说明而已,所以感觉难的人看了过于简要的教程后,只会觉得更难。

 所以我才写了这篇“扩展”版的简要教程,其实也真的是很简要,没什么突出之处,只是起码在文字上让人能更容易看懂。高手可以回避了,因为你不会在本文学到任何东西,因为我也是新手,只是以菜鸟的角度看待本文的主题。下面开始正文:

 

1、安装Ubuntu,到http://www.ubuntu.org.cn/desktop/get-ubuntu/download/ 下载,版本随便,我选的是10.10 32位版。安装过程就不说了,图形化安装,而且是中文版,连安装都搞不定的,可以关闭本页面了。可以安装在虚拟机里,也可以安装在物理机了,官方建议有条件的最好安装在物理机上,大概是说虚拟机有时会有不可预料的情况,但装在虚拟机里的人多得是了。题外话:安装过程中某一步设置用户名密码时,我是选择了自动登录,因为懒得每次都输密码登录,反正只是编译用的系统又没什么秘密。

 

2、安装好后,在左上角“系统”菜单的“首选项”中选择“屏幕保护程序”,然后去掉左下角的“计算机空闲时激活屏幕保护程序”,然后按“关闭”,这个窗口是没有“应用”或“确定”之类的,直接关闭它就会保存。用惯了WINDOWS的用户注意了。为什么要做这步呢?因为整个编译过程中有些步骤要等一段时间的,老是自动启用屏幕保护程序,然后还要重新输密码才能退出,也是麻烦事。

 

3、选左上角的菜单“应用程序”-“附件”-“终端”,进入命令行,然后输入sudo –sH,注意大小写,然后输入装系统时设置的用户密码,就能切换到root(提示:输入密码的时候不会有*之类的显示的,是完全不显示,部分人不必惊慌)。切换到root是为了安装或升级部分必要的组件,有些组件需要root权限。

 

4、切到root后,顺序输入:

apt-get install g++

 apt-get install libncurses5-dev

 apt-get install zlib1g-dev

 apt-get install bison

 apt-get install flex

 apt-get install unzip

 apt-get install autoconf

 apt-get install gawk

 apt-get install make

 apt-get install gettext

 apt-get install gcc

 apt-get install binutils

 apt-get install patch

 apt-get install bzip2

 apt-get install libz-dev

 apt-get install asciidoc

 apt-get install subversion

     每一行回车后都会马上检测安装或升级那个组件,官方WIKI用的是单一条命令,我分开了,因为这样更容易查看每一个组件的安装是否成功。一行命令的话,一大堆东西连续出来,懒得拖滚动条回头看了。一个个分开执行方便看一些。个人喜好了。当中最后面的asciidoc组件是需要下载400多MB东西的,慢慢等了。下载东西之前会有提示本次要下载多少M的东西,问是否的,按y然后回车让它下载就行了。提示:假如它提示找不到软件包的话,那麻烦你再看清楚命令中的软件名名称,因为有时是字母中间冒个数字1出来之类的,很容易错看成字母L。

按照楼主的过程下来,发现在makedefconfig之后开始有个错误,意思是自己的gitgit-core)软件没有加上,最后我sudo apt-get install git sudo apt-get intallgit-core安装之后就好了,

make defconfig之后会报错误 checking libsslfaild  please install the openssllibrary,意思是libssl没装,最后我加了sudo apt-get install libssl-devmake

Sudo apt-get install libssl-dev

Sudo apt-get install libssl0.9.8

Make V=99

5、上述安装完成后,这一步很重要,就是执行Exit命令退出root。如果不退出root的话,那后面会出现晕人的情况,下一步是下载源码,以root身份下载源码后,在后续操作中有些会提示不能以root身份操作,但源码已经以root身份下载了,所有文件的“所有者”都是root,退出root后再操作,又会提示没有权限,因为文件是root的,普通用户无法访问,结果只能用命令修改文件所有者,比较麻烦。所以这里就要退出root,以普通用户身份执行下面的下载源码命令。其实一开始安装组件的时候可以在命令前加上sudo来达到临时用root身份,执行完后又回到普通权限的目的,但对于新手来说,不必过于追求这些了,有个可行的方法就凑合着先用吧。

 

6、来到这里,操作系统部分完全准备好了,建议如果用虚拟机的朋友先做一个快照,后面编译部分出了问题大不了恢复快照重新来过。不知道什么是快照的话,当我没说过这一条。

 

7、下载源码,分两种,一种是最新版但不是最稳定,也就是trunk版,一种是相对稳定版,backfire版。源码下载命令分别是:

 先创建文件夹:

Mkdir openwrt

 Cdopenwrt


 Trunk版下载命令:svn co svn://svn.openwrt.org/openwrt/trunk/

 Backfire下载命令:svn co svn://svn.openwrt.org/openwrt/branches/backfire/

选择你想要的版本就行了。然后又是等待下载…

 

Trunk版下载命令:svn cosvn://svn.openwrt.org/openwrt/trunk/

Backfire下载命令:svn cosvn://svn.openwrt.org/openwrt/branches/backfire/

貌似这两个连接不对。org 后面加.cn

Openwrt也全面转向git来管理代码

trunk版下载命令git clonegit://git.openwrt.org/openwrt.git

下载packages feeds ,结合上一个命令使用git clone git://git.openwrt.org/openwrt.git

15.05 branch (chaoscalmer) git clone git://git.openwrt.org/15.05/openwrt.git

14.07 branch (barrierbreaker) git clone git://git.openwrt.org/14.07/openwrt.git

12.09 branch (AttitudeAdjustment) git clone git://git.openwrt.org/12.09/openwrt.git

12.09软件包更新地址git clonegit://git.openwrt.org/12.09/packages.git

 

OpenWrt源码目录结构:

 

tools和toolchain目录:包含了一些通用命令, 用来生成固件, 编译器, 和C库.

build dir/host目录:是一个临时目录, 用来储存不依赖于目标平台的工具.

build dir/toolchain-目录:用来储存依赖于指定平台的编译链. 只是编译文件存放目录无需修改.

build dir/target-目录:用来储存依赖于指定平台的软件包的编译文件,其中包括linux内核, u-boot, packages, 只是编译文件存放目录无需修改.

staging_dir目录:是编译目标的最终安装位置, 其中包括rootfs, package,toolchain.

package目录:软件包的下载编译规则, 在OpenWrt固件中, 几乎所有东西都是.ipk, 这样就可以很方便的安装和卸载.

target目录:目标系统指嵌入式设备, 针对不同的平台有不同的特性, 针对这些特性, “target/linux”目录下按照平台进行目录划分, 里面包括了针对标准内核的补丁, 特殊配置等.

bin目录:编译完OpenWrt的二进制文件生成目录, 其中包括sdk, uImage,u-boot, dts, rootfs构建一个嵌入式系统完整的二进制文件.

config目录:存放着整个系统的的配置文件.

docs目录:里面不断包含了整个宿主机的文件源码的介绍,里面还有Makefile为目标系统生成docs.

include目录:里面包括了整个系统的编译需要的头文件,但是是以Make进行连接的.

feeds目录:扩展软件包索引目录.

scripts目录:组织编译整个OpenWrt的规则.

tmp目录:编译文件夹, 一般情况为空.

dl目录:所有软件的下载目录, 包括u-boot, kernel.

logs目录:如果编译出错, 可以在这里找到编译出错的log.


8、开始准备编译

cd Trunk或者cd backfire

如果不是刚下载的代码,为了保持代码为最新状态,应该定期运行Svn up或者git pull origin master更更新代码,什么时候有变你是不知道的

下面要更新下feeds,先介绍下feeds包含什么

OpenWRT的feeds包括:

  1. packages – 提供众多库, 工具等基本功能. 也是其他feed所依赖的软件源, 因此在安装其他feed前一定要先安装packages!
  2. luci – OpenWrt默认的GUI(WEB管理界面).
  3. xwrt – 另一种可替换LuCI的GUI
  4. qpe – DreamBox维护的基于Qt的图形界面, 包含Qt2, Qt4, Qtopia, OPIE, SMPlayer等众多图形界面.
  5. device – DreamBox维护与硬件密切相关的软件, 如uboot, qemu等.
  6. dreambox_packages – DreamBox维护的国内常用网络工具, 如oh3c, njit8021xclient等.
  7. desktop – OpenWrt用于桌面的一些软件包.
  8. xfce – 基于Xorg的著名轻量级桌面环境. Xfce建基在GTK+2.x之上, 它使用Xfwm作为窗口管理器.
  9. efl – 针对enlightenment.
  10. phone -针对fso, paroli.

trunk中默认的feeds下载有packages、xwrt、luci、routing、telephony。如要下载其他的软件包,需打开源码根目录下面的feeds.conf.default文件,去掉相应软件包前面的#号,然后更新源:

./scripts/feeds update –a

./scripts/feeds install –a

如果不更新软件包的话,你会发现后面是看不到很多软件包的,也就无法集成那些看不到的包了。然后是make defconfig,再make menuconfig进入定制界面,慢慢选了,里面可选只编译指定设备的固件,一定要注意选对自己的设备类型,然后可以指定该类型下的具体哪一款。配置比较多,不慢慢说了,其实我也不是很懂,自己进去撞几回就差不多了,有些软件包你不懂的,就表示你不需要了,有些软件包你装官网版本后要另外装的,你见到了,就可以选上让它集成,要让它前面括号里出现*才表示集成。配置完成后退出记得选保存。如果你想修改源码,应该在此时进行,比如支持大容量Flash之类的修改,自己上网查到修改什么文件什么地方后,就在Ubuntu图形界面上进去找到文件,双击打开文本编辑器修改保存。如果想集成中文包或其它非官方包的话,那我也帮你不到了,因为我也还不会。

 

上传博客论坛有个问题啊,很多字符被自动格式化了,命令首字母变成大写了,这个还比较容易看出来,那个
./scripts/feeds update –a
./scripts/feeds install –a
的那一横,应该要用英文的-代替哦,刚开始直接拷贝到命令行运行,半天不正确

 

9、最后就执行make正式开始编译,首次编译必然是漫长的等待。如果是双核CPU,使用Make –j 2命令可以加快速度,但有人却不建议使用,官方WIKI也没说这点,我也不知道有没有好处。但我是4核CPU,使用Make –j 4命令,发现CPU占用率并没有明显提高,看了帮助,发现可以不加数字,不加数字默认就是不限制同时进行的任务数,我用了Make –j不限同时任务数后,CPU居然100%了,但整个编译过程的占用率都会有波动,刚开始是100%,后面有段时间是25%左右(也就是只用单核了),然后有时又会40%到50%(差不多用了双核),有时甚至几乎没有操作,CPU占用很低。但首次编译是特别慢的,第一次之后的都相对快很多了。悲剧的是,我第一次用Make –j编译结果是失败,然后再一次Make不用参数才成功,也许就是有人不建议使用的原因,但因为有前一次的编译,所以第二次是很快的。也就是说,假如用j参数能加速的话,虽然有可能会失败,但因为第二次不会花很长时间,所以也许加j参数还是能在第一次编译中加速的。不过我没有对比加不加-j参数花的时间区别。有兴趣的朋友自己对比吧。

 

10、编译完成后会出现bin文件夹,进去找你需要的BIN刷吧。

 

11、BIN如何传出? 我是用FTP,甚至是用Firefox上网进邮箱都能传出,对于一个不懂LINUX的人来说…

 

Trunk 版里官方已有中文包,直接在配置那里可选集成,具体位置自己找找吧。但集成后不会默认显示中文,刷好后要在luci设置那里自己选择中文,而且比如multi-wan那些插件也没有汉化到,中文包只包括默认带的那些插件的汉化。你试试看。


能不能说说,make Make的区别,Make的时候提示少一些程序, bakefakerake cakephpscriptes  装了这些包,还是提示同样错误。

 

挺好的一个简易教程。编译完了里面选为模块的都在packages下编译成ipk的软件包了。就是没什么好机器做实验。

 

apt-get install g++libncurses5-dev  zlib1g-dev  bison  flex  unzip  autoconf  gawk  make  gettext  gcc  binutils  patch  bzip2  libz-devasciidoc subversion

 

针对于第 9 条,我的解释如下:
如果使用 make -j ,不加进程限制,编译速度很快,却会出现 “vfork” 不出新的进程,一直在等资源,最后没等到死掉的情况,说明多进程编译这部分没做好。
此时使用 make V=99 ,就可以看得到情况。
因此建议使用 make V=99 编译。虽然慢,但是不会出错。
PS.
再说一下下载的事情。如果下载不下来,建议修改一下下载的地址,改成国内的 ……

如何改,刚才忘说了。改 scripts/download.pl 文件,看到那些地址了么,加上咱国内的就行了。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值