最近の Windows ではあまりなくなりましたが、以前の Windows では、突然ファイルが破損して、何日もかけて作ってきたファイルが一瞬にしてパア、なんてことがよくありました。また、Windows のせいだけではなく、誤操作や誤判断でファイルを消してしまう、なんてことも時々あります。
人間だからミスはするさ…、フッ………
などと言ってみても、内心は呆然。
という時のために、バックアップを作るようにしてます。
ただ、手動でバックアップをすると、手間でもあるし、つい忘れてしまうので、タスクスケジューラに登録して、勝手にバックアップがされるように設定しておくのがよいかと。
このシリーズでは、バックアップの方法に特化して、いくつかのツールとその使い方をご紹介します。
本日は、その第2回 robocopy でバックアップを取る方法。
■robocopy
robocopy は以前は OS(Windows) に含まれておらず、「リソースキット」という別のツールとして配布されていましたが、Windows2000 (だと思う)から、OS に標準添付されるようになりました。
サーバ管理者が使うツールとしては非常にオーソドックスなものです。
robocopyは、もともとはリモートのファイルサーバー同士でフォルダーを同期させるために作られたコマンドらしいので、信頼性や拡張機能などが非常に優れています。
※本当かどうか知りませんが、robocopy の名前の由来は、Robust copy (堅牢なコピー) だそうです。
具体的な機能としては
・エラー時の再試行
・ネットワーク切断時のコピーの中断と再開
・属性やセキュリティ設定のコピー
・ファイルサイズを限定してのコピー
・コピー先にある余分なファイルの削除
・256文字を超える長いパス名の処理
・動作ログの記録
・コピーの進行状態の常時表示
・ジョブによる同期作業内容の定義
・コピー時の占有帯域制御
などがあります。
とくにネットワーク管理者にありがたいのが、最後の「コピー時の占有帯域制御」。
これは通常ネットワークに流せるデータの量は1秒間に10Mバイト程度(規格の最大、100BASEのとき)で、高速コピーツールを使うと、この領域を最大限に使おうとします。そうすると他のプログラムによるネットワークアクセスが制限されて、周囲の人に大迷惑をかけることになります。
なので、ネットワークの帯域が開いている時間帯を狙って、それも他のシステムに影響しない程度のネットワーク占有率で動作させるというのは、システム管理者にとっては、必須の機能なんですよ。特に、巨大なデータベースファイルなどをバックアップをしようとすると、何時間もネットワークを専有してしまえば業務に支障が出ること請け合い。
ただ問題は、この robocopy って、オプションがたくさんありすぎて、コマンドラインで記述するのが難しいんですよ。
これを解決するために、richcopy っていう GUI を使ったツールもありますが。
※オプションは、robocopy.exe のあるフォルダ(通常は windows\ystem32)に robocopy.doc があるのでこれをテキストエディタで開くと詳しい説明が見られます。
逆に言えば、バッチファイルなどのように、一度書いてしまえば、もうオプションを考える必要がない環境なら、人間が介在する必要がないので、とってもありがたいツールになるわけです。
本記事では、robocopy のたくさんある機能のうち、ネットワーク経由で、2つのフォルダを同期させる方法について解説します。
他にもいろんな使い方ができるので、興味のある方は調べてみてください。私も気が向けば(思い出したら)、別の方法についての記事を書いてみたいと思います。
マイクロソフトの技術情報サイト
より強力なファイル管理のために Robocopy について理解する
が参考になります。
■基本的な使い方
robocopy は基本的な使い方は copy や xcopy と同じです。
robocopy (コピー元) (コピー先)
でファイルがコピーされます。フォルダ名を指定すれば、そのフォルダがコピーされます。
あるフォルダ以下の特定のファイルだけをコピーしたいときには
robocopy (コピー元フォルダ) (コピー先フォルダ) (ワイルドカード)
みたいに指定します。たとえば、 c:\usr のフォルダにある .jpg ファイルだけを d:\usr にコピーしたければ
robocopy c:\usr d:\usr *.jpg
みたいにすれば可能です。
■フォルダの同期
2つのフォルダを同期させるには、/mir オプションを使います。
これは、
・コピー元に無く、コピー先にあるファイルを削除する
・コピー元に新しいファイルが有るときには、コピー先のファイルに上書きする
という動作をします。
これで、2つのフォルダが全く同じになるわけですね。
前回の記事 xcopy と同じような使い方をするためには、/s オプションを付ければ、コピー元になったフォルダから削除されてしまっても、コピー先のファイルは残ります。
■権限をコピーする
普段はあまり意識はしませんが、windows は、ファイルごとにアクセス権限などを管理しています。
ところが通常の copy ではこのアクセス権がコピーされません。このため、本来他の人がアクセスしては困るようなファイルも、copy でアクセスできるようになってしまいます。これを回避するのに robocopy が積極的に使えます。
/copy:(CopyFlags)
D データ
A 属性
T タイムスタンプ
S NTFSアクセス制御リスト(ACL)
O 所有者情報
U 監査情報
このようにrobocopyはたくさんの機能を備えている。本稿では、その中から一番基本的な使い方として、2つのフォルダーを同期させる機能について解説する。個々の機能については右上の関連記事を参照していただきたい(今後さらに解説を追加するつもりだ)。
・RichCopyでフォルダーをバックアップ/同期させる
コマンドラインではなくGUIからフォルダーをバックアップしたり同期したりしたい場合は、richcopyが利用できる。詳細は右の関連記事を参照していただきたい
■除外ファイルとファイルのクラスによるファイル選択
robocopy では、コピー元、コピー先の対象のファイルやフォルダの状態(クラスといいます)によってコピーの動作を変更することができます。
また、以前の記事 xcopy 同様、ファイルを除外することが robocopy でもできますが、xcopy より詳細な除外ができます。ファイル名で判別するなら別に xcopy でも同様ですが、ファイルの属性によっても、除外が可能です。
詳しくは、
@IT:Windowsのrobocopyコマンドでコピーするファイルの種類を選択/変更する
を見ていただくのがわかりやすいと思いますが、ファイルのタイムスタンプの扱いがとても詳細に制御できる /it /fft オプションは必ずつけるようにしてます。
■帯域制御
最初に説明した、ネットワークを専用しないためのオプションですが、
/ipg
で行います。これは1ブロックをコピーするごとに、パラメータで指定された時間(単位:ミリ秒)だけウエイトが入ります。
1ブロックは、調べた所 64kバイト(/z オプションが有るとき)らしいです。これも詳細はマイクロソフトのサイトでご確認ください。