在 WSL 2 中运行 GUI Linux 应用程序
我一直非常享受使用适用于 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 通过防火墙。为此,我们将:
- 打开“Windows 安全”(我通常在开始菜单中输入)
2.点击“防火墙和网络保护”
3.点击“允许应用程序通过防火墙”
这将显示应用程序列表及其通过私有和公共网络的连接权限,如下所示:

您需要在此列表中找到“Xming X Server”,并确保它被允许(选中)用于公共网络!
为什么Xming需要在公网通信?
根据文档:
WSL 2 有一个具有自己唯一 IP 地址的虚拟化以太网适配器。
我们的 WSL 实例没有直接连接到本地网络,而是通过 Windows 使用这个虚拟化以太网适配器。就好像在 Ubuntu 和 Windows 之间连接了一根以太网电缆。
这与 WSL 1 的工作方式不同。 WSL 2 要求我们像设置另一个虚拟机一样设置网络。如果您好奇,这个视频提供了一个很好的深入了解 WSL 网络如何工作的信息。
一旦我们这样做了,回到 WSL,我们就可以运行firefox,瞧,它就在那里!哎呀,让我们也运行gedit:

接下来是什么?
出色地!在我写完所有这些之前不久,我在这里找到了tweet。
WSL 团队正在努力内置此功能!很快,GUI Linux 应用程序看起来不仅有自己的任务栏图标,还有适当的阴影窗口和完全兼容性,而不必担心 Xserver、防火墙或类似的东西。非常感谢 WSL 团队!
我仍然很高兴我学到了关于 Xservers 的知识,在此之前,您可以通过执行我上面所做的操作来使用 GUI 应用程序!
非常感谢José与我配对解决这个问题!
更多推荐

所有评论(0)