VMware 建议不要使用 Apple 的 Time Machine 备份虚拟机 (VM),除非使用快照。但是,许多有经验的高级用户强烈反对使用快照,因为每个快照都链接在前一个快照上,这意味着任何链接的故障都可能导致您的虚拟机失败,并增加虚拟机的复杂性并降低其性能.
因此,我正在尝试编写一个 AppleScript 来关闭所有正在运行的 VM,然后复制备份。那应该是干净和简单的。
但是,我在挂起的 VM 上遇到了一些问题(因此 Boot Camp VM 不是问题,因为它们无法挂起)。如果虚拟机被挂起,那么您需要将其关闭(关闭)才能干净地备份它。关闭挂起的 VM 的唯一方法是先恢复它,然后再关闭它。如果虚拟机在自己的窗口中打开,这对 AppleScript 来说不是问题。VMWare Fusion 正确地将此 VM 报告为已挂起,从而允许脚本首先将其恢复,然后将其关闭。
不幸的是,如果 VM 窗口已关闭,因此它没有自己的窗口,而仅出现在虚拟机库中,则 VMware Fusion 不会正确地将 VM 报告为已挂起。即使 VM 已挂起,VMware Fusion 也会将该状态报告为“已关闭”,这意味着将备份已挂起的 VM。
您可以在此处找到更多详细信息:
http://communities.vmware.com/message/2227680#2227680
这是我的代码。非常欢迎您提供反馈、建议和改进!
(* Applescript 应用程序在系统空闲一段时间后自动备份虚拟机 要求: [ ] 必须在 VMWare Fusion 的“首选项...”->“常规”->“关闭虚拟机时:”中选择“关闭虚拟机”——这是必需的,因为如果关闭虚拟机窗口,VMware 会报告虚拟机的电源状态为“关闭”,即使虚拟机实际上是“挂起”;并且从文档对象无法访问其窗口 [ ] 在“系统偏好设置...”->“节能”->“电源适配器”->“计算机睡眠”中必须设置为大于 backup_after + ( check_every * 2 ) 的值 http://culturedcode.com/forums/read.php?7,30174,30597 要使其可运行,请另存为应用程序。 要在 Dock 中不显示,请在已创建应用程序包的 Info.plist 中设置 LSBackgroundOnly,或在 http://groups.google.com/group/macenterprise/browse_thread/thread/be7db35451e1dc70 *) 属性 afterHours : 8 --23 -- 一天中开始监控空闲的小时 属性 workDayStarts : 5 -- 一天中停止监控空闲的小时 属性 backupDuration : 2 -- 备份虚拟机所需的小时数 global backup_after, check_every -- TODO:这些真的需要全局吗? 将 backup_after 设置为 10 --(40 * 60) -- 以秒为单位 将 check_every 设置为 5 --(10 * 60) 属性 cancelTimer : 60 -- 用户必须取消备份的秒数 属性虚拟化应用程序:“VMware Fusion”——变量不能在“告诉应用程序”语句中使用或无法编译,因此搜索并替换“VMware Fusion”的其他实例 属性 resumeDelay : 120 --(4 * 60) -- 以秒为单位;通常需要 backup_after 然后 -- 测试看看今天是否已经完成备份 如果我的 hasNotBackedUpToday(backupLocation) 那么 -- 警告用户虚拟机应用程序将强制关闭虚拟机 重复 secondsLeft 从 cancelTimer 到 1 by -1 设置 dialogResult 以显示警报 virtualizationApp &" is about to force quit and backup virtual machines" message "This AppleScript is set to force close" & virtualizationApp & ",如果它是打开的,它的虚拟机,然后备份虚拟机机器。” & return & return & "单击\"取消\"将这些操作延迟到以后,或按\"确定\"退出并备份。" & return & return & secondsLeft & "还剩几秒"。按钮 {"OK", "Cancel"} 默认按钮 "OK" 作为警告放弃 1 如果 secondsLeft = 1 或(dialogResult 返回的按钮)为“OK”,则 -- 强制虚拟机关机,退出虚拟机应用 我的 powerOffVMsQuitFusion() -- 备份虚拟机 如果我的 backupVMs(backupLocation, virtualMachinesLocation) 那么 显示对话框“成功备份虚拟机”。 别的 显示对话框“无法备份虚拟机”。 万一 退出重复 else if (dialogResult 返回的按钮) 是 "Cancel" then 显示对话框“备份延迟到以后”。 退出重复 万一 结束重复 别的 return (8 * 60 * 60) -- 今天已备份,请在 8 小时后重试 万一 万一 返回 check_every 万一 结束告诉 结束空闲 (* * 检查过去 16 小时内是否有备份 *) on hasNotBackedUpToday(theLocation) 告诉应用程序“Finder” 将 bLocation 设置为 POSIX 文件 theLocation 作为别名 按创建日期排序(获取 bLocation 的文件夹) 将 myResult 设置为结果 将 myResultCount 设置为 myResult 的计数 -- 如果文件夹不包含任何文件,则会引发错误 如果 (myResultCount 不等于 0) 那么 将文件设置为(myResult 的第 1 项) 如果文件的创建日期大于 ((current date) - (16 * 60 * 60)) 那么 --display dialog "今天已备份。" 返回假 万一 万一 -- 如果已达到最大值,则删除备份 如果 myResultCount ≥ numBackupsToKeep 则 删除 myResult 的 myResultCount 项 万一 将 currDate 设置为当前日期 将文件夹名称设置为 ("" & (currDate 年份) & "-" & (currDate 月份) & "-" & (currDate 日期)) 使用属性 {name:folderName} 在 bLocation 创建新文件夹 返回真 结束告诉 结束 hasNotBackedUpToday (* * 强制虚拟机关机,退出虚拟机应用 *) on powerOffVMsQuitFusion() 告诉应用程序“VMware Fusion” activate -- 除非 VMware 正在运行,否则无法测试 VM 是否已挂起 delay 10 -- 给应用程序打开的时间 在文档中使用 currVM 重复 将 powerState 设置为 currVM 的电源状态 -- 关机对挂起的虚拟机不起作用 如果 powerState 已挂起,则 VM 报告已关闭,即使实际上已挂起,如果 VM 自己的窗口打开,则正确报告(VM 库,右键单击 VM,然后选择“显示 Windows”) --display dialog "VM" & (name of currVM) & "issuspended" resume currVM -- 仅在实际挂起时才想恢复,否则它会启动关闭的 VM delay resumeDelay -- 给 VM 时间恢复 万一 如果 powerState 已开启,则 --显示对话框“名称:” &(currVM 的名称) --显示对话框“名称:” &(currVM 的操作系统名称) -- XP 未保存的文档可防止断电,除非强制,Win7 无需强制即可工作 尝试 (*如果 (currVM 的操作系统名称) 包含 "7" then --display dialog "Win 7: will power off without out force" 关闭currVM 延迟 powerOffDelay 别的*) --显示对话框“非 Win 7(XP 等):会强制关机” 强制关闭 currVM - 万一 错误 errMsg 编号 errNum 告诉应用程序“Finder” 显示对话框 ("errMsg: " & errMsg & ", errNum: " & errNum) 结束告诉 结束尝试 万一 结束重复 退出 延迟 5 结束告诉 结束 powerOffVMsQuitFusion (* * 备份虚拟机,必要时删除最旧的备份 *) 在备份虚拟机上(此位置,此虚拟机位置) 告诉应用程序“Finder” 将 thisBackupLocation 设置为 POSIX 文件 thisLocation 作为别名 按创建日期排序(获取 thisBackupLocation 的文件夹) 将 myFinderResult 设置为结果 -- 如果文件夹不包含任何文件,则会引发错误 如果 ((myFinderResult 的计数) = 0) 那么 显示对话框“错误。刚刚创建的文件夹发生了什么?” 返回假 别的 将 backupFolder 设置为(myFinderResult 的第 1 项) --display dialog "Folder name: " & (name of backupFolder) -- 检查文件夹是否为空 if ((count files of backupFolder) 不等于 0) 那么 显示对话框“错误。备份文件夹不为空。” 返回假 万一 -- 复制虚拟机到备份文件夹 --将 vmsLocation 设置为别名“Macintosh HD:Users:mikeong:Documents:Virtual Machines” 将 vmsLocation 设置为 thisVMsLocation 的别名 将 vmsLocation 的每个文件复制到 backupFolder 返回真 万一 结束告诉 结束备份虚拟机