Xt error: невозможно открыть дисплей, если используется DISPLAY по умолчанию

обзор

Я пытаюсь заставить XQuartz работать на OSX, чтобы я мог сделать пересылку X11 через Docker. Я следую инструкциям здесь. Я полагаю, что на мой вопрос может ответить только первая часть, но на всякий случай (чтобы избежать проблемы 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

Я могу открыть Xterm через XQuartz. Затем:

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 команда не работает:

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-контейнер 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

Вопрос 2: Как действовать дальше?

6 ответов

Решение

Я не перезагружался после переустановки XQuartz. Я перезапустил, и теперь это работает.:).

Dockerized UI Apps в Docker для настольных компьютеров MacOS 2018+

Перебрал всю боль, чтобы получить простейшую версию, которая не зависит от проверки порта, ip и т. Д. Вот оно.

  • Бегущая версия XQuartz 2.7.11 (xorg-server 1.18.4)
  • Версия докера 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. Создайте и запустите простое приложение пользовательского интерфейса

$ 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 run -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 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

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

Мне нужно было выйти из терминала, а затем перезапустить его, чтобы заставить его работать.

Этот ответ, возможно, ограничен MacOS/Monterey.

После запуска XQuartz и установки параметра «Настройки/Безопасность/Разрешить подключения от сетевых клиентов» необходимо перезапустить XQuartz. (Возможно, после установки вам придется снова выйти из системы или войти в систему, но я обнаружил, что достаточно просто перезапустить XQuartz.) После этого, когда XQuartz снова запустится, вы должны увидеть, что он прослушивает порт 6000:

      lsof -i TCP:6000

Перед этим шагом перезапуска толькоDISPLAY=:0или файловый сокет по умолчанию работал у меня. После этого шага я мог бы сделать

      export DISPLAY=localhost:0

иxterm,xhostи т. д. работал нормально.

Для использования с докером я использовал:

      xhost +localhost
DISPLAY=docker.for.mac.host.internal:0 
docker run -e DISPLAY=$DISPLAY -v /tmp/X11-unix:/tmp/.X11-unix

Для OS X 10.6.3 и выше, в соответствии с инструкциями XQuartz 2.7.11:

Если вы устанавливаете XQuartz впервые, вы можете выйти из системы и снова войти в нее. Это обновит переменную среды DISPLAY, указав XQuartz.app, а не X11.app. Если вы предпочитаете продолжать использовать X11.app в качестве сервера по умолчанию (вы по-прежнему можете запускать XQuartz.app вручную), вы можете отключить /Library/LaunchAgents/org.macosforge.xquartz.startx.plist с помощью launchctl (1).,

После установки XQuartz 2.7.11 на мою MacOS High Sierra мне достаточно было выйти из моего Mac и войти снова, чтобы это работало через мой MacOS Terminal. Однако вы можете избежать выхода из системы и войти в нее, открыв приложение XQuartz Terminal (XQuartz> Applications> Terminal) и запустив ваше приложение X оттуда. Например:

введите описание изображения здесь

а потом

bash-3.2$ xclock &

Я использовал этот код, поможет вам в 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.

exec "$CWD / dia-bin" - интегрировано

Другие вопросы по тегам