鉴于以下目标,如何运行托管在远程服务器上的 X11 应用程序:
- 跑步任何事物可在服务器上本地运行。这包括使用 的 OpenGL 应用
GLX
。 - 与本地桌面无缝集成,即应用程序看起来像是在本地运行,没有单独的桌面区域。因此,我需要 X11 解决方案,而不是包装器协议。
- 最好允许应用程序在断开连接时继续运行;然后,我可以稍后在重新连接时重新打开正在运行的应用程序。
我在超级用户那里看到过很多建议,但其中大部分只是部分修复或完全不好。
- 普通 ssh
X11-Forwarding
已出局:它无法运行某些应用程序,尤其是那些依赖于 GLX 扩展的应用程序。 - 环境
LIBGL_ALWAYS_INDIRECT=1
对我不起作用。 Xephyr
也出局了。它目前不支持 GLX,尽管我在开发树中看到了一些 GLX 工作。也许在未来,那将是最干净的方式。xmove
也出局了。它太旧了,不值得进一步考虑。- VNC 已过时。它转发整个桌面,但无法理解 X 协议。
编辑:我花了一个周末的时间才让几个建议奏效,这xpra
是最有效的。我在下面的回答中描述了我的设置,希望它能帮助别人。
答案1
西普拉(如上所述这里) 满足了我的需求。它允许运行任意 X 应用程序,这些应用程序可以转发到多个客户端,无论是在同一台计算机上,还是在另一台机器上。它还支持运行 OpenGL 应用程序,并且允许您的应用程序在最后一个客户端断开连接后继续运行 - 让您有机会稍后重新连接。
xpra
分为两部分:客户端和服务器。要启动服务器,请在远程计算机上运行以下命令:
$ xpra start :100
这将在新的 X 显示器上启动xpra
。(有一个解决方法与代理一起使用。
要让应用程序受控制xpra
,请在与服务器相同的显示器上运行它xpra
,如下所示:
$ export DISPLAY=:100
$ firefox&
$ blender&
...
这一切都可以通过 ssh 连接(带或不带 X11-Forwarding)完成,没有任何问题。
要启动客户端,请执行以下操作之一:
$ ssh -X user@remotehost
<gain remote connection>
$ xpra attach :100
或者
$ xpra attach ssh:user@remotehost:100
请注意,后者要求xpra
在本地机器上安装客户端;前者则不需要。
客户xpra
端会在窗口管理器的任务栏/面板中放置一个图标,以便您断开客户端连接。(或者,您可以直接终止它,只要您小心不要终止服务器即可。)然后,只要服务器仍在运行,您就可以稍后重新连接xpra
。如果主机上运行着单个xpra
服务器,您也可以简单地省略显示编号,然后xpra attach
自己就能搞清楚。
的一个非常好的功能xpra
是它允许您在预先存在的显示器上启动服务器。这允许您在服务器xpra
崩溃时恢复会话(只要该显示器上的 X 服务器仍在运行)。为此,请运行
$ xpra start --use-display :100
注意事项:
xpra
作为窗口管理器运行。虽然它可以很好地嵌入到其他窗口管理器中,但它与 X 应用程序本身的配合并不好:例如,它不允许rxvt-unicode
删除其标题栏;它也不会告诉窗口它们在屏幕上有多少空间可供使用,例如,下拉框和菜单会超出屏幕范围。不过,我认为后一个问题是修复我的配置的问题。按键重复。经常出现这种情况。可以使用 来解决
xpra attach --no-keyboard-sync
,但手册页警告说,这种方法在某些游戏中效果不佳。我祈祷我不会渴望玩这些游戏。
出于这些原因,Xephyr
这可能是一个更好的解决方案(一旦它支持 GLX),因为它作为 X 服务器运行,而不是窗口管理器。不过,我还没有调查它是否支持恢复先前断开的会话。