请随时将文档补丁发送至 vbox-dev 邮件列表。
主机-访客动态屏幕调整的机制
在正常使用中,当安装了标准图形用户界面和增强功能后,每当主机窗口调整大小时,VirtualBox 都会调整访客桌面以匹配。本文档描述了该机制应该如何工作——以及通常是如何工作的。它还指出了可能潜在失败的棘手部分。
访客视频设备
VirtualBox 虚拟机包含一个模拟显卡,目前最多可支持 64 个显示器输出(实际数量由用户在启动机器前设置)。每个输出都可以设置为配置的视频内存大小所支持的任何分辨率(可能会使用重叠的视频内存区域)。通常它将由增强功能视频驱动程序或 Linux VMSVGA 驱动程序控制,但它也可以由 VGA 驱动程序或使用 VESA BIOS 控制,后者只能设置显卡可处理的有限分辨率集,并且仅限于第一个屏幕。当访客在给定显示器输出上设置新分辨率时,用户界面会调整匹配窗口的大小以适应。这种情况只在每次分辨率更改时发生一次。如果它似乎在重复,访客可能陷入了设置和重置分辨率的循环中。
由主机触发的屏幕调整
虚拟机通常显示在主机计算机的窗口中,因此如果可以告知访客操作系统调整其显示以很好地适应窗口,那将很方便。这是通过模拟具有主机窗口大小的首选分辨率的显示器,并在主机窗口调整大小时模拟显示器重新插拔来实现的。目前访客读取显示器大小有两种方式,具体取决于其驱动程序和辅助设置。VBox(S)VGA 设备直接向访客提供信息,而当 VMSVGA 设备在使用时,辅助程序必须从所谓的 VMM(虚拟机监视器)设备读取显示器信息并告知驱动程序。无法保证访客会实际使用首选大小,但它通常会这样做。
在 Linux 访客中,VBox(S)VGA 驱动程序每次大小更改时都会生成一个随机的显示器序列号,因为这些访客通过序列号记住显示器,如果连接了它们以前见过的显示器,可能会设置不同的分辨率。(在物理计算机上当然有很好的理由这样做,但我们不希望在我们的虚拟机中出现这种情况。)序列号技巧不适用于 VMSVGA,这可能导致屏幕调整失败。删除访客中的文件 ~/config/Monitors.xml 有所帮助。另一个已知问题是,在没有内核图形驱动程序的老式 Linux 访客上,我们发送 ACPI 显示器更改通知,少数老式访客会将其解释为在屏幕调整已发生后循环到下一个可用分辨率的请求。目前已知没有现代 Linux 系统受到影响,并且自访客中的 X.Org Server 1.19 起,我们要求使用内核驱动程序。
旧版驱动程序,包括 BIOS 和 EFI 中的驱动程序,无法读取首选大小。这应该是可以修复的,但目前还没有人找到时间来做。一旦访客加载了更强大的驱动程序,它就会读取主机请求的最后一个首选大小并进行调整(这目前与 Windows 驱动程序预期的不符,但应该很快会修复)。
增强功能组件
Windows 访客
- VBoxVideo:加载到内核中的主要图形驱动程序。它可以告知访客当前支持多少个屏幕(即屏幕连接器),并可以启用和禁用它们以及设置它们的分辨率。它将此信息报告给访客上的 Windows。它本身无法从主机接收有关屏幕更改(模式提示、显示器拔出或热插拔)的信息,但它提供了一个接口供用户空间工具提供该信息。它会记住在 Windows 注册表中收到的信息,并在加载时简单地假定自上次使用以来配置没有更改。
- VBoxTray:一个用户空间守护程序,当用户登录访客上的 Windows 时加载并作为该会话的一部分运行。它可以从主机接收屏幕更改信息并将其转发给 VBoxVideo。它还处理无缝模式和其他不相关的访客功能。
X.Org/Wayland 访客
- vboxvideo.ko:加载到内核中的主要图形驱动程序,目前仅限于 Linux(3.11 及更高版本)。已知它受 X.Org Server 1.17 及更高版本以及至少从 Fedora 25 开始的 GNOME Shell/Wayland 支持。它本身可以从主机接收有关屏幕更改(模式提示、显示器拔出或热插拔)的信息,尽管它依赖于用户空间来处理。所有近期一半的 GNOME Shell 版本(X.Org 和 Wayland)、Ubuntu Unity 版本和 KDE 版本都支持此功能。
- VBoxClient:一个用户空间守护程序,当用户登录访客上的 X.Org 时加载。它由桌面环境加载,并适用于大多数已知桌面环境。对于无法自行处理屏幕更改的桌面环境,它会代为处理(它会等待两秒钟再响应更改,以给环境一个自行响应的机会,而不是试图猜测哪些可以哪些不可以)。当然,它无法在登录之前执行此操作。它还处理无缝模式和其他不相关的访客功能。
- vboxvideo_drv.so:主要的图形驱动程序,但它是一个在用户空间中运行在 X.Org/XFree86 内部的不同版本。它不能与 vboxvideo.ko 共存,但大致执行相同的工作。它支持到 X.Org Server 1.18。因此,X.Org 1.19 及更高版本不能与 Linux 3.10 及更早版本一起使用,除非使用备用图形。这预计不会成为问题。