X11アプリケーションを実行するにはrootが必要です

X11アプリケーションを実行するにはrootが必要です

QML技術を使用してQtアプリケーションを構築しています。 QMLはOpenGLを使用します。

ビルドを実行するコンピュータは、Intel GPUを搭載したCentOS 6.7です。私はSSHを介してのみそれを使用し、XMing(または時にはVcxSrv)を使用してグラフィックアプリケーションを開きます。

うまくいくのは難しいですが、問題を検索してxauthを使用すると、QMLアプリをリモートで開くことができます。

しかし、

一般ユーザーとしてアプリケーションを実行すると、次の結果が表示されます。

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

私は次のエラーメッセージを見つけました:サポートしていない(に関する質問がたくさんあります。間違った規約)

そして

ルートでのみ開くことができます(sudoここでは機能しません。必要ですsu)、いくつかのエラーが発生します。

現在、画面リソースを取得できません。警告:GLX 1.3がサポートされていない場合、/home/user/QMLapp/appアプリケーションはGLX 1.3関数 "glXCreatePbuffer"を呼び出します!これはアプリケーションエラーです! QXcbConnection:XCBエラー:170(不明)、シーケンス:163、リソースID:90、メジャーコード:146(不明)、マイナーコード:20

メモ: glxinfoが良く見え、直接レンダリングが有効になります。 glxgeersもうまく機能し、ルートは必要ありません。

最初の質問:GLXを簡単にアップグレードできますか? 2番目の質問:なぜルートでしか実行できないのですか?

答え1

QXcbConnection: Could not connect to display localhost:10.0

上記のエラーには、いくつかの手がかりを含めることができます。これは、このユーザーの変数が$DISPLAYlocalhost:10.0に設定されていることを意味します。

ルートに訴えた後、を使用して変数を再確認できますecho $DISPLAY。次に、一般ユーザーに合わせて変数値を変更します。

正しい値は次のようになります。localhost:0.0

答え2

質問で述べたように、DISPLAY値はSSH転送X11接続を使用していることを示します。localhost:10.0に変更すると、DISPLAYプログラム:0.0がリモートコンピュータに直接接続されている画面にウィンドウを表示したいことを意味します。物理的に近づいていなければそれほど役に立ちません。

直接レンダリングするには、GUIアプリケーションが画面に描画する実際のGPUに直接アクセスできる必要があります。もちろん、画面とアプリケーションが同じホスト上にない場合は不可能です。

このアプリはローカルでのみ使用するように設計されているようです。間接レンダリングで適切に置き換えられないと、リモートX11接続では使用できません。直接レンダリングを使用するには、実際に描画するGPUをアプリケーションと同じコンピュータに配置する必要があり、個別に接続しないでください。ネットワーク経由。

リモートX11接続またはデバイスを使用している場合、XmingOpenGLサポートレベルは、主にデバイスがサポートするVcXsrvOpenGLレベルによって異なります。もちろん、適切なOpenGLライブラリもリモートシステムに配置する必要がありますが、これは通常パッケージマネージャまたはアプリケーションインストーラによって処理されます。XmingVcXsrv

通常のユーザーとして実行する場合は、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>

ルートは〜/ .Xauthorityファイルを含むすべての人のファイルを読み取ることができるため、通常のユーザーからrootに切り替えるときに通常これを回避できます。したがって、ルートから切り替えるときにuser1実行する唯一のことは、DISPLAY値を保持してXAUTHORITYその値を指すことです/home/user1/.Xauthority。一部のLinuxディストリビューションには、通常のユーザーからrootに切り替えると自動的にこれを実行するスクリプトまたはPAMモジュールが含まれています。

関連情報