如何让 Samba 的 vfs fruit 与 Linux 内核上的大型 macOS 扩展属性一起工作?

如何让 Samba 的 vfs fruit 与 Linux 内核上的大型 macOS 扩展属性一起工作?

我有一个 macOS 客户端(12.6.7),它带有 APFS 文件系统,支持大型扩展属性(测试中一个属性值超过 68 MB)。

我有一台 NAS 服务器,其中安装了 Ubuntu Server 22.04.2 LTS、ZFS 文件系统和 Samba 版本 4.15.13-Ubuntu。

ZFS 已设置 xattr=sa。因此 NAS 上已启用扩展属性。

我配置 Samba 运行vfs fruit如下:

ea support = yes
vfs objects = catia fruit streams_xattr
fruit:resource = stream
fruit:metadata = stream

通过此配置,我能够将较小的扩展属性和资源分支(小于 64 KB)写入 NAS 共享。

但是,当扩展属性和资源分支较大(超过 64 KB)时,它就无法工作了。

在查阅了大量的线索、手册页和代码之后,我偶然发现了这个小笔记在 zfs 手册页中:

xattr = 开 | 关 | sa

on 的默认值启用基于目录的扩展属性。这种扩展属性对文件上可设置的属性的大小或数量没有实际限制。尽管在 Linux 下,getxattr(2) 和 setxattr(2) 系统调用将最大大小限制为 64K。

太酷了,我们在 Linux 上有一个“没有实际限制”的 ZFS,只是 Linux 内核(作为一个实用的东西)在实践中限制了扩展属性的大小。

好的,所以我无法在 ZFS 端和 Linux 端修复它。

下一步是桑巴具体来说。

由于扩展属性的大小限制,我需要为它们提供另一种存储方式。对于资源分支,有一个设置可以将它们写入文件:

fruit:resource = file

启用此功能后,我可以将大型资源分支写入共享。

但是 fruit 没有选择将其他元数据(如扩展属性)写入伴随文件:

水果:元数据 = [ 流 | netatalk ]

  • netatalk(默认)- 使用 Netatalk 兼容 xattr
  • stream - 将流传递到 VFS 堆栈中的下一个模块

stream不起作用,因为 streams_xattr 尝试将其写入扩展属性。

netatalk不起作用,因为 fruit 尝试将其写入与 netatalk 兼容的命名扩展属性中。

为什么没有将元数据写入文件的选项?

这将使 Samba 更加独立于所提供的底层文件系统(即使它根本没有扩展属性)。

我当前的解决方案是使用:

ea support = no

这将迫使 macOS 客户端创建Apple双文件用于其资源分支和扩展属性。

这样,来自客户端的资源分支和扩展属性就得以保留。

当然,这与 Windows 客户端不兼容,目前对我来说还可以,但这是我使用这个盒子的一个重大限制。

此外,由于vfs fruit需要ea support = yes,我无法使用它。从我读到的水果来看,这意味着会降低 NAS 性能,而且我也不容易设置 Time Machine。我甚至不知道其他后果。水果似乎实现了 FULLSYNC 功能(参见fruit:time machine)。从遗留的 Apple 文档它读起来就像是在电源故障时需要一个干净的 Time Machine 备份。

我也考虑过将流写入数据库,但如果这个 vfs 对象出现问题,修复起来会困难得多(有关更多信息)。请注意“不要在生产中使用该模块”。

切换到没有扩展属性限制的操作系统来让 Samba 正常工作不是一个选择...至少目前是这样。

是否有其他选项可以在 Linux 系统上完全支持 macOS 资源分支和扩展属性,而无需禁用 samba 共享(以及 vfs fruit)上的扩展属性?

相关内容