rpc概念及nfs的基本应用
远程系统调用
nfs:network file system
传统意义上,文件系统在内核中实现
最常见的文件系统调用:read()、open()、write()、close()
rpc(remote procedure call protocol)远程过程系统调用
一部分功能由本地程序完成
另一部分功能由远程主机上的函数完成
一个程序在运行中,不可避免的运行一些特权功能或者其他进程所实现的功能,以操作系统为例,
很多需要共同共享的功能,我们就需要把他做成共享库。所以一些功能在使用时可能需要调用一些本地的函数库,
当一个程序运行过程中需要调用本地的函数库时,进程就会停下来转而进入内核模式,由内核空间代为执行所用所要实现的代码,
代码完成后,内核会返回给进程,所以就如下图,分为两段
但有时候一个程序所需要调用的功能并非是本地程序,是由另外一台完成的,是通过网络送到另外一台主机上,
所以远程主机需要通过某一个服务器程序代为监听在某个服务器的套接字上,可以接受客户端主机应用程序的请求。
当服务器接收到客户端的函数调用请求,服务器端某个进程注册的套接字会把请求发送到该进程,
进程可以理解远程发来的是一个函数调用,函数调用有时候是有参数的,服务器端的进程会找到客户端请求的函数,
并把用户调用的参数传递给该函数,并让参数在本地函数库运行一下,运行后的结果会返回给服务器端的进程,
该进程会把结果封装成rpc协议报文,传回客户端。
NFS工作原理
当一个和文件管理相关的命令,在用户空间发出查看某一个文件下的目录的时候,比如是挂载的目录/shared/nfs/,这是另外一个主机的文件系统,这是进程会向本地的主机发起请求,但本地并没有这个文件系统,本地内核表现为nfs模块的,当用户空间发起请求,内核中的nfs模块是可以识别的,nfs模块就会通过rpc协议封装去请求文件系统所在的远程主机,
这里请求的不是一个特定的资源请求而是函数执行调用请求。
一、NFS介绍-->转载自http://blog.51cto.com/atong/1343950
1)什么是NFS
它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录。NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中。在本地的NFS客户端的机器看来,NFS服务器端共享的目录就好像自己的磁盘分区和目录一样。一般客户端挂载到本地目录的名字可以随便,但为方便管理,我们要和服务器端一样比较好。
NFS一般用来存储共享视频,图片等静态数据。
《什么是NFS》
就是通过网络共享目录,让网络上的其他服务器能够挂载访问共享目录内的数据。(一般共享视频,图片等静态数据)
这个再往简单点,就相当于windows里面共享文件,然后其他主机把这个共享文件映射成了本地盘使用一样。接下来我们会学习两部分:NFS原理(共享原理)、服务端如何架NFS(怎么共享)、客户端怎么挂载(怎么映射网盘)
挂载结构图
2)NFS挂载原理介绍
如上图,当我们在nfs服务器设置好一个共享目录/data后,其他的有权访问NFS服务器的NFS客户端就可以将这个目录挂载到本地。并且能够看到服务端/data的所有数据。因为挂载在本地的/data目录,其实就是服务器端的/data目录。如果服务器端配置的客户端只读,那么客户端就只能够只读。如果配置读写,客户端就能够进行读写。挂载后,NFS客户端查看磁盘信息命令:#df –h
NFS是通过网络来进行服务端和客户端之间的数据传输。两者之间要传输数据就要有想对应的网络端口来进行传输。NFS服务器到底使用什么网络端口来传输数据的,NFS服务器端其实是随机选择端口来进行数据传输。那NFS客户端又是如何知道NFS服务器端到底使用的是哪个端口呢?其实NFS服务器时通过远程过程调用(remote procedure call 简称RPC)协议/服务来实现的。也就是说RPC服务会统一管理NFS的端口,客户端和服务端通过RPC来先沟通NFS使用了哪些端口,之后再利用这些端口(小于1024)来进行数据的传输。
PS:哦,原来是RPC管理服务端的NFS端口分配,客户端要传数据,那客户端的RPC会先跟服务端的RPC去要服务器的端口,要到端口后再建立连接,然后传输数据。
《rpc与nfs》
pc(portmap)就是用来统一管理NFS端口的服务,并且统一对外的端口是111。NFS服务端需要先启动rpc,再启动NFS,这样NFS才能够到RPC去注册端口信息。客户端的RPC可以通过向服务端的RPC请求获取服务端的NFS端口信息。当获取到了NFS端口信息后,就会以实际端口进行数据的传输。(由于NFS端口为随机的。)
《RPC和NFS如何通讯》
因为NFS有很多功能,不同的功能需要使用不同的端口。因此NFS无法固定端口。而RPC会记录NFS端口的信息,这样我们就能够通过RPC实现服务端和客户端的RPC来沟通端口信息。
那RPC和NFS之间又是如何之间相互通讯的?
首先当NFS启动后,就会随机的使用一些端口,然后NFS就会向RPC去注册这些端口。RPC就会记录下这些端口。并且RPC会开机111端口,等待客户端RPC的请求,如果客户端有请求,那服务端的RPC就会将记录的NFS端口信息告知客户端。
提示:在启动NFS SERVER之前,首先要启动RPC服务(即portmap服务,下同)否则NFS SERVER就无法向RPC服务区注册,另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会全部丢失。因此此时RPC服务管理的NFS程序也要重新启动以重新向RPC注册。特别注意:一般修改NFS配置文档后,是不需要重启NFS的,直接在命令执行/etc/init.d/nfs reload或exportfs –rv即可使修改的/etc/exports生效。
PS:这里有个启动顺序的点,先给大家讲清楚。因为NFS要想RPC注册端口信息。所以RPC一定要先于NFS早启动。我给大家比喻一个左手叠右手的游戏,此时就是一定要确保NFS的手掌(左)在RPC手掌(右)的上面。正常顺序是要RPC先叠上去,然后NFS再叠上去。如果RPC重启了,就相当于手掌抽出来了,然后重新叠上去。这样RPC就在NFS上面了,所以不行。此时我们的NFS就需要再重新启动一次。这样NFS抽出来然后再叠上去之后,NFS就在RPC上面了。如果NFS修改了配置,就直接reload就好了
《客户端NFS和服务端NFS通讯过程》
1)首先服务器端启动RPC服务,并开启111端口
2)启动NFS服务,并向RPC注册端口信息
3)客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
4)服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
5)客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。
rpc调用步骤。客户端应用程序在运行时发起一个系统调用,通过rpc协议借用tcp/ip发送给服务端主机,
服务端接收到某个函数请求和参数,发起本地服务,调用本地实现函数或者过程,并把结果返回给本地进程,本地进程通过rpc协议,构建报文后相应给客户端。
NIS: network infomating system
身份认证不在本地验证,所有账号集中存放。验证信息都以明文方式传输,不建议在互联网上使用,只在局域网内部使用
要想使用本地操作系统需要先登录,登陆时账号不在本地的/etc/passwd文件中去找,用户登录程序login在用户输入账号后,账号被login程序打包发送到另外一台主机,由另外一台主机检查账号是否存在,如果账号存在,login程序就会返回一个password提示符,提示输入密码,输入密码后,密码再由login再借助于NIS打包发送到另外一台服务器,服务器会检查密码是否正确,如果正确,用户就登陆了
nfs:基于ip认证,监听在2049端口,服务器端需要启动nfsd、mountd、idmapd,mountd为半随机端口,所以必须监听rpc,查看111端口是否监听。#rpcinfo -p:查看启动状态
#rpcinfo -p 查看监听端口
rpcinfo - report RPC information
# rpm -ql nfs-utils | less
nfs监听的端口是由rpc决定的,当mountd启动后会向rpc服务请求端口,rpc服务会随机选择一个端口
nfs安装包:nfs-utils ,service nfs start 。
nfs主配置文件在/etc/exports,每一行一个文件系统例如:/opt/data 192.168.146.140(rw) 192.168.146.139(ro)
NFS:Network File System
NFS监听在TCP/UDP:2049端口;
nfs服务器:
[root@localhost ~]#yum -y install
[root@localhost ~]# lsmod | grep nfs //查看NFS的加载的模块,
[root@localhost ~]# systemctl start nfs
[root@localhost ~]# rpcinfo -p
/etc/exports 文件中的项的格式相当简单,要共享一个文件系统,只需要编辑/etc/exports并使用下面的格式给出这个文件系统(和选项即可);
directory (or file system) client1(option1,option2) client2(option1,option2)
/shared/nfs 192.168.108.129(rw) 192.168.108.166(ro)
/etc/exports:
文件系统 客户端(选项) 客户端(选项)
客户端:IP、FQDN
NFS文档。 此处摘抄自https://www.cnblogs.com/Juvenile/p/8030650.html
1:创建共享的目录:
mkdir /shared/nfs
2:共享目录
vim /etc/exports
/shared/nfs 192.168.214.147(rw)
/vat/ftp 192.168.0.0/24(rw)
3:查看共享的文件:
showmount -e NFS_SERVER_IP
# showmount -e 192.168.108.160
4:客户端挂载NFS文件系统
mount -t nfs SERVER:/PATH/TO/SHAREDFS /path/to/mount_point
[root@dongdongns2 ~]# mount -t nfs 192.168.214.140:/shared/nfs /mnt/
5:验证是否挂载成功;服务端操作
[root@localhost nfs]# cp /etc/issue /shared/nfs/
6:客户端进/mnt目录下查看即可;
~ [root@dongdongns2 ~]# cd /mnt/
[root@dongdongns2 mnt]# ls
issue
重新导出所以文件系统:用于维护。
exportfs -ar :重启到处所有的文件系统
exportfs -au :关闭导出的所有文件系统
exportfs -u :关闭指定的导出的文件系统
用户映射的选项包含:
root_squash:这个选项不允许root用户访问挂载上来的NFS卷
no_root_squash:这个选项允许root用户访问挂载上来的NFS卷
all_squash:这个选项对于公共访问的NFS卷来说非常有用,他会限制所以的UID和GID,只是用匿名用户,缺省是:no_all_squash;
anonuid和anongid:这两个选项将匿名UIDheGID修改程特定用户的组账号;
开机自动挂载NFS:
/etc/fstab
SERVER:/path/to/exprtoed_fs /mount_point nfs defaults,_netdev 0 0
#vim /etc/fstab
示例:
#mkdir /shared/nfs -pv
#vim /etc/exports
/shared/nfs 192.168.108.129(rw) 192.168.108.166(ro)
# service nfs restart 导出
# showmount -e 192.168.108.160 查看NFS服务器端共享的文件系统
# mount -t nfs 192.168.108.160:/shared/nfs /mnt //在192.168.108.129主机上挂载共享目录
#cp /etc/issue /shared/nfs/ //在192.168.108.160主机上把文件拷贝到共享目录里面
#ls /mnt 在129主机上可以看到共享目录里的内容
示例:
在192.168.108.160主机上,即/shared/nfs所在主机
#useradd -u 700 xiaoming
#setfacl -m u:xiaoming:rwx /shared/nfs
#su - xiaoming
#touch a.xiaoming
在192.168.108.129主机上,即/mnt所在主机
#useradd -u 700 xiaohong
#su - xiaohong
#cd /mnt
#touch a.xiaohong
//这里虽然没有定义xiaohong的权限,但是xiaohong依然是可以创建文件的,因为xiaohong和xiaoming的UID是相同的,
xiaohong在访问共享目录时别当作xiaoming了,NFS是依靠UID分辨用户的。nobody是idmap实现的效果
客户端默认选项为只读、异步、secure
secure: 使用 1024 以下的 TCP/IP 端口实现 NFS 的连接。如果端口不够用时需关闭,insecure 可以禁用这个选项。
rw:读写
async:异步
no_wdelay:
nohide:
no_subtree_check:
no_auth_nlm:
mp (mountpoint=path):
fsid=num:
查看NFS服务器端共享的文件系统:
showmount -e 192.168.146.138
挂载文件系统:
mount -t nfs 192.168.146.138:/opt/data /mnt
nfs映射用户选项:
root_squash:当客户端在用root登录时,服务端将映射为nfsnobody用户,默认开启
no_root_squash:不映射root用户,
all_squash:所有用户映射
anonuid 和 anongid:映射为指定用户和组
不用重启服务,读取/etc/export。
exportfs -ar:重新导出所有文件系统
-au:关闭导出所有文件系统
-u FS:指定关闭导出的文件系统
开机自动挂载nfs:
写在/etc/fstab
server:/path/ /mount_point nfs defaults,_netdev 0 0
192.168.146.138:/opt/data /mnt nfs defaults,_netdev 0 0
_netdev,指明为网络挂载系统,指定时间内开机挂载无法找到会放弃挂载,就跳过网络检查,系统可正常运行。
提高性能:
rsize 是服务器读取字节数。wsize 是写入到服务器字节数。默认1024,调整该值如8192,可以提高传输速度。
总结:
1、客户端表示方式
2、导出选项:
rw,async,sync,root_squash,no_root_squash,all_root_squash,anonuid,anongid
3、exportfs和showmount
2台web服务器,提供相同的访问页面,连接同一个数据库mariadb和nfs。