1. 序章

私たちは、グラフィカルユーザーインターフェイス(GUI)を操作し、その要素を使用してアプリケーションを起動することに慣れています。 ただし、端末からのコマンドを使用する必要があり、 X11 DISPLAY変数が設定されていませんまたはエラー:ディスプレイを開けませんなどのメッセージが表示される場合があります。 このチュートリアルでは、このような問題を解決する方法を見ていきます。

2. 定義

X11またはXWindow は、ほとんどの種類のUNIX用のグラフィカルシステムです。 1984年にマサチューセッツ工科大学(MIT)で ProjectAthenaで誕生しました。 MITでは、数百台の異種ワークステーションがキャンパスに散在していました。 任意のステーションで実行するアプリケーションを作成するためのウィンドウシステムを提供するというアイデアでした。ネットワークを介して任意のワークステーション上のアプリケーションにアクセスし、ローカルでグラフィック出力を表示できるようにする必要があります。

2.1. クライアントサーバーモデルとコアXプロトコル

デバイスに依存しないアプリケーションの場合、デバイスアクセスの詳細はXサーバーに隠されています。 Xアプリケーションからの接続を処理し、グラフィックス要求を逆多重化し、キーボードやマウスなどからアプリケーションに入力を多重化することにより、すべての基本的なウィンドウメカニズムを提供します。 アプリケーションは、共有メモリまたは TCP などのネットワークプロトコルを介して、プロセス間通信( IPC )パスを介してXサーバーに接続します。

このようなIPCパスは、Xクライアントと呼ばれます。 ほとんどのアプリケーションは単一の接続しか開かないため、アプリケーション自体をXクライアントと呼ぶことがよくあります。 XクライアントXサーバー間の通信プロトコルはXプロトコルと呼ばれます。 これは、他のツールが構築される基本的なレイヤーです。

2.2. DISPLAY とはどういう意味ですか?

画面上にウィンドウを作成し、イベントを受信するには、表示するための接続を確立する必要があります。 X に関しては、ディスプレイは1つ以上の画面、1つのキーボード、(オプションの)ポインティングデバイス、およびXサーバーで構成されます。 デフォルトでは、アプリケーションはシェル環境変数DISPLAYに格納されている表示名を使用します。 これは、次の形式の文字列です。

Host_Name:[:] Display_Number.Screen_Number

  • Host_Name は、ディスプレイが物理的に接続されているホストの名前です。
  • :[:] DECnet を使用したネットワークの場合にのみ、ダブルコロンを使用します。
  • Display_Number は、そのホストマシン上のディスプレイサーバーのゼロベースの番号です。 コンピューターには、複数のサーバーを実行できます。
  • Screen_Number (これも0から始まります)は、そのサーバーで使用される画面を指定します。 1台のXサーバーで多くの画面を制御できます。

3. DISPLAYを知って設定する

現在のDISPLAYを知る最も簡単な方法は、 echo この変数、またはすべてのshell変数のリストからgrepを使用することです。 setコマンドは次のようになります。

$~ echo $DISPLAY 
:0
$~ set | grep DISPLAY
:0

この例では、Host_NameScreen_Numberが欠落していますが、これは一般的なことです。 これは、XクライアントがローカルXサーバーとIPCトランスポートを通信に使用することを意味します。 得られた値は、 unix:0.0 または:0.0、と同等であり、ここで unix は、XクライアントがIPCを使用することを意味します。 コロンの前にHost_Nameがある場合、XサーバーXクライアントはTCPトランスポートを介して通信します。

通常、DISPLAYはシステムによってすでに設定されています。ただし、場合によっては手動で設定する必要があります。 手作業で決定することは、他のシェル変数の場合と同じです。 直接設定する例を次に示します。

$~ export DISPLAY=unix:0.0

DISPLAY設定をテストするには、通常、xeyesxclockのような単純なプログラムを実行しようとします。

4. DISPLAYが設定されていないおよび同様の問題

たとえば、ローカルコンソールから xeyes を起動し、雑音なしで実行すると、DISPLAYが正しく設定されます。 コマンドunsetDISPLAYを削除し、 xeyes を再実行すると、次のように文句が表示されます。

$~ unset DISPLAY
$~ xeyes 
Error: Can't open display: 

javaを使用するアプリケーションも文句を言います。

$~ java -jar Paint.jar 
Exception in thread "AWT-EventQueue-0" java.awt.HeadlessException: 
No X11 DISPLAY variable was set, but this program performed an operation which requires it.

人気のあるブラウザchromiumは、次のような巨大な出力メッセージで嘆きます。

$~chromium
[6864:6864:1126/221702.545428:FATAL:ozone_platform_x11.cc(232)] Check failed: x11::Connection::Get()->Ready(). Missing X server or $DISPLAY

これらすべての場合において、キーワードX server、DISPLAYが正しくないか、欠落しています

ただし、Qtプログラムの出力はより複雑です。 Qt はマルチプラットフォームアプリケーションのフレームワークであり、多くの依存関係があるため、これらのキーワードはありません。

qt.qpa.plugin: Could not load the Qt platform plugin "xcb" in "" even though it was found.

したがって、エラーメッセージはソフトウェアによって異なります。この問題の解決は、 Xクライアントをリモートマシン、またはローカルマシンのどこで実行するかによって異なります。

5. リモートXクライアントの起動

リモートXクライアントを起動する最良の方法は、いわゆるX転送でsshを使用して、コマンドに使用するのと同じ接続を介してXプロトコルパケットを送信することです。 したがって、 ssh -X our_remote_host を実行し、ログイン後、X11アプリケーションを起動します。 もちろん、sshデーモンsshdがリモートエンドで実行され、その構成ファイル sshd_configX11Forwardingyes[という行が含まれている場合はこれですべてです。 X176X]。 通常のDISPLAYの値はlocalhost:10.0です。

tiger@home:~> ssh -X [email protected]
Last login: Wed Dec  1 14:32:07 EET 2021 from home on pts/4
Have a lot of fun...
tiger@gatti:~> set | grep DISPLAY
DISPLAY=localhost:10.0

-X の代わりに、 -Y キーを使用できますが、このsshdが適切に構成されている場合にのみ意味があります。 これらの2つのキーは、それぞれ信頼できない接続と信頼できる接続用です。 信頼できる人は、全体 DISPLAYにフルアクセスできます。 キーロガー、スクリーンショット、および他のプログラムのウィンドウへの入力を行うことができます。 アクセラレーショングラフィックスなど、すべての Xサーバー拡張機能を使用できます。信頼できる接続は、アプリケーションをスムーズに実行するのに適していますが、セキュリティには間違いなく厄介です。

XサーバーがTCP接続を受け入れる場合は、xhostメソッドを使用できます。 例を挙げて説明します。

ホストjaguarの近くに座って、リモートホスト tigerXクライアントに接続して実行したいが、その結果をローカルで[ X170X]ジャガー。

リモートホストtigerへの接続を確立する前に、xhostコマンドxhost+ our_remote_host:を使用して許可リストに追加する必要があります。

$~ xhost +tiger
tiger being added to access control list

xhost+も機能します。 ただし、クライアントはどのホストからでもDISPLAYに接続でき、セキュリティホールが発生する可能性があるため、この使用は危険です。 tiger にログインしたら、 DISPLAY をセットアップして、ローカルマシン(この場合は javuar )に出力します。

$~ export DISPLAY=jaguar:0.0

終了してログオフした後、リストからホストを削除します。

$~ xhost -tiger
localhost being removed from access control list

ただし、 XサーバーへのTCP接続はデフォルトで禁止されているため、この方法は最新のディストリビューションではそのままでは機能しません。

6. ローカルマシンで開始

通常、アプリケーションはGUIから直接起動しますが、場合によっては、konsoleまたはxterm gnome-terminal などの端末から起動します。やくあけ。 ローカルアプリケーションがDISPLAYについて文句を言う場合は、別のタイプの端末を使用してみることができます。

sudo コマンドの後にアプリケーションを実行しようとすると、DISPLAYでエラーが発生する場合があります。 もちろん、この問題を解決するために、 ssh -X user @ localhost を使用できますが、 sshd の構成制限のためにこれが不可能な場合は、のいずれかを使用することもできます。 xhostまたはxauthメソッド。

6.1. xhostメソッドの使用

例を使用してメソッドを説明します。 ユーザーpanterとしてログに記録しました。panterが別のユーザーlionとしてコマンドを実行する必要があるとします。 DISPLAY 値を保持するために、オプション -E (または –preserve-value )を追加しますが、これでは不十分です。

panter~> sudo -Eu lion xeyes 
[sudo] password for lion: 
Authorization required, but no authorization protocol specified
Authorization required, but no authorization protocol specified
Error: Can't open display: :0

承認に関する印刷された情報は、この問題を解決するための私たちの鍵です。 lionを許可されたユーザーのリストに追加する必要があることを示唆しています。 したがって、 sudo の前に、次のことを行います。

panter~> xhost +si:localuser:lion
localuser:lion being added to access control list

このコマンドで、キー si は、Xサーバーがこの接続を実行することを意味します。

今回は、 Xアプリケーションを実行できます。終了したら、ユーザーlionをリストから削除します。

panter~> xhost -si:localuser:lion
localuser:lion being removed from access control list

6.2. xauthメソッドの使用

xauthでメソッドを使用できます。 秘密鍵を知っている人なら誰でもアクセスできます。 このキーはマジッククッキーまたは認証レコードと呼ばれ、認証スキームの名前はMIT-MAGIC-COOKIE-1です。同じ例で使用方法も示します。

まず、DISPLAYxauthコマンドを使用して秘密鍵を取得します。

panter~> set | grep DISPLAY
DISPLAY=:0
panter~> xauth list $DISPLAY
panter.cats.edu/unix:0  MIT-MAGIC-COOKIE-1  abf87ea2c8a4ed7f41ce8e7b99047870
#ffff##:0  MIT-MAGIC-COOKIE-1  abf87ea2c8a4ed7f41ce8e7b99047870

次に、 lion に切り替えて、 DISPLAYを設定します(または、上記の例のように、sudoで -E キーを使用します):[ X131X]

lion:~> export DISPLAY=:0

さらに、xauth出力に注意してください。 xclockは実行できません。

lion~> xauth list $DISPLAY
xauth:  file /home/lion/.Xauthority does not exist
lion~> xclock
Authorization required, but no authorization protocol specified
Authorization required, but no authorization protocol specified
Error: Can't open display: :0

さらに、秘密鍵をエクスポートします。 xclock は実行できます:

lion~> xauth add $DISPLAY . abf87ea2c8a4ed7f41ce8e7b99047870
xauth:  file /home/lion/.Xauthority does not exist

終了後、キーを削除します。

lion~> xauth rem $DISPLAY

$HOME/。Xauthorityファイルがないことはエラーではありません。 欠落している場合、ファイルは自動的に作成されます。

xauth メソッドは、リモートホストでXクライアントを実行するためにも使用できます。 この方法は、xhostの方法よりもはるかに安全です。

7. ウェイランドに関する注意事項

ディスプレイサーバーとそのクライアント間の新しい通信プロトコルであるWaylandの人気が高まっています。

また、DISPLAYについて不満を言う場合があります。 このような問題を回避する最善の方法は、sshメソッドを使用することです。 ただし、すべてのX11アプリケーションがWaylandで実行されるわけではないことに注意してください。

機能があります: Wayland ssh クライアントには、XephyrのようなネストされたXサーバーWaylandが必要な場合があります] ssh ホストは、アプリケーションコマンドの前にプリセット文字列を必要とする場合があります。 GDK_BACKEND=x11。そして、 Wayland ホストに、 X11 を使用して、Xephyrウィンドウでアプリケーションを実行するように指示します。

8. 結論

この記事では、X Window Systemの原則を観察し、DISPLAYシェル変数の意味とXWindowSystemにおけるその役割を学びました。 エラー:ディスプレイを開けませんなどの問題を解決しました。 リモートマシンでGUIを実行し、その出力をローカルで取得するには、ssh-Xまたは-Yキーを使用しました。 XサーバーXクライアントの両方が同じマシンで実行されている場合は、シェル変数 DISPLAY を設定し、サーバーがローカルで使用できるようにする必要があります。