网络文件系统实现的核心是使用了RPC机制,即:远程过程调用协议。在说明NFS协议之前必须先搞清楚RPC。RPC是一种编程技术,也是协议。
如果在同一个主机上,两个进程之间可以直接通信(即进程间通信),但是当两个进程位于C/S模型上时,则需要借助另外一个应用程序(RPC),两个进程不需要考虑自己是否在网络上通信(全权由RPC处理)
RPC建立在Socket(套接字)之上,一台主机上运行的主程序,可以调用另一台主机上准备好的子程序,就像本地调用子程序一样,不需要知道底层网络实现的细节。
RPC使用类似C/S模型,请求的时候,请求程序时客户端,而服务提供的程序则是服务器。使用C/S模型忽略通讯的具体细节,从而程序员不必关心C/S之间的通信协议,集中精力实现其过程就可以了。
提供RPC服务的程序:Portmap;服务器端监听tcp/udp的111端口
RPC是一种编程技术,简化分布式应用程序的开发
RC --> RPC C --> RPC S --> RS
RPC
RPC调用的时候一般有两种方式:
同步调用,客户端等待调用执行完成后并返回结果;
异步调用,客户端调用后不用等待执行结果的返回,但可以通过回调通知等方式获取返回结果。如若客户端不关心调用返回的结果,则称为单向异步调用。
任何RPC C/S程序的重要实体都包括 IDL 文件(接口定义文件)、客户机 stub(存根)、服务器 stub 以及由客户机和服务器程序共用的头文件。客户机和服务器 stub 使用 RPC 运行时库通信。RPC 运行时库提供一套标准的运行时例程来支持RPC 应用程序。
当我们建立RPC服务后,客户算的调用参数通过调用底层的RPC传输管道,并根据传输前所提供的目的地址及其RPC上层应用程序的stub,转到相应的RPC应用程序服务端,然后客户端程序处于等待状态,直到收到应答或者Timeout的超时信号。服务端获取请求消息,服务端stub吧所需的信息提交给上层的服务应用程序,服务端执行远程过程调用,然后使用RPC运行时库将结果返回给客户端stub,最后客户端stub将结果反馈给客户端应用程序。从上面的过程可以看出来,stub作为应用程序与RPC运行时层之间的接口,它使得两者可以以理解的格式交互信息。
服务器 RPC 应用程序初始化期间它会向 RPC 运行时库注册接口,客户机在向服务器发出远程过程调用时,要检查它是否与服务器兼容。服务器启动,监听来自客户机的远程过程调用。
客户机发出远程过程调用,RPC 运行时库监听服务器进程上哪个端点达到RPC。
客户机找到服务器之后,客户机 stub 把远程过程调用和参数转换为服务器 stub 可以理解的格式,然后交给客户机运行时,由客户机运行时通过网络传输这些信息。
服务器 RPC 运行时库接收到达的 RPC 调用,把它传递给服务器 stub,服务器 stub 把它转换为服务器可以理解的格式。
执行 RPC 调用之后,服务器 stub 和服务器运行时把结果发送回客户机。
客户机RPC 运行时接收执行结果,传递给客户机 stub,客户机 stub 再把它传递给客户机进程。客户机应用程序从客户机 stub 接收结果并完成 RPC 调用。
SOAP:简单对象访问协议,是一种框架。轻量级的XML,RPC
NFS本身不是服务,是一种文件系统(network file system)。期望本机的某一个文件系统(如:共享处去一个目录/var/shared目录),可以被网络内别的主机访问到,并且可以进行操作。
当然,首先客户端必须首先挂载服务器共享的目录(mount),
服务器端:nfs-utils
/usr/sbin/rpc.mountd /usr/sbin/rpc.nfsd 核心进程
nfs启动的三个进程:
nfsd:文件传输进程,一般监听在2049/tcp
mounted:支持客户端挂载进程,端口会改变,半随机,启动时会向portmapper注册,但是一般可以自定义一个固定端口(防止占用一些特殊端口)
quotod:磁盘配额进程 ,端口会改变
为了防止两个客户端同时对nfs共享目录进行操作(文件崩溃),nfs引入了nfslock(分布式文件锁)机制。该nfslock由服务端提供,客户端申请操作文件,同时申请nfs服务端加锁。
前面提到,可以自定义一个固定端口(针对mounted和quotod),编辑/etc/sysconfig/nfs
rpcinfo -p localhost
可以查看rpc相关进程端口号
格式:/path/to/somedir CLIENT_LIST
每个客户在机件使用空白字符分割,每个客户端后面必须跟一个小括号,里面定义此客户访问特性,如访问权限等。如:172.25.0.0/16(ro,async) 192.168.1.0/24(rw,sync)
“#”开头是注释行
下载nfs server服务
yum install -y nfs-utils
下载安装nfs服务
systemctl start nfs
开启nfs服务
修改配置文件
ehco "/nfsshare 172.25.254.0/24(ro,sync)" > /etc/exports` 修改nfs配置文件:共享/nfsshare目录,允许172.25.254.0网段地址使用挂载,模式可以为(ro只读),(rw读写),(sync异步),(async同步)
systemctl restart nfs
开启nfs服务
相关命令:
rpcinfo -p localhost 查看portmapper端口情况
showmount -e nfs_server(IP) 查看nfs提供共享的文件系统
showmount -a nfs_server 查看nfs服务器所有被挂载的文件系统及其挂载的客户端对应关系列表
showmount -d nfs_server 显示nfs服务器所有导出的文件系统
exportfs命令:
-a:跟-r或-u同时使用,表示重新挂载所有文件系统或取消导出所有文件系统
-r:重新导出
-u:取消导出
-v:显示详细信息
客户端挂载(mount命令):
mount -t nfs NFS_SERVER:/PATH/TO/SOME_EXPORT /PATH/TO/SOMEWHERE
nfs是通过简单的id号映射来标识共享文件系统中文件的文件所属属性,如果server上有一个用户a的id号和client上另外一个用户b的id号相同,则可能同一个文件,在服务器上和客户端上看来,文件所属人,所属组是不同的。
vim /etc/fstab
172.25.254.111:/nfsshare /mnt nfs defaults,_rnetdev 0 0
服务器IP:服务器共享文件系统(目录) 本地挂载点 挂载类型(nfs) 默认挂载(_rnetdev:如果不存在就放弃挂载) 0 0
NFSv3:
1,客户端联系portmap,查看是不是RPC服务器,RPC 告诉客户端mounted进程的端口号
2,mounted的端口号回传给客户端后,客户端链接rpc_mounted,mounted认证客户端是否可以访问文件系统,如果可以,返回给客户端一个初始化文件句柄(类似于通行证)。
nfs是文件级别的共享,属于NAS,Network Attached Storage:网络附属存储