Hyper-V虛擬機自動添加檢查點和導出備份

  • 2019 年 12 月 5 日
  • 筆記

背景說明

筆者使用Hyper-V在內部搭建了大量的環境和系統,比如:

  1. k8s內部集群
  2. Azure Devops Server(TFS==>VSTS==>Azure Devops Server)
  3. SharePoint

大部分基本上都是用於內部研究、測試等場景,但是為了避免很多麻煩,必要的備份還是必須的。

虛擬化的最大優勢之一是能夠輕鬆地保存虛擬機的狀態。如果各個系統或環境都需要獨立備份,這是一個很大的工作量,先不說全量備份和差異備份的方式,單單就各自的備份處理實現就是一個很麻煩的事情。而基於虛擬機,我們僅需通過檢查點保存虛擬機的狀態即可。

檢查點類型

Windows 10 Hyper-V 包括兩種類型的檢查點:

  • 標準檢查點: 在啟動檢查點時拍攝虛擬機和虛擬機記憶體狀態的快照。 快照並非完整備份,並可能導致系統在 Active Directory 等不同節點之間複製數據時出現數據一致性問題。 Hyper-V 只提供 Windows 10 之前的標準檢查點(以前稱為快照)。
  • 生產檢查點: 在 Linux 虛擬機上使用卷影複製服務或文件系統凍結來創建虛擬機的數據一致性備份。 沒有獲取任何虛擬機記憶體狀態的快照。

檢查點的類型可以通過介面操作來完成,也可以通過以下命令:

Set-VM -Name <vmname> -CheckpointType Production  Set-VM -Name <vmname> -CheckpointType Standard

使用命令管理檢查點

Hyper-V支援通過命令來添加檢查點。主要命令如下所示:

Checkpoint-VM -Name <VMName>

比如我們的虛擬機名稱為「TFS」,我們就可以使用以下命令來進行添加檢查點:

Checkpoint-VM -Name TFS

如何查看已創建的檢查點呢?可以使用以下命令:

Get-VMCheckpoint -VMName <VMName>

關於檢查點的其他命令還有:

  • 還原檢查點:
Restore-VMCheckpoint -Name <checkpoint name> -VMName <VMName> -Confirm:$false
  • 重命名檢查點
Rename-VMCheckpoint -VMName <virtual machine name> -Name <checkpoint name> -NewName <new checkpoint name>
  • 刪除檢查點
Remove-VMCheckpoint -VMName <virtual machine name> -Name <checkpoint name>
  • 導出檢查點
Export-VMCheckpoint -VMName <virtual machine name> -Name <checkpoint name> -Path <path for export>

更多命令見:

get-command -module hyper-v

編寫備份腳本

熟悉了以上命令,我們可以編寫備份腳本如下所示:

# 備份路徑(備份路徑不要和虛擬機位置在一個盤)  $exportPath = "E:虛擬機備份"  # 需要備份的虛擬機列表  $vmNames = "TFS", "SharePoint"    $vmNames | ForEach-Object -Process {      Write-Host "準備備份 $_"      # 設置備份路徑      $path = [System.IO.Path]::Combine($exportPath, $_, [System.DateTime]::Now.ToString("yyyy-MM-dd"))      [System.IO.Directory]::CreateDirectory($path)        if ([System.IO.Directory]::GetDirectories($path).Length -eq 0) {          Write-Host "備份路徑 $path"            Write-Host "正在創建檢查點 $_"          # 創建檢查點          Checkpoint-VM -Name $_          $checkPoint = Get-VMCheckpoint -VMName $_ | Select-Object -Last 1            Write-Host "正在導出檢查點 $_"          # 導出檢查點到備份路徑          Export-VMCheckpoint -VMName $_ -Name $checkPoint.Name -Path $path            Write-Host "備份已完成 $_"      }else {          Write-Host "備份已存在 $_"      }  }

接下來就可以添加到Windows的計劃任務裡面,使用管理員許可權執行即可。不過,其實這僅僅是開始,通常情況下,我們還需考慮日誌記錄等等。