因为一些缘故, 有一座 Hyper-V 丛集跑 DataCenter, 上面会跑好几十台 VM
但是因为授权的关系, 不能用 Replica 到别台机器上
微软说, Hyper-V Manager 里面有多少台 VM 就要计算多少授权
但是每个 VM 的 vhd 都又肥又大, 不能 Replica 的话每天晚上光 Export 就饱了
所以花了点时间研究写出了两个 PowerShell 程式利用 CheckPoint 来做差异化备份
请大家参考~
有需要尽管拿去用, 有 Bug 欢迎告诉我
Hyper-V VM Backup 方式, Replica 的替代方案 (自行撰写 PowerShell 程式)
长网址
http://blog.dino9021.com/2014/09/hyper-v-vm-backup-replica-powershell.html
短网址
http://goo.gl/lUqCNZ
环境:
1. 唯一一台 Hyper-V, 无法做复写或丛集
2. 只有一座 Hyper-V 丛集, 没有其他 Hyper-V 主机
描述:
上述状况都无法进行 Hyper-V 复写来作为备份策略
如果用 Export-VM 的话, 若 VM 的 vhd 很大则会占用大量 Disk I/O
解决方式:
自行撰写 PowerShell 程式, 利用 CheckPoint 功能土砲差异化备份
(与 Replica 雷同)
默认条件:
VM 本身除了备份 Powershell 所建立的 CheckPoint 外不可以有其他 CheckPoint
注: Production 环境的 VM 本来就不该有 CheckPoint, 会影响运作效率
程式运作逻辑:
1. 建立 CheckPoint 使 VM 原始 vhd 停止写入,
新的变更都会写在 CheckPoint 所建立的差异磁盘 avhd
且该 CheckPoint 会将当时的内存写入成档案, 等于 VM Pause
2. 将上述 CheckPoint 资料复制出来作为备份,
未来就还原该 CheckPoint, 达到备份还原目的
可达到的目标:
1. 可进行 VM 线上差异化备份, 不用每次备份都 Export, 占用大量 I/O
2. 可以在允许 Down Time 较久的前提下手动做不停机 Migration
与 Export 后再 Import 是一样的道理, 只是使用的是差异化磁盘
历史:
2014.09.24 加入备份档案检查机制
程式运作流程:
初始化:
1. 检查 VM 任何 CheckPoint, 没有就可以进行初始备份
2. Copy VM 的 xml 档
3. 建立 CheckPoint (停止写入原始 vhd 档)
4. 复制 VM 原始 vhd 档
5. 产生 CheckPoint 版本检查档
(纯文字放在备份路径中, 用以日后判断差异磁盘版本)
6. 等待下次备份
备份:
1. 检查是否只有一个 CheckPoint
2. 检查该版本是否与 CheckPoint 版本检查档中的纪录相同,
相同就可以进行备份
3. Copy VM 的 xml 档
4. 建立 CheckPoint (停止写入前一次 CheckPoint Snapshot 中的 vhd 档)
5. 复制前一次 CheckPoint 的 差异磁盘 avhd
6. 复制前一次 CheckPoint 的 Snapshot (xml + bin / vsv)
7. 产生 CheckPoint 版本检查档
(纯文字放在备份路径中, 用以日后判断差异磁盘版本)
8. 删除前一次 CheckPoint
(使 Hyper-V 自动合并, 避免积存太多 CheckPoint 影响效能)
9. 检查备份数量, 如果超过所设定的备份数量,
就从最旧的版本开始进行 vhd 合并
10. 建立备份历史档, 记载备份档案清单、档案大小、最后修改日期
11. 等待下次备份
还原:
1. 列出备份资料夹中现有 CheckPoint 版本供选择
2. 将原始 vhd 档复制到 Merge 资料夹中
3. 从最旧的 CheckPoint 版本开始,
至所选择 CheckPoint 版本的 "前一个版本" 为止
将每一个版本所备份的差异化磁盘 avhd 档复制到 Merge 资料夹中
4. 将上述 avhd 与原始 vhd 依照版本顺序 Merge
5. 将所选择 CheckPoint 版本的差异化磁盘 avhd 档
复制到 Merge 资料夹中 (不可以 Merge)
6. 将所选择 CheckPoint 版本的 VM xml 复制到 Merge 资料夹中
7. 将所选择 CheckPoint 版本的 Snapshot复制到 Merge 资料夹中
8. 完成, 至 Hyper-V 中 Import 上述 Merge 资料夹
9. Import 以右键点选 CheckPoint 并选择 Apply 后再开机
10. 将该 CheckPoint 删除,
此时会发现 CheckPoint 仍然存在且再次删除时会发生错误
11. 手动至该还原 VM 的资料夹中将 Snapshot 资料夹中的档案全部删除
12. 重新整理后已没有任何存在的检查点,
并且 VM 正以所选择的 CheckPoint 版本运作中
13. 重建备份历史档, 重新计算原始 vhd 档案大小、最后修改日期,
删除已合并的 CheckPoint 历史资料
14. 继续使用 VM, 并重新进行 Backup 策略
程式共两支:
Hyper-V VM Backup.ps1
1. 用来进行备份, 需要带入 4 个参数:
-VM [VM名称]
-Path [备份目标路径]
-RV [备份保留版本数, 数字, 未输入则默认为 10]
-CI [CheckPoint 检查名称, 如有空格前后要加引号,
未输入默认为 'Backup Circle By Dino9021']
2. 用排程执行就好了, 目前没有撰写背景等待执行的功能
Hyper-V VM Restore.ps1
1. 用来还原, 需要带入 2 个参数:
-Path [备份所在路径, 未输入的话程式执行时会要求输入]
-CI [CheckPoint 检查名称, 如有空格前后要加引号,
未输入默认为 'Backup Circle By Dino9021']
已知问题:
1. 还原后移除 CheckPoint 要按重新整理才会从 CheckPoint 列表中清除
(应该算 Hyper-V Bug?)
2. 除了本程式建立的 CheckPoint 之外不可以有其他的 CheckPoint
要想办法写出备份所有的 CheckPoint 也不是不行, 但是很麻烦
Production 环境的 VM 本来就不该有一堆 CheckPoint
所以目前并不打算进行这方面的研究