2022年8月31日

robocopyを試してみた!(実践編)


Content

はじめに

みなさんこんにちは、横Tです!
前回「robocopyを試してみた!(基本編)」の記事を書きました。今回はその続きとなる「実践編」です!
実践編では「すべてのデータをコピー」する場合と「定期的にバックアップ(コピー)」する場合の観点で、詳しく見ていきたいと思います!それではさっそく本編に入りましょう!

すべてのデータをコピーする準備

そもそもすべてのデータをコピーするときってどんな時があるでしょうか?
また、すべての”データ”というのはどういう意味でしょうか?

まず、すべてのデータをコピーしたい場合としては

 パソコンを入れ替える場合
 ファイルサーバを入れ替える場合 ※情報システム部門の人たちなど

の2つがよくあるのではないかなと思います。

の場合は、1台のパソコンになるので数十GBほどであれば、1日かけて手動でコピペするのもいいかと思いますが、数百GBとなる場合にはrobocopyを使用するのもいいかもしれません。

の場合は、何人もの人と共有して使用することになるので、容量は場合によっては数TB~数十TBとなり、コピペはもはや現実的ではありません。
私も実際にお仕事で数十TBのデータ移行にrobocopyを使用したこともあります。

次に、すべての”データ“ですが、ファイルがそこに存在さえしていればすべてコピーできていると言っていいのでしょうか?
百閒は一見に如かずということで、実際に見てみましょう!

適当なファイルを右クリックしてプロパティを選択します。
ファイルプロパティ選択

表示されたプロパティ画面の”セキュリティ”タブを開きます。
セキュリティタブ選択

見たことがない人はなんのことかわからないと思いますので簡単に説明すると、
赤枠が、このファイルに対して何かしら権限が設定されているユーザ/グループ、

青枠が、それぞれに設定されている権限です。
一言でいうと、「誰がアクセスできて、どんな操作ができるかを設定している」情報です。(画像は”Users”に対して設定されている権限)
このデータ(情報)もコピーしなくてはならないため、ファイルがあるだけではすべてコピーできているとは言えないのです!
他にはファイルの属性やタイムスタンプなども”データ“に含まれてきます。

すべてのデータをコピーする

何をコピーしなくてはならないか確認できたところで、実際にコピーに使うコマンドを見ていきましょう。

実行コマンド
robocopy <コピー元> <コピー先> /COPYALL /MIR /EFSRAW /ZB /NP /V /R:1 /W:1 /IT /LOG+:<保存先>

たくさんオプションを付けていますが、1つ1つ説明していきます。

・/COPYALL
「すべてのデータをコピーする」という条件おいては一番重要になってくるオプションになるかと思います。
「/COPY:DATSOU」と同等のコマンドとなり、単純なデータだけでなく付随するデータもコピー対象としてコピーしてくれます。この「DATSOU」の意味は以下のようになっています。
 D=データ、A=属性、T=タイムスタンプ、S=セキュリティ、O=所有者情報、U=監査情報

・/MIR
ディレクトリツリーをミラー化してくれるオプション。ミラー化というのは、例えばコピー元で新しく作成されたファイルをコピーするだけではなく、
削除されたファイルがあればコピー先でも同様に削除し、コピー元とコピー先を同じ状態にしてくれます。
なお、/MIRは「/E」と「/PURGE」を合わせたオプションとなっています。
「/E」・・・空のディレクトリを含むサブディレクトリもコピーする
 「/PURGE」・・・既にコピー元に存在しないコピー先のファイル/ディレクトリを削除する

・/EFSRAW
WindowsのEFSという暗号化機能を使って暗号化しているファイルがある場合にはESF RAWモードという形でコピーしてくれます。
本来、暗号化されているファイルには他の人がアクセスできないようになっていたりするので、このオプションを付けることで
コピーできるようにします。

・/ZB
元々「/Z」「/B」というオプションがあり、それを1つにまとめたオプションです。
「/Z」では再起動可能モードでファイルをコピーするようにし、「/B」ではバックアップモードでファイルをコピーするようにします。
この再起動可能モードというのは、もし何かしらの原因で中断した場合でも途中から再開してくれるようになるので
大きなファイルや大量のデータがある場合には付けておくといいですね。
バックアップモードというのは、簡単に言うとアクセス権が無いファイルでもコピーできるようにします。こちらもすべてをコピーする場合には必須と言っていいですね。

・/NP
コピーの完了率を非表示にします。「逆にあった方がいいのでは?」と思われるかもしれませんが「/LOG:」オプションを付ける際には必須です!
付け忘れるとただひたすら進捗率(0%とか)がたくさん記載されたログとなってしまうのでとても見れるようなログにはなりません。。
コマンドプロンプト上で結果を出力して確認する、という場合はなくても問題はありません。

・/V
すでにコピー先に同様のファイルがある場合はスキップ処理を行いますが、スキップされたファイルがわかるように
出力できるようにします。もしこのオプションが無かった場合にはスキップされたファイルはログ上に残らず、スキップされたファイルのカウント数のみが最後に残りますが、後でログを見直す際にはあった方が分かりやすくなります。

・/R:1
何かしらの原因でコピーできなかった際の試行回数を指定しています。「別に失敗したらそれはそれでいいよ」という人でもこのオプションは付けてください。
実はこのオプション、robocopy実行時にはデフォルトで設定されており、その設定値は脅威の1000000回!
そのためこのオプションはrobocopyを使用する際は必須で指定しておくのがいいでしょう。
今回は試行回数として「1」を指定していますが、状況や条件によって回数は変更してください。

・/W:1
こちらは再試行と再試行の間に待機する時間を指定します。単位は「秒」です。
これも「/R」と同様にデフォルトで設定されている値があり、 30秒がデフォルト値となっています。
勘のいい人はお気付きかもしれませんが、もし「/R」と「/W」を指定せずデフォルトのまま実行して、1ファイルでもアクセス拒否等で失敗した場合は

    1000000回×30秒=30000000秒(約347日)

という時間をかけて試行を行い、次のファイルコピーに移ることになります。
1ファイルに1年近くの時間をかけるわけにはいかないのでこれらのオプションは要件に関わらず必須と言えるでしょう。

・/IT
異常なファイルも含めるようになります。と、ヘルプには記載されているのですが、そもそも異常なファイルというのは
ファイルが破損している等のことを指しているわけではありません。
robocopyはファイルの更新日時とサイズを見て差分判定を行いますが、ファイル属性のみを変更した場合でも
コピー対象としてくれるようになります。その際「マイナー変更した」という
ステータスでログされます。ログ上ではマイナスな表現になっていますがエラーではないですよー。

かなり文字の量が多くなってしましましたが、以上が今回使用するオプションの説明でした。一通り説明をしたオプションを付けて実行することで、基本的にはすべてのデータをコピーすることができるかと思います!
ただし、エラーとなりコピーできていないファイルがある場合は別途対応を検討する必要がありますのでご注意ください…。
次は定期的にバックアップする方法について見ていきましょう!

定期的にバックアップ(コピー)する

注意
robocopyでは製品を使用したバックアップほど細かいことはできません。
 ・世代管理は基本出来ない
 ・誤って削除してしまった場合は救えるが、誤った”更新”は救えない。
一時的な対応や小規模環境など、条件に応じて判断して運用してください。
しっかりとしたバックアップが必要な場合は製品の購入を検討することをオススメします。

実はバックアップの場合でも実行コマンドは「すべてのデータをコピーする」場合とほとんど変更しなくても問題ありません。
要件によりますが、コピー先のデータを削除されないよう「/MIR」を「/E」に変えることでコピー元でファイル削除したとしてもコピー先のファイルをずっと残すことも可能です。※残り続けるためコピー先のディスク容量には注意が必要です。
なので、後は定期的に実行するにはどうするかですが、それには「コマンドのbat化」と「タスクスケジューラー登録」で実現します!

・コマンドのbat化
これはそこまで難しくありません。上記で説明したコマンドをtxtに記載し、ファイル拡張子をbatで保存するだけで終わりです。
基本編の環境をそのまま利用して実際に見ていきましょう。

コマンドをtxtに記述して保存します。
※保存先はどこでもいいですが、管理しやすい場所にしておきます。
コマンド記述

ファイル拡張子を「txt」から「bat」に変更します。(警告が出ますが”はい”で大丈夫です)
ファイル拡張子変更

これでbat化は完了です。

・タスクスケジューラーの登録
次にこのbat化したファイルをタスクスケジューラーに登録します。
環境によって細かい部分は変わるかと思いますが、今回は以下の条件で登録します。

タスク実行ユーザー Administrator
実行間隔 1日1回、0時開始
タスク停止までの時間 無効
既にタスク実行中の場合 新しいインスタンス(タスク)を実行しない
タスク実行時のプライオリティ 通常(6)

「タスクスケジューラーライブラリ」を右クリックし「タスクの作成」を選択
タスクの作成

“全般”タブで以下のように設定していきます。

タスク実行ユーザー Administrator
実行間隔 1日1回、0時開始
名前 robocopy
説明 robocopyの実行※記載しなくても問題ありません。
実行ユーザアカウント Administrator
ユーザログオン状況 ログオンしてなくても実行する
最上位の特権 有効
構成 タスクを登録する環境に合わせる

※本来「構成」はリモートからタスクを実行する際に、実行する側が古いOSの場合にはそちらに
合わせます。そのため、ローカルで実行する場合にはあまり考慮する必要はありません。

タスクの作成(全般タブ)

“トリガー”タブで新規を選択
タスクの作成(トリガータブ)

設定を「毎日」にし、開始時間を指定します。
新しいトリガー設定

“操作”タブで新規を選択
タスクの作成(操作タブ)

参照を選択し、先ほど作成したbatを選択します。
新しい操作設定

“条件”タブで以下のように設定していきます。

AC電源を使用している場合のみ… チェックを外す
電源をバッテリに切り替得る場合 チェックを外す
スリープの解除 チェックを付ける
タスクの作成(条件タブ)

“設定”タブで以下のように設定してOKをクリックします。

タスク停止するまでの時間 チェックを外す
要求時に実行中のタスクが… チェックを外す
タスクが既に実行中の場合 新しいインスタンスを開始しない
タスクの作成(条件タブ)

作成したタスクを右クリックし、エクスポートを選択します。
タスクのエクスポート

エクスポートしたxmlファイルをメモ帳で開き、プライオリティを7から6に変更して保存します。
これしないとタスクスケジューラーによって実行されるプログラムの優先度が低く、実行しても「あれ、処理が遅いな。。。」という事態を回避できます。
詳しくはTaskSettings. Priority プロパティをご確認ください。

エクスポートファイルの編集

最初に作成していたタスクを削除します。
タスクの削除

タスクスケジューラーライブラリを右クリックし、タスクのインポートから編集したxmlファイルを選択します。
タスクのインポート
インポートするタスクの選択

タスクが準備完了ステータスになっていることを確認する。
インポートしたタスクのステータス確認

これにてタスクの登録は完了です。これで毎日0時に自動でrobocopyを実行することができます!
ちなみに、すべてのデータをコピーするコマンドを同じように登録して毎日実行した場合、差分コピーとして機能しますので
ぜひ試してみてください!

まとめ

いかがだったでしょうか?これにて実践編も終わりです。
robocopyはライセンス費用をかけることなく使用できるので、存在さえ覚えておけばいざというときにきっと役立ちます!
それでは最後にポイントのおさらいです!

・すべての”データ”というのはファイルだけでなく権限、属性、タイムスタンプ等も含んでいる。
・robocopyのオプションはどんな時でも共通して「/ZB」「/R」「/W」オプションは必ず付ける!
定期実行するためには「コマンドのbat化」と「タスクスケジューラー」を利用する!

今回紹介したオプションは数ある中の一部なので、ぜひ色々なオプションを試してrobocopy使いになってください!
次はなんの記事を書こうかな~。

2022年8月31日 robocopyを試してみた!(実践編)

Category インフラ

ご意見・ご相談・料金のお見積もりなど、
お気軽にお問い合わせください。

お問い合わせはこちら