页面

分类

梦断代码 --一个程序员的自白(六)

2014/4/25, by wingfire ; 分类: 其他; 0 comments

我对公司有一个很不满意的地方,就是缺乏像样的职业培训。我来到这里之后一直是传授东西给别人--当然我对此并不抗拒,还很乐意--自身的水平却没什么提高。于是我打算还是学点东西。我把业余的时间都拿来玩Linux和开发板。我工作中接触的第一个操作系统就是Unix,Sco OpenServer,所以自然地对Linux有着好感,但是一直没有系统地学习过Linux。但是2001年初次接触RedHat时,确实给我留下点心里阴影,后来就一直没怎么碰Linux,但是RedHat后来也确实带给我的都是挫折和痛苦。有一次,我被要求装一个RedHat 5 Enterprise用于Build AIRMax的各个项目,软件是各种缺,Yum还要收费。后来买了RH5的服务,Yum还是不行,要么没有,要么版本太老,各种受不了。最后,我还是到做Build的Team那里,用tar把整个系统打回来,再重新配置一下才搞定。一周以后,美国一个做Build的同事也要干同样的事。但是他比较有毅力,一个个RPM下载,安装,干了一天加一晚上,然后郁闷地告诉我,还有100多个包没下载。这事儿让我很是欢乐了一阵,这哥们儿太实诚了:D。最后中美人民达成共识:“I hate it”。

既然是学习,就要做点功课。这次还是认真地比较了一下几个发行版,决定从最符合开源精神的Debian Squeeze开始,先熟悉Linux的使用。还好,Debian的资料很丰富,而我这次首先就是熟悉包管理系统,也算是对路。不过,有几样东西一直还是挺折腾的。最烦的就是X,变化还快。当初配一个XFree86还是XOrg,还是有点烦的,所幸,都很容易解决。早期的GDM也不够方便。在大致熟悉了Debian之后,我开始按照LFS的教程,尝试自己Build完整的Linux发行版。我并没有完全按照教程建议的那样选择软件版本和编译器,而是直接用当时最新的编译器和绝大多数最新的软件源代码。我小心地把每一步都用shell脚本记录下来,并且编上号。我忽然觉得我比那个下了100多RPM的美国哥们儿还有耐心。其中大量的时间花在看Linux的config选项上,可惜当时有人已经给那些config项写了个中文的解释,要不然我也可以考虑写一个。前后花了大概1个多月的时间,终于完工了。看着VMware中自己一步步做出来的LFS出现终端提示符的时候,还是很有满足感的。另一个感叹的是,这些开源的软件编译起来都太方便了,会了一个,其他的全都会了,这真正是一种愉悦的体验。哪像在公司build的项目啊,不折腾死你不算完。就像我早说过的,《程序员修炼之道》中强调的--其实更早就被强调过了--,必须一个按钮,或者一个命令就可以启动从编译,到测试,到打包,乃至到集成、部署的全部过程。就这事儿,还老是有人说:哎呀,全自动是好啦,可是很难做到啊,这个很难啦,那个很难啦,我以前的公司项目也是想做做不成啦。。。你全自动都没做成过,就敢说什么“是好啦?”这些事情,都是项目Setup的头一个月,甚至第一周内就应该全部到位的,自己做不来就赶紧求援,找人来做!我认为本年度我见到的最搞笑的事情就是,持续几年的项目马上/已经结束了,Continues Build终于上线了。早干嘛去了?

搞LFS的过程比教程上的还要顺利,因为我使用最新的源代码,教程上需要打的patch大部分实际都已经fix了。因为我目的是为了搞ARM,所以接下来要要搞一个交叉编译的平台。我不想用开发板自带的交叉编译系统,太老,而且不能随时升级。另外,似乎怎么搞一个交叉编译系统的文章也不大靠谱,大多只是搞个别环节。这也可以理解,完整的工具链还是有点复杂的。所以CLFS就是必须学习和完成的。还好,CLFS对我来说反而更顺利和快捷,除了Perl遇到了一点问题。接下来,就可以用这个CLFS去build一个ARM的Linux系统了,这个步骤又和LFS几乎是差不多的,之前写的脚本就节约了大量的时间。所以后面的CLFS+ARM只用了1周多一点就完事儿了。这时Build出来的ARM linux还不包括内核,只是可以chroot切过去,然后可以用最新的工具链。这个过程的失误也不少。第一是我应该装一个QUMU虚拟机的,而不是直接上到ARM板子上,这后来浪费我许多时间。第二是我应该及时做笔记,把整个过程记录下来的。

接下来,就是要给ARM板子移植一个Bootloader了。幸运的是,我买了mini 2440的板子,网上的文章铺天盖地。理所当然地,选择移植U-Boot。这一次我又犯了个愚蠢的错误,我居然没把U-Boot先放到版本控制中去。当时我已经开始学习DVCS,并且开始使用Mercure(Hg)了,建个库只是分分钟的事,也可以离线。但是我居然一直没建,不知道当时哪根神经搭错了。移植U-Boot对我来说是一个全新的体验,特别是ARM的汇编部分对我来说很是痛苦,只能用4个LED来调试,直到串口工作了,才算回到正常世界。所幸自举代码量很少,只是启动加载和少量硬件初始化。接下来的日子就是读Datasheet,算时钟频率,查寄存器手册,调驱动。这也是个没有干过的事情。一开始也是很慢,渐渐地才适应。当时一个是串口和串口工作前花的时间特别多,另一个是网卡,丢包的问题让我很是头疼。不过,U-Boot工作正常以后还是很开心的。而且因为网卡折磨我很久,网卡好了以后,我也就要折磨一下它。我把那个NetConsole模块弄工作,再用nc连上去,这就相当于可以通过网络进PC的BIOS了。所以,当时就希望能通过netconsole给ARM板子装操作系统,Debian,可惜我最终还是没能成功。

Bootloader有了,Linux系统也有了,就差Linux Kernel了。其实U-boot的代码也是从Linux Kernel里剥出来的,我当时用的是1.6,但是kernel好像我已经用2.6.28还是32了,驱动部分的代码不太一样了。所以硬件部分的修改要再次找出来,改好。有了U-Boot的经验,这次倒也算轻车熟路,况且Linux对2440的支持还不错。当然现在的支持更好了,我有看到编译Linux kernel时可以直接指定mini 2440板子了--以前只能选S3c2440芯片组。

我在做整个LFS,CLFS以及ARM的构建时,只要可能当然是优化全开的。不知道是不是得益于此,当我第一次完全地在ARM上启动到全部亲手构建的Linux后,其性能还是让我很振奋的,非常快。后来又裁剪系统,塞到NAND中(用的是Ext2),那种搭积木的感觉真是爽快啊。在玩ARM过程中犯的错误不谈,遭遇的挫折和困难,知识的缺乏,学习之枯燥,直至后来用JTAG调试系统,比ADP不知道恶劣多少,可是却一直能兴趣不减,结果也很不错,收获颇多。可是为什么ADP就那么令人绝望呢?

有了一个就手的ARM,干点什么呢?当然是当服务器用。第一件事,当然是装MLDonkey啊!汗!接下来就是折腾Hg。今天看来,当时没有折腾Git是个错误啊。又开始申请域名(当然不会是在国内申请),因为这些都需要web前端,又开始折腾Nginx,https,根证书--做CA有种很牛X的感觉,很奇妙。这一段时间我也没干什么正事儿,就是做文档仓库和代码仓库,当然还练习了几天网页和fcgi。不过得夸奖一下,MLDonkey确实很给力,就连好莱坞大片我都看不完。当时还想要的一个东西是blog系统,选择了据说是比较快的Wordpress,我用了sqlite做数据库。结果性能惨不忍睹,根本就不能用,我实在是很讶异这也能叫性能比较快?连带我做优化的兴趣都没了。另一个后果是,我长时间不再写Blog。结果,后继的一些打算也都没有做:笔记,邮件服务器等等。另一件让我印象深刻的事情是,我在arm上编译--不是交叉编译--boost release build时,第一次体验了内存颠簸的感觉。但是奇怪的是,系统并没有死的很彻底,这和pc上的反应不一样--PC在颠簸结束前完全是假死状态。一共build 过两次boost release,每次耗时在10个小时以上--内存不足,非战之罪。哦对了,搜狗和百度的爬虫太粗鲁了!我那可怜的ADSL就512K的上传,受不了天天有爬虫啊!Google显然礼貌的多,知道先拿robots,而且很久才爬一次!当时就一个很好玩的想法是:布置个应用,然后给爬虫喂误导性的数据,甚至有目的地诱导爬虫,会怎么样呢?

虽然发现自己有太多硬件和系统内核方面的东西要学,可是又觉得要学就要有个结果,而那显然不是一个短期计划可以见效的,也就没有继续。LFS也有自己的问题,就是什么软件都要自己build,这作为一个固定功能的平台是够了。可是对于一个抱着折腾目的的人来说,这是不够的,能装上Debian才行。可惜我一直都没能把Debian移植上去--当然是从kernel开始的那种移植,让U-boot支持远程安装Debian自然是更加没影的事儿了。现在想来,我有点一根筋了,chroot一个Debian也足够用了啊,干嘛一定要和kernel较劲呢?如果把那时间用来研究UML(User Mode Linux)和LXC(Linux Containers)多好啊!这样我就可以放心地布置几个蜜罐,研究一下了。可惜梦想很丰满,现实很骨感。

既然hg的代码仓库建起来了,免不了要开几个项目,写点代码练习一下。写点什么呢?想到那个让我不爽的ADP,我在ARM上建了一个叫ADPLite的项目,试试看,能不能一个人把ADP干翻。

添加评论:

 
 the email would not displayed
 

您可以使用 Markdown 语法。

您必须启用浏览器的 JavaScript 功能才能发表评论。