我使用 X11 在 WSL2 发行版中启动 GUI 应用程序。例如,以下是使用 xfce4-terminal 的操作方法:
wsl --distribution foo --user vect /bin/bash -l -c xfce4-terminal
DISPLAY
发行版中的环境变量设置/etc/profile.d/
如下:
export DISPLAY="$(sed -n 's/nameserver\ //p' /etc/resolv.conf):0"
当只有一个发行版 GUI 应用程序启动时,它工作正常。如果我尝试从多个发行版启动 GUI 应用程序,事情就会变得很奇怪。使用从克隆bar
的发行版,我有以下内容: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 应用程序?
答案1
XFCE 终端有一种机制,它会尝试使用 DBus 查找正在运行的实例。可以使用 禁用此行为--disable-server
。
所有 WSL 2 发行版都在单个虚拟机中运行。它们还共享单个网络命名空间:
我不熟悉 DBus,但我发现它支持 TCP 传输。UNIX 套接字可能不会在 WSL 2 发行版之间共享,因为以下命名空间不同:
- 进程控制计算机
- 蒙脱石
- pid 和 pid_for_children
- 悉尼科技大学
但是,DBus 连接可以通过 TCP 转到另一个发行版。这可能会导致有趣的使用桌面软件时的行为。