MacでSparseBundleImageを利用した仮想マシンバックアップ
前回、iMacでWindows8を実際に使ってみるために、VMWareFusion5を使って仮想マシンとしてインストールしました。
今回、仮想マシンを効率よくバックアップするために、少し複雑な手順を踏んでいきます。
特に複雑なことをしなくても、一般的なインストール方法でも十分利用できます。
ただTimeMachineで仮想マシンをバックアップすると、毎回かなり大きな転送量になり、TimeMachine用のドライブの使用効率が悪くなるため、別の手段でバックアップを試みることとします。
この手順の中でターミナルでコマンドを入力する必要があります。
仮想マシンのバックアップについて
仮想マシンファイル.vmwarevmは一つのファイルとして見えますが、内部でディレクトリの構造となっています。パッケージの内容を表示とすると、これを見ることができます。
仮想マシンファイルの内部では、仮想ハードディスク.vmdkがおよそ2GB単位で分割されています。
仮想マシン内に変更が加えられた場合は、このvmdkファイル単位でファイルの変更が行われます。
TimeMachineでバックアップを行う場合、仮想ハードディスク単位で、変更のあったファイルはすべて履歴管理されますので、TimeMachineへ書き込まれる量は数GB単位となります。
単純に仮想マシンを起動して、シャットダウンするだけでも、TimeMachineには数GBからの差分の書き込みが行われます。
そのため、Macで仮想マシンを利用されている方で、TimeMachineから仮想マシンフォルダを除外ファイルとされている方も多いです。
そうなると、TimeMachineからの復元を行う際に、仮想マシンが一切復元されず、仮想マシンに保存されていたデータを含めすべてを失ってしまうことになります。
今回、仮想マシンファイルはTimeMachineのバックアップからは除外し、別の仕組みでバックアップを行うこととします。
スパースバンドルディスクの作成
スパースバンドルディスク(Sparse Bundle Disk Image)とは、Mac OSの上で一つのディスクイメージとして認識されますが、内部では8MBの小さなファイルに分割されたディレクトリ構造のものをいいます。仮想ディスクの一つです。
読み書きなどは、一つのドライブに対して行うのと同一で、処理としても大きな負担になることはありません。
このスパースバンドルディスク内に格納されたファイルが変更された場合、小さなファイル単位で変更のあった部分だけ、更新されます。
これに今回仮想マシンをインストールします。
DiskUtilityで新規イメージを作成し、名前や、フォーマット、サイズなどを設定します。
今回は60GBの容量をあらかじめ指定し、フォーマットにはMac標準のMacOS拡張(ジャーナリング)を選択。イメージフォーマットはスパースバンドル・ディスクイメージを選択すれば、スパースバンドルディスクが作成されます。
60GBの容量を設定すると、即時60GBの容量が確保されるのではなく、必要な分だけ確保されることになります。
またイメージ作成後の容量の増加なども可能です。
このようなファイルが出来上がります。これをダブルクリックすることで、ディスクイメージとしてマウントされます。
このマウントされたディスクに仮想マシンを作成します。
Windows8のインストール
前回の手順と同じですが、VMWareのセットアップの際に下記の画面で設定を変更する必要があります。
設定のカスタマイズで、仮想マシンの保存場所をスパースバンドルディスクイメージ内に設定します。
rsyncによる仮想マシンのバックアップ
まずTimeMachineのバックアップ対象からスパースバンドルディスクイメージを除外します。
ターミナルからrsyncコマンドでこれを外付けのハードディスクにバックアップします。
例として、
[bash]
rsync -aur --delete --progress "/Users/username/documents/Virtual Machines.localized" /Volumes/HDDNAME/VMWareBackup
[/bash]
という感じで、ローカルバックアップでは
[bash]
rsync –aur ––delete -–progress コピー元ディレクトリ コピー先ディレクトリ
[/bash]
と指定します。
この手順でsparsebundleファイルをバックアップ先のハードディスク内のフォルダに同期するように設定します。
コピーされているファイルが一覧で表示されますが、
Virtual Machines.localized/VirtualMachine.sparsebundle/bands/c27
8388608 100% 10.87MB/s 0:00:00 (xfer#49, to-check=292/3186)
このような形で、スパースバンドル内の8MBのファイルがコピーされていることがわかります。
二回目以降の実行からは、変更のあったファイルのみの同期となります。
sent 856838334 bytes received 2292 bytes 114245416.80 bytes/sec
total size is 25043844704 speedup is 29.23
実行結果がこのように表示されますが、トータル25GBの仮想マシンファイルのうち856MBが同期されたことがわかります。
rsyncの自動実行
これをシェルスクリプトにして、ログイン時に自動実行します。
viなどを利用し、先ほどのrsyncコマンドをシェルスクリプトにし、chmodで実行権限を与えます。
[bash]
vi vmbackup.sh
[/bash]
iを押して入力モードにし、
rsync -aur --delete --progress "/Users/username/documents/Virtual Machines.localized" /Volumes/HDDNAME/VMWareBackup
のように先ほど成功したrsyncコマンドを貼り付け、[ESC]:wqで保存します。
これに
[bash]
chmod 755 vmbackup.sh
[/bash]
として実行権限を与えます。
これをログイン時に自動実行・定期実行するには、plistを作ってlaunchdに登録する必要があります。
Linuxなどではcronを利用しますが、OS Xではlaunchdを利用することが推奨されています。
launchdに登録するにはXMLを書く必要があり、思い通りに動作するXMLを作成するのが手間な場合は、Lingon3をMacAppStoreから購入して使用するのが便利です。
https://itunes.apple.com/jp/app/lingon-3/id450201424?mt=12
Lingon3を利用すれば、簡単な操作でplistファイルを作成し、launchdに登録できます。高価なアプリではありませんので、便利さから考えれば、十分な価値はあります。
Lingon3を起動し、NewJobをクリックし、ファイル名をlocalhost.vmbackupといったplist名を設定します。
Whatに先ほど作成したをシェルスクリプトを指定し、whenにAt login and at loadにチェックを入れます。
Every 1 Hoursなどとしておくと、一時間おきに実行されます。
Save&Loadを押し、plistをlaunchdに登録します。
あとは、スパースバンドルディスクをログイン時にマウントする手順です。
ログイン時にスパースバンドルを自動マウントする
スパースバンドルディスクをマウントするためのターミナルでのコマンドは、
[bash]
hdiutil attach sparsebundleファイル
[/bash]
になります。
これをrsync同様にシェルスクリプトにし、実行権限を与えます。
Lingon3で同様にplistを作成し、Login時に実行するように設定します。
これで仮想マシンの作成とバックアップの一通りの設定は終わりです。
まとめ
かなり長いエントリとなりましたが、Macなりの機能を活かした方法となりました。
仮想マシンファイルも履歴管理したい場合は、TimeMachineを利用するのが手っ取り早いですが、仮想マシンを使っている間、かなりのサイズのTimeMachineドライブへの書き込みが発生してしまいます。
ユーザーファイルをホストOSの共有フォルダに持たせ、そこをTimeMachine管理とすれば、仮想マシンに何らかの障害が発生しても、再インストールの手間のみと割り切って利用するのも一つの方法です。
単純なバックアップとしては、.vmwarevmファイルを外部ハードディスクなど日に一度でもコピーしておけば、前の日までのバックアップは確保できます。
実用的なWindows仮想マシンは、Officeスイートやアップデートなどで、どうしても数十GBからの容量が必要となりますので、今回Windows8をそれなりに使っていくうえで、これだけ下準備を行ってみました。
まだこれで長期間実用したわけではないので、どのような問題が起こるのか、どう使っていけばよいか、未知数な部分はありますが、今後またBlogなどで報告したいと思います。
(2013/3/29更新)
使用しているうちに容量が足りなくなったため、
SparseBundle上の仮想マシンイメージの拡張
という記事を投稿しました。