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

Ответы (23)

TL; DR:

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

экспорт DISPLAY = $ (awk '/ nameserver / {print $ 2; exit}' /etc/resolv.conf 2> / dev / null): 0
экспорт LIBGL_ALWAYS_INDIRECT = 1

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

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


Как указано в WSL_subreddit_mod на reddit и, как вы можете прочитать в документации Microsoft по WSL2, архитектура WSL2 использует виртуализированные сетевые компоненты. Это означает, что WSL2 имеет IP-адрес, отличный от IP-адреса хост-машины. Это объясняет, почему настройки пересылки X11 WSL1 не могут быть просто перенесены в WSL2.

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

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

экспорт DISPLAY = $ (awk '/ nameserver / {print $ 2; exit}' /etc/resolv.conf 2> / dev / null): 0
экспорт 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-сервера, отключив контроль доступа в дополнительных настройках:
Disable access control VcXSrv
Или позвонив vcxsrv.exe напрямую с флагом ac: vcxsrv.exe -ac, как указано ameeno в проблеме с github .

В качестве альтернативы этот ответ SO показывает, как делиться ключами через файлы .Xauthority, оставляя вам нетронутый контроль доступа.

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

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

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

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

Позвольте мне вкратце добавить, как сделать так, чтобы приложение отображалось на WSL2.

  1. запустить ip route на терминале WLS2.

    IP-маршрут по умолчанию через a.b.c.1 dev eth0 a.b.c.0 / 20 dev eth0 proto ссылка на область видимости ядра src x.x.x.x

  2. добавьте этот IP-адрес "dev eth0" в "export $ DISPLAY ="

    экспорт $ DISPLAY = a.b.c.1: 0.0

  3. Запустить сервер xming. Затем вы можете запустить приложение, работающее на WSL2 Linux. Но для X11 вам может потребоваться следовать документу из Ubuntu.

Скопировал мой ответ из этого выпуска 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 МБ / с данных, поэтому он не самый быстрый, но достаточно быстрый для большинства приложений.

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

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

enter image description here

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

enter image description here

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

enter image description here

So all the 4 items should be ticked green.

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

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

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

Я нашел следующее решение, которое сработало для меня: Установить графику на 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/1ao3vjbC3lCDc9kvybOT5PbuGhC4_k4g8LCjxX23VX7E

Как настроить пересылку 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. Вы должны иметь возможность слышать звук, а также видеть само приложение для просмотра видео. Протестируйте, дополнительно запустив другие приложения с графическим интерфейсом из командной строки.

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

enter image description here

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

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

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

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

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

#!/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

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

XServer Windows - WSL1 и WSL2:

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

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

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

Настроить дисплей:

  • If you running WSL1:
экспорт LIBGL_ALWAYS_INDIRECT = 1
экспорт DISPLAY = localhost: 0
  • Если вы используете WSL2:
экспорт LIBGL_ALWAYS_INDIRECT = 1
экспорт DISPLAY = $ (awk '/ nameserver / {print $ 2; exit}' /etc/resolv.conf 2> / dev / null): 0

а затем (установить x11-apps):

sudo apt update
sudo apt установить x11-apps

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

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

Протестируйте

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

Если все заработало

И вы хотите сохранить настройки в вашем wsl-дистрибутиве. Сохраните их в вашем ~ / .bashrc.

sudo nano ~ / .bashrc

Скопируйте две строки (из Установить отображение вперед в WSL Distro - Настроить отображение), два конца и сохраните его.

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

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

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

Использую для ROS. У меня работает.

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

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

Вы можете подключиться к 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 <

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

export DISPLAY=$(powershell.exe -c ipconfig | grep -A4 WSL | tail -1 | awk '{ print $NF }' | tr -d '\r'):0

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

• 100001 Добавил ниже к моему ~ / .bash_aliases

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

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

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

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

export DISPLAY=$(ip route | awk '/^default/{print $3; exit}'):0

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

  1. Установка программы с графическим интерфейсом пользователя в WSL2: в этой статье рассказывается об установке vcxsrv, добавлении переменных среды в файл конфигурации bashrc и программном планировании запуска vcxsrv с параметрами командной строки при запуске . В нем также описывается установка и запуск Firefox как отдельной программы в WSL2.
  2. Установка рабочего стола Ubuntu с графическим пользовательским интерфейсом в WSL2 В этой статье рассматривается установка vcxsrv, dotNet, genie и рабочего стола Ubuntu. Он охватывает создание сценариев, которые экспортируют переменные среды, запускают vcxsrv, запускают среду рабочего стола gnome и создают ярлык, который связывает их все вместе. Он также охватывает запуск рабочего стола Ubuntu, предотвращение ошибки блокировки экрана и установку Snap Store.

Решение от 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 Запустите WSL один раз, чтобы создать сетевой интерфейс WSL
wsl выход

REM Найти IP для сетевого интерфейса WSL
УСТАНОВИТЬ WSL_IF_IP =
ЗВОНИТЕ: 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 Измените E: \ VcXsrv в папку установки VcXsrv.
START / D "E: \ VcXsrv" / B vcxsrv.exe -multiwindow -clipboard -nowgl -ac -displayfd 720
GOTO: EOF



: GetIp (интерфейс, интерфейс)
(
    SETLOCAL EnableExtensions EnableDelayedExpansion
    FOR / f "tokens = 3 delims =:" %% i IN ('netsh interface ip show address "% ~ 1" ^ | findstr IP') DO (
        УСТАНОВИТЬ RET = %% i
    )
)
(
    ENDLOCAL
    УСТАНОВИТЬ "% ~ 2 =% RET%"
    ВЫХОД / B
)
  1. В WSL отредактируйте файл ~ / .bashrc, добавив следующие строки:
экспорт DISPLAY = $ WSL_IF_IP: 0
сбросить LIBGL_ALWAYS_INDIRECT

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

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

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

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

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

export DISPLAY=$HOSTNAME:0.0
export LIBGL_ALWAYS_INDIRECT=

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

Я не хочу связываться с публичным доступом к 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 user@127.0.0.1 должен работать на этом этапе, потому что порт хоста перенаправлен гостю.
  5. Убедитесь, что перенаправление X работает из Git-Bash: DISPLAY = 127.0.0.1: 0 ssh -Y user@127.0.0.1 xeyes. Я думаю, что xeyes устанавливается с каждым дистрибутивом X.
  6. Установите файловый менеджер или терминал по вашему выбору в WSL. Например, pcmanfm. Создайте ярлык Windows: "C: \ Program Files \ Git \ git-bash.exe" -c "DISPLAY = 127.0.0.1: 0 ssh -Y -f user@127.0.0.1 'bash -l -c pcmanfm> / dev / null 2> & 1 '". Здесь bash -l флаг помогает настроить среду, которая может быть важна или не важна в зависимости от запускаемых вами приложений.

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

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

To make it work I had to use the following on my Ubuntu/WSL2 :

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

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

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

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

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

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

enter image description here

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

2021 ответ для Windows 10

Отметьте этот ответ, если получение IP из resolv.conf не работает.

Найдите свой IP-адрес Windows, используя следующую команду в WSL2 (да, файл .exe внутри Linux):

ipconfig.exe 

Используйте команду ниже, чтобы настроить отображение (заполните ВАШ_IP_ADDRESS своим IP-адресом):

export DISPLAY=YOUR_IP_ADDRESS:0

Проверьте, правильно ли работает ваше приложение с графическим интерфейсом.

В каждом случае автоматизация может немного отличаться, но я приведу пример:

ipconfig.exe | grep 'IPv4 Address' | grep '10\.' | cut -d ":" -f 2 | cut -d " " -f 2 

Пояснение: Я нашел все адреса IPv4 (в моем случае 3 IP). Я знаю, что мой IP начинается только с «10». поэтому я выбрал эту строку, используя вторую команду grep. Затем я обработал всю строку, чтобы получить только IP.

2021 Ответ

Windows 11и Insider сборки Windows 10, начиная с 2021-04-27, включают WSLg. Это просто работает™.

Примечание. В настоящее время все версии Windows, поддерживающие WSLg, являются сборками Insider, которые обычно не рекомендуются для повседневного использования. Однако «WSLg станет общедоступным вместе с предстоящим выпуском Windows».

От https://github.com/microsoft/wslg (исходное объявление).

Предварительные требования:

  1. Убедитесь, что используется сборка Windows 10 Insider 21362 +
  2. Рекомендуется: Установить драйвер для vGPU: Intel AMD Nvidia

Приложение «Информация о системе» сообщит вам текущий номер сборки.

WSL1 несовместим с WSLg. Новые экземпляры WSL2 будут просто работать™.

Существующие системы WSL2 необходимо «обновить»:

  1. В административной оболочке PowerShell: wsl --update
  2. wsl --shutdown для принудительного перезапуска WSL

Не забудьте удалить любые другие модификации DISPLAY, которые вы могли внести.

Доказательство того, что это работает: Proof that it works

Хотя в официальных объявлениях говорится, что некоторые Insider сборки Windows 10 поддерживают WSLg, и это было продемонстрировано на Windows 10, в настоящее время не существует общедоступных Insider сборок Windows 10, которые поддерживают WSLg.

2022 WebDevInsider