2008/6/15 日曜日

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

Filed under: Windows Server 2003, スクリプト — pnpk @ 18:09:29

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

Popularity: 3%

コメント (0) »

この記事にはまだコメントがついていません。

コメント RSS トラックバック URI

コメントをどうぞ

HTML convert time: 0.490 sec. Powered by WordPress ME