Linux

如果以 <= 10 秒的間隔讀取文件,Windows 客戶端將不會在本地刷新 Linux samba 文件

  • February 16, 2019

如果我有一個 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:)

  1. 在 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
  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 和本地文件訪問之間的完全數據一致性

oplockskernel oplocks都啟用時,您應該在文件更新時獲得良好的性能(來自記憶體)和記憶體失效。

要啟用核心 oplocks,請將此行添加到您的 Samba 配置文件中:

kernel oplocks = yes

引用自:https://unix.stackexchange.com/questions/425934