首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Xt错误:如果使用默认显示,则无法打开显示

Xt错误:如果使用默认显示,则无法打开显示
EN

Stack Overflow用户
提问于 2016-06-15 04:21:57
回答 6查看 38.5K关注 0票数 20

概述

我试图让XQuartz在OSX上工作,这样我就可以通过Docker进行X11转发。我在跟踪这里的说明。我相信我的问题可能只回答了第一部分,但为了避免(为了避免XY问题),我也提供了第二部分。

安装

我是通过自制的,通过brew cask install xquartz安装的。然后我open -a XQuartz启动它。

局部x项

如果我尝试打开一个xterm,那么测试它是不工作的:

代码语言:javascript
运行
复制
MacBook-Pro:opencv-gui csaftoiu$ xterm
xterm: Xt error: Can't open display: /private/tmp/com.apple.launchd.3wncZULdXC/org.macosforge.xquartz:0

不过,伪文件是存在的:

代码语言:javascript
运行
复制
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。然后:

代码语言:javascript
运行
复制
bash-3.2$ echo $DISPLAY
:0

此值也适用于常规OSX:

代码语言:javascript
运行
复制
$ DISPLAY=:0 xterm
# opens xterm, waits for it to finish
$

但是,以下内容不起作用,但不确定基于答案在这里的原因

代码语言:javascript
运行
复制
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确实因为某些原因而工作:

代码语言:javascript
运行
复制
$ 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的码头转发

在任何情况下,该socat命令不起作用:

代码语言:javascript
运行
复制
MacBook-Pro:opencv-gui csaftoiu$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

从另一个窗口运行它:

代码语言:javascript
运行
复制
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窗口我得到:

代码语言:javascript
运行
复制
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

我也不能使用工作的显示变量:

代码语言:javascript
运行
复制
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容器显示改为$(ipconfig getifaddr en0):5,那么连接当然会被拒绝:

代码语言:javascript
运行
复制
$ 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:如何从这里着手?

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2016-06-15 04:38:39

在重新安装XQuartz之后,我还没有重新启动。我重新开始了,现在起作用了。*)。

票数 23
EN

Stack Overflow用户

发布于 2018-11-29 21:55:23

桌面MacOS 2018+的Dockerized应用程序。于2021年更新。

经过了所有的痛苦,得到了最简单的版本,不依赖于检查端口,ip等.这就是了。

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

确保安装XQuartz (用2021 change更新)

代码语言:javascript
运行
复制
$ brew install socat
$ brew install --cask xquartz
  • 不要忘记关闭注销并重新登录。

注意:此时,请确保重新启动主机(例如MacOS)。以下错误与不相关的情况有关:E connect(5, LEN=2 AF=1 "<anon>", 2): Invalid argument

代码语言:javascript
运行
复制
$ 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

使用说明

  • 您需要打开两个终端:一个用于显示的套接字,另一个用于运行UI容器。

1.关闭任何6000

在新的终端上,验证端口6000上是否有任何运行

代码语言:javascript
运行
复制
$ lsof -i TCP:6000
$

如果有什么事,就杀了这个过程

2.关闭任何6000

打开端口上的套接字,终端保持打开。

代码语言:javascript
运行
复制
$ socat TCP-LISTEN:6000,reuseaddr,fork UNIX-CLIENT:\"$DISPLAY\"

3.核实6000已开启

在新终端中,验证它是否已打开。

代码语言:javascript
运行
复制
$ 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应用程序

代码语言:javascript
运行
复制
$ 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", "$0 \"$@\"", "xeyes"]

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

使用来自Docker的变量就会发生这种神奇的事情。仅仅使用-e DISPLAY=docker.for.mac.host.internal:0就能做到这一点,因为它将指向内部IP地址并将其提供给码头映像。前进的港口将发挥它的魔力。

代码语言:javascript
运行
复制
$ docker run -ti --rm -e DISPLAY=docker.for.mac.host.internal:0 eyes

我注意到在这一点上,XQuartz是独立于同一个端口打开的。

代码语言:javascript
运行
复制
$ 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.利润和运行更多的应用程序

代码语言:javascript
运行
复制
$ docker run -e DISPLAY=docker.for.mac.host.internal:0 jess/tor-browser

代码语言:javascript
运行
复制
$ docker run -e DISPLAY=docker.for.mac.host.internal:0 batmat/docker-eclipse

票数 20
EN

Stack Overflow用户

发布于 2017-02-14 11:22:38

我需要退出终端,然后重新启动它,以便让它开始工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37826094

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档