当在 samba 共享上从一个点到另一个点(在同一驱动器上)创建符号链接时,保存符号链接的文件在其他客户端上会变得混乱,但在原始客户端上不会。
例如,在建立链接的客户端上,符号链接运行良好,并且被原始操作系统识别,即使在重新安装后也是如此:
lrwxrwxrwx 1 g g 38 Mar 17 11:15 npm2 -> ../lib/node_modules/npm/bin/npm-cli.js
但是,在服务器或其他客户端上,该链接是一个内容如下的文件:
XSym
0038
36c91a46c3a5a86837deff259c6d0874
../lib/node_modules/npm/bin/npm-cli.js
... 具有权限:
-rwxrw-r-- 1 z z 1067 Mar 17 11:15 npm2
所以...基本上...这是某种安装错误,或者其他什么,但我有没有什么办法可以使用 chmod 将其“meep”到原始的预期符号链接中?这会很有帮助。
答案1
不,您不能使用 chmod 来更改文件的基本类型。但它是一个文件,并不是因为任何错误——它之所以是一个文件,是因为 Samba 服务器将它创建为一个文件,而这本身可能只是因为客户端实际上问它会创建一个包含这些特定内容的文件。
常规 SMB 对符号链接一无所知,最常见的 SMB 服务器 (Windows) 很长时间也不支持符号链接。因此,各种 SMB 客户端发明了将符号链接存储为形状怪异的常规文件的方法。
你的特定格式称为米歇尔+法语符号链接,由 macOS 和 Linux“cifs”内核模块使用 - 如果使用该选项安装共享mfsymlinks
,则 Linux 会识别“XSym”标记并佯装它是客户端应用程序的符号链接。因此,如果一个客户端使用此选项,则所有其他客户端也必须使用相同的选项。
不幸的是,如果你想要真实的服务器上的符号链接,您需要使用 SMBv1(又名“NT1”),并确保服务器和客户端都支持“CIFS Unix Extensions”。请注意,这是不是计划与即将推出的 SMBv3 POSIX 扩展一起工作——Samba 开发人员明确表示,他们不希望再存在创建服务器端符号链接的能力(由于重大安全问题),并且当 Samba 在 SMBv3 中获得对 POSIX 功能的支持时,它将继续创建那些“特殊文件”。
作为对原始问题的不同回答,可能是技术上可以使用“debugfs”类型的工具将文件更改为符号链接并改回,但这在很大程度上取决于特定文件系统的内部结构。(其中一些可能将符号链接存储得与常规文件完全相同,只是类型位不同……但其他文件系统(如 NTFS)可能具有完全不兼容的格式。)
但这通常只在修复严重损坏的文件系统时才会执行,而不是作为正常操作的一部分。当然,如果原始“伪符号链接”文件包含 MF 格式的数据,它不会有任何好处,因为那是不是与您的文件系统内部使用的格式相同。