不花錢的VM自動備份

在越來越多的主機移植到 VMWare 上之後, 備份機制就越顯重要, 適當的
備份除了可以很快速的回復狀態, 甚至可以做到異地備份的機制.

在試用 vCenter 中, 可以由介面於指定時間內自動 Clone VM 主機, 系統也可以正常且正確的於指定時間內執行, 但是每日去做相同作業時確無法複蓋掉先前的 Clone, 所以此機制不適用於備份而是用在排程執行在上班時間不方便作的事情, 例如作 VM 機器搬移的動作.

在 vSphere 介面透過以下的組合來達到想要做到的事情

tasks that can be scheduled in vcenter
tasks that can be scheduled in vcenter

在網路上搜尋在不採購其他軟體的情況下, 是有幾種方式可以透過撰寫 Script 的方式來達成, 其中 Script 可以分成是在ESX主機上執行的及透過 Windows PowerShell 來指揮 ESX / vCenter 來達成任務, 這邊就以後者來作分享.

首先找一台 Windows 機器先到 M$下載並安裝 MS Power Shell (http://support.microsoft.com/kb/968929), 我這邊測試是用 2.0 的版本, 趁下載及安裝的時候到 VMWare 去抓 VMware vSphere PowerCLI (http://communities.vmware.com/community/vmtn/vsphere/automationtools/powercli), 這個可以說是VMWare 專門對 PowerShell 所開發的一個 Snapin, 來補強 PowerShell 跟 VM 主機間的溝通.

上述兩個軟體安裝後, 在桌面上可以看到特別的捷徑, 打開後需要一點時間起動 VMWare 的功能

desktop shortcut for VM PowerCLI
desktop shortcut for VM PowerCLI

進 入後可以看得到歡迎的畫面, 同時列出幾個常用的指令給你參考, 建議安裝完成後可以先利用以下的指令來測試:

Connect-viserver {ip/name for ESX/vCenter}
Get-VM {Name of VM}

如果系統可以回復的話, 那就是代表安裝成功且可以正確的連結到 VMWare 主機

Welcome Screen for VM PowerCLI
Welcome Screen for VM PowerCLI

接 下來就是要撰寫 Script, 不過這個部份我已經測試完成, 可以參考以下的指令, 基本上是複製 LucD 大的指令(http://communities.vmware.com/message/1506367), 再加上了刪除舊有的備份及使他可以吃參數來達到我要的目的.

# Clone VM
# Script is base on http://communities.vmware.com/message/1506367, LucD’s reply.
# Added args for mulitple use by mark

# Eat Params
$fromVMname = $args[0]
$newVMName =  $args[1]
$tgtEsxName = $args[2]
$tgtDatastoreName = $args[3]

# Load Powershell snapin from VMware
# ignore all errors
Add-PSSnapin VMware.VimAutomation.Core -ErrorAction SilentlyContinue

# Connect ESX/vCenter Server
connect-viserver {ip/name for esx/vcenter}

# remove cloned VM
Remove-vm -VM (get-vm $newVMName) -DeleteFromDisk -confirm:($false)

# Doing Clone
$cloneTask = New-VM -Name $newVMName -VM (Get-VM $fromVMname) -VMHost (Get-VMHost $tgtEsxName) -Datastore (Get-Datastore $tgtDatastoreName) -RunAsync

# If any error email back
Wait-Task -Task $cloneTask -ErrorAction SilentlyContinue
Get-Task | where {$_.Id -eq $cloneTask.Id} | %{
if($_.State -eq “Error”){
$event = Get-VIEvent -Start $_.FinishTime | where {$_.DestName -eq $newVMName} | select -First 1
$emailFrom = {Mail from}
$emailTo = {Mail to}
$subject = “Clone of ” + $newVMName + ” failed”
$body = $event.FullFormattedMessage
$smtpServer = {Mail Server}
$smtp = new-object Net.Mail.SmtpClient($smtpServer)
$smtp.Send($emailFrom, $emailTo, $subject, $body)
}
}

測試的時候
./clonevm.ps1 comp-name clone-comp-name esx-ip datastore 以四個參數來控制 Clone 的動作, 請利用剛剛打開的 PowerShell 視窗來測試該指令是否成功.

接下來就是在 Windows 內設並排程, 由 DOS 去呼叫 PowerShell 會比較麻煩, 這一段花了不少時間在 Try & Error, 最終才組合出正確的設定
powershell -command “& {c: clonevm.ps1 comp-name clone-comp-name esx-ip datastore }”

這樣 VMWare 就可以依照設定的時間來做排程, 備份同時也不會停機, 設定好 Esx-ip 或是 datastore 就可以直接把電腦複製到異地端去喔.

2 thoughts on “不花錢的VM自動備份

  1. 你好:

    我測試過
    Connect-viserver {ip/name for ESX/vCenter}
    Get-VM {Name of VM}

    都有正常回應.

    然後下面的程式也用小作家存成 clonevm.ps1

    但執行後就出現問題.
    請問我是哪邊出問題了??

    或是可以建議其他可以自動備份資料到網路硬碟上.
    我用過 VMX 但因為是免費版就沒辦法自動備份.
    希望有其他方便點的工具

    先謝了~

  2. 小良子,

    如果是第一次執行可以用 PowerShell 一行行來執行, 看看失敗在哪邊. 如果第一次執行失敗在
    Remove-vm -VM (get-vm $newVMName) -DeleteFromDisk -confirm:($false) , 這個很正常, 因為我會去刪除先前的備份, 再重新 clone.

    可以吧 錯誤訊息 Post 上來嗎? 我用這個備份了好幾個月, 偶而會失敗但絕大部分的時間都很正常喔.

發表迴響