如何使用适用于 Linux 的 Windows 子系统运行 GUI 应用程序

如何使用适用于 Linux 的 Windows 子系统运行 GUI 应用程序

我正在运行 Windows 10 计算机,最近安装了适用于 Linux 的 Windows 子系统。这通常会创建一个没有“显示”环境的终端。似乎可以使用 Tmux 来获取多个终端,但这不允许您使用任何类型的图形显示。

我想通过 Windows Subsystem for Linux 打开 Linux 浏览器,例如 Firefox。

我尝试了建议这里,但我只收到错误:

no DISPLAY environment variable specified

答案1

请参阅 Ubuntu 维基运行图形应用程序

您需要安装在 Windows 上要启动的 X 服务器从 Windows 供 WSL 图形应用程序使用。

您可以使用 X410、VcXsrv、MobaXTerm、Cygwin/C、Xming、Cygwin X 和 vcXsrv 中的任一个。

如果图形应用程序无法自动连接到正在运行的 X 服务器,请在启动应用程序之前将以下命令粘贴到终端,或者在每次登录时将它们添加到进行设置~/.bashrc

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

另一篇有用的文章是 在 Linux 上的 Windows 子系统上运行图形程序

答案2

添加一个包含比最初提出问题时更新的信息的答案,主要是因为我将这个问题/答案链接到其他重复的问题(这里和在 Stack Overflow 上,这通常是一个离题问题)。

至少有三种选择:

  • 随着 WSL 1.0.0(通过 Microsoft Store 应用程序访问 WSL)的发布,Windows 10 和 Windows 11 用户都可以完全访问 WSLg,这使得 Linux GUI 应用程序(X 或 Wayland)无需额外配置即可直接在 WSL2 上运行。在 1.0.0 之前,此功能仅限于 Windows 11 用户。

    Windows 10 用户需要使用以.2311或更高结尾的版本,目前这意味着安装KB5020030。如果您的版本号的最后四位数字低于 2311,请确保您的 Windows 是最新的,然后在可选更新

    一旦安装了最新的 Windows 10 或 Windows 11 系统,你就可以从其Microsoft Store 页面或者 ...

    wsl --install
    # or, if already installed
    wsl --update
    # confirm 1.0.0 or later via:
    wsl --version
    
  • harrymc 提供了一个传统的替代方案,即安装第三方 X 服务器。我不会重复有关如何安装的信息,因为该答案中已经介绍过了,不过我会说这export DISPLAY=$(hostname).local:0通常会起作用,而且更简洁。这将使用 mDNS,我将在这个答案

  • 最后,如果你想运行 Linux桌面在 WSL 下,您可能需要考虑 RDP。您可以安装xrdp并使用 Windows 远程桌面连接访问 Linux 桌面。请参阅我的操作步骤这个 Ask Ubuntu 答案。请注意,只有 才是xfce真正必要的,尽管答案包含了有关运行 Gnome Desktop 等更复杂程序的更多细节。

答案3

移除所有导出显示启动文件中的设置!

不再需要了。

使用最新的 WSL(Windows 10 Build 19044+ 或 Win 11),系统可以解决这个问题。

我重复。

您不再需要导出 DISPLAY 变量!

在阅读官方文档(链接在 MOMO 的答案中)之前,我尝试了其他人发布的所有自动设置 DISPLAY 值的奇特方法,但都不起作用。

背景故事

我和很多和我一样的人都使用非默认名称服务器,因此我无法使用该技巧来引用我的本地系统。相反,我在 /etc/hosts 中有一个 IPv6 localhost 的静态值。

# This is to always have a named host address for servers on WSL, like sshd
# Usually I use 127.0.0.1 instead.
::1     wsl

在 Windows 中也是一样 c:\Windows\System32\drivers\etc\hosts

然后我像这样在 ~/.bashrc 中设置 DISPLAY 变量。

export DISPLAY=wsl:0.0

当测试两者时雷鸟鼠标垫开始好。

但如果我尝试开始Firefox/Firefox-esr我无法访问 DISPLAY。

$ firefox-esr
Error: cannot open display: wsl:0.0

基本上,雷鸟绝不关心 DISPLAY 被设置成什么。也许这就是它对我有用的原因。它甚至在变量曾是设置为错误的IP。

但现在,手动设置 DISPLAY 变量,firefox 运行良好!

有关我的 Windows 10 系统的信息。

$ uname -a
Linux pappa 5.15.79.1-microsoft-standard-WSL2 #1 SMP Wed Nov 23 01:01:46 \
UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.1 LTS
Release:        22.04
Codename:       jammy


> wsl --version
WSL-version: 1.0.3.0
Kernelversion: 5.15.79.1
WSLg-version: 1.0.47
MSRDC-version: 1.2.3575
Direct3D-version: 1.606.4
DXCore-version: 10.0.25131.1002-220531-1700.rs-onecore-base2-hyp
Windows: 10.0.19045.2364

> wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2
  Debian    Stopped         2

NVIDIA Geforce GTX 1070, driver 527.56

我测试过的应用程序。

$ thunderbird --version
 Thunderbird 102.6.1

$ mousepad --version
Mousepad 0.5.8

$ firefox --version
Mozilla Firefox 108.0.1

$ firefox-esr --version
Mozilla Firefox 102.6.0esr

即使像 GIMP 这样繁重的程序也能运行良好。

$ gimp --version
GNU Image Manipulation Program version 2.10.30

最后...

$ set | grep DISPLAY
DISPLAY=:0
WAYLAND_DISPLAY=wayland-0

答案4

sudo nano /etc/wsl.conf

并输入:

[boot]
systemd=true

如果忽略这个细节,我们就会得到错误!!:

错误:无法与服务器通信:发布“http://localhost/v2/snaps/firefox”:拨号 unix /run/snapd.socket:连接:没有此文件或目录

什么时候

sudo snap 安装 Firefox

在 Windows 11 上的 WSL2 上安装 Ubuntu

相关内容