重複ブロックの書き込みが抑制されるように、CIFS/SMBの書き込みを最適化することを検討しています。たとえば、リモート共有からファイルを読み取り、ファイルの終わり近くの部分を変更します。ファイルを保存するとき、実際に変更されたファイルの部分についてのみ、リモート側に書き込み要求を送り返したいと思います。したがって、基本的に、重複しない書き込みが発生するまで、すべての書き込みを抑制します。その時点で抑制が無効になり、通常どおり書き込みが許可されます。問題は、MS-SMB / MS-SMB2 / MS-CIFSなど、これが有効なことであるかどうかを示すドキュメントが見つからないことです。これが有効かどうか誰かが知っていますか?
3 に答える
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実際には、これはターゲットファイルの5つのうちブロック#4のみを変更する必要があります。ブロックサイズを調整できると思います...私は4MBのブロックでこれを行いました。しかし、ネットワーク上で何が起こっているのかを理解するのに役立つはずです。
CIFSプロトコルを使用すると、アプリケーションはファイルの特定の部分を書き戻すことができます。これは、SMBWriteAndXパケットのパラメーターDataOffsetおよびDataLengthによって制御されます。
同じドキュメントはここにあります:http: //msdn.microsoft.com/en-us/library/ee441954.aspx
クライアントはこれらのフィールドを使用して、ファイル内の特定のオフセットに特定の長さのデータを書き込むことができます。
同様のサポートは、プロトコルのより新しいバージョンにも存在します...
SMBプロトコルには、このような書き込みの最適化があります。これは、appendcifs操作で機能します。プロトコルがファイルのEOFを読み取り、オフセットをEOF値に設定し、データバイトを追加する長さで新しいデータの書き込みを開始する場合。