导读 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. 互联网自治域间IP源地址验证技术综述

    一.文章信息 作者:贾溢豪,任罡,刘莹 单位:清华大学 来源:软件学报 时间:2017年 二.基于加密.签名及标记信息 2.1 技术原理 采用端到端验证的设计结构,其中以密钥协商最为常见.通信双方在事 ...

  2. HDU1814(2-SAT)

    Peaceful Commission Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Oth ...

  3. cakephp怎么默认显示index/index文件

    在配置好cakephp之后,我们输入网址后都一般默认显示index/index 文件,那么怎么设置呢? 1.D:\www\cakephp\app\Config\routes.php

  4. PHP定界符<<<eof 使用

    PHP是一个Web编程语言,在编程过程中难免会遇到用echo来输出大段的html和javascript脚本的情况,如果用传统的输出方法 ——按字符串输出的话,肯定要有大量的转义符来对字符串中的引号等特 ...

  5. JS中判断数据类型的几种方法

    1⃣️首先我们来了解一下js中的数据类型 1.基本数据类型:Undefined.Null.Boolean.Number.String(值类型) 2.复杂数据类型:Object(引用类型) (值类型和引 ...

  6. 在ActiveReports页面报表中显示Google地图

    有些报表需求中需要我们显示国家.城市等地址信息,在报表中添加地图信息会让报表给最终用户代码更多有效信息. 在报表中可以将地图作为图片添加进来,当一个图片显示在报表中时,该图片必须存放到本地计算机或者服 ...

  7. HTML5之美

    如今大热的HTML5到底美在哪里?HTML5到底能为实际的移动开发带来哪些改变?来自阿里云云手机服务运营部的前端开发工程师正邪 (廖健)分享了他眼中的HTML5之美,主要讲诉HTML5的常见原理并从C ...

  8. flutter .g文件生成不了

    [SEVERE] Conflicting outputs were detected and the build is unable to prompt for permission to remov ...

  9. Webpack打包报"JavaScript heap out of memory"错误

    问题 开发项目有一段时间了,随着项目越来越大,打包的时间也相应的变长了,打包时的内存也增多了.这时候产生了一个问题,在发布项目的时候,会出现JavaScript heap out of memory错 ...

  10. webstorm使用过程中的一些问题与技巧

    这一篇会随着使用逐渐更新: 1. 问题:string templates are not supported by current javascript version 解决 : setting &g ...