3

我正在使用带有 WSL2 的 MobaXterm 作为终端和 X 客户端,并且我在 MobaXterm 看似随机更改其 DISPLAY 变量时遇到问题。在给定的计算机启动时,IP 似乎保持不变,但每天都在变化(或者可能每隔几天?)。

我一直在通过~/.bashrc(因此它是持久的)在我的 WSL2 安装上设置 DISPLAY,就像在 MobaXterm 开始屏幕上告诉我的那样(通常类似于192.168.1.Y:0.0,其中 Y 是一个似乎会改变的不同数字)。

当我更改 DISPLAY 时,一切正常,直到有一天我收到连接显示的错误,然后我检查 Y 值/DISPLAY 位置是否已更改。同样,我可以检查 MobaXterm 上面显示的内容为“您的 DISPLAY 设置为 ...”,并通过 ~/.bashrc 手动更改它,但我希望设置一次并让它正常工作。

我使用 MobaXterm 的同事似乎将他们的 DISPLAY 始终设置为“localhost”之类的东西,但我的似乎每次都显示某种完整的 IP 地址(这种情况会发生变化)。

有没有人熟悉这个问题,和/或对如何解决这个问题有任何想法?

从我的 WSL2 发行版上的 MobaXterm bash 终端添加一个示例:

$ xeyes
Error: Can't open display: 127.0.0.1:0.0
$ export DISPLAY=localhost:0.0
$ xeyes
Error: Can't open display: localhost:0.0
$ export DISPLAY=:0.0
$ xeyes
Error: Can't open display: :0.0

一旦我设置export DISPLAY=192.168.1.13:0.0(这就是 MobaXterm 所说的 DISPLAY 现在设置为),xeyes显示正常。

有人还把我带到了MobaXterm 文档

默认情况下,MobaXterm Xserver 侦听您的所有网络适配器。横幅消息会说您的 DISPLAY 环境设置为“:0.0”,但这只是一条信息性消息:它被打印在这里是为了帮助用户在连接到远程服务器时设置他们的“DISPLAY”环境变量。但是,嵌入式 X11 服务器侦听所有网络接口,而不仅仅是写入的那个。您在“DISPLAY”变量中看到哪个 IP 地址并不重要:因为 MobaXterm X 服务器侦听您的所有网络接口,它也监听第 2、3、(...) 个网络接口。例如,如果您的计算机有 2 个网络适配器(192.168.0.10 和 10.10.10.36): MobaXterm 说您的 DISPLAY 设置为“192.168.0.10:0.0”。但是X 服务器确实在“127.0.0.、“192.168.0.10:0.0”(第一个适配器)和“10.10.10.36:0.0”(第二个适配器)。

好吧,如果确实是“X 服务器真的在“127.0.0.1”(本地主机)上侦听,那么当 DISPLAY(在 WSL2 发行版上)设置为127.0.0.1:0.0或时,我的 X 应用程序不应该正确启动localhost:0.0吗?

4

2 回答 2

2

WSL 1 和 WSL 2 之间的主要区别在于,WSL 1 在您的 Windows 环境中运行,而 WSL 2 在您的 Windows 环境之外作为虚拟计算机运行。

WSL 1 与主机 Windows 环境共享网络,而在 WSL 2 中它拥有自己的网络。特殊 IP 地址 127.0.0.1 (localhost) 始终指向您连接的机器。这就是为什么在 WSL 1 中 127.0.0.1 将指向运行 MobaXterm 的 windows 环境(因为它们是同一台机器),但在 WSL 2 中,127.0.0.1 指向没有运行 MobaXterm 的 Linux 环境(因为它是不同的,尽管是虚拟的机器)。

您需要通过指定 Windows 机器的 IP 地址将 WSL 2 虚拟机指向 Windows 机器。这个 IP 地址是由 Windows 自己设置的,MobaXterm 无法控制它。这就是为什么 MobaXTerm 唯一能做的就是从 Windows 获取 IP 地址并告诉用户它是什么;它本身不能将 IP 地址设置为静态的。

在大多数情况下,您可以确保 Windows 具有静态 IP 地址。就我而言,MobaXTerm 显示的 IP 地址是我的 Windows 机器从我的 WiFi 路由器获得的 IP 地址。为了给它一个静态 IP 地址,我必须登录到我的路由器(在http://192.168.1.1上),并告诉它始终为 Windows 机器分配相同的 IP 地址。每个路由器执行此操作的确切方法不同,通常在“DHCP”设置中的某个位置。

IP 范围 192.168。. 是一个本地网络,因此只有您的网络(您家)中的计算机可以访问它。从问题中的地址看来,您还可以在http://192.168.1.1上配置路由器。这与我的 192.168.1.1 不同。

于 2020-05-09T14:53:04.140 回答
2

这里有类似的问题。我必须从横幅中复制 DISPLAY IP 地址,并在$DISPLAY每次更改时分配它。

我想动态地派生它,但在我的情况下,X 服务器没有监听 Linux 所知道的任何接口(与 MobaXterm 文档中断言的相反)。

它只监听 Wi-Fi 端口,表面上,Linux-WSL2 无法本地访问。

幸运的是,它确实可以访问 Windows 命令!所以为我解决它的解决方法是将以下内容添加到.bashrc

export DISPLAY="$(netsh.exe interface ip show address "Wi-Fi"|awk '/IP Address/ {print $3}'|sed 's/\r//'):0"
于 2021-02-01T21:27:54.000 回答