所以,我正在尝试解决一个相当奇怪的问题。我对虚拟化还很陌生(我管理的最多的是使用 Docker 和 VirtualBox 隔离一些应用程序,这并不难)。我更想知道 X 显示服务器是如何工作的,而不是真正寻求虚拟化方面的帮助,不过我会很感激。
我正在尝试设置一台使用由不同虚拟化系统提供的 X 显示服务器的主机。我将让主机虚拟化两个 Linux 系统。
第一个 Linux 系统计划托管一个 X 显示服务器。现在,这个应该最终相当简单,但我正在寻找比“这有效”更深入的解决方案。然而,我确实意识到了其他问题。我打算在这个虚拟化系统上运行稍微图形密集的应用程序。视频卡应该专用于哪台机器?
第二个系统不会有那么特别,但有一个相当奇怪的网络冲突(不是错误;这是我必须设置的方式)。不会有 X 服务器或其他任何东西。
我的最终问题是:我需要利用实际的硬件来实现两种情况,只是 X 服务器 (虚拟化系统) 的“主机”,还是只是 X 服务器 (主机) 的“客户端”?我还想问一下如何才能实现这一点,尽管这有点超出了问题的范围。
答案1
总结一下我对您的情况的理解:您需要在虚拟化客户机系统中播放高清视频,该客户机系统充当位于另一个虚拟化客户机中的 X 服务器的客户端。
您的问题主要是您应该将 GPU 专用于哪个客户机,以便尽可能降低 CPU 负载,并总体了解显示器的实际工作方式。
最有可能的是,GPU 必须由运行 X Server 的客户机处理。我确实不明白客户端如何能够在不了解服务器端处理的包含窗口的情况下直接将视频帧发送到显卡。
为方便参考,您可能还想考虑使用Linux 帧缓冲区它可以让您直接从命令提示符播放视频,而无需 X。
为了理解它是如何工作的,这里的诀窍是在 X 环境中播放视频的方法不止一种,而且根据您平台的详细信息,有些方法可能更快,有些方法可能会显示某些视频文件故障,有些方法可能根本不起作用。
我建议你使用VLC 媒体播放器继续进行测试。它在大多数 Linux 发行版存储库中可用,并允许您手动选择要使用哪种方式显示视频(从菜单中,进入工具>优先>视频,然后在输出下拉小部件)。
无论使用哪种方式,它总是会在 X 客户端(视频播放器)和 X 服务器之间产生大量流量,因此如果两个虚拟客户端都在同一台主机上运行,您很可能希望确保它们的交换中没有加密。换句话说,您很可能不使用 SSH 隧道,而更喜欢使用老式的 X 显示重定向:
在服务器主机上,确保 X 服务器监听外部接口(确切的配置步骤取决于发行版,如果手动修改文件,请确保它不会被某些自动配置覆盖,您可能还需要调整防火墙规则),并使用主机命令:
$ xhost +<XCLIENT_IP>
在客户端主机上,
$DISPLAY
启动 VLC 之前导出变量:$ export DISPLAY=<XSERVER_IP>:0.0 $ vlc
某些输出模式会让 VLC 通过 X 堆栈,而其他一些输出模式会让 VLC 绕过它并通过一些库直接联系底层视频硬件。 在您的情形下,只有前者会起作用。 尝试使用错误的输出类型会导致 VLC 不显示视频(同时仍在播放声音)或在打开文件时崩溃。
因此最佳候选人将是视频(专用于视频播放的 X 扩展,它取代了较旧但仍可用的X11输出),GLX和OpenGL(两者都使 VLC 依赖于连接 OpenGL 和 X 显示系统的 API)。