Chinaunix首页 | 论坛 | 博客

nas

  • 博客访问: 647363
  • 博文数量: 456
  • 博客积分: 10010
  • 博客等级: 上将
  • 技术积分: 6400
  • 用 户 组: 普通用户
  • 注册时间: 2008-05-08 16:08
文章分类

全部博文(456)

文章存档

2008年(456)

我的朋友

分类: 服务器与存储

2008-05-31 18:55:14

 在文章里,我们已经获得了NSLU2一个命令行shell,在这部分中,我们装利用这个shell为它添加NFS服务,让它成为一个NFS文件。

  第二部分:添加NFS

  在前一节中,笔者给大家介绍了通过在外部系统中使用一个隐藏选项和编辑passwd文件来在NSLU2上获得命令提示符的方法,在本节中,我们来继续探索这个盒子,目标是添加一些新的功能使它能够得到更好的使用。

  由于这个盒子运行的是某个版本的Linux,有相关的大量服务软件包可用,其中之一就安装到这个系统中。可以想像在NSLU2中其中的一个是为定制的应用程序扩展后的WEB服务,或者说也许安装了一个ftp服务或一个安全的shell服务来替换telnet服务。我的第一个目标是安装一个不同的网络文件系统。

  Linksys提供的资料表明,NSLU2仅仅只是支持SMB-网络文件系统协议,它原是发源于Microsoft Windows,由于笔者的家庭网络大部分是由基于UNIX的机器组成,如Apple的 Mac OS X 和Linux,对我来说要扩展它自然就想到的是NFS,这个大多数UNIX版本都支持的网络文件系统。

  但在我们开始安装新的服务包之前,有几个困难要克服,必须做的第一件事就是设置一个开发环境,因此我们要建立需要的服务包。在本节的其余内容中都假定你已按照前一节的方法在NSLU2上启动了telnet。

  1、测定目标处理器

  对不同的系统之间的软件移植而言,Linux是软件开发的最好环境了,因此我将从我的Mandrake环境开始做这些。不同于大多数的Linux开发系统,NSLU2不是基于x86芯片的,因此我们要安装一个交叉编译toolchain。

  安装一个交叉编译toolchain之前要做的首件事情就是测定目标处理器,我以前读到的关于NSLU2的介绍说它的处理器是一枚Intel的IXP420网络处理器,但要告诉大家一个事实,这些介绍对我来说并不就意味着全部,因为它听上去更像是一种市场行为。

  由于我们现在能够登录进入这个设备了,则可可以到处找一找,看看Linux是怎样来了解它的处理器的,要了解这方面的信息,/proc目录是十分重要的,我们感兴趣的一个文件就是/proc/cpuinfo,打开它看一下是非常容易的。

  # cat /proc/cpuinfo
  Processor : XScale-IXP425/IXC1100 rev 1 (v5b)
  BogoMIPS : 131.48
  Features : swp half thumb fastmult edsp
  Hardware : Intel IXDP425 Development Platform
  Revision : 0000
  Serial : 0000000000000000

  与我们已经了解了的相关信息相比,虽说从这个文件的内容来看它并没有更多的关于这方面的信息,但它证实了先前的关于NSLU2使用的是IXP425的报道,要得到更多的这方面内容,我们要使用一种不同的技巧。在大多数UNIX系统上一个相当简单方便的办法就是file命令,通过检查一个文件的类型,然后能被告之哪些种类的文件是基于什么初始化数据的。

  NSLU2并不带有file命令程序,但它包含了ftp,就使用ftp,我们可以把一个可执行文件转移到我们的开发平台来,从/home/httpd/html/Management目录把telnet.cgi这个小程序拷贝过来,完成后,在开发系统中运行这个文件看看它收集到了些什么相关信息。看看如下的详细信息吧。

  # file telnet.cgi
  telnet.cgi: ELF 32-bit MSB executable, ARM, version 1 (ARM),
  for GNU/Linux 2.0.0, dynamically linked (uses shared libs), stripped

  好了,现在知道了我们要处理的是一颗ARM ,故我们得安装一个ARM的交叉编译toolchain。 2、安装toolchain的捷径

  对许多的开发者而言安装交叉编译toolchain是一件相当痛苦的事情,编译一个编译器、C库、连接器,加上许多的支持库和实用程序,这简单是太复杂了。幸运的是,在因特网时代,这些事情就简单多了,许多人已找到方法把我们从这种痛苦中解脱出来,并且他们把这些成果共享出来给大家使用。

  在gcc交叉编译的方面,这个人就是Dan Kegel,他写了一个相当完美的脚本程序,这个程序下载所需的资源,在必要时为它们打上补丁,并建立一个完全的toolchain-它可为许多不同的处理器工作。我已使用Dan的script为基于MIPS 的 Linksys WRT54G建立了一个交叉编译toolchain,整个过程相当简单,简直是小事一桩。我也从不止一个人那里听说Dan的脚本建立的toolchain能产生NSLU2兼容代码,我强烈推荐Dan的工具,但从本文出发,我还是使用一种更快捷的方式。

  在遵循GPL许可的条件下,Linksys看上去已公开了部分的源代码许可。它们的许多设备内部运行的是Linux,但它们的GLP许可有很大的不同,有些包含一个完整的build环境,然而其他的一些像NSLU2这样的产品只有极少的一部分。

  NSLU2随机附带的CD上有大量的源代码,不过没有toolchain,幸运的是Linksys还有另外一个基于Linux的设备-它们的WRV54G无线VPN宽带路由器-看起来它们是基于同一块Intel IXP425的开发底板,由于Linksys对这些产品许可使用toolchain,我们就来使用它。从这个地址下()载一个125M的文件保存解压到你的主目录下。

  对我个人来说,在/home/jbuzbee/gpl_code_2.03下发现了看起来似乎是最好的东西,在这个目录下,你会发现一个名为toolchain.tgz的压缩文件,它好像是被设计成从root解压,不过我选择把它解压到其他的适当地方,这样的话可保持在我的home目录中建立的环境不变。解压后,会发现所需要的编译器、连接器、include文件等都在其中。

  位于usr/local/openrg/armsaeb/bin目录下的二进制文件和所有有armv4b-hardhat-linux-前缀的,我都把那些目录名放到了$PATH中,这样的话每次编译时就不必输入完整的路径名称了。

  3、测试编译器

  我们来测试一下新建的编译器,看它是否能够正常工作,编译出来的二进制文件是否正确。许多学习C语言的程序员写下的第一个程序就是“Hello World”,因此我也建立了一个叫hello.c文件:

  #include
  main( int argc char *argv[] )
  {
  printf("Hello world!\n");
  }

  然后就编译这个文件,输入以下的命令:

  # export PATH=home/jbuzbee/gpl_code_2.03/usr/local/openrg/armsaeb/bin/:$PATH
  # armv4b-hardhat-linux-gcc hello.c -o hello

  检查产生的文件类型,输入以下的命令:

  # file hello
  hello: ELF 32-bit MSB executable, ARM, version 1 (ARM), for GNU/Linux 2.0.0,
  dynamically linked (uses shared libs), not stripped

  很好,现在就通过运行在NSLU2上的ftp服务,用ftp方式把这个文件拷贝上去吧,记住使用二进制传输方式并确保它是可执行的。完成后,运行试试看:

  # ./hello
  Hello World!

  一切正常,看到如上的结果,现在我们就有能力在NSLU2上建立和运行任何的程序了,不过要确认你使用get接收到的任何文件都是存放在NSLU2的硬盘驱动器上的,缺省的情况是root帐号的主目录是位于一个ram磁盘上的,用平常的Linux的方法建立一个新的目录,并把新的二进制文件存放到其中,示例如下:

  # mkdir /share/hdd/data/jim/nslu2
  # mv hello /share/hdd/data/jim/nslu2/

4、修改和建立端口映射

  现在可以做其他更进一步的事情了,从“Hello World”到NFS之间似乎还有很长的路要走,但这也没什么可怕的。为了访问所需要的include文件,首先要做的事情就是安装并设置好Linux源码目录结构,在NSLU2随机附带的的CD中有一个snapgear tar文件,在其中你可以找到源码目录。

  把这个snapgear tar文件解压到你预先建立好的目录中,因为我们还没有建立kernel,针对ARM体系结构,我会采用一种快捷的办法来进行设置。从snapgear/linux-2.4.x目录建立和运行如下的script:

  #!/bin/bash
  rm -f include/asm
  rm -f include/asm-arm/proc
  rm -f include/asm-arm/arch
  ( cd include; ln -s asm-arm asm )
  ( cd include/asm-arm; ln -s proc-armv proc )
  ( cd include/asm-arm; ln -s arch-ixp425 arch )

  到现在为止,我们为更复杂的build作些设置了。NFS是基于一个Remote Procedure Call结构的,要实现RPC功能,它需要一个名为portmapper的daemon助手,我在http://ftp.surfnet.nl/security/tcpwrappers/portmap_4.tar.gz找到了portmapper的源代码,NFS服务器所需的资源则可从下载得到。在解压完source tree后,其中的内容包含一个portmap_4目录,一个snapgear目录和一个nfs-server-2.2beta47目录和连同最初的gpl_code_2.03目录在一起。

  接下来我们就开始建立portmapper,为了简化建立过程,我对Makefile文件作了几处小小的改动,为了减少对外部链接库的依赖,我删除掉了这一行(把它作为了注释):HOSTS_ACCESS= -DHOSTS_ACCESS,在很多地方,我也看到了对libwrap.a的引用,基于同样的原因,通通把它们都去掉了(都是作为注释处理的)。但作为一个更安全的服务器,它们都是应该被加上的,但需要有许多的附加的库文件。

  然后,我修改了CFLAGS这一行,把它指向我的snapgear linux source tree:

CFLAGS = $(COPT) -O $(NSARCHS) $(SETPGRP) -I /home/jbuzbee/snapgear/linux-2.4.x/include/

  最后,在这个makefile文件的顶部,为了调用交叉编译器我添加了一行内容:

CC=/home/jbuzbee/gpl_code_2.03/usr/local/openrg/armsaeb/bin/armv4b-hardhat-linux-gcc

  除了更改makefile文件之外,还需要对源代码文件处一些小小的改动,在portmap.c文件中,有一个不顾标准perror而定义的perroe函数,我把它的参数定义从“const char”改变到了“_const char”,这样就可与我们交叉编译tree中的stdio.h定义相匹配了。

  终于,所有必需的步骤都完成了,不过在进行编译时,我们所作的这些改动带来的结果就是有许多的警告信息出现,不过build还是还是能够正常地运行结果,接下来就是strip过程了:

# armv4b-hardhat-linux-strip portmap

5、添加NFS Daemons

  编译文件是一个接着一个的,一个完成另一个又开始。可让处理NFS daemons的过程自动地完成,建立NFS daemons的过程需要执行一个名为BUILD的script,在这个交叉编译的script中并没有可修改的选项,故就让它自动不加干预地完成,所做的只是取得它的处理结果。在运行这个script的过程中有大量的选择项让你来选择,除了下一个问题外其他的都选择默认的选项就可以了。

  Do you want to protect mountd with HOST ACCESS?

  由于并没有它需要的库文件,这个问题就回答“no”,配置过程运行完成后,需要编辑产生的Makefile文件以适合我们的交叉编译器,在这个makefile的顶部附近,有三个关于CC、AR和RANLIB的变量,给添加你交叉编译器的前缀。例如,我的CC变量修改看上去如下所示的内容:

  CC = /home/jbuzbee/gpl_code_2.03/usr/local/openrg/armsaeb/bin/armv4b-hardhat-linux-gcc

  接下来,需要为CFLAGS行添加一个include路径,如:

  CFLAGS = -g -O -D_GNU_SOURCE -I /home/jbuzbee/snapgear/linux-2.4.x/include/

  最后需要修改的地方是在nfsd.h文件中,在该文件的顶部附近,添加一个本开发环境所需要的附加include参数:

  #include

  一旦这所有的一切都正确完成后,一个简单的make过程将建立两个所需要的二进制文件:rpc.mountd和rpc.nfsd,Stripping这些文件后看上去并没有缩减它们的体积。现在就开始准备试验NFS了。

  把portmap、 rpc.mountd、 rpc.nfsd这三个文件拷贝到NSLU2上,为了与我的数据分开,我决定把新产生的系统级的二进制文件放置在conf分区中,在/share/hdd/conf目录下我建立了三个新的目录-bin、 etc、和rc.d,并把这些目录映射到真实的目录树中。

  把二进制文件拷贝到bin目录中,把启动的script拷贝到rc.d目录中,把配置文件拷贝到etc目录中。用这种方法,必需的唯一配置文件是输出文件,NFS需要一个输出文件以告之NFS daemon输出到哪一个目录和从哪一个目录中输入,我建立的输出文件内容如下:

  /share/ 192.168.1.100 (rw, insecure)
  /share/ 192.168.1.103 (rw )
  /share/ 192.168.1.102 (rw )

  对我的Mac OS X来说,这个不安全的选项是使用的不安全的网络端口,显而易见的是你需要建立一个输出文件以匹配你的网络需求,至于在这方面需了解更多的详细内容,请参考标准的NFS文档,地址为。

  6、检验结果

  NFS服务器期望在level /etc目录中发现这个输出文件,因此在/share/hdd/conf/etc目录中要建立一个符号连接到新的输出文件中:

# ln -s /share/hdd/conf/etc/exports /etc/exports

  接下来,需要为所有新的daemon启动script,在NSLU2中,把rc.samba script从/etc/rc.d拷贝到新建的rc.d目录中,并把它更名为rc.portmap,再拷贝一次这个文件,且更名为rc.nfsd,rc.nfsd script将启动rpc.mountd和the rpc.nfsd。

  最后建立一个do-it-all script,创建一个符号连接,执行portmap script后再执行nfsd script,不过每次重新启动NSLU2后都需要再运行这些script,到上前为止,我还没找到在NSLU2重新启动时自动运行script的方法。运行开始建立的do-it-all script并随时注意它的运行过程,在NSLU2上输入ps –ax命令,你会看到有三个进程正在运行-portmap、rpc.mountd和rpc.nfsd,在/var/log/下的messages文件中可以看到相关的错误提示和状态信息。

  在一台客户机上,试着来加载一下NSLU2,在我的Mandrake系统中,使用管理员身份执行如下的命令:

  # mkdir /mnt/nslu2
  # mount 192.168.1.70:/share/ /mnt/nslu2/

  在使用Mac OS X系统的机器中,可以使用Finder的“Connect to Server”,服务器的地址是nfs://192.168.1.70/share,同样可把NSLU2加载上。

  在启动daemon或加载磁盘的过程中,如果出现了某些问题而没有成功,则可检查位于NSLU2上/var/log/下的messages文件,要提醒的是,给NSLU2添加NFS的功能并不会影响到原来的SMB,它们两者是可以共存的。谁说太阳底下无新事,下一步给它添加Ftp服务不失为一个好的选择,或者是如同dropbear一样的一个嵌入式SSH服务器也是很实用的嘛。

  注意:在写这篇文章的时候,我从scratch启动,并重新执行了所有的步骤,以确信自己并没有遗忘什么事情。通常来说,我的开发环境下磁盘空间显得捉襟肘见,很自然地,我通过NFS方式把NSLU2的磁盘加载上,这样把所有的解压文件、编译、编辑工作都放到NFS驱动器上,相当方便,简直是完美。

  小提示:如果你比较懒的话,想跳过这些复杂的步骤直接得到能通过NFS方式加载NSLU2的二进制文件(etc/下的exports文件还是需要编辑的),则可从下载一个大约57K左右大小的文件就可了。

  在本文的里,我将介绍为NSLU2添加iTunesr的方法,把它改造成一个娱乐设备。

阅读(1164) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~