SMB2 通信を利用してファイルが正しく参照できないことがある

適用対象: Windows Server 2008 R2 DatacenterWindows Server 2008 R2 EnterpriseWindows Server 2008 R2 Foundation 詳細

現象


 ファイルサーバ上の共有フォルダにあるファイルなどに対して操作を行うと、SMB2 が利用されている場合、ファイルが正しく保存されない、内容が破損してしまう、などの問題が発生することがあります。


原因


SMB2 では一度参照したファイルに関してのキャッシュ情報を持ちます。
キャッシュが存在する場合、ファイルの読み取り、書き込み時にもファイル キャッシュを利用します。
このとき、実際のファイルが更新され、ファイル キャッシュが最新の状態では無い場合があります。

この状況で古いキャッシュ情報に含まれるファイル サイズの情報を使用することで、誤った位置にファイル ポインタが設定される可能性があります。
その結果として、ファイルの読み取り、書き込みが発生した場合、ファイルの内容が正しく保存されない、または破損してしまうという現象が発生します。


解決方法


この問題に対処するためには、以下のいずれかの方法を実施します。



方法1

クライアント端末に、修正モジュールを適用します。

修正モジュールは、以下のサポート技術情報にて公開されています。 

- Windows Server 2008 / Windows Vista 用の修正モジュール
文書番号: 2635024
タイトル: Data corruption occurs when a user updates a shared file on a computer that is running Windows Vista or Windows Server 2008
URL:http://support.microsoft.com/kb/2635024


- Windows Server 2008 R2 / Windows 7 用の修正モジュール
文書番号: 2618096
タイトル: Data corruption when one user on a computer that is running Windows 7 or Windows Server 2008 R2 updates a shared file that is open on multiple computers by using SMB Version 2
URL: http://support.microsoft.com/kb/2618096/



方法2 

SMB 2 におけるファイルキャッシュを 無効化するよう設定します。

この設定はクライアントにて設定します。

1. レジストリエディタを開きます。

2. 以下のレジストリを設定します。

キー: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters
 
タイプ : DWORD

値 :

FileInfoCacheLifetime

FileNotFoundCacheLifetime

DirectoryCacheLifetime

※無効にするには値に 0 を設定します。レジストリが存在しない場合には手動で追加してください。
 
3.編集が終わったらレジストリエディタを閉じます。 

4. OS再起動します 


方法 3

SMB2 を利用しないように設定します。
この設定は、共有フォルダを提供しているファイル サーバーにて設定します。

1. レジストリエディタを開きます。

2. 以下のレジストリを設定します。


キー : HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters

名前 : SMB2

種類 : REG_DWORD

デフォルト : 1 (有効)

※無効にするには 0 を設定します。レジストリが存在しない場合には手動で追加してください。 



3.編集が終わったらレジストリエディタを閉じます。 

4. サーバーサービスの再起動、またはOS再起動します。


 

状況


この問題をマイクロソフトの問題として認識しています。