nfs(网络文件系统)---------- 其实就是通过网络将文件共享出去。
通过TCP/IP网络去共享资源的。在NFS的应用中,本地NFS的客户端应用可以透明地读写位于远端NFS服务器上的文件,就像访问本地文件一样。
客户端和服务端需要去读写共享文件,那么就需要对应的程序来实现读写操作。
由于NFS支持的功能比较多,而不同的功能都会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此NFS的功能所对应的端口并不固定,而是随机取用一些未被使用的小于1024的端口用于传输。但如此一来就会产生客户端连接服务器的问题,因为客户端需要知道服务器端的相关端口才能够连接。
此时就需要RPC(Remote Procedure Call,远程过程调用)的服务。由于当服务器在启动NFS时会随机选取数个端口号,并主动向RPC注册,所以RPC知道每个NFS功能所对应的端口号,RPC将端口号通知给客户端,让客户端可以连接到正确的端口上去。RPC采用固定端口号port 111来监听客户端的需求并向客户端响应正确的端口号。
注:在启动NFS之前,要先启动RPC,否则NFS会无法向RPC注册。另外,RPC若重新启动,原来注册的数据会消失不见,因此RPC重启后,它管理的所有服务都需要重新启动以重新向RPC注册。
- 总结:NFS服务开启产生一个随机端口,NFS服务器会向RPC进行注册,在RPC上写清楚自己所开放的NFS服务的端口号。客户端访问NFS服务器时会首先访问RPC(端口号:111)获取NFS服务的端口,再通过该端口获取NFS服务器资源。
服务端配置
在配置服务端时涉及两个软件包:rpcbind和nfs-utils;
1.在配置服务端时我们需要先将两个软件包装好。
[root@localhost ~]# yum install rpcbind
[root@localhost ~]# yum install nfs-utils
我们需要设置谁是共享文件,将文件共享给谁。我们需要编辑/etc/exports ,如果没有exports文件我们可以自己新建一个exports文件。
[root@localhost ~]# vim /etc/exports -----编辑共享文件。
#共享目录 主机名(权限)
#可以使用完整的IP或者是网络号,例如172.24.8.128或172.24.8.0/24或者172.24.8.128/255.255.255.0;也可以使用*表示所有主机
2.创建共享目录并写入数据
[root@localhost ~]# mkdir /data
[root@localhost ~]# echo "this is text" > /data/file
3.写好后重启nfs服务
[root@localhost ~]# systemctl status nfs-server -----重启nfs服务
[root@localhost ~]# systemctl stop firewalld ------关闭防火墙
权限参数
参数值 | 说明 |
---|---|
rw,ro | 该目录共享的权限是可读写还是只读,但最终能否读写,还是与 文件系统的rwx有关 |
sync,async | sync代表数据会同步写入到内存与硬盘中,async则代表数据会 先暂存于内存当中,而非直接写入硬盘 |
no_root_squash root_squash | 若客户端在共享目录里创建的文件的所属者和所属组是root用户 和root组,那么显示文件的属主和属组时有以下两种情况: no_root_squash表示,文件的所属者和所属组是root用户和 root组;root_squash表示将root用户和组映射为匿名用户和组 (默认设置)。 |
all_squash no_all_squash | all_squash:客户端所有用户创建文件时,客户端会将文件的用户 和组映射为匿名用户和组no_all_squash:客户端普通用户创建的 文件的UID和GID是多少,服务端就显示为多少(默认设置) |
anonuid= anongid= | 将文件的用户和组映射为指定的UID和GID,若不指定默认为 65534(nfsnobody) |
客户端配置
1.首先在客户端上我们需要装一个包:nfs-utils
[root@localhost ~]# yum install nfs-utils -y
将包装好后,我们使用一个命令查看nfs服务器的共享文件:showmount
2.查看nfs服务器共享的文件,后面的ip为nfs服务器的ip地址。
3.将nfs服务器共享目录挂载到本地的某个文件中
[root@localhost ~]# mkdir /nfs -----创建一个挂载目录
[root@localhost ~]# mount 192.168.107.10:/data /nfs/ ------挂载
查看挂载情况:发现挂载成功。
此时在本地的/nfs文件中查看:发现nfs服务器的共享文件出现在该文件中(挂载成功)
客户端的自动挂载
在一般NFS文件系统的使用过程中,如果客户端要使用服务端所提供的文件系统,可以在 /etc/rc.d/rc.local 中设置开机时自动挂载( /etc/rc.d/rc.local 文件中写入的命令,在每次启动系统用户登录之前都会执行一次);也可以在登录系统后手动利用mount来挂载。 由于网络的问题,NFS服务器与客户端的连接不会一直存在,当我们挂载了NFS服务器之后,任何一方脱机都可能造成另外一方等待超时。为了解决这样的问题,就出现了下面的想法:
-
当客户端在有使用NFS文件系统的需求时才让系统自动挂载。
-
当NFS文件系统使用完毕后,让NFS自动卸载。
于是就产生了autofs这个服务。
autofs这个服务是在客户端的上面,它会持续的检测某个指定的目录,并预先设置当使用到该目录的某个子目录时,将会取得来自服务器端的NFS文件系统资源,并进行自动挂载的操作。
自动挂载功能会使用到一个软件: autofs
[root@localhost nfs]# yum install autofs -y -----下载软件包
[root@localhost ~]# vim /etc/auto.master -----编辑该文件
[root@localhost ~]# grep haha /etc/auto.master
/test /etc/haha
本地端的目录文件 挂载配置文件(在该文件中去写挂载的具体信息)
[root@localhost ~]#
[root@localhost ~]# vim /etc/haha ------编辑挂载配置文件
[root@localhost ~]# cat /etc/haha
shuju 192.168.107.10:/data (吧data挂载到本地的shuju下边),这里只写了一个名字没有写路径它会将 shuju放到/test下。
自动挂载解释:autofs会去检测类似与我们之前写的/test目录,看有没有人去访问这些目录;如果有人去访问/test下的数据,它就会去读配置文件/etc/haha,将192.168.107.10:/data挂载到/test/shuju。
[root@localhost ~]# systemctl restart autofs -----启动自动挂载服务。
[root@localhost ~]# systemctl stop firewalld -----关闭防火墙
此时就可以发现挂载成功:
情况一:
当nfs给客户端的权限为rw时:
我们在客户端的挂载文件中写入时提示权限被拒绝(即使客户端的用户为root)
此时我们需要考虑当前账户对目录的权限:这里的root是客户端的root,不是服务端的root。这里的root是不一样的。客户端的root在服务端不被当作root,客户端的root被服务端当成nobady;
那么此时客户端root账号对于该文件的权限为其他人的权限:r-x
此时我们需要到nfs服务端给其他人加上W的权限:
当给了权限后,我们再到客户端上去创建新文件,此时发现已经有权限并能够成功创建:
情况二:
当nfs的服务端的nfs挂掉时:
在客户端上就会造成挂载目录卡掉:
造成卡顿状态的原因:因为客户端上一直挂载着,当你去访问这些文件系统时它就会一直尝试去挂载服务端。但是服务器这边不能被访问,所以就一直开在这种状态。
解决办法:重启客户端