Windowsのrobocopyコマンドでファイルコピー中断後に自動再開させるTech TIPS

xcopyより機能が豊富なrobocopyは、ユーザーファイルや重要なシステムファイルのバックアップなどに最適なコマンドである。robocopyで巨大なファイルをネットワーク越しにコピーする場合は、コピー失敗や中断後に、その時点からコピーを再開するオプションを指定するとよい。

» 2014年04月30日 16時22分 公開
[打越浩幸デジタルアドバンテージ]
「Tech TIPS」のインデックス

連載目次

対象OS:Windows 7/Windows 8/Windows 8.1/Windows Server 2008 R2/Windows Server 2012/Windows Server 2012 R2



解説

 robocopyは、xcopyよりも堅牢で、確実なファイルコピー/バックアップなどを行える多機能なコマンドである。タスクスケジューラなどと組み合わせて、ユーザーファイルやシステムのバックアップに使われることが多い。本TIPSでは、robocopyの便利な機能である、コピー失敗/中断後の自動再開機能について解説する。ネットワークの状態が不安定だったり、ファイルが書き込み中でロックされていたり、大きなファイルのコピーに失敗したりした場合などに、コピーが失敗した場所から再開することができる。ファイル全体をコピーし直すわけではないので、コピー時間を短縮できる。

 robocopyの基本的な使い方については次の記事も参照していただきたい。

操作方法

●コピー中断後の自動再開のための/zオプション

 robocopyコマンドで、コピー中断後の自動再開を行わせるには、/zオプションを使用する。

robocopy <コピー元>  <コピー先>  <コピーファイルのパターン>  <オプション> /z



 例えば、ネットワーク越しに巨大なVHDファイルをコピー/バックアップさせるなら、次のようなコマンドを実行すればよいだろう。

robocopy \\hypervserver01\hypervvhd k:\VHDbackup *.vhd *.vhdx /r:1 /w:1 /z

※ファイル使用中などでコピーできない場合は、何度もリトライしても遅いだけで無駄なので、「/r:1」を指定することで再試行回数を1回に設定している。また「/w:1」を指定することで、再試行の間隔をデフォルトの30秒から1秒に短縮している。



 /zオプションを指定すると、あるファイルをコピーする場合、前回のコピーが完全に終了していなければ、その続きからコピーが開始される。途中までコピーされているファイルがあれば、その続きから継続して差分だけコピーが行われるので、ファイル全体をコピーするよりも速くコピーが終了する(中断している間に元のファイルが更新された場合は、全体がコピーし直される)。

 この機能は、ネットワーク経由で大きなファイルをコピー/バックアップするような場合、ネットワーク接続が不安定だったり、混雑していてファイル全体のコピーが失敗するようなケースでは大いに役に立つ。逆に、ローカルのディスク間でファイルをコピーする場合や、小さなファイルばかりをコピーするような場合にはあまり目立った違いはない。

●コピーが失敗しているかどうか手軽に確認する方法

 ファイルのコピーが途中で失敗しているかどうかを確認するにはコピー時の進捗画面を見るか、ログファイルを確認すればよいが、ログファイルを残していない場合は、コピー先ファイルの日付を見ればよい。ファイルの更新時刻が「1980年1月2日午前9:00」(日本語OSの場合)になっていれば、途中で転送が中断されていることを表す。

K:\VHDbackup>dir
ドライブ H のボリューム ラベルは VHDBACKUPVOL です
ボリューム シリアル番号は 7643-5BC5 です

K:\VHDbackup のディレクトリ

2014/04/25  11:02  <DIR>          .
2014/04/25  11:02  <DIR>          ..
2012/12/10  16:21   8,871,283,200 SVR2012DcSP0.vhd …正しくコピー済みのファイル
1980/01/02  09:00   8,527,020,032 SVR2012R2DcSP0.vhdx …中断したファイル。日付が1980年になっている
        2 個のファイル      17,398,303,232 バイト
        2 個のディレクトリ  842,887,069,696バイトの空き領域

K:\VHDbackup>



 この場合、ファイルのサイズは正しいが、その内容は正しくない(未コピーの部分はゼロデータになるので、このファイルを使用しないこと)。robocopyではファイルのコピー開始時に日付を「1980年1月2日午前9:00」にしてファイルサイズ分のディスクの確保を行い、コピーの途中でディスクの領域不足を起こさないようにしているので、コピー中はこのような状態になっている。そしてファイルのコピーが全て完了した時点で、ファイルの更新日付をコピー元のファイルと同じになるように変更している。

●/IPGオプションで帯域制御を行う場合の注意点

 robocopyのオプションで、「/ipg:<ミリ秒>」を指定すると、1ブロックコピーするごとに指定した時間だけ、ウェイト(待ち時間)を入れることができる(ipg=inter packet gap)。これは、robocopyのファイルコピーでネットワーク帯域(ローカルディスク間でのコピーの場合は、ディスクインターフェースの帯域)を100%占有させないようにするためのオプションだが、これを使う場合は少し注意が必要である。

 バージョンにもよるが、robocopyでは通常1ブロックのサイズは1Mbytesである。コピー元から1Mbytes読み出しては、コピー先に1Mbytes書き込み、/ipgオプションがあれば、そこで指定した時間(ミリ秒)だけ待ってから、次のブロックをコピーする、というふうに動作している。だが/zオプションを指定するとブロックサイズは64Kbytesになる。そのため/ipgオプションで同じ時間だけ待つとウェイトの時間が多くなり(単純計算で1Mbytes÷64Kbytes=16倍になる)、コピー時間が非常に長くなってしまう。

 このような事情があるため、/zと/ipgオプションを両方使用する場合はウェイト時間の設定に注意していただきたい。/ipgオプションを使う場合は、最初に/ipg:10(10ミリ秒待つ、つまり1秒間に100ブロックコピーするという意味)や/ipg:100(100ミリ秒待つ。つまり1秒間に10ブロックコピーする)などの値でテストしてみて、適切な値を探すとよいだろう。

「Tech TIPS」のインデックス

Tech TIPS

Copyright© Digital Advantage Corp. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。