在应用程序开发环节,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命令。
上面说的文件锁具体是什么原因,目前还没有找到更好的解决办法。不过,如果主机防火墙有设置时,也可能导致目标板无法正常访问。
|