我记得过去使用过不同的系统,许多写入 Netapp 共享的 Windows SMB 客户端的默认行为是打开的文件会自动锁定。其他程序(如运行备份的程序)在尝试读取此打开的文件时会出错。
现在有人有一个依赖于此行为的工作流程,但这似乎并不属实。我可以dd
在 Linux CIFS 挂载上打开 Word 文档或文件,当它打开时,我可以从另一个 CIFS 客户端读取整个内容。
假设我没有想象过这种行为,有什么方法可以重现它吗?我尝试过启用和未启用 SMB2 以及启用和未启用 oplocks 的 netapp。我尝试过使用不同版本的 OnTap 的文件管理器。我没有看到 Linux 上任何会影响行为的挂载选项。默认情况下,这些配置都不会给我拒绝读取锁定。
目标:允许客户端写入 SMB 共享,但拒绝其他客户端的读取访问,直到文件关闭。
答案1
从samba 文档:
严格来说,SMB 服务器应该在每次对文件进行读写调用之前检查锁定。不幸的是,由于 fcntl() 的工作方式,这可能会很慢,并且可能会使 rpc.lockd 压力过大。这几乎总是不必要的,因为如果锁定对客户端很重要,客户端应该在读写之前独立地进行锁定调用。默认情况下,Samba 仅在客户端明确要求时进行锁定调用,但如果您设置
strict locking = yes
,它将在每次读写调用时进行锁定检查调用。第二类锁定是拒绝模式。这些模式由应用程序在打开文件时设置,以确定应在打开文件的同时允许哪些类型的访问。客户端可能会要求 DENY_NONE、DENY_READ、DENY_WRITE 或 DENY_ALL。还有称为 DENY_FCB 和 DENY_DOS 的特殊兼容模式。
简而言之,您可以尝试使用strict locking = yes
,看看是否有所不同。无论如何,真正的解决方案是让生产者/写入者进程以正确的模式打开文件:DENY_ALL
答案2
此行为由 smb oplock 或 leases 控制。客户端是定义此行为的地方。换句话说。这取决于您的应用程序。所有这些都假设 ontap 完全符合 smb 规范(90% 是正确的)