在RHEL/CentOS 7/8中配置NFS服务器和客户端的步骤

时间:2020-01-09 10:37:45  来源:igfitidea点击:

在本文中,我们将介绍:

  • NFSv2与NFSv3与NFSv4之间的比较

  • 如何在RHEL/CentOS 7/8 Linux中使用NFSv4配置NFS服务器和客户端

  • 如何在RHEL/CentOS 7/8 Linux中使用NFSv3和NFSv2配置NFS服务器和客户端

  • 在Linux中永久和非永久访问NFS共享

网络文件系统(NFS)是在Linux/UNIX世界中通过网络共享文件和应用程序的本地方法之一。
NFS与Microsoft Windows File Sharing有点类似,它使我们可以连接到远程文件系统(或者磁盘)并像使用本地驱动器一样使用它-一种方便的工具,可在用户之间共享文件和大存储空间。

NFS2与NFS3与NFSv4

NFSv2

  • 挂载请求是按主机授予的,而不是按用户授予的。

  • 此版本使用传输控制协议(TCP)或者用户数据报协议(UDP)作为其传输协议。

  • 版本2客户端可以访问的文件大小限制小于2GB。

NFSv3

  • 该版本比版本2具有更多功能,比版本2具有更高的性能,并且可以使用TCP或者UDP作为传输协议。

  • 根据NFS服务器本身的本地文件系统限制,客户端可以访问大小超过2GB的文件。

  • 挂载请求也是基于每个主机而不是每个用户授予的。

NFSv4

  • 该协议的该版本使用状态协议(例如TCP或者流控制传输协议(SCTP))作为其传输。

  • 在此版本的NFS中,不再需要RPC绑定协议的服务(例如rpc.mountd,rpc.lockd和rpc.statd),因为它们的功能已内置到服务器中

  • " NFSv4将这些先前完全不同的NFS协议合并为一个协议规范"。

  • 不再需要portmap服务。

  • 它包括对文件访问控制列表(ACL)属性的支持,并且可以同时支持版本2和版本3客户端。

  • NFSv4引入了伪文件系统的概念,该概念使NFSv4客户端可以查看和访问在NFSv4服务器上作为单个文件系统导出的文件系统。

在RHEL/CentOS 7/8中安装和配置NFS服务器(NFSv4)

  • 默认情况下,NFS服务器在Red Hat/CentOS 7/8中支持NFSv2,NFSv3和NFSv4连接。

  • 但是,我们也可以将NFS服务器配置为仅支持NFS版本4.0和更高版本。

  • 由于" NFSv4不需要rpcbind服务"来侦听网络,因此可以最大程度地减少系统上打开的端口和正在运行的服务的数量。

  • 当NFS服务器配置为仅NFSv4时,尝试使用NFSv2或者NFSv3挂载共享的客户端将失败,并显示以下错误:

Requested NFS version or transport protocol is not supported.

安装nfs-utils rpm

说明:

在RHEL系统上,我们必须具有RHN的有效订阅,或者我们可以配置本地脱机存储库,通过该本地脱机存储库,yum软件包管理器可以安装提供的rpm及其依赖项。

安装nfs-utils软件包:

# yum install nfs-utils

使用/etc/nfs/conf的NFS配置

从RHEL/CentOS 7.7开始,要配置NFS服务器,必须使用/etc/nfs.conf代替/etc/sysconfig/nfs。
由于我们计划仅启用NFSv4,因此我们将使用/etc/nfs.conf禁用较早的NFS版本。

[root@centos-8 ~]# vim /etc/nfs.conf
[nfsd]
 vers2=n
 vers3=n
 vers4=y
 vers4.0=y
 vers4.1=y
 vers4.2=y

(可选)禁用对RPCBIND,MOUNT和NSM协议调用的侦听,这在仅NFSv4的情况下是不必要的。
禁用相关服务:

[root@centos-8 ~]# systemctl mask --now rpc-statd.service rpcbind.service rpcbind.socket
Created symlink /etc/systemd/system/rpc-statd.service → /dev/null.
Created symlink /etc/systemd/system/rpcbind.service → /dev/null.
Created symlink /etc/systemd/system/rpcbind.socket → /dev/null.

配置NFS服务器后,重新启动NFS服务器以激活更改并启用它,使其在重启后自动启动。
我们还可以使用systemctl status nfs-server检查nfs状态。

[root@centos-8 ~]# systemctl restart nfs-server
[root@centos-8 ~]# systemctl enable nfs-server

使用netstat实用工具来列出侦听TCP和UDP协议的服务:

以下是仅NFSv4服务器上的netstat输出示例;还禁用了侦听RPCBIND,MOUNT和NSM的功能。
其中nfs是唯一的监听NFS服务:

[root@centos-8 ~]#  netstat --listening --tcp --udp | grep nfs
tcp        0      0 0.0.0.0:nfs             0.0.0.0:*               LISTEN
tcp6       0      0 [::]:nfs                [::]:*                  LISTEN

使用/etc/exports创建NFS共享

"/etc/exports"文件控制将哪些文件系统导出到远程主机并指定选项。
遵循以下语法规则:

  • 空行将被忽略。

  • 要添加评论,请以井号('#`)开始。

  • 我们可以用反斜杠(\)括起长行。

  • 每个导出的文件系统应位于其自己的单独行上。

  • 放置在导出文件系统之后的任何授权主机列表都必须用空格字符分隔。

  • 每个主机的选项必须直接在主机标识符后的括号中放置,主机和第一个括号之间不能有空格。

语法:

export host1(options1) host2(options2) host3(options3)

在此结构中:

  • export:导出目录

  • 主机:共享导出到的主机或者网络

  • options:用于主机的选项

我有一个文件夹"/nfs_shares",我们将在我们的NFS服务器上共享该文件夹

[root@centos-8 ~]# mkdir /nfs_shares

在此NFS配置指南中,我们使用rwno_root_squash权限向世界(*)创建NFS共享/nfs_shares

[root@centos-8 ~]# cat /etc/exports
/nfs_shares     *(rw,no_root_squash)

我们可以在NFS服务器的/etc/exports中使用的受支持选项的列表

secure:         The port number from which the client requests a mount must be lower than 1024. 
                This permission is on by default. To turn it off, specify insecure instead
ro:             Allows read-only access to the partition. This is the default permission whenever 
                nothing is specified explicitly
rw:             Allows normal read/write access
noaccess:       The client will be denied access to all directories below /dir/to/mount. 
                This allows you to export the directory /dir to the client and then to 
                specify /dir/to as inaccessible without taking away access to something like /dir/from
root_squash:    This permission prevents remote root users from having superuser (root) privileges 
                on remote NFS-mounted volumes. Here, squash literally means to squash the power of the remote root user
no_root_squash: This allows root user on the NFS client host to access the NFS-mounted directory with 
                the same rights and privileges that the superuser would normally have.
all_squash:     Maps all User IDs (UIDs) and group IDs (GIDs) to the anonymous user. The opposite option 
                is no_all_squash, which is the default setting.

刷新NFS共享

设置完/etc/exports文件后,使用exportfs命令告诉NFS服务器进程刷新NFS共享。

要导出/etc/exports文件中指定的所有文件系统:

[root@centos-8 ~]# exportfs -a

使用exportfs -r刷新共享并重新导出所有目录(可选,因为我们已经使用exportfs -a)

[root@centos-8 ~]# exportfs -r

要查看和列出可用的NFS共享,请使用exportfs -v

[root@centos-8 ~]# exportfs -v
/nfs_shares     (sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

提示:

每次在/etc/exports中进行任何更改时,都不需要重新启动nfs-server,可以使用exportfs -r来更新导出内容,或者可以执行systemctl reload nfs-服务器以刷新/etc/exports内容

其中

-r:  Re-exports all entries in the /etc/exports file. This synchronizes /var/lib/nfs/xtab 
     with the contents of /etc/exports file. For example it deletes entries from /var/lib/nfs/xtab 
     that are no longer in /etc/exports and removes the stale entries from the kernel export table.
-a:  Exports all entries in the /etc/exports file. It can also be used to unexport the exported 
     file systems when used along with the u option, for example exportfs -ua 
-v:  Print the existing shares
-u:  Unexports the directory /dir/to/mount to the host clientA

有关exportfs支持的选项的完整列表,请遵循exportfs的手册页

允许带防火墙的NFS服务器服务

我们将所有NFS服务添加到"防火墙"规则中,以允许NFS服务器客户端通信。

[root@centos-8 ~]# firewall-cmd --permanent --add-service mountd
success
[root@centos-8 ~]# firewall-cmd --permanent --add-service nfs
success
[root@centos-8 ~]# firewall-cmd --reload
success

在Linux客户端上访问NFSv4共享

临时访问NFS共享(非持久性)

  • 接下来,我们将使用" mount"命令来访问Linux客户端上的NFS共享。

  • 在此NFS配置指南示例中,我们明确定义了添加选项-o参数,以选择NFSv4作为挂载NFS共享的首选选项。

  • 由于我们使用的是mount命令,因此更改不会在重新引导后永久存在。

  • 来自nfs-server(centos-8)的/nfs_shares将被安装在nfs-client/mnt上。

[root@nfs-client ~]# mount -o nfsvers=4 10.10.10.12:/nfs_shares /mnt

如果我尝试使用NFSv3访问NFS共享,如我们在等待超时时间后所看到的,客户端将无法挂载NFS共享,因为"我们限制NFS服务器只允许NFSv4连接。
"

[root@nfs-client ~]# mount -o nfsvers=3 10.10.10.12:/nfs_shares /mnt
mount.nfs: No route to host

我们可以使用mount命令在nfs-client上列出NFS挂载点。

[root@nfs-client ~]# mount | grep nfs
10.10.10.12:/nfs_shares on /mnt type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.16,local_lock=none,addr=10.10.10.12)

要删除NFS共享访问权限,我们可以卸载挂载点

[root@nfs-client ~]# umount /mnt

允许永久访问NFS共享(持久)

要持续访问NFS共享(即在重新引导期间),则可以将安装点详细信息添加到/etc/fstab。
但是在使用它之前要小心,因为这将意味着NFS服务器始终可访问,并且在NFS客户端启动阶段会无法访问NFS服务器,因此"客户端可能无法启动"。

以以下格式在/etc/fstab中添加NFS挂载点详细信息。
这里的" 10.10.10.12"是我的NFS服务器。
我添加了一些添加的挂载选项rwsoft来访问NFS共享。

提示:

其中由于我已经在我的NFS配置步骤上以rw权限共享了我的NFS共享,因此我在客户端上使用rw,如果我们拥有只读的NFS共享,则在安装选项中相应地使用ro

10.10.10.12:/nfs_shares /mnt            nfs     rw,soft         0 0

接下来执行mount -a从/etc/fstab挂载所有分区。

[root@nfs-client ~]# mount -a

检查安装是否成功,并且可以在客户端上访问NFS共享。

[root@nfs-client ~]# mount | grep /mnt
10.10.10.12:/nfs_shares on /mnt type nfs4 (rw,relatime,vers=4.2,rsize=1048576,wsize=1048576,namlen=255,soft,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.16,local_lock=none,addr=10.10.10.12)

在RHEL/CentOS 7/8中安装和配置NFS服务器(NFSv3)

NFSv2和NFSv3严重依赖RPC处理客户端和服务器之间的通信。
Linux中的RPC服务由portmap服务管理。

以下列表显示了在Linux下促进NFS服务的各种RPC进程:

rpc.statd

  • 每当重新启动NFS服务器而没有正常关闭时,此过程负责向NFS客户端发送通知。

  • 当查询时,它向rpc.lockd提供有关服务器的状态信息。

  • 这是通过网络状态监视器(NSM)RPC协议完成的。
    这是一项可选服务,由nfslock服务自动启动。

  • NFSv4中不需要它。

rpc.rquotad

  • 顾名思义,rpc.rquotad提供了NFS和配额管理器之间的接口。

  • 如果NFS用户/客户端使用本地文件系统而不是通过NFS,它们将受到与他们相同的配额限制。

  • NFSv4中不需要它。

rpc.mountd

  • 当发出挂载分区的请求时,rpc.mountd守护程序将负责验证客户机是否具有发出请求的适当权限。

  • 该权限存储在/etc/exports文件中。

  • 它由NFS服务器初始化脚本自动启动。

  • NFSv4中不需要它。

rpc.nfsd

  • NFS系统的主要组件,这是NFS服务器/守护程序。

  • 它与Linux内核结合使用,以根据需要加载或者卸载内核模块。

  • 当然,它在NFSv4中仍然有用。

rpc.lockd

  • rpc.statd守护程序使用此守护程序在崩溃的系统上处理锁恢复。

  • 它还允许NFS客户端锁定服务器上的文件。

  • Nfslock服务不再在NFSv4中使用。

rpc.idmapd

  • 这是NFSv4 ID名称映射守护程序。

  • 通过将用户和组ID转换为名称,反之亦然,它为NFSv4内核客户端和服务器提供了此功能。

rpc.svcgssd

  • 这是服务器端rpcsec_gss守护程序。

  • rpcsec_gss协议允许使用gss-api通用安全API在NFSv4中提供高级安全性。

rpc.gssd

  • 这为NFSv4及更高版本中的身份验证机制提供了客户端传输机制。

安装nfs-utils和rpcbind以设置NFSv3

我们将安装nfs-utils,此外,我们还将需要rpcbind在Red Hat/CentOS 7/8 Linux中配置NFS服务器(NFSv3)。

说明:

在RHEL系统上,我们必须具有RHN的有效订阅,或者我们可以配置本地脱机存储库,通过该本地脱机存储库,yum软件包管理器可以安装提供的rpm及其依赖项。

[root@centos-7 ~]# yum -y install nfs-utils rpcbind

在Debian和Ubuntu上,我们应该安装以下rpms列表

# apt-get -y install nfs-common nfs-kernel-server rpcbind

启动nfs服务器,rpcind服务并检查nfs状态

我们不需要任何其他NFS配置即可配置NFS服务器(基本)。
但是我们可以检查/etc/sysconfig/nfs(如果使用RHEL/CentOS 7.6和更早版本)或者/etc/nfs.conf(如果使用RHEL/CentOS 7.7或者更高版本)以进行任何自定义。

[root@centos-7 ~]# systemctl enable nfs-server --now
Created symlink from /etc/systemd/system/multi-user.target.wants/nfs-server.service to /usr/lib/systemd/system/nfs-server.service.
[root@centos-7 ~]# systemctl enable rpcbind

检查nfs-serverrpcbind服务的nfs状态,以确保其处于活动状态并正在运行

[root@centos-7 ~]# systemctl status nfs-server
● nfs-server.service - NFS server and services
   Loaded: loaded (/usr/lib/systemd/system/nfs-server.service; enabled; vendor preset: disabled)
   Active: active (exited) since Sat 2017-04-18 17:03:24 IST; 8s ago
 Main PID: 1999 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/nfs-server.service
Apr 18 17:03:24 centos-7.example.com systemd[1]: Starting NFS server and services...
Apr 18 17:03:24 centos-7.example.com systemd[1]: Started NFS server and services.

说明:

每当启动nfs服务器时,systemd都会自动启动rpcbind(作为依赖项),因此我们无需单独显式启动rpcbind。

[root@centos-7 ~]# systemctl status rpcbind
● rpcbind.service - RPC bind service
   Loaded: loaded (/usr/lib/systemd/system/rpcbind.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2017-04-18 17:03:18 IST; 20s ago
 Main PID: 1982 (rpcbind)
   CGroup: /system.slice/rpcbind.service
           └─1982 /sbin/rpcbind -w
Apr 18 17:03:18 centos-7.example.com systemd[1]: Starting RPC bind service...
Apr 18 17:03:18 centos-7.example.com systemd[1]: Started RPC bind service.

检查netstat输出以监听TCP和UDP端口

[root@centos-7 ~]# netstat -ntulp | egrep nfs\|rpc
tcp        0      0 0.0.0.0:42725           0.0.0.0:*               LISTEN      1991/rpc.statd
tcp        0      0 0.0.0.0:20048           0.0.0.0:*               LISTEN      1995/rpc.mountd
tcp6       0      0 :::20048                :::*                    LISTEN      1995/rpc.mountd
tcp6       0      0 :::44816                :::*                    LISTEN      1991/rpc.statd
udp        0      0 0.0.0.0:880             0.0.0.0:*                           1982/rpcbind
udp        0      0 127.0.0.1:895           0.0.0.0:*                           1991/rpc.statd
udp        0      0 0.0.0.0:20048           0.0.0.0:*                           1995/rpc.mountd
udp        0      0 0.0.0.0:51945           0.0.0.0:*                           1991/rpc.statd
udp6       0      0 :::880                  :::*                                1982/rpcbind
udp6       0      0 :::20048                :::*                                1995/rpc.mountd
udp6       0      0 :::42581                :::*                                1991/rpc.statd

我们可以将此输出与NFSv4设置进行比较,这里与NFSv4相比,我们使用NFSv3运行的端口和服务数量更多

创建NFS共享

接下来,我们将创建一个目录,可以在NFS服务器上共享该目录。
在此NFS配置指南中,我将创建一个新目录/nfs_shares以供NFS客户端共享。

[root@centos-7 ~]# mkdir /nfs_shares

NFSv4和NFSv3之间创建NFS共享的语法和过程相同

语法:

export host1(options1) host2(options2) host3(options3)

在此结构中:

  • export:导出目录

  • 主机:将导出共享到的主机或者网络

  • 选项:用于主机的选项

在此NFS配置指南中,我们使用rwno_root_squash权限向世界(*)创建NFS共享/nfs_shares

[root@centos-7 ~]# cat /etc/exports
/nfs_shares     *(rw,no_root_squash)

NFSv3配置支持的选项列表与我在本文的NFSV4部分共享的选项列表相同。

刷新NFS共享

配置NFS服务器并设置/etc/exports文件后,使用exportfs命令告诉NFS服务器进程刷新NFS共享。

要导出/etc/exports文件中指定的所有文件系统:

[root@centos-7 ~]# exportfs -a

提示:

我更喜欢使用exportfs -r,因为转口是股份。
NFSv3和NFSv4之间的exportfs支持的选项列表与我在本文上面共享的相同。

列出服务器上当前导出的NFS共享。
此命令还将显示应用于NFS共享的默认权限。

[root@centos-7 ~]# exportfs -v
/nfs_shares     (sync,wdelay,hide,no_subtree_check,sec=sys,rw,secure,no_root_squash,no_all_squash)

允许带防火墙的NFS服务器服务

我们可以从共享的netstat输出中获取NFSv3使用的NFS和rpcbind端口的列表,相反,我们将使用服务列表来允许NFSV3的防火墙访问

[root@centos-7 ~]# firewall-cmd --permanent --add-service nfs
success
[root@centos-7 ~]# firewall-cmd --permanent --add-service mountd
success
[root@centos-7 ~]# firewall-cmd --permanent --add-service rpc-bind
success

重新加载防火墙服务以使更改持久化

[root@centos-8 ~]# firewall-cmd --reload
success

在Linux客户端上访问NFSv3共享

临时访问NFS共享(非持久性)

  • 接下来,我们将使用mount命令来访问Linux客户端上的NFS共享。

  • 这些更改将无法在重新启动后保留下来,并且将是非永久性的。

  • 在此NFS配置指南示例中,我们明确定义了其他选项-o参数,以选择NFSv3作为挂载NFS共享的首选选项。

[root@nfs-client ~]# mount -o nfsvers=3 10.10.10.2:/nfs_shares /mnt

检查安装是否成功

[root@nfs-client ~]# mount | grep /mnt
10.10.10.2:/nfs_shares on /mnt type nfs (rw,relatime,vers=3,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.10.10.2,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=10.10.10.2)

如果我尝试使用NFSv4访问NFS共享

[root@nfs-client ~]# mount -o nfsvers=4 10.10.10.2:/nfs_shares /mnt

如我们所见,"即使使用NFSv4,也允许客户端访问NFS共享",因此我们看到,由于我们没有将NFS服务器限制为仅使用NFSv3,因此它也允许NFSv4连接。

[root@nfs-client ~]# mount | grep /mnt
10.10.10.2:/nfs_shares on /mnt type nfs4 (rw,relatime,vers=4.2,rsize=524288,wsize=524288,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=10.10.10.16,local_lock=none,addr=10.10.10.2)

我们可以使用与我在NFSv4下列出的命令相同的命令列表为客户端上的NFSv3挂载列出NFS挂载点。

要删除NFS共享访问权限,我们可以卸载挂载点

[root@nfs-client ~]# umount /mnt

允许永久访问NFS共享(持久)

要持续访问NFS共享(即在重新引导期间),则可以将挂载点详细信息添加到/etc/fstab中。
但是在使用它之前要小心,因为这将意味着NFS服务器始终可访问,并且在NFS客户端启动阶段,该NFS服务器无法访问,因此客户端可能无法启动。

以以下格式在/etc/fstab中添加NFS挂载点详细信息。
这里10.10.10.2是我的NFS服务器。
我添加了一些除默认值以外的其他挂载选项,例如" defaults"," soft"和" nfsvers = 3",以仅使用v3协议访问NFS共享。

10.10.10.2:/nfs_shares  /mnt    nfs     defaults,soft,nfsvers=3         0 0

接下来执行mount -a/etc/fstab挂载所有分区。

[root@nfs-client ~]# mount -a

检查安装是否成功,并且可以在客户端上访问NFS共享。

[root@nfs-client ~]# mount | grep /mnt
10.10.10.2:/nfs_shares on /mnt type nfs (rw,relatime,vers=3,rsize=524288,wsize=524288,namlen=255,soft,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=10.10.10.2,mountvers=3,mountport=20048,mountproto=udp,local_lock=none,addr=10.10.10.2)