我最近将虚拟机从旧的 Win10 笔记本电脑转移到新的 Win11 笔记本电脑,遇到了非常烦人的问题:如果我关闭笔记本电脑,让它进入睡眠状态,并在一段时间后将其唤醒,我的客户虚拟机 (Rocky Linux 8) 会将其状态重置为登录屏幕(就像重新启动后一样)。在日志中,我看到会话已通过看门狗终止:(systemd-logind.service: Watchdog timeout (limit 3min)!
还有其他几个类似的)。
我在 VBox 日志中注意到一个可疑的事情,那就是当我的笔记本电脑进入睡眠状态时,它似乎并没有真正挂起。至少我没有找到相应的消息。但是,有一个与客户虚拟机日志中关于看门狗/崩溃的挂起事件同时发生:
<lots of similar events>
120:25:23.134650 TM: Giving up catch-up attempt at a 60 001 385 790 ns lag; new total: 168 754 705 406 043 ns
120:33:47.416772 TM: Giving up catch-up attempt at a 60 005 808 341 ns lag; new total: 168 814 711 214 384 ns
120:54:28.968325 TM: Giving up catch-up attempt at a 60 005 322 909 ns lag; new total: 168 874 716 537 293 ns
121:06:30.694374 VMMDev: vmmDevHeartbeatFlatlinedTimer: Guest seems to be unresponsive. Last heartbeat received 5 seconds ago
121:06:30.782830 VMMDev: GuestHeartBeat: Guest is alive (gone 5 212 364 421 ns)
127:35:15.487887 TM: Giving up catch-up attempt at a 23 374 472 159 396 ns lag; new total: 192 249 188 696 689 ns
127:35:15.487905 VMMDev: vmmDevHeartbeatFlatlinedTimer: Guest seems to be unresponsive. Last heartbeat received 23319 seconds ago
127:35:15.504476 TMR3UtcNow: nsNow=1 700 525 178 297 266 738 nsPrev=1 700 501 801 965 273 179 -> cNsDelta=23 376 331 993 559 (offLag=5 100 562 offVirtualSync=192 249 193 797 251 offVirtualSyncGivenUp=192 249 188 696 689, NowAgain=1 700 525 178 302 367 300)
127:35:15.505000 VMMDev: Guest Log: 00:06:17.742079 timesync vgsvcTimeSyncWorker: Radical host time change: 23 376 332 000 000ns (HostNow=1 700 525 178 297 000 000 ns HostLast=1 700 501 801 965 000 000 ns)
127:35:15.505035 VMMDev: Guest Log: 00:06:17.742589 timesync vgsvcTimeSyncWorker: Radical guest time change: 23 321 082 671 000ns (GuestNow=1 700 525 177 742 065 000 ns GuestLast=1 700 501 856 659 394 000 ns fSetTimeLastLoop=false)
127:35:15.656748 VMMDev: GuestHeartBeat: Guest is alive (gone 23 319 851 039 698 ns)
127:35:17.548800 Pausing VM execution, reason 'HostSuspend'
127:35:17.548841 Changing the VM state from 'RUNNING' to 'SUSPENDING'
127:35:17.555491 AIOMgr: Endpoint for file '***.vdi' (flags 000c0781) created successfully
127:35:17.561655 AIOMgr: Endpoint for file '***.vdi' (flags 000c0781) created successfully
127:35:17.563252 PDMR3Suspend: 14 370 022 ns run time
127:35:17.563261 Changing the VM state from 'SUSPENDING' to 'SUSPENDED'
127:35:17.563269 Console: Machine state changed to 'Paused'
我在 Windows 中生成了一份 sleepstudy 报告,报告显示 Windows 恰好在此时将其状态从睡眠状态更改为休眠状态。因此,看起来 VM 进入了睡眠状态但实际上并非如此,然后在 PC 从睡眠状态切换到休眠状态时被唤醒并死在看门狗定时器上(可能是因为在此期间它需要短暂唤醒),然后被正确暂停。
在启动睡眠之前手动暂停虚拟机似乎有效,但这真的很烦人(我可以尝试强制休眠而不是睡眠,但我宁愿避免这样做)。
有办法解决这个问题吗?是否可以在客户操作系统中禁用看门狗或让 VBox 正确检测睡眠(或让 Windows 在睡眠前自动暂停虚拟机)?
答案1
这似乎是 VirtualBox 检测睡眠状态时的一个错误(它错过了正确检测 Microsoft 推动的“现代待机”睡眠模式的钩子)。 https://www.virtualbox.org/ticket/21917
作为一种解决方法,我可以创建一个由现代待机事件触发的计划任务,该任务将自动暂停我的虚拟机。
为此,请转到事件,从 Kernel-Power 中找到事件 ID 为 506 的事件 - 这是 Windows 在启动现代待机之前发送的事件。现在使用“将任务附加到此事件”,并选择运行程序作为操作。操作应该是带参数运行Path\To\Oracle\VirtualBox\VBoxManage.exe
。controlvm "Your VM Name(s)" pause
不要忘记在任务属性(可通过任务计划程序访问)中选中“仅当计算机处于交流电源状态时才启动任务”(并可能设置无论是否登录都运行该任务的选项)。