我一直非常享受使用适用于 Linux 的 Windows 子系统(简称WSL)的时间。有了它,我已经能够在我熟悉的 Linux 环境下在 Windows 上开发 Web 软件。

我遇到的一个问题,尤其是在 WSL 2 中,有时我需要在 Ubuntu 中运行 GUI 应用程序。

为什么需要在 WSL 中运行 GUI 应用程序?

一个例子是在我开发的 Rails 应用程序上运行系统测试。在我的客户工作中,我使用 Firefox 在无头模式下使用geckodriver运行Capybara,这在 WSL 上效果很好!

问题是,有时,我需要在关闭无头模式的情况下这样做。也许某些测试失败了,或者我只是想确保某些布局部分运行良好。如果我愿意,从 WSL 中运行firefox会出现以下错误:

  Unable to init server: Could not connect: Connection refused
  Error: cannot open display: :0

进入全屏模式 退出全屏模式

那么这个展示是关于什么的呢?

Xserver

上面提到的display是指一个Xserver,Linux用来管理窗口、键盘和鼠标与应用程序的交互。

我找到了一个可以为我们做这件事的工具!我可以在 Windows 上运行一个名为Xming的 Xserver,它带有几个实用程序可以在 Windows 10 上运行 Xserver。

在 Windows 上设置 Xming

下载并安装实用程序后,我们可以使用以下设置运行 Xlaunch 实用程序:

  • 选择“多个窗口”,显示编号设置为 0

  • 选择“不启动客户端”

  • 选择“剪贴板”和“无访问控制”

  • 点击完成

Xming 现在将在后台运行!

设置 WSL 与 Xming 交互

接下来我们需要设置DISPLAY环境变量来指向我们正在运行的 Xming 服务器。使用 WSL 1,我可以将其设置为:0:

  export DISPLAY=:0

进入全屏模式 退出全屏模式

但是,这不适用于 WSL 2,因为以及其他差异运行虚拟机。但是,我们可以设置将其转发到的 IP 地址。

这就是GitHub上的讨论真正派上用场的地方:

您如何看待 Linux 环境中的 DISPLAY 变量?目前您需要指定主机的 IP 地址,您可以通过查看 /etc/resolv.conf 文件轻松找到它:

root@BENHILL-DELL:/mnt/c/Users/benhill# cat /etc/resolv.conf

这个文件是由 WSL 自动生成的。要停止自动生成此文件,请将以下条目添加到 /etc/wsl.conf:

[网络]

generateResolvConf u003d false

名称服务器 192.168.110.177

然后你会运行:

导出显示u003d192.168.110.117:0

您可能还需要使用 -ac 参数启动 vcxsrv。

这是我们正在努力改进的一个领域,很快就会更新。

更有帮助的是,海报低于建议如下:

export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | \
  awk '{print $2}'):0

进入全屏模式 退出全屏模式

将此行添加到 shell 配置文件(在我的情况下为~/.zshrc)将在我启动的每个 shell 实例上设置它!如果您想在当前执行此操作,可以使用以下方法执行此操作:

$ source ~/.zshrc

进入全屏模式 退出全屏模式

可悲的是,我们还没有完成。现在运行firefox只会导致什么都没有发生。

Windows 防火墙

在我能够运行 firefox 之前的最后一步是允许 Xming 通过防火墙。为此,我们将:

  1. 打开“Windows 安全”(我通常在开始菜单中输入)

2.点击“防火墙和网络保护”

3.点击“允许应用程序通过防火墙”

这将显示应用程序列表及其通过私有和公共网络的连接权限,如下所示:

Windows Defender 防火墙允许的应用程序

您需要在此列表中找到“Xming X Server”,并确保它被允许(选中)用于公共网络!

为什么Xming需要在公网通信?

根据文档:

WSL 2 有一个具有自己唯一 IP 地址的虚拟化以太网适配器。

我们的 WSL 实例没有直接连接到本地网络,而是通过 Windows 使用这个虚拟化以太网适配器。就好像在 Ubuntu 和 Windows 之间连接了一根以太网电缆。

这与 WSL 1 的工作方式不同。 WSL 2 要求我们像设置另一个虚拟机一样设置网络。如果您好奇,这个视频提供了一个很好的深入了解 WSL 网络如何工作的信息。

一旦我们这样做了,回到 WSL,我们就可以运行firefox,瞧,它就在那里!哎呀,让我们也运行gedit:

Firefox 和 GEdit 在 Windows 中运行

接下来是什么?

出色地!在我写完所有这些之前不久,我在这里找到了tweet。

WSL 团队正在努力内置此功能!很快,GUI Linux 应用程序看起来不仅有自己的任务栏图标,还有适当的阴影窗口和完全兼容性,而不必担心 Xserver、防火墙或类似的东西。非常感谢 WSL 团队!

我仍然很高兴我学到了关于 Xservers 的知识,在此之前,您可以通过执行我上面所做的操作来使用 GUI 应用程序!

非常感谢José与我配对解决这个问题!

Logo

更多推荐