我遇到了一个问题,删除已安装的 Samba 共享上的文件夹符号链接时,从我的 Macbook 访问目标文件夹时也会删除目标文件夹的内容。这实际上是我多年来一直遇到的问题,尽管使用了不同的机器和操作系统版本,但问题仍然存在。
事件的顺序如下:
- 触摸 foo/bar/1.txt
- 创建指向 Ubuntu 机器上文件夹的符号链接,即 ln -s foo/bar bar2
- 在 Mac 上安装包含 bar 2 符号链接的 Samba 共享
- 通过 Mac 删除 bar2 符号链接。
- 符号链接 bar2 将被删除,但文件 foo/bar/1.txt 也将消失。foo/bar 中的任何文件或文件夹都将消失。
目前,我正在运行 El Capitan、Ubuntu 16.04 和 Samba 4.3.11。
我的 smb.conf 中有以下选项,这些选项是我唯一想到的可能涉及的内容:允许不安全的宽链接 = 是 unix 扩展 = 否
答案1
由于 Windows 文件共享以及原始 Samba 没有符号链接的概念,因此它通常会通过符号链接删除所有文件夹树。但是您可以尝试更改为,unix extensions = yes
因为您的 OSX 也可能理解这一点。
从页面https://www.samba.org/samba/docs/man/manpages/smb.conf.5.html#UNIXEXTENSIONS
unix 扩展(G)
此布尔参数控制 Samba 是否实现 HP 定义的 CIFS UNIX 扩展。这些扩展通过支持符号链接、硬链接等功能使 Samba 能够更好地为 UNIX CIFS 客户端提供服务。这些扩展需要启用类似的客户端,目前对 Windows 客户端没有用处。
注意如果打开此参数,宽链接参数将自动被禁用。
如果您希望更改两个参数之间的这种耦合,请参阅参数允许不安全的宽链接。
默认值:unix 扩展 = yes
您可能需要进一步调查不安全的宽链接选项,因为您可能希望关闭它以获得您想要的结果。
由于许多系统执行删除文件夹结构的方式不同,上述操作可能仍无法按您的意愿进行。通常,顺序如下
- 客户端错误地检测要删除的对象是一个文件夹结构而不是符号链接。
- 客户端以递归方式继续到树的最深层并删除这些文件夹的所有内容。
- 客户端会从最深层返回到你告诉它删除的文件夹,并删除这些文件夹
- 最后,一旦文件夹为空,客户端将发送删除文件夹的命令
- 然而,因为该文件夹实际上是一个符号链接,所以主机只会删除该符号链接。
这就是目标内容与符号链接一起被删除的方式,但实际的目标文件夹不会丢失。
类似地,当指示删除符号链接文件时,只会删除符号链接。符号链接文件夹结构的问题是,samba 客户端会先向所有内容发送删除命令,然后再指示服务器删除文件夹的符号链接。