- 2008-06-15 (日) 18:09
- Windows Server 2003
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
関連する記事
Comments:0
Trackbacks:0
- Trackback URL for this entry
- http://pnpk.net/cms/archives/430/trackback
- Listed below are links to weblogs that reference
- 全てのゲストOSを停止状態にしてさらにバックアップを取得@VirtualServer2005 from http://pnpk.net