【Linux】部署NFS服务实现数据共享

发布时间:2026/10/31 1:16:29
【Linux】部署NFS服务实现数据共享

👨‍🎓博主简介

🏅CSDN博客专家
🏅云计算领域优质创作者
🏅华为云开发者社区专家博主
🏅阿里云开发者社区专家博主
💊交流社区:运维交流社区 欢迎大家的加入!
🐋 希望大家多多支持,我们一起进步!😄
🎉如果文章对你有帮助的话,欢迎 点赞 👍🏻 评论 💬 收藏 ⭐️ 加关注+💗


文章目录

  • 一、NFS简介与RPC简介
    • 1. NFS服务简介
    • 2. RPC协议简介
    • 3. NFS工作流程
  • 二、准备工作
    • 2.1 服务器信息
    • 2.2 防火墙配置
    • 2.3 selinux沙盒
  • 三、部署并启动 NFS 和 RPC 服务
  • 四、服务端配置共享目录
  • 五、客户端挂载共享目录及配置永久挂载
    • 5.1 查看NFS服务共享信息
    • 5.2 创建目录并进行临时挂载测试
    • 5.3 永久挂载
    • 5.4 取消挂载
      • 5.4.1 临时取消挂载
      • 5.4.2 永久取消挂载

一、NFS简介与RPC简介

1. NFS服务简介

NFS是一种网络协议,NFS依赖RPC才能工作。(RHEL5.0上是NFS V3而RHEL6.0上是NFS V4)

NFS 的基本原则是“容许不同的客户端及服务端通过一组RPC分享相同的文件系统”,它是独立于操作系统,容许不同硬件及操作系统的系统共同进行文件的分享。

NFS在文件传送或信息传送过程中依赖于RPC协议。RPC,远程过程调用 (Remote Procedure Call) 是能使客户端执行其他系统中程序的一种机制。NFS本身是没有提供信息传输的协议和功能的,但NFS却能让我们通过网络进行资料的分享,这是因为NFS使用了一些其它的传输协议。而这些传输协议用到这个RPC功能的。可以这么理解RPC和NFS的关系:NFS是一个文件系统,而RPC是负责信息的传输。

2. RPC协议简介

RPC(Remote Procedure Call)远程过程调用,它是一种通过网络从远程计算机程序上请求服务,而不需要了解底层网络技术的协议。其工作在TCP/UDP的111端口。建立在Socket之上的,主要是简化编程的工作在底层提供网络之间的通信。

RPC采用客户机/服务器模式。请求程序就是一个客户机,而服务提供程序就是一个服务器。首先,客户机调用进程发送一个有进程参数的调用信息到服务进程,然后等待应答信息。在服务器端,进程保持睡眠状态直到调用信息的到达为止。当一个调用信息到达,服务器获得进程参数,计算结果,发送答复信息,然后等待下一个调用信息,最后,客户端调用进程接收答复信息,获得进程结果,然后调用执行继续进行。

RPC远程过程调度:

  • NFS 协议本身并没有网络传输功能,而是基于远程过程调用协议实现的
  • 提供一个面向过程的远程服务的接口
  • 可以通过网络从远程主机程序上请求服务,而不需要了解底层网络技术的协议
  • 工作在 OSI 模型的会话层,它可以为遵从 RPC 协议应用层协议提供端口注册功能
  • 事实上,有很多服务(NFS 和 NIS 等)都可以向 RPC 注册端口
  • RPC 使用网络端口 111 来监听客户端的请求

3. NFS工作流程

1.首先服务器端启动RPC服务,并开启111端口
2.然后还需要服务器端启动NFS服务,并向RPC注册端口信息
3.客户端启动RPC(portmap服务),向服务端的RPC(portmap)服务请求服务端的NFS端口
4.服务端的RPC(portmap)服务反馈NFS端口信息给客户端。
5.客户端通过获取的NFS端口来建立和服务端的NFS连接并进行数据的传输。

  • 挂载原理

当我们在NFS服务器设置好一个共享目录/opt 后,其他人是有权访问/opt这个共享目录的,NFS客户端就可以将这个目录挂载到自己文件系统的某个挂载点(这个挂载点可以自己定义),路径不同也可以;如下图客户端A与客户端B挂载的目录就不相同。并且挂载好后我们在本地能够看到服务端/opt下的所有数据。

二、准备工作

2.1 服务器信息

主机操作系统IP服务端口
服务端centos172.16.11.201nfs、rpc2049、111
客户端centos172.16.11.202nfs、rpc2049、111

2.2 防火墙配置

  • 关闭防火墙服务
# 关闭防火墙systemctl stop firewalld# 禁止防火墙开机自启systemctl disable firewalld
  • 如果是必须要开启防火墙,可以使用两种方法,开端口或服务
# 开启nfs和rpc服务firewall-cmd--permanent--add-service=nfs firewall-cmd--permanent--add-service=rpc-bind# 重载防火墙规则firewall-cmd--reload
# 放行端口# nfs端口为:2049、rpc端口为:111firewall-cmd--permanent--add-port=2049/tcp firewall-cmd--permanent--add-port=111/tcp firewall-cmd--permanent--add-port=111/udp# 重载防火墙规则firewall-cmd--reload
  • 如果使用的是iptables防火墙,可以使用以下命令:
iptables-AINPUT-ptcp--dport2049-jACCEPT iptables-AINPUT-ptcp--dport111-jACCEPT iptables-AINPUT-pudp--dport111-jACCEPT iptables-save>/etc/sysconfig/iptables

2.3 selinux沙盒

# 临时关闭setenforce0# 永久关闭vim/etc/selinux/config# 将selinux=修改为disabled

修改配置文件永久生效要重启服务器;

三、部署并启动 NFS 和 RPC 服务

两台都安装,nfs-utils为 nfs 服务端、rpcbind为 nfs 客户端;

# yumyuminstall-ynfs-utils rpcbind# aptaptinstall-ynfs-kernel-server
  • 启动 nfs 服务并配置开机自启(所有节点)
systemctlenable--nownfs
  • 查看服务状态
systemctl status nfs systemctl status rpcbind

四、服务端配置共享目录

安装完成之后 nfs 会自动创建一个系统程序用户nfsnobody,可使用命令:cat /etc/passwd查看;

  • 创建需要作为共享目录的目录并给nfs权限(注意磁盘空间占用)

主节点创建即可

# 创建一个需要共享的共享目录mkdir-p/data/nfs# 给此目录nfs用户权限chown-Rnfsnobody:nfsnobody /data/nfs
  • 配置共享目录:/etc/exports,定义哪些地址可以访问,(主节点配置)

NFS配置文件格式:共享目录 [客户端1(参数)] [客户端2(参数)]

共享目录:NFS服务器需要共享的实际路径(绝对路径);
客户端:可以访问共享目录的服务器地址或网段。

vim/etc/exports# 添加以下内容# 共享目录 允许访问的网段或IP(权限参数)# 示例:允许 172.16.11.0/24 网段的所有机器以读写(rw)方式访问,也可以采用ip方式/data/nfs172.16.11.0/24(rw,sync,no_subtree_check,no_root_squash)

参数说明:

参数含义
rw读写权限
sync同步写入(保证数据安全)
no_subtree_check禁用子树检查(提升性能)
no_root_squash客户端 root 用户保持 root 权限
  • 重启服务端NFS和RPC服务
systemctl restart nfs rpcbind


客户端常用形式:

客户端说明
172.16.11.202指定IP地址的主机
172.16.11.0/24指定该网段所有主机
172.16.10.*指定子网的所有主机
www.xxx.com指定域名的主机
*.xxx.com指定域中的所有主机
*所有主机

常用参数解析:

参数参数解析
ro只读
rw读写
sync同时将数据写入到内存与硬盘中,保证不丢失数据
async优先将数据保存到内存,然后再写入硬盘;效率更高,但可能会丢失数据
root_squash当NFS客户端以root管理员访问时,映射为NFS服务器的匿名用户
no_root_squash当NFS客户端以root管理员访问时,映射为NFS服务器的root管理员
all_squash无论NFS客户端使用什么账户访问,均映射为NFS服务器的匿名用户
no_all_squash保留共享文件的UID和GID(默认)
no_subtree_check禁用子树检查(提升性能)


五、客户端挂载共享目录及配置永久挂载

注意:

1、挂载目录服务端的数据会覆盖客户端的数据;

1、挂载目录服务端的数据会覆盖客户端的数据;

1、挂载目录服务端的数据会覆盖客户端的数据;

​执行mount挂载的为客户端;


2、如果卸载挂载,提示:设备正忙(umount.nfs4: /data/test: device is busy),可以使用umount -l /data/test,不过存在一定风险,容易丢失数据

5.1 查看NFS服务共享信息

客户端、服务端都可以执行,指定的是nfs服务器的IP地址;

  • 命令
showmount[选项](参数/服务端IP)

-d:仅显示已被NFS客户端加载的共享目录;
-e:显示NFS服务器上所有的共享目录。

  • 查看
# 这个命令需要安装nfs-utlisshowmount-e172.16.11.201
[root@localhost ~]# showmount -e 172.16.11.201Export listfor172.16.11.201: /data/nfs1172.16.11.0/24

5.2 创建目录并进行临时挂载测试

  • 在客户端创建要挂载的目录

比如也在/data/nfs,其他位置也可以;

mkdir/data/nfs
  • 临时挂载

在客户端执行挂载目录命令:
mount -t指定挂载的文件类型nfs服务端的IP:服务端要共享的路径目录要挂载到本机的路径目录

mount-tnfs172.16.11.201:/data/nfs /data/nfs

如果遇到以下报错,有可能是:目录权限问题、服务端配置文件ip范围写的有问题、防火墙、selinux问题;

mount.nfs: access denied by server while mounting 172.16.11.201:/data/nfs

# 挂载完成df -Th进行检查df-Th# 进入挂载目录,写入或删除数据进行测试连通性cd/data/nfstouch123# 在挂载目录或nfs主服务器目录进行查看

5.3 永久挂载

这样只是临时挂载,重启服务器之后就会消失,所以需要在客户端上配置永久挂载;

# 永久挂载(需确认好ip和类型,配置错误会导致服务器重启不了)vim/etc/fstab# 追加以下内容(确认好自己的服务端ip和挂载路径)172.16.11.201:/data/nfs /data/nfs nfs defaults,nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=3000

保存退出之后,重启服务器可以进行测试,一旦写错,重启服务器将造成启动不了服务器,所以要谨慎;
保存退出之后,重启服务器可以进行测试,一旦写错,重启服务器将造成启动不了服务器,所以要谨慎;
保存退出之后,重启服务器可以进行测试,一旦写错,重启服务器将造成启动不了服务器,所以要谨慎;

挂载选项详解

  • defaults:这是标准的挂载默认值集合,通常包含rw(读写)、suid、dev、exec、auto(允许mount -a挂载)和nouser等。对于 NFS,它还会启用一些基础的 NFS 行为,但具体的 NFS 协议参数(如rsize、wsize)通常会由系统自动协商。

  • nofail:这是防止服务器重启失败的关键。它告诉systemd:这个挂载点不是启动的“必需”项。即使 NFS 服务器连不上或挂载失败,系统也会继续完成启动过程,而不会卡住或进入紧急模式。

  • x-systemd.automount:按需挂载。系统启动时不会立刻去挂载这个 NFS,而是等到第一次有人访问/data/nfs目录时,才触发挂载动作。这能进一步加快启动速度,并避免在启动阶段因网络未就绪而挂载失败。

  • x-systemd.requires=network-online.target:保证网络就绪。它强制要求systemd在尝试挂载之前,先等待network-online.target这个目标达成(即网络接口已配置并在线)。这解决了“系统以为网络好了,其实还没好就去挂载 NFS 导致失败”的常见时序问题。

  • x-systemd.device-timeout=30:限制等待时间。它规定systemd最多等待设备(这里是网络存储)30 秒。如果 30 秒后 NFS 服务器还不可用,就放弃等待并继续启动流程。结合nofail使用,可以避免因 NFS 服务器故障导致启动过程被拖延过久(默认等待时间可能长达 90 秒)。

关于“0 0”结尾

这是fstab的标准字段:

  • 第一个0:dump备份标志,对 NFS 无意义,设为0。
  • 第二个0:fsck检查顺序,NFS 是网络文件系统,不需要本地磁盘检查,设为0。

5.4 取消挂载

5.4.1 临时取消挂载

umount客户端挂载点umount服务端ip:服务端共享目录 举例:umount/data/nfsumount172.16.11.201:/data/nfs

如果遇到取消挂载报错或卡住,可能是还在使用中,这种一般不会让取消挂载,需要确认还用不用,如果真的不用,可以强制取消挂载

umount-lf172.16.11.201:/data/nfs
  • -f:强制卸载
    它的作用是“强制”执行卸载操作。对于 NFS 来说,当服务器端不可达(例如宕机或网络断开)时,普通的umount可能会一直等待或报错。加上-f后,系统会直接执行卸载,不再等待远程服务器的响应。

  • -l:惰性卸载
    它的作用是“惰性”卸载。系统会立刻把这个文件系统从目录树里“摘”下来,让新的访问无法进入。但是,如果此时还有进程正在使用这个挂载点里的文件(比如有程序打开了里面的文件),系统不会强行中断它们,而是会等这些进程释放引用后,在后台悄悄完成最终的清理。

5.4.2 永久取消挂载

如果是配置了有永久挂载才需要用到这里;

  1. 先临时取消挂载,按照上面的方法;
  2. 进入/etc/fstab中,把172.16.11.201:/data/nfs /data/nfs nfs defaults,nofail,x-systemd.automount,x-systemd.requires=network-online.target,x-systemd.device-timeout=30 0 0这一行删除就可以了。