You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动