NAS存储临时文件异常:Linux挂载CIFS偶发故障排查求助
环境与配置
我们有一台用于Linux和Windows文件共享的老旧NAS存储设备,支持Samba 3.0 dialect并正在使用。
/etc/fstab中的相关挂载配置行如下:
//nas1/Work /nas1/Work cifs mfsymlinks,auto,_netdev,exec,uid=0,credentials=/etc/.smbpass,iocharset=utf8,file_mode=0777,cache=none,dir_mode=0777,noperm,vers=3 0 0
故障现象
Linux系统挂载该存储时,偶发以下异常:
- 访问文件时偶尔出现
Host is Down、Resource temporarily unavailable、Bad file descriptor、No such a file or directory等错误,重试访问后恢复正常; - 从Linux复制文件时,有时会出现MD5校验和不一致的情况,删除文件后从Windows复制则校验和正常;
/proc/fs/cifs/Stats中存在错误统计,核心异常为大量文件关闭操作失败,具体信息如下:
\nas1\Work SMBs: 38327115 Bytes read: 147002485177 Bytes written:
13754417376 Open files: 2 total (local), 0 open on server
TreeConnects: 7103 total 0 failed TreeDisconnects: 0 total 0 failed
Creates: 3781492 total 25 failed Closes: 3771250 total 10813 failed
Flushes: 42546 total 0 failed Reads: 13005190 total 246 failed Writes:
14122424 total 208 failed Locks: 0 total 0 failed IOCTLs: 4408 total 2
failed QueryDirectories: 157598 total 17 failed ChangeNotifies: 0
total 0 failed QueryInfos: 3335551 total 0 failed SetInfos: 102218
total 1 failed OplockBreaks: 54 sent 0 failed
补充信息
- dmesg中无CIFS及nas1相关错误日志;
- Ubuntu 22.04和CentOS 7系统均出现该问题;
- Windows系统无相关异常;
- 确认存储设备本身正常,无告警信息。
排查方向与解决思路
1. 修正SMB协议版本兼容性
当前挂载参数指定vers=3,但老旧Samba 3.0设备通常仅稳定支持SMB 1.0(CIFS)或部分兼容SMB 2.0,SMB 3.0协议协商可能引发连接不稳定。建议尝试:
- 修改挂载参数为
vers=1.0或vers=3.0(根据NAS实际支持情况选择),重新挂载后观察故障是否缓解。
2. 优化CIFS挂载参数
针对老旧设备的性能瓶颈,调整挂载参数:
- 替换
cache=none为cache=loose,允许客户端适度缓存,减少网络交互; - 添加
hard,rsize=65536,wsize=65536,调整读写块大小适配NAS处理能力(避免过大块导致丢包); - 添加
nobrl参数,禁用字节范围锁,解决老旧NAS oplock支持不完善导致的文件关闭失败问题(对应Stats中Closes失败的异常)。
3. 排查网络稳定性
Linux CIFS客户端对网络波动更敏感,即使Windows无异常,仍需验证:
- 用
mtr nas1持续测试网络连通性,检查是否存在丢包、高延迟波动; - 更换网线、测试交换机端口,排除硬件层面的网络故障。
4. 深挖CIFS客户端日志
除dmesg外,查看系统日志获取更细节的错误:
- Ubuntu:检查
/var/log/syslog中包含CIFS或nas1的日志条目; - CentOS:检查
/var/log/messages的相关日志,定位协议协商、连接重置等具体异常。
5. 针对性读写测试
通过命令行工具定位故障环节:
- 用
dd if=/nas1/Work/large_test_file of=/dev/null bs=1M count=1000多次测试读稳定性,观察是否出现IO错误; - 写入测试:
dd if=/dev/zero of=/nas1/Work/test_write bs=1M count=500,写入后立即计算MD5,对比本地计算结果,验证写入过程是否出现数据损坏。
6. 调整CIFS内核模块参数
针对老旧NAS的处理能力,调整内核模块参数:
- 临时修改:
echo 10 > /proc/fs/cifs/cifs_max_pending,减少待处理请求队列大小,避免NAS过载; - 永久生效:在
/etc/sysctl.conf中添加fs.cifs.cifs_max_pending=10,执行sysctl -p生效。
内容的提问来源于stack exchange,提问作者Alon Lanyado

