为什么 SAMBA 共享上的绝对符号链接直接跟在 CIFS 挂载之后?

smi*_*-on 8 samba symlink cifs

如果 SMB 共享具有带绝对路径的符号链接,/share/latest/dir -> /share/data/201407则 Windows 客户端可以毫无问题地通过链接访问文件。

dir \\smbserver\share\latest\dir\
Directory: \\smbserver\share\latest\dir\
file a ...
Run Code Online (Sandbox Code Playgroud)

但是 unix 客户端在相同共享的 cifs 挂载上出现错误。

ls /mnt/share/latest/dir/ 
/mnt/share/latest/dir/ : No such file or directory
Run Code Online (Sandbox Code Playgroud)

为什么 Samba 挂载不遵循符号链接?如何获得 CIFS 挂载以跟踪符号链接?

smi*_*-on 9

问题是 SAMBA 服务器内置了对 unix (cifs) 客户端的特殊支持。当您在 linux 主机上使用 mount -t cifs 时,所有符号链接都会按原样传递给您(cifs 客户端)。

ls /mnt/share/latest/dir/ -l 
/mnt/share/latest/dir/ -> /opt/share/data/201407
Run Code Online (Sandbox Code Playgroud)

您可能不喜欢此功能,但这是一个有其优点的设计决策,ea 不是错误,而是一个功能!:) 但有解决办法:

1)将共享目录中的绝对符号链接替换为相对符号链接。

smbserver:~> ln -s ../../data/201407 /opt/share/latest/dir
Run Code Online (Sandbox Code Playgroud)

2) 在 SAMBA 服务器上禁用对 UNIX 客户端的特殊支持。如果unix extensions参数设置为“no”,则 Windows 和 Linux 客户端将获得相同的结果。

smbserver:~# vi /etc/samba/smb.conf
[global]
unix extensions = No
smbserver:~# restart smbd
Run Code Online (Sandbox Code Playgroud)

3) 在您的 SAMBA 客户端上禁用对 UNIX 的特殊支持。挂载共享时使用nounix选项。nounix 选项禁用 CIFS Unix 扩展,以便不使用 UNIX ACL、节点 ID 和锁。

client:~$ sudo mount -t cifs -o nounix //smbserver/share /mnt
Run Code Online (Sandbox Code Playgroud)