全てのゲストOSを停止状態にしてさらにバックアップを取得@VirtualServer2005

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

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です