robocopyコマンドで自動バックアップ化
昨今のPCではHDD搭載も少なくなり、SSDの搭載率が日に日に上がっていますね。
私のPCもシステムが入っているCドライブはSSDにしているんですが、その他のデータ用のディスクはHDDにしています、SSDも大容量になるとまだ高いですからね……
結構これと同じ様な構成でPCを運用している方は多いと思いますが、SSDにすることでちょっとしたデメリットが存在するんですよね。
それが、SSDが壊れた場合のデータ救出の難易度です。
この記事の目次
SSDは何故壊れると面倒なのか?
これについては知っている人も居ると思いますが、SSDはHDDに比べ物理的な障害が起こると突然死する確率が非常に高いです。
HDDの場合は異音から始まり、特定のファイルにアクセスするとフリーズしたり一部のデータが破損したりと、割と前兆を見せてくれます。
なので、比較的「なんか死にそうだから新しいHDDに換装するか」と判断する猶予があるんですが、SSDの場合は突然ディスク自体を認識しなくなったりするので、壊れてからだと遅いんですよね。
これにはSSDの構造上の理由があるんですが、話すとそれだけで記事が一つ出来てしまうので詳細は省きます、もし興味のある方は調べてみて下さい。
一応簡単に説明すると、SSDはHDDに比べデータの管理方法や基本的な仕組みが複雑化されているので、それだけ復旧の難易度も上がってしまう形です。
自転車が壊れてもまだ自分で直せますが、車が壊れた場合自分で修理するのは難しいですよね、ざっくりとした例えですがそんな感じです、例えがヘタクソか。
定期的なバックアップは重要
まあそんなこんなで、例えHDDだとしても定期的なバックアップは重要となります。
バックアップについてはWindowsの標準機能でありますが、今回はピンポイントでフォルダを指定する自由度の高い方法でバックアップを定期的に取ってみます。
robocopyコマンドとは?
本題に入りますが、Windowsには標準でrobocopyというコマンドが使用できます。
robocopyコマンドはファイルやフォルダをコピーする為のコマンドですが、多彩なオプションを使用する事でかなりの自由度を誇ります。
わかる方はLinuxで例えるとcpコマンドよりもrsyncコマンドに近いですね。
robocopyコマンドが優秀な理由は、指定したファイルやフォルダをただコピーするだけではなく、差分コピーが出来る点でしょうか、これのおかげで効率的なバックアップ運用が可能となります。
早速ですが、私が既に運用しているrobocopyコマンドを使用したバックアップバッチを紹介します。
バックアップを行う本体のバッチを作成する
robocopy "バックアップしたいフォルダのパス" "バックアップ先フォルダのパス" /MIR /R:0 /W:0 /LOG:"バックアップログのファイルパス" /NP /NDL /TEE /XJD /XJF
上記のコマンドが実際に運用しているバックアップバッチに書かれている1行になります、順に解説していきます。
まずrobocopyですが、これは説明するまでもないでしょう、この後に続く文字列は全てオプションの指定になります。
最初のオプションでは、バックアップしたいフォルダのパスを記載します。
例えばピクチャーフォルダをバックアップしたい場合は、C:\Users\(ユーザー名)\Picturesを指定します。
2番目オプションはバックアップ先のフォルダのパスを記載します、バックアップはなるべく別ディスクにした方が良いので私の場合はEドライブがHDDなのでそこにバックアップを保存しています。
3番目のオプションは/MIRですが、これはディレクトリの階層をそのままコピーするという意味です。
4番目と5番目では/R:0と/W:0を指定しています、これはコピーに失敗した場合に何回までリトライをするか、またリトライする間隔の秒数を指定しています。
この場合はリトライなしとなります、例えば/R:5の/W:10を指定した場合は10秒間隔で5回までリトライをします。
6番目ではログファイルを出力する指定をしています、普段は見ないですがもし何か不具合があった際に確認するようになります。
7番目から9番目の/NP、/NDL、/TEEはログに関するオプションになります。
/NPはコピーの完了率の非表示化、/NDLはディレクトリ名の非表示化、/TEEはログの内容をコンソールにも表示するという意味です。
最後の10番目と11番目の/XJDと/XJFはディレクトリとファイルのシンボリックリンクの除外を意味します。
とまあ……この様に、robocopyコマンドではとにかく豊富なオプションが指定できます。
他にも様々なオプションがありますので、自分の環境に合わせて組み合わせる事が大事になります。
上記のコマンドの1行をコピーし2行目以降も同じ様に、バックアップ元、バックアップ先、ログファイル名をそれぞれ変えてあげれば複数のフォルダに対してバックアップ可能です。
出来上がったコマンド群のテキストは、backup.bat(.batより前の名前は何でも良い)というファイル名でバックアップを保存する場所に保存しておきます。
定期的にバッチを自動的に実行する
その前にスクリプトの作成
さて、出来上がったbackup.batですが、これを定期的に実行させる為にはもうひと工夫必要です。
定期的な実行には、Windows標準の機能であるタスクスケジューラを使います。
タスクスケジューラでは指定した間隔で自動的に何かを実行させる用途で使用しますが、このまま完成したバッチファイルを実行させると少々面倒な事になります。
それは、バックアップ中にコンドールウィンドウが勝手に開いてしまうので、バックアップ中はこのウィンドウが出てきてしまい邪魔になります。
なので、バッチファイルはそのまま実行せずに、一段回噛ませた状態でこのバッチファイルを実行するように仕組みます。
簡単です、バッチファイルを実行するためのスクリプトファイルを作成して、そいつを経由してバックアップを行います。
以下の内容でファイルを作成します、こちらも名前は何でもいいですが今回はstart_backup.vbsにしました。
Set ws = CreateObject("Wscript.Shell")
ws.run "cmd /c backup.bat", vbhide
backup.batの部分は、自身の決めたバッチファイルの名前にして下さい、このスクリプトはバックアップバッチと同じ場所に保存しておきます。
タスクスケジューラへ登録する
後はこのvbsファイルをタスクスケジューラに登録するだけです。
タスクスケジューラはスタートメニューで「タスクスケジューラ」と検索すれば、時計みたいなアイコンのプログラムが現れると思いますので、これを選択します。
起動しましたら、まずは管理をしやすくするために「タスク スケジューラ ライブラリ」を右クリックし「新しいフォルダー」を選択します、名前は何でも良いです。
出来上がったフォルダーを再度右クリックで「タスクの作成」を選択します。
全般タブでは名前と説明を記載しておきます、これも管理しやすい名前で良いでしょう。
トリガータブでは、どういった条件でバックアップを実行するかを決めます、ここでは毎日決まった時間にバックアップを取りたいのでその様に設定をします。
トリガータブの「新規」ボタンでトリガーの新規作成が行なえます、上記の画像の設定の場合毎日21時45分にバックアップを行う事になります。
ここら辺は好きに設定しましょう、毎日じゃなくて毎週でも良いですし、時間や間隔も生活時間に合わせてください。
操作タブではトリガータブで設定した時間に何をするかを設定します、今回はバックアップバッチを実行する為のスクリプトファイルを指定します。
プログラム/スクリプトの欄で参照ボタンを押し、先ほど作成した拡張子が.vbsのスクリプトファイルを選択します。
開始(オプション)の欄では、そのスクリプトファイルが置いてあるフォルダのパスを記載します。
条件タブではトリガータブで設定した項目に加えて、PCの状態を加味した実行の可否を設定しますが、私の場合はデフォルトのままです。
トリガーの設定次第では細かな調整をした方が良いでしょう。
最後に、設定タブの項目を決めますが私は以下の様にしています。
この設定では、もし21時45分にPCの電源が落ちていたりしてバックアップが実行出来なかった場合は、起動したらすぐにバックアップを行う設定にしてます(スケジュールされた時刻に~のチェックボックス)。
他は特に弄らなくても良いでしょう、これでやっとバックアップのタスクスケジューラへの設定が完了です。
OKボタンを押して、設定を確定させましょう。
備えあれば憂いなし
この運用を始めて既に1年半が経過していますが、まだバックアップのお世話になってはいません。
しかし、SSDは本当に壊れると厄介なので、バックアップを行うに越したことはありません……
(会社で管理しているサーバのSSDが壊れた時は本当にしんどかった)