RoboCopyとシンプルなバックアップ運用を考える

## はじめに

遅まきながらRoboCopyというWindowsのコマンドがバックアップ運用に使えることを発見した。

現在のデジタル社会において大切なデータが突然消えることを考えてみよう。バックアップが必要だと考えるはずだ。バックアップの必要性を感じてはいるが定期的にバックアップを取っていないと折に触れて反省する。バックアップを取らない理由は、バックアップ運用の方法がシンプルではないのとバックアップ取得時に事故を起こすことを恐れるためだ。

事件は突然起きるもので何年、何十年と事件が起きないうちに安心して取らなくても大丈夫と思うようになる。そういう甘えが被害を拡大する。事件が起きた後でバックアップを取っておけば良かったと後悔しても遅い。とは言ったものの、本記事はバックアップの大切さを訴える主旨ではない。

本記事の主旨は、RoboCopyの動作を確認形式で紹介してからシンプルなバックアップ運用のイメージを示すことだ。


## RoboCopyの動作を確認する

RoboCopyはバックアップ先のファイルを自身の意図に反して消すことのある危険性のあるコマンドだ。誤ってファイルを消してしまったことがある。そういう事故を起こさないためにRoboCopyの動作を確認しておきたい。

この章で使用するミラーのコマンドは `robocopy a b /E /PURGE`だ。`/E /PURGE`は`/MIR`と同等だが削除の危険性を忘れないために`/E /PURGE`を使用したい。MIR(ROR)はミラー、PURGEは不要なものを一掃して削除するという意味だ。

`robocopy a b /E /PURGE`を実行したら宛先フォルダbにあるファイルが元フォルダaと完全一致する。この操作を本記事ではミラーと呼ぶ。

RoboCopyではファイルサイズも更新日時も変更されなかったファイルが、中身に変更があったとしても**ミラーの対象外**となることにも注意したい。

RoboCopyはどの操作をしても安全だというコマンドではない。動作を確認しておくことが望ましい。次の表にどういう操作をしてミラーを実行したらどういう結果になったかを示す。

| 操作                                                         | 結果                                                         |
| :----------------------------------------------------------- | :----------------------------------------------------------- |
| ファイルa\a.txtを作成し、フォルダaからフォルダbにミラーする。 | ファイルa.txtに対して「新しいファイル」と出て、ファイルb\a.txtが作成された。 |
| ファイルa\a.txtにテキストcを追加し、フォルダaからフォルダbにミラーする。 | ファイルa.txtに対して「より新しい」と出て、ファイルb\a.txtにテキストcが追加された。 |
| **ファイルb**\a.txtにテキストdを追加し、フォルダaからフォルダbにミラーする。 | ファイルa.txtに対して「より古い」と出て、ファイルb\a.txtから追加したテキストdが消えた。 |
| **更新日時を変更しない**でファイルa\a.txtにテキストeを追加し、フォルダaからフォルダbにミラーする。 | ファイルa.txtに対して「変更済み」と出て、ファイルb\a.txtにテキストeが追加された。 |
| **更新日時とファイルサイズを変更しない**でファイルa\a.txtのテキストeをテキストfに変更し、フォルダaからフォルダbにミラーする。 | ファイルa.txtに対する出力は出ず、統計出力のスキップの数が1になり、ファイルb\a.txtはテキストeのまま変化がなかった。 |
| ファイルa\b.txtを作成し、フォルダaからフォルダbにミラーする。 | ファイルb.txtに対して「新しいファイル」と出て、ファイルb\b.txtが作成された。 |
| ファイルa\a.txtを削除し、フォルダaからフォルダbにミラーする。 | ファイルa.txtに対して「*EXTRA  File」と出て、ファイルb\a.txtが削除された。 |

## RoboCopy実行時の注意点

RoboCopyを実行するときの注意点は２つある。宛先フォルダが正しいかと、削除や更新をミラーで反映していいかだ。

`robocopy a b /E /PURGE`のミラーを実行したとき、宛先フォルダbにあって元フォルダaにないファイルがミラーにより宛先フォルダbから削除される。もし誤った宛先フォルダ`b`を指定してミラーを実行したら、宛先フォルダ`b`のファイルがすべて削除され、削除したファイルを復旧させたいと思ってもバックアップから復旧させられない。

もしファイルを削除してからミラーで反映したら、削除したファイルを復旧させたいと思ってもバックアップから復旧させられない。もし更新をミラーで反映したとき、元のファイルがランサムウェアで使用できないように暗号化されていたとしたら、ミラー先のファイルも暗号化され、ファイルを復旧させたいと思ってもバックアップから復旧させられない。

そのような事故を起こさないためにrobocopyコマンドに`/L`オプションを付けて実行前に実行結果をプレビューすることをやっておきたい。このとき`/FP`と`/NDL`オプションを付けたほうがプレビューしやすいと考える。

## RoboCopyミラーと手動移動のイメージ

RoboCopyをどのようにバックアップ運用に使うかを考える。

バックアップといえば増分バックアップや差分バックアップを思いつくかもしれないが、ミラーだけを考える。KISSの原則に従ってシンプルに考えたい。

ミラーだけでは足りないことがわかったら他のバックアップを検討したい。いまのところはRoboCopyミラーと手動移動のバックアップ運用で満足している。手動移動はローカルディスク容量の肥大化を避けるために足した。

![robocopyのイメージ図](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/311399/d0c6eff6-17be-a85f-3282-6d46c0063a49.png)

本記事で説明したい中心的なイメージを図にした。この図を解説する。

まず、ローカルディスクのなかでバックアップが必要なデータを一箇所のデータフォルダ（図の左の青枠）に集める。最上位のデータフォルダをRoboCopyミラーすれば一回の操作ですべてのバックアップを行うことができ、シンプルなことが良い。

データフォルダからミラー用のフォルダへRoboCopyでミラーを行う（図の赤い矢印）。データフォルダとミラー用のフォルダの中身がミラーによって完全に一致する（図の左右の青枠のフォルダ）。

外付けディスクにバックアップを保管したいがRoboCopyミラーで完全一致する対象から外したいファイルはファイルを手動移動する（図の緑の矢印）。

RoboCopyでこのようにバックアップ運用を行えばシンプルでありながらバックアップのニーズを十分に満たせると考える。

##  この方法で復元できること、復元できないこと

**RoboCopyミラー**と**手動移動**のバックアップ運用でどのような復元ができ、どのような復元ができないかを考える。

|              | RoboCopyミラー                                           | 手動移動                                           |
| :--------------: | :--------------------------- | :--------------------------- |
| 復元できること | データフォルダのなかで削除したファイルの復元。 <br />ローカルディスクが破損したときデータフォルダの中身の復元。 | 手動移動した任意のファイルの復元（日付をつける等の工夫により古いバックアップを上書きしないものとする）。 |
| 復元できないこと | データフォルダのファイルを削除してミラーした後、そのファイルの復元。<br />ローカルディスクのその他のフォルダの中身の復元。 | バックアップしていないファイルの復元。           |

## この方法のメリット、デメリット

**RoboCopyミラー**と**手動移動**のバックアップ運用のメリットとデメリットを考える。

|            | RoboCopyミラー                             | 手動移動                                   |
| :--: | :--- | :--- |
| メリット   | RoboCopyのコマンド一回で済み、ほとんど**運用負担がかからない**。<br />削除も反映されてミラー先で余計なファイルが残らない。 | 手動移動した任意のファイルを復元できる。 |
| デメリット | ファイルを削除してミラーした後、そのファイルを復元できない。 | 手動のため**運用負担がかかる**。<br />古いファイルを残す方式のためディスク容量が肥大化する。 |

## データフォルダの考え方

ディスクのなかのファイルはプログラムのようにリードオンリーのものと読み書きするデータの２つに分かれる。

読み書きするデータを一箇所のデータフォルダに集めることには一般的に２つのメリットがあると考える。１つ目は読み書きするデータに関してファイルの断片化が解消され読み書きの速度が向上する。２つ目はバックアップが必要なデータが分かりファイルの見通しが良くなる。

バックアップが必要なデータを一つのデータフォルダに集中させることはRoboCopyと適合する。バックアップが必要なデータが分散していたら何回もRoboCopyのコマンドを打つことになるが、一箇所のフォルダに集中させていれば一回のコマンドで済むためだ。

RoboCopyミラーによりデータフォルダと完全一致するバックアップを作れる。もしディスクを初期化してOSを再インストールしたとしたら、完全一致のバックアップからデータフォルダを復元させられる。

## RoboCopyに追加して欲しい機能

RoboCopyに追加して欲しい機能は３つある。

１つ目は削除する前にゴミ箱に移動する機能だ。誤ったミラー先のフォルダを指定してファイルが消えることを防止できる。

２つ目はMD5などを計算して中身の一致を調べる機能だ。この機能があればファイルサイズも更新日時も変更されなかったファイルが、中身に変更があったとしてもミラーの対象外となることを防止できる。

３つ目は逆増分バックアップ（Reverse Incremental Backup）だ。１つ目とも関連するが、増分をゴミ箱に移動する代わりに指定したフォルダに移動させることで、最新のミラーを維持しながら何世代分かのバックアップを保持できる。

## さいごに

さいごになったが、本記事で最も訴えたいことはRoboCopyミラーと手動移動のイメージの図だ。この図が本記事を執筆する起点となった。この図を見ればバックアップをシンプルに考えられるはずだ。

それでは、この図で、よいバックアップ生活を。