我有一个装有 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