WSL 2: запуск графических приложений Linux для настольных ПК из Windows 10 Ошибка оболочки Bash E233: не удается открыть дисплей

Как запускать графические настольные приложения Linux из Bash Shell в Windows 10?

Сначала я установил подсистему Windows для Linux (WSL), выполнив шаги, как показано в здесь следующим образом:

(1) Установлена ​​сборка Windows 10 Pro Insider Preview 19619.

(2) Установленный дистрибутив Ubuntu Linux.

(3) Изменена версия распространения с WSL 1 на WSL 2.

Во-вторых, чтобы включить графические настольные приложения Linux из оболочки Bash в Windows 10, я выполнил следующие шаги, как показано здесь следующим образом:

(4) Я установил X-сервер, который является Xming

(5) Установлен графический редактор vim на основе GTK в качестве теста с использованием:

sudo apt-get install vim-gtk

(6) Установите мою переменную среды отображения

export DISPLAY=:0

(7) Запустить приложение

gvim

Однако это не привело к запуску приложения, и я получил следующую ошибку:

E233: cannot open display
Press ENTER or type command to continue
E852: The child process failed to start the GUI
Press ENTER or type command to continue

Есть идеи, почему возникает эта ошибка?


person ASE    schedule 17.05.2020    source источник
comment
Вы пытались остановить и перезапустить свой кли?   -  person Dan M. CISSOKHO    schedule 25.09.2020


Ответы (8)


Сетевая подсистема в WSL2 отличается от используемой в WSL1. Вы должны учитывать различия, чтобы получить доступ сетевые приложения, работающие в Windows и Linux:

  • В WSL1 Linux использует те же IP-адреса, что и хост Windows, поэтому вы можете получить доступ к приложениям, используя localhost или 127.0.0.1
  • В WSL2 Linux работает на облегченной виртуальной машине и имеет другой IP-адрес. Для доступа к сетевым приложениям, запущенным на хосте Windows, вы должны использовать IP-адрес Windows.

Проверка IP-адреса хоста Windows

Есть много способов определить IP-адреса в хосте Windows. Вы можете выполнить следующие команды в своем WSL Linux:

  • cat /etc/resolv.conf показывает IP-адрес eth0 интерфейса в Windows.
  • ipconfig.exe показывает всю конфигурацию IP на хосте Windows
  • route.exe print показывает конфигурацию сетевой маршрутизации на хосте Windows.

Установка переменной DISPLAY для WSL2

Основываясь на документации Microsoft, вы можете установить переменную DISPLAY, проверяя nameserver в /etc/resolv.conf файле. (@fqquiner и @VPraharsha уже упоминал об этом)

export DISPLAY=$(grep nameserver /etc/resolv.conf | awk '{print $2}'):0.0

Однако у меня возникли проблемы с использованием этого решения, вероятно, потому, что я использую свой ноутбук с подключением Wi-Fi и несколькими виртуальными сетями. Вместо предыдущего решения я определяю IP-адрес Windows с помощью route.exe и проверяю интерфейс, используемый в шлюзе по умолчанию.

export DISPLAY=$(route.exe print | grep 0.0.0.0 | head -1 | awk '{print $4}'):0.0

Установка переменной DISPLAY в .profile

Вы можете установить переменную DISPLAY в вашем ~/.profile файле. Я использовал следующий код:

# set DISPLAY to use X terminal in WSL
# in WSL2 the localhost and network interfaces are not the same than windows
if grep -q WSL2 /proc/version; then
    # execute route.exe in the windows to determine its IP address
    DISPLAY=$(route.exe print | grep 0.0.0.0 | head -1 | awk '{print $4}'):0.0

else
    # In WSL1 the DISPLAY can be the localhost address
    if grep -q icrosoft /proc/version; then
        DISPLAY=127.0.0.1:0.0
    fi

fi
person Jaime    schedule 27.02.2021
comment
Для меня использование route.exe было решением - person hitautodestruct; 04.03.2021
comment
Кроме того, см. Ответ @fquinner. Вы также должны открыть TCP-порт 6000 для IP-адреса вашего WSL. Например, если ваш WSL находится на 172.23.80.1, добавьте правило брандмауэра для входящего трафика, чтобы разрешить трафик с 172.23.80.0/12. См. Инструкции: github.com/cascadium/wsl -windows-toolbar-launcher / blob / master /. - person intotecho; 03.06.2021
comment
Спасибо за ответ. У меня работает /etc/resolv.conf, а вот route.exe - нет. Я не знаю, как это отформатировать, но: Сетевое назначение Маска сети Метрика интерфейса шлюза 0.0.0.0 0.0.0.0 192.168.86.1 192.168.86.51 35 ... 172.22.224.1 255.255.255.255 Связь 172.22.224.1 5256 Адрес 172 правильный (по крайней мере, тот, который работает). - person mzimmers; 25.06.2021
comment
Если по-прежнему не работает, ознакомьтесь с моим пошаговым ответом на GitHub: github .com / microsoft / WSL / issues / 4106 # issuecomment-876470388. - person Kevin Patel; 08.07.2021
comment
Спасибо @KevinPatel за инструкции по настройке vcxsrv в Windows 10. @KevinPatel и @shortpoet (в Github) используют вышеуказанное решение для поиска значения DISPLAY. - person Jaime; 12.07.2021

Была та же проблема, поэтому я попробовал эти другие предложения, но в итоге сработало разрешение vcxsrv через общедоступный брандмауэр. Я знаю, что вы не используете vcxsrv, но, возможно, это та же проблема для вас.

Установите VcXsrv, затем включите общедоступный брандмауэр, как на этих рисунках. Откройте брандмауэр Защитника Windows в режиме повышенной безопасности, используя wf.msc в командной строке. Затем разрешите соединения, как на этих картинках.

«Дважды

[Разрешить соединение в свойствах брандмауэра VcXsrv2» /></p>
<p>Затем запустите VcXsrv <a target='_blank' href='https://github.com/hubisan/emacs-wsl#run-emacs-in-graphical-display'>из этого руководства</a> для Windows 10 WSL2.</p>
<p>Запустите VcXsrv, добавив параметр -ac, или введите его в командной строке C: \ Program Files \ VcXsrv \ vcxsrv.exe: 0 -multiwindow -clipboard -wgl -ac</p>
<p>Затем введите это в свой терминал WSL2</p>
<pre><code>export DISPLAY_NUMBER="0.0"
export DISPLAY=$(grep -m 1 nameserver /etc/resolv.conf | awk '{print $2}'):$DISPLAY_NUMBER
export LIBGL_ALWAYS_INDIRECT=1
# OPTIONAL Set the keyboard layout to US
setxkbmap -layout us
setsid emacs
exit
</code></pre>
                        <div class= person Saj    schedule 06.10.2020


Добавляя к ответу fquinner,

Переменная env DISPLAY должна быть установлена ​​как export DISPLAY=X.X.X.X:0, чтобы использовать IP-адрес хоста Windows в качестве WSL2, а хост Windows не находится в одном сетевом устройстве, где X.X.X.X - это IP-адрес.

и ваш IP-адрес указан в resolv.conf для сервера имен ($ cat /etc/resolv.conf)

или просто export DISPLAY="`grep nameserver /etc/resolv.conf | sed 's/nameserver //'`:0" для автоматической загрузки правильного IP-адреса. Кроме того, вы можете добавить это в .bashrc или .zshrc (если вы используете Zsh)

person VPraharsha    schedule 20.09.2020
comment
Я сделал это, и он не возвращает ошибку, но застрял. - person yousef yegane; 07.07.2021

Здесь есть раздел устранения неполадок для отладки X11 на wsl2:

https://github.com/cascadium/wsl-windows-toolbar-launcher/blob/master/README.md#troubleshooting

Переадресация портов - это не то же самое, что WSL1 - ваши службы Linux могут быть доступны через localhost для Windows, но обратное уже не верно.

Поэтому вам нужно использовать внутренний IP-адрес вашего хоста Windows и настроить брандмауэр, чтобы разрешить сеть WSL.

person fquinner    schedule 18.05.2020

введите описание изображения здесь Следующие инструкции были скопированы и вставлены из статьи, которую я написал, но потерял исходное форматирование, ссылки и снимки экрана:

Источник: Как установить рабочий стол Ubuntu с графическим интерфейсом пользователя в WSL2


Скачать VcXsrv: Посетите официальный сайт Нажмите Загрузить


Установите VcXsrv: Откройте vcxsrv-64.1.20.8.1.installer.exe Нажмите Далее Нажмите Установить Нажмите Закрыть


Разрешить доступ к VcXsrv: проверьте частные сети, нажмите «Разрешить доступ»


Откройте PowerShell: нажмите ⊞ Windows. Введите PowerShell в строку поиска. Щелкните правой кнопкой мыши Windows PowerShell. Щелкните Запуск от имени администратора.


Откройте WSL2: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

wsl


Установите Ubuntu Desktop: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

sudo apt --yes install ubuntu-desktop


Задайте переменную имени пользователя: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

username=$(wslvar USERNAME)


Создайте каталог Ubuntu: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

mkdir --parents /mnt/c/users/$username/.ubuntu/


Откройте каталог Ubuntu: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

cd /mnt/c/users/$username/.ubuntu


Загрузите репозиторий программного обеспечения Linux для продуктов Microsoft: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

Ubuntu 20.04: wget https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb --output-document packages-microsoft-prod.deb Ubuntu 18.04: wget https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb --output-document packages-microsoft-prod.deb


Установите репозиторий программного обеспечения Linux для продуктов Microsoft: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

sudo dpkg --install packages-microsoft-prod.deb


Обновите репозитории: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

sudo apt update


Установите APT Transport для HTTPS: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

sudo apt install --yes apt-transport-https


Обновите репозитории: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

sudo apt update


Установите .Net: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

sudo apt install --yes dotnet-sdk-5.0


Добавьте Arkane Systems в каталог списка источников: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

sudo sh -c 'echo "deb [trusted=yes] https://wsl-translinux.arkane-systems.net/apt/ /" > /etc/apt/sources.list.d/wsl-translinux.list'


Обновите репозитории: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

sudo apt update


Установите Genie: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

sudo apt install --yes systemd-genie


Создайте файл Sudoers: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

echo "$USER ALL=(ALL) NOPASSWD:/usr/bin/genie" | sudo EDITOR="tee" visudo --file /etc/sudoers.d/$USER


Создайте сценарий рабочего стола: скопируйте код из приведенных ниже инструкций. Вставьте код в PowerShell. Нажмите Enter.


# CREATE BASH SCRIPT

# Store block of text with here document
create_bash_script=$(cat << end_of_string

# Define necessary environment variables
export DISPLAY="\$(cat /etc/resolv.conf | grep nameserver | awk '{ print \$2 }'):1.0"
export DESKTOP_SESSION="ubuntu"
export GDMSESSION="ubuntu"
export XDG_SESSION_DESKTOP="ubuntu"
export XDG_CURRENT_DESKTOP="ubuntu:GNOME"
export XDG_SESSION_TYPE="x11"
export XDG_BACKEND="x11"
export XDG_SESSION_CLASS="user"
export XDG_DATA_DIRS="/usr/local/share/:/usr/share/:/var/lib/snapd/desktop"
export XDG_CONFIG_DIRS="/etc/xdg"
export XDG_RUNTIME_DIR="\$HOME/xdg"
export XDG_CONFIG_HOME="\$HOME/.config"
export XDG_DATA_HOME="\$HOME/.local/share" 
export XDG_CACHE_HOME="\$HOME/.cache"
export XDG_DESKTOP_DIR="\$HOME/Desktop"
export XDG_DOCUMENTS_DIR="\$HOME/Documents"
export XDG_DOWNLOAD_DIR="\$HOME/Downloads"
export XDG_MUSIC_DIR="\$HOME/Music"
export XDG_PICTURES_DIR="\$HOME/Pictures"
export XDG_PUBLICSHARE_DIR="\$HOME/Public"
export XDG_TEMPLATES_DIR="\$HOME/Templates"
export XDG_VIDEOS_DIR="\$HOME/Videos"

# Start desktop environment
gnome-session

end_of_string
)

# Store username environment variable in lowercase
username=$(wslvar USERNAME | awk '{ print tolower($0) }') &&

# Save block of text in bash file
echo "${create_bash_script}" > "/mnt/c/users/$username/.ubuntu/02_start_desktop.sh"


Загрузите изображения ярлыков: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

wget https://assets.ubuntu.com/v1/9fbc8a44-circle-of-friends-web.zip


Разархивируйте изображения ярлыков: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

unzip -o 9fbc8a44-circle-of-friends-web.zip


Создайте ярлык: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

convert -resize 64x64 ./circle-of-friends-web/png/cof_orange_hex.png ubuntu.ico


Выйдите из WSL2: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

exit


Создайте сценарий VcXsrv: скопируйте код из нижеприведенных инструкций. Вставьте код в PowerShell. Нажмите Enter.


# RELOAD VCXSRV SCRIPT

# Store username environment variable in lowercase
$username = $env:username.tolower()  

# Store block of text with here-string
$reload_vcxsrv_script = @"

# Stop vcxsrv proccess that contains "1.0" in the program window title
get-process vcxsrv | where { `$_.mainwindowtitle -like "*1.0*" } | stop-process

# Start vcxsrv process in a large program window on display number one
start-process "c:\program files\vcxsrv\vcxsrv.exe" -argument ":1 -ac -nowgl -multimonitors -dpms"

"@

# Save block of text in powershell file
echo "${reload_vcxsrv_script}" > $env:userprofile/.ubuntu/reload_vcxsrv.ps1


Создайте сценарий Ubuntu: скопируйте код из нижеприведенных инструкций. Вставьте код в PowerShell. Нажмите Enter.


# CREATE VISUAL BASIC SCRIPT

# Store username environment variable in lowercase
$username = $env:username.tolower()           

# Store block of text with here-string
$create_vbs_script = @"

' Run PowerShell script in background
set application = createobject("shell.application")
application.shellexecute "powershell", "-file c:\users\admin\.ubuntu\01_reload_vcxsrv.ps1", "", "", 0

' Allow PowerShell script to complete
wscript.sleep 3000

' Run Bash script in background
set shell= createobject("wscript.shell")
shell.run "wsl sudo genie -c bash /mnt/c/users/admin/.ubuntu/02_start_desktop.sh", 0

"@

# Save block of text in bash file
echo "${create_vbs_script}" > $env:userprofile/.ubuntu/03_start_ubuntu.vbs


Создайте сценарий ярлыка: скопируйте код из приведенных ниже инструкций. Вставьте код в PowerShell. Нажмите Enter.


# Store block of text with here-string
$create_shortcut_script = @"

# Define location variables
`$shortcut_location = "`$env:userprofile\.ubuntu\Ubuntu.lnk"
`$program_location = "`$env:userprofile\.ubuntu\03_start_ubuntu.vbs"

# Create shortcut
`$object = new-object -comobject wscript.shell
`$shortcut = `$object.createshortcut(`$shortcut_location)
`$shortcut.targetpath = `$program_location
`$shortcut.iconlocation = "`$env:userprofile\.ubuntu\ubuntu.ico"
`$shortcut.save()

"@

# Save block of text in powershell file
echo $create_shortcut_script > $env:userprofile/.ubuntu/04_create_shortcut.ps1


Откройте каталог Ubuntu: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

cd c:\users\admin\.ubuntu


Создайте ярлык: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

powershell.exe -file .\04_create_shortcut.ps1


Откройте каталог в проводнике: скопируйте команду из нижеприведенных инструкций. Вставьте команду в PowerShell. Нажмите Enter.

explorer .


Запустите рабочий стол Ubuntu: дважды щелкните ярлык Ubuntu


Откройте терминал: нажмите "Действия" в верхнем левом углу. Введите "Терминал" в строку поиска. Нажмите "Терминал".


Отключите блокировку экрана: скопируйте команду из нижеприведенных инструкций Вставьте команду в терминал Нажмите Enter

gsettings set org.gnome.desktop.screensaver lock-enabled false


Установите Snap Store: Скопируйте команду из нижеприведенных инструкций Вставьте команду в Терминал Нажмите Enter

sudo snap install snap-store


person TheAltruist    schedule 11.12.2020
comment
Всего за 27 простых шагов! - person Entalpi; 14.02.2021
comment
У меня это сработало отлично, но я вхожу в Ubuntu как root. Вы этого ожидали? Я выполнил приведенные выше инструкции, за исключением того, что всегда использовал свое собственное имя пользователя (в инструкциях по созданию сценария Visual Basic есть два места, где используется пользователь с правами администратора). Есть ли способ войти в систему под своим именем пользователя вместо root? - person John; 31.03.2021
comment
@Entalpi Да, ха-ха. - person TheAltruist; 01.04.2021
comment
@John Попробуйте удалить sudo из следующей строки в 03_start_ubuntu.vbs: shell.run wsl sudo genie -c bash /mnt/c/users/admin/.ubuntu/02_start_desktop.sh, 0 - person TheAltruist; 01.04.2021
comment
@TheAltruist Удаление sudo исправило это - теперь я вхожу в систему под своим именем пользователя. Спасибо! - person John; 01.04.2021
comment
@John Awesome, рад, что у вас все получилось! - person TheAltruist; 02.04.2021

Выяснилось, что теперь, чтобы заставить графический интерфейс работать (по крайней мере, когда он онлайн), вам нужно использовать свой общедоступный IP ...

например работает следующее:

export DISPLAY=$(dig +short myip.opendns.com @resolver1.opendns.com):0
person AlienDrew    schedule 23.09.2020
comment
Я не думаю, что вам нужно получить доступ к xserver через свой общедоступный ip. Это означало бы, что для этого вам нужно открыть порты и т. Д. - person Bostrot; 16.01.2021
comment
@Bostrot Я не могу выполнить перенос, так как я нахожусь в сети университетского городка, поэтому доступ к общедоступному IP-адресу не является проблемой безопасности. Кроме того, WSL2 работает в режиме NAT, поэтому для подключения к нему необходимо использовать его общедоступный IP-адрес (для него нет частного соединения). Единственное, что не так с моей текущей командой, так это то, что теперь WSL2 также назначает другой порт для дисплея при каждом запуске, что я не учел. - person AlienDrew; 16.01.2021
comment
Ну, вы действительно можете напрямую подключиться к хосту. Поскольку сервер имен является хостом, вы можете проверить его IP-адрес в /etc/resolv.conf. Просто попробовал с WSL2, и это работает. Конечно, локальный брандмауэр должен разрешать доступ из этой подсети. - person Bostrot; 16.01.2021

2021 Answer

Все ответы здесь старые и несуществующие. По состоянию на 27 апреля 2021 года он просто работает TM.

Из https://docs.microsoft.com/en-us/windows/wsl/tutorials/gui-apps

Для существующих систем WSL:

  1. Ensure using Windows 10 Insider build 21362+
    • Type version into Start Menu ("System Information") to see
  2. Установите драйвер для vGPU: Intel AMD NVIDIA
  3. В административной Power Shell: wsl --update
  4. wsl --shutdown для принудительного перезапуска WSL
person Cameron Tacklind    schedule 16.07.2021

Короткий ответ:

  1. установить сервер xming
  2. на WSL запустить экспорт DISPLAY = localhost: 0.0

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

person Alkor    schedule 14.01.2021
comment
Это не будет работать с WSL2, который явно использует автор этого потока (см. Заголовок), потому что он использует подсеть, отличную от WSL1. - person Bostrot; 20.01.2021
comment
Для WSL2 используйте следующую команду, где 192.168.1.200 - это мой экспорт IP-адреса хоста Windows DISPLAY = 192.168.1.200: 0.0 - person Ripon Banik; 24.02.2021