25.1 什么是 NFS
它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录。 NFS 服务器可以允许 NFS 客户端将远端 NFS 服务器端的共享目录挂载到本地的 NFS 客户端中。
在本地的 NFS 客户端的机器看来, NFS 服务器端共享的目录就好像自己的磁盘分区和目录一样。一般客户端挂载到本地目录的名字可以随便,但为方便管理,我们要和服务器端一样比较好。
NFS一般用来存储共享视频,图片等静态数据。
25.2 NFS 挂载原理
NFS 是通过网络来进行服务端和客户端之间的数据传输。两者之间要传输数据就要有想对应的网络端口来进行传输。NFS 服务器到底使用什么网络端口来传输数据的, NFS 服务器端其实是随机选择端口来进行数据传输。那 NFS 客户端 又是如何知道 NFS 服务器端到底使用的是哪个端口呢?其实 NF S 服务器时通过远程过程调用( remote procedur e call简称 RPC )协议 服务来实现的。也就是说 RPC 服务会统一管理 NFS 的端口,客户端和服务端通过 RPC 来先沟通 NFS 使用了哪些端口,之后再利用这些端口(小于 1024 )来进行数据的传输。
也就是 RPC 管理服务端的 NFS 端口分配,客户端要传数据,那客户端的 RPC 会先跟服务端的 RPC 去要服务器的端口,要到端口后再建立连接,然后传输数据。
-
那RPC 和 NFS 之间又是如何之间相互通讯的?
首先当NFS 启动后,就会随机的使用一些端口,然后 NFS 就会 向 RPC 去注册这些端口。 RPC 就会记录下这些端口。并且 RP C 会开启 111 端口,等待客户端 RPC 的请求,如果客户端有请求,那服务端的 RPC 就会将记录的 NFS 端口信息告知客户端。
-
RPC和 NFS 的启动顺序是怎样的?
在启动NFS SERVER 之前,首先要启动 RPC 服务(即 portmap 服务,下同)否则 NFS SERVER 就无法向 RPC 服务区注册,另外,如果 RPC 服务重新启动,原来已经注册好的 NFS 端口数据就会全部丢失。因此此时 RPC 服务管理的 NFS 程序也要重新启动以重新向 RPC 注册。特别注意:一般修改 NFS 配置文档后,是不需要重启 NFS 的,直接在命令执行/etc/init.d/nfs reload
-
总结:客户端NFS 和服务端 NFS 通讯过程
1)首先服务器端启动 RPC 服务,并开启 111 端口
2)启动 NFS 服务,并向 RPC 注册端口信息
3)客户端启动 RPC portmap 服务),向服务端的 RPC(portmap) 服务请求服务端的 NFS 端口
4)服 务端的 RPC(portmap) 服务反馈 NFS 端口信息给客户端。
5)客户端通过获取的 NFS 端口来建立和服务端的 NFS 连接并进行数据的传输。
25.3 NFS 相关协议及软件 安装管理
协议:
RPC Remote Procedure Call Protocol 远程过程调用协议
软件:
nfs utils --* :包括 NFS 命令与监控程序 ? rpcbind --* :支持安全 NFS RPC 服务的连接
注:通常情况下,是作为系统的默认包安装的 CentOS6.* 之前 rpcbind 叫 portmap
25.4 NFS 系统守护进程
nfs:它是基本的 NFS 守护进程,主要功能是管理客户端是否能够登录服务器
rpcbind:主要功能是进行端口映射工作。当客户端尝试连接并使用 RPC 服务器提供 的服务(如 NFS 服务)时, rpcbind会将所管理的与服务对应的端口提供给客户端, 从而使客户可以通过该端口向服务器请求服务。
25.5 NFS 服务器的配置
NFS服务器的配置相对比较简单,只需要在相应的配置文件中进行设置,然后启动 NFS 服务器即可。
NFS服务的配置文件为 /etc/exports ,这个文件是 NFS 的主要配置文件,不过系统并没有默认值,所以这个文件不一定会存在,可能要使用 vim 手动建立,然后在文件里面写入配置内容。
25.5.1 /etc/exports文件内容格式:
共享目录 客户端 1 (访问权限 用户映射 其他 客户端 2 (访问权限 用户映射 其他)
共享目录: 共享目录是指 NFS 服务器共享给客户机使用的目录
?
客户端: 客户端是指网络中可以访问 这个 NFS 共享目录的计算机
客户端常用的指定方式:
指定ip 地址的主机: 192.168.0.200
指定子网中的所有主机:192.168. 88 .0
指定域名的主机:www.atguigu.com
指定域中的所有主机:*.atguigu .com
所有主机:*
?
设置输出目录的访问权限、用户映射等。
25.5.2 访问权限选项:
设置输出目录只读:ro
设置输出目录读写:rw
25.5.3 用户映射选项:
root_squash:将 root 用户的访问映射为匿名( nfsnobody )用户 uid 和 gid ;(默认生效);
no_root_squash:保留管理员权限,以服务器管理员的权限管理;
all_squash:将远程访问的用户及所属组都映射为指定 uid 、 gid 的匿名用户;
anonuid=xxx :将远程访问的所有用户都映射为指定 uid 的匿名用户;
anongid=xxx :将远程访问的所有用户组都映射为指定 gid 匿名组账户;
25.5.4 其它选项:
sync:将数据同步写入内存缓冲区与磁盘中,效率低,但可以保证数据的一致性(同步);
?
async:将数据 先保存在内存缓冲区中,必要时才写入磁盘(异步);
25.6 NFS 服务器的启动与停止
1)启动 NFS 服务器
为了使NFS 服务器能正常工作,需要启动 rpcbind 和 nfs 两个服务,并且 rpcbind 一定要先于 nfs 启动。
service rpcbind start
?
service nfs start
2)查询 NFS 服务器状态
service rpcbind status
service nfs status
3)停止 NFS 服务器
要停止NFS 运行时,需要先停止 nfs 服务再停止 rpcbind 服务,对于系统中有其他服务 如 NIS) 需要使用时,不需要停止 rpcbind 服务
service nfs stop
service rpcbind stop
4)设置 NFS 服务器的自动启动状态
设置rpcbind 和 nfs 服务在系统运行级别 2345 自动启动。
chkconfig level 2345 rpcbind on
chkconfig level 2345 nfs on
5)查看 RPC 服务器开启了哪些端口
rpcinfo -p localhost
25.7 实验相关实例
1)将 NFS 服务器的 /home/zhangsan 共享给 192.168.115.0 网段, rw 权限
vim /etc/exports
/home/zhangsan 192.168.115.0 (rw)
2)重启 rpcbind 和 nfs 服务
service rpcbind restart
service nfs restart
exportfs
3)服务器端查看 nfs 共享状态
showmount -e 本机 ip
4)客户端查看 nfs 共享状态
showmount -e NFS 服务器 IP
5)客户端挂载 nfs 服务器共享目录
命令格式: mount NFS 服务器 IP: 共享目录 本地挂载点目录
mount 192.168.115.10:/home/zhangsan/ /media/zhangsan/
mount | grep nfs
mount -o vers=3 共享 本地 指定挂载使用 nfs V3 版本(避免同步延迟) 验证客户端和nfs 服务器端文件是否一致:
修改服务器端相应权限,不然客户端无法正常访问和使用
6)nfs 共享权限和访问控制
-
客户端 root 用户
使用客户端的root 身份在 nfs 服务器上创建文件,文件的所有者和所属组是 nfsnobody 。
-
客户端普通用户
使用客户端的普通用户身份在nfs 服务器上创建文件,所有者和所属组是 nobody 或普通用户。
如果明确设定了普通用户的映射用户 身份,那么此时客户端用户的身份转换为指定 映射 用户;
如果NFS server 上面有同名用户,那么此时客户端登录账户的身份转换为 NFS server 上面的同名用户;
7)卸载和自动挂载
卸载:
1. 卸载客户端的挂载目录
umoun -t 挂载点
2. 停止服务器端的共享
exportfs -au
自动挂载:/etc/fstab
格式: :<server>:</remote/export> </local/directory> nfs < options> 0 0
#192.168.115.10:/home/zhangsan /media/zhangsan nfs defaults 0 0
#mount a
25.8 相关命令
25.8.1 exportfs命令
如果我们在启动了NFS 之后又修改了 /etc/exports ,是不是还要重新启动 nfs 呢?这 个时 候我们就可以用 exportfs命令来使改动立刻生效,该命令格式如下:
格式:exportfs [ aruv]
-a 全部挂载或卸载 /etc/exports 中的内容
-r 重新读取 /etc/exports 中的信息 ,并同步更新 /etc/exports 、 /var/lib/nfs/xtab
-u 卸载单一目录(和 a 一起使用为卸载所有 /etc/exports 文件中的目录)
-v 在 export 的时候,将详细的信息输出到屏幕上。
示例:
exportfsau 卸载所有共享目录
exportfsra 重新共享所有目录并输出详细信息
25.8.2 rpcinfo 命令
利用rpcinfo p 可以查看出 RPC 开启的端口所提供的程序有哪些