如果读取文件的时间间隔

如果读取文件的时间间隔

如果我让 Windows 客户端以 <= 10 秒的间隔读取 Linux smb 共享上的文件,则 Windows 客户端将显示该文件的错误(缓存?)信息。

我已经在多个系统上重现了这个。

重现步骤示例:

1) 设置 linux samba 共享 - 本例中使用 Debian 并安装 samba。例子:

sudo mkdir /test
sudo chmod 777 /test

smb.conf添加:

[test]    
read only = no    
locking = no    
path = /test/    
guest ok = yes

2)将此目录映射为Windows客户端中的驱动器(本测试将使用L:)

3) 在 samba 服务器上创建一个包含一些文本的文件

nano /test/test.txt
ORIGINAL

4)在Windows机器上创建简单的批处理文件以每5秒查看一次文件:

copy con test.bat
@echo off
cls
:1
type L:\test.txt
timeout 5
goto 1

5) 运行批处理文件,它应该每 5 秒显示一次 ORIGINAL。

6) 在linux服务器上,更改文件内容

nano /test/test.txt
CHANGED

7)在Windows上查看正在运行的批处理文件,它仍然会每五秒显示一次“ORIGINAL”,而不是像真实文件那样显示“CHANGED”。

8) 终止批处理文件并等待约 15 秒,或者将超时更改为 > 10 秒,它将正确更新。

希望我已经解释并概述了如何充分测试这一点。

任何人都可以重现此行为和/或建议如何解决此问题吗?

笔记:

Linux 客户端 > Linux SMB 主机显示正确的文件内容。

Windows 客户端 > Windows SMB 主机显示正确的文件内容。

特别是 Windows 客户端 > Linux SMB 主机在刷新间隔 <= 10 秒时无法显示正确的文件内容。

我测试过的所有 Windows 版本(Win7、Win10、Server2016)都表现出相同的行为。

我还在我的 samba 共享“NT1、SMB2、SMB3”上测试了不同的协议,它们不会改变行为。

注意:我认为这很可能是 Windows 问题,但一周内我没有在 technet 或超级用户上收到任何回复。这应该很容易测试,任何人都可以确认这种行为或以其他方式说明吗?

答案1

相关设置的默认值为:

  • oplocks = yes
  • kernel oplocks = no

(参见桑巴舞smb配置文件文档)


您可以按照另一个禁用机会锁回答

或者,如果您运行的是具有现代内核(2.4 或更高版本)的 Linux 操作系统,您可以离开oplocks = yes反而添加一行以smb.conf启用内核机会锁。按照内核机会锁 (S)文档中的部分:

内核机会锁支持允许在本地 UNIX 进程或 NFS 操作访问 smbd(8) 已锁定的文件时破坏 Samba 机会锁。这允许 SMB/CIFS、NFS 和本地文件访问之间实现完全数据一致性

oplockskernel oplocks都启用时,您应该获得良好的性能(来自缓存)并在文件更新时缓存失效。

要启用内核机会锁,请将此行添加到您的 Samba 配置文件中:

kernel oplocks = yes

答案2

我通过放置解决了这个问题

oplocks = False

在我的共享设置下的 smb.conf 中。

https://www.samba.org/samba/docs/old/Samba3-HOWTO/locking.html#id2615926

相关内容