NFS(Network File System):由Sun公司开发,最早的v1版本只在其自己的系统上使用,从v2开始,Sun将其向外公布;

NFS的功能:通过网络,让不用的机器、不同的操作系统分享彼此个别的数据;可以将其简单看做是一个文件共享服务器,将服务器上的共享目录挂载到本地,让其在本地看来,就像是自己的;

NFS提供的服务:1,在目录中查找文件;2,列出目录中的文件;3,管理目录;4,取得各文件的属性;5,文件的读写操作;

NFS的一些特性

     1,NFS工作在OSI第七层,基于RPC实现;

     2,NFS监听的端口:tcp/udp 2049,用于传输的端口是随机选择小于1024的端口(小于1024的端口只有管理用户有权使用),由于其功能较多,还需要其他的服务来启动额外端口;

     3,NFS认证用户时,无法根据用户名判断,而是根据UID映射来完成,只要客户端使用的UID和服务器上的UID相同,即客户端拥有此UID(服务器上UID)相同的权限;

     4,由于其使用UID映射来完成用户认证,所以使用root用户时,root的权限会被降低为nobody;

     5,NFS工作在文件系统上,而文件系统属于内核中的功能,所以NFS是在内核空间中实现(samba在用户空间实现);

     6,为了避免读写冲突,NFS使用了锁机制,客户端需要向服务器请求到锁,才能读写数据;

     7,NFS服务只完成文件传输,其他的功能(例如锁和认证等)是由其他的服务来完成;

关于RPCRemote Procedure Call Protocol):远程过程调用协议,由SUN公司提出,是一种计算机通信协议,该协议允许运行于一台计算机的程序调用另一台计算机的子程序,而程序员无需额外的为这个交互作用编程(即不需要了解底层网络技术的协议);

     功能:由客户端对服务器发出一个执行若干过程的请求,并用客户端提供的参数,执行结果将返回给客户端;

     工作原理

          1,调用客户端句柄,执行传送参数;

          2,调用本地系统内核发送网络消息;

          3,消息传送到远程主机;

          4,服务器句柄得到消息并取得参数;

          5,执行远程过程;

          6,执行的过程将结果返回服务器句柄;

          7,服务器句柄返回结果,调用远程系统内核;

          8,消息传回本地主机;

          9,客户端句柄由内核接收消息;

          10,客户接收句柄返回的数据;

     监听端口:rpc服务的监听端口是半随机的,rpcbind监听tcp/udp 111,而rpc.ststd和rpc.mountd监听的端口为随机端口;

为什么NFS需要RPC?

     由于NFS支持的功能很多,而不同的功能需要启动不同的程序,每启动一个功能就会启动一些端口来传输数据,因此NFS的功能所对应的端口采用随机端口,而客户端要想连接到服务器,就需要RPC服务;NFS在启动时,会开启一些随机端口,并主动向RPC注册,RPC就知道每个端口对应的NFS功能,由此,RPC在NFS中最重要的功能就是指定每个NFS功能所对应的端口,并返回给客户端(RPC使用固定端口tcp/udp111监听客户端请求);

     注意

          1,在启动NFS之前,要先启动RPC,否则NFS无法向RPC注册;

          2,RPC重启时,原本的注册数据会被清空,因此RPC重启后,它所管理的服务需要重新启动来向RPC注册;

          3,RPC在rhel5中,服务启动脚本为/etc/rc.d/init.d/portmap,在rhel6中为/etc/rc.d/init.d/rpcbind;

NFS客户端向服务器存取数据的过程

     1,客户端向服务器的RPC(111端口)发出NFS存取功能的请求;

     2,服务器端找到对应的已注册的NFS daemon端口后,返回给客户端;

     3,客户端获得端口后,直接与NFS daemon建立连接;

NFS启动的daemons

由于NFS服务只完成文件传输,其他的功能是由其他的服务来完成,所以NFS服务器启动至少需要两个daemons,一个管理客户端是否能登陆,一个管理客户端能够取得的权限;

常见的daemons

     rpc.nfsd:最主要的NFS服务,其功能就是管理客户端是否能够使用服务器文件系统挂载信息等,还包括登陆用户的ID判断;

     rpc.mountd:用于管理NFS文件系统,包括权限等;该服务会读取/etc/exports来比对客户端的权限,判断其是否有权限使用共享的资源;

     rpc.lockd(非必须):管理文件的锁;rpc.lockd必须要同时在客户端与服务器端都开启,rpc.lockd常与rpc.statd同时启用;

     rpc.statd(非必须):用于检查文件的一致性,与rpc.lockd有关,如果因为客户端同时使用同一个文件造成可能有所损坏时,rpc.statd可以检测并尝试恢复该文件;与rpc,lockd一样,需要服务器端与客户端同时启动才生效;

     这几个RPC程序,都已经写入到两个基本的服务器启动脚本了:/etc/init.d/nfs和/etc/init.d/nfslock;

NFS的权限问题

前面提到过NFS的认证是通过UID映射来完成的,因此:

     1,如果服务器上没有这个UID,则会以nobody的身份来访问;

     2,除了用户权限外,还需要

          a)NFS服务器有开放可写入权限(/etc/exports);

          b)实际的文件或目录具有可写入的权限;

     3,为了保证安全,可以使用NIS或LDAP集中管理用户账号;

关于锁

     在计算机中,锁是在执行多线程时用于强行限制资源访问的同步机制,即用于在并发控制中保证对互斥要求的满足,分为共享锁和独占锁;

          1,共享锁(S锁):一个事务对资源加上共享锁后,其他的事务只能对该资源再加共享锁,不能加独占锁;获准共享锁的事务只能读数据,不能修改数据;

          2,独占锁(排他锁,X锁):如果事务对资源加上强制锁后,其他事务不能再对该资源加任何类型的锁;获准排他锁的事务可以读写数据;

安装和使用NFS

安装:由于nfs是内核自带的功能,因此不需要额外进行安装,但还需要安装以下两个软件:

     rpcbind:RPC主程序,该服务负责端口的注册(对应)等工作;再次强调,rhel5以前称为:portmap;

     nfs-utils:为nfs提供额外的功能,如rpc.nfsd即rpc.mountd这两个NFSdaemons与其他相关的文件、说明文件、执行文件等;

NFS的软件结构

     /etc/exports          主配置文件;

     /usr/sbin/exportfs          维护NFS分析资源的命令,可以用该命令重新共享/etc/exports修改后的目录资源、将NFS Server共享的目录卸载或重新共享等;

     /var/lib/nfs/*tab          共享资源的登录文件,/var/lib/nfs中有两个重要的登录文件,一个是etab,主要记录NFS共享出来的目录的完整权限设置,另一个xtab记录曾经链接到此NFS服务器的相关客户端数据;

     /usr/sbin/showmoune          客户端查询服务器分享资源的命令,可用于查看NFS服务器共享出来的目录资源;

/etc/exports配置文件的语法和参数

     export    host(options)          依次为:共享的目录     可连接的主机(选项或权限)

     主机定义的方式

          1,IP地址或网段:192.168.1.1,192.168.1.0/24,192.168.1.0/255.255.255.0;

          2,主机名,但这个主机名必须在/etc/hosts中,或可以用DNS解析,主机名支持通配符,如*或?等;

     选项

          rw或ro:目录的权限是可读写或只读,但最终能不能读写与文件系统的权限和用户的权限也有关系;

          secure:默认已经启用;限制客户端只能使用小于1024的tcp/udp端口访问请求;若不想加限制,则使用insecure;只有rhel6由该选项; 

          sync:数据同步写入到内存和硬盘中(性能差,数据可靠性高);

          async:数据先保存在内存中,而非直接写入硬盘(性能好,数据可靠性差);

          wdelay:写入延迟,检查是否有相关的写操作,如果有则将这些写操作一起执行(默认启动);

          no_wdelay:有写操作则立即执行,与sync配合使用;

          no_acl:关闭nfs的acl功能;

          root_squash:将root用户的身份压缩为nobody;

          no_root_squash:不压缩root的权限;

          all_squash:将所有访问的用户身份都压缩为nobody;

          no_all_squash:不压缩所有用户的身份(默认设置)

          anonuid=xxx:使用指定的用户作为匿名用户(该用户需要在本地存在);

          anongid=xxx:使用指定的组为匿名组(该组需要在本地存在);

启动NFS服务

     1,/etc/init.d/rpcbind start     如果事先已启动,不需要再重新启动;

     2,/etc/init.d/nfs start

维护NFS服务

exportfs:用于维护NFS服务器的输出目录列表;

     -a:输出在/etc/exports中的所有目录;

     -r:重新读取/etc/exports中的设置,并立即生效,无需重启NFS服务器,常和-a一起使用;

     -u:取消输出(卸载某一目录),常和-a一起使用;

     -v:显示详细信息(输出的目录列表);

查看NFS服务的相关信息

rpcinfo:查看rpc服务的相关信息;

     -p host:显示指定主机上所有的port与porgram信息;

     -t host nfs:针对nfs这个程序检查其相关的软件版本信息(tcp);

     -u host nfs:针对nfs这个程序检查其相关的软件版本信息(udp);

     如果rpcinfo无法输出,表示注册的数据有问题,需要重启rpcbind与nfs;

showmount:测试NFS服务器的输出目录状态;

     -a:显示指定的NFS服务器的所有客户端主机及其所连接的目录(即每一个挂载连接);

     -d:显示指定的NFS服务器已经被客户端挂载的所有目录列表;

     -e:显示指定服务器上所有输出的共享目录;

使用固定端口

如果需要使用固定端口(比如防火墙规则设置),可修改配置文件/etc/sysconfig/nfs,该配置文件定义了一些NFS的工作特性;

通常只需要修改三个服务的端口即可

     1,RQUOTAD_PORT=xxx

     2,LOCKD_TCPPORT=xxx

     3,LOCKD_UDPPORT=xxx

     4,MOUNTD_PORT=xxx

NFS服务器关机的注意事项

     1,如果有客户端连接上服务器,关机可能会成为“不可能的任务”,可能需要数小时才能正常关机,所以

     2,所以,要先关掉nfs和rpcbind这两个服务,如果无法正确停止,用netstat -tlup找出PID,然后kill掉(注意数据安全);

客户端挂载:mount -t nfs x.x.x.x:/dir /mnt;

客户端挂载NFS也可以使用本地文件系统的挂载选项:如suid、rw、dev、exec、nouser、auto等(列出来的这些为默认设置);

NFS的特殊挂载选项

     fg:挂载时,在前台运行,直到成功或time out为止(默认);

     bg:在后台执行挂载操作,不会影响到前台的程序操作;

     hard:如果客户端与服务器之间有任何一部方脱机,RPC会持续呼叫,直到对方恢复为止,会造成系统爆慢(默认);

     sort:如果任意一方脱机,RPC会在time out后重复呼叫,而非持续呼叫,因此系统的延迟不会太明显;

     intr:在使用hard方式挂载时,加上intr,则当RPC持续呼叫中,该呼叫是可以被中断的(默认不使用);

     rsize:读的缓存大小,默认为1024bytes;

     wsize:写的缓存大小,默认为1024bytes;

示例

     操作系统:CentOS 6.4 x86;

     服务器IP:192.168.159.128;

     客户端IP:192.168.159.132;

     服务器端

          1,安装NFS:yum -y install rpcbind nfs-utils

          2,编辑:vim /etc/exports

               #写入

               /data   192.168.159.132(rw)

               保存退出;

          3,useradd -u 65533 nfs-user          创建一个nfs用户:

          4,mkdir /data; chown -R nfs-user /data          创建对应的目录,并赋予nfs-user权限;

          5,启动服务

                    service rpcbind start

                    service nfs start

     客户端

          1,showmount -e 192.168.159.128          查询服务器上共享了哪些目录;

          2,useradd -u 65533 nfs-user          创建一个用于使用nfs的用户;

          3,mount -t nfs 192.168.159.128:/data /mnt          挂载nfs目录到本地;

          4,su - nfs-user          切换至nfs用户;

          5,cd /mnt          切换至nfs的挂载目录;

          6,touch file1          创建一个文件,测试是否成功;

          7,使用root用户,在mnt下测试是否可以成功创建文件;

声明:本文为学习笔记,内容参考多方资料,如涉及版权问题,请告知本人,谢谢!