NFS(Network File System)即网络文件系统,由Sun公司开发,于1984年向外公布。功能是经过网络让不一样的机器、不一样的操做系统可以彼此分享个别的数据,让应用程序在客户端经过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。 |
NFS服务简介linux
同时也是一种网络协议,NFS依赖RPC才能工做。(RHEL5.0上是NFS V3而RHEL6.0上是NFS V4)编程
NFS 的基本原则是“允许不一样的客户端及服务端经过一组RPC分享相同的文件系统”,它是独立于操做系统,允许不一样硬件及操做系统的系统共同进行文件的分享。vim
NFS在文件传送或信息传送过程当中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其余系统中程序的一种机制。NFS自己是没有提供信息传输的协议和功能的,但NFS却能让咱们经过网络进行资料的分享,这是由于NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。能够这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。安全
RPC协议介绍服务器
RPC(Remote Procedure Call)远程过程调用,它是一种经过网络从远程计算机程序上请求服务,而不须要了解底层网络技术的协议。其工做在TCP/UDP的111端口。创建在Socket之上的,主要是简化编程的工做在底层提供网络之间的通讯。网络
RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,而后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器得到进程参数,计算结果,发送答复信息,而后等待下一个调用信息,最后,客户端调用进程接收答复信息,得到进程结果,而后调用执行继续进行。app
在Linux6中实现RPC协议的软件是RPCbind程序包,进程名称是portmapper。RPC并不提供任何具体的服务,要想提供具体的服务就必须在Linux上提供具体的软件。而网络文件系统(NFS)就是基于RPC协议工做的,如NFS客户端——-Portmap客户端——Portmap服务端——NFS服务端。如图是RPC的工做原理:async
NFS V4相关进程tcp
$ rpcinfo mountd 负责客户端来源认证的进程,认证成功后接受客户端的挂载请求,工做在随机端口,即时向RPC注册。 nfs 负责文件读写,工做在TCP/UDP的2049端口。 quotad 负责限定客户端在本地能使用多大磁盘空间,工做在随机端口,即时向RPC注册。 idmapd 负责用户ID映射。 nlockmgr NFS的服务器端锁机制进程,当有一个客户端进程要访问服务器端处理文件以前就会先向NFS注册加锁,以避免同时两个客户端进程同时处理一个文件致使文件崩溃;一个进程处理完成以后就会通知NFS释放锁。
NIS服务介绍ide
NIS(network information service)网络信息服务,也是SUN公司开发的统一认证服务器,而且SUN也有商业版的NIS+。NIS自己十分不安全,也没法完成安全用户认证,它只可以帮助用户认证而且可以把帐号密码集中存放起来,相似于Windows的AD域。在使用中更多的是使用NIS结合kerberos来完成安全认证或只使用kerberos完成安全认证。而在大规模NFS环境中会用到LDAP协议,它可以实现大规模的安全统一认证,而且可以基于SSL,还可以实现多主模型,高可能集群等等。而Windows的AD域就是使用的LADP协议。
何时会须要统一认证服务器呢,就须要先了解NFS的权限问题?
NFS服务器端目前只能基于主机认证客户端的来源,而不能基于用户名进行验证。那么在安全性上就大大减弱了。若是NFS客户端挂载服务器端以后以tom的用户建立一个文件而在NFS服务器端没有tom用户那么这个文件就会显示tom的ID号,刚好此ID号正好是NFS服务器端的Jerry用户那么此文件的属主就会是jerry了。所以因为root用户的UID都是0,因此默认NFS客户端Root都被映射为来宾帐号,否则客户端均可以以本地Root的权限来操做NFS服务器了。
为了解决这个问题,就可使用NIS集中式认证。也就是说另外再找一台服务器作NIS认证,那么当NFS客户端登录时必需要先到认证服务器确认用户名和密码。登录成功后建立文件时就会以当前用户为准,而NFS服务器端解析此文件的用户ID时就会到认证服务器去请求解析。这样一来就不会出现文件权限的诡异了。
NFS实践
安装rpcbind
属于RPC的服务器端,默认已安装。
$ rpm -q rpcbind rpcbind-0.2.0-11.el6.x86_64
安装nfs-utils
nfs-utils是NFS的服务器端管理工具(NFS是内核模块),不光服务端须要,客户端也须要安装,否则没法挂载成功。
$ yum install nfs-utils # CentOS 6启动方式; $ service nfs restart $ chkconfig nfs on # CentOS 7启动方式; $ systemctl enable nfs.service $ systemctl start nfs.service
编辑NFS配置文件
$ cat /etc/sysconfig/nfs # mound进程设置固定端口; MOUNTD_PORT=892 # quotad进程设置固定端口; RQUOTAD_PORT=875 # lockd进程设置固定端口; LOCKD_TCPPORT=32803 LOCKD_UDPPORT=32769
PS:以上进程都是RPC提供的,在启动时要向RPC注册监听在某端口上,RPC会从未使用的端口中随机挑选一个给此进程,而设置固定端口以避免随机端口占用到服务端口。
导出NFS共享目录
# 建立用户; $ useradd -u 1000 test # 建立共享目录; $ mkdir /share # 给共享目录设置test用户权限; $ setfacl -m u:test:rwx /share $ cat /etc/exports /share 172.168.0.0/16(rw,async)
NFS服务的配置文件为/etc/exports,这个文件是NFS的主要配置文件,不过系统并无默认值,因此这个文件不必定会存在,可能要使用vim手动创建,而后在文件里面写入配置内容。
/etc/exports文件内容格式,以下:
< 输出目录> [客户端1 选项(访问权限,用户映射,其余)] [客户端2 选项(访问权限,用户映射,其余)] 输出目录:输出目录是指NFS系统中须要共享给客户机使用的目录,如/share。 客户端:客户端是指网络中能够访问这个NFS输出目录的计算机,如172.168.10.0/16。 选项:选项用来设置输出目录的访问权限、用户映射等。 A)访问权限 ro:设置输出目录只读。 rw:设置输出目录读写。 B)用户映射 root_squash:将root用户映射为来宾帐号(nfsnoboydy用户),默认启用。 no_root_squash:不映射客户端root帐号为来宾帐号,也就意味着客户端root具备服务端root的用户权限。 all_squash:将远程访问的全部普通用户及所属组都映射为匿名用户或用户组(nfsnobody)。 no_all_squash:与all_squash取反(默认设置); anonuid=501:指定映射的帐号UID。 anongid=501:指定映射的帐号GID。 C)其余 secure:限制客户端只能从小于1024的tcp/ip端口链接nfs服务器(默认设置)。 insecure:容许客户端从大于1024的tcp/ip端口链接服务器。 sync:将数据同步写入内存缓冲区与磁盘中,效率低,但能够保证数据的一致性。 async:将数据先保存在内存缓冲区中,必要时才写入磁盘,默认使用。 wdelay:检查是否有相关的写操做,若是有则将这些写操做一块儿执行,这样能够提升效率(默认设置)。 no_wdelay:如有写操做则当即执行,应与sync配合使用。 subtree:若输出目录是一个子目录,则nfs服务器将检查其父目录的权限(默认设置)。 no_subtree:即便输出目录是一个子目录,nfs服务器也不检查其父目录的权限,这样能够提升效率。
NFS客户端挂载共享目录
客户端首先也要安装nfs-utils,否则没法识别nfs文件系统。
$ yum install nfs-utils 而后挂载共享目录。 $ mount -t nfs -o soft 172.168.10.100:/share /mnt 这里若是使用root用户来建立文件,是没有权限建立的,一是由于root在此被映射为nfsnobody了,二是由于/share只开放给了test用户。 $ touch /mnt/test.txt touch: cannot touch `/mnt/test.txt': Permission denied 建立用户 $ useradd -u 1000 test 切换到test用户 $ su - test $ touch /mnt/test.txt $ ll /mnt/ -rw-rw-r--. 1 test test 0 Mar 31 2015 test.txt
建立测试文件,若是NFS服务器端不给/share设置test容许写入,那么在客户端上的test用户就没有写入权限,由于在客户端只是执行命令而真正要建立文件仍是服务器端以本地test用户的权限来建立文件。另外若是两个服务器上的test用户ID号不一样也不能建立文件。
$ cat /etc/fstab 172.168.10.100: /share /mnt nfs defaults,_rnetdev 0 0
_rnetdev表示系统启动时若是挂载不到NFS就跳过,默认挂载不到系统启动不了。
NFS命令
服务器端相关命令 # 查看RPC相关进程; $ rpcinfo # 查看导出的文件系统; $ exportfs # 从新导出全部文件系统; $ exportfs -a -r # 取消导出全部文件系统; $ exportfs -a -u # 查看NFS服务器全部被挂载的文件系统; $ showmount -a 172.168.10.100 客户端相关命令 查看NFS服务器导出的全部文件系统; $ showmount -e 172.168.10.100 NFS有不少默认的参数,打开/var/lib/nfs/etab查看分享出来的/share完整权限设定值。 $ cat /var/lib/nfs/etab /share192.168.60.0/24(rw,async,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash, no_subtree_check,secure_locks,acl,anonuid=65534,anongid=65534)
NFS故障处理
NFS客户端卡死问题
在客户端df -h的时候系统直接就卡住了,umount -f /mnt提示device is busy,而且尝试访问挂载目录、ctrl+c也不能强行退出。形成这种现象的缘由是nfs服务器/网络挂了,NFS客户端还存在,nfs客户端挂载默认采用hard-mount选项,而不是soft-mount。他们的区别是:
soft-mount: 当客户端加载NFS不成功时,重试retrans设定的次数,若是retrans次都不成功,则放弃此操做,返回错误信息 “Connect time out” hard-mount: 当客户端加载NFS不成功时,一直重试,直到NFS服务器有响应。因此就会出现客户端卡死问题。 hard-mount是系统的缺省值,在选定hard-mount时,最好同时选intr , 容许中断系统的调用请求,避免引发系统的挂起。当NFS服务器不能响应NFS客户端的hard-mount请求时,NFS客户端会显示”NFS server hostname not responding, still trying”。 下面列出mount关于nfs相关的参数: -a:把/etc/fstab中列出的路径所有挂载。 -t:须要mount的类型,如nfs等。 -r:将mount的路径定为read only。 -v mount:过程的每个操做都有message传回到屏幕上。 -o rsize=n:在NFS服务器读取文件时NFS使用的字节数,默认值是4096个字节。 -o wsize=n:向NFS服务器写文件时NFS使用的字节数,默认值是4096个字节。 -o timeo=n:从超时后到第1次从新传送占用的1/7秒的数目,默认值是7/7秒。 -o retry=n:在放弃后台mount操做以前能够尝试的次数,默认值是7000次。 -o soft:使用软挂载的方式挂载系统,若Client的请求得不到回应,则从新请求并传回错误信息。 -o hard:使用硬挂载的方式挂载系统,该值是默认值,重复请求直到NFS服务器回应。 -o intr:容许NFS中断文件操做和向调用它的程序返回值,默认不容许文件操做被中断。 fg:一直在提示符下执行重复挂载。 bg:若是第1次挂载文件系统失败,继续在后台尝试执行挂载,默认值是失败后不在后台处理。 tcp:对文件系统的挂载使用TCP,而不是默认的UDP。 如:mount -t nfs -o soft -o intr -o retry=10 192.168.1.2:/home/nfs /mnt
NFS客户端没法启动
形成NFS客户端没法启动的缘由也是因为nfs服务器/网络挂了,客户端在系统启动时一直去链接NFS服务端,可是一直链接不上,就一直卡死在哪里启动不了。一样解决方式使用soft-mount方式挂载NFS。