我的 WSL2 网络设置:

我的 WSL2 网络设置:

我正在使用 WSL2(Ubuntu 20.04),但在设置 $DISPLAY 环境变量时遇到了问题。更具体地说,我有一个网络配置,可以 ping 连接到 eth0 的设备,但我无法运行 Qt 应用程序

(编辑:我在 Windows 11 上运行 WSL2)

当我运行 Qt 软件(例如 Wireshark)或我公司的内部软件时,出现以下错误消息:

user@DESKTOP-XXX:~$ wireshark
qt.qpa.xcb : could not connect to display 0
qt.qpa.plugin: Couoldl not load the Qt platform plulgin "xcb" in "" even though it was found.

通过查看,我发现我的 $DISPLAY 变量设置不正确。(我检查了一下,发现“xcb”插件已安装,Qt 找到了它)。我现在正在努力了解 $DISPLAY 环境变量,更具体地说,在 WSL2 上如何运作。 我发现这个很棒的 AskUbuntu 答案关于一般性,但由于 WSL2 的工作方式有点特殊(虚拟机、Hyper-V 虚拟交换机等),我不明白要将 $DISPLAY 设置为何值才能与通过以太网连接的东西进行通信。

我的 WSL2 网络设置:

我想与我的 WSL2 计算机上通过以太网连接的机器进行通信。为此,我设置了以下配置,以便我可以 ping 该机器:

  • Hyper-V 虚拟管理器Windows 应用程序:通过我使用的以太网连接器将 WSL 虚拟交换机设置为“外部网络”
  • 网络连接Windows 应用程序:
    • 以太网:
      • 已勾选“Hyper-V 可扩展虚拟交换机”
    • 虚拟以太网(WLS):
      • Hyper-V 可扩展虚拟交换机未选中;
      • IPV4:IP 10.0.0.10,网关10.0.0.3,收藏DNS 0.0.0.0
  • Ubuntu 网络设置:
    • sudo ifconfig eth0 10.0.0.3 netmask 255.255.255.0
    • sudo ip route add default via 10.0.0.5 dev eth0

此设置允许我通过 10.0.0.2 ping 我的外部机器. (如果我想通过 eth0 访问互联网,我需要将名称服务器添加到 resolv.conf。)

然而,Qt 应用仍然无法达到。它们根本无法运行。例如,当我启动Wireshark时,我收到了上面提到的错误消息。

我尝试过的一些解决方案,受到我在网上找到的东西的启发:

user@DESKTOP-XXX:~$ export DISPLAY=0.0
qt.qpa.xcb : could not connect to display 0.0

user@DESKTOP-XXX:~$ export DISPLAY=8080
qt.qpa.xcb : could not connect to display 8080

user@DESKTOP-XXX:~$ export DISPLAY=10.0.0.2
qt.qpa.xcb : could not connect to display 10.0.0.2

user@DESKTOP-XXX:~$ export DISPLAY=10.0.0.2:0
# infinite loading

答案1

如果您想走这条路,可以将其作为另一个答案(解决方法)。 它不能“解决”问题,但您应该能够回到“Windows 10”方式来运行 X,即:

  • 安装第三方 X 服务器,例如 VcXsrv(或其他服务器之一)
  • 通过 XRDP 运行

这将使 WSLg 不再存在,只要 Windows 主机和 WSL2 之间有适当的网络连接,您就可以运行。

一些详细信息:

WSLg 很好,但是如果你需要自定义网络配置,并且无法让 WSLg 使用它,那么至少有“后备”方案也是不错的。

答案2

我认为问题可能实际上发生在 WSLg“系统发行版”中,而不是 Ubuntu 本身。请注意,目前这纯粹是一种理论——一种有大量支持信息的理论,但仍然是一种理论。

作为背景,当你在 Windows 11 下启动 WSL2 发行版时,分发实际上已经开始:

  • 主要发行版(例如 Ubuntu)
  • 相应的系统分布对于每个“主要”发行版。此发行版实际上是 MicrosoftCBL-水手分配。

有趣的是,要让 X 应用程序在 WSL2 中运行,你甚至不需要需要来自 Ubuntu 本身的网络连接。我能够启动 Ubuntu、关闭、删除所有路由,并且仍然可以启动 X 应用程序。这是因为 Ubuntu 通过中eth0的 X11 套接字的符号链接(或在预览版本中为绑定挂载)链接到 WSLg 发行版。/tmp/.X11-Unix//mnt/wslg/.X11-Unix

可能更重要的是该系统分布内的网络。我感觉它无法建立正确的连接,这是由于您提到的网络变化。

在我进行的一些快速试验中,我感觉你无法在运行时“修复”网络。你当然可以尝试,我鼓励你这样做,方法是启动:

wsl --system -u root

但我无法通过亲自拆除网络连接来“破坏”它,我猜这是因为系统分发启动时网络连接已经建立。从自述

WSLGd 是 init 之后启动的第一个进程。

因此,我们似乎需要拆除任何现有的 WSLGd(以及 Weston、XWayland 和 Pulse 子进程),并在修复网络后重新启动它/它们。我自己还没有做到那么远,但也许你会取得更好的成功。此时,如果我停止现有的 WSLGd 等,然后重新启动它,我甚至无法启动 X 应用程序没有任何其他更改。因此,获得基本停止并重新启动下一步就是开展工作。

最终,我有一种感觉,为了永久解决这个问题(如果我在这个问题上走在正确的轨道上),你需要建立自己的系统分布网络变革已经到位。

但这就是今天的理论。希望我考虑得更周全,你会发现这其实是更直接的事情。

答案3

好的,现在还有另一种可能性,我可以在某种程度上重现这种情况。

如果你正在运行最新的 WSL 预览版 (0.66.2),那么已知的 WSLg 问题这会导致 X11 套接字被重新创建,而旧套接字仍然存在。这会导致系统分发(有关详细信息,请参阅我之前的回答)增加显示编号(因为旧编号已被锁定)。

查看:

ls /tmp/.X11-unix

如果这是您遇到的问题,那么您将会看到X0问题发生时以外的其他信息。

您应该能够通过将 设置DISPLAY为 后面的任意数字来暂时恢复X。例如,如果您有X2,那么:

export DISPLAY=:2

然后尝试xeyeswireshark

我还没有弄清楚所有可能引发此问题的各种因素。就我而言,我可以通过以下方式轻松重现此问题:

wsl --terminate Ubuntu

...然后快速重启。这会导致系统发行版仍在运行的时间问题。

正如您在该问题报告中看到的,WSLg 团队已经意识到了这个问题,并将在下一个版本中恢复更改。

答案4

我在 Windows 10 上并运行 wsl Ubuntu。

尝试sudo apt install libxcb-xinerama0

这对我来说非常有效。特别是经过了这么多小时的尝试之后。

相关内容