Samba 共享上的某些文件显示为文件夹

jle*_*715 6 samba files directory 20.04

Ubuntu 20.04.1,Samba 包 2:4.11.6+dfsg-0ubuntu1.2

最近在我的 Ubuntu 机器上设置了一个 Samba 共享;没什么特别的,只是一个名为“媒体”的共享,带有三个子目录 - 电影、电视和照片。

一个多星期没问题,但截至昨天,Photos 目录下的所有文件都表示为目录。从 MacOS (smb://myserver/media) 访问 Samba 共享时,所有文件都显示有“文件夹”图标,当您cd通过终端进入文件夹时,所有文件在运行时都列为d rwx ls -al。文件处于此状态时无法正常使用。即使我将该文件复制到 MacOS 机器,它仍然是一个目录。访问 Ubuntu 机器本身(即本地)上的文件显示文件完好无损,一切正常。

我试图解决问题的事情:

  • 重新启动 Ubuntu 计算机。
  • 重新启动 smbd 服务。
  • min protocol = SMB2和添加client min protocol = SMB2到 /etc/samba/smb.conf
  • 重新启动 MacOS 机器。
  • 将受影响的文件复制到共享上的不同目录。
  • 确保我的 Samba 软件包是最新的。

很奇怪,因为共享上其他目录中的文件表现正常,而照片目录中的文件表现正常一个多星期才突然发生。

有趣的是,这与旧 bug 的行为类似,但我使用的是解决此问题的 Samba 版本。

任何帮助将非常感激; 由于我没有进行任何导致此行为的更改,因此我不确定擦除并重新加载会(永久)修复它。我希望将这个盒子用作 NAS,但无法访问文件是一个主要的障碍。

终端

文件图形用户界面

*** 编辑:Windows 上的类似行为

小智 8

我遇到了同样的问题,对我有用的解决方案是:

所有受影响的文件/文件夹都具有扩展属性user.DOSATTRIB。执行getfattr #filename“坏”文件的结果时将是这样的:

getfattr Borat\ \(2006\).mp4
# file: Borat (2006).mp4
user.DOSATTRIB
Run Code Online (Sandbox Code Playgroud)

为了解决这个问题,我使用命令删除了扩展属性setfattr -x user.DOSATTRIB #filename。所以对于上面的例子做:

setfattr -x user.DOSATTRIB Borat\ \(2006\).mp4
getfattr Borat\ \(2006\).mp4
Run Code Online (Sandbox Code Playgroud)

未返回任何扩展属性,并且可以再次访问我的网络共享文件。

我目前正在弄清楚如何setfattr -x user.DOSATTRIB在我的文件夹上递归运行。当我想通之后,我会编辑这个回复。

更新:好的,所以我做了一种草率的解决方案。

  1. 首先,我getfattr -R Movies > DOS-Movies.txt在我的电影文件夹上方的目录中使用了该命令。上面的命令getfattr在电影文件夹上递归运行并返回所有具有扩展属性的文件和文件夹,然后将它们保存在一个文本文件中。
  2. 我在 Notepad++ 中打开了该文本文件以稍微清理它,因为存在我不想删除的其他属性,例如“user.encryptable”。
  3. 我使用正则表达式(?-is)^.+\Ruser.encryptable\R删除了包含该属性和上一行(文件名)的行。我还删除了所有空行,所以我最终得到了# file: Movies/Dune (1984)/Dune (1984).mp4= 只是具有 DOSATTRIB 扩展属性的文件,每行一项。我还使用查找/替换来查找\r\n和替换以"\r\n在每行末尾添加一个 " 字符。
  4. 删除属性的命令是setfattr -x user.DOSATTRIB,所以我做了一个基本的查找/替换,最后每一行看起来像这样:setfattr -x user.DOSATTRIB "Movies/Dune (1984)/Dune (1984).mp4"
  5. 然后我只是粘贴了删除所有文件和文件夹上的 DOSATTRIB 的命令,再次将它们呈现为可从 Windows 读取。

希望这可以帮助!

  • 谢谢!我一直在寻找造成这种情况的根本原因,新文件还可以,但无论我做什么,旧文件都一直显示为文件夹:重命名文件、编辑元数据(使校验和无效)、重置 smb 缓存。以下是如何以递归方式清除文件夹中所有文件的 DOS 属性:`find 。-type f -exec setfattr -x user.DOSATTRIB "{}" \;` (4认同)

小智 6

作为删除属性的替代方法,该属性确实适用于当前共享的文件,但不一定适用于将来添加的新文件,您还可以禁用该选项,该选项自 samba 4.9.0 起默认启用,并导致此问题问题。(至少这是我的经验)

使用您喜欢的文件编辑器编辑 /etc/samba/smb.conf 并禁用存储 dos 属性的选项。

[global]
...

# Make sure files are not shown as folders!
store dos attributes = no
Run Code Online (Sandbox Code Playgroud)

之后通过 重新启动 SMB sudo systemctl restart smbd

显然它被启用“[...]以在默认安装中提供更好的Windows文件服务器兼容性。”