第四部分:自己动手修改Flash
希望你能够喜欢我在前几节中介绍的对NSLU2所作的扩展改造,我们已经完成的这些操作是相当有用的,不过现在有问题出现了,只要你的NSLU2重新启动,所有添加的新程序如telnet、NFS和mt-daapd都需要手工来启动它们,这样就显得很麻烦了。当然,我们能够使这些程序在每次启动时自动地运行,如同一台标准的计算机一样。
如果是一台普通的计算机,我们仅仅是需要把启动script放到自启动序列中就行了。在一台Linux机器上有容易做到,通过开始时的第一个进程init,跟踪启动序列,再连接到rc script目录就可以了,在网络初始化后我们可决定被调用的script的位置。但在NSLU2中这一切就不是这么简单了,它整个的启动序列固化到一个RAM磁盘上了,对这个设备所作的任何更改在它重新启动后都是不会保存的。
我花费了相当多的时间去寻找一个“hook”,它是一个磁盘上的文件,可让我们把一个定制script的引用存放于其中。如同crontab文件一样,它是类似于Unix系统中的一个文件以规定进程在特定的时间运行,如果我们能把某个定制script的引用放到crontab中,Linux就可来为我们运行它了,但不幸的是,在NSLU2上,crontab文件也被固化到RAM磁盘上了。
我所找到的最可能使用的文件就是Samba配置文件了,Samba有一定的能力来运行在配置文件中指定的某个外部进程,但最后这还是没有什么作用。我最初的目标是在不修改Linksys标准firmware的前提下添加一个功能而已,但显然没有什么轻松的方法能够做到这一切。
幸运的是,当我在那儿白费力气去寻找一个启动hook时,听到说有另外的NSLU2开发团体正在使用一种不同的方法,他们正在研究修改Linksys的firmware的可能性,假如能够修改Flash中的代码,就可更改启动序列来做许多的事情了,包括让它启动一个新的进程。这看起来似乎是一个比较疯狂的想法,且这种办法实现的可能性也不是很大,不过由于NSLU2使用的Linux操作系统,它在Flash中的映像文件的格式是相当标准的并且很容易让人理解。
1、动手前的准备工作
就这个NSLU2来说,它的Flash被分成四个不同的部分:
Redboot
System Configuration
Kernel
RAM disk
Redboot部分有点像PC的BIOS,它是用来加电后初始化硬件和启动系统的;System Configuration是那些如它的IP地址之类的固定参数存储的地方;Kernel是Linux运行的系统映像文件;RAM disk是所有的库文件、配置文件、script和可执行文件(如一个WEB服务)存储的地方,如果你想自动地启动自己添加的新程序,RAM disk就是我们需要修改的内容了。基本的思路是取得一个firmware的映像,把它的各部件分离出来,再修改RAM disk的那一部分内容,再把它们合下来放写回原处,重新设置一下。说起来容易,做起来就难了,任何的一点失误就可使它成为一块废铁,也就是说,它就彻底完了,还不如一块砖头有用呢。
注意:有文章说可以为NSLU2增加一个串口,有了串口后,如果它的Flash损坏后就能够被恢复,不过给NSLU2增加串口需要进行焊接操作,笔者在这方面就不太在行了,况且这些也不是本文所讨论的内容。
最新消息:还有一个实在的办法就是telnet到RedBoot loader,不过也不是十分靠得住的,采用这种方法也可以帮助我们来恢复损坏的Flash了,而不必用到烙铁。要了解更多的关于使用串口或telnet来恢复损坏的Flash之信息,请参阅http://groups.yahoo.com/group/nslu2-linux/。
怎么还在这儿费话,OK,真正开始吧。我在Linux系统中,创建了一个工作目录myFlash,你也建一个自己的工作目录吧,进入该工作目录,从ftp://ftp.linksys.com/pub/network/nslu2-fw-2.3r25.zip下载Flash的映像。把文件解压后,会得到一个版本注释文件和一个Flash映像文件:NSLU2_V23R25.bin。有了这个映像文件后,就需要使用其他的工具把它分离开来,我使用的这个工具软件是splitnslu,它是Brian Lantz开发的,由于它可能经常会被更改,我放置了一个拷贝在我的web站点上,从http://www.batbox.org/splitnslu.tgz把它下载下来。解压后,会得到一个README文件,一个.c文件和一个Makefile文件,这个Makefile文件有几个有用的地方,我们将通过手工来完成所有的操作,因此对它的操作就是接下来内容。


