ファイルバックアップをROBOCOPYコマンドで取る

ファイルのバックアップは重要だ、と思いながらも中々実行出来ないもの。
バックアップ方法やタイミングの構成の検討や、そもそもバックアップ先をどうするのか等の問題が意外にも重く、手が出にくい。


以前に1TBのHDDをバックアップ用として衝動買いしたものの、バックアップの上手い方法が見つからず放置状態であった。
しかしきちんと調べてみると極めて簡単で効率の良いバックアップ方法が見つかった。しかもOS標準の方法で。

ROBOCOPY

このROBOCOPYコマンドは、元々はWindows server 2003のリソースキット(様々なツール群)のひとつであったが、Vistaからはこれが標準搭載されている。
ROBOCOPYコマンドとはなんぞや、というと「指定した二つのフォルダの同期を取るコマンド」である。


動作としては、C:\hogeというフォルダの同期先にD:\hogeを指定したとすると、C:\hogeにあってD:\hogeにないファイル/フォルダがD:\hogeにコピーされる。
ここまでは普通のコピーコマンドだが、素晴らしいのはこの先。
以下のような強力な機能が使用可能なのだ。


例えば次のコマンドを打ったとする。

ROBOCOPY /mir C:\hoge D:\hoge

1:更新されたファイルのみをコピー
C:\hogeの内容がD:\hogeにコピーされた後、再びROBOCOPYを実行すると"C:\hoge内で更新があったファイルのみコピー"されるのだ。つまり、一度C:\hogeの内容を全てコピーした後は、同じファイルを上書き保存しながらコピーといった動作をすることなく、必要なファイルだけが上書きコピーされていく。増分バックアップと同じような挙動をしながらも、実際には毎回フルバックアップを取得しているような状況である。


2:移動/削除などのファイル操作も反映
コピーが終了した後、C:\hogeの中のファイルの一部を移動もしくは削除し、もう一度ROBOCOPYを走らせた場合はD:\hogeの中のファイルにもその操作が反映される(!)
C:\hoge内でtest.txtというファイルを新規に作成すればD:\hoge内にもtest.txtがコピーされ、test2.txtとリネームしたばあいはD:\hoge内のtest.txtが削除され、代わりにtest2.txtがコピーされる。

これの何が素晴らしいかと言うと、例えばファイルを移動するなどした場合、通常のフルコピーを上書きで行い続ける限り、移動するたびにファイルが二重にも三重にも出来上がってしまい大いに容量の無駄使いとなってしまうのだ。


3:コピーが中断されても再試行
リジェーム機能とでも言うべきなのか、このコピーコマンドには、コピーが何かしらの原因で失敗した場合に再試行を行う機能がデフォルトでついている。ネットワークが一時的に遮断されたり、ファイルのアクセス権が無かったりする場合にコピーの再試行を勝手に続けるのだ。
最もデフォルトでは再試行回数は100万回、再試行間隔は30秒という非常に気長なものになっているので再指定が必要だとは思われるが。

コマンドのオプションの詳細についてはこちらに詳しくのっている。
robocopyまとめ - 時の過ぎ行くままに


さて、この素晴らしいROBOCOPYコマンドを使用すると、いとも簡単にフォルダ/ファイルのバックアップが取れてしまう。
例えば次の例。

set f1=D
set f2=E
set f3=F
set t1=G:\01_backup\

for %%X in (%f1% %f2% %f3%) do robocopy %%X:\ %t1%%%X\ /mir /XD %%X:\$RECYCLE.BIN /R:0

このバッチソースは次のような挙動を示す。
・ドライブD,E,Fの内容全てをG:\01_backupフォルダ以下に、ドライブレターを付けてコピーする。
・更新があったファイルのみコピー。コピー元にないファイルは削除(同期)。
・$RECYCLE(ごみ箱)はコピーしない。標準だと何故かコピーされるので、大変無駄。
・/R:0…再試行回数0。コピーに失敗してもリトライはしない。ネットワーク越しにコピーを取るわけでもないのでリジェームは必要ではないし、アクセス権が無いフォルダに関してはどの道リトライしても無駄。
ついでに\system volume informationのフォルダのコピーを防ぐという意味もある。


これをバッチファイルにして(ノートパッドにコピペして、.batの拡張子で保存)、実行してみた結果がこちら。
(コマンドのログが出力される)

400GB弱のファイルが、わずが110分ほどでコピー完了。CPU使用率も1%以下で、メモリもほとんど使わない。実行中も他の動作が重くなることはない、等致せり尽せりなコマンドである。

後はこのコマンドをタスクに入れて、週に一度でも動かせばミラーリングバックアップとしては万全である。
※ヒューマンエラーで消してしまったファイルは消えてしまうが。


1.5TBのHDDが10k円を切りそうな昨今、これで一つバックアップをとっておけば安心というものだろう。
「そんなに大切なデータはない」という人でも、ブラウザのブックマークやパスワードファイル、自分の黒歴史的絵(…)などが消えてしまって後悔しないということはないだろう。


ブックマークは共有、パスワードはOpenID黒歴史は消えてもらってハッピー、という人は悪しからず。


他のバックアップ方法は?

案1:バックアップソフト
有償。却下。

案2:エクスプローラで手動コピー
カッコ悪い。は、ともかくVistaではエクスプローラ上での手動コピーが異様に遅い。その問題で不具合が解決されたとアナウンスされたSP1を当ててもだ。試しに2GBのファイルで比較してみたが、エクスプローラ上とROBOCOPYでは倍(!)近く転送速度が違う。これはサムネイル処理が問題だとか、アンチウィルスソフトが問題なのだと色々と言われているが…やっぱりカッコ悪い。
そもそも個人的に最大の問題点であった、ファイルの移動や削除に対応できないのはどうしようもない。却下。

案3:OS標準バックアップ
VistaにはWindowsバックアップ(旧NTバックアップ)というツールがついているが、これがまた癖物。
フルバックアップ+増分バックアップという基本的な操作は可能なものの、なんと.exeファイルをバックアップしてくれないという致命的な仕様となっている。ゲームのインストールフォルダをバックアップしても、中身の.exeだけ入っていないという始末。
そもそもアプリケーションはOSにプログラムとして登録しないと動作しないものが多いのでそれほど問題はないのかもしれないが、それにしてもこの仕様は謎である。

おまけに時間がかかる。圧縮だかアーカイブだかは分からないが、その作業に異様に時間がかかり400GB弱のファイルのバックアップが18時間経っても終了しない。さらにバックアップ中はOSのレスポンスが低下して他の作業もままならない。


さらにディスク全体のイメージを取るcompleteバックアップ(OS復元等に有効)というものも用意されているが、こちらはバックアップ時と復元先のディスクが異なっていると復元が不可能という思わず目を覆いたくなる仕様。違法コピー防止策だとは思われるが、これはあんまりである。
(ディスクが壊れたから別の新しいディスクを買ってきて、復元しようとしても出来ないということ)


このWindowsバックアップのoffset元であるSymantec BackupExecならばこのあたりの問題とは全く無縁であるが…
そちらは勇気ある価格設定となっている。
却下。