Mar 10, 2009

Windows Vista Home Premium以下のエディションでうそっこシャドウコピーとうそっこComplete PCバックアップを追加出費0で実現してみようという試み

旧題:robocopyとcygwinとタスクスケジューラでWindows Vistaを3世代バックアップのまとめ。

Vistaの標準コマンドのrobocopyシンボリックリンクを除外してミラーリングできることが分かったってことで、とりあえずこんな風にしてみた。前提は以下の通り。

  • バックアップ対象はCドライブ全部。
  • Zドライブは全部バックアップ用。
  • Zドライブのルート直下に「backup1」「backup2」「backup3」の3つのフォルダがある。
  • backup1→backup2→backup3→backup1→backup2……とローテーションでミラーリングする。

シェルスクリプトはこう。

#!/bin/sh

# 日付を含んだ名前のフォルダにする
destdirname=backup`date +%Y-%m-%d_%H-%M-%S`

destparentdir=/cygdrive/z
# robocopyに渡すためのWindows形式のパス。(ひょっとして不要?)
destparentdir_win=z:\\

# 最終更新日が一番古いフォルダの名前を取得する。
cd ${destparentdir}
targetdirname=`ls backup* -drt | grep -m1 "^backup"`

# で、それを日付を含んだ名前に変える。
mv "./${targetdirname}" "./${destdirname}"

destdir=${destparentdir}/${destdirname}
destdir_win=${destparentdir_win}\\${destdirname}

echo "backup to ${destdir_win}"

# Cドライブバックアップ用のフォルダがなければ作成。
# (後から他のドライブのバックアップも取りたくなった時のため)
if [ -d "$destdir/c" ]
then
  echo "old backup exists"
else
  mkdir "$destdir/c"
fi

# 古いログを削除。
rm ${destdir}/log.txt

# robocopyでミラーリング。
#  * シンボリックリンクは除外(/XJD、/XJF)
#  * リトライはしない
#  * ログをファイルに出力
robocopy /MIR /ZB /SEC /SECFIX /XJD /XJF /R:0 /LOG:${destdir_win}\\log.txt "c:\\" "${destdir_win}\\c\\"

exit

シェルスクリプトは改行コードをLFにしとかないとbashがエラーを起こすので、気をつけないといけない。いつもそれを忘れてミスる。

で、タスクスケジューラで時々走らせる(bash.exeの引数にスクリプトを渡す)。とりあえずテストって事で3日に1回やってみよう。バックアップ間隔は後で変えるかも。期待通りに動いてるかどうか、後日要チェックだ。

追記。ちょっとスクリプトを修正した。よく考えたらフォルダ名自体を日付にしとけばもっとわかりやすかった……

  • 何故JScriptで書かないのか、を訊いてはいけません。
  • 同じ場所で同じ物理ドライブの中に複数世代バックアップ取る意味あるの?とか訊いてもいけません。
  • 必要最低限のファイルだけバックアップ取ればいいのにアホちゃう?とか言ってもいけません。
  • Linuxっぽい記法とWindowsっぽい記法がチャンポンでキモイ、とか言ってもいけません。

追記。っつーかそもそもVistaには標準で便利なバックアップ機能があるんですね。知らんかった(マヌケ)。しかし一番魅力的なComplete PCバックアップはHome Premiumには無くてBusiness以上のみ……Home Premiumで使えるバックアップ機能の範囲ではレジストリ等はバックアップできないみたいだし、シャドウコピーも無理みたいだし、もうこれでいいかなあ。つまり、このエントリの内容は「Windows Vista Home Premium以下のエディションでうそっこシャドウコピーとうそっこComplete PCバックアップを<ruby><rb>無料</rb><rt class="読み">タダ</rt></ruby>で実現してみよう」という内容に相当するわけか?→ということでタイトル変えてみた。


2020年1月7日追記。ここから10年が経過した現在は、Windowsのバッチファイルを使わずにrsyncを使っています。重要なのは以下の2点です。

  • QNAPのNASを導入(GUIを使わずSSH接続できる)
  • Windows 10でWSLを使ってrsyncで /mnt/c/ 配下の任意のディレクトリをQNAPに同期する

WSLって何?という方はまんがでわかるWSLあたりをご参照下さい。

エントリを編集します。

wikieditish message: Ready to edit this entry.











拡張機能