当前位置: 首页 > article >正文

NFS网络文件共享服务

文章目录

  • 1. NFS工作原理
    • 1.1 挂载结构介绍
    • 1.2 NFS的工作原理
  • 2. NFS服务安装
    • 2.1 NFS软件列表
    • 2.2 启动NFS相关服务
    • 2.3 NFS服务常见进程
    • 2.4 实战配置NFS服务器端
  • 3. NFS服务配置
    • 3.1 在NFS Server端执行的操作
      • 3.1.1 查看部署环境
      • 3.1.2 启动rpcbind及NFS服务,然后加入开机自启动
      • 3.1.3 配置NFS服务配置文件,并在本地查看挂载信息情况
      • 3.1.4 创建需要共享的目录并授权
    • 3.2 在NFS Client端执行的操作
      • 3.2.1 检查环境
      • 3.2.2 安装rpcbind及NFS服务
      • 3.2.3 挂载NFS共享目录
    • 3.3 补充
  • 4. 补充总结
    • 4.1 NFS服务的重点知识梳理
    • 4.2 NFS客户端挂载排错
    • 4.3 客户端挂载命令详解
    • 4.4 客户端挂载优化
    • 4.5 NFS客户端开机自启动挂载


在当今的网络环境中,数据的共享和存储变得至关重要。NFS(Network File System),即网络文件系统,作为一种通过网络共享目录的重要工具,正发挥着不可或缺的作用。它能够让网络上的其他服务器方便地挂载访问共享目录的数据,尤其适用于存放视频、附件、图片等静态数据。本文将深入探讨 NFS 的工作原理、服务安装等相关内容,帮助了解和使用 NFS。


  • NFS简单介绍

NFS(Network File System)中文意思是网络文件系统。主要功能是通过网络共享目录,让网络上的其他服务器能够挂载访问共享目录的数据(NFS一般都是用来存放视频、附件、图片等静态数据的)。NFS客户端(一般为应用服务器,如 Web)可以通过挂载方式将NFS服务器端共享的数据目录挂载到NFS本地客户端(就是某一个挂载点下)。从本地客户端来看,NFS服务器端共享的目录就好像是客户端自己的磁盘分区或者目录一样,而实际上却是远端的NFS服务器的目录。

1. NFS工作原理

1.1 挂载结构介绍

在这里插入图片描述

在 NFS服务器端设置好一个共享目录 /video 后,其他有权限访问NFS服务器端的客户端都可以将这个共享目录 /video 挂载到本地客户端的某个挂载点(其实就是一个目录,这个挂载点目录可以自己随意指定),图中的两个NFS本地客户端的挂载点均为 /video ,但是不同客户端的挂载点可以不相同。


客户端正确挂载完毕后,就进入到NFS客户端挂载点所在的 /video 目录,此时可看到NFS服务器端 /video 共享目录下的所有数据。在客户端上查看时,NFS服务器端 /video 目录就相当于本地客户端磁盘分区或目录,几乎感觉不到使用上的区别,根据NFS服务器端授予的NFS 共享权限以及共享目录本地系统权限,只要在指定NFS客户端操作挂载 /video 目录,就可以将数据轻松地存取到NFS服务器端的 /video 目录。

客户端挂载NFS后,本地挂载基本信息显示如下:

[root@web01 ~]# df -h
Filesystem         Size  Used Avail Use% Mounted on
devtmpfs           476M     0  476M   0% /dev
tmpfs              487M     0  487M   0% /dev/shm
tmpfs              487M  7.7M  479M   2% /run
tmpfs              487M     0  487M   0% /sys/fs/cgroup
/dev/sda3           17G  2.7G   15G  16% /
/dev/sda1         1014M  161M  854M  16% /boot
tmpfs               98M     0   98M   0% /run/user/0
172.16.1.31:/video    17G  2.7G   15G  16% /video

# 172.16.1.31为nfs server的IP地址

从挂载信息来看,和本地的磁盘分区几乎没什么差别,只是文件系统对应列的开头是以IP地址开头的形式了。

1.2 NFS的工作原理

在这里插入图片描述

工作流程:

  1. 首先服务端会启动 RPC服务,并开启111端口
  2. 服务端启动 NFS服务,并向RPC注册端口
  3. 客户端启动RPC服务,向服务端的RPC服务请求获取NFS端口
  4. 服务端的RPC服务反馈端口给客户端的
  5. 客户端通过服务端的RPC反馈回来的端口和服务端进行数据传输
  • RPC服务的引入

NFS支持的功能相当多,而不同的功能会使用不同的程序来启动,每启动一个功能就会启用一些端口来传输数据,因此,NFS的功能所对应的端口无法固定,会随机取用一些未被使用的端口作为传输之用。
因为端口不固定,这样一来就会造成NFS客户端与NFS服务器端的通信障碍,需要通过远程过程调用RPC服务来帮忙了,NFS的RPC服务最主要的功能就是记录每个NFS 功能所对应的端口号,并且在NFS客户端发出请求时将该端口和功能对应的信息传递给请求数据的NFS客户端,从而确保客户端可以连接到正确的NFS端口上去,达到实现数据传输、交互数据目的。

  • RPC 服务又是如何知道每个NFS端口的呢?

NFS服务器端启动服务时会随机取用若干端口,并主动向RPC服务注册取用的相关端口及功能信息,如此一来,RPC服务就知道NFS每个端口对应的NFS功能了,然后RPC服务使用固定111端口来监听NFS客户端提交的请求,并将正确的NFS端口信息回复给请求的NFS客户端,这样一来,NFS客户端就可以与NFS服务器端进行数据传输了。
所以在启动NFS服务之前,首先要启动RPC服务,否则NFS服务就无法向RPC服务注册了。另外,如果RPC服务重新启动,原来已经注册好的NFS端口数据就会丢失,因此,此时RPC服务管理的NFS程序也需要重新启动以重新向RPC注册。要特别注意,修改NFS配置文件后是不需要重启NFS的,直接在命令行执行systemctl reload nfsexportfs -rv即可使修改生效。

  • NFS启动介绍

在这里插入图片描述

当访问程序通过NFS客户端向NFS服务器端存取文件时,其请求数据流程大致如下:

  1. 用户访问网站程序,由程序在NFS 客户端上发出存取NPS 文件请求,这时NFS客户端(执行程序的服务器)的RPC服务( rpcbind服务)就会通过网络向NFS服务器端的RPC 服务的111端口发出NFS文件存取功能的询问请求。
  2. NFS服务器RPC服务找到对应已注册的NFS端口后,通知NFS客户端RPC服务。
  3. 此时NFS客户端获取到正确的端口,并与 NFS daemon 联机存取数据。
  4. NFS客户端将数据存取成功后返回给前端访问程序,告知给用户存取结果,就完成了一次存取操作。
  • 总结

NFS的各项功能都需要向RPC服务注册,所以只有RPC服务才能获取到NFS服务的各项功能对应的端口号(port number)、PID、NFS在主机所监听的IP等信息,而NFS客户端也只能通过向RPC服务询问才能找到正确的端口。

也就是说,NFS需要有RPC服务的协助才能成功对外提供服务。

所以无论是NFS客户端还是NFS服务器端,当要使用NFS时都需要首先启动RPC服务,NFS服务必须在RPC 服务启动之后启动,客户端无须启动NFS服务,但需要启动RPC服务。

2. NFS服务安装

2.1 NFS软件列表

要部署NFS服务,需要安装以下软件包。

  • nfs-utils:NFS服务的主程序,包括rpc.nfsdrpc.mountd这两个daemons和相关文档说明,以及执行命令文件等。
  • rpcbind:CentOS6/7环境下RPC主程序。NFS可视为一个RPC程序,在启动任何一个RPC程序之前,需要做好端口和功能的映射工作,这个映射工作就是由rpcbind服务来完成的。因此,在提供NFS服务之前必须先启动rpcbind服务才行。

使用如下命令查看默认情况下NFS软件的安装情况。

[root@nfs ~]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-49.el7.x86_64
nfs-utils-1.3.0-0.68.el7.2.x86_64

CentOS7默认没有安装 NFS软件包,可以使用yum install nfs-utils rpcbind -y命令来安装NFS软件。

2.2 启动NFS相关服务

因为NFS及其辅助程序都是基于RPC 协议的(使用的端口为111),所以首先要确保系统中运行了rpcbind服务。

# 启动RPC
[root@nfs ~]# systemctl start rpcbind.service 
[root@nfs ~]# systemctl enable rpcbind.service

# 查看有没有注册的端口 111
[root@nfs ~]# rpcinfo -p 127.0.0.1
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper

# 启动NFS
[root@nfs ~]# systemctl start nfs
[root@nfs ~]# systemctl enable nfs

# 查看NFS服务向RPC服务注册的端口信息,NPS服务启动后,端口信息就增多了,有很多端口和功能的对应。
[root@nfs ~]# rpcinfo -p 127.0.0.1
   program vers proto   port  service
    100000    4   tcp    111  portmapper
    100000    3   tcp    111  portmapper
    100000    2   tcp    111  portmapper
    100000    4   udp    111  portmapper
    100000    3   udp    111  portmapper
    100000    2   udp    111  portmapper
    100024    1   udp  59188  status
    100024    1   tcp  45013  status
    100005    1   udp  20048  mountd
    100005    1   tcp  20048  mountd
    100005    2   udp  20048  mountd
    100005    2   tcp  20048  mountd
    100005    3   udp  20048  mountd
    100005    3   tcp  20048  mountd
    100003    3   tcp   2049  nfs
    100003    4   tcp   2049  nfs
    100227    3   tcp   2049  nfs_acl
    100003    3   udp   2049  nfs
    100003    4   udp   2049  nfs
    100227    3   udp   2049  nfs_acl
    100021    1   udp  37180  nlockmgr
    100021    3   udp  37180  nlockmgr
    100021    4   udp  37180  nlockmgr
    100021    1   tcp  40925  nlockmgr
    100021    3   tcp  40925  nlockmgr
    100021    4   tcp  40925  nlockmgr

2.3 NFS服务常见进程

从上面NFS服务的启动过程可以看出,运行NFS服务默认需要启动的服务或进程有NFS daemonNFS mountd(rpc.mountd)rpc.statdrpc.idmapd 等。可以通过执行如下命令查看启动NFS后系统中运行的NFS相关进程:

[root@nfs01 ~]# ps -ef|egrep "rpc|nfs"
rpc        1356      1  0 16:32 ?        00:00:00 /sbin/rpcbind -w
rpcuser    1395      1  0 16:34 ?        00:00:00 /usr/sbin/rpc.statd   # 检查文件一致性
root       1402      2  0 16:34 ?        00:00:00 [rpciod]
root       1410      1  0 16:34 ?        00:00:00 /usr/sbin/rpc.idmapd  # 名称映射进程
root       1417      1  0 16:34 ?        00:00:00 /usr/sbin/rpc.mountd  # 权限管理验证
root       1422      2  0 16:34 ?        00:00:00 [nfsd4_callbacks]
root       1428      2  0 16:34 ?        00:00:00 [nfsd]                # NFS主进程,管理登入ID身份判别
root       1429      2  0 16:34 ?        00:00:00 [nfsd]
root       1430      2  0 16:34 ?        00:00:00 [nfsd]
root       1431      2  0 16:34 ?        00:00:00 [nfsd]
root       1432      2  0 16:34 ?        00:00:00 [nfsd]
root       1433      2  0 16:34 ?        00:00:00 [nfsd]
root       1434      2  0 16:34 ?        00:00:00 [nfsd]
root       1435      2  0 16:34 ?        00:00:00 [nfsd]
root       1494   1101  0 16:53 pts/0    00:00:00 grep -E --color=auto rpc|nfs

NFS 服务的主要任务是共享数据,而数据的共享离不开权限问题。所以NFS服务器启动时最少需要两个不同的进程,一个是管理 NFS客户端是否能够登录的rpc.nfsd主进程,另一个管理 NFS客户端是否能够取得对应权限的rpc.mountd进程。如果还要管理磁盘配额,则NFS还需要加载rpc.rquotad进程。

服务或进程名用途说明
nfsd(rpc.nfsd)rpc.nfsd的主要功能是管理NFS客户端是否能够登录NFS服务器端主机,其中还包含登录者的ID判别等
mountd(rpc.mountd)rpc.mountd 的主要功能则是管理NFS文件系统。
当NFS 客户端顺利通过 rpc.nfsd 登录NFS服务器端主机时,在使用NFS服务器提供数据之前,它会去读NFS的配置文件/etc/exports来比对NFS客户端的权限,通过这一关之后,还会经过NFS服务器端本地文件系统使用权限(就是owner、 group、other权限)的认证程序。如果都通过了,NFS客户端就可以取得使用NFS服务器端文件的权限。
注意,这个 /etc/exports 文件也是我们用来管理NFS 共享目录的使用权限与安全设置的依据,特别强调,NFS本身设置的是网络共享权限,整个共享目录的权限还和目录自身的系统权限有关
rpc.lockd可用来锁定文件,用于多客户端同时写入
rpc.statd检查文件的一致性,与 rpc.lockd 有关。c、d两个服务需要客户端、服务器端同时开启才可以;
rpc.statd 监听来自其他主机重启的通知,并且管理本地系统重启时的主机列表
rpc.idmapd名称映射后台进程

对以上进程查看,均可以执行“man 进程名”命令,如“man rpc.idmapd”。

2.4 实战配置NFS服务器端

NFS 服务的默认配置文件路径为/etc/exports,并且默认该文件是空的,需要用户自行配置。

[root@nfs01 ~]# ls -l /etc/exports
-rw-r--r--. 1 root root 0 Jun  7  2013 /etc/exports
[root@nfs01 ~]# cat /etc/exports

/etc/exports文件的两种格式如下:

  • NFS 共享目录 NFS客户端地址1(参1,参2….)客户端地址2(参1,参2….)
  • NFS 共享目录 NFS客户端地址(参1,参2….)

查看exports语法文件格式帮助的方法为:执行man exports命令,然后切换到文件结尾,可以快速看如下样例格式:

EXAMPLE
       # sample /etc/exports file
       /               master(rw) trusty(rw,no_root_squash)
       /projects       proj*.local.domain(rw)
       /usr            *.local.domain(ro) @trusted(rw)
       /home/joe       pc001(rw,all_squash,anonuid=150,anongid=100)
       /pub            *(ro,insecure,all_squash)
       /srv/www        -sync,rw server @trusted @external(ro)
       /foo            2001:db8:9:e54::/64(rw) 192.0.2.0/24(rw)
       /build          buildhost[0-9].local.domain(rw)

根据命令帮助,我们可以看到配置文件内容基本可以分成三部分:

上述各列参数的含义如下:

  1. NFS共享目录:为NFS服务器端要共享的实际目录,要用绝对路径,如(/data)。注意共享目录的本地权限,如果需要读写共享,一定要让本地目录可以被NFS 客户端的用户(nfsnobody)读写。

  2. NFS客户端地址:为NFS服务器端授权的可访问共享目录的NFS客户端地址,可以为单独的IP地址或主机名、域名等,也可以为整个网段地址,还可以用“*”来匹配所有客户端服务器,这里所谓的客户端一般来说是前端的业务服务器,如 Web服务。

    客户端地址具体地址说明
    授权单一客户端访问NFS172.16.1.7一般情况,生产环境中此配置不多
    授权整个网段访问NFS172.16.1.0/24其中的24等同于255.255.255.0,指定网段为生产环境中最常见的配置。
    授权整个网段访问NFS172.16.1.*指定网段的其他写法(不推荐使用)
    授权某个域名客户端访问nfs.baidu.com此方法生产环境中一般情况下不用
    授权整个域名客户端访问*.baidu.com此方法生产环境中一般情况下不用
  3. 权限参数集:对授权的NFS客户端的访问权限设置,即/etc/exports文件配置格式中小括号里的参数集。

    参数名称参数用途
    rw(重点)表示可读写权限
    ro表示只读权限
    sync(重点)请求或写入数据时,数据同步写入到NFS Server的硬盘后才返回
    优点:数据安全不会丢;
    缺点:性能比不启用该参数时要差
    async(重点)写入时数据会先写到内存缓冲区,直到硬盘有空档才会再写入磁盘,这样可以提升写入效率!
    风险:若服务器宕机或不正常关机,会损失缓冲区中未写入磁盘的数据
    no_root_squash访问NFS Server 共享目录的用户如果是root的话,它对该共享目录具有root权限。这个配置原本是为无盘客户端准备的。用户应避免使用
    root_squash如果访问NFS Server 共享目录的用户是 root,则它的权限将被压缩成匿名用户,同时它的UID和GID通常会变成nfsnobody账号身份
    all_squash(重点,常用)不管访问NFS Server共享目录的用户身份如何,它的权限都将被压缩成匿名用户,同时它的UID和GID都会变成nfsnobody账号身份。在早期多个NFS客户端同时读写NFSServer数据时,这个参数很有用。
    在生产中配置NFS的重要技巧:
    1)确保所有客户端服务器对NFS共享目录具备相同的用户访问权限。一种方式是all_squash把所有客户端都压缩成固定的匿名用户(UID相同)。另一种方式就是anonuid,anongid指定的UID和 GID的用户。
    2)所有的客户端和服务器端都需要有一个有相同的UID和GID的用户,即nfsnobody(UID 必须相同)
    anonuid(重点)参数以anon*开头即指anonymous匿名用户,这个用户的UID设置值通常为nfsnobody的UID值,当然也可以自行设置这个UID值。但是,UID必须存在于/etc/passwd中。在多NFS Clients时,如多台Web Server 共享一个NFS目录,通过这个参数可以使得不同的NFS Clients 写入的数据对所有NFS Clients保持同样的用户权限,即为配置的匿名UID对应用户权限,这个参数很有用,一般默认即可。
    anongid(重点)同anonuid,区别就是把UID(用户ID)换成GID(组ID)

其中,配置好NFS服务后,通过cat /var/lib/nfs/etab命令可以看到NFS配置的参数以及系统默认自带的参数。

在这里插入图片描述

/etc/exports文件格式配置实例说明

常用格式说明要共享的目录 客户端IP地址或IP段(参1,参2….)
配置一/data 172.16.1.0/24(rw,sync):允许客户端读写,并且数据同步写到服务器端的磁盘里。
/data 172.16.1.0/24(rw,sync) 10.0.0.0/24(ro):允许同时存在不同的授权
配置二/data 172.16.1.0/24(rw,sync,all_squash,anonuid=2000,anongid=2000):允许客户端读写,并且数据同步写到服务器端的磁盘里,并且指定客户端的用户UID和 GID。早期生产环境中的一种配置,适合多客户端共享一个NFS服务单目录,如果所有服务器的nfsnobody账户UID都是65534,则本例就没什么必要了。
配置三/home/oldboy 172.16.1.0/24(ro):只读共享。例如,生产环境开发有查看生产服务器日志的需求,但又不希望给开发生产服务器的权限,那么就可以给开发提供从某个测试服务器NFS客户端上查看某个生产服务器的日志目录(NFS 共享)的能力,当然这不是唯一的方法,如可以把程序记录的日志发送到测试服务器供开发查看或者通过收集日志等其他方式展现

3. NFS服务配置

实现把NFS Server上的 /data目录共享给 172.16.1.0/24 整个网段主机,且可读写。

3.1 在NFS Server端执行的操作

3.1.1 查看部署环境

[root@nfs01 ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
[root@nfs01 ~]# uname -r
3.10.0-1160.92.1.el7.x86_64
[root@nfs01 ~]# uname -m
x86_64

3.1.2 启动rpcbind及NFS服务,然后加入开机自启动

[root@nfs01 ~]# systemctl start rpcbind
[root@nfs01 ~]# systemctl status rpcbind
[root@nfs01 ~]# systemctl start nfs
[root@nfs01 ~]# systemctl status nfs

3.1.3 配置NFS服务配置文件,并在本地查看挂载信息情况

# 配置服务文件
[root@nfs ~]# vim /etc/exports   
/data   172.16.1.0/24(rw,sync,all_squash)

# 查看配置结果
[root@nfs ~]# tail -1 /etc/exports
/data   172.16.1.0/24(rw,sync,all_squash)

# 平滑加载,使修改的配置生效
[root@nfs ~]# systemctl reload nfs

# 服务器本地查看挂载情况
[root@nfs ~]# showmount -e localhost
Export list for localhost:
/data 172.16.1.0/24 

# 查看NFS服务配置文件参数,如果有内容说明配置正确,如果为空说明配置错误
[root@nfs ~]# cat /var/lib/nfs/etab 
/data 172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,all_squash,no_subtree_check,secure_locks,acl,no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,all_squash)

3.1.4 创建需要共享的目录并授权

[root@nfs01 ~]# mkdir -p /data
[root@nfs01 ~]# ls -ld /data
drwxr-xr-x 2 root root 51 416 10:24 /data
[root@nfs01 ~]# chown -R nfsnobody.nfsnobody /data
[root@nfs01 ~]# ls -ld /data
drwxr-xr-x 2 nfsnobody nfsnobody 51 416 10:24 /data

3.2 在NFS Client端执行的操作

在所有的NFS Client上执行的操作都是相同的.

3.2.1 检查环境

[root@web01 ~]# cat /etc/redhat-release 
CentOS Linux release 7.9.2009 (Core)
[root@web01 ~]# uname -r
3.10.0-1160.92.1.el7.x86_64
[root@web01 ~]# uname -m
x86_64

3.2.2 安装rpcbind及NFS服务

为了使用showmount命令功能,所有客户端最好都要安装NFS 软件(只安装不运行),不必须,。

[root@web01 ~]# yum install nfs-utils rpcbind -y
[root@web01 ~]# rpm -qa nfs-utils rpcbind
rpcbind-0.2.0-49.el7.x86_64
nfs-utils-1.3.0-0.68.el7.2.x86_64

启动RPC服务,因为是客户端,所以无须启动NFS服务。

[root@web01~]# systemctl start rpcbind
[root@web01~]# systemctl enable rpcbind    #<==其实此步不用执行,习惯性保留。

3.2.3 挂载NFS共享目录

[root@web01 ~]# showmount -e 172.16.1.31(服务端IP)
Export list for 172.16.1.31:
/data 172.16.1.0/24

[root@web01 ~]# mount -t nfs 172.16.1.31:/data /mnt
[root@web01 mnt]# df -h
文件系统           容量  已用  可用 已用% 挂载点
devtmpfs           476M     0  476M    0% /dev
tmpfs              487M     0  487M    0% /dev/shm
tmpfs              487M   51M  437M   11% /run
tmpfs              487M     0  487M    0% /sys/fs/cgroup
/dev/sda3           19G  2.0G   17G   11% /
/dev/sda1          197M  110M   88M   56% /boot
tmpfs               98M     0   98M    0% /run/user/0
172.16.1.31:/data   19G  2.0G   17G   11% /mnt

3.3 补充

生产中往往是web服务器的用户来操作共享网盘的读写,所以这里建议制定用使用服务器的操作用户。

例如,web服务器的操作用户是www(UID=666,GID=666),则:

# 创建操作账户。
[root@nfs ~]# groupadd -g666 www
[root@nfs ~]# useradd -u666 -g666 -M -s /sbin/nologin www

# 修改nfs配置
[root@nfs ~]# cat /etc/exports
/data 172.16.1.0/24(rw,sync,all_squash,anonuid=666,anongid=666)

# 修改目录属主属组
[root@nfs ~]# chown www.www /data
[root@nfs ~]# ll -d /data
drwxr-xr-x. 2 www www 6 Dec  5 10:54 /data

根据上述情况可以看出,权限控制是根据UID来进行的,与用户名无关。 在不同的服务器中,如果有不同的用户名的UID相同,则相同的文件权限会显示不同的名,如果这个UID在服务器中没有对应的用户名,则会直接显示UID。

4. 补充总结

4.1 NFS服务的重点知识梳理

当多个NFS客户端访问服务器端读写文件时,需要具有以下几个权限:

  • NFS 服务器 /etc/exports 设置需要开放可写入的权限,即服务器端的共享权限。
  • NFS服务器实际要共享的NFS目录权限具有写入的权限,即服务器端本地目录的安全权限。
  • 每台机器都对应存在和NFS默认配置UID的相同UID 65534的 nfsnobody 用户(确保所有客户端的访问权限统一,否则每个机器需要同时建立相同UID的用户,并覆盖NFS的默认用户配置)。

只有满足上述3个条件,多个NFS客户端才能具有查看、修改、删除其他任意NFS客户端上传的文件的权限,这在大规模的集群环境中作为集群共享存储时尤为重要。

4.2 NFS客户端挂载排错

当NFS客户端挂载出现故障时,首先把本地服务端作为客户端进行挂载测试。

[root@nfs01 172.16.1.31]# mount -t nfs 172.16.1.31:/data /mnt
[root@nfs01 172.16.1.31]# df -h|tail -1
172.16.1.31:/data   19G  2.6G   16G   14% /mnt
# 根据提示挂载是成功的。

这一步主要是检查服务端的NFS服务自身是不是正常。

然后再确认NFS客户端 showmount 是否OK。

[root@backup ~]# showmount -e 172.16.1.31
Export list for 172.16.1.31:
/data 172.16.1.0/24

4.3 客户端挂载命令详解

  • 挂载命令格式
挂载命令挂载格式类型服务端共享目录客户端挂载点
mount-t nfs172.16.1.31:/data/mnt

在NFS服务器端可以通过cat /var/lib/nfs/etab 查看NFS服务器端配置参数的细节。这里的挂载参数是实际上的挂载参数,我们在配置文件中没有配置的这里会使用默认的NFS参数。

[root@nfs ~]# cat /var/lib/nfs/etab 
/data	172.16.1.0/24(rw,sync,wdelay,hide,nocrossmnt,secure,root_squash,no_all_squash,no_subtree_check,secure_locks,acl,
no_pnfs,anonuid=65534,anongid=65534,sec=sys,rw,secure,root_squash,no_all_squash)

在NFS客户端可以通过cat /proc/mounts 查看mount 的挂载参数细节

[root@backup ~]# grep mnt /proc/mounts 
172.16.1.31:/data /mnt nfs4 rw,relatime,vers=4.1,rsize=131072,wsize=131072,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,clientaddr=172.16.1.41,local_lock=none,addr=172.16.1.31 0 0
  • mount挂载参数说明
参数参数功能默认参数
fg / bg当在客户端执行挂载时,可选择时在前台(fg)还是在后台(bg)执行。若在前台执行,则mount会持续尝试挂载,直到成功或挂载超时为止;若在后台执行,则mount会在后台持续多次执行挂载,而不会影响到前台前台其他程序的操作。如果是网络联机不稳定,或是服务器常常需要开关机,建议使用bg.fg
soft / hard当NFS Client以soft挂载 Server时,如果网络或是Server出现问题,造成Client 和 Server 无法传输资料,Client就会一直尝试,直到超时后显示错误才停止。如果使用 soft mount 的话,就可能会在超时出现时造成资料丢失,所以一般不建议使用。若使用 hard 模式挂载硬盘时,刚好和soft相反,此时Client会一直尝试连线到Server,如果Server有回应就回应就继续刚才的操作,如果没有回应就会一直尝试连接,此时无法umount或kill,所以常常配合intr使用。hard
intr当使用hard模式挂载的资源超时后,如果有指定intr参数,可以在超时后,把它中断掉,避免出问题时系统整个被NFS 锁死,建议使用intr。/
rsize / wsize默认值为:131072读出(rsize)与写入(wsize)的区块大小(block size),整个设置值可以影响客户端与服务器端传输数据的缓冲存储量。一般来说,如果在局域网内(LAN),并且客户端和服务器端都具有足够的内存,这个值可以设置的大一些,比如65535。提升缓冲区块将可以提升NFS文件系统的传输能力。但是设置值也不要太大,最好以网络能够传输的最大值为限。rsize=131072,
wsize=131072
proto=tcp使用UDP协议来传输资料,在LAN中会有比较好的性能。如果要通过外网(Internet)的话,使用proto=tcp多传输的数据会有比较好的纠错能力。proto=tcp

例如: mount -t nfs -o hard,intr,rsize=131072,wsize=131072 172.16.1.31:/data/ /mnt

  • mount -o 的参数说明

注意,有些选项只有出现在/etc/fstab里才有效,可以应用在绝大多数文件系统上,但是sync仅适合ext2、ext3、fat、vfat 和 ufs等文件系统。

  • async:涉及文件系统IO的操作都是异步处理,会提高性能,但是降低数据安全性。一般生产环境不推荐使用。
  • sync:有IO操作时会同步处理IO,会牺牲一些IO性能,但是在断电后数据会安全。
  • atime:每次数据访问时,会同步更新访问文件夹的inode时间戳,默认选项。
  • noatime:访问文件时不更新文件的inode时间戳,高并发环境下推荐使用,可以提高IO性能。
  • ro:以只读方式挂载一个文件系统。
  • rw:以可写的方式挂载一个文件系统。
  • auto:能够通过 -a 参数实现自动挂载。
  • noauto:不能实现自动挂载。
  • defaults:是fstab文件中的默认值,包括(rw, suid, dev, exec, auto, nouser, async).
  • exec:允许文件系统执行二进制文件,取消这个参数可以提高安全性。
  • noexec:不允许直接执行二进制的程序。
  • dirsync:目录更新时同步写入磁盘。
  • nodiratime:不更新文件系统上目录的inode时间戳,高并发环境下推荐使用,可以提高IO性能。
  • suid:允许特殊权限为suid和sgid生效。
  • nosuid:不允许设置特殊权限位生效,提升安全性。
  • nouser:禁止一个普通用户挂载该文件系统,这是默认挂载时的默认选项。
  • remount:尝试重新挂载一个已经挂载了的文件系统。

一般情况下,安全参数与性能参数是对立的,越安全性能越差。

4.4 客户端挂载优化

一般来讲,NFS服务器共享的只是普通静态数据(图片、附件、视频),不需要执行suidexec等权限,挂载的这个文件系统只能作为数据存储之用,无法执行程序,对于客户端来讲增加了安全性。

mount -t nfs -o nosuid,noexec,nodev,rw 172.16.1.31:/data /mnt              

通过 mount -o 指定挂载参数和在 /etc/fstab 里指定挂载参数的效果是一样的。网络文件系统和本地的文件系统效果也是一样的。

默认挂载方式:

mount -t nfs 172.16.1.31:/data /mnt        

禁止更新目录及文件的挂载方式:

mount -t nfs -o noatime,nodiratime 172.16.1.31:/data /mnt                  

安全加优化的挂载方式:

mount -t nfs -o nosuid,noexec,nodev,noatime,nodiratime,intr,rsize=131072,wsize=131072 172.16.1.31:/data /mnt     

在实际的工作中还是需要根据自己的实际测试效果选择挂载参数。

4.5 NFS客户端开机自启动挂载

根据以往的知识我们可以知道可实现开机自启动(挂载)有两种实现方式:

  • 方法1:对/etc/rc.local文件进行编辑
echo "/usr/bin/mount -t nfs 172.16.1.31:/data /mnt" >>/etc/rc.local 
# 或者直接对文件进行编辑       

chmod +x /etc/rc.d/rc.local    

根据文件提示注意,在使用该文件实现开机自启动时,需要执行命令开放权限。

缺点:可能偶尔开机挂载不上,工作中除了开机自启动配置,还要对是否挂载进行监控。

  • 方法2:对/etc/fstab文件进行编辑
UUID=1d1e4734-e83b-408d-9c6d-2b79b36ffcbb  /         xfs    defaults    0 0
UUID=767454a3-0fbe-4d9a-9fc4-39d6f19dae4e  /boot     xfs    defaults    0 0
UUID=1c1b7499-345f-466e-97b5-bfb64e265f0b  swap      swap   defaults    0 0
172.16.1.31:/data                          /mnt      nfs    defaults    0 0
挂载设备                                    挂载点    文件系统      
  • 问题:编辑完成后依然无法实现自动挂载服务,是因为开机启动加载顺序的原因。
  • 解释:正常情况下,加载时依次是挂载磁盘(/etc/fstab)、防火墙、网卡。因为NFS是一个 网络共享服务,只有网络通畅之后才能挂载磁盘,与正常的开机加载顺序有冲突。
  • 解决:所以这里需要一个延迟启动服务来实现NFS开机自动挂载。在CentOS 7中是remote-fs.target服务
[root@nfs01 /data1]# systemctl start remote-fs.target 
[root@nfs01 /data1]# systemctl enable remote-fs.target 

综上所述,NFS 在网络数据共享方面有着重要的地位和作用。通过了解其工作原理,我们明白 NFS 需要有 RPC 服务的协助才能成功对外提供服务,无论是客户端还是服务器端,使用 NFS 时都需先启动 RPC 服务。同时,掌握 NFS 服务的安装步骤,包括安装必要的软件包以及正确启动相关服务,能够让我们顺利搭建起 NFS 服务环境。希望本文的内容能在实际应用 NFS 时提供有益的参考和帮助。



http://www.kler.cn/a/590071.html

相关文章:

  • Git 的使用上传下载和更新
  • 算法——图论——交通枢纽
  • 【Maven-plugin】有多少官方插件?
  • 在MacOS 10.15上安装Node.js
  • c++如何利用线程池和epool设计高并发服务器
  • 高效手机检测:视觉分析技术的优势
  • 【css酷炫效果】纯CSS实现3D翻转卡片动画
  • Java 大视界 -- Java 大数据在智能教育虚拟实验室建设与实验数据分析中的应用(132)
  • LeRobot源码剖析——对机器人各个动作策略的统一封装:包含ALOHA ACT、Diffusion Policy、VLA模型π0
  • 【binlog2sql实践】MySQL数据库binlog日志ROW格式转换标准SQL
  • Linux 蓝牙音频软件栈实现分析
  • 美团Leaf分布式ID生成器:使用详解与核心原理解析
  • 关于虚拟网络编辑器还原默认设置那些坑
  • Pandas DataFrame:数据分析的利器
  • 解决从deepseek接口获取的流式响应输出到前端都是undefined的问题
  • 微服务架构中10个常用的设计模式
  • 平面阵列天线波束形成的Matlab仿真
  • 一场由 ES 分片 routing 引发的问题
  • 2025年Postman的五大替代工具
  • 【软考-架构】5.3、IPv6-网络规划-网络存储-补充考点