2012-12-06 30 views
0

我正在研究爲CIFS/SMB進行寫入優化,以避免重複塊的寫入。例如,我從遠程共享中讀取一個文件並修改文件末尾附近的一部分。當我保存文件時,我只想將寫入請求發送回遠程端,以獲取實際更改的文件部分。所以基本上,禁止所有寫操作,直到遇到非重複寫操作爲止。此時,壓制將被禁用,寫入將被允許照常進行。問題是我找不到任何文檔MS-SMB/MS-SMB2/MS-CIFS或其他表明這是否是有效的事情。有誰知道這是否有效?CIFS/SMB寫入優化

回答

0

深入研究Linux內核的來源,有關於CIFS的文檔 - 無論是源代碼還是文本。例如。 http://www.mjmwired.net/kernel/Documentation/filesystems/cifs.txt

如果你想研究例如CIFS協議,您可以使用unix命令「dd」對其進行測試。通過CIFS掛載任何遠程文件系統,例如到/media/remote。更改到此文件夾

cd /media/remote
現在創建一個包含一些隨機內容的文件(例如來自內核的隨機池):
dd if=/dev/urandom of=test.bin bs=4M count=5
在此示例中,您應該看到一些20MB的流量。然後在你的機器上的某個地方創建另一個較小的文件,比如說你的個人文件夾:
dd if=/dev/urandom of=~/test_chunk.bin bs=4M count=1
如果你試圖將這個塊寫入遠程測試文件的特定位置,那麼會發生什麼?
dd if=~/test_chunk.bin of=test.bin bs=4M count=1 seek=3 conv=notrunc
實際上,這隻應該改變目標文件中的塊#4中的5個。 我想你可以調整塊大小......我用4 MB塊做了這個。但它應該有助於理解網絡上發生的事情。

+0

感謝您指出我在那個方向,但它並沒有太大的幫助。這是一個優化,我沒有看到其他人使用,因爲我已經檢查了很多數據包捕獲。我希望協議有一些可以說的話,但也許這將更多地是一個特定於應用程序的事情。 – Chappelle

+0

該協議需要支持它,這就是爲什麼尋找例如來源是有道理的。但是,是的,實際行爲應該由應用程序定義。應該很有趣,在用作以CIFS方式安裝的文件系統上時,「dd」命令的行爲如何。您可以使用dd來處理文件的特定塊。在這一個上做數據包捕獲必須非常有趣:-) –

+0

我更新了一些基於「dd」的測試用例。 –

0

CIFS協議確實允許應用程序回寫文件的特定部分。這由SMB WriteAndX數據包中的參數DataOffset和DataLength控制。對於相同的

文檔可以在這裏找到: http://msdn.microsoft.com/en-us/library/ee441954.aspx

客戶端可以使用這些字段將數據寫入到文件內的特定偏移的特定長度。

在協議的更新版本中也存在類似的支持...