zoukankan      html  css  js  c++  java
  • NFS 网络文件系统

    1.2 NFS系统原理介绍

    1.2.1 NFS系统挂载结构图解与介绍

    下图是企业工作中的NFS服务器与客户端挂载情况结构图

    屏幕快照 2017-03-08 下午4.54.39.png-543kB

    • 可以看到NFS服务器端/video共享目录挂载到了两台NFS客户端上。在客户端查看时,NFS服务器端的/video目录就相当于客户端本地的磁盘分区或目录,几乎感觉不到使用上的区别,根据NFS服务端授予的NFS共享权限以及共享目录的本地系统权限,只要在指定的NFS客户端操作挂载/v/video或者/video的目录,就可以将数据轻松地存取到NFS服务器端上的/video目录中了。

    客户端挂载NFS后,本地挂载基本信息显示如下:

    [root@nfs01 ~]# df -h
    Filesystem      Size    Used    Use%    Mounted on
    /dev/sda1       1.1T    467G    544G    47% /
    tmpfs           7.9G    0       7.9G    0%  /dev/shm
    10.0.0.7:/video 1002G   59G     892G    7%  /video   #<==10.0.0.7为nfsserver的ip地址
    
    提示:  mount 源 目标
            mount 10.0.0.7:/video   /video
    • 从挂载信息来看,和本地磁盘分区几乎没什么差别,只是文件系统对应列的开头是以IP滴噢址开头的形式了。

    • 经过前面的介绍,我们知道NFS系统是通过网络来进行数据传输的(所以叫做网络文件系统)因此,NFS会使用一些端口来传输数据,那么,NFS到底使用哪些端口来进行数据传输呢?

    • NFS在传输数据时使用的端口会随机选择。可能有同学会纳闷,既然这样,NFS客户端是怎么知道NFS服务端使用的哪个端口呢?
    • 答案就是通过RPC(中文意思远程过程调用,英文Remote Procedure Call简称RPC)协议/服务来实现,这个RPC服务的应用在门户级的网站有很多,例如:百度等。

    1.2.2 什么是RPC(Remote Procedure Call)

    • 因为NFS支持的功能相当多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口无法固定,它会随机取用一些未被使用的端口来作为传输之用,其中CentOS5.x的随机端口都小于1024,而CentOS6.x的随机端口都是较大的。
    • 因为端口不固定,这样一来就会造成NFS客户端与NFS服务端的通信障碍,因为NFS客户端必须要知道NFS服务端的数据传输端口才能进行通信,才能交互数据。
    • 要解决上面的困扰,就需要通过远程过程调用RPC服务来帮忙了,NFS的RPC服务最主要的功能就是记录每个NFS功能所对应的端口号,并且在NFS客户端请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可以连接到正确的NFS端口上去,达到实现数据传输交互数据目的。这个RPC服务类似NFS服务端和NFS客户端之间的一个中介。

    屏幕快照 2017-03-08 下午5.44.53.png-681.7kB

    • 就拿房屋中介打个比喻吧:假设我们要找房子,这里的我们就相当于NFS客户端,中介介绍房子,中介就相当于RPC服务,房子所有者房东就相当于NFS服务,租房的人找房子,就要找中介,中介要预先存有房子主人房东的信息,才能将房源信息告诉租房的人。
    • 那么RPC服务又是如何知道每个NFS的端口呢?
    • 这是因为,当NFS服务端启动服务时会随机取用若干端口,并主动向RPC服务注册取用的相关端口及功能信息,如此一来,RPC服务就知道NFS每个端口对应的NFS功能了,然后RPC服务使用固定的111端口来监听NFS客户端提交的请求,并将正确的NFS端口信息回复给请求的NFS客户端,这样一来,NFS客户端就可以与NFS服务端进行数据传输了。
    • 在启动NFS SERVER之前,首先要启动RPC服务(CentOS5.x下为portmap服务,CentOS6.x下为rpcbind服务,下同),否则NFS SERVER就无法向RPC服务注册了。另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会丢失,因此,此时RPC服务管理的NFS程序也需要重新启动以重新向RPC注册。要特别注意的是,一般修改NFS配置文件后,是不需要重启NFS的,直接在命令行执行/etc/init.d/nfs reload或exportfs -rv即可使修改的/etc/exports生效。

    1.2.3 NFS的工作流程原理

    屏幕快照 2017-03-08 下午5.57.43.png-448.3kB

    屏幕快照 2017-03-08 下午6.00.27.png-807.6kB

    当访问程序通过NFS客户端向NFS服务端存取文件时,其请求数据流程大致如下:

    1)首先用户访问网站程序,由程序在NFS客户端上发出存取NFS文件的请求,这时NFS客户端(即执行程序的服务器)的RPC服务(rpcbind服务)就会通过网络向NFS服务器端的RPC服务(rpcbind服务)的111端口发出NFS文件存取功能的询问请求。

    2)NFS服务端的RPC服务(rpcbind服务)找到对应的已注册的NFS端口后,通知NFS客户端的RPC服务(rpcbind服务)

    3)此时NFS客户端获取到正确的端口,并与NFS daemon联机存取数据

    4)NFS客户端把数据存取成功后,返回给前端访问程序,告知给用户存取结果,作为网站用户,就完成了一次存取操作。

    因为NFS的各项功能都需要向RPC服务(rpcbind服务)注册,所以只有RPC服务(rpcbind服务)才能获取到NFS服务的各项功能对应的端口号(port number),PID,NFS在主机所监听的IP等信息,而NFS客户端也只能通过向RPC服务(rpcbind服务)询问才能找到正确的端口。也就是说,NFS需要有RPC服务(rpcbind服务)的协助才能成功对外提供服务。从上面的描述,我们不难推断,无论是NFS客户端还是NFS服务器端,当要使用NFS时,都需要首先启动RPC服务(rpcbind服务),NFS服务必须在RPC服务启动之后启动,客户端无需启动NFS服务,但需要启动RPC服务。

    NFS服务器搭建

    yum install -y nfs-utils rpcbind


    rpm -ql nfs-utils
    /etc/rc.d/init.d/nfs <-- nfs服务启动脚本文件
    /usr/sbin/showmount <-- 检查nfs服务共享目录信息

    rpm -ql rpcbind
    /etc/rc.d/init.d/rpcbind <-- rpcbind服务启动脚本文件
    /usr/sbin/rpcbind <-- 检查nfs服务向rpc服务注册信息

    [root@nfs01 ~]# vim /etc/exports
    /data 172.16.1.0/24(rw,sync)
    说明:配置文件信息 指定共享目录 指定共享目录访问控制网段或主机信息(共享目录参数信息)

    mkdir /data
    chown -R nfsnobody.nfsnobody /data

    启动nfs和rpc服务
    /etc/init.d/rpcbind start <- 首先启动rpcbind服务
    /etc/init.d/nfs start <- 其次启动nfs服务

    进行服务配置检查
    先检查房源信息是否注册
    rpcbind -p 172.16.1.31
    检查是否存在可用的共享目录
    [root@nfs01 ~]# showmount -e 10.0.0.31
    Export list for 10.0.0.31:
    /data 172.16.1.0/24

    NFS客户端部署流程:
    第二个里程:进行软件服务安装
    yum install -y nfs-utils rpcbind

    第三个里程:进行共享目录挂载
    [root@web02 ~]# mount -t nfs 172.16.1.31:/data /mnt
    [root@web02 ~]# df -h

    NFS配置权限设置常用参数说明

    rwRead-write,表示可读写权限
    ro Read-only,表示只读权限
    sync (同步,实时)请求或吸入数据时,数据同步写入到NFS Server的硬盘后才返回
    async (异步)写入时数据会先写到内存缓冲区,只到硬盘有空档才会写入磁盘,这样可以提升写入速率!风险为若服务器挂掉或不正常关机,会损失缓冲区中未写入磁盘的数据
    no_root_squash 访问NFS Server共享目录的用户如果是root,它对该共享目录具有root权限。
    root_squash 如果访问目录的是root,则它的权限将被压缩成匿名用户。
    all_squash 不管访问共享目录的用户身份如何,它的权限都被压缩成匿名用户。
    anonuid 指定共享文件夹里文件所有者的uid号:例如:(rw,squash,anonuid=12306,anongid=12306)
    anongid 指定共享文件夹里文件所有者的gid号:例如:(rw,squash,anonuid=12306,anongid=12306)

  • 相关阅读:
    Influx Sql系列教程一:database 数据库
    Influx Sql系列教程零:安装及influx-cli使用姿势介绍
    移动端/H5关于cursor:pointer导致的问题
    onselectstart="return false"
    js正则验证之不能使用相同字符
    js通过sessionStorage实现的返回上一页
    MetaHandler.js:移动端适配各种屏幕
    iOS下的 Fixed + Input 调用键盘的时候fixed无效问题解决方案
    js判断三个数字中的最大值
    js判断微信浏览器
  • 原文地址:https://www.cnblogs.com/zpzp7878/p/10466810.html
Copyright © 2011-2022 走看看