Debian Wheezy - 在没有 GUI 的主机上运行带有 GUI 的 VM - 可能吗?

Debian Wheezy - 在没有 GUI 的主机上运行带有 GUI 的 VM - 可能吗?

有没有什么解决方案可以安装文本模式的 debian wheezy,其中我可以启动一个虚拟机,该虚拟机安装了 GUI,并将显示在其中一个屏幕上?

答案1

不,事实并非如此,但请注意,“文本模式 Debian”和“GUI Debian”之间的区别只存在于你的脑海中 ;-)

这个想法是通常你要么需要“服务器”,这通常意味着“文本模式”,要么需要“工作站”,这通常意味着一些桌面环境,如 GNOME 或 KDE 或 XFCE 等。这里的问题是虚拟包安装相应的“桌面”通常依赖于提供所谓显示管理器的一个或另一个软件包 — 显示管理器是一个在启动时启动的程序,它会生成一个 X 服务器(一个实际上提供 GUI 控制台的复杂软件),在其上运行登录管理器,一旦您成功登录,它就会负责为您设置会话。一旦您退出会话,显示管理器就会再次启动,因此您又回到了原点。

但无需安装显示管理器(或在启动时运行)。只需安装xorg包,您将获得一个可以手动运行的 X 服务器。

现在让我们讨论更核心的内容。

首先,您需要启动一个 X 服务器,然后您需要以一种知道如何联系生成的 X 服务器的方式运行您的 GUI 程序。

让我们暂时搁置启动 X 服务器实例的问题,讨论启用 X 的程序如何找到服务器。有多种方法可以做到这一点,但最常见的方法是查找名为“DISPLAY”的环境变量,该变量应该包含插座X 服务器的一个实例会监听客户端连接和所谓的显示号码。我不想在这里写太多:需要理解的关键一点是,一旦 X 服务器运行,想要使用它的程序通常必须看到适当设置的环境变量才能找到服务器。

这就是“X 会话”概念的出现之处:虽然您可以手动运行 X 服务器实例,但使用特殊程序为您执行此操作更简单,此外还可以在经过特殊处理的环境中运行程序或一组程序,以便它们能够找到已启动的服务器。

在手动启动 X 服务器及其附加会话的美好时光里,人们通常使用startx仍然受支持的脚本,并且是xinit包。它会生成一个 X 服务器,并运行指定的程序或执行~/.xinitrcshell 脚本。您明白了。

但现在使用具有自动登录功能的显示管理器可能更方便 — 这样,您在启动时就可以在指定的 VT 上拥有一个现成的 X 会话。使用nodm软件包。它自动启动 X 服务器,然后代表指定用户运行指定脚本。

无论哪种情况,只需确保您的 VM 作为 X 会话启动过程的一部分运行,或者让 VM 软件看到正确的DISPLAY环境变量。

2016-09-20 更新回答@LauriK的评论:

…不完全是。让我解释一下。在我的回答中,我解释了 X 客户端如何找到 X 服务器。在 X Windows 系统范例中,X 客户端(GUI 程序)不会自行绘制任何内容,而是通过套接字将绘制请求传送到它们所连接的 X 服务器实例。因此,您在本地计算机(即显示器上)上看到的图形屏幕(带有鼠标指针)是由本地运行的 X 服务器实例呈现给您的。

现在,通过套接字连接的 X 客户端和 X 服务器的一个有趣特性是,它们实际上可能在不同的计算机上运行 — 如果此套接字已联网(例如,由 TCP/IP 堆栈提供)。这是 X Window 系统的一个不太为人所知的特性,称为网络透明度。

X 的网络透明性的关键在于 X 服务器始终在本地机器(具有与其连接的显示器和输入设备的机器)上运行,而在其上绘图的 X 客户端可以在本地或任意数量的远程机器上运行。

这种模式自然而然地诞生了,因为它是在“大型机时代”发明的:基本上,在一个典型的企业/实验室/任何地方,都会有一台昂贵的、功能强大的大型机和几台功能较弱的工作站,这些工作站功能较弱,但配备了图形屏幕。在这样的设置中,工作站将在大型机上运行其 X 程序,而这些程序将在工作站上运行的 X 服务器上绘制。

为了使其更清楚,X 协议支持一组绘图原语(例如线条、矩形、用特定颜色填充区域等)。

NX 套件(nomachine.com提供)有点“逆转”了这种方法,使整个事情的工作方式非常像 Windows 或 VNC 的 RDP(终端服务器访问)协议。

在这个范例中,X 客户端和它们所通过的 X 服务器都位于远程机器(“服务器”)上,但 X 服务器不是在实际的硬件屏幕(例如显示器)上“绘制”,而是在 别的地方(稍后会详细介绍),这些信息被捕获并传送到远程连接的客户端。也就是说,整个“屏幕”数据被全部传输。从客户端,另一条信息流回服务器:来自客户端输入设备的数据,例如键盘按键和指点设备移动。

在这个范例中,整个“图形会话”都在服务器上运行,并在那里绘制,并且不断变化的“屏幕图片”会以非常有效的方式持续流式传输到连接的客户端。您可能会认为这就像服务器生成了无尽的 YouTube 视频,供您流式传输和观看。

如您所见,与原始的 X 网络透明模型相比,这种范例是相反的,因为 X 服务器也是远程运行的。

作为客户端,您通常会在由您用来创建和维护远程会话的专用软件呈现的单个窗口中“看到”整个远程图形会话。

这种方法的优点是它使得在会话中传输非图形信息变得更加容易——例如声音、共享打印机和其他设备等。

这个难题的最后一部分是如何将远程 X 服务器的数据传送到远程连接的客户端。

基本上,有两种方法可以实现这一目标:

  • 在服务器端运行的一个特殊软件会“钩住” X 服务器生成的绘图事件并对其进行处理:检测哪些屏幕区域已更新,以及如何更新,将更新组合成批次,可能“缩小”它们(降低颜色深度和/或分辨率)压缩它们并发送到客户端。

    这就是 VNC 服务器软件的工作原理。

    X 服务器可能会利用真实的硬件设备,也可能利用称为帧缓冲区。 后一种方法允许在“无头”机器(没有图形输出设备或只有文本控制台等基本设备)上为远程客户端运行任意数量的图形会话。

  • 服务器使用特殊的显示驱动程序,其工作方式与控制硬件设备(例如视频卡)的任何其他“真实”显示驱动程序一样,但该驱动程序只执行上述软件的功能 - 确保服务器的输出有效地传送到客户端。

据我所知,NX/nomachine(及其 F/OSS 类似物 X2Go)实现了后一种方法。

请注意,NX/X2Go 并不是唯一使用此范例的解决方案。流行的虚拟化堆栈 KVM 支持 SPICE 协议,以连接到其客户端的虚拟化图形屏幕。Windows 驱动程序实现了特殊的 QXL 协议,使其图形输出能够使用 SPICE(以及 VNC)高效地传送到客户端。

还要注意,使用此范例也可以“导出”远程运行的单个应用程序。我在解释中省略了这种可能性,以免信息量太大。例如,看看xpra

最后,请注意,*nix 图形中正在进行的“改变游戏规则”的技术——Wayland 项目——实际上只支持这种类似 NX 的方法来处理远程图形程序。当它接管时,“X-way”网络透明度将成为过去。;-)

希望这可以帮助。

相关内容