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.1program vers proto   port  service100000    4   tcp    111  portmapper100000    3   tcp    111  portmapper100000    2   tcp    111  portmapper100000    4   udp    111  portmapper100000    3   udp    111  portmapper100000    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.1program vers proto   port  service100000    4   tcp    111  portmapper100000    3   tcp    111  portmapper100000    2   tcp    111  portmapper100000    4   udp    111  portmapper100000    3   udp    111  portmapper100000    2   udp    111  portmapper100024    1   udp  59188  status100024    1   tcp  45013  status100005    1   udp  20048  mountd100005    1   tcp  20048  mountd100005    2   udp  20048  mountd100005    2   tcp  20048  mountd100005    3   udp  20048  mountd100005    3   tcp  20048  mountd100003    3   tcp   2049  nfs100003    4   tcp   2049  nfs100227    3   tcp   2049  nfs_acl100003    3   udp   2049  nfs100003    4   udp   2049  nfs100227    3   udp   2049  nfs_acl100021    1   udp  37180  nlockmgr100021    3   udp  37180  nlockmgr100021    4   udp  37180  nlockmgr100021    1   tcp  40925  nlockmgr100021    3   tcp  40925  nlockmgr100021    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.rhkb.cn/news/36015.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《多语言实时交流辅助系统前端的设计与实现》开题报告

个人主页&#xff1a;大数据蟒行探索者 目录 一、选题目的与意义 1.选题目的 2选题意义 2.1技术挑战与创新 2.2市场需求 2.3促进文化交流 2.4教育应用 2.5社会影响 二、研究现状与文献综述 1.研究现状 2.文献综述 2.1 前端技术的发展与应用 2.2 自然语言处理技术…

SpringCloud网关:Gateway路由配置与过滤器链

文章目录 引言一、Gateway基本架构二、路由配置方式2.1 配置文件方式2.2 Java代码方式 三、内置断言工厂四、内置过滤器工厂4.1 请求路径相关过滤器4.2 请求和响应头过滤器4.3 功能性过滤器 五、自定义过滤器5.1 自定义GatewayFilter5.2 自定义过滤器工厂 六、全局过滤器总结 引…

咖啡点单小程序毕业设计(JAVA+SpringBoot+微信小程序+完整源码+论文)

✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取项目下载方式&#x1f345; 一、项目背景介绍&#xff1a; 随着社会的快速发展和…

Excel(函数进阶篇):Vlookup函数进阶、TAKE嵌套SORE函数、SUBTOTAL函数、INDIRECT函数

目录 Vlookup函数返回多列结果Vlookup函数多条件匹配Vlookup函数部分匹配TAKE函数嵌套SORT函数&#xff0c;提取排序数据SUBTOTAL函数&#xff1a;制作动态报表SUBTOTAL函数&#xff1a;创建连续编号INDIRECT函数Vlookup跨多表抓取数据INDIRECT函数常见跨表的错误Vloopup函数联…

大模型 VS 传统算法:人工智能时代的“新老对话“

大模型 VS 传统算法&#xff1a;人工智能时代的"新老对话" 在AlphaGo击败李世石、ChatGPT掀起全民AI热潮的今天&#xff0c;人们往往将"大模型"与"算法"混为一谈。但当我们深入技术内核时会发现&#xff0c;这二者恰似人工智能发展的两个平行宇…

【蓝桥杯每日一题】3.17

&#x1f3dd;️专栏&#xff1a; 【蓝桥杯备篇】 &#x1f305;主页&#xff1a; f狐o狸x 他们说内存泄漏是bug&#xff0c;我说这是系统在逼我进化成SSR级程序员 OK来吧&#xff0c;不多废话&#xff0c;今天来点有难度的&#xff1a;二进制枚举 二进制枚举&#xff0c;就是…

Matlab 汽车振动多自由度非线性悬挂系统和参数研究

1、内容简介 略 Matlab 169-汽车振动多自由度非线性悬挂系统和参数研究 可以交流、咨询、答疑 2、内容说明 略 第二章 汽车模型建立 2.1 汽车悬架系统概述 2.1.1 悬架系统的结构和功能 2.1.2 悬架分类 2.2 四分之一车辆模型 对于车辆动力学&#xff0c;一般都是研究其悬…

hackmyvm-Smol

信息收集 ┌──(root㉿kali)-[/home/kali] └─# arp-scan -I eth1 192.168.56.0/24 Interface: eth1, type: EN10MB, MAC: 00:0c:29:34:da:f5, IPv4: 192.168.56.103 WARNING: Cannot open MAC/Vendor file ieee-oui.txt: Permission denied WARNING: Cannot open MAC/Vendo…

深度学习项目--基于DenseNet网络的“乳腺癌图像识别”,准确率90%+,pytorch复现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 前言 如果说最经典的神经网络&#xff0c;ResNet肯定是一个&#xff0c;从ResNet发布后&#xff0c;很多人做了修改&#xff0c;denseNet网络无疑是最成功的…

基于x11vnc的ubuntu远程桌面

1、安装VNC服务 sudo apt install x11vnc -y2、创建连接密码 sudo x11vnc -storepasswd3、安装lightdm服务 x11vnc 在 默认的 GDM3 中不起作用&#xff0c;因此需要使用 lightdm 桌面管理环境 sudo apt install lightdm -y切换至lightdm&#xff0c;上一步已经切换则跳过该…

Git 常用命令完全指南:从入门到高效协作

文章需要结构清晰&#xff0c;涵盖从入门到进阶的常用命令&#xff0c;结合实例和注意事项&#xff0c;帮助用户快速掌握Git的核心功能&#xff0c;并应用到实际项目中 一、仓库初始化与基础操作 1. 创建与克隆仓库 # 初始化本地仓库 git init# 克隆远程仓库&#xff08;SSH方…

【运维自动化-标准运维】如何实现一个最简单的流程编排

流程编排是标准运维最核心的功能&#xff0c;通过将不同功能的原子插件在画布上可视化的拖拽编排&#xff0c;可以实现各种不同场景的跨系统工作流。标准运维流程 根据实际运维操作场景梳理出来的操作步骤&#xff0c;通过不同的流转逻辑&#xff08;并行、分支、条件并行&…

【DeepSeek】HTML Api调用(支持V3和 R1,多轮对话、流式输出、对话保存、markdown格式支持)

文章目录 一、项目结构二、功能支持三、使用方法四、待改进五、参数优化 ☘️ 项目地址&#xff1a;https://github.com/CQUPTLei/DeepSeek_HTML/tree/master 对话截图&#xff1a; 一、项目结构 C:\USERS\14134\DESKTOP\DEEPSEEK │ .gitignore │ DeepSeek.html # 所…

烽火HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包及注意点说明

之前发布过这个固件包&#xff0c;关于烽火HG680-KA&#xff0f;HG680-KB_海思HI3798MV310_安卓9.0_U盘强刷固件包详细说明一下&#xff0c;汇总总结一些常遇到的情况&#xff0c;这次固件会分开发布&#xff0c;以免混淆。 上一个帖子地址&#xff1a;烽火HG680-KA&#xff0…

蓝桥杯备赛(基础语法4)

冒泡排序 冒泡排序的思想 冒泡排序的思想是每次将最大的一下一下运到最右边&#xff0c;然后将最右边这个确定下来。再来确定第二大的&#xff0c;再确定第三大的... 对于数组 a [ ] ,具体的来说&#xff0c;每次确定操作就是从左往右扫描&#xff0c;如果 a [ i ] > a [ …

【算法】力扣 713题:乘积小于 K 的子数组之深入思考

文章目录 前言题目&#xff1a;乘积小于 K 的子数组参考思路方法一&#xff1a;滑动窗口方法二&#xff1a;二分查找 参考题解方法一&#xff1a;滑动窗口解法方法二&#xff1a;二分查找解法 深入思考浮点精度&#xff1f;right - left 1&#xff1f;二分法&#xff1f;哈希优…

超声重建,3D重建 超声三维重建,三维可视化平台 UR 3D Reconstruction

1. 超声波3D重建技术的实现方法与算法 技术概述 3D超声重建是一种基于2D超声图像生成3D体积数据的技术&#xff0c;广泛应用于医学影像领域。通过重建和可视化三维结构&#xff0c;3D超声能够显著提高诊断精度和效率&#xff0c;同时减少医生的脑力负担。本技术文档将详细阐述…

Docker 部署 Graylog 日志管理系统

Docker 部署 Graylog 日志管理系统 前言一、准备工作二、Docker Compose 配置三、启动 Graylog 服务四、访问 Graylog Web 界面总结 前言 Graylog 是一个开源的日志管理平台&#xff0c;专为实时日志收集、分析和可视化设计。它支持强大的搜索功能&#xff0c;并且与 Elastics…

【图论】并查集的学习和使用

目录 并查集是什么&#xff1f; 举个例子 组成 父亲数组&#xff1a; find函数&#xff1a; union函数&#xff1a; 代码实现&#xff1a; fa[] 初始化code: find code&#xff1a; 递归实现: 非递归实现: union code : 画图模拟&#xff1a; 路径压缩&#xff1a…

FPGA-流水灯

Quartus中使用Verilog实现 根据之前所学内容&#xff0c;打开Quartus 软件&#xff0c;新建FPGA项目文件&#xff0c;建立好空项目过后&#xff0c;选择Verilog HDL File&#xff0c;因为我们要使用Verilog代码实现仿真。 详细操作可参考往期博客&#xff1a; FPGA 实验报告&a…