如果以 <= 10 秒的間隔讀取文件,Windows 客戶端將不會在本地刷新 Linux samba 文件
如果我有一個 Windows 客戶端以 <= 10 秒的間隔讀取 Linux smb 共享上的文件,則 Windows 客戶端將顯示該文件的不正確(記憶體?)資訊。
我已經在多個系統上複製了這個。
重現的範例步驟:
- 設置 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:)
- 在 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 秒顯示一次 ORIGINAL。
6)在linux伺服器上,更改文件內容
nano /test/test.txt CHANGED
7)在windows上查看正在執行的批處理文件,它仍然會每五秒說一次“ORIGINAL”,而不是像真正的文件那樣“CHANGED”。
8)終止批處理文件並等待〜15秒,或者將超時更改為> 10秒,它將正確更新。
希望我已經解釋並概述瞭如何充分測試這一點。
誰能重現這種行為和/或建議如何解決這個問題?
.
.
.
筆記:
Linux Client > Linux SMB Host 顯示正確的文件內容。
Windows 客戶端 > Windows SMB 主機顯示正確的文件內容。
特別是 Windows 客戶端 > Linux SMB 主機不會以 <= 10 秒的刷新間隔顯示正確的文件內容。
我測試過的所有 Windows 版本(Win7、Win10、Server2016)都表現出相同的行為。
我還在我的 samba 共享“NT1、SMB2、SMB3”上測試了不同的協議,它們不會改變行為。
注意:我認為這很可能是一個 Windows 問題,但我在一周內沒有收到關於 technet 或超級使用者的任何回复。這應該很容易測試,任何人都可以確認這種行為或以其他方式說明嗎?
我通過放置解決了這個問題
oplocks = False
在我的共享設置下的 smb.conf 中。
https://www.samba.org/samba/docs/old/Samba3-HOWTO/locking.html#id2615926
相關設置的預設值為:
oplocks = yes
kernel oplocks = no
(參見 Samba smb.conf文件)
根據另一個答案,您可以禁用 oplocks 。
或者,如果您正在執行具有現代核心(2.4 或更高版本)的 Linux O/S,您可以離開
oplocks = yes
並添加一行來smb.conf
啟用核心 oplocks。根據文件中的核心 oplocks (S)部分:核心 oplocks 支持允許在本地 UNIX 程序或 NFS 操作訪問 smbd(8) 已 oplocked 的文件時破壞 Samba oplocks。這允許 SMB/CIFS、NFS 和本地文件訪問之間的完全數據一致性
當
oplocks
和kernel oplocks
都啟用時,您應該在文件更新時獲得良好的性能(來自記憶體)和記憶體失效。要啟用核心 oplocks,請將此行添加到您的 Samba 配置文件中:
kernel oplocks = yes