概述
我正在尝试在OSX上让XQuartz工作,以便通过Docker进行X11转发。我正在遵循这里的说明。我相信我的问题可能仅需要第一部分的答案,但为了避免XY问题,我也提供了第二部分。
安装
我已经通过homebrew安装了它,通过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
$
以下内容并不起作用,根据这里的答案,原因不确定:
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转发
无论如何,继续前进,这个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。但是,我不知道
DISPLAY=:0
连接到了什么。它肯定不是端口6000,因为那是它以前侦听的端口。如果我将其更改为6005
,以转发到6000
,并使Docker容器显示为$(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