从linux samba共享和缓存中读取文件
本文关键字:读取 文件 缓存 linux samba 共享 | 更新日期: 2023-09-27 18:08:09
有两个类似的设置:
- Ubuntu 16.04服务器,包含一个共享文件夹''linux'data和test.txt文件(Samba 4.3.9-Ubuntu)
- Windows Server 2012服务器共享文件夹''win'data和test.txt文件
有另一台PC (win7)和一个c#测试程序,它从上述设置中读取文件内容,循环如下:
- 读取文件,记住数据大小
- 等待500 ms
- 再次读取文件,如果大小发生变化-从文件末尾打印出大小以及几个字节的内容,更新存储的大小
- goto 2。
现在,当我用setup #1 (win share)运行测试时-如果我在服务器上打开文件,修改内容并保存-我可以立即看到测试程序中的反应-文件修改后的第一次循环迭代给我带来了新的文件大小和新数据。
但是当我用setup #2 (ubuntu共享)运行相同的测试时,直到一段时间过去(这个时间取决于我使用什么方法读取文件内容),我才在测试程序中看到修改的大小或内容。对于FileStream,大约是10秒。ReadAllBytes从30秒到10分钟不等)。
关于设置#2的一个有趣的注意事项-如果我在Ubuntu中修改文件,然后转到测试PC(测试程序现在正在循环,试图获得更新的文件内容)并用记事本打开共享文件-测试程序立即获得更新的内容。
对我来说,它看起来像测试机器上的客户端缓存。我唯一能想到的是,Win Server 2012使用SMB3和Ubuntu - SMB2_10,这在某种程度上迫使客户端(测试阅读器部分)以不同的方式运行。
我不是linux专家,据我所知,在Ubuntu中没有办法启用SMB3协议(它可以作为SMB3客户端工作,但不能作为服务器)
所以问题是如何强制客户端(win7)读取没有缓存,无论服务器类型和协议版本,或者,如果不可能-如何模仿c#代码打开文件与记事本,这显然给它一个踢,并迫使所有的读者得到更新的内容。
说明在linux samba配置(smb.conf)中禁用机会锁(oplocks)有帮助。
禁用OpLocks后,客户端机器上的测试程序可以在没有缓存的情况下获得更新的内容。