2

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

            返回真
        万一
    结束告诉
结束备份虚拟机

4

1 回答 1

0

您可能希望查看以下脚本:http ://www.lbackup.org/developer/vmware_fusion_virtual_machine_backup

我怀疑有一些细微的变化,它会关闭虚拟机而不是暂停虚拟机。

于 2013-04-18T02:15:10.880 回答