第一次碰openwrt(这个项目的大名早已听说),简直是颠覆了多年辛苦建立起来的嵌入式观念,自从出来社会后,没跟上时代,竟然落后这么多!嵌入式的水虽然深,但折腾这么多年,见过大风大浪了,没想到openwrt几竟变成未识之领域。仿佛回到了学生年代:没有支持,靠自己四处搜索。真不知道那个X86项目系统的构建是怎样过来的。
决定搞openwrt之后,就得想在什么板子上移植。本来我想去某宝上买一块回来搞,但一来,这是公司事,我个人没需求;二来公司申购流程可能要走小半个月时间。还好上个月完成的项目中还有块x86的板子,于是就决定拿它开刀。
首先去几个论坛上了解各种刷机。看了帖子,感觉不难,很多是在路由器网页上直接升级做好的固件。同时还了解如何编译,如何烧写。初看起来,真的不难,与一般的嵌入式开发没什么差别。但我的目的和网上很多人不同,我是了解其机制,当然要从头开始学习。
了解之后,去官网https://openwrt.org/看看,目前最新版本是chaos_calmer 15.05。在Downloads页面在结果只找到编译好的二进制镜像。经多方搜索,了解到openwrt有svn仓库svn://svn.openwrt.org/openwrt,也有git仓库git://git.openwrt.org/openwrt.git。出于习惯,我下载了git仓库,但因为是开发版本,不稳定,遂放弃。之后下载svn的分支svn://svn.openwrt.org/openwrt/branches/chaos_calmer来编译,在make menuconfig步骤,发现缺少部分工具,但也是小打小闹,问题不大。还是学生的时候,我坚持使用fedora系统,参加工作后公司大部分人用ubuntu就跟风。但我每次安装完系统后,都是把必要的东西安装上去。因此我不用像网上教程那样安装十几个工具。但menuconfig的界面包含了整套openwrt要使用的东西,而内核,只是其它一个选项。
openwrt的编译过程与其它一般的开发不同。我概念中,编译就是输入make。而编译前,该有的东西要自己具备:交叉编译器在厂商的SDK中有,或在网上找;bootloader,内核自己下载;rootfs要么找SDK包,要么自己玩。但openwrt把这些玩意统统揽在自己身上,在make的时候,openwrt会联网下载各种所需的工具源码、库源码、补丁,然后解压、打补丁,编译。有的工具由openwrt配置文件中写好,有的工具在上一步的make menuconfig由用户选择。因此,搞这个东西时,就要你的PC能联网,最好机器性能也好。实际上,我用的机子就是那个X86的板子,因为之前做项目,我单独搞了一个安装ubuntu系统的硬盘。另外要注意,make过程十分耗时,如果配置选的工具多,就会很久。我没看过时间,反正断断续续的搞,花了大半天时间。还有一点要提及的,我是在windows系统中下载svn仓库,个别脚本行尾以\r\n结束,这在Linux下是不认,要用工具flip或dos2unix转换。
一般尾部下,在编译过程中会有问题发生,比如断网,则再次编译即可。又或者是自己强制中断。这时最后编译的包会有空文件产生,如果是,则可能直接找到这个包,删除。
编译完成后,就会产生img.gz的镜像。之前就上网了解了烧写的方式、介质。我决定使用U盘,但有一个板子有USB接口有VGA接口但没有专用串口线,另一个板子有串口头但无USB接口。请求其它部门搞了一个USB头,这样,具备了串口终端及U盘启动的条件。可惜,我编译生成的镜像启动到中途就卡住了。
自己搞的不成功,于是就找官方编译好的,找了2个版本,地址分别是:
http://downloads.openwrt.org/snapshots/trunk/x86/generic/
以及
http://downloads.openwrt.org/chaos_calmer/15.05/x86/generic/。
天幸我,竟然可以顺利启动,并可以进入到命令行,但可惜,没有网络设备,对于路由路来说,没网卡等于什么也没有。无论如何,前途是光明的,成功是可期的。
静心下来,顺便把欢乐的国庆节过了。对比启动log,发现我编译的镜像有2个问题。第一个是没有串口驱动,官方的有;第二个是网络驱动和板子不配套,认不出网卡,官方和我编译的,都如此。先把找到的问题解决,一步一步来。
找了半天串口驱动,原来在Other modules里面。把它勾选上,编译烧写,顺利进入命令行。
至于网络驱动,有点麻烦。内核配置界面里没找到适用的IGB驱动,于是又上网了解openwrt对于内核配置的配置。原来在package目录有很多mk文件,所有内核模块都按类别放至不同的文件。找到netdevices.mk,IGB驱动赫然在列,但menuconfig界面就是没有找到。几经努力依然失败。想到还有个git仓库没试,于是下载git仓库的15.05分支git://git.openwrt.org/15.05/openwrt.git。值得称赞的是,这个仓库的内核可选项比SVN仓库的多了很多,让人意外的是那个找了千遍的网络驱动竟然在内。我对比过一部分配置文件,发现没有区别,但既然有手段能解决问题,就不管了。
之后还是编译(我把原来要下载工具的目录拷贝到新的工程目录)、烧写。这次终于成功了,在命令看到久违的网络设备,改IP,登陆。终于看到openwrt的网页。硬件软件信息都正确。第一阶段任务完成。
回想起来,好像openwrt也没什么难的地方。但这是建立在探索一段时间之后的认识基础上的结论。但以未来的认知判断当前的认知,却是不可取。
PS:
敬爱的各位亲朋好友,不要指责我所做事务范围之广。我做的其它很多的事,没写出来呢。
李迟 2015.10.14 周三 晚上