如何为 ubuntu 20 的 WSL2 设置 DISPLAY 变量?

如何为 ubuntu 20 的 WSL2 设置 DISPLAY 变量?

我有一个装有 ubuntu 20 的 WSL2。在大多数帖子中,设置DISPLAY环境变量以访问 Windows X11 服务器是通过 WSL 本地主机地址进行的~/.bashrc

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

或者

$ export DISPLAY=$(cat /etc/resolv.conf |grep nameserver| sed 's/nameserver //'):0

但是,这些命令将找到与主机 localhost 不同的 WSL2 机器 localhost IP。

对我来说,为了使 xlaunch X11 服务器正常工作,我必须在DISPLAY每次使用 cmd 命令更改主机 localhost IP 时进行设置ipconfig

有没有办法DISPLAY在 WSL2 启动之前设置为主机 localhost。例如,通过 windows%USERPROFILE%\.wslconfig文件。

答案1

请注意,这个问题有点(但不是完全)过时了。现在这个问题有多个答案,具体取决于您的 Windows 版本和 DNS 设置。

为了完整起见,我还将介绍 WSL1,尽管问题本身是询问 WSL2 的。

  • WSL2

    • 什么没有在 Windows 10 中工作(以及原因):

      在 Windows 10 中,在 WSL2 下使用 Ubuntu,您必须使用第三方 X 服务器才能运行图形应用程序。由于该 X 服务器运行在视窗(而不是 Ubuntu),它位于单独的网络上并且需要一个 IP 地址。

      在 Windows 10 上,以下内容不是工作:

      export DISPLAY=:0.0
      # or export DISPLAY=:0
      
    • Windows 10 使用 mDNS 和 WSL 的 DNS 解析器:

      我通常使用并推荐:

      export DISPLAY=$(hostname).local:0
      

      根据我的Stack Overflow 上的文章关于该主题。

      请注意,这假设您正在使用内置的 WSL DNS 解析器。如果您用自己的 DNS 设置覆盖它,那么它可能不起作用,因为您的 DNS 服务器可能不知道 Windows 主机的正确 IP 地址。在这种情况下,请继续...

    • 具有自定义 DNS 解析器的 Windows 10:

      如果您更改了/etc/resolv.con,则 mDNS 可能无法正常工作。在这种情况下,请尝试@ChaiAng 的回答。即使不使用 WSL 的解析器,它也应该可以工作。但是,它有点慢(对我来说大约 2 秒),所以我不建议将它放在启动文件中,例如~/.bashrc

    • 使用 WSLg 的 Windows 11:

      在 Windows 11 下,WSL2 可以使用 WSLg 功能运行 GUI 应用程序。它与 WSL 本身在同一个网络空间中运行,因此在 Windows 11 下,我们回到以下正确设置DISPLAY

      export DISPLAY=:0
      

      请注意,WSL 会在您的 Ubuntu/WSL2 会话中自动为您设置此功能/init,因此除了某些特殊情况外,没有必要手动设置它。

  • WSL1

    • 对于 Windows 10 和 11:

      在 WSL1 下,Ubuntu 本身与 Windows 在同一网络下运行,因此在这种情况下,您将使用:

      export DISPLAY=:0
      

      请注意,无论您运行的是 Windows 10 还是 11,您都需要带有 WSL1 的第三方 X 服务器。WSLg 仅在 WSL2 下受支持。

答案2

只需使用

export DISPLAY=:0.0

你可以用 xeyes 测试一下。如果你没有 xeyes

sudo apt install x11-apps

答案3

以下对我有用。

$ export DISPLAY=$(host `hostname --long` | grep -oP '(\s)\d+(\.\d+){3}' | tail -1 | awk '{ print $NF }' | tr -d '\r')

这似乎找到了我的 X 窗口应用程序运行所需的 IP 地址。

答案4

这是 WIN10 上的 WSL2 Ubuntu 变体,其中的/etc/resolv.conf信息不能用于获取有用的详细信息,因为我需要该文件来保存一些“替代”DNS 信息。

ipconfig.exe因此,我依靠从 WSL2 调用(注意.exe)Windows 程序并将其存储为来访问主机(IP)信息DISPLAY

因此我把类似这样的内容放到了我的.zshrc(或.bashrc其他 shell rc)文件中。

DISPLAY=$(ipconfig.exe | grep -oP '(\s)\d+(\.\d+){3}' | tail -2 | head -1 | awk '{ print $NF }')
export DISPLAY=$DISPLAY:0.0

相应地调整命令部分n中的tail -n | head -1,使其返回由IPv4 address返回Ethernet adapter vEthernet (WSL)ipconfig.exe

相关内容