一个案例弄懂nfs
nfs示例要求
NFS 叫网络文件系统,是用于多个服务器进行文件共享或存储的,它是 C/S 架构。
- 安装nfs-utils软件,在这个软件中包括服务端和客户端。
- 创建共享目录
- 将共享目录暴露给客户端使用
服务端
下载nfs-utils
[root@nfs-server ~]# dnf install nfs-utils -y
Updating Subscription Management repositories.
Unable to read consumer identityThis system is not registered with an entitlement server. You can use subscription-manager to register.Repository baseOS is listed more than once in the configuration
Last metadata expiration check: 0:12:40 ago on Thu 18 Sep 2025 04:06:45 PM CST.
Dependencies resolved.
====================================================================================Package Architecture Version Repository Size
====================================================================================
Installing:nfs-utils x86_64 1:2.5.4-20.el9 baseOS 458 k
Installing dependencies:gssproxy x86_64 0.8.4-6.el9 baseOS 114 kkeyutils x86_64 1.6.3-1.el9 baseOS 78 klibev x86_64 4.33-5.el9 baseOS 56 klibnfsidmap x86_64 1:2.5.4-20.el9 baseOS 66 klibverto-libev x86_64 0.3.2-3.el9 baseOS 15 kquota x86_64 1:4.06-6.el9 baseOS 202 kquota-nls noarch 1:4.06-6.el9 baseOS 81 krpcbind x86_64 1.2.6-5.el9 baseOS 62 ksssd-nfs-idmap x86_64 2.9.1-2.el9 baseOS 45 kTransaction Summary
====================================================================================
Install 10 PackagesTotal size: 1.1 M
Installed size: 3.0 M
Downloading Packages:
Running transaction check
Transaction check succeeded.
Running transaction test
Transaction test succeeded.
Running transactionPreparing : 1/1 Installing : libnfsidmap-1:2.5.4-20.el9.x86_64 1/10 Running scriptlet: rpcbind-1.2.6-5.el9.x86_64 2/10 Installing : rpcbind-1.2.6-5.el9.x86_64 2/10 Running scriptlet: rpcbind-1.2.6-5.el9.x86_64 2/10
Created symlink /etc/systemd/system/multi-user.target.wants/rpcbind.service → /usr/lib/systemd/system/rpcbind.service.
Created symlink /etc/systemd/system/sockets.target.wants/rpcbind.socket → /usr/lib/systemd/system/rpcbind.socket.Installing : quota-nls-1:4.06-6.el9.noarch 3/10 Installing : quota-1:4.06-6.el9.x86_64 4/10 Installing : libev-4.33-5.el9.x86_64 5/10 Installing : libverto-libev-0.3.2-3.el9.x86_64 6/10 Installing : gssproxy-0.8.4-6.el9.x86_64 7/10 Running scriptlet: gssproxy-0.8.4-6.el9.x86_64 7/10 Installing : keyutils-1.6.3-1.el9.x86_64 8/10 Running scriptlet: nfs-utils-1:2.5.4-20.el9.x86_64 9/10 Installing : nfs-utils-1:2.5.4-20.el9.x86_64 9/10 Running scriptlet: nfs-utils-1:2.5.4-20.el9.x86_64 9/10 Installing : sssd-nfs-idmap-2.9.1-2.el9.x86_64 10/10 Running scriptlet: sssd-nfs-idmap-2.9.1-2.el9.x86_64 10/10 Verifying : gssproxy-0.8.4-6.el9.x86_64 1/10 Verifying : keyutils-1.6.3-1.el9.x86_64 2/10 Verifying : libev-4.33-5.el9.x86_64 3/10 Verifying : libnfsidmap-1:2.5.4-20.el9.x86_64 4/10 Verifying : libverto-libev-0.3.2-3.el9.x86_64 5/10 Verifying : nfs-utils-1:2.5.4-20.el9.x86_64 6/10 Verifying : quota-1:4.06-6.el9.x86_64 7/10 Verifying : quota-nls-1:4.06-6.el9.noarch 8/10 Verifying : rpcbind-1.2.6-5.el9.x86_64 9/10 Verifying : sssd-nfs-idmap-2.9.1-2.el9.x86_64 10/10
Installed products updated.Installed:gssproxy-0.8.4-6.el9.x86_64 keyutils-1.6.3-1.el9.x86_64 libev-4.33-5.el9.x86_64 libnfsidmap-1:2.5.4-20.el9.x86_64 libverto-libev-0.3.2-3.el9.x86_64 nfs-utils-1:2.5.4-20.el9.x86_64 quota-1:4.06-6.el9.x86_64 quota-nls-1:4.06-6.el9.noarch rpcbind-1.2.6-5.el9.x86_64 sssd-nfs-idmap-2.9.1-2.el9.x86_64 Complete!
创建共享目录
[root@nfs-server ~]# mkdir /nfs/data -p
配置暴露共享目录的文件**(/etc/exports)**
[root@nfs-server ~]# vim /etc/exports
/nfs/data 192.168.30.12(rw,sync)
#服务端共享目录 客户端ip
配置规则(说明)
-
在这个文件中每一行代表一个要暴露的共享目录信息
-
第一行的第一个字段就是要共享的目录,第二个字段是由客户端IP(权限)组成
-
在第二个字段中IP地址和小括号之间不能有空格,括号中也不能有空格
-
第二个字段可以出现多次,他们之间使用空格隔开
/nfs/data 192.168.72.135(rw,sync) 192.168.72.136(rw,sync)
- 在第二个字段中IP地址可以写成如下几种形式:
/nfs/data 192.168.72.135(rw,sync) # 只能192.168.72.135可以使用/nfs/data 192.168.72.0/24(rw,sync) # 只是192.168.72段的主机都可以使用/nfs/data *(rw,sync) # 表示所有主机都可以使用
-
所有权限都有默认值
-
ro:只读,如果希望共享目录可以读写,那么就明确指定为(rw)
-
sync:同步,如果希望指定异步方式,则需要明确指定(async)
-
root_squash:指定操作共享目录的用户,默认使用的是 nobody 用户来操作。
启动服务
[root@nfs-server ~]# systemctl start nfs-server
检验:查看暴露的共享目录信息
[root@nfs-server ~]# showmount -e 192.168.30.10
Export list for 192.168.30.10:
/nfs/data 192.168.30.12
客户端
下载nfs-utils
#略
创建挂载点
[root@nfs-client ~]# mkdir /share/nfs -p
挂载服务端共享目录
[root@nfs-client ~]# mount -t nfs 192.168.30.10:/nfs/data /share/nfs
#可以发现一直不回应,卡起了
问题:挂载不起
可以发现一直不回应,卡起了
why???
首先我们了解一些输入这个指令后流程是什么
流程图
分析原因:
已知条件:服务端/客户端防火墙是默认的
1.是开启的
2.默认规则里面没有允许nfs相关服务
所以在客户端与服务器 rpcbind(端口111)的初次握手阶段就失败了。
当执行 mount -t nfs 192.168.30.10:/nfs/data /share/nfs 时,流程立即开始:
-
客户端尝试连接服务器端口111(rpcbind服务)。
-
由于服务器防火墙之前没有放行任何NFS相关服务,这个发往端口111的SYN包被服务器防火墙静默丢弃了(不是拒绝,是直接丢弃)。
-
客户端一直在等待服务器的SYN-ACK响应包,但永远等不到。根据TCP协议,它会进行多次重试,等待超时时间非常长(通常是几分钟)。这就是命令“卡起” 的原因——它被困在TCP连接的第一次握手阶段。
解决方法:服务端开启nfs服务
一定要在服务器
[root@nfs-server ~]# firewall-cmd --permanent --add-service={nfs,mountd,rpc-bind}
success
[root@nfs-server ~]# firewall-cmd --reload
success
为什么加上规则后“马上”就好了?
分析原因:
其中 --add-service=rpc-bind 这条规则至关重要。它告诉防火墙:“允许访问端口111”。
-
rpc-bind 服务规则直接对应端口111。
-
nfs 服务规则对应端口2049。
-
mountd 服务规则对应一个动态端口(需要rpcbind来查询)。
规则生效后:
-
客户端再次发起挂载请求。
-
发往服务器端口111的SYN包这次被防火墙允许通过。
-
服务器的rpcbind服务收到请求并回复SYN-ACK。
-
TCP连接迅速建立,后续的挂载流程(询问mountd端口、获取文件句柄等)得以继续,整个过程在几秒内完成。
流程对比图:
再挂载&验证
[root@nfs-client ~]# df -Th /share/nfs
Filesystem Type Size Used Avail Use% Mounted on
192.168.30.10:/nfs/data nfs4 17G 1.5G 15G 9% /share/nfs
#成功
测试
服务端操作
#初始
[root@nfs-server ~]# cd /nfs/data
[root@nfs-server data]# ls
[root@nfs-server data]# [root@nfs-server ~]# cd /nfs/data
[root@nfs-server data]# ls
[root@nfs-server data]# #在服务端创建文件
[root@nfs-server data]# touch 1.dox
[root@nfs-server data]#
#客户端
[root@nfs-client nfs]# ls
1.dox
客户端操作
[root@nfs-client nfs]# echo "hello" > 1.dox
-bash: 1.dox: Permission denied
#没有权限
问题:没有权限
办法:将服务端共享目录用户&用户组改为nobody
[root@nfs-server ~]# ll /nfs/data
total 0
-rw-r--r--. 1 root root 0 Sep 18 17:28 1.dox#现在是root[root@nfs-server ~]# chown -R nobody: /nfs/data
[root@nfs-server ~]# ll /nfs/data
total 0
-rw-r--r--. 1 nobody nobody 0 Sep 18 17:28 1.dox
[root@nfs-server ~]# ll -d /nfs/data
drwxr-xr-x. 2 nobody nobody 19 Sep 18 17:28 /nfs/data
#目录用户用户组都是nobody了
客户端重新操作
[root@nfs-client nfs]# echo "hello" > 1.dox
[root@nfs-client nfs]# cat 1.dox
hello#服务端查看
[root@nfs-server ~]# cat /nfs/data/1.dox
hello
#一致