二、NFS文件系统概念及其原理
NFS文件系统是可以用在不同操作系统之间通过网络传输文件,在嵌入式开发中,NFS主要是用作主机与嵌入式设备之间无缝传输文件,这样做的原因主要是因为设备的存储空间有限,所以使用此文件系统扩展嵌入式设备的存储空间,简单来说就是NFS服务器(也就相当于PC端)给NFS客户端(嵌入式设备)通过网络提供了存储空间,使得NFS客户端能够访问到服务器的文件并进行相应操作,当然这也和之后所说的Linux系统编程之文件系统的搭建有关系,之后会写到。
NFS文件系统服务主要是基于客户机/服务器模式(C/S),NFS服务器就是提供输出文件(也是共享文件)的计算机(就是上面所说的PC端),NFS客户端(嵌入式设备)则是访问输出文件的计算机,它可以将输出目录挂载到自己系统中的目录中,然后像访问本地文件一样访问NFS服务器中的输出文件。
当用户进程通过NFS客户端向NFS服务端存取文件时,其请求数据流程如下几点:
1、首先用户访问网站程序,由程序在NFS客户端上发出NFS文件存取功能的询问请求,这时NFS客户端(即执行程序的服务器)RPC服务(portmap 或rpcbind服务)就会通过网络向NFS服务端的RPC服务(即portmap或rpcbind服务)的111端口发出NFS文件存取功能的询问请求。
2、NFS服务端的RPC服务(即portmap或rpcbind服务)找到对应的已注册的NFSdaemon端口后,通知NFS客户端的RPC服务(即portmap或rpcbind服务)。
3、此时NFS客户端就可获取到正确的端口,然后就直接与NFS daemon联机存取数据了。
4、NFS客户端把数据存取成功后,返回给前端程序,告诉用户存取结果,作为网站用户,我们就完成了一次存取操作。
由于NFS的每一个服务功能会对应一个端口,这些端口可能不固定,由于程序间通信必须借助端口(tcp/udp为端到端通信),那么客户端就无法与服务器进行通信。因此需要一个中间的桥接机制,RPC进程即充当这样一个角色,RPC的端口固定为111,当NFS启动时,会向RPC进行注册, 那么客户端PRC就能与服务器RPC进行通信,从而进行文件的传输。
二、NFS服务的搭建
1、安装nfs服务
$ sudo apt-get install nfs-kernel-server nfs-common
2、修改配置文件
$ sudo vim /etc/exports
注意事项:“exports”文件用于配置NFS服务器中输出的共享目录
修改内容如下:
/driver/rootfs *(rw,sync,no_root_squash,no_subtree_check)
注意事项:/root/rootfs为与nfs服务客户端共享的目录,可自行创建,这个路径必须为绝对路径。
“*”代表:允许所有的网段访问,也可以使用具体的IP
192.168.1.* 指定网段,在该网段中的用户可以挂载
ro : 只读
rw:挂接此目录的客户端对该共享目录具有读写权限
sync:资料同步写入内存和硬盘
no_root_squash:root用户具有对根目录的完全管理访问权限。
no_subtree_check:不检查父目录的权限
3、重启nfs服务和rpcbind 服务
$ sudo /etc/init.d/nfs-kernel-server restart
$ sudo /etc/init.d/rpcbind restart
三、NFS服务测试
1、检查客户端和服务端的网络是否连通(ping命令)
ping 服务主机IP
2、查看服务端的共享目录
showmount -e 服务主机IP
3、将与nfs服务客户端共享的目录挂载到本地
mount -t nfs -o nolock 服务主机IP:目标机的共享目留 /mnt
注意事项:/mnt 指定将共享目录挂载的路径, -t nfs 指定挂在协议是那台ip地址的主机,mount nfs时,默认选项包括文件锁,依赖于portmap提供的动态端口分配功能,因此需要解锁,因此一般直接在指令中直接加上-o nolock。
4、通过访问/mnt即可访问共享目录的内容
5、取消挂载
umount /mnt
注意事项:/mnt 指定将共享目录挂载的路径,要和挂载时的路径相同。