Robocopyの /Z オプションの「再起動可能モード(Restartable Mode)」とは何でしょうか。インターネットで調べても、あまりちゃんとした解説は見つからないですよね。恥ずかしながら、私自身も、つい最近まで、再起動可能モードとは「Windowsシステムドライブをコピーするためのオプション」だと思ってました!
それはさておき、いろいろ検索して情報を集めてみた結果、/Z オプションの再起動可能モードをようやく理解できるようになりましたので、まとめたいと思います。
まず、再起動可能モード(Restartable Mode) を簡潔にまとめると、
「ファイルコピーが途中で中断しても、再度コピーする時には、中断したところからコピーが再開される機能」
なのですが、特に、巨大なファイルを、低速・低信頼のネットワークを経由してコピーする場合を想定した機能になっています。この条件は意外と大事で、実際、/Zオプションを付けても、ネットワーク経由のコピー(コピー元、コピー先いずれかがUNC表記)でなければ再起動可能モードでの動作にはなりません。
Robocopyの通常コピーでは、コピーに失敗した場合、ファイルを最初からコピーをやり直すことになるのですが、再起動可能モードの場合は、この中断ポイントからコピーを再開してくれるため、手戻りがありません。非常に込み合っている回線を経由する場合など、長時間のコピーの途中で中断してしまうことがありますが、そうなると時間的なロスが大きいですし、時には、何度やっても失敗してコピーが完了できないということも起こりえます。そのようなことを回避し、着実に処理を進め、完了させるためには、再起動可能モードは有効です。
それだけ便利な機能なのであれば、再起動可能モードをrobocopyのデフォルトの動作にしてしまえばいいのでは、と思われるのですが、実は、そうはいきません。再起動可能モードでは、途中からコピーを再開できるようにしておくため、書き込みの進捗情報を逐次コピー先ファイルに書き込むといった処理が行われます。これには、少なくないオーバーヘッド処理を必要とし、コピーの処理速度が大きく低下するという欠点があります。
いくつかの記事、自分でやってみた結果などを踏まえると、処理速度はだいたい数十倍くらい遅くなることがあります。ですので、再起動可能モードで動作しているかどうかは、明らかに処理速度が遅くなっていることで分かると思います。
従って、再起動可能モードを本当に必要とする場合以外は/Zオプションを付けるべきではありません。これは、Microsoftのrobocopyのドキュメントにも記述されています。
ということで、/Zオプションを付け再起動可能モードとすべきケースは、以下のような条件を満たすケースとなります。
それ以外の場合、特に以下のような場合には/Zオプションを付けるべきではありません。
ファイルコピー失敗後、再コピーする時点で元ファイルの内容が更新されていると、結局ファイル全体のコピーになってしまいますので、頻繁に更新されるファイルについても、再起動モードに向かないことになります。
これらのことを考えると、/Zオプションを指定してコピーする場合、巨大なファイルだけを指定してコピーするか、巨大ファイルだけを格納したフォルダを指定してコピーすべきです。大小さまざまなファイルが混ざったフォルダを再起動可能モードでコピーすると、その必要のないファイルまでも再起動可能モードでコピーされてしまい、コピー効率が極めて悪くなります。
再起動可能モードでのコピーの動作の仕組みを順を追って説明します。
まず、Robocopyの通常のファイルコピー時の動作は次のようになっています。
これは、/Zオプションが指定されていても、指定されていなくても、同じ動作になります。
従って、一般的にRobocopyのファイルコピーが途中で中断されたかどうかは、コピー先ファイルの日付が「日本時間1980/1/2 9:00AM」であるかどうかでわかります。
しかし、/Zオプション無しの通常コピーの場合、中断したかどうかはわかっても、どの位置までコピーが進んだかについてはわかりません。そのため、通常のコピーでは、コピーを前回中断されたところから再開させることはできず、ファイルの先頭からコピーしなおすことになります。
再起動可能モード時は、上記通常時のファイルコピー動作に加え、コピー再開時にどの位置からコピーを再開すればよいかを判別するために、「コピーがどこまで進んだか」の情報を、コピー先ファイルの中に記録します。おそらく、1パケット(64K)書き込むごとに、コピー完了位置をコピー先ファイルの特定位置に書き込んでいるのだと思われます。その情報がファイルのどこに書き込まれているかについては、結局手掛かりが得られませんでしたが、コピー先ファイル内のどこかであることは間違いないです。
通常コピーだと、ファイル先頭から順番にシーケンシャルにデータを書き込んでいくので、物理的にも効率よく書き込めるのですが、再起動可能モードの場合、1パケットずつ書き込むごとに、同じファイル内の特定の位置にコピー完了位置を書き込むことをしているため、書き込み位置の移動が激しく、オーバーヘッドが非常に大きくなっているのだと思われます。
再起動可能モードが有効となる条件は以下の通りです。
例で示すと以下のようになります。
(1) robocopy N:\source Z:\destination /Z (これは再起動可能モードにはならない) (2) robocopy \\server\share\source Z:\destination /Z (再起動可能モードになる) (3) robocopy N:\source \\server\share\destination /Z (再起動可能モードになる) (4) robocopy \\server1\share\source \\server2\share\destination /Z (再起動可能モードになる)
コピー元、コピー先がUNCパス形式であることという条件は、ネットワーク経由のコピーである場合にのみ有効とするためです。しかし、UNCパス表記であったとしても、コピー元、コピー先がともにローカルディスクの場合でも、再起動可能モードが有効となります。
再起動可能モードで、ファイルコピー再開ができるための条件は
つまり、再起動可能モードでコピーを再開させるためには、初めから/Zオプションを指定しておく必要があります。
ネットワーク越しにコピーを行う場合、コピー元のPCでrobocopyを実行する場合と、コピー先のPCで実行する場合、両方のケースが考えられます。再起動可能モードでは、コピー先ファイルに管理情報を書き込む処理を行うため、robocopyはコピー先側で実行するほうが多少処理速度が速いと思われます。いくつか実験してみた結果でも、コピー先側でrobocopyを走らせたほうが心持ち速かったようです。
上述したように、再起動可能モードは大きなファイルに限定して実行するのが良いと思います。あるサイズ以上のファイルに限定して robocopyを実行する場合、/MIN オプションを利用する方法があります。例えば、コピー元フォルダのサブフォルダも含めて、100MB以上のファイルのみ再起動可能モードでコピー、それ以外のファイルは通常コピーとするような場合、以下のようなコマンドになります。
robocopy \\server\share\source Z:\destination /MIN:100000000 /E /Z robocopy \\server\share\source Z:\destination /MAX:100000000 /E
これは、再起動可能モード時だけではないのですが、コピー元、コピー先がどちらもUNC形式のネットワークのフォルダで、同じサーバのフォルダであった場合、コピーは非常に高速に実行されます。推測ですが、CIFS側の仕組みで、ローカルでコピーが処理されるためではないかと思います。
例えば、以下のコマンドを実行した場合、
robocopy \\server1\share\source \\server1\share\destination /Z
通常の/Zオプション再起動可能モード時のコピーに比べ、かなり高速で処理されます。
あまりこのような使い方はしないと思うのですが、ご参考までに。
/Zオプション、再起動可能モード(Restartable Mode)については、検索しても、ちゃんと解説されたページもあまり見つからず(日本語も英語も)、意外にちゃんと理解されていなかったのではないかと思います。私自身、長い間よくわからなかったこのオプションについてようやく理解できました。
昔、電話回線とモデムでネットにつないでいたころは回線の状態が悪いと頻繁に接続が切れていたものですが、そのような時代では、有効な機能だったのだと思います。しかし、今どきのNWの高速化の状況を考えると、/Zオプションを必要とするケースはほとんどないかもしれませんね。ある意味、robocopyの歴史を感じさせる機能ですね。
このような結論になってしまい、ここまで読んでいただいた読者の方には大変申し訳ありません。^^
RoboSync: RobocopyのためのGUIツール
本サイトで公開しているツールです。ダウンロードはこのバナーをクリック!
Version 1.3.27 をリリースしました! (2021/1/1)
RobocopyをGUIから実行できるようにするツールです。コマンドプロンプトを表示することなく、GUI画面からほぼマウス操作だけで実行までできます。
Robocopyがバックグラウンドでそのまま実行されますので設定に迷うことはありません。
・ 複数のコピー項目の作成と管理。
・ スクリプトファイル(バッチファイル)出力が可能。スケジューラによるバックグラウンド処理にも使えます。
・ Robocopyによるコピー実行前に、実行プレビュー(/L)、パラメータのチェック(/QUIT)が可能。
・ Robocopyのパラメータ設定の簡易チェック、Robocopy実行前の簡易チェックを行います。
・ Robocopy実行前後で実行するスクリプトを定義可能。
・ Robocopy実行途中での中断、実行ログの履歴管理と保存が可能。
Related Articles
Submitted comments will be processed manually. So, please understand it will take about a day to publish your comment.