Oracle VirtualBox(Vbox)无法正常显示虚拟机界面的原因与解决方案
在前段时间的运营事故中,运行在千湖科学计算平台的Virtual Box(以下简称Vbox)子平台的虚拟机出现了无法打开虚拟电脑界面进行维护的问题,并最终间接地导致了千湖科学计算平台下属一台虚拟计算机的数据完全丢失。
同时,在众创千湖科学计算中心的其他计算机中也遇到了此类情况(ZihanEBC),最初我们将目光投向了VBox本身,并试图更换VBox的版本与在互联网中寻找解决方案,但最终无果。
为保证将来的服务与数据安全,本人对此次事故发生的原因进行了深入调查、分析,并最终撰写了本篇报告与临时解决方案。
故障现象打开“Oracle VM VirtualBox 管理器”界面后,选择需要操作的处于正常工作状态下的虚拟机,点击“显示”选项后无反应或卡顿若干秒后无实际反应(正常预期情况下应打开虚拟电脑界面,且可进行控制操作),无法正常打开虚拟电脑界面,但虚拟机实际运行正常,且其中所承载服务正常。
相关环境使用系统自带“任务计划程序”运行有关虚拟机启动操作的任务。(如系统启动时自动启动)且该任务属性中,“常规”-“安全选项”-“不管用户是否登录都要运行”与“使用最高权限运行”被选中。
故障原因由于安全原因,Windows系统会将用户界面与系统服务等运行在不同的Session中,当Session不同时,有关程序无法访问用户界面的Session。当选择“不管用户是否登录都要运行”选项后,程序实质上运行在系统服务级别的Session中,此时相关进程,包括子进程都无法被用户界面所访问,导致了故障现象的发生。(“Oracle VM VirtualBox 管理器”能打开是因为其与虚拟机本体进程并非属于同一进程,管理器使用的是VirtualBox.exe,而虚拟机运行在其他进程中,与VirtualBox.exe并无关联,具体原因见下)
技术性具体原因使用“任务计划程序”启动VBox中的虚拟机时,会使用到VBoxManage CLI,在启动过程中,CLI会执行有关虚拟机的启动流程,并创建VirtualBox Headless Frontend进程(VBoxHeadless.exe)与VirtualBox Interface进程(VBoxSDS.exe和VBoxSVC.exe),后者提供了VBox的许多用户界面(User Interface)的显示与渲染,由于CLI运行在系统服务级别的Session中,且后续所有子进程均启动在该Session层级,导致与用户界面相关联的功能无法正常显示在系统用户界面中,最终导致故障现象发生。
解决方案永久解决方案:该问题暂时没有解决方案,在找到其他方式更优雅的开机自启动相关子平台进程前,无法解决此问题。
临时解决方案:在系统启动后,将所有运行中的虚拟机关闭(使用“保存状态”选项关闭,可以保留当前虚拟机中的服务运行状态,最小化服务影响),并退出“Oracle VM VirtualBox 管理器”。随后将VBoxSDS.exe和VBoxSVC.exe两个进程手动终止,重新打开“Oracle VM VirtualBox 管理器”,并将所有需要的虚拟机无界面启动,即可在后续使用中正常访问相关用户界面。
上述操作会在保存状态关闭后到再次无界面启动期间导致相关虚拟机暂停服务,但通常不会影响其中所运行服务的连续性(有一定的风险)。
切记不要在未停止虚拟机时终止VBoxSDS.exe和VBoxSVC.exe两个进程,这将导致未停止的虚拟机失去控制(在“Oracle VM VirtualBox 管理器”中显示已关闭,但实际仍在运行,且无法通过无界面方式启动,如果强制通过正常启动方法启动相关虚拟机,则会导致原有虚拟机进程被强制结束(相当于断电)后重新开机,可能会导致有关虚拟机中运行的服务产生服务连续性中断问题。
友情链接