NFS的一些东西

2019-07-13 04:32发布

在应用程序开发环节,NFS方式比ftp方式的执行效率要高,因为它不需要将linux server端的程序下载到嵌入式目标系统就可以调试。下面先将NFS建立的详细过程写一下,然后举一个简单的应用程序开发实例来比较ftp方式和nfs方式的不同。
1
建立NFS开发环境
   
嵌入式linuxNFS开发环境包含着两个方面:一是linux server端的NFS Server支持;二是target boardNFS 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_squashtarget board自己的根文件系统可能有很多无法写入,所以运行会受到极大的限制。在安全性有所保障的前提下,推荐使用no_root_squash参数。】
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
同时使用这两个文件就会使得只有ip192.168.1.100的机器使用NFS服务。你的target boardip地址设定为192.168.1.100,这样就可以了。
1.1.3
启动
首先要启动portmapper(端口映射)服务,这是NFS本身需要的。
/etc/init.d/portmap start
然后启动NFS Server。此时NFS会激活守护进程,然后开始监听客户端的请求。

/etc/init.d/nfs start
NFS Server启动后,还要检查一下linux serveriptables等,确定没有屏蔽NFS使用的端口和允许通信的主机。

可以首先在linux server上面进行NFS的回环测设。修改/etc/hosts.allow,把ip改为linux serverip地址,然后在linux server上执行命令:
mount -t nfs :/home/lqm /mnt
ls /mnt
如果NFS Server正常工作,应该在/mnt下面看到共享目录/home/lqm的内容。

1.2 target board
端的client
1.2.1 
嵌入式linux内核应该支持NFS客户端。

内核配置时,选择如下:
File system--> Network File Systems-->
选中NFS System supportProvide NFSvs client support,然后保存退出,重新编译内核,将生成的zImage重新下载到target board
1.2.2 
target boardlinux shell下,执行下列命令来进行NFS共享目录的挂载。
mkdir /mnt/nfs
mount -o nolock -t nfs :/home/lqm /mnt/nfs
ls /mnt/nfs
由于很多嵌入式设备的根文件系统中不带portmap,所以一般都使用-o nolock参数,即不使用NFS文件锁,这样就可以避免使用portmap。如果顺利,在/mnt/nfs下,就可以看到linux server的共享文件夹下的内容了,而且两个文件夹内的修改是同步的。

2 应用程序实例
编写一个简单的C程序test.c
-------------------------------------------
/*This is a test program.*/
int main(void)
{
int i;
for(i=0;i<10;i++)
     printf("Hello World %d times./n",i);
return 0;
}
-------------------------------------------
编译该程序:

arm-linux-gcc -o test test.c
2.1 FTP
方式

首先将test下载到target board。启动target boardlinux,在超级终端中执行:
cd /var
ftp
ftp>bin                //
binary mode传输文件

ftp>get test
ftp>exit
然后修改文件属性:
chmod +x test
./test
这时可以查看结果了。

2.2 NFS
方式
target board端挂载linux server的共享输出目录,并且运行程序。
mkdir /mnt/nfs
mount -o nolock -t nfs :/home/lqm /mnt/nfs
ls /mnt/nfs
这时应该可以显示linux server的共享目录的内容。然后执行:

./test
总结

   
这两种方式在应用程序不是特别复杂时区别不是很大,但是当开发程序比较复杂时,采用NFS方式显然效率要高得多。完成应用程序得开发,调试好后就可以下载到嵌入式目标板的flash文件系统,或者直接编译到嵌入式linux内核并且烧写到flash,从而最终成为一个独立的嵌入式应用程序。
---------------------------------------
参考书目:《building embedded linux systems
                  
《嵌入式linux系统开发详解--基于EP93XX系列ARM
这两本书在过程上都比较细致,很适合初学者学习。在实践熟悉的基础上,提升理论高度,这是我所认可的学习方法。







下面是一些NFS共享的常用参数: ro:只读访问 rw:读写访问 sync:所有数据在请求时写入共享 asyncNFS在写入数据前可以响应请求 secureNFS通过1024以下的安全TCP/IP端口发送 insecureNFS通过1024以上的端口发送 wdelay:如果多个用户要写入NFS目录,则归组写入(默认) no_wdelay:如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。 hide:在NFS共享目录中不共享其子目录 no_hide:共享NFS目录的子目录 subtree_check:如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认) no_subtree_check:和上面相对,不检查父目录权限 all_squash:共享文件的UIDGID映射匿名用户anonymous,适合公用目录。 no_all_squash:保留共享文件的UIDGID(默认) root_squashroot用户的所有请求映射成如anonymous用户一样的权限(默认) no_root_squasroot用户具有根目录的完全管理访问权限 anonuid=xxx:指定NFS服务器/etc/passwd文件中匿名用户的UID anongid=xxx:指定NFS服务器/etc/passwd文件中匿名用户的GID    转载自http://tensing.blog.sohu.com/77399040.html