Virtual Server 2005上のゲストOSの状態を保存し、さらにその間に特定DISKにゲストOSのデータをバックアップ、さらにゲストOSを復旧させるスクリプトを作りました。
Virtual Server 2005 SP1からVSSにも対応しているみたいで、実際にVSSを利用したバックアップも試してみたんだけど、どうも稼働中のデータそのままでリカバリする方法が分からなかったので、原始的ではありますが
いったんVirtual ServerからゲストOSを保存済み状態にしてはずす→バックアップ→復旧
という手順にしてみました。ゲストOSのHDD容量に時間は比例するとは思うけど、この方法でダウンタイムは一回に5分程度で、まあ夜中ならいけるかな?って感じです。
また、ゲストOSにIPアドレスを割り当てる時にDHCPを選択している場合にはVirtual ServerのDHCPサーバ機能を利用しないと復旧時に上手くIPアドレスが割り当たらなくて困ります。
とりあえず動くってレベルだと思うので自分自身これから更新もすると思いますが、使いやすい感じに加工していただければと思います。
また、実行は
Cscript C:\scripts\hogehoge.vbs
こんな感じでコマンドプロンプトで実行してください。また、スクリプト中の
BKUP_Dir = "G:\Backup"
の部分はバックアップの格納先ですので、お使いの環境に応じて変更してください。
Option Explicit Dim objVS,colVMS,objVM Dim VM_STATE_RUNNING Dim dateStartTime Dim dateEndTime Dim dateTotalTime 'バックアップを保存するディレクトリ Dim BKUP_Dir 'ゲストOSのVMCイメージが保存されている親ディレクトリ Dim strGestOSDir BKUP_Dir = "G:\Backup" VM_STATE_RUNNING = 5 'objVM.Stateの値説明 ' 0: バーチャルマシンが存在しない ' 1: オフ ' 2: 保存済み ' 3: オン中 ' 4: 復元中 ' 5: 実行中 ' 6: 一時停止 ' 7: 保存中 ' 8: オフ中 ' 9: 復元ディスク適用中 '10 : バーチャルマシンが削除されている Set objVS = CreateObject("VirtualServer.Application") Set colVMS = objVS.VirtualMachines For Each objVM in colVMS '指定されたゲストOSが起動していた場合、状態の保存を行う。 If objVM.State = VM_STATE_RUNNING Then 'タイマー取得 dateStartTime = Timer '状態の保存 objVM.Save Wscript.Echo dateStartTime & " " & objVM.Name & " の状態の保存を行っています。" 'ゲストOSの状態が保存済みになるまで待機する。 Do Until objVM.State = VM_STATE_SAVED WScript.Sleep 1000 Loop strGestOSDir = GetParentFolderName(objVM.File) 'BKUP_Dirに対してゲストOSの親ディレクトリをコピー Call CopyFolder(strGestOSDir,BKUP_Dir & "\" & objVM.Name) Wscript.Echo objVM.Name & " のバックアップが完了しました。" 'ゲストOSを起動。 objVM.Startup() Wscript.Echo objVM.Name & " を起動しています。" 'ゲストOSの状態が実行中になるまで待機する。 Do Until objVM.State = VM_STATE_RUNNING WScript.Sleep 1000 Loop '確認用 Wscript.Echo objVM.Name & " が起動しました。" End If 'ファイル情報 Wscript.Echo "親ディレクトリ" & GetParentFolderName(objVM.File) 'タイマー取得 dateEndTime = Timer dateTotalTime = dateEndTime - dateStartTime Wscript.Echo "バックアップ所要時間:" & (Int(dateTotalTime * 10 ^ 4 + 0.5) / 10 ^ 4) & "秒" Next '親ディレクトリ名を返す '(例)GetParentFolderName(objVM.File) → G:\Shared Virtual Machines\INSPC07 Function GetParentFolderName(Path) Dim objFS Dim strParent Set objFS = WScript.CreateObject("Scripting.FileSystemObject") strParent = objFS.GetParentFolderName(Path) GetParentFolderName = objFS.GetParentFolderName(Path) Set objFS = Nothing End Function '参照元ディレクトリから参照先ディレクトリに対して上書きコピー 'CopyFolder(参照元ディレクトリ,参照先ディレクトリ) Function CopyFolder(strSourceDIR,strDestinationDIR) Dim objFS Const OverWriteFiles = True Set objFS = WScript.CreateObject("Scripting.FileSystemObject") '参照先ディレクトリが無ければディレクトリを作成 Call CreateDir(strDestinationDIR) 'ディレクトリへのコピーは上書き objFS.CopyFolder strSourceDIR,strDestinationDIR,OverWriteFiles End Function 'ディレクトリを作成する Sub CreateDir(Path) Dim objFS Dim strParent Set objFS = WScript.CreateObject("Scripting.FileSystemObject") strParent = objFS.GetParentFolderName(Path) '親ディレクトリが無ければディレクトリを作成 If Not objFS.FolderExists(strParent) Then Call CreateDir(strParent) End If If Not objFS.FolderExists(Path) Then objFS.CreateFolder(Path) End If End Sub