一、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才能封装和解封装数据。
image.png image.png注意:启动 NFS 之前,RPC 就要先启动了,否则 NFS 会无法向 RPC 注册。 另外,RPC 若重新启动时,原本注册的数据会不见,因此 RPC 重新启动后,它管理的所有服务都需要重新启动来重新向 RPC 注册。
二、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?
网友评论