Ошибка Xt: невозможно открыть дисплей, если используется 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?


Переадресация Docker с помощью socat

В любом случае, двигаясь дальше, эта 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

Это не IP-адрес UNIX-CLIENT. Но я не знаю, к чему подключается DISPLAY=:0. Это определенно не порт 6000, так как это порт, который он прослушивал. Если я изменю его на 6005, чтобы перенаправить на 6000, и вместо этого сделаю DISPLAY контейнера 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: Как действовать дальше?


person Claudiu    schedule 15.06.2016    source источник


Ответы (4)


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

person Claudiu    schedule 15.06.2016
comment
В инструкциях, которым я следовал, было сказано выйти и снова войти, чтобы xQuarts заработал, что я и сделал. Перезагрузка была ключевой частью, которую мне тоже не хватало, спасибо! - person Jared Chmielecki; 13.07.2017

Докеризированные приложения пользовательского интерфейса в Docker для настольных компьютеров MacOS 2018+. Обновлено в 2021 году.

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

  • Текущая версия XQuartz 2.7.11 (xorg-server 1.18.4)
  • Версия докера docker version 18.06.1-ce

Обязательно установите XQuartz (обновлено 2021 change)

$ brew install socat
$ brew install --cask xquartz
  • Не забудьте закрыть выход из системы и войти снова.

ВНИМАНИЕ: на этом этапе обязательно перезагрузите хост (например, MacOS). Следующая ошибка связана с тем, что вы этого не сделаете: 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 терминала: один для сокета с дисплеем, а другой для запуска контейнера пользовательского интерфейса.

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 marcellodesales    5u  IPv4 0xe21e43ca9d99bf1d      0t0  TCP *:6000 (LISTEN)

4. Создайте и запустите простое приложение с пользовательским интерфейсом

$ 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-адрес и предоставит его образу докера. Нападающий сотворит свое волшебство.

$ 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

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

person Marcello de Sales    schedule 29.11.2018
comment
Это выглядело многообещающе, но результирующий сеанс GUI нестабилен (закрывается в течение 30 секунд без сообщения об ошибке. Я читал, что можно где-то использовать флаг -t, чтобы каким-то образом отключить тайм-аут по умолчанию, но есть мало документации по socat и добавление 't ignoreof ' в команде socat TCP-LISTEN', безусловно, не работает (на самом деле socat продолжает прослушивать порт 6000 даже после закрытия графического приложения). Я также получаю ошибку libGL: не найдены соответствующие fbConfigs или визуальные эффекты Ошибка libGL: не удалось загрузить драйвер: swrast - person Kristof; 10.06.2019

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

person Stunner    schedule 14.02.2017
comment
Терминалу нужно было увидеть новый путь, установленный с X. Вы можете добавить его в командной строке, но перезапуск терминала решает эту проблему легко. - person Jeff Clayton; 06.05.2019

Для 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. Однако вы можете не выходить из системы и не входить в нее, открыв приложение XQuartz Terminal (XQuartz > Applications > Terminal) и запустив оттуда свое X-приложение. Например:

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

а потом

bash-3.2$ xclock &
person solimant    schedule 14.03.2018
comment
› Если вы впервые устанавливаете XQuartz, вы можете выйти из системы и снова войти в нее. Спасибо!!!! - person Tom Chen; 24.11.2020