web-dev-qa-db-ja.com

Xtエラー:デフォルトのDISPLAYを使用している場合、ディスプレイを開けません

概要

XQuartzをOSXで動作させようとしているので、Docker経由でX11転送を行うことができます。私は ここの指示 に従っています。私の質問は最初の部分だけで答えられると思いますが、念のため(XYの問題を避けるため)、2番目の部分も提供しました。

Installation

Homebrew、_brew cask install xquartz_経由でインストールしました。次に、_open -a XQuartz_を起動します。

ローカルxterm

テストして、xtermを開こうとすると、動作しません:

_MacBook-Pro:opencv-gui csaftoiu$ xterm
xterm: Xt error: Can't open display: /private/tmp/com.Apple.launchd.3wncZULdXC/org.macosforge.xquartz:0
_

ただし、疑似ファイルは存在します。

_MacBook-Pro:opencv-gui csaftoiu$ echo $DISPLAY
/private/tmp/com.Apple.launchd.3wncZULdXC/org.macosforge.xquartz:0
MacBook-Pro:opencv-gui csaftoiu$ ls -alh $DISPLAY
srw-rw-rw-  1 csaftoiu  wheel     0B May  6 21:12 /private/tmp/com.Apple.launchd.3wncZULdXC/org.macosforge.xquartz:0
_

IcanXQuartzを介してxtermを開きます。次に:

_bash-3.2$ echo $DISPLAY
:0
_

この値は、通常のOSXでも機能します。

_$ DISPLAY=:0 xterm
# opens xterm, waits for it to finish
$
_

次は動作しませんが、なぜ ここの答え に基づいているのか分かりません:

_xterm: Xt error: Can't open display: localhost:0
MacBook-Pro:opencv-gui csaftoiu$ DISPLAY=127.0.0.1:0 xterm
xterm: Xt error: Can't open display: 127.0.0.1:0
MacBook-Pro:opencv-gui csaftoiu$ DISPLAY=`ipconfig getifaddr en0`:0 xterm
xterm: Xt error: Can't open display: 192.168.1.15:0
_

xinitは何らかの理由で機能することに注意してください。

_$ xinit

xinit: XFree86_VT property unexpectedly has 0 items instead of 1
# opens xterm, waits for it to finish
xinit: connection to X server lost

waiting for X server to shut down
_

質問1:XQuartzは実際に何を聞いていますか?


Socatを使用したDocker Forwarding

いずれにしても、次に進むと、このsocatコマンドは機能しません。

_MacBook-Pro:opencv-gui csaftoiu$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
_

それを実行して、別のウィンドウから:

_MacBook-Pro:opencv-gui csaftoiu$ docker run --rm -it -e DISPLAY=`ipconfig getifaddr en0`:0 ubuntu:14.04 bash
root@912eec31b8cb:/# apt-get update && apt-get install xterm
... such install, wow ...
root@912eec31b8cb:/# xterm
Warning: This program is an suid-root program or is being run by the root user.
The full text of the error or warning message cannot be safely formatted
in this environment. You may get a more descriptive message by running the
program as a non-root user or by removing the suid bit on the executable.
xterm: Xt error: Can't open display: %s
root@912eec31b8cb:/# echo $DISPLAY
192.168.1.15:0
_

socatウィンドウから以下を取得します。

_2016/06/14 21:08:15 socat[24289] E connect(5, LEN=68 AF=1 "/private/tmp/com.Apple.launchd.3wncZULdXC/org.macosforge.xquartz:0", 68): Connection refused
_

動作するDISPLAY変数を使用することもできません。

_MacBook-Pro:opencv-gui csaftoiu$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\":0\"
2016/06/14 21:09:43 socat[24309] E connect(5, LEN=4 AF=1 ":0", 4): No such file or directory
_

現在、これはUNIX-CLIENT IPではありません。しかし、私は知らないwhat_DISPLAY=:0_が接続している。確かにポート6000ではありません。これは、ポート6000がリッスンしていたポートだからです。 _6005_に変更して_6000_に転送し、代わりにDockerコンテナDISPLAYを$(ipconfig getifaddr en0):5にすると、接続は当然拒否されます。

_$ socat TCP-LISTEN:6005,reuseaddr,fork TCP:localhost:6000
2016/06/14 21:20:32 socat[25379] E connect(8, LEN=16 AF=2 127.0.0.1:6000, 16): Connection refused
_

質問2:ここから先に進む方法は?

12
Claudiu

XQuartzを再インストールした後、再起動しませんでした。再起動しましたが、今では動作します。 :)。

13
Claudiu

Docker for Desktop MacOS 2018+のDockerized UIアプリ

ポート、IPなどの確認に依存しない、可能な限り単純なバージョンを取得するために、すべての苦労を乗り越えました...ここにあります。

  • 実行中のバージョンXQuartz 2.7.11 (xorg-server 1.18.4)
  • Dockerバージョンdocker version 18.06.1-ce

必ずXQuartzをインストールしてください

$ brew install socat
$ brew cask reinstall xquartz
  • ログアウトを閉じて再度ログインすることを忘れないでください。

1. 6000を閉じます

新しい端末で、ポート6000で実行されているものがあるかどうかを確認します

$ lsof -i TCP:6000
$

何かがある場合は、プロセスを強制終了します

2. 6000を閉じます

そのポートでソケットを開き、ターミナルを開いたままにします

$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

3. 6000が開いていることを確認します

新しい端末で、開いているかどうかを確認します

$ lsof -i TCP:6000
COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
socat   29298 mdesales    5u  IPv4 0xe21e43ca9d99bf1d      0t0  TCP *:6000 (LISTEN)

4.シンプルなUIアプリをビルドして実行する

$ cat Dockerfile.eyes
FROM centos
RUN yum install -y xeyes
CMD ["/usr/bin/xeyes"]
$ docker build -t eyes -f Dockerfile.eyes .

魔法はDockerの変数を使用して発生します。 -e DISPLAY=docker.for.mac.Host.internal:0は、内部IPアドレスをポイントし、それをdockerイメージに提供するため、トリックを行いました。ポートフォワードは魔法をかけます。

$ docker run -e DISPLAY=docker.for.mac.Host.internal:0 eyes

enter image description here

この時点で、XQuartzが同じポートに対して独自に開かれていることに気付きました

$ lsof -i TCP:6000
COMMAND   PID     USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
socat   29298 mdesales    5u  IPv4 0xe21e43ca9d99bf1d      0t0  TCP *:6000 (LISTEN)
X11.bin 29462 mdesales    8u  IPv6 0xe21e43ca7cdb1135      0t0  TCP *:6000 (LISTEN)

5.より多くのアプリの利益と実行

$ docker run -e DISPLAY=docker.for.mac.Host.internal:0 jess/tor-browser

enter image description here

$ docker run -e DISPLAY=docker.for.mac.Host.internal:0 batmat/docker-Eclipse

enter image description here

8

動作させるために、Terminalを終了してから再起動する必要がありました。

1
Stunner

OS X 10.6.3以降の場合、 XQuartz 2.7.11命令

XQuartzを初めてインストールする場合は、ログアウトして再度ログインすることをお勧めします。これにより、DISPLAY環境変数がX11.appではなくXQuartz.appを指すように更新されます。 X11.appをデフォルトサーバーとして使用し続ける場合は(XQuartz.appを手動で起動できます)、 launchctl(1)

MacOS High Sierraに XQuartz 2.7.11 をインストールした後、MacOSターミナルを介して動作するには、Macからログアウトして再度ログインするだけで十分です。ただし、XQuartzターミナルアプリケーション(XQuartz>アプリケーション>ターミナル)を開いて、そこからXアプリケーションを実行することにより、ログアウトしてログインする必要を回避できます。 。例えば:

enter image description here

その後

bash-3.2$ xclock &
0
bigT