导读 NFS(Network File System)即网络文件系统,由Sun公司开发,于1984年向外公布。功能是通过网络让不同的机器、不同的操作系统能够彼此分享个别的数据,让应用程序在客户端通过网络访问位于服务器磁盘中的数据,是在类Unix系统间实现磁盘文件共享的一种方法。
NFS服务简介

同时也是一种网络协议,NFS依赖RPC才能工作。(RHEL5.0上是NFS V3而RHEL6.0上是NFS V4)

NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。

NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。

RPC协议介绍

RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。其工作在TCP/UDP的111端口。建立在Socket之上的,主要是简化编程的工作在底层提供网络之间的通信。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

Linux6中实现RPC协议的软件是RPCbind程序包,进程名称是portmapper。RPC并不提供任何具体的服务,要想提供具体的服务就必须在Linux上提供具体的软件。而网络文件系统(NFS)就是基于RPC协议工作的,如NFS客户端——-Portmap客户端——Portmap服务端——NFS服务端。如图是RPC的工作原理:

NFS V4相关进程
$ rpcinfo

mountd

负责客户端来源认证的进程,认证成功后接受客户端的挂载请求,工作在随机端口,即时向RPC注册。

nfs

负责文件读写,工作在TCP/UDP的2049端口。

quotad

负责限定客户端在本地能使用多大磁盘空间,工作在随机端口,即时向RPC注册。

idmapd

负责用户ID映射。

nlockmgr

NFS的服务器端锁机制进程,当有一个客户端进程要访问服务器端处理文件之前就会先向NFS注册加锁,以免同时两个客户端进程同时处理一个文件导致文件崩溃;一个进程处理完成之后就会通知NFS释放锁。
NIS服务介绍

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。

本文转自:https://www.linuxprobe.com/nfs-rpc.html

NFS及RPC讲解的更多相关文章

  1. nfs服务的讲解

    第4章 nfs存储服务的搭建 4.1 nfs服务的介绍 4.1.1 nfs的作用 nfs服务器是一种远程网络传输的共享文件系统 节省web服务器的本地存储空间 用户存储在web服务器上面的资源,会通过 ...

  2. 二十二、NFS服务深入讲解

    一.查看nfs服务: [root@nfsserve ~]# ps -ef|grep -E "rpc|nfs"rpc       1565     1  0 17:29 ?      ...

  3. NFS数据共享(全面讲解使用教程)

    目录 一:NFS数据共享 1.NFS简介: 2.什么是NFS? 3.NFS的应用 二:NFS数据共享实践 二:NFS配置详解 1.控制文件权限 三:配置文件分类 四:NFS统一用户 1.创建用户(客户 ...

  4. NFS错误Starting NFS quotas: Cannot register service: RPC: Unable to receive; errno=Connection refused

    NFS报错一例 [root@bjs0- ~]# /etc/init.d/portreserve start Starting portreserve:                          ...

  5. nfs 客户端启动报错rpc.mountd: svc_tli_create: could not open connection for tcp6

    # /etc/init.d/nfs start Starting NFS services: [ OK ] Starting NFS mountd: rpc.mountd: svc_tli_creat ...

  6. 【集群实战】NFS网络文件共享服务3-相关知识补充(showmount,exports,rpc)

    1. showmount命令说明 showmount命令一般用于从NFS客户端检查NFS服务器端共享目录的情况. 参数说明: -e,--exports 显示NFS服务器输出的目录列表 [root@we ...

  7. NFS存储服务部署

    第1章 NFS介绍 1.1 NFS服务内容的概述 □ RPC服务知识概念介绍说明,以及RPC服务存在价值(必须理解掌握) □ NFS服务工作原理讲解(必须理解掌握) □ NFS共享文件系统使用原理讲解 ...

  8. NFS服务搭建与配置

    启动NFS SERVER之前,首先要启动RPC服务(CentOS5.8下为portmap服务,CentOS6.6下为rpcbind服务,下同),否则NFS SERVER就无法向RPC服务注册了.另外, ...

  9. NFS学习

    linux下搭建nfs服务: NFS是network filesystem的缩写,它可以通过网络,让不同的机器.不同的操作系统共享文件. NFS支持的功能比较多,默认端口也是随机的,基于远程调用服务( ...

随机推荐

  1. 使用 ActiveMQ 实现JMS 异步调用

    目录 简介 启动 ActiveMQ 服务器 查看控制台 ActiveMQ 的消息通道 Queue Topic 比较 开发生产者和消费者 开发服务端(消费者) 开发客户端(生产者) 参考 简介 服务之间 ...

  2. Spring Data Redis —— 快速入门

    环境要求:Redis 2.6及以上,javase 8.0及以上: 一.Spring Data Redis 介绍 Spring-data-redis是spring的一部分,提供了在srping应用中通过 ...

  3. Linux常用基本命令(head)

    head命令 作用:显示文件的头部内容,默认显示前面10行 格式: head [option] [file] -n <行数> -c <字节> ghostwu@dev:~/lin ...

  4. Codeforces445B(SummerTrainingDay06-N 并查集)

    B. DZY Loves Chemistry time limit per test:1 second memory limit per test:256 megabytes input:standa ...

  5. amazeui+canvas绘制二维码

    <link rel="stylesheet" type="text/css" href="css/amazeui.min.css"/& ...

  6. oracle instr函数(oracle 用instr 来代替 like)

    oracle instr函数 对于instr函数,我们经常这样使用:从一个字符串中查找指定子串的位置.例如: SQL> select instr('Oracle','or') position ...

  7. WordCount系统分析与设计作业

    Gitee项目地址 https://gitee.com/gitdq/homework psp表 PSP2.1 PSP阶段 预估耗时 (分钟) 实际耗时 (分钟) Planning 计划 10 10 · ...

  8. 如何在 Azure 门户中将托管数据磁盘附加到 Windows VM

    本文介绍了如何通过 Azure 门户将新的托管数据磁盘附加到 Windows 虚拟机. 在开始之前,请查看以下提示: 虚拟机的大小决定了可以附加多少个磁盘. 有关详细信息,请参阅虚拟机大小. 对于新磁 ...

  9. 购物商城学习--第三讲(tomcat插件启动web工程)

    此处提到的tomcat插件即maven工程集成的tomcat插件,可以在添加maven的tomcat插件之后,在本地通过脚本或者命令行方式运行web工程,tomcat插件启动只需要修改一个端口即可,非 ...

  10. mysql INSERT的几个语法 IGNORE|REPLACE|LOW_PRIORITY | DELAYED

    INSERT IGNORE 与INSERT INTO的区别就是INSERT IGNORE会忽略数据库中已经存在 的数据,如果数据库没有数据,就插入新的数据,如果有数据的话就跳过这条数据.这样就可以保留 ...