分享

嵌入式linux的NFS开发环境的建立

 njy131 2012-04-12
嵌入式linux的NFS开发环境的建立
cooran 发表于 - 2012-2-29 2:38:00

在应用程序开发环节,NFS方式比ftp方式的执行效率要高,因为它不需要将linux server端的程序下载到嵌入式目标系统就可以调试。下面先将NFS建立的详细过程写一下,然后举一个简单的应用程序开发实例来比较ftp方式和nfs方式的不同。
  1 建立NFS开发环境
  嵌入式linux的NFS开发环境包含着两个方面:一是linux server端的NFS Server支持;二是target board的NFS Client支持。
  1.1 linux server端
  1.1.1 以root的身份登录,编译共享目录的配置文件exports,指定共享目录及其权限。
  #vi /etc/exports
  在该文件中添加:
  /home/lqm(共享目录) 192.168.1.*(rw,sync,no_root_squash)
  添加的内容表示允许IP范围在192.168.1.*的计算机以读写的权限来访问共享目录/home/lqm。
  【注:参数说明如下:
  rw---读/写权限。如果设定只读权限,则设为ro。但是一般情况下,为了方便交互,要设置为rw。
  sync--数据同步写入内存和硬盘。
        no_root_squash--此参数用来要求服务器允许远程系统以它自己的root特权存取该目录。就是说,如果用户是root,那么他就对这个共享
  目录有root的权限。很明显,该参数授予了target
  board很大的权利。安全性是首先要考虑的,可以采取一定的保护机制,在下面会讲一下保护机制。如果使用默认的root_squash,target
  board自己的根文件系统可能有很多无法写入,所以运行会受到极大的限制。在安全性有所保障的前提下,推荐使用no_root_squash参数。】
       注明:#exportfs -r命令可以更新export配置。
                   #showmount 192.168.1.99 -e可以查看共享目录是否创建成功。
  1.1.2 起用保护机制
  可以通过设定/etc/hosts.deny和/etc/hosts.allow文件来限制网络服务的存取权限。
  ***/etc/hosts.deny***
  portmap:ALL
  lockd:ALL
  mountd:ALL
  rquotad:ALL
  statd:ALL
  ***/etc/hosts.allow***
  portmap:192.168.1.100
  lockd:192.168.1.100
  mountd:192.168.1.100
  rquotad:192.168.1.100
  statd:192.168.1.100
  同时使用这两个文件就会使得只有ip为192.168.1.100的机器使用NFS服务。你的target board的ip地址设定为192.168.1.100,这样就可以了。
  1.1.3 安装和启动
        如果linux上尚未安装nfs服务器,需要先安装。安装后以后不就需要再执行安装步骤了。
        安装NFS:
        apt-get instarll  portmap
        apt-get instarll  nfs-kernel-server
 
        配置nfs
       #dpkg-reconfigure portmap , 对Should portmap be bound to the loopback address? 选N
      #gedit /etc/default/portmap,将"-i 127.0.0.1"去掉;
        启动服务:
  首先要启动portmapper(端口映射)服务,这是NFS本身需要的。
  #/etc/init.d/portmap start
  然后启动NFS Server。此时NFS会激活守护进程,然后开始监听客户端的请求。
  #/etc/init.d/nfs-kernel-server start
  NFS Server启动后,还要检查一下linux server的iptables等,确定没有屏蔽NFS使用的端口和允许通信的主机。
  可以首先在linux server上面进行NFS的回环测设。修改/etc/hosts.allow,把ip改为linux server的ip地址,然后在linux server上执行命令:
  #mount -t nfs :/home/lqm /mnt
        #mount -t nfs 192.168.0.4:/home/work   /nfsmnt   -o nolock
  #ls /mnt
  如果NFS Server正常工作,应该在/mnt下面看到共享目录/home/lqm的内容。
 
       1.2 如何自动挂载
       自动挂载 另一个挂载其他机器的NFS共享的方式就是在/etc/fstab文件中添加一行,该行必须指明NFS服务器的主机名、服务器输出的目录名以及挂载
      NFS  共享的本机目录,同时必须是根用户才能修改/etc/fstab文件(目标板上可能没有fstab,需要自己创建一个)。格式(参考PC上的fstab):host_ip:/nfs_path /target_path nfs rsize=8192,wsize=8192,timeo=14,intr,nolock  0   0
 
    1.3目标板挂载nfs操作
目标板NFS配置操作

主机IP:192.168.1.101
目标板IP:192.168.1.230

将USB转串口连接上,在终端输入minicom与板子连起,作为“超级终端”使用。

启动目标板并连通网络后,首先查看目标板kernel自身是否支持NFS,在minicom中输入cat /proc/filesystems命令查看其中是否有NFS一行,若没有则表示内核不支持NFS,就需要重新编译和烧写内核;有则OK,接下来就可以直接进行mount操作了。

具体命令是:
# mount -t nfs -o nolock 192.168.1.101:/opt/FriendlyARM/mini2440/root_nfs /mnt/root_nfs

无任何提示表示成功,这时可以进入/mnt/root_nfs目录,对文件进行cp、mv等操作。

但是如果使用命令mount -t nfs 192.168.1.101:/opt/FriendlyARM/mini2440/root_nfs /mnt/root_nfs,则会有如下的错误提示(也就是省去了"-o nolock"):
# mount -t nfs 192.168.1.101:/opt/FriendlyARM/mini2440/root_nfs /mnt/root_nfs
portmap: server localhost not responding, timed out
RPC: failed to contact portmap (errno -5).
portmap: server localhost not responding, timed out
RPC: failed to contact portmap (errno -5).
lockd_up: makesock failed, error=-5
portmap: server localhost not responding, timed out
RPC: failed to contact portmap (errno -5).

这时如果使用ls /mnt/root_nfs命令查看该目录内容时,你会发现此时NFS确确实实已经挂载成功了。

然后取消挂载的时候会出现如下的错误提示:
# umount /mnt/root_nfs/
lockd_down: no lockd running.

而成功取消挂载时没有任何提示,同样此时NFS也确实已经取消挂载了。

那么出现上面错误提示的可能原因是:
nfs mount默认选项包括文件锁,依赖于portmap提供的动态端口分配功能。

简单的解决方法:kill文件锁(lockd)或者使用mount -o nolock命令。

上面说的文件锁具体是什么原因,目前还没有找到更好的解决办法。不过,如果主机防火墙有设置时,也可能导致目标板无法正常访问。


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多