SMB/CIFS挂载目录下文件可见但无法查询、删除或覆盖
SMB/CIFS挂载目录下文件可见但无法查询、删除或覆盖
这种情况我之前运维CIFS挂载存储时也碰到过,简直摸不着头脑——ls明明能看到文件,偏偏删也删不掉、查属性还报错,咱们一步步来排查解决:
你遇到的具体现象
用ls -l查看时,文件确实在列表里:
# ls -l -rwxr-xr-x 1 root root 151040 Mar 22 21:55 export.mb -rwxr-xr-x 1 root root 60416 Mar 25 10:48 source.mb
但执行这些操作全部失败:
- 删除文件时提示找不到:
rm: cannot remove 'export.mb': No such file or directory - 查询文件属性也报错:
lsattr: No such file or directory While reading flags on export.mb - 尝试覆盖写入毫无反应,唯独
ls export.mb能正常显示文件名
你的环境上下文
文件位于CIFS挂载目录下,/etc/fstab的相关挂载配置如下:
# /etc/fstab (...mountpoints...) cifs credentials=/root/share.creds,user_xattr 0 0
文件是通过rsync同步而来,使用的命令参数为:
rsync --update --human-readable --itemize-changes --stats -amz --log-file=$LOGFILE $SRC_DIR $DST_DIR
此前rsync一直正常工作,前一天的同步日志也显示过程无异常。
排查解决步骤
这类问题大多是CIFS客户端缓存不一致或者文件名暗藏特殊字符导致的,咱们按顺序尝试:
1. 刷新CIFS挂载缓存
CIFS客户端会缓存文件列表,有时候缓存会和服务器端的实际状态脱节。最简单的办法就是重新挂载目录:
# 替换成你的实际挂载路径 umount /path/to/your/cifs/mount # 重新挂载 mount /path/to/your/cifs/mount
挂载完成后再尝试删除操作,大概率能解决问题。
2. 检查文件名是否含特殊字符
有时候rsync同步会把带特殊字符(比如看不见的换行、空格、非打印ASCII码)的文件名同步过来,ls能显示,但其他命令匹配不上。你可以这么排查:
# 用ls -b显示所有隐藏的特殊字符 ls -b export.mb # 如果确实有特殊字符,或者不想纠结,直接用inode号删除: # 先获取文件的inode号 ls -i export.mb # 假设inode是12345,用find删除(替换成你的挂载路径) find /path/to/your/cifs/mount -inum 12345 -delete
3. 调整CIFS挂载参数
你当前挂载用了user_xattr,有些SMB服务器对这个参数兼容性不佳,或者缓存机制导致元数据不同步。可以修改/etc/fstab的挂载项,去掉user_xattr或者添加cache=none禁用客户端缓存:
# 修改后的挂载项示例 (...mountpoints...) cifs credentials=/root/share.creds,cache=none 0 0 # 然后重新挂载 umount /path/to/your/cifs/mount && mount /path/to/your/cifs/mount
禁用缓存后,客户端每次都会直接从服务器获取最新的文件信息,能避免缓存不一致的问题。
4. 从SMB服务器端排查
如果上面的方法都没用,就得登录到SMB服务器上检查:
- 直接在服务器端查找该文件,确认是否真的存在
- 检查服务器端文件的权限、属性是否正常
- 尝试在服务器端直接删除文件,再回到客户端刷新挂载
备注:内容来源于stack exchange,提问作者ricekab




