标签:nfs rpc
NFS(网络文件系统)
NFS原理简介
NFS是一个网络文件系统,它主要的功能就是将远程主机上的某一个目录(或者文件系统)挂载在本地主机上,因此,对于本地客户端来说,这个目录就好像是自己主机上面的一个文件系统或者分区一样。这样,本地客户端访问这个目录时,实际访问的就是远程主机的这个目录。但是对于客户端来说,这个过程是透明的。由于NFS服务支持的功能很多,且不同的功能需要不同的程序来完成,因此,这样每一个程序都需要一个特定的端口来负责响应和传输数据。而且这些端口都是随机产生的,且小于1024。由于启动服务的端口不固定,因此NFS客户端要想和服务器端建立连接则会非常的困难。因此,在这个过程中需要借助RPC协议来完成建立连接过程。
什么是RPC?
RPC全称Remote Procedure Call,远程过程调用。它工作在TCP和UDP的111端口上。它主要的功能就是记录了NFS各个服务所对应的端口号,并且将这些端口号返回给RPC客户端。这些端口号都是在NFS启动之后,NFS的各个服务向RPC服务器注册的。且这些端口号都是NFS服务随机产生的。由于RPC是一个C/S 架构,因此RPC有客户端和服务器端,且本地客户端和NFS服务器端建立连接的过程就是靠RPC的客户端和服务器端来完成的。
RPC的服务器端软件--portmap
RPC的服务器端软件叫做portmap,Portmap是一个Server,用于实现映射程序号和版本号至端口号,以便远程主机对其进行调用。Portmap自身监听在111端口,因此,所有的调用者可通过此端口向Portmap询问其期望通信的程序所监听的端口。但Portmap仅知悉当前主机的RPC。
启动时,每个RPC程序必须向Portmap进行注册,而在关闭时需要进行注销。
正常情况下,调用者首先与Portmap通信以获取其期望通信的远程程序所监听的端口,然后通过获取到的端口向对应的远程程序发送报文。
因此,本地客户端和NFS服务器的连接过程和传输流程应该是这样的:
1、本地客户端将读取数据(或者写入数据)的请求交个内核处理,因为跟硬件打交道的只有内核。内核在将该请求交给RPC client(这里并不是叫做RPC client,只是方便大家理解,就叫做RPC client吧)。
2、RPC client在与portmap的TCP和UDP的111端口建立连接,询问NFS的服务所对应的端口
3、portmap将NFS所对应的端口返回给RPC client端
4、RPC client端在与刚刚得知的NFS服务端口建立连接,这样NFS服务器就可以接受本地客户端的请求,再交给内核处理,再由内核在硬盘上面获取相应的数据,按照原路返回给本地客户端。
这样,一个完成的数据传输流程就完成了。
NFS服务器的安装
安装一个NFS服务器,只需要安装nfs-utils这个软件即可。安装这软件后,会生成许多的文件,在这里,我只介绍几个比较重要和常见的文件:
/etc/rc.d/init.d/nfs:这是nfs的服务脚本,该脚本的主要功能是管理客户端是否能够使用服务器文件系统挂载信息以及管理文件系统等功能。
/etc/rc.d/init.d/nfslock:这个脚本是用来锁定某个文件的,以防止多个用户同时修改某一个文件,造成系统混乱。
/etc/sysconfig/nfs:这个文件主要记录了NFS服务启动之后向rpc注册的端口信息及一些参数信息。如果想让NFS的其他服务的端口固定使用某一个端口,就可以修改这个文件中的参数。
/etc/exportfs:NFS的主配置文件,该文件规定了哪些目录可以被那些客户端访问,且访问时具有哪些访问特性。
/usr/sbin/exportfs:这个是维护NFS资源的一个命令,该命令可以重新挂载某些目录和卸载某些目录等功能。这是服务器端命令
/usr/sbin/showmount:这也是一个NFS系统命令,用来查看NFS挂载出来的某些目录资源。
exportfs和showmount命令的用法
exportfs
-a:跟-r和-u一起使用,用来重新挂载所有文件系统和取消挂载所有文件系统(或目录)
-r:重新挂载
-u:取消挂载
-v:显示详细信息
showmount
-e NFS_SERVER:查看NFS服务器已挂载的目录或者文件系统
-a NFS_SERVER:查看NFS服务器挂载的所有的目录或者文件系统和挂载的客户端的对应关系列表
-d NFS_SERVER:显示NFS服务器所有的目录(或文件系统)被客户端挂载的目录(或文件系统)列表
NFS的配置文件
/etc/exportfs这个文件里面定义了哪些目录(或文件系统)可以被哪些客户端主机访问,且具有哪些访问特性。文件格式为:
目录或文件系统 远程主机(访问特性)
说明:每个客户端(及远程主机)后面必须跟一个小括号,里面定义了此客户访问特性,如访问权限等。多个客户之间使用空白字符分隔。
例如:
/tmp 192.168.100.0/24(ro) localhost(rw)
这一行的意思是说NFS服务器上的/tmp可以被192.168.100.0/24这个网段内的主机访问,且权限为只读。也可以被本地访问,且权限为读写权限。
其中这些访问特性有:
ro:对挂载的目录具有可读权限
rw:对挂载出来的目录具有读写权限
sync:表示以同步方式将数据写入到内存和硬盘中去
nosync:表示以异步方式先将数据写入到内存中,然后再将数据写入到硬盘中去。
root_squash:客户端使用 NFS 文件系统的账号若为 root 时,则将身份由root转换成nfsnobody身份来登录。nfsnobody的权限最小,可以用来保障系统安全。
no_root_squash:表示不对root账号做转换,允许root账号登录系统
all_squash:表示不论nfs账号是什么,都转换成匿名用户(nobody)的账号来登录
anonuid:表示设定匿名用户(即nobody)的uid,这个uid必须在/etc/passwd文件中存在
anongid:设置匿名用户gid,这个gid也必须在/etc/group文件中存在
本文出自 “linux学习之路” 博客,请务必保留此出处http://xslwahaha.blog.51cto.com/4738972/1568026
标签:nfs rpc
原文地址:http://xslwahaha.blog.51cto.com/4738972/1568026