如果我让 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 和本地文件访问之间实现完全数据一致性
当oplocks
和kernel oplocks
都启用时,您应该获得良好的性能(来自缓存)并在文件更新时缓存失效。
要启用内核机会锁,请将此行添加到您的 Samba 配置文件中:
kernel oplocks = yes
答案2
我通过放置解决了这个问题
oplocks = False
在我的共享设置下的 smb.conf 中。
https://www.samba.org/samba/docs/old/Samba3-HOWTO/locking.html#id2615926