在嵌入式开发中经常用到NFS服务,NFS服务就是将宿主机的一个目录通过网络可以被挂载到其他计算机上,并且作为其他计算机的一个目录。在应用程序开发过程中,NFS方式比ftp方式的效率要高,因为它不需要将linux server端的程序下载到嵌入式目标系统就可以调试。我们通过NFS可以很方便的将修改的文件通过NFS传输到目标板上。
使用RedHat Linux 9中的第1张光盘。以下是root登录操作:
(1)需要安装下面两个文件
# rpm -ivh nfs-utils-1.0.1-2.9.i386.rpm portmap-4.0-54.i386.rpm
portmap监控程序只是定向RPC通信数据流,使NFS客户机找到从NFS服务器共享的目录。
(2)修改NFS配置文件
# vi /etc/exports
配置格式为: 要输出的共享目录 客户端主机地址 (设置选择)
如加上如下一行
/home/liuby/rootfs 59.64.155.*(sync,ro) 192.168.*.*(sync,rw) 192.168.0.254(sync,rw,no_root_squash)
其中/home/liuby/rootfs 是共享目录
sync表示同步写磁盘,ro是只读,rw是读写,参数间用逗号隔开
no_root_squash此参数用来要求服务器允许远程系统以它自己的root特权存取该目录。就是说,如果用?莚oot,那么他就对这个共享目录有root的权限。很明显,该参数授予了目标板很大的权利。
(3)启动NFS服务
# mkdir /home/liuby/rootfs
# chmod 777 /home/liuby/rootfs
# service portmap start
# service nfs start
(4)根据需要设置在相应的运行级别自动启动NFS:
# chkconfig --level 35 portmap on
# chkconfig --level 35 nfs on
注: 到此配置已经完成
修改了etc/exports而不想重新启动nfs,只需运行# exportfs -rv 即可
查看NFS中共享目录
# exportfs -av
(5)本地测试
# mount 192.168.0.2:/home/liuby/rootfs /mnt/cdrom/
# ls /mnt/cdrom/
# cp or rm ......
# umount /mnt/cdrom
注意检查系统的iptables、/etc/hosts.allow、/etc/hosts.deny是否设置了正确的NFS访问规则
(6)客户端测试
powerpc板联网ip为192.168.0.254(kernel: NFS System support和Provide NFSv3 client support)
以下操作在目标板上
# mkdir /mnt/nfs
# mount -o nolock,rw -t nfs 192.168.0.2:/home/liuby/rootfs /mnt/nfs
由于很多嵌入式设备的根文件系统中不带portmap,所以一般都使用-o nolock参数,即不使用NFS文件锁,这样就可以避免使用portmap。如果顺利,在/mnt/nfs下,就可以看到linux server的共享文件夹下的内容了,而且两个文件夹内的修改是同步的。
假如nsf_server上/home/liuby/rootfs下有一powerpc-linux-gcc编译的helloworld.o,可以直接执行
# ls /mnt/nfs/helloworld.o
# ./helloworld.o
同样下载zImage等。
# umount /mnt/nfs
(7)客户端常用命令
NFS客户端挂载命令
# mount NFS地址:共享目录 本地挂载点
# mount -o nolock -t nfs :/home/nfs /mnt/nfs
查看是否成功(显示挂载服务器的已连接目录)(或进/mnt查看)
# showmount -d [NFS地址]
显示指定NFS的客户端主机机器及其所挂目录
# showmount -a [NFS地址]
卸载
# umount 挂载点
+++++++++++++++++++++++++++++++++++++++++++++++
+++++++++++++++++++ NFS +++++++++++++++++++++++
以下主要是开发板设置,开发板要支持nfs mount需要在编译内核时选择以下模块:
Networking -> Networking options ->
[*] IP: kernel evelautoconfiguration
[ ] IP: DHCP support
[*]IP: BOOTP support
[ ] IP: RARP support
File systems ->Network File Systems ->
<*> NFS file system support
[*] Provide NFSv3 client support
[*] Root file system on NFS
一般mount命令是由busybox来提供的,在编译busybox时也需要有以下选项:
linux system utilities->
[*] mount
[*] support mounting nfs filesystems
通过以上设置,以及服务器(192.168.0.2)设置,可以在开发板测试
# mount -t nfs 192.168.0.2:/home/liuby/rootfs /mnt/nfs
这个会mount成功,但出现以下信息:
portmap: server localhost not responding, timed out
RPC: failed to contact portmap (errno -5).
这需要加上mount的选项-o nolock关闭文件锁
# mount -t nfs -o nolock 192.168.0.2:/home/liuby/rootfs /mnt/nfs
不会出现任何信息,mount成功挂载。
# umount /mnt/nfs
+++++++++++++++++++++++++++++++++++++++++++++++
***********************************************
下面附加一篇别人的总结:
来源:http://tensing.blog.sohu.com/77399040.htm
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参数。】
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 启动
首先要启动portmapper(端口映射)服务,这是NFS本身需要的。
#/etc/init.d/portmap start
然后启动NFS Server。此时NFS会激活守护进程,然后开始监听客户端的请求。
#/etc/init.d/nfs 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
#ls /mnt
如果NFS Server正常工作,应该在/mnt下面看到共享目录/home/lqm的内容。
1.2 target board端的client
1.2.1 嵌入式linux内核应该支持NFS客户端。
内核配置时,选择如下:
File system--> Network File Systems-->
选中NFS System support和Provide NFSvs client support,然后保存退出,重新编译内核,将生成的zImage重新下载到target board。
1.2.2 在target board的linux 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 board的linux,在超级终端中执行:
#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
3 总结
这两种方式在应用程序不是特别复杂时区别不是很大,但是当开发程序比较复杂时,采用NFS方式显然效率要高得多。完成应用程序得开发,调试好后就可以下载 到嵌入式目标板的flash文件系统,或者直接编译到嵌入式linux内核并且烧写到flash,从而最终成为一个独立的嵌入式应用程序。
+++++++++++++
下面是一些NFS共享的常用参数:
ro:只读访问
rw:读写访问
sync:所有数据在请求时写入共享
async:NFS在写入数据前可以响应请求
secure:NFS通过1024以下的安全TCP/IP端口发送
insecure:NFS通过1024以上的端口发送
wdelay:如果多个用户要写入NFS目录,则归组写入(默认)
no_wdelay:如果多个用户要写入NFS目录,则立即写入,当使用async时,无需此设置。
hide:在NFS共享目录中不共享其子目录
no_hide:共享NFS目录的子目录
subtree_check:如果共享/usr/bin之类的子目录时,强制NFS检查父目录的权限(默认)
no_subtree_check:和上面相对,不检查父目录权限
all_squash:共享文件的UID和GID映射匿名用户anonymous,适合公用目录。
no_all_squash:保留共享文件的UID和GID(默认)
root_squash:root用户的所有请求映射成如anonymous用户一样的权限(默认)
no_root_squas:root用户具有根目录的完全管理访问权限
anonuid=xxx:指定NFS服务器/etc/passwd文件中匿名用户的UID
anongid=xxx:指定NFS服务器/etc/passwd文件中匿名用户的GID