我使用 X11 在 WSL2 发行版中启动 GUI 应用程序。例如,下面是使用 xfce4-terminal 的方法:
wsl --distribution foo --user vect /bin/bash -l -c xfce4-terminal
DISPLAY
发行版中的 env 变量设置/etc/profile.d/
如下:
export DISPLAY="$(sed -n 's/nameserver\ //p' /etc/resolv.conf):0"
当只有一个发行版 GUI 应用程序从其启动时,它工作正常。如果我尝试从多个发行版启动 GUI 应用程序,事情会变得很奇怪。从withbar
克隆发行版,foo
我有以下内容:wsl --export ...
wsl --import ...
在 PowerShell 中
wsl --distribution foo --user vect /bin/bash -l -c xfce4-terminal
在 xfce4-terminal 中的 bash
$ echo $WSL_DISTRO_NAME
foo
在 PowerShell 中
wsl --distribution bar --user vect /bin/bash -l -c xfce4-terminal
在 xfce4-terminal 中的 bash
$ echo $WSL_DISTRO_NAME
foo
正如您在第二种情况下看到的那样,尽管已指定,但仍在xfce4-terminal
运行。foo
bar
同时bash
从PowerShell
它在正确的发行版中运行开始:
wsl --distribution bar --user vect
$ echo $WSL_DISTRO_NAME
bar
该问题与VcXsrv
和 一起重现Cygwin/X
。
我究竟做错了什么?如何从多个 WSL2 发行版中并行启动带有 X11 的 GUI 应用程序?
XFCE 终端有一种机制,它尝试使用 DBus 查找正在运行的实例。可以使用 禁用此行为
--disable-server
。所有 WSL 2 发行版都在单个虚拟机中运行。它们还共享一个网络命名空间:
我不熟悉 DBus,但我看到它支持 TCP 传输。由于不同的命名空间,UNIX 套接字可能不会在 WSL 2 发行版之间共享:
但是,DBus 连接通过 TCP 转到另一个分布是可行的。在使用桌面软件时,这可能会导致有趣的行为。