File Server Migrations With Robocopy Part 1 of 2
このブログは2部構成のうちの1回目です。 パート2をご覧になるには、こちらをクリックしてください。
Windows Server オペレーティング システムのさまざまな種類が今年サポートされなくなったため、あるシステムから別のシステムへのファイル サーバーの移行をかなりの数行っていることに気がつきました。 サーバーにファイル サーバー以外の役割や機能がインストールされていない場合、元のサーバー上の共有の解除、そこから仮想ハード ディスクの取り外し、新しいサーバーへの仮想ハード ディスクの取り付け、および共有の再分配を行うだけでよいことがあります。 この方法では、両方のサーバーが同じActive Directoryドメインのメンバーであれば、NTFSのパーミッションが維持されます。 また、1つのサーバーから別のサーバーに何テラバイトものデータをコピーする必要がないため、一般に非常に短時間で完了します。 しかし、このプロセスは、ファイル共有データが Windows やアプリケーションがインストールされていないボリュームに存在する場合にのみ、優雅に動作します。
新しいサーバーへの移行のためにデータを複製する必要が生じた場合、私はいつも昔からの忠実な方法である Robocopy (Robust File Copy for Windows) に戻っています。 Robocopy は 1996 年の NT4 の時代から存在していたので、おそらく初めて聞く名前ではないでしょう。 当時から2008年までは、Windows Resource Kitのダウンロードで利用できました。 2008年以降、VistaとServer 2008から、デスクトップとサーバーの両方のOSにバンドルされるようになりました。 そのため、コンピュータでコマンド プロンプトを起動して “robocopy /?” と入力すると、ユーティリティの使用方法に関する情報のヘルプ ダンプが画面に表示される可能性があります。
ロボコピーによるファイル サーバーの移行に関してはかなり多くの選択肢があり、何から始めればよいかわからない場合があると思います。 オプションの中には、データを移動する (移行元または移行先のファイルやフォルダーを削除する) ものがあるので、試しに使ってみるだけの場合は注意が必要です。
長年にわたって使用してきた結果、この構文が何度も何度も繰り返し使用する構文であることがわかりました:
robocopy \sourceserver³³ShareName D:txt /v
Let’s break down that.
Robocopy
Initiates the command.
Thresholdsourceserver
The first parameter is always the source location.このコマンドを実行すると、最初のパラメーターは常にソースロケーションです。
- 新しいファイル サーバーには新しいバージョンの Robocopy がインストールされている可能性が高く、
- 新しいサーバーにまだ共有が構築されていない可能性があります。
D:\Shares
第 2 パラメーターは、常に送信先ロケーションです。 可能な限りC:³³オペレーティングシステムボリュームに置かないことを強くお勧めします。 また、私は「Shares」というルートフォルダを作成し、共有フォルダをルートに置いたままにせず、すべてこのフォルダに入れることを好んでいます。
次のパラメータは、特定の順序である必要はありません。
/e
これは、Empty を含むサブディレクトリをコピーします。 ここでロボコピーの真価が発揮される。
/b
Backup モードでファイルをコピーします。 これは VSS スナップショットを作成しませんが、代わりに、ロボコピーを実行している Windows アカウントが、NTFS の ACL のためにコピー元の場所に完全にアクセスできない可能性がある場合に役立ちます。 両方の場所に移動して、場所から場所へとファイルをコピー ペーストしてはいけないのでしょうか。 このパラメータは、すべてのファイル情報をコピーします。 この方法では、新しいタイムスタンプや所有者、あるはずのないNTFSパーミッションが継承されるなどといったことはありません。 すべてのファイル情報は次のとおりです。
- データ
- 属性
- タイムスタンプ
- セキュリティ (NTFS ACL)
- オーナー情報
- 監査情報
/PURGE
このパラメータはソースにもはや存在しない宛先ファイルとフォルダーを削除します。 技術的には、パラメータ /e と /PURGE を一緒に使用すると、1 つのパラメータを単独で使用した場合(/mir – 「ミラー」の意味)と同じ効果が得られますが、構文に大文字の「PURGE」がある方が、それを見たときに、何かを削除している可能性が高いと分かるので、私は好んで使用します。 ここで、ファイルやフォルダーがソースの場所にもう存在しないのに、なぜターゲットにコピーしようとするのかという疑問が生じます。 さらに、そもそも存在しないファイルを削除する必要があるのだろうかという疑問が生じます。
Robocopy が真価を発揮するのは、この 2 番目の点です。 アクティブでない古いデータをコピーする場合を除き、私は通常、Robocopy を一度実行すれば終わりというわけではありません。 私は通常、バッチファイルを実行するスケジュールタスクを作成し、その中に実行するロボコピーの行を含めます。 このことを念頭に置き、上記のパラメータを設定すると、ジョブの最初の実行は、すべてのデータの最初のコピーを行う必要があるため、しばらく時間がかかるでしょう。 しかし、次に実行されるとき(私は通常、毎日営業時間後に実行するように設定しています)には、ソースを見てターゲットと比較し、ファイルが変更されていなければ、何も行いません。 もしソースのファイルの方が新しければ、ターゲットのファイルを上書きする。 ソースのファイルが最後にジョブを実行した後に削除された場合、ターゲットの同じファイルも自動的に削除されます。 実際のファイル共有の移行では、1週間ほど前にこのジョブを設定し、生成されるログを見て、問題があればトラブルシューティングを行い、カットオーバーの予定日まで毎日実行させることにしています。 カットオーバーの日には、移行元の共有を読み取り専用にして、もう一度Robocopyジョブを実行して、前回実行したときから変更された差分をコピーします。
/r:5
このフラグは、ファイルまたはフォルダーのコピーに失敗した場合に、Robocopy が再試行する回数を指定します。 ユーザまたはプロセスがファイルを開いているため、ファイルにロックがかかっていることが原因で失敗することがあります。 このような場合、Robocopy はコピーを再試行して、そのファイルにロックがかかっていないかどうかを確認する。 デフォルトでは(このパラメータを指定しない場合)、Robocopy はコピーを 100万回再試行する。 1 日先の次のスケジュール実行時にこのファイルを再度コピーしようとすることがわかっているので、5 回再試行し、コピーに成功しなければ、次のファイルに進みます。
/w:5
このフラグは /r と密接に関連しています。 このフラグは、再試行の間に待機する時間を秒単位で指定します。 デフォルトは 30 秒です。 2 と 2 を合わせると、1,000,000 * 30 = 30,000,000 秒、または 500,000 分、または 8,333 時間 20 分、または 347 日と 5 時間となります。 つまり、1つのファイルがロックされたままだと、ロボコピーは次の作業に移るまでに1年近くかかってしまうのだ。
/MT:64
このフラグは、マルチスレッドコピーを行う際の新しいスレッドの最大数を設定します。 これは、複数のファイルやフォルダーを同時にコピーするのではなく、設定されたコピーを行うために CPU でより多くのスレッドを使用します。 デフォルトでは8ですが、私はこの数を合計64まで増やしたいと思っています(複数のRobocopyジョブを同時に実行する場合は、この点に注意してください)。 コピー元ファイルを開き、コピー先ファイルを開き、データをコピーし、コピー元ファイルを閉じ、コピー先ファイルを閉じるというCPUオーバーヘッドがある。 次のファイルに進む前にこれらすべてを行わなければならない場合、I/Oサブシステムは本来動作するはずの時間の一部をアイドル状態にする可能性がある。 注意:この場合、CPUが適切に動作しているため、システムが低速に見える可能性があります。 これがまだ本番ではない新しいファイル サーバー上であれば、「遅い」ことは問題ではないはずです。
/tee
デフォルトでは、コマンド プロンプトから手動で実行すると、ロボコピーは画面表示に実行中の処理を出力します。 何千ものファイルをコピーする可能性があるため、何か問題が発生したときに効率的な方法とは言えません。 tee を指定すると、ログファイルだけでなく、コンソールウィンドウにも出力するようになります。 これは、ロボコピーを初めて実行したときや、うまく動作しない場合のトラブルシューティングに特に有効です。
log+:D:\Shareslog_ShareName _%date:~-10,2%”-“%date:~7,2%”-“%date:~-4,4%.txt
デフォルトでは Robocopy からのログは画面への表示のみとなります。 log パラメータで、新規ファイル(または既存ファイル)のファイルパスを指定します。 すでにファイルが存在する場合は上書きされます。 しかし、この処理をスケジュールされたタスクで行う場合、最新のものだけでなく、実行したすべての繰り返しを見たい場合がある。 logの後に+を指定することで(/log+)、上書きではなく、指定したファイルに追記されます。 また、ファイル名に “_%date:~-10,2%”-“%date:~7,2%”-“%date:~-4,4%” を指定すると、履歴参照用にログファイルの最後に _MM_DD_YYYY という接尾語を持つ新しいファイルを自動的に作成します(その日に最初に実行した場合)。 特に大きなファイル共有の場合、何日も実行したままにしておくと、ログファイルでさえ数ギガバイトになることがあり、毎日のログに分割することは非常に理にかなっています。
/v
このパラメータは、スキップしたファイルを表示する Verbose 出力を表示します。 一般に、スキップ ファイルがログに記録されていることを確認するために、このパラメータを確認します。
このブログのパート 2 では、タスク スケジューラーを使用して毎日の Robocopy ジョブを設定する方法を紹介します。 Sikich にご連絡ください。 私たちはいつでもお手伝いします。