Xt error: Can't open display, if using default DISPLAY

Xt error: Can't open display, if using default DISPLAY

概述

我正在尝试让 XQuartz 在 OSX 上工作,这样我就可以通过 Docker 进行 X11 转发。我正在关注 the instructions here。我相信我的问题可能仅由第一部分回答,但为了以防万一(为了避免 XY 问题),我也提供了第二部分。

安装

我已经通过 brew cask install xquartz 通过自制程序安装了它。那我open -a XQuartz开始吧

本地 xterms

正在测试,如果我尝试打开一个 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

可以通过XQuartz打开一个xterm。那么:

bash-3.2$ echo $DISPLAY
:0

这个值也适用于常规 OSX:

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

虽然以下不起作用,但不确定为什么基于 the answer here:

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 实际上在监听什么?


Docker 使用socat转发

无论如何,继续,这个socat命令不起作用:

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

运行 从另一个 window 我做的:

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 window 我得到:

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 客户端 IP。但是,我不知道 DISPLAY=:0 正在连接什么。它肯定不是端口 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:如何从这里开始?

我重装XQuartz后没有重启。我重新启动,现在它可以工作了。 :).

我需要退出终端然后重新启动它才能正常工作。

对于 OS X 10.6.3 及更高版本,根据 XQuartz 2.7.11 instructions:

If this is your first time installing XQuartz, you may wish to logout and log back in. This will update your DISPLAY environment variable to point to XQuartz.app rather than X11.app. If you would prefer to keep using X11.app as your default server (you can still launch XQuartz.app manually), you’ll want to disable /Library/LaunchAgents/org.macosforge.xquartz.startx.plist using launchctl(1).

在我的 macOS High Sierra 上安装 XQuartz 2.7.11 后,注销我的 Mac 并再次登录就足以通过我的 MacOS终端。但是,您可以通过打开 XQuartz 终端应用程序(XQuartz > Applications > Terminal)和 运行 您的 X 应用程序来避免注销和登录。例如:

然后

bash-3.2$ xclock &

Docker在 Docker 中为 Desktop MacOS 2018+ 优化了 UI 应用程序。 2021 年更新。

历尽千辛万苦才获得最简单的版本,它不依赖于检查端口、IP 等...就是它了。

  • 运行宁版XQuartz 2.7.11 (xorg-server 1.18.4)
  • Docker版本docker version 18.06.1-ce

确保安装 XQuartz(已更新 2021 change

$ brew install socat
$ brew install --cask xquartz
  • 不要忘记关闭注销并重新登录。

ATTENTION: At this point, make sure to reboot your host (MacOS for instance). The following error is related to when you don't: E connect(5, LEN=2 AF=1 "<anon>", 2): Invalid argument

$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"
2021/04/04 17:28:58 socat[40606] E connect(5, LEN=2 AF=1 "<anon>", 2): Invalid argument

说明

  • 您需要打开 2 个终端:一个用于带有显示器的 socat,另一个用于 运行 连接 UI 容器。

1。关闭任意 6000

在新终端上,验证端口 6000

上是否有任何 运行ning
$ 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 marcellodesales    5u  IPv4 0xe21e43ca9d99bf1d      0t0  TCP *:6000 (LISTEN)

4。构建和 ​​运行 简单 UI 应用程序

$ cat Dockerfile.eyes

FROM debian:latest
RUN apt-get update && apt-get install -y x11-apps
RUN rm -rf /tmp/* /usr/share/doc/* /usr/share/info/* /var/tmp/*
RUN useradd -ms /bin/bash user
ENV DISPLAY :0
USER user
ENTRYPOINT ["/bin/sh", "-c", "[=15=] \"$@\"", "xeyes"]

$ docker build -t eyes -f Dockerfile.eyes .

奇迹发生在使用 Docker 中的变量。只需使用 -e DISPLAY=docker.for.mac.host.internal:0 就可以了,因为它将指向内部 IP 地址并将其提供给 docker 图像。端口转发将发挥它的魔力。

$ docker run -ti --rm -e DISPLAY=docker.for.mac.host.internal:0 eyes

我注意到此时 XQuartz 已在同一端口上自行打开

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

5。利润和 运行 更多应用程序

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

$ docker run -e DISPLAY=docker.for.mac.host.internal:0 batmat/docker-eclipse

我在 macos Big sur 中使用此代码将对您有所帮助 https://apple.stackexchange.com/questions/411619/how-to-make-dia-which-uses-x11-xquartz-work

export DISPLAY=:0 # 修复“无法打开显示”。 export LANG="en_US.UTF-8" # 修复恼人的 Xterm window 打开。

exec "$CWD/dia-bin" --集成