如何远程运行 X11 应用程序?

jpa*_*ugh 7 xorg x11-forwarding xephyr

鉴于以下目标,我如何运行托管在远程服务器上的 X11 应用程序:

  • 运行任何会在服务器上本地运行的东西。这包括使用GLX.
  • 与本地桌面无缝集成,即应用程序看起来像是在本地运行,没有单独的桌面区域。因此,我需要一个 X11 解决方案,而不是一个包装协议。
  • 如果我断开连接,最好允许应用程序继续运行;然后,我可以稍后在重新连接时重新打开正在运行的应用程序。

我已经看到很多关于超级用户的建议,但其中大部分是部分修复或只是很糟糕。

  • 普通的 sshX11-Forwarding已过时:它无法运行某些应用程序,尤其是那些依赖 GLX 扩展的应用程序。
  • 设置 LIBGL_ALWAYS_INDIRECT=1对我不起作用。
  • Xephyr也出来了。它目前不支持 GLX,尽管我在开发树中看到了一些 GLX 工作。也许在未来,那将是最干净的方式。
  • xmove也出来了。太老了,无法进一步考虑。
  • VNC 出来了。它转发整个桌面,无法理解X协议。

编辑:我花了一个周末来提出几个建议,xpra这是最好的。我已经在下面的答案中描述了我的设置,希望对其他人有所帮助。

jpa*_*ugh 12

Xpra(如这里提到的)做我想要的。它允许运行任意 X 应用程序,这些应用程序可以转发到多个客户端,无论是在同一台计算机上,还是在另一台机器上。它也支持运行 OpenGL 应用程序,并允许您的应用程序在最后一个客户端断开连接后继续运行——让您有机会稍后重新连接。

xpra分为两部分:客户端和服务器。要启动服务器,请在远程机器上运行以下命令:

$ xpra start :100
Run Code Online (Sandbox Code Playgroud)

这会xpra在新的 X 显示器上启动。(有一个与代理一起使用的解决方法。)

要让应用程序由 控制xpra,请在与xpra服务器相同的显示器上运行它,如下所示:

$ export DISPLAY=:100
$ firefox&
$ blender&
...
Run Code Online (Sandbox Code Playgroud)

这一切都可以通过 ssh 连接(有或没有 X11-Forwarding)来完成,没有问题。

要启动客户端,请执行以下操作之一:

$ ssh -X user@remotehost
<gain remote connection>
$ xpra attach :100
Run Code Online (Sandbox Code Playgroud)

或者

$ xpra attach ssh:user@remotehost:100
Run Code Online (Sandbox Code Playgroud)

请注意,后者需要xpra在您的本地机器上安装客户端;前者没有。

xpra客户端将放一个图标,窗口管理器的任务栏/面板使您能够断开客户机。(或者,您可以直接杀死它,只要您小心不要杀死服务器。)只要xpra服务器仍在运行,您就可以稍后重新连接。如果您xpra在主机上运行单个服务器,您也可以简单地省略显示编号,并xpra attach会计算出来。

一个非常好的功能xpra是它允许您在预先存在的显示器上启动服务器。这允许您在xpra服务器崩溃时恢复会话(只要该显示器上的 X 服务器仍在运行)。为此,请运行

$ xpra start --use-display :100
Run Code Online (Sandbox Code Playgroud)

注意事项:

  • xpra作为窗口管理器运行。虽然它在嵌入其他窗口管理器时表现得很好,但它在 X 应用程序本身中表现不佳:它不允许,例如rxvt-unicode删除其标题栏;它也不会告诉窗口他们有多少空间可以在屏幕上工作,例如,下拉框和菜单从屏幕上掉下来。但是,我认为后一个问题是修复我的配置的问题。

  • 键被重复。频繁地。这可以通过使用来解决xpra attach --no-keyboard-sync,但手册页警告说这在某些游戏中效果不佳。我一直在祈祷,我发现自己并不渴望使用其中一款游戏。

由于这些原因,Xephyr很可能是更好的解决方案(一旦它支持 GLX),因为它作为 X 服务器运行,而不是窗口管理器。但是,我还没有调查它是否支持恢复以前断开连接的会话。

  • 不错的,谢谢 我还必须在服务器上添加一个 arg,使其成为 `xpra start :100 --start-via-proxy=no` - 错误是 `Warning: cannot use the system proxy for 'start' subcommand, failed to connect to '/run/xpra/system': [Errno 2] 没有那个文件或目录`。 (2认同)