NFS入门

1、NFS介绍
NFS是”Network File system”的缩写,即网络文件系统
网络文件系统是应用层的一种应用服务,它主要应用于linux与linux系统,linux与unix系统之间的文件或目录的共享。当用户想要使用远程文件的时候,只要用mount命令就可以把远程文件系统挂载到本地的文件系统上,操作远程文件就跟操作自己本地操作系统的文件一样。采用NFS之后省去了登录的过程,方便了用户访问系统资源。
一言以蔽之,NFS的主要功能就是通过网络让不同的主机系统之间可以彼此共享文件或目录。

2、NFS原理
对于linux而言,文件系统是在内核空间实现的,即文件系统比如ext3、ext4等是在kernel启动时,以内核模块的身份加载运行的。类似的,NFS(网络文件系统)也是工作在内核空间。
NFS本身的服务没有提供数据传递的协议,而是通过使用RPC(Remote Procedure Call)来实现。具体实现过程如下:
(1)本地用户要使用NFS服务器中的文件,先向内核发起请求,内核调用NFS模块以及rpc client
(2)rpc client向rpc server发起连接
(3)在连接之前,NFS服务除了启动nfsd本身监听的端口2049/tcp和2049/udp,还会启动其他进程(如mount,statd,rquotad等)已完成文件共享,这些进程的端口是不固定的,是每次NFS服务启动时向RPC服务注册的,RPC服务会随机分配未使用的端口
(4)完成连接,接受访问请求
(5)NFS应用程序向内核发起请求
(6)内核调用文件系统
然后client端通过获取的NFS端口来建立和server端的NFS连接并进行数据的传输
简单来说,NFS客户端与服务端的通信过程:
(1)先与rpc服务通信(tcp和udp的111端口)
(2)再根据rpc提供的mounted监听端口,与mounted通信;mounted进程会对用户进行验证,验证通过返回用户一个通行证
(3)最后客户端与nfsd进程建立联系进行通信

3、NFS服务器端组件:
nfs-utils
rpm -ql nfs-utils #查看nfs-utils程序所生成的文件
NFS服务端将启动3个主进程:
(1)nfsd,跟NFS文件传输相关,工作在tcp和udp的2049端口
(2)mounted,跟客户端挂载相关,随机端口
(3)quotad,跟磁盘配额相关,随机端口
备注:mounted和quotad的端口是随机产生的,不是固定的,每次重启nfs端口会发生变化。由此我们最好自定义端口。定义mounted和quotad进程监听固定端口:编辑/etc/sysconfig/nfs文件

#MOUNTED_PORT=

#QUOTAD_PORT=

#LOCKED_TCPPORT=

#LOCKED_UDPPORT=

4、rpc介绍
(1)rpc,远程过程调用,是一种编程技术,主要是用于简化分布式应用程序的开发。因为如果需要在两台主机上的进程进行通信,那么客户端、服务器端必须要处理网络传输中的网络请求、网络响应等等。这时候就大大增加了程序员开发的难度。因此就出现了rpc的框架。由此,程序员在开发客户端和服务端的时候,不需要再下功夫去处理网络协议报文的封装,因为rpc在底层就完成了这种观功能。
(2)NFS是基于rpc来进行网络传输的,使得本地主机访问远程主机的时候,就好像本地主机访问本地一样。网络通讯过程对于本地主机来说是透明的。
(3)在linux提供rpc服务的程序,叫做portmap,自身监听在tcp和udp的111端口。rpc与portmap的关系是,rpc是协议,portmap是实现,相当于http协议和apache、nginx、lightted的关系
(4)rpc实现数据交换,可以基于二进制格式,也可以基于文本格式,基于文本格式比较常见的叫做XLRPC,后来又发展为SOAP

5、NFS介绍
NFS是由SUN公司开发的,NFS版本有:
NFSV1(SUN公司内部使用)
NFSV2(早期公开版)
NFSV3(在RHEL5上使用)
NFSV4(在RHEL6上使用)
NFS的缺点:
(1)NFS可以基于认证,但是在认证这一块的功能是非常弱的,只认ID号,不认用户名
举例子:
假如在一台主机上有一个用户名叫做tom,通过NFS在另外一台主机上创建了一个目录,那么
a.如果另外一台主机上没有tom这个用户,那么创建的目录的属主和属组是tom对应的uid和gid
b.如果另外一台主机上有一个叫做jerry的用户,他的uid跟tom的uid一样,那么在另外一台主机上创建的这个目录的属主和属组就是jerry
正是因为NFS不支持用户名认证,所以NFS一般不支持在互联网上使用,多用于在内网中各主机之间实现文件共享服务
(2)NFS只支持在linux/unix上进行通信,不支持在windows主机上通信(linux上的NFS其实就相当于windows上的网上邻居,所以windows网上邻居的功能也是基于类似于rpc的协议来实现的)

6、NFS配置文件:/etc/exports
只需要在这个文件中定义共享哪个目录出去,并且能够让客户端挂载,就能够让客户端像使用本地目录那样来使用这个共享出去的目录
查看NFS的exports配置帮助的相关文档:man export

7、export文件格式:
共享目录 客户端列表
备注:
(1)如果有多个客户端,客户端之间用空白字符分隔;而且每个客户端必须跟上一个小括号,里面定义了此客户端的访问特性,比如访问权限等
(2)编辑保存之后需要重启nfs服务
(3)文件系统访问特性有:
ro:只读
rw:只写
sync:同步
async:异步
root_squash:将root用户映射为来宾用户,默认开启此功能
no_root_squash:一台主机上的root用户访问另外一台主机的文件系统,是以另外一台主机的文件系统的root用户身份来访问的
all_squash:将所有访问的用户映射为来宾用户
anonuid,anongid:指定映射的来宾用户的uid和gid

8、命令相关
(1)showmount命令:这个命令在客户端和服务端都可以使用
-a:列出所有的客户端地址以及挂载的目录 #showmount -a 服务端IP,这条命令在客户端和服务端都可以实现
-e:显示服务器共享了哪些目录 #showmount -e 服务端IP
-d:显示NFS服务器共享出来的目录有哪些是被客户端挂载了的 #showmount -d 服务端IP

(2)exportfs命令:
-a:一般是跟-r或者-u选项同时使用,表示重新挂载(或者说导出,export)所有目录(或者说文件系统)或者取消挂载(导出)所有目录(文件系统)
-r:重新导出
-u:取消导出(这时候export下的所有文件系统或者目录都不能被客户端访问) #exportfs -uav
-v:显示详细信息
备注:
当我们修改export文件的时候,需要重启nfs服务配置才会生效。使用exportfs就可以不用重启nfs服务,相当于reload

(3)rpcinfo命令
rpcinfo -p IP #查看mount或者quotad监听的端口号
rpcinfo -p localhost #查看本机上rpc程序所监听的端口

(4)mount命令
客户端使用mount命令挂载:
mount -t nfs NFS_SERVER:/PATH /PATH #需要指定类型为nfs
mount -t nfs 172.16.100.7:/shared /mnt/nfs #把172.16.100.7的shared目录共享出去,客户端挂载该目录即可使用

9、NFS开机自启动
chkconfig nfs on

10、客户端开机自动挂载nfs目录
编辑/etc/fstab文件,格式如下:
172.16.100.1:/shared /mnt/nfs nfs defaults 0 0
172.16.100.1:/shared /mnt/nfs nfs defaults,_rnetdev 0 0
备注:
man mount有一个挂载选项需要关注,
_rnetdev:如果文件系统挂不上,就自动忽略掉

参考链接:https://www.cnblogs.com/whych/p/9196537.html