第五部分:转到Unslung
如果各位读者看了前面四节的内容并自己动手操作成功了的话,你应该独自在自己的NSLU2上下了不少的工夫,现在该是NSLU2开发团体联合起来的时候了。我们自己已建立了几个程序包,但没有办法与全世界的NSLU2开发团体的作品下匹配,如果把我们的努力与他们的成就联合起来,我们就可以利用他们已经建立好的各种软件程序包,这些程序包有我们中意的如nfs服务、iTunes服务和一些新的程序包像ssh服务、ftp服务、telnet客户端等。
这些开发者团体现在做的是有些成就与结果,不过我们最感兴趣的是Unslung firmware和程序包系统,这个firmware能给这个设备带来几个基本的功能扩展,首先,它被设计为在允许用户高度定制的前提下保留Linksys的基本功能,这使得我们在前一节介绍的修改flash的方法具有更宽广的变化与应用。
第二,它添加一个标准的程序包方案使得非常容易从因特网上下载和安装新的软件。最后它采用的方法节省了10M左右的RAM,这对一个只有32M的启动设备来说已是不少了。释放的RAM使得运行更复杂的应用程序变得切实可行了,如数据库系统和一个全功能的web服务等。
除了添加大量的新功能外,NSLU2开发者是怎样奇迹般地做到既释放这些RAM又不仅是只保持Linksys的基本功能的呢?我们来研究研究,看看他们到底是怎样做的。
1、引导时的选择
为了了解Unslung怎样来释放这些内存,我们必须懂得NSLU2的基本的boot-time体系结构,如同我在上文中简略提及的内容一样,当这个设备被加电时运行的第一个程序是RedBoot boot loader,这个boot loader担负把Linux kernel和ram disk从flash拷贝到RAM中。
当拷贝过程完成后,系统控制被移交给Linux kernel,Linux kernel启动并mount RAMdisk作为根或基本的filesystem,然后它再从根文件系统内部启动初始化进程,这个初始化进程mount硬盘驱动器和/或flash驱动器,然后再继续启动web服务、网络文件服务等等。对这个NSLU2来说是继续运行并等待使用。
NSLU2的所有基本功能都被存放于RAMdisk中,这是因为该设备是被设计来作引导的,即使根本没有加上附属的硬盘驱动器。这是一个相当好的特点,但你再仔细想想它看看,这可能会导致相当大的浪费,如同你的250GB的硬盘上还有非常大的可用空间,但你却坚持想方设法想把所有需要的可执行程序、库文件、html文件等等挤压进一个小得可怜的RAMdisk的filesystem中。
为什么不把所有的这些文件保存到硬盘驱动器上来替代这个RAM驱动器呢?然后你就能够分配更大的文件系统了,并在这个过程中释放那些先前已分配给RAM驱动器的内存。如果你能做到向后兼容Linksys的启动序列这倒也不失为一件好事。如果硬盘驱动器上存在有文件系统,则你可使用它,而假如一个磁盘并没有插入其中或这个磁盘上并没有文件系统,你还可使用位于RAMdisk上的文件系统,如同以前一样。这就是在Unslung firmware中采用的方法,现在就让我们来研究一下看怎样来做到这样。
2、剖析文件系统
它是个使用一pre-specified标识符去建立一个Linux kernel的普通的实验,这个标识符指示哪一个驱动器用来作根文件系统,这不是在kernel中自己完成就是能被从boot loader传给kernel,对这个NSLU2来说,Linksys硬编码这个kernel,指定这个根文件系统是一个RAMdisk。这一切就是Linksys打算使用的,但对Linux上的大多数事情来说,有一个方法可用来避免使用硬编码变量,像根文件系统标识符。
Linux可以在运行时测定一个根文件系统位于哪个位置,一个单kernel被建立地点的这种能力通常被用来去运行在变化的硬件平台上,举一个例子,同一个kernel映像在系统上引导根的位置不是在一个IDE驱动器上就是在一个SCSI驱动器上被找到。在Linux选择到哪儿去寻找根之前,它会搜索并决定去load哪个驱动器和去哪儿寻找这个根,当Linux解决这个问题后,正确的根被mount,启动过程继续正常进行。这就是使用Unslung的特点,检测根的Unslung代码并不是kernel的部分所特有的,在一个Linux中发现它调用initrd或initial ram disk,这个initrd是一个特殊的临时ram disk,被设计用来在根文件系统被mount之前挂起已执行的用户代码。Unslung开发者首先放置一个虚拟的根标识符到kernel中,然后添加代码到initrd中去检查硬盘驱动器是否有真实的根文件系统,如果某个附加的驱动器中有一个根文件系统,Linux被告之使用这个根文件系统而不是那上RAMdisk,一旦Linux决定把这个硬盘驱动器用来作为根文件系统,10M的RAMdisk空间就被省下来了,并且这些RAM空间就返回空闲池作其他的用途。


