DFS レプリケーションで一部複製されないファイルがある
こんにちは。Windows プラットフォーム サポートの崔です。
冗長化を図るために DFSR でファイル サーバーを構築しているのに、複製対象の一部のファイルが正しく複製されず、あれっ?片方のサーバーにしかファイルがないぞ! といった経験をされたことはありませんでしょうか?
同じフォルダ内の同じ拡張子の他のファイルは全部複製されてるのに、一部のファイルだけが複製されない問題の原因として、DFSR の動作に問題があるのではなく、複製されないファイル自体の属性に影響されている場合があります。今回は、上記のように、ファイル自体が問題で複製されない問題が発生するシナリオについてお伝えしたいと思います。もちろん今回紹介するシナリオ以外が原因である可能性もありますが、以下のシナリオに該当しているかについても、一度確認してみると良いと思います。
該当ファイルは実は一時ファイルの属性を持っている一時ファイルだった
==================================================================
一部のファイルだけが複製されない場合にまず考えられることとして、該当ファイルが一時ファイルではないかということです。.tmp などの拡張子を持つ一時ファイルは、DFSR の複製対象となりません。そのため、もし該当ファイルが一時ファイルの属性 (FILE_ATTRIBUTE_TEMPORARY 属性) を持っているのであれば、DFSR としては当然のように、該当ファイルの複製を行なう必要がないと判断します。
では、該当ファイルが一時属性を持っているかどうかをどのように判断したらよいでしょうか。答えは fsutil.exe です。fsutil.exe は Windows OS に既定で含まれています。このツールは、検証作業などで、大きなサイズのファイルが必要になった時などにも多く使われるため、耳にされたことがあるかもしれませんが、fsutil.exe を使用することで、設定されている属性などのファイルの詳細な情報を確認することが出来ます。
早速、複製されなかった該当ファイルの情報を確認してみましょう。
以下の図のように、コマンド プロンプトにて "fsutil usn readdata ファイルパス" と実行することで、該当ファイルの情報が表示されます。
コマンド実行結果の中に "ファイル属性" という項目があります。通常のファイルの場合、この値は 0x20 となります。しかし、上記図では、この値が 0x120 となっています。これは、該当ファイルが一時ファイル (0x100 = 一時属性 (FILE_ATTRIBUTE_TEMPORARY 属性) + 0x20 = ファイル属性) であることを表しております。
よって、もし複製されないファイルに対して fsutil. コマンドを実行した結果、ファイル属性が 0x120 であれば、複製されなかった原因は、該当ファイルが一時ファイルの属性を持っているためとなります。
また、一時ファイルの属性を持っていたことが原因で DFSR で複製が行なわれなかった場合、DFSR のデバッグ ログからもその動作を確認することが出来ます。DFSR のデバッグ ログは既定で C:\Windows\Debug フォルダ配下に保存されている Dfsr00001.log.gz や Dfsr00009.log といったファイルです。
複製が行われた時間が含まれるファイルを notepad.exe などで開くことで、ファイルの複製状況を確認することが可能ですが、一時ファイルの属性が原因で複製されなかった場合には、以下のような内容がログされます。
赤い下線に記載されているように ("ProcessUsnRecord Skipping USN_RECORD with FILE_ATTRIBUTE_TEMPORARY flag")、このファイルは一時ファイル属性が設定されているので、複製はスキップしますよ! ということです。
robocopy.exe を使用した対応策
==================================================================
では、このようなファイルを複製するためにはどうしたらよいでしょうか。それはもちろん一時ファイル属性をはずせばいいのです! Robocopy.exe を使用して以下のコマンドを実行することで、一時ファイル属性は簡単に解除することが出来ます。
robocopy コピー元フォルダのパス コピー先フォルダのパス コピーするファイルの名前 /A-:T
* Windows Server 2008 や Windows Server 2008 R2 のファイル サーバーであれば、robocopy.exe は既定で含まれております。また、Windows Server 2003 には既定では含まれていませんが、Windows Server 2003 用の Resource Kit をインストールすることで、robocopy.exe を使用することが出来ます。
- robocopy.exe を使用してファイルの一時ファイル属性をはずす方法
作業の流れとしては、以下のようになります。
1) robocopy.exe を使用して、一時ファイル属性が設定されているファイルを一度 DFSR 複製対象ではないフォルダに、一時ファイル属性をはずした状態でコピーします。* このとき、別のフォルダではなく、オリジナルのファイルがあるフォルダに robocopy.exe でコピーしても一時ファイル属性は外れませんので、注意してください。
2) 一時ファイル属性が設定されているオリジナルのファイルを削除します。
3) 一時ファイル属性をはずしたファイルを DFSR 複製対象フォルダにコピーします。
これにより、DFSR としては、一時ファイル属性を持たないファイルが作製されたため、これをレプリケーション パートナーに複製するようになります。
では詳細な手順を確認してみましょう。
今回の例では C:\abc が複製対象のフォルダであり、その中の file1.txt に一時ファイル属性が設定されているため、複製されなかったシナリオです。
現時点では file1.txt には一時ファイル属性が設定されています。
1) まず、robocopy.exe でコピー先とするフォルダ (C:\def) を作製します。
2) コマンド プロンプトを開き、以下のコマンドを実行します。
robocopy C:\abc C:\def file1.txt /A-:T
3) C:\def 配下に file1.txt がコピーされていることを確認し、また fsutil.exe を使用して一時ファイル属性が外れていることを確認します。
ファイル属性が 0x20 に変わっており、一時ファイル属性が外れていることがわかります。
4) C:\abc から file1.txt を削除します。
5) C:\def から file1.txt を C:\abc にコピーします。
あとは、複製されていなかった file1.txt がレプリケーション パートナー側にも作成されていることを確認できれば、やっぱり一時ファイル属性が原因だったことがわかります。
なお、今回は一時ファイルの属性が設定されているファイルについてお伝えしましたが、それ以外にも EFS で暗号化されているファイルなども DFSR の複製対象外となります。以下の情報もご参考いただければと思います。
Designing Distributed File Systems