n-Archives.net

Robocopy /Zオプションの再起動可能モードとは

目次

/Zオプション 再起動可能モード(Restartable Mode)とは

Robocopyの /Z オプションの「再起動可能モード(Restartable Mode)」とは何でしょうか。インターネットで調べても、あまりちゃんとした解説は見つからないですよね。恥ずかしながら、私自身も、つい最近まで、再起動可能モードとは「Windowsシステムドライブをコピーするためのオプション」だと思ってました!

それはさておき、いろいろ検索して情報を集めてみた結果、/Z オプションの再起動可能モードをようやく理解できるようになりましたので、まとめたいと思います。

 

まず、再起動可能モード(Restartable Mode) を簡潔にまとめると、

「ファイルコピーが途中で中断しても、再度コピーする時には、中断したところからコピーが再開される機能」

なのですが、特に、巨大なファイルを、低速・低信頼のネットワークを経由してコピーする場合を想定した機能になっています。この条件は意外と大事で、実際、/Zオプションを付けても、ネットワーク経由のコピー(コピー元、コピー先いずれかがUNC表記)でなければ再起動可能モードでの動作にはなりません。

Robocopyの通常コピーでは、コピーに失敗した場合、ファイルを最初からコピーをやり直すことになるのですが、再起動可能モードの場合は、この中断ポイントからコピーを再開してくれるため、手戻りがありません。非常に込み合っている回線を経由する場合など、長時間のコピーの途中で中断してしまうことがありますが、そうなると時間的なロスが大きいですし、時には、何度やっても失敗してコピーが完了できないということも起こりえます。そのようなことを回避し、着実に処理を進め、完了させるためには、再起動可能モードは有効です。

 

再起動可能モードのデメリット

それだけ便利な機能なのであれば、再起動可能モードをrobocopyのデフォルトの動作にしてしまえばいいのでは、と思われるのですが、実は、そうはいきません。再起動可能モードでは、途中からコピーを再開できるようにしておくため、書き込みの進捗情報を逐次コピー先ファイルに書き込むといった処理が行われます。これには、少なくないオーバーヘッド処理を必要とし、コピーの処理速度が大きく低下するという欠点があります。

いくつかの記事、自分でやってみた結果などを踏まえると、処理速度はだいたい数十倍くらい遅くなることがあります。ですので、再起動可能モードで動作しているかどうかは、明らかに処理速度が遅くなっていることで分かると思います。

 

従って、再起動可能モードを本当に必要とする場合以外は/Zオプションを付けるべきではありません。これは、Microsoftのrobocopyのドキュメントにも記述されています。

 

再起動可能モードを指定すべきケース

ということで、/Zオプションを付け再起動可能モードとすべきケースは、以下のような条件を満たすケースとなります。

  • コピーするファイルが巨大ファイルであること、かつ、
  • 低速・低信頼のネットワークを経由するコピーであること、かつ、
  • 1ファイルのコピーの途中で失敗する可能性があること、かつ、
  • コピー途中で失敗してもリトライし、時間がかかっても着実にコピーを完了させたい場合

 

それ以外の場合、特に以下のような場合には/Zオプションを付けるべきではありません。

  • PC内のローカルコピーである場合
  • ネットワークが高速で安定している場合
  • ファイルサイズが巨大でない場合
  • 頻繁に更新されるようなファイルの場合

 ファイルコピー失敗後、再コピーする時点で元ファイルの内容が更新されていると、結局ファイル全体のコピーになってしまいますので、頻繁に更新されるファイルについても、再起動モードに向かないことになります。

 

これらのことを考えると、/Zオプションを指定してコピーする場合、巨大なファイルだけを指定してコピーするか、巨大ファイルだけを格納したフォルダを指定してコピーすべきです。大小さまざまなファイルが混ざったフォルダを再起動可能モードでコピーすると、その必要のないファイルまでも再起動可能モードでコピーされてしまい、コピー効率が極めて悪くなります。

 

再起動可能モードのしくみ

再起動可能モードでのコピーの動作の仕組みを順を追って説明します。

 

Robocopyの通常時のファイルコピー動作

まず、Robocopyの通常のファイルコピー時の動作は次のようになっています。

  • ファイルのコピー開始時に、コピー先ファイルのファイルサイズの領域が確保される。(そのためコピーの途中で容量不足で失敗することはない)
  • ファイルのコピー開始後、コピーが完了するまでは、コピー先ファイルの更新日時は「日本時間1980/1/2 9:00AM」に設定される。
  • コピーが完了すると、ファイルの日付はコピー元ファイルの更新日時に設定される。

これは、/Zオプションが指定されていても、指定されていなくても、同じ動作になります。

従って、一般的にRobocopyのファイルコピーが途中で中断されたかどうかは、コピー先ファイルの日付が「日本時間1980/1/2 9:00AM」であるかどうかでわかります。

 

しかし、/Zオプション無しの通常コピーの場合、中断したかどうかはわかっても、どの位置までコピーが進んだかについてはわかりません。そのため、通常のコピーでは、コピーを前回中断されたところから再開させることはできず、ファイルの先頭からコピーしなおすことになります。

 

再起動可能モード時のファイルコピー動作

再起動可能モード時は、上記通常時のファイルコピー動作に加え、コピー再開時にどの位置からコピーを再開すればよいかを判別するために、「コピーがどこまで進んだか」の情報を、コピー先ファイルの中に記録します。おそらく、1パケット(64K)書き込むごとに、コピー完了位置をコピー先ファイルの特定位置に書き込んでいるのだと思われます。その情報がファイルのどこに書き込まれているかについては、結局手掛かりが得られませんでしたが、コピー先ファイル内のどこかであることは間違いないです。

通常コピーだと、ファイル先頭から順番にシーケンシャルにデータを書き込んでいくので、物理的にも効率よく書き込めるのですが、再起動可能モードの場合、1パケットずつ書き込むごとに、同じファイル内の特定の位置にコピー完了位置を書き込むことをしているため、書き込み位置の移動が激しく、オーバーヘッドが非常に大きくなっているのだと思われます。

 

再起動可能モードが有効となる条件

再起動可能モードが有効となる条件は以下の通りです。

  • /Zオプションを付けること。
  • コピー元、コピー先のいずれかがUNCパス形式(\\Server\Share\Pathの形式)であること。

 

例で示すと以下のようになります。

(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パス表記であったとしても、コピー元、コピー先がともにローカルディスクの場合でも、再起動可能モードが有効となります。

 

コピー再開の条件

再起動可能モードで、ファイルコピー再開ができるための条件は

  • コピー先ファイルが存在し、以下の条件であること。
    • そのファイルが再起動可能モードでコピー中に中断されたファイルであること
    • コピー先ファイルのサイズがコピー元ファイルのサイズと同じであること
    • コピー先ファイルの更新日時が「日本時間1980/1/2 9:00AM」であること (←これはチェックされていないかもしれない)
  • 再開コピーも再起動可能モードで実行されていること

 

つまり、再起動可能モードでコピーを再開させるためには、初めから/Zオプションを指定しておく必要があります。

  • robocopy /z なし  →  途中で中断  →  robocopy /z あり    :コピーの途中再開はしない。(コピーは最初からやり直し)
  • robocopy /z あり  →  途中で中断  →  robocopy /z あり    :コピーを途中再開する。

 

再起動可能モード実行時の考慮点

Robocopyは受信側ホストで実行したほうが良い

ネットワーク越しにコピーを行う場合、コピー元の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の歴史を感じさせる機能ですね。

このような結論になってしまい、ここまで読んでいただいた読者の方には大変申し訳ありません。^^

 

参考としたページ

 



Related Articles

 

この記事へのコメント

黒部五郎   2023-02-26 22:57:22
記事を大変参考にさせていただいております。
本当にありがとうございます。

さて、2年ほど前の「Robocopy /Zオプションの再起動可能モードとは」の中で、「ファイルのコピー開始後、コピーが完了するまでは、コピー先ファイルの更新日時は「日本時間1980/1/2 9:00AM」に設定される」「これは、/Zオプションが指定されていても、指定されていなくても、同じ動作になります」と書いておられます。

私の環境(Windows11 22H2)では、/Zオプションを指定した場合のみ上のような動作となり、それ以外では、更新日時はコピー開始日時(中断したときは中断日時)となります。

Robocopyに仕様変更があったのでしょうか(だとしたらひどい変更です)。
あるいはバグなのでしょうか(だとしたらひどいバグです)。

検索しても何も見つけられず、もし何かご存じでしたら教えていただけるとありがたいです。
不躾なことを書きまして、本当に申し訳ございません。

管理者   2020-05-09 11:22:57
私の知る範囲では robocopy にコマンド履歴をPCのどこかに保存するという
機能はないと思います。よくわからないですが、
コマンドプロンプトの機能、または、シェルスクリプトの機能で何か
起こっているのではないでしょうか?

きっかけがつかめませんので、もう少し質問させてください。


(1)以前のコメントで、以下のように書かれておりますが、
これは何をご説明されていますか?

-------------------------
CD D:\backup\
SET文
ECHO文
robocopy [A] [B] /MIR /Z
-------------------------

ご自分で作られたバッチファイルでしょうか?
その場合、そのバッチファイル名と、そのバッチファイルが
置かれているフォルダ名をお教えいただけますか?

(2)また、D:\backup\ にCDした状態で、
以下のコマンドの実行結果をお教えいただけますか?

D:\backup> where robocopy

鐘蔵    2020-05-08 13:16:01
[D]=[B]ではありませんでした。
コマンドプロンプトに構文張り付けて再現テストしたら、
コマンドプロンプト画面に貼り付けたのとは別のROBOCOPY文=過去に中断した/Z文が出現したので、そう書きました。
何度中断しても出てきます。

私が質問した目的は、過去に中断したROBOCOPY ./Z がどこに格納されていて
どうしたらその格納値を削除して、なかったことにできるか知りたいだけです。

管理者   2020-05-08 00:24:21
> CD D:\backup\
> D:\backup> robocopy [C] [D] /XJ   ※ [C]=[A]
> ここで問題が再現しました。再現した内容は

この時、[C]=[A] とのことですが、もしかすると[D]=[B] ではないでしょうか?

また、何をもって再現したと思われたのでしょうか?
もしかすると「前回コピー時に最後にコピーしたファイルの次のファイルから
コピーが再開されるから」ではないでしょうか?

robocopy の基本動作としては、コピー先に同じファイルが既に存在する場合、
コピーは行わずスキップします。これは/Zオプションの動作ではなく、
robocopy本来の動作です。ですので、コピー元、コピー先が同じであれば、
すでに存在するファイルはスキップし、コピーされていないファイルからコピーが
再開されるのは普通の動作になります。

的外れの推察でしたら申し訳ありません。

また、可能であれば、一度、robocopy [A] [B] /MIR /Z を中断せず全てコピーが
終了するまで実行するとどうなりますでしょうか。

鐘蔵    2020-05-06 11:38:00
アドバイス、どうもありがとうございます。たしかに[C] が [A] を包含していました。

再現テストしてみました。
C:\Users\MyID > robocopy [C] [D]
C:\Users\MyID > robocopy [C] [D] /XJ
どちらも問題はおきませんでした。

C:\Users\MyID >D:
D:\> robocopy [C] [D]
D:\> robocopy [C] [D] /XJ
どちらも問題はおきませんでした。

CD D:\backup\
D:\backup> robocopy [C] [D] /XJ   ※ [C]=[A]
ここで問題が再現しました。再現した内容は
-------------------------
CD D:\backup\
SET文
ECHO文
robocopy [A] [B] /MIR /Z
-------------------------
よく見たら、robocopy [C] [D]は実行されず、
過去に中断したrobocopy [A] [B] /MIR /Z が、それよりもCD前の行に続いて出てきました。
D:\backup\に移動しなければこのような問題は起きません。

コマンドプロンプトに過去のrobocopy [A] 中断情報がプールされていて、同じ場所(前方一致)を指定したROBOCOPYが実行されると、中断情報が復元される、という内容です。

管理者   2020-05-05 15:47:34
コメントいただいた件ですが、状況を確認させていただきたいのですが、
以下のような事象ということですか?
-------
D:> robocopy [A] [B] /MIR /Z (A配下には大量のファイルが存在)

....(一部のファイルのコピーまだ完了していない段階で、Ctrl-Cで中断)

^C
D:>

(後日)


D:> robocopy [C] [D]

......(完了)

D:> robocopy [A] [B] /MIR /Z ←なぜかこのコマンドが自動的に起動される(?)

......

-------

そして確認なのですが、[C] が [A] を包含していませんでしょうか。

または、robocopy に /XJ オプションを付けて実行すると、状況が解決しますか?

解決するようであれば、[C] の配下に、[A] または [A]配下の
フォルダへのシンボリックリンク、または、
ジャンクションポイント(マウントポイント)が存在する可能性があります。

ちょっとやってみてください。

鐘蔵   2020-05-04 12:40:08
コマンドプロンプトで、試しに実行した(1) ROBOCOPY 場所A 場所B /MIR /Z を中断し、
数日後(PC本体起動後)、再びコマンドプロンプトで、別のROBOCOPYを実行したところ、
その実行完了に続いて、過去に中断した(1) が動き出しました。
何度中断しても同じことが起きます。

PCのどこかに(1)が記憶されていると思うのですが、
(1)はもう不要なので再実行させたくありません。
どうすれば(1)を抹消できるのでしょうか?

/Zを指定しておきながら、それを今後実行させないという矛盾した内容ですみません。
大量ファイルのROBOCOPYで /Z は指定すべきでなかったという後悔の日々です。

コメントをお送りください
お名前:
コメント:
コメントの公開:



管理者より個人的に返信をご希望の方は、コメント中に必ずメールアドレスを記載してください。記載がないと返信できませんのでご注意ください。

If you want personal response from the author, please do not forget to write your email address in the comment. Otherwise, the author can not reply.

投稿されたコメントは手動で処理されるため、記事として登録されるまで1日程度かかります。

Submitted comments will be processed manually. So, please understand it will take about a day to publish your comment.