背景说明
笔者使用Hyper-V在内部搭建了大量的环境和系统,比如:
- k8s内部集群
- Azure Devops Server(TFS==>VSTS==>Azure Devops Server)
- SharePoint
- …
大部分基本上都是用于内部研究、测试等场景,但是为了避免很多麻烦,必要的备份还是必须的。
虚拟化的最大优势之一是能够轻松地保存虚拟机的状态。如果各个系统或环境都需要独立备份,这是一个很大的工作量,先不说全量备份和差异备份的方式,单单就各自的备份处理实现就是一个很麻烦的事情。而基于虚拟机,我们仅需通过检查点保存虚拟机的状态即可。
检查点类型
Windows 10 Hyper-V 包括两种类型的检查点:
- 标准检查点: 在启动检查点时拍摄虚拟机和虚拟机内存状态的快照。 快照并非完整备份,并可能导致系统在 Active Directory 等不同节点之间复制数据时出现数据一致性问题。 Hyper-V 只提供 Windows 10 之前的标准检查点(以前称为快照)。
- 生产检查点: 在 Linux 虚拟机上使用卷影复制服务或文件系统冻结来创建虚拟机的数据一致性备份。 没有获取任何虚拟机内存状态的快照。
检查点的类型可以通过界面操作来完成,也可以通过以下命令:
代码语言:javascript复制Set-VM -Name <vmname> -CheckpointType Production
Set-VM -Name <vmname> -CheckpointType Standard
使用命令管理检查点
Hyper-V支持通过命令来添加检查点。主要命令如下所示:
代码语言:javascript复制Checkpoint-VM -Name <VMName>
比如我们的虚拟机名称为“TFS”,我们就可以使用以下命令来进行添加检查点:
代码语言:javascript复制Checkpoint-VM -Name TFS
如何查看已创建的检查点呢?可以使用以下命令:
代码语言:javascript复制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>
更多命令见:
代码语言:javascript复制get-command -module hyper-v
编写备份脚本
熟悉了以上命令,我们可以编写备份脚本如下所示:
代码语言:javascript复制# 备份路径(备份路径不要和虚拟机位置在一个盘)
$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的计划任务里面,使用管理员权限执行即可。不过,其实这仅仅是开始,通常情况下,我们还需考虑日志记录等等。