从 linux samba 共享和缓存中读取文件

Reading file from linux samba share and caching

有 2 个相似的设置:

  1. Ubuntu 16.04 服务器,其中有一个共享文件夹 \\linux\data 和文件 test.txt (Samba 4.3.9-Ubuntu)
  2. Windows Server 2012 服务器,其中有共享文件夹 \\win\data 和文件 test.txt

有另一台 PC (Win 7) 和一个 C# 测试程序,它在循环中从上述任一设置读取文件内容,如下所示:

  1. 读取文件,记住数据大小
  2. 等待 500 毫秒
  3. 再次读取文件,如果大小发生变化 - 从文件末尾打印出大小和几个字节的内容,更新存储的大小
  4. 转到 2.

现在,当我 运行 使用设置 #1(赢得共享)进行测试时 - 如果我在服务器上打开文件,修改内容并保存 - 我可以立即在测试程序中看到反应 - 首先文件修改后的循环迭代给我带来了新的文件大小和新数据。

但是当我 运行 使用设置 #2 进行相同的测试(ubuntu 共享)时 - 我在测试程序中看不到修改后的大小或内容,直到一段时间过去(那时候取决于我用来读取文件内容的方法。使用 FileStream 大约需要 10 秒,使用 File.ReadAllBytes 则需要 30 秒到 10 分钟)。

有关设置 #2 的一个有趣说明 - 如果我修改 Ubuntu 中的文件,然后转到测试 PC(测试程序现在正在循环,尝试获取更新的文件内容)并打开共享用记事本文件 - 测试程序立即获取更新的内容。

对我来说,它看起来像是测试机器上的客户端缓存。我唯一能想到的是 Win Server 2012 使用 SMB3 和 Ubuntu - SMB2_10 这会以某种方式迫使客户端(测试 reader 部分)以不同的方式运行。

我不是 linux 专家,据我所知,无法在 Ubuntu 中启用 SMB3 协议(它可以用作 SMB3 客户端,但不能用作服务器)

所以问题是如何强制客户端 (Win 7) 在不使用缓存的情况下读取,而不管服务器类型和协议版本如何,或者,如果不可能 - 如何使用记事本模仿 C# 代码打开文件,这显然给了它一个刺激并迫使所有 reader 获取更新的内容。

发现在 linux samba 配置 (smb.conf) 中禁用机会锁 (oplocks) 有帮助。

在禁用 OpLocks 的情况下,客户端计算机上的测试程序会在没有缓存的情况下获取更新的内容。