Как настроить рабочую пересылку X11 на WSL2

При переходе с WSL1 на WSL2 многое меняется; очевидно, это относится и к пересылке X11.
Какие шаги мне нужно сделать, чтобы использовать пересылку X11 с WSL2 в Windows 10, как я сделал с WSL1?


person whme    schedule 08.04.2020    source источник
comment
Я несколько понимаю, почему этот вопрос мог быть закрыт из-за того, что он не по теме SO. Однако я считаю, что это спорно. Как указано на тематическом справочном сайте, вопросы относятся к теме, если они касаются software tools commonly used by programmers, что, я бы сказал, относится к WSL2. Кроме того, он должен покрывать a practical, answerable problem that is unique to software development. Это определенно практическая проблема, на которую можно ответить, однако она может быть не уникальной для разработки программного обеспечения. Поскольку вопрос уже получил 2 голоса за повторное открытие, я могу просто подождать и посмотреть, что будет.   -  person whme    schedule 27.07.2020


Ответы (22)


TL;DR:

Добавьте в свой ~/.bashrc следующее:

export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=1

Включите общий доступ на своем сервере X11 для Windows. *

Добавьте отдельное правило для входящего трафика для TCP-порта 6000 в брандмауэр Windows, чтобы разрешить WSL доступ к X-серверу, как описано в wsl-windows-toolbar-launcher люди.


Как указано WSL_subreddit_mod на reddit, a href = "https://docs.microsoft.com/en-us/windows/wsl/wsl2-faq#will-wsl-2-be-able-to-use-networking-applications" rel = "noreferrer"> В документации Microsoft по WSL2 архитектура WSL2 использует виртуализированные сетевые компоненты. Это означает, что WSL2 имеет IP-адрес, отличный от IP-адреса хост-машины. Это объясняет, почему настройки пересылки X11 WSL1 нельзя просто перенести на WSL2.

На странице Ubuntu Wiki о WSL вы уже можете найти конфигурацию, адаптированную для WSL2, в разделе Запуск графических приложений. Подобная конфигурация также предлагается вышеупомянутым пользователем Reddit, который также вносит свой вклад в другую часть решения: включить общий доступ на сервере X11 под Windows.

Это означает, что добавьте в свой ~/.bashrc следующее:

export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=1

И Включите общий доступ на своем сервере X11 для Windows. *

Самая важная часть для включения перенаправления X11 для WSL2 в Windows 10 по-прежнему отсутствует: брандмауэр Windows блокирует подключения через сетевой интерфейс, настроенный для WSL по умолчанию.
Отдельное правило для входящих подключений для TCP-порт 6000 необходим для доступа WSL к X-серверу. После создания правила, как описано в wsl-windows-toolbar- launcher люди, диапазон IP-адресов может быть ограничен подсетью WSL в настройках вновь созданного правила в разделе Область: 172.16.0.0/12.

*: Если вы используете VcXSrv, вы можете включить публичный доступ для своего X-сервера, отключив Контроль доступа в Дополнительной Настройки:
 Отключить контроль доступа VcXSrv
Или вызвав vcxsrv.exe напрямую с ac флагом: vcxsrv.exe -ac, как указано ameeno о проблеме с github.

person whme    schedule 08.04.2020
comment
Я только что проверил ваше решение. Даже с установленным флагом «Отключить контроль доступа» мне пришлось разрешить общий доступ через Защитник Windows (Разрешить приложениям обмениваться данными через брандмауэр Защитника Windows). Однако мне не пришлось добавлять дополнительное правило для входящих подключений. - person stedes; 31.05.2020
comment
@stedes Следует добавить дополнительное правило для входящего трафика, чтобы не разрешать доступ для всех общедоступных сетей, поскольку это может вызвать проблемы с безопасностью. - person whme; 02.06.2020
comment
@ Сорен, что именно не работает? Если бы вы могли предоставить дополнительную информацию, я мог бы вам помочь. - person whme; 26.06.2020
comment
Я внес небольшие изменения, и все заработало. Сначала я использовал MobaXterm вместо VcXSrv, поскольку он кажется более надежным с точки зрения межсетевого экрана. Во-вторых, я использовал следующие экспортированные переменные ENV. Ключевое отличие в том, что я не полагаюсь на /etc/resolv.conf. export DISPLAY=$(ip route | awk '/default via / {print $3; exit}' 2>/dev/null):0 export LIBGL_ALWAYS_INDIRECT=1 - person Adam; 27.06.2020
comment
Я думаю, что IP в любом случае сейчас 172.17.0.1. - person dan1st; 04.07.2020
comment
@ dan1st Привет, не могли бы вы указать URL-адрес, откуда у вас есть эта информация? - person whme; 05.07.2020
comment
Я только что видел это на своем устройстве, но не проверял. - person dan1st; 06.07.2020
comment
На самом деле я провел небольшое исследование и в любом случае не смог найти ничего о том, что IP-адрес wsl2 является 172.17.0.1. Я также регулярно проверял IP-адрес моего wsl2, который действительно иногда является вышеупомянутым, но также довольно часто бывает другим. Так что НЕТ, IP в любом случае НЕ 172.17.0.1. - person whme; 07.07.2020
comment
Внутренний брандмауэр - это проблема, отсутствующая во многих других онлайн-дискуссиях по этому поводу. Спасибо, включив в ваше решение. - person Chad Feller; 21.07.2020
comment
@NicolasBrauer При использовании / nameserver какое имя сервера мы должны добавить? - person Mirte; 26.07.2020
comment
@Mirte, я не совсем понимаю, о чем вы. Вам не нужно ничего добавлять, просто включите экспорт в ~/.bashrc как есть. - person whme; 27.07.2020
comment
@NicolasBrauer - Спасибо, я понял, но в то время думал, что сервер имен заменяет имя сервера пользователей (и поэтому его пришлось заменить). - person Mirte; 07.08.2020
comment
Для Xming мне пришлось отключить контроль доступа с помощью XLaunch (источник: lanforge. wordpress.com/2018/04/06/setting-up-xming) в противном случае я продолжал получать «Протокол не указан» и «Ошибка: не удается открыть дисплей». - person Abid H. Mujtaba; 12.08.2020
comment
Чтобы еще больше усилить брандмауэр, я установил для параметра «Область действия» во входящем правиле (брандмауэр Защитника Windows) значение 172.23.0.0/16 (IP-адрес моего /etc/resolv.conf) в как локальных, так и в удаленных настройках IP-адреса. - person Abid H. Mujtaba; 12.08.2020
comment
172.23.0.0/11 требуется. Я терял вкл / выкл соединение между перезагрузками, оказалось, что WSL2 также выделяет в диапазоне / 11. - person dza; 06.09.2020
comment
Мой /etc/resolv.conf содержит несколько записей о сервере имен, ни одна из которых не является моим текущим IP-адресом, поэтому это не работает. Похоже, есть предположения о том, как это работает. - person Thorbjørn Ravn Andersen; 09.09.2020
comment
Команда awk на этой странице для помещения IP-адреса хоста в переменную DISPLAY мне не подходит. Что работает export DISPLAY=127.0.0.1:0. Конечно, для этого требуется работающее устройство обратной петли. Интересно, почему так много ответов пытаются выяснить IP-адрес хоста, когда есть такое простое решение? - person bselu; 10.11.2020
comment
Зачем использовать awk, если sed достаточно: sed -n 's/nameserver //p' /etc/resolv.conf | head -n 1 - person Sandburg; 11.01.2021
comment
Для авторизации вы также можете сгенерировать ~/.Xauthority файл, запустив xauth generate $DISPLAY . в WSL, пока VcXsrv работает с отключенным контролем авторизации (-ac). Затем выполните cp ~/.Xauthority /mnt/c/Users/<your login>/, и в следующий раз, когда вы запустите VcXsrv, используйте параметр -auth C:\Users\<your login>\.Xauthority вместо -ac - person Arseny; 07.02.2021

Для некоторых людей, которые разрешили только частные сети, такие как я,

хотя они должны были быть отмечены флажком

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

На брандмауэре Защитника Windows должны быть знаки остановки.

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

Дважды щелкните по нему и разрешите подключение как для частного, так и для общедоступного,

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

Таким образом, все 4 пункта должны быть отмечены зеленым.

Тогда приведенный выше ответ от @NicolasBrauer работал на меня.

Например, отключение контроля доступа при запуске XLaunch и

export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=1
person Kennyhyun    schedule 30.07.2020

Использование /etc/resolv.conf сервера имен не сработает для меня, поскольку я отключил resolv.conf генерацию в /etc/wsl.conf (у меня есть собственный resolv.conf).

В конечном итоге вам нужен IP-адрес хоста WSL2, который также должен быть вашим маршрутом по умолчанию. Вот моя ~/.bashrc запись для моего дистрибутива Debian WSL2:

export DISPLAY=$(ip route | awk '/^default/{print $3; exit}'):0
person Joel Po    schedule 25.07.2020
comment
IP-маршрут | wc -l 151 как это должно работать? или другими словами: какой маршрут мы ищем. одиночный маршрут в наши дни - редкость .... - person U.V.; 28.10.2020
comment
Я люблю вас! спасатель - person Guillaume Perrault-Archambault; 01.11.2020

Скопировал мой ответ из этой проблемы с github.

Идея состоит в том, чтобы использовать возможность общаться через stdio.

Предварительное условие

  • Чтобы мы могли использовать socat на хосте Windows, вам понадобится дистрибутив с WSL1. Я уверен, что вы можете сделать это в PowerShell, но у меня не было времени исследовать это. Может быть, кто-нибудь сможет написать перенаправитель stdio- ›tcp в PowerShell, тогда нам не понадобится 2 дистрибутива WSL.

Как перенаправить соединение с X-сервером

  1. Пусть ваш любимый X-сервер работает в Windows. По умолчанию они будут слушать порт 6000.
  2. В дистрибутиве WSL2 выполните следующую команду в фоновом режиме (ubuntu - это имя дистрибутива WSL1 с установленным socat):
mkdir -p /tmp/.X11-unix/
socat UNIX-LISTEN:/tmp/.X11-unix/X0,fork EXEC:"/mnt/c/Windows/System32/wsl.exe -d Ubuntu socat - TCP\:localhost\:6000"

По сути, это устанавливает туннель из обычного сокета домена X unix в порт 6000 хоста.

Как перенаправить любое TCP-соединение обратно на хост

Предположим, что на порту 5555 в Windows запущена служба TCP. В дистрибутиве WSL2 выполните следующую команду в фоновом режиме (ubuntu - это имя дистрибутива WSL1 с установленным socat):

socat TCP-LISTEN:5555,fork EXEC:"/mnt/c/Windows/System32/wsl.exe -d ubuntu socat - TCP\:localhost\:5555"

Как перенаправить любое TCP-соединение с хоста на WSL2

Это просто то же самое, но в противоположном направлении. В своем дистрибутиве WSL1 вы можете запустить следующее:

socat TCP-LISTEN:5555,fork EXEC:"/mnt/c/Windows/System32/wsl.exe -d ubuntuwsl2 socat - TCP\:localhost\:5555"

Представление

На моем ПК он может обрабатывать до 150 МБ / с данных, поэтому он не самый быстрый, но достаточно быстрый для большинства приложений.

person wbkang    schedule 22.08.2020
comment
АГА! вот путь. Я добавил его в свой сценарий startx: #! / Bin / bash # запустить Xming X11, если он не запущен if /mnt/c/Windows/System32/tasklist.exe | grep -q Xming.exe; затем echo найдено X server else echo не найдено Xserver - запускаем его / mnt / c / Program \ Files \ (x86) /Xming/XLaunch.exe -run '\ Users \ user \ Desktop \ config.xlaunch' & # также запускаем канал X11 mkdir -p /tmp/.X11-unix/ socat UNIX-LISTEN: /tmp/.X11-unix/X0,fork EXEC: /mnt/c/Windows/System32/wsl.exe -d Ubuntu-18.04 socat - TCP \: localhost \: 6000 & echo wait a sec sleep 1 fi - person U.V.; 27.11.2020

Я придумал решение, используя vxcsrv в Windows 10, как указывали другие.

Вот пошаговое руководство:

XServer Windows - WSL2 (Ubuntu):

Установить X-Server Windows

https://sourceforge.net/projects/vcxsrv/

Установить отображение вперед в WSL Distro

export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=1

sudo apt update
sudo apt install x11-apps

Запустите XLaunch в Windows

  • Несколько окон
  • Не запускать клиента
  • отключить собственный opengl
  • включить Отключить контроль доступа

Попробуй это

В wsl: введите xcalc - Калькулятор должен открыться в Windows10

Добавить в автозапуск

  1. Диалоговое окно "Выполнить" см. "Запуск XLaunch" в Windows
  2. Сохранить конфигурацию
  3. Нажмите Windows + R
  4. Введите: оболочка: запуск
  5. Скопируйте сохраненную конфигурацию: * .launch (созданную на шаге 2) в эту папку (шаг 4)

Теперь XServer будет запущен с запуском Windows.

Я использую его для ROS. Работает для меня.

Мой XServer недоступен через Интернет, поэтому можно отключить контроль доступа.

person kraego    schedule 15.03.2021
comment
Хотя эта ссылка может дать ответ на вопрос, лучше включить сюда основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными, если ссылка на страницу изменится. - person Yoni; 16.03.2021

Тем, кто может работать с механизмами моделирования, такими как ROS / Gazebo, Unity и т. Д., Необходима другая конфигурация.

Добавьте их в ~/.bashrc:

export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=0

Обязательно включите и общий доступ, и частный доступ для вашего сервера X11 в Windows. Также отключите любой контроль доступа, поддерживаемый вашим сервером X11.

Если вы используете VcXSrv, снимите флажок Собственный opengl. Окончательная конфигурация VcXSrv будет такой:

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

Альтернативными хорошими серверами X11 с меньшими трудностями являются X410 и MobaXterm. Дополнительные сведения об этой конфигурации см. здесь и здесь.

person Kamran Kia    schedule 19.07.2020

Как настроить пересылку X11 в WSL2

В этом ответе предполагается, что у вас уже есть рабочая конфигурация XServer и PulseAudio, запущенная на вашем хосте Windows, поскольку вы уже использовали WSL1. (Вам также может потребоваться добавить параметр -ac в командную строку, чтобы выбранный вами XServer работал с WSL2.)

То, как я это делаю, и чтобы убедиться, что я получаю пересылку X11 независимо от того, использую ли я статический IP-адрес или DHCP на хосте Windows, или даже меняю ли мое имя хоста или сетевое расположение, я добавляю следующее в свой ~ / .bashrc файл:

# Get the IP Address of the Windows 10 Host and use it in Environment.
HOST_IP=$(host `hostname` | grep -oP '(\s)\d+(\.\d+){3}' | tail -1 | awk '{ print $NF }' | tr -d '\r')
export LIBGL_ALWAYS_INDIRECT=1
export DISPLAY=$HOST_IP:0.0
export NO_AT_BRIDGE=1
export PULSE_SERVER=tcp:$HOST_IP

После выполнения вышеуказанного, независимо от того, какое у меня имя хоста или IP-адрес хоста, он будет помещаться в среду каждый раз, когда сеанс BASH запускается в WSL2. Проверьте это, запустив firefox из командной строки и просмотрите видео на YouTube. Вы должны слышать звук, а также видеть само приложение для просмотра видео. Протестируйте, дополнительно запустив другие приложения с графическим интерфейсом из командной строки.

Что он делает: он использует команду хоста для извлечения IPv4-адресов, связанных с именем хоста, из выходных данных, выполняет поиск адреса, который соответствует строке, содержащей IPv4-адрес вашего хоста Windows, удаляет остальную информацию, кроме IP-адреса, и затем пробуждает это и печатает в переменной с обрезанным выводом. Затем он используется для предоставления необходимого IP-адреса в виде строки для использования в переменных среды, которые позволяют пересылать X11 и вывод звука.

Надеюсь, это сработает для вас, если другие методы не работают для вас (как и для меня).

Большинство приложений CLI можно запускать либо из командной строки BASH, либо из терминала Windows. Если вы хотите создать ярлык, большинство приложений CLI можно настроить, как в любом из следующих примеров (в таких случаях нет необходимости в перенаправлении X11, кроме приложений, таких как Links2):

C:\Windows\System32\wsl.exe -e htop
C:\Windows\System32\wsl.exe lynx

Если вы хотите создать ярлыки на рабочем столе для приложений с графическим интерфейсом Linux, если вы не можете получить переменные среды из файла ~ / .bashrc, которые будут использоваться перед запуском программ, вам придется создать ярлыки, используя следующий шаблон, и указать имя программы вместо {yourprogram}:

C:\Windows\System32\wsl.exe LIBGL_ALWAYS_INDIRECT=Yes IP=$(host `hostname` | grep -oP '(\s)\d+(\.\d+){3}' | tail -1 | awk '{ print $NF }' | tr -d '\r') DISPLAY=$IP:0.0 PULSE_SERVER=tcp:$IP {yourprogram}

Для многих программ необязательно размещать полную командную строку. Для программ на основе PERL или программ на основе Python вам иногда придется добавить путь к PERL и PYTHON, а также полный путь к вашей программе, чтобы запускать такие программы с графическим интерфейсом пользователя в Linux с использованием WSL2. Для одной из моих программ на Perl я должен сделать это так:

C:\Windows\System32\wsl.exe IP=$(host `hostname` | grep -oP '(\s)\d+(\.\d+){3}' | tail -1 | awk '{ print $NF }' | tr -d '\r') ; export LIBGL_ALWAYS_INDIRECT=Yes export DISPLAY=$IP:0.0 ; cd /mnt/c/Users/{yourusername}/Desktop ; /usr/bin/perl ~/wget-gui.pl

Возможно, вам придется немного поэкспериментировать, чтобы некоторые приложения работали правильно. Например, вам может потребоваться запустить приложение с помощью dbus, и вам нужно будет добавить эту команду в ярлык непосредственно перед именем программы.

C:\Windows\System32\wsl.exe LIBGL_ALWAYS_INDIRECT=Yes IP=$(host `hostname` | grep -oP '(\s)\d+(\.\d+){3}' | tail -1 | awk '{ print $NF }' | tr -d '\r') DISPLAY=$IP:0.0 PULSE_SERVER=tcp:$IP dbus-launch --exit-with-session gedit

И в некоторых случаях вам, возможно, придется использовать более короткое имя переменной. Некоторые приложения просто не будут работать, если вообще будут работать, но со временем ситуация улучшается. Кроме того, не пытайтесь запускать указанное выше из командной строки Windows или PowerShell. Он будет выдавать ошибки о том, что grep не распознается как внутренняя или внешняя команда и т. Д.

Ниже приведен снимок экрана нескольких приложений с графическим интерфейсом пользователя Linux, работающих в моей системе Windows 10, с работающей пересылкой X11 на WSL2.

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

person D. Charles Pyle    schedule 05.01.2021
comment
Наконец-то! Это единственное решение, которое помогло, все перепробовал. Просто скопируйте / вставьте первый блок команд и вуаля! Спасибо! - person user2828781; 08.03.2021
comment
Пожалуйста! Рад, что это работает на вас. Он добавляет секунду или две на обработку, но это небольшая цена за рабочую конфигурацию, не зависящую от IP-адреса. - person D. Charles Pyle; 10.03.2021

Я не знаю, относится ли это к моей конфигурации, но эти решения не работают на моем компьютере. Они возвращают адрес 192.168.0.254, который является моим шлюзом, а не моим главным компьютером.

Чтобы заставить его работать, мне пришлось использовать на моем Ubuntu / WSL2 следующее:

export DISPLAY="`ip -4 address | grep -A1 eth0 | grep inet | cut -d' ' -f6 | cut -d/ -f1`:0"
person William Oocarz    schedule 30.06.2020

Вы можете подключиться к X-серверу, не отключая контроль доступа на сервере. Вы используете xauth на сервере для создания файла cookie, а затем загружаете его в Linux с помощью xauth на стороне Linux. Вы можете получить IP-адрес сервера из /etc/resolv.conf. В моем .bashrc есть следующее:

k=$('/mnt/c/Program Files/VcXsrv/xauth.exe' -f 'C:\Users\xxx\Documents\scratch.xauth' -i -n -q 2>/dev/null <<EOF
generate localhost:0 . trusted timeout 604800
list
quit
EOF
)
if [ -n "$k" ]
then
        export DISPLAY=$(sed '/^nameserver/ {s/^nameserver\s\s*\([0-9][0-9.]*\)[^0-9.]*$/\1/;p;};d' /etc/resolv.conf):0
        xauth -q add $DISPLAY . ${k##* }
        export LIBGL_ALWAYS_INDIRECT=true
fi
unset k
person J. Scott Berg    schedule 13.01.2021
comment
Для Cygwin/X мне не нужно было создавать файл cookie, вместо этого я использовал k=$(/mnt/c/cygwin64/rootfs/bin/sh.exe -c '/bin/xauth -n list'|grep "^$DISPLAY") для получения существующего файла cookie. Я переместил строку export DISPLAY=... над этой строкой. Мне также нужно было добавить .xserverrc файл, содержащий exec /usr/bin/XWin -listen tcp "$@", в домашний каталог cygwin (echo 'exec /usr/bin/XWin -listen tcp "$@"' >> ~/.xserverrc в cygwin), чтобы включить tcp-доступ для сервера cygwin x. - person T S; 13.02.2021
comment
@TS, можете ли вы подробнее рассказать, как вы заставили Cygwin / X работать с WSL2 в качестве нового ответа? У меня работает VcXsrv, но я слышал, что Cygwin / X может решить некоторые из моих графических сбоев. К сожалению, мне не удалось запустить какие-либо приложения с графическим интерфейсом из терминала WSL2. - person user3534080; 24.06.2021
comment
Спасибо, что написали, как это правильно сделать. Все остальные ответы довольно опасны, поскольку X-сервер, который разрешает неаутентифицированные соединения, позволит не только причинить вред но также упрощает подключение кейлоггера - просто сделайте xinput list, чтобы получить идентификатор клавиатуры, затем xinput test <n>, чтобы увидеть все ключевые события. - person andrewdotn; 10.07.2021

Решение от https://github.com/microsoft/WSL/issues/4793#issuecomment-588321333 использует VcXsrv в качестве X-сервера, и именно здесь я получаю этот ответ (слегка отредактированный для удобства чтения). Обратите внимание, что оригинал обновляется его автором, поэтому не забудьте перепроверить.

Чтобы это работало:

  1. В Windows измените E:\VcXsrv на место установки и сохраните его как xxx.bat в папке автозагрузки Windows, например, C:\Users\Me\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup, и вы можете запустить его при загрузке, если хотите:
@ECHO OFF

REM Start WSL once to create WSL network interface
wsl exit

REM Find IP for WSL network interface
SET WSL_IF_IP=
CALL :GetIp "vEthernet (WSL)" WSL_IF_IP
ECHO WSL_IF_IP=%WSL_IF_IP%
setx "WSL_IF_IP" "%WSL_IF_IP%"
setx "WSLENV" "WSL_IF_IP/u"

REM Change E:\VcXsrv to your VcXsrv installation folder
START /D "E:\VcXsrv" /B vcxsrv.exe -multiwindow -clipboard -nowgl -ac -displayfd 720
GOTO :EOF



:GetIp ( aInterface , aIp )
(
    SETLOCAL EnableExtensions EnableDelayedExpansion
    FOR /f "tokens=3 delims=: " %%i IN ('netsh interface ip show address "%~1" ^| findstr IP') DO (
        SET RET=%%i
    )
)
(
    ENDLOCAL
    SET "%~2=%RET%"
    EXIT /B
)
  1. В WSL отредактируйте файл ~ / .bashrc, чтобы добавить следующие строки:
export DISPLAY=$WSL_IF_IP:0
unset LIBGL_ALWAYS_INDIRECT

Вот и все, чтобы WSL2 работал автоматически. Идея состоит в том, чтобы получить частный IP-адрес интерфейса WSL в Windows и использовать переменную среды для передачи его в WSL. Затем WSL обновляет этот IP-адрес локальной сети на ДИСПЛЕЙ для подключения к X-серверу.

Буфер обмена тоже хорошо работает с этой настройкой. Я тестировал это с установкой WSL2 Ubuntu 20.04 LTS.

person Fuhrmanator    schedule 27.11.2020
comment
Пожалуйста, не отключайте брандмауэр полностью для интерфейса wsl. - person whme; 29.11.2020
comment
@whme Думаю, я удалил эту часть. - person Fuhrmanator; 29.11.2020
comment
Большое спасибо, пробовал еще несколько вещей, но возникли проблемы, все работает нормально! - person Antoine Bon; 02.12.2020

Я использовал следующий bash для настройки отображения:

export DISPLAY=$(powershell.exe -c ipconfig | grep -A4 WSL | tail -1 | awk '{ print $NF }' | tr -d '\r'):0
person Kryoel    schedule 10.10.2020
comment
В WSL2 это дает неправильный IP-адрес для X-сервера. Прекрасно работает в WSL1, но не в моей конфигурации WSL2. При использовании WSL2 вы не хотите перенаправлять X11 на IP-адрес работающего экземпляра WSL. Он работает на хосте Windows, поэтому вам нужен IP-адрес хоста, а не WSL-адрес. Это работает в WSL 2 для любого IP-адреса: export DISPLAY = $ (host hostname | grep -oP '(\ s) \ d + (\. \ D +) {3}' | tail -1 | awk '{print $ NF } '| tr -d' \ r ') - person D. Charles Pyle; 10.02.2021

Я бы предпочел настроить ssh-сервер в гостевой системе, установить сервер X11, такой как Xming, на хосте и подключиться к localhost через замазку с пересылкой X11. Не нужно возиться с правилами брандмауэра, IP-адрес хоста не требуется.

person user1016438    schedule 10.10.2020

Я не уверен, почему, но ни один из приведенных выше ответов не помог мне. Я использую ROG Zephyrus с графикой AMD и Nvidia, которая, я уверен, вызвала проблемы.

Настройки брандмауэра, описанные whme, важны, но переменные среды linux у меня не работали. У меня было несколько записей в файле конфигурации, помеченных как сервер имен, не разрешенные соединения.

В итоге я настроил их на:

export DISPLAY=$HOSTNAME:0.0
export LIBGL_ALWAYS_INDIRECT=

Я использую VcXsrv в качестве X-сервера. Мне также пришлось установить параметры на -nowgl

person Samuel Norman    schedule 27.10.2020
comment
К сожалению, мне не удается запустить git citools - person gute Fee; 20.11.2020
comment
$ HOSTNAME в конечном итоге разрешается в WSL2 как 127.0.0.1, и поскольку сеть виртуализирована, это не локальный хост хоста Windows, это локальный хост экземпляра wsl2, в котором сервер X11 не отображается. - person ThoSil; 20.11.2020

Я не хочу связываться с публичным доступом к X-серверу и брандмауэру Windows. Мое решение использует ssh с пересылкой X (также работает для VirtualBox). Кроме того, WSL автоматически перенаправляет с хоста на гостевые прослушивающие сокеты, поэтому мне все равно, какой IP фактически назначен гостю.

Итак, шаги следующие:

  1. Установите VcXSrv. Запустите его со всеми значениями по умолчанию, но установите для параметра Display number значение 0 (-1 выберет 0, если ни один экземпляр X не запущен). Не запускайте в нем никаких клиентов (это дает преимущество, заключающееся в том, что вы можете запускать больше приложений на одном экземпляре X-сервера).
  2. Откройте WSL и настройте ssh-сервер. Для меня это просто sudo service ssh start. Создайте ярлык Windows с командной строкой: wsl sudo service ssh start.
  3. Установите Git для Windows. На самом деле я использую его только потому, что его версия ssh может работать в фоновом режиме с ssh -f. Версия ssh для Windows содержит ошибки с этой функцией, в остальном она подходит без перехода в фоновый режим или с ssh -n.
  4. Настройте вход без пароля из Git-Bash для гостя. ssh [email protected] должен работать на этом этапе, потому что порт хоста перенаправлен гостю.
  5. Убедитесь, что перенаправление X работает из Git-Bash: DISPLAY=127.0.0.1:0 ssh -Y [email protected] xeyes. Я думаю, что xeyes устанавливается с каждым дистрибутивом X.
  6. Установите в WSL файловый менеджер или терминал по вашему выбору. Например, pcmanfm. Создайте ярлык Windows: "C:\Program Files\Git\git-bash.exe" -c "DISPLAY=127.0.0.1:0 ssh -Y -f [email protected] 'bash -l -c pcmanfm >/dev/null 2>&1'". Здесь флаг bash -l помогает настроить среду, которая может быть важна или не важна в зависимости от запускаемых вами приложений.

Конечно, я могу сделать то же самое без git-bash, используя встроенный ssh-клиент VcXSrv, но для этого требуется преобразование ssh-ключей в формат PuTTY, а git-bash у меня уже установлен. Кроме того, у меня не работало повторное использование дисплея со встроенным клиентом.

person Konstantin Pelepelin    schedule 25.02.2021

Мне удалось поработать с готовой конфигурацией брандмауэра VcXsrv (то есть, нет необходимости переопределять / отключать какие-либо правила брандмауэра), используя IP-адрес сетевого адаптера хоста Windows. Добавил ниже в мой ~/.bash_aliases

export DISPLAY=$(pwsh.exe -c ipconfig | grep -A 3 lan | grep IPv4 | head -1 | awk '{ print $NF }'):0

где lan - мой DNS-суффикс для конкретного соединения (ваш может отличаться, и в этом случае вам следует заменить его в командной строке выше).

person Uri    schedule 09.09.2020
comment
.bash_aliases следует использовать для ... псевдонима, а не для экспорта переменных. И вы запускаете команду в окнах из wsl2, чтобы получить вывод ipconfig, передать его в 2 grep, одну голову и одну awk ... и каждый раз, когда вы открыть оболочку. Один только pwsh.exe на моем ноутбуке запускается за 1,125 секунды! - person ThoSil; 20.11.2020
comment
К сожалению, у меня это не работает по двум причинам. В моей системе нет pwsh.exe. Я предполагаю, что вы имели в виду powershell.exe или какой-то псевдоним в вашей системе Windows. Вывод при использовании powershell.exe в моей системе выглядит следующим образом:: 02.168.0.5. Это, конечно, не сработает, поскольку это только часть адреса, а порядок строк по какой-то причине меняется. - person D. Charles Pyle; 05.01.2021

Я обнаружил, что есть официальный документ по Ubuntu, который является исчерпывающим для вашей справки. Как мы знаем, этот совет будет работать и в Debian / WSL2. https://wiki.ubuntu.com/WSL

Спасибо за Кеннихена и других людей. Все они так или иначе работают на моем компьютере, чтобы включить сервер X11 на WSL2, размещенном в Windows10. Поскольку WSL2 как виртуальная машина больше не является той же инфраструктурой, что и WSL1. Мне потребовалось некоторое время, чтобы пройти через это.

person jiawei li    schedule 13.10.2020

Я нашел решение, которое сработало для меня, следующее: Установить графику на WSL2

1.      Start ssh service
1.1.   Open WSL
1.2.   Type: sudo service ssh start
2.      Get Windows (WSL net) IP
2.1.   Open Powershell
2.2.   Type: (ipconfig | Select-String -Pattern 'WSL' -Context 1, 5).Context.PostContext | Select-String -Pattern 'IPv4'
2.3.   Get the received IP
3.      Set environment variable
3.1.   In WSL2 terminal type: export DISPLAY=172.23.64.1:0.0 with the IP of the windows entity (2.3) instead of the place holder
4.      Launch Xming
4.1.   Open Xlaunch and go with the defaults In Specify parameter settings: Check No Access Control
5.      Good luck!

По следующей ссылке: https://docs.google.com/document/d/1g3vjc5cd3c8c8c7c8c8c8c8c8c8c8c8c8c8c8c8c8c5

person neikel    schedule 17.11.2020

Вот две статьи, которые я написал, в которых рассказывается о настройке x11 для различных типов использования:

  1. Установить Программа с графическим пользовательским интерфейсом в WSL2: в этой статье рассказывается об установке vcxsrv, добавлении переменных среды в файл конфигурации bashrc и программном планировании запуска vcxsrv с параметрами командной строки при запуске. Он также охватывает установку и запуск Firefox как отдельной программы в WSL2.
  2. Установить Ubuntu Рабочий стол с графическим пользовательским интерфейсом в WSL2 В этой статье рассматривается установка vcxsrv, dotNet, genie и рабочего стола Ubuntu. Он охватывает создание сценариев, которые экспортируют переменные среды, запускают vcxsrv, запускают среду рабочего стола gnome и создают ярлык, который связывает их все вместе. Он также охватывает запуск рабочего стола Ubuntu, предотвращение ошибки блокировки экрана и установку Snap Store.
person TheAltruist    schedule 12.12.2020
comment
Исправлено, спасибо @HectorJ - person TheAltruist; 19.12.2020

Моя ошибка заключалась в том, что я взял сервер имен своего экземпляра linux wsl2, в то время как мой xserver работает в Windows. Значит, в переменной DISPLAY должен быть установлен мой адрес ipv4 в Windows. Просто введите ipconfig в powershell или cmd и используйте ipv4 ethernet address.

person FishingIsLife    schedule 24.03.2021

Я также столкнулся с трудностями при открытии графических интерфейсов X11 из WSL.

У меня была проблема с определением правильного IP-адреса, и иногда сервер X11 принимал странные смещения, которые иногда появлялись как случайные на 0-17.

Я написал следующий сценарий для автоматизации этой проблемы, но у него мало зависимостей:

  • Это было протестировано и запущено под образом CentOS7.
  • установите X11-apps в дистрибутив Linux, чтобы иметь `xset
  • установить приложение тайм-аута
  • Выполнить скрипт до source ./find_display_ip.sh. обратите внимание на источник! Вам понадобится переменная среды DISPLAY в вашей запущенной оболочке.
  • Запускайте сценарий только через Терминал Windows или что-то, что включает Windows PATH внутри оболочки WSL. Например, раньше это не было по умолчанию для меня в приглашении Windows `cmd.
  • Очевидно, убедитесь, что ваш сервер X11 имеет полный доступ (удаленный доступ xhost + или X11 полный)

Без лишних слов, это исходный код скрипта:

#!/bin/bash

start_index=$1
start=${start_index:-0}
# check current settings
declare -i stop=0
if [ ! -z "$DISPLAY" ]; then
    timeout 1s xset -display $DISPLAY q &> /dev/null;
    [[ "$?" -eq 0 ]] && echo "Already Set to $DISPLAY" && stop=1;
fi

# scan displays 0-17
for port in $(seq $start 17);
do
    [[ 1 -eq $stop ]] && break;
    grp="ipconfig.exe | grep IPv4 | tr -d '\015' | sed 's#.*: \(.*\)\$#\1:${port}.0#;'"
    for ipd in $(eval $grp)
    do
        echo Trying $ipd;
        timeout 1s xset -display $ipd q &> /dev/null;

        # command was sucessful
        [[ "$?" -eq 0 ]] && export DISPLAY=$ipd && echo $ipd was set && stop=1;

        ##echo "Trying next IP...";
    done
done
person Aviv    schedule 11.06.2021

Для меня работает следующий обходной путь:

Set-NetFirewallProfile -Name $ (Get-NetConnectionProfile) .NetworkCategory -DisabledInterfaceAliases $ (Get-NetAdapter | Where-Object Name-like 'WSL'). Name

person Zosoabi    schedule 06.10.2020
comment
Вы полностью отключаете брандмауэр для сетевого адаптера wsl. Это угроза безопасности, и ее следует избегать. - person whme; 06.10.2020

Ничего не делать и терпеливо ждать следующей версии windows :)

https://devblogs.microsoft.com/commandline/the-initial-preview-of-gui-app-support-is-now-available-for-the-windows-subsystem-for-linux-2/

person Aviv    schedule 11.06.2021