美文网首页
【nfs】NFS和RPC的关系

【nfs】NFS和RPC的关系

作者: Bogon | 来源:发表于2022-04-23 00:03 被阅读0次

    一、NFS和RPC的关系

    NFS依赖RPC才能工作,可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责负责信息的传输。

    因为NFS是基于网络的应用,属于套接字程序,所以NFS服务端必须绑定端口,NFS服务端常用的端口为2049;
    但是文件系统十分复杂,NFS有很多功能,每个不同的功能都需要不同的程序来完成,而每个程序都需要启动端口传输数据,这些端口都是随机产生并且小于1024的;
    那么问题来了,既然是随机产生的端口,客户端该如何得知呢?
    答案是引入了RPC服务。

    RPC(remote procedure call):远程过程调用。
    RPC最主要的功能就是指定每个NFS功能所对应的端口,并返回给客户端,使客户端可以连接到正确的端口上。

    工作流程如下:

    1、服务端:RPC要先于NFS启动,RPC对外的端口是111,随后NFS启动,NFS会像操作系统申请一些随机端口分配给各个功能,并向RPC去注册这些端口,RPC便将这些端口和所对应的功能记录下来;

    2、客户端:当NFS客户端需要连接到服务器上时,先启动客户端的RPC服务,客户端的RPC向服务端的RPC 111端口索要功能对应的端口号;索要到端口号后,便连接到NFS服务对应功能的端口,随后传输数据。

    3、注意:即使客户端已经获取了端口号,客户端仍会借助rpc做为中间人进行通信。也就是说,无论何时,客户端和rpc所管理的服务的通信都必须通过rpc来完成。之所以如此,是因为只有rpc才能封装和解封装数据。

    注意:启动 NFS 之前,RPC 就要先启动了,否则 NFS 会无法向 RPC 注册。 另外,RPC 若重新启动时,原本注册的数据会不见,因此 RPC 重新启动后,它管理的所有服务都需要重新启动来重新向 RPC 注册。

    image.png image.png

    二、NFS 启动的 RPC daemon

    由于 NFS 的各项功能都必须要向 RPC 来注册,如此一来 RPC 才能了解 NFS 这个服务的各项功能之 port number, PID, NFS 在服务器所监听的 IP 等等,而客户端才能够透过 RPC 的询问找到正确对应的端口。 也就是说,NFS 必须要有 RPC 存在时才能成功的提供服务,因此我们称 NFS 为 RPC server 的一种。

    事实上,有很多这样的服务都是向 RPC 注册的,举例来说,NIS (Network Information Service) 也是 RPC server 的一种。 你也会知道,不论是客户端还是服务器端,要使用 NFS 时,两者都需要启动 RPC 才行!

    image.png

    我们现在知道 NFS 服务器在启动的时候就得要向 RPC 注册,所以 NFS 服务器也被称为 RPC server 之一。
    那么 NFS 服务器主要的任务是进行文件系统的分享,文件系统的分享则与权限有关。
    所以 NFS 服务器启动时至少需要两个 daemons ,一个管理客户端是否能够登入的问题, 一个管理客户端能够取得的权限。如果你还想要管理 quota 的话,那么 NFS 还得要再加载其他的 RPC 程序就是了。

    我们以较单纯的 NFS 服务来说:

    rpc.nfsd

    最主要的 NFS 服务提供商。这个 daemon 主要的功能就是在管理客户端是否能够使用服务器文件系统挂载信息等, 其中还包含这个登入者的 ID 的判别。

    rpc.mountd

    这个 daemon 主要的功能,则是在管理 NFS 的文件系统。 当客户端顺利的通过 rpc.nfsd 而登入服务器之后,在他可以使用 NFS 服务提供的档案之前,还会经过档案权限 (就是那个 -rwxrwxrwx 与 owner, group 那几个权限) 的认证程序。
    他会去读 NFS 的配置文件 /etc/exports 来比对客户端的权限,当通过这一关之后客户端就可以取得使用 NFS 档案的权限。(注:这个也是我们用来管理 NFS 分享之目录的权限与安全设定的地方)

    rpc.lockd (非必要)

    这个玩意儿可以用在管理档案的锁定 (lock) 用途。为何档案需要『锁定』呢? 因为既然分享的 NFS 档案可以让客户端使用,那么当多个客户端同时尝试写入某个档案时, 就可能对于该档案造成一些问题。
    这个 rpc.lockd 则可以用来克服这个问题, 但 rpc.lockd 必须要同时在客户端与服务器端都开启才行。此外, rpc.lockd 也常与 rpc.statd 同时启用。

    rpc.statd (非必要)

    可以用来检查档案的一致性,与 rpc.lockd 有关。
    若发生因为客户端同时使用同一档案造成档案可能有所损毁时, rpc.statd 可以用来检测并尝试回复该档案。与 rpc.lockd 同样的,这个功能必须要在服务器端与客户端都启动才会生效。

    上述这几个 RPC 所需要的程序,其实都已经写入到两个基本的服务启动脚本中了。

    yum -y install  nfs-utils rpcbind
    
    Installed:
      nfs-utils.x86_64 1:1.3.0-0.68.el7.2                                                             
      rpcbind.x86_64 0:0.2.0-49.el7
    
    Dependency Installed:
      gssproxy.x86_64 0:0.7.0-30.el7_9     
      keyutils.x86_64 0:1.5.8-3.el7     
      libbasicobjects.x86_64 0:0.1.1-32.el7  
      libcollection.x86_64 0:0.7.0-32.el7  
      libevent.x86_64 0:2.0.21-4.el7
      libini_config.x86_64 0:1.3.1-32.el7  
      libnfsidmap.x86_64 0:0.25-19.el7  
      libpath_utils.x86_64 0:0.2.1-32.el7    
      libref_array.x86_64 0:0.1.5-32.el7   
      libverto-libevent.x86_64 0:0.2.5-4.el7
      quota.x86_64 1:4.01-19.el7
    
    
    cat /usr/lib/systemd/system/nfs-server.service
    
    ####################################
    [Unit]
    Description=NFS server and services
    DefaultDependencies=no
    Requires= network.target proc-fs-nfsd.mount
    Requires= nfs-mountd.service
    Wants=rpcbind.socket network-online.target
    Wants=rpc-statd.service nfs-idmapd.service
    Wants=rpc-statd-notify.service
    
    After= network-online.target local-fs.target
    After= proc-fs-nfsd.mount rpcbind.socket nfs-mountd.service
    After= nfs-idmapd.service rpc-statd.service
    Before= rpc-statd-notify.service
    
    # GSS services dependencies and ordering
    Wants=auth-rpcgss-module.service
    After=rpc-gssd.service gssproxy.service
    
    Wants=nfs-config.service
    After=nfs-config.service
    
    [Service]
    EnvironmentFile=-/run/sysconfig/nfs-utils
    
    Type=oneshot
    RemainAfterExit=yes
    ExecStartPre=-/usr/sbin/exportfs -r
    ExecStart=/usr/sbin/rpc.nfsd $RPCNFSDARGS
    ExecStartPost=-/bin/sh -c 'if systemctl -q is-active gssproxy; then systemctl reload gssproxy ; fi'
    ExecStop=/usr/sbin/rpc.nfsd 0
    ExecStopPost=/usr/sbin/exportfs -au
    ExecStopPost=/usr/sbin/exportfs -f
    
    ExecReload=-/usr/sbin/exportfs -r
    
    [Install]
    WantedBy=multi-user.target
    #######################################
    
    
    cat /usr/lib/systemd/system/rpcbind.service
    
    #########################################
    [Unit]
    Description=RPC bind service
    DefaultDependencies=no
    
    # Make sure we use the IP addresses listed for
    # rpcbind.socket, no matter how this unit is started.
    Requires=rpcbind.socket
    Wants=rpcbind.target
    After=systemd-tmpfiles-setup.service
    
    [Service]
    Type=forking
    EnvironmentFile=/etc/sysconfig/rpcbind
    ExecStart=/sbin/rpcbind -w $RPCBIND_ARGS
    
    [Install]
    WantedBy=multi-user.target
    ##############################################
    
    

    三、参考

    共享存储之NFS
    https://zhuanlan.zhihu.com/p/395995375

    鸟哥Linux——文件服务之NFS
    http://cn.linux.vbird.org/linux_server/0330nfs.php

    NFS设置固定端口,添加防火墙规则

    https://www.jianshu.com/p/9fb004b30f1e

    How to share home directory to client by NFS?

    https://www.jianshu.com/p/f5dfb111a8e4

    相关文章

      网友评论

          本文标题:【nfs】NFS和RPC的关系

          本文链接:https://www.haomeiwen.com/subject/glsvertx.html