启动 X11 应用程序需要 root

启动 X11 应用程序需要 root

我正在使用 QML 技术构建 Qt 应用程序。 QML 使用 OpenGL。

运行构建的计算机是 CentOS 6.7,配备 intel GPU。我仅在 SSH 上使用它,并且使用 XMing(或有时使用 VcxSrv)打开图形应用程序。

我在让它工作时遇到了很多麻烦,但通过谷歌搜索我的问题并使用 xauth,我现在可以远程打开我的 QML 应用程序。

当以普通用户运行我的应用程序时,我得到:

KiTTY X11 proxy: Unsupported authorisation protocol QXcbConnection: Could not connect to display localhost:10.0

我注意到错误消息说不支持(很多问题都是关于错误的协议)

我只能在 root 中打开它(sudo在这里不起作用,我需要su),并且我遇到了多个错误:

无法获取当前屏幕资源警告:当不支持 GLX 1.3 时,应用程序 /home/user/QMLapp/app 调用 GLX 1.3 函数“glXCreatePbuffer”!这是一个应用程序错误! QXcbConnection:XCB 错误:170(未知),序列:163,资源 ID:90,主要代码:146(未知),次要代码:20

笔记 : glxinfo 看起来不错并且直接渲染已激活。 glxgeers 也可以正常工作,不需要 root 即可工作

第一个问题: 我可以轻松升级我的 GLX 吗? 第二个问题: 为什么它只能在 root 下运行?

答案1

QXcbConnection: Could not connect to display localhost:10.0

上面的错误可能包含一些线索。这意味着,对于该用户,变量$DISPLAY设置为 localhost:10.0

su 到 root 后,您可以使用 再次检查该变量echo $DISPLAY。然后相应地更改普通用户的变量值。

正确的值可能是localhost:0.0

答案2

正如您在问题中所述,DISPLAY的值表示您正在使用 SSH 转发的 X11 连接。localhost:10.0如果您将 更改为DISPLAY:0.0则表示您希望程序在直接连接到远程计算机的屏幕上显示其窗口...并且如果您不在物理上靠近它,则不会很有用。

直接渲染需要 GUI 应用程序直接访问绘制到屏幕的实际 GPU……当屏幕和应用程序不在同一主机时,这当然是不可能的。

看起来这个应用程序可能被设计为仅在本地使用。如果它无法优雅地回退到间接渲染,则无法通过远程 X11 连接使用它:直接渲染要求实际执行绘图的 GPU 应该与应用程序位于同一台计算机中,并且不能通过网络与其分开联系。

如果您使用远程 X11 连接 或XmingVcXsrv那么您的 OpenGL 支持级别主要取决于您的XmingVcXsrv将支持的 OpenGL 级别。当然,远程计算机还需要存在适当的 OpenGL 库,但通常由包管理器或应用程序安装程序来处理。

当您以普通用户身份运行它时,您是以登录 X11 转发 SSH 连接的用户身份运行的,还是登录后切换到远程主机上的另一个用户帐户?

在保留 X11 转发的同时切换用户帐户需要一些额外的工作:不仅必须确保DISPLAY保留变量的值,还必须确保目标用户有权访问 ~/.Xauthority 文件的内容源用户。您可以将 ~/.Xauthority 文件复制到其他位置(例如 /tmp),然后使用XAUTHORITY环境变量指向它。

例如:

<logged in to remote host as user1, with X11 forwarding>
user1$ echo $DISPLAY
localhost:10.0
user1$ cp ~/.Xauthority /tmp/user1.Xauthority
user1$ chgrp user2 /tmp/user1.Xauthority
user1$ chmod 640 /tmp/user1.Xauthority
user1$ sudo -u user2 -i
user2$ export DISPLAY=localhost:10.0
user2$ export XAUTHORITY=/tmp/user1.Xauthority
<now running a X11 GUI application should be possible>

当您从普通用户切换到 root 用户时,通常可以避免这种情况,因为 root 可以读取每个人的文件...包括 ~/.Xauthority 文件。因此,当从 root 切换时,user1唯一需要做的就是维护该DISPLAY值并XAUTHORITY指向/home/user1/.Xauthority。某些 Linux 发行版包含脚本或 PAM 模块,当您从普通用户切换到 root 时,它们会自动为您执行此操作。

相关内容