2015年7月26日日曜日

VMWare Fusionの仮想マシンのバックアップ再考

VMWare Fusionの仮想マシンバックアップにTime Machineを用いる方法が、VMWare KBに紹介されている。
かいつまんで説明すると、VMWare Fusionに備わっているAuto Protectスナップショットという機能を用いることで仮想ディスク全体の更新を止め、変更分(スナップショット)のみ新規保存するようにすることで、Time Machineバックアップへの負荷を軽減するというものだ。

筆者も、半年ほど、この機能を使ってTime Machineに仮想マシンをバックアップしてきた。だが、止めることにした。バックアップ側ではなく、Mac本体にある仮想マシンのサイズが、実容量の倍以上に肥大してしまったからである。(履歴が残る分、バックアップ側はもっと大きい)

仮想マシンファイルはパッケージ形式で、中に仮想ディスクイメージがあるのだが、そこにあるスナップショットと思われるファイル群が、元の仮想ディスクと同じくらい容量を食っていた。
即刻VMWare Fusionのスナップショット管理ウインドウで、Auto Protectを止め、スナップショットを削除したところ、予想通り、仮想マシンファイルのサイズは、ほぼ半減した。

以前筆者は、仮想マシンバックアップに、rsyncというコマンドを使っていた。履歴を残したら大変なので、最新状態のみバックアップしていた。Time Machineを使えば履歴が残る。良さそうに思えたのでAuto Protectに浮気したが、やっぱりrsync戻るしかないと考えた。戻りついでに、手順を残しておくことにした。

Auto Protectがまずい理由を説明しようとして長くなった。ここからが本エントリの主題である。以下、rsyncの最新版ビルド、launchdシェルスクリプト、launchdプロパティリストの順に説明を進める。

  1. 仮想ディスクの分割
    仮想ディスクは分割しておくことをお勧めする。その方が、バックアップされるファイルの量が減るはずだ。
  2. rsyncの最新版ビルド
    rsyncの最新版は3.1.1である。対するにOS X Yosemite収録のrsyncは2.6.9で、2006年更新のものだ。ここではこちらの記事を参考に、OS Xが持つファイル属性がコピーできるものをビルド、インストールすることにする。
    curl -LO https://download.samba.org/pub/rsync/src/rsync-patches-3.1.1.tar.gz
    tar xf rsync-patches-3.1.1.tar.gz
    mv rsync-3.1.1/patches ./
    rm -rf rsync-3.1.1/
    curl -LO https://download.samba.org/pub/rsync/src/rsync-3.1.1.tar.gz
    tar xf rsync-3.1.1.tar.gz
    mv patches rsync-3.1.1/
    cd rsync-3.1.1/
    patch -p1 < patches/fileflags.diff
    patch -p1 < patches/crtimes.diff
    ./configure
    make
    sudo cp -pR rsync /usr/local/bin/rsync-311
    
  3. launchdシェルスクリプト
    次のシェルスクリプトは、rsync-311を用いて指定したディスクに仮想マシンの入ったフォルダごとコピーする。これをvm.backup.shというファイル名(例)で保存する。保存場所は任意だが、次項で使うので覚えておいて欲しい。
    #!/bin/sh
    
    
    # バックアップを置く外付けハードディスク名、およびフォルダ名を設定
    backUpHdd="ExternalHDDName"
    backUpPath=/Volumes/"$backUpHdd/"
    
    thePath="/Users/{Account Name}/Documents/Virtual Machines.localized"
    
    if [ -d "$thePath" -a -d "$backUpPath" ]; then
      Ver1=`Date`
      Ver2=`/usr/local/bin/rsync-311 -avNHAX --fileflags --force-change --delete --stats "$thePath" "$backUpPath"`
      echo $Ver1"\n\n$Ver2" > /tmp/vm.backup.log
    fi
    
    exit 0
    
    シェルスクリプトには、実行権限を付与する。
    chmod 755 vm.backup.sh
    
  4. 指定時間ごとにシェルスクリプトを実行するLaunchdプロパティリスト
    次のLaunchdプロパティリストは、外付けHDDのマウント時に6時間おきに仮想マシンをバックアップする。これをjp.yourName.vm.backup.plistというファイル名(例)で保存する。保存場所はホームディレクトリ > Library > LaunchAgentsである。
    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
        <dict>
            <key>Label</key>
            <!-- yourNameを書き換える -->
            <string>jp.yourName.vm.backup</string>
            <key>ProgramArguments</key>
            <array>
                <!-- Account Nameを書き換える -->
                <string>/Users/{Account Name}/Library/LaunchAgentsScripts/vm.backup.sh</string>
            </array>
            <key>StartInterval</key>
            <!-- 数字をバックアップする時間間隔(秒)に書き換える -->
            <integer>21600</integer>
            <key>StandardErrorPath</key>
            <string>/tmp/StandardError.log</string>
            <key>StandardOutPath</key>
            <string>/dev/null</string>
        </dict>
    </plist>
    
    プロパティリストをLaunchdに登録する。
    launchctl load /Users/YourAccount/Library/LaunchAgents/jp.yourName.vm.backup.plist
    

以上の手順で、仮想マシンの最新状態のみ、Launchdプロパティリストで指定した時間間隔でバックアップされるようになる。時間間隔は、あまり細かすぎると、仮想マシンをいじりすぎて元に戻したい時などに困る。筆者は取り敢えず6時間を設定した。

なお、Time Machineバックアップからの仮想マシンバックアップ削除も実行した。これは通常のTime Machine操作方法と同じなので、ここでは説明していない。

VMWare Fusionの例で説明したが、VirtualBoxでも、仮想ディスクを分割すれば、この方法でバックアップできる。

0 件のコメント :

コメントを投稿