При переходе с WSL1 на WSL2 многое меняется; очевидно, это относится и к пересылке X11.
Какие шаги мне нужно сделать, чтобы использовать пересылку X11 с WSL2 в Windows 10, как я сделал с WSL1?
Как настроить рабочую пересылку X11 на WSL2
Ответы (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.exe
напрямую с ac
флагом: vcxsrv.exe -ac
, как указано ameeno о проблеме с github.
export DISPLAY=$(ip route | awk '/default via / {print $3; exit}' 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=1
- person Adam; 27.06.2020
172.17.0.1
.
- person dan1st; 04.07.2020
172.17.0.1
. Я также регулярно проверял IP-адрес моего wsl2, который действительно иногда является вышеупомянутым, но также довольно часто бывает другим. Так что НЕТ, IP в любом случае НЕ 172.17.0.1
.
- person whme; 07.07.2020
~/.bashrc
как есть.
- person whme; 27.07.2020
172.23.0.0/16
(IP-адрес моего /etc/resolv.conf
) в как локальных, так и в удаленных настройках IP-адреса.
- person Abid H. Mujtaba; 12.08.2020
172.23.0.0/11
требуется. Я терял вкл / выкл соединение между перезагрузками, оказалось, что WSL2 также выделяет в диапазоне / 11.
- person dza; 06.09.2020
/etc/resolv.conf
содержит несколько записей о сервере имен, ни одна из которых не является моим текущим IP-адресом, поэтому это не работает. Похоже, есть предположения о том, как это работает.
- person Thorbjørn Ravn Andersen; 09.09.2020
awk
на этой странице для помещения IP-адреса хоста в переменную DISPLAY
мне не подходит. Что работает export DISPLAY=127.0.0.1:0
. Конечно, для этого требуется работающее устройство обратной петли. Интересно, почему так много ответов пытаются выяснить IP-адрес хоста, когда есть такое простое решение?
- person bselu; 10.11.2020
sed -n 's/nameserver //p' /etc/resolv.conf | head -n 1
- person Sandburg; 11.01.2021
~/.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
Использование /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
Скопировал мой ответ из этой проблемы с github.
Идея состоит в том, чтобы использовать возможность общаться через stdio.
Предварительное условие
- Чтобы мы могли использовать socat на хосте Windows, вам понадобится дистрибутив с WSL1. Я уверен, что вы можете сделать это в PowerShell, но у меня не было времени исследовать это. Может быть, кто-нибудь сможет написать перенаправитель stdio- ›tcp в PowerShell, тогда нам не понадобится 2 дистрибутива WSL.
Как перенаправить соединение с X-сервером
- Пусть ваш любимый X-сервер работает в Windows. По умолчанию они будут слушать порт 6000.
- В дистрибутиве 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 МБ / с данных, поэтому он не самый быстрый, но достаточно быстрый для большинства приложений.
Я придумал решение, используя 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
Добавить в автозапуск
- Диалоговое окно "Выполнить" см. "Запуск XLaunch" в Windows
- Сохранить конфигурацию
- Нажмите Windows + R
- Введите: оболочка: запуск
- Скопируйте сохраненную конфигурацию: * .launch (созданную на шаге 2) в эту папку (шаг 4)
Теперь XServer будет запущен с запуском Windows.
Я использую его для ROS. Работает для меня.
Мой XServer недоступен через Интернет, поэтому можно отключить контроль доступа.
Тем, кто может работать с механизмами моделирования, такими как 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. Дополнительные сведения об этой конфигурации см. здесь и здесь.
Как настроить пересылку 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.
Я не знаю, относится ли это к моей конфигурации, но эти решения не работают на моем компьютере. Они возвращают адрес 192.168.0.254, который является моим шлюзом, а не моим главным компьютером.
Чтобы заставить его работать, мне пришлось использовать на моем Ubuntu / WSL2 следующее:
export DISPLAY="`ip -4 address | grep -A1 eth0 | grep inet | cut -d' ' -f6 | cut -d/ -f1`:0"
Вы можете подключиться к 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
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
xinput list
, чтобы получить идентификатор клавиатуры, затем xinput test <n>
, чтобы увидеть все ключевые события.
- person andrewdotn; 10.07.2021
Решение от https://github.com/microsoft/WSL/issues/4793#issuecomment-588321333 использует VcXsrv в качестве X-сервера, и именно здесь я получаю этот ответ (слегка отредактированный для удобства чтения). Обратите внимание, что оригинал обновляется его автором, поэтому не забудьте перепроверить.
Чтобы это работало:
- В 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 )
- В 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.
Я использовал следующий bash для настройки отображения:
export DISPLAY=$(powershell.exe -c ipconfig | grep -A4 WSL | tail -1 | awk '{ print $NF }' | tr -d '\r'):0
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-адрес хоста не требуется.
Я не уверен, почему, но ни один из приведенных выше ответов не помог мне. Я использую 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 фактически назначен гостю.
Итак, шаги следующие:
- Установите VcXSrv. Запустите его со всеми значениями по умолчанию, но установите для параметра Display number значение 0 (-1 выберет 0, если ни один экземпляр X не запущен). Не запускайте в нем никаких клиентов (это дает преимущество, заключающееся в том, что вы можете запускать больше приложений на одном экземпляре X-сервера).
- Откройте WSL и настройте ssh-сервер. Для меня это просто
sudo service ssh start
. Создайте ярлык Windows с командной строкой:wsl sudo service ssh start
. - Установите Git для Windows. На самом деле я использую его только потому, что его версия ssh может работать в фоновом режиме с
ssh -f
. Версия ssh для Windows содержит ошибки с этой функцией, в остальном она подходит без перехода в фоновый режим или сssh -n
. - Настройте вход без пароля из Git-Bash для гостя.
ssh [email protected]
должен работать на этом этапе, потому что порт хоста перенаправлен гостю. - Убедитесь, что перенаправление X работает из Git-Bash:
DISPLAY=127.0.0.1:0 ssh -Y [email protected] xeyes
. Я думаю, что xeyes устанавливается с каждым дистрибутивом X. - Установите в 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 у меня уже установлен. Кроме того, у меня не работало повторное использование дисплея со встроенным клиентом.
Мне удалось поработать с готовой конфигурацией брандмауэра 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-суффикс для конкретного соединения (ваш может отличаться, и в этом случае вам следует заменить его в командной строке выше).
Я обнаружил, что есть официальный документ по Ubuntu, который является исчерпывающим для вашей справки. Как мы знаем, этот совет будет работать и в Debian / WSL2. https://wiki.ubuntu.com/WSL
Спасибо за Кеннихена и других людей. Все они так или иначе работают на моем компьютере, чтобы включить сервер X11 на WSL2, размещенном в Windows10. Поскольку WSL2 как виртуальная машина больше не является той же инфраструктурой, что и WSL1. Мне потребовалось некоторое время, чтобы пройти через это.
Я нашел решение, которое сработало для меня, следующее: Установить графику на 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
Вот две статьи, которые я написал, в которых рассказывается о настройке x11 для различных типов использования:
- Установить Программа с графическим пользовательским интерфейсом в WSL2: в этой статье рассказывается об установке vcxsrv, добавлении переменных среды в файл конфигурации bashrc и программном планировании запуска vcxsrv с параметрами командной строки при запуске. Он также охватывает установку и запуск Firefox как отдельной программы в WSL2.
- Установить Ubuntu Рабочий стол с графическим пользовательским интерфейсом в WSL2 В этой статье рассматривается установка vcxsrv, dotNet, genie и рабочего стола Ubuntu. Он охватывает создание сценариев, которые экспортируют переменные среды, запускают vcxsrv, запускают среду рабочего стола gnome и создают ярлык, который связывает их все вместе. Он также охватывает запуск рабочего стола Ubuntu, предотвращение ошибки блокировки экрана и установку Snap Store.
Моя ошибка заключалась в том, что я взял сервер имен своего экземпляра linux wsl2, в то время как мой xserver работает в Windows. Значит, в переменной DISPLAY должен быть установлен мой адрес ipv4 в Windows. Просто введите ipconfig
в powershell или cmd и используйте ipv4 ethernet address
.
Я также столкнулся с трудностями при открытии графических интерфейсов 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
Для меня работает следующий обходной путь:
Set-NetFirewallProfile -Name $ (Get-NetConnectionProfile) .NetworkCategory -DisabledInterfaceAliases $ (Get-NetAdapter | Where-Object Name-like 'WSL'). Name
Ничего не делать и терпеливо ждать следующей версии windows :)
software tools commonly used by programmers
, что, я бы сказал, относится к WSL2. Кроме того, он должен покрыватьa practical, answerable problem that is unique to software development
. Это определенно практическая проблема, на которую можно ответить, однако она может быть не уникальной для разработки программного обеспечения. Поскольку вопрос уже получил 2 голоса за повторное открытие, я могу просто подождать и посмотреть, что будет. - person whme   schedule 27.07.2020