WSL 2:从 Windows 10 Bash Shell 运行图形 Linux 桌面应用程序“错误 E233:无法打开显示”

BER*_*RKO 22 windows ubuntu xming xserver windows-subsystem-for-linux

如何从 Windows 10 的 Bash Shell 运行图形 Linux 桌面应用程序?

首先,我按照此处所示的步骤安装了适用于 Linux 的 Windows 子系统 (WSL) ,如下所示:

(1) 安装了 Windows 10 Pro Insider Preview Build 19619。

(2) 安装了 Ubuntu Linux 发行版。

(3) 将发行版本从 WSL 1 更改为 WSL 2。

其次,使从Windows 10的bash shell的Linux图形桌面应用程序,我也跟着下面的步骤如图所示位置如下:

(4) 我安装了一个X Server,它是Xming

(5) 安装基于 GTK 的图形 vim 编辑器作为测试使用:

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
Run Code Online (Sandbox Code Playgroud)

知道为什么会发生此错误吗?

Jai*_*ime 38

WSL2 中的网络子系统与 WSL1 中使用的不同。您必须考虑访问在 Windows 和 Linux 上运行的网络应用程序的差异

  • 在 WSL1 中,Linux 使用与 Windows 主机相同的 IP 地址,然后,您可以使用localhost127.0.0.1
  • 在 WSL2 中,Linux 运行在轻量级虚拟机上,并具有不同的 IP 地址。要访问在 Windows 主机上运行的网络应用程序,您必须使用 Windows IP 地址。

检查 Windows 主机的 IP 地址

有多种方法可以确定 Windows 主机中的 IP 地址。您可以在 WSL Linux 中运行以下命令:

  • cat /etc/resolv.confeth0在 Windows 中显示接口的 IP 地址
  • ipconfig.exe 显示 Windows 主机中的所有 IP 配置
  • route.exe print 显示 Windows 主机中的网络路由配置

为 WSL2 设置 DISPLAY 变量

基于微软的文档,你可以设置DISPLAY变量,检查nameserver/etc/resolv.conf的文件。(@fqquiner@VPraharsha已经提到了这一点)

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

但是,我在使用此解决方案时遇到了问题,可能是因为我使用带有 WiFi 连接和多个虚拟网络的笔记本电脑。我没有使用以前的解决方案,而是使用route.exe并检查默认网关中使用的接口来确定 Windows IP 地址。

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

设置 DISPLAY 变量 .profile

您可以在~/.profile文件中设置 DISPLAY 变量。我使用了以下代码:

# 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
Run Code Online (Sandbox Code Playgroud)

  • 对我来说,使用“route.exe”是解决方案 (11认同)
  • 如果仍然不起作用,请查看我在 GitHub 上的分步回答:https://github.com/microsoft/WSL/issues/4106#issuecomment-876470388 (8认同)
  • 谢谢你的回答。使用 /etc/resolv.conf 对我有用,但route.exe 对我不起作用。我不知道如何格式化它,但是: Network Destination Netmask Gateway Interface Metric 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 On-link 172.22.224.1 5256 The 172地址是正确的(至少是有效的)。 (3认同)
  • 由于某种原因,在 .zshrc 文件中运行 route.exe 会导致整个终端挂起(如果它是在 Linux 目录中打开的话)。我最终需要在运行route.exe之前进入Windows目录: `export DISPLAY=$(cd /mnt/c && route.exe print | grep 0.0.0.0 | head -1 | awk '{print $4}') :0.0` (3认同)

Saj*_*Saj 19

遇到了同样的问题,所以我尝试了这些其他建议,但最终起作用的是允许 vcxsrv 通过公共防火墙。我知道您没有使用 vcxsrv 但也许这对您来说也是同样的问题。

安装 VcXsrv 然后像这些图片一样启用公共防火墙。在命令提示符下使用 wf.msc 打开具有高级安全性的 Windows Defender 防火墙。然后允许像这些图片中的连接。

双击然后允许 VcXsrv 的每个公共配置文件

[在 VcXsrv 防火墙属性中允许连接2

然后从本指南为 Windows 10 WSL2运行VcXsrv

通过添加 -ac 附加参数运行 VcXsrv 或在命令提示符“C:\Program Files\VcXsrv\vcxsrv.exe”中键入:0 -multiwindow -clipboard -wgl -ac

然后在你的 WSL2 终端中输入这个

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
Run Code Online (Sandbox Code Playgroud)


Not*_*1ds 15

使用比最初提出问题时可用的最新信息更新我的答案。但请记住,由于这个问题在 Stack Overflow 上是封闭的且偏离主题,因此最终这里的答案可能会变得过时,因为无法发布新的答案。我建议查看“超级用户”或“询问 Ubuntu”,了解有关此主题的更多主题和尚未解决的问题。未来总是有可能出现更好的答案。

现有的一些问题供参考:

考虑到这一点,以下信息目前主要是从我的超级用户对上述问题的回答中复制的。


有(至少)三个选择:

  • 随着 WSL 1.0.0(WSL via Microsoft Store 应用程序)的发布,Windows 10 和 Windows 11 用户都可以完全访问 WSLg,这允许 Linux GUI 应用程序(X 或 Wayland)直接在 WSL2 上运行,无需额外配置。在 1.0.0 之前,此功能仅限于 Windows 11 用户。

    Windows 10 用户需要使用以.2311或更高版本结尾的版本,这目前意味着安装KB5020030。如果您的内部版本号的最后四位数字低于 2311,请确保您的 Windows 是最新的,然后在可选更新中查找 KB5020030 。

    在最新的 Windows 10 或 Windows 11 系统上,可以:

    从Microsoft Store安装 WSL或...

    wsl --install
    # or, if already installed
    wsl --update
    # confirm 1.0.0 or later via:
    wsl --version
    
    Run Code Online (Sandbox Code Playgroud)
  • harrymc 提供的一种传统替代方案是安装第三方 X 服务器。我不会重复有关如何执行此操作的信息,因为该答案已经涵盖了该信息,尽管我会说这export DISPLAY=$(hostname).local:0通常会起作用,并且更简洁。正如我在这个答案中详细介绍的那样,这使用了 mDNS 。

  • 最后,如果您想在 WSL 下运行 Linux桌面,您可能需要考虑 RDP。您可以xrdp使用 Windows 远程桌面连接安装并访问 Linux 桌面。请参阅此询问 Ubuntu 答案中的步骤。请注意,尽管xfce答案包含有关运行 Gnome 桌面等更复杂的东西的更多详细信息,但这确实是必要的。


VPr*_*sha 8

添加到 fquinner 的答案,

您的DISPLAY env 变量应设置为export DISPLAY=X.X.X.X:0使用 Windows 主机的 IP 地址,因为 WSL2 和 Windows 主机不在同一网络设备中,其中 XXXX 是 IP 地址

并且您的 IP 地址列在resolv.conf 中针对名称服务器 ( $ cat /etc/resolv.conf)

或者只是export DISPLAY="`grep nameserver /etc/resolv.conf | sed 's/nameserver //'`:0"自动加载正确的 IP 地址。此外,您可以将此添加到.bashrc.zshrc(如果您使用 Zsh)

  • 我已经这样做了,它没有返回错误,但它卡住了。 (2认同)

fqu*_*ner 6

这里有一个故障排除部分,用于在 wsl2 上调试 X11:

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

端口转发与 WSL1 不同 - 您的 Linux 服务可以通过 Windows 的 localhost 访问,但反之则不再成立。

因此,您需要使用 Windows 主机的内部 IP 并调整防火墙以允许 WSL 网络通过。