nfs服务器详解

avatar
作者
猴君
阅读量:0

        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,asyncsync代表数据会同步写入到内存与硬盘中,async则代表数据会 先暂存于内存当中,而非直接写入硬盘
no_root_squash root_squash若客户端在共享目录里创建的文件的所属者和所属组是root用户 和root组,那么显示文件的属主和属组时有以下两种情况: no_root_squash表示,文件的所属者和所属组是root用户和 root组;root_squash表示将root用户和组映射为匿名用户和组 (默认设置)。
all_squash no_all_squashall_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挂掉时:

在客户端上就会造成挂载目录卡掉:

        造成卡顿状态的原因:因为客户端上一直挂载着,当你去访问这些文件系统时它就会一直尝试去挂载服务端。但是服务器这边不能被访问,所以就一直开在这种状态。

解决办法:重启客户端

广告一刻

为您即时展示最新活动产品广告消息,让您随时掌握产品活动新动态!