一个linux无法挂载nfs server的问题

本文记录了解决Zonda集群挂载NAS遇到的问题。集群在挂载NAS时遇到罕见错误,通过对比挂载成功与失败的日志并调整参数,最终发现是由于特权端口资源耗尽导致。文中提供了增加noresvport参数及调整系统参数两种解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

转自阿里巴巴陶毅的文章

1:问题出现

这几天部署zonda集群,意外的发现这样一个问题:

 

Zonda集群因为迁移数据,需要挂载NAS,但是发现一个问题,集群中的机器在mount存储之后报出如下错误:

 


这个错误是机器少见的,通过strace发现在挂载时报出如下错误:

 


在检查了NAS的配置和挂载参数都没有发现问题的情况下,由于报错的内容又很奇葩,一时没有什么思路,于是向库哥求助。

 

2:问题排错

我重启了主机,发现重启后是可以挂载的,但是如果卸载后,却不一定可以重新挂载成功。这又怪了,于是开始用tcp抓包,看nfs挂载的整个过程。然后发现了如下情况:

 

挂载成功的rpc情况:

 


 

而没有挂载成功的机器:



 

两个比较下来,发现rpc中多了一个nfs,然后想到该集群里的glusterfs在启动server时同时启动一个自有的nfsserver,难道是因为和nfs client有冲突,所以导致mount不上NAS??

 

3:问题找到

本来以为我们已经找到了答案,但是过了一个周末,情况发生了变化,周一在没有任何变化的情况下,集群绝大部分机器都能挂载NAS了!

 

我们的方向错了!

 

于是重新寻找答案。在这个时候,库哥发现加入一个参数“noresvport”后,部分NAS卷可以挂载成功。根据这个参数我们马上想起glusterfs会带起很多长连接。检查结果:

 

[root@zonda-ss02 /root]

#netstat -na|grep 172.16.197.87|awk '{print $4}'|awk -F ":" '{print $2}'|sort -n|wc -l

1853

 

然后发现特权端口都用完了!

 

nfs client是在默认情况下是使用特权端口去连接nfs server的,如果自己的特权端口用完了,自然无法连接nfs server

 

4:解决方案。

 

 

那么怎么解决这个问题呢?在redhat 5.3(我们最常使用的系统里),有个官方关于mount过多nfs文件系统的bug(bug 212398),当挂载超过350个文件系统时会失败。

 

而在2.6.28以后的kernel(对我们来讲就是用rh6以上)里,linux提供了一个控制方案,就是使用resvport/norevport来控制client将通过何种端口来挂载nfs server。

 

在默认或指定resvport参数时,系统通过特权端口来挂载,使用noresvport,则可以使用非特权端口。

 


 

这个同时也需要nfs server端也支持非特权端口。经过验证,主流的NAS(EMC,NetApp),GLUSTERFS的nfsserver都是支持非特权端口的。

 

 

PS:关于解决方案还有个方法就是修改系统参数改变nfs使用特权端口的范围:

sunrpc.min_resvport = 665

sunrpc.max_resvport = 1023

 

但是这样的操作会带来安全隐患,在修改后系统提示希望能够用其他更好的方式来加强安全性,因此不推荐。

 

### Linux 中通过串口挂载 NFS 的指南 在 Linux 系统中,通过串口挂载 NFS 文件系统涉及多个配置步骤。以下是详细的说明: #### 配置 NFS 客户端 为了使 NFS 正常工作,需要确保 NFS 服务已安装并运行正常。可以通过以下命令验证 NFS 是否可用: ```bash showmount -e <NFS_SERVER_IP> ``` 此命令用于显示指定服务器上的导出文件系统列表[^2]。 如果 `showmount` 命令返回预期的结果,则表明 NFS 导出设置无误。 #### 设置根文件系统的选项 当通过串口启动时,可能需要调整内核参数来支持远程根文件系统。可以使用如下引导参数传递给内核: ```plaintext root=/dev/nfs rw nfsroot=<server-ip>:<export-path> ip=dhcp ``` 其中 `<server-ip>` 是 NFS 服务器的 IP 地址,而 `<export-path>` 则是服务器上共享目录的位置。这些参数允许客户端从网络加载其根文件系统[^1]。 #### 修改 `/etc/fstab` 文件 对于持久性的挂载操作,在目标设备的 `/etc/fstab` 文件中添加相应的条目是非常重要的。下面是一个典型的例子: ```plaintext <server-ip>:<export-path> /mnt/nfs nfs defaults,timeo=14,intr,rsize=8192,wsize=8192,proto=tcp,hard,nolock,noatime 0 0 ``` 这里需要注意的是 `noatime` 参数的作用在于减少不必要的磁盘写入活动,从而提高性能[^3]。 #### 实现串口调试功能 为了让整个过程更加透明化,建议启用串口日志记录以便于诊断可能出现的问题。这通常涉及到编辑 GRUB 或者 LILO 启动菜单中的 kernel 行加入 console 参数,例如: ```plaintext console=ttyS0,115200n8 ``` 完成上述所有配置之后重启机器或者重新加载相关模块和服务即可测试新的设定效果。 ```python import subprocess def check_nfs_availability(server_ip): try: result = subprocess.run(['showmount', '-e', server_ip], stdout=subprocess.PIPE) return result.stdout.decode('utf-8') except Exception as e: return str(e) print(check_nfs_availability("192.168.161.133")) ``` 以上脚本可以帮助快速确认特定地址下的 NFS 资源状态。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值