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" --集成
概述
我正在尝试让 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" --集成