我已经在 Windows 10 WSL 2 上设置了 Ubuntu,以便可以开始通过 ssh 连接到学校的工作站。我通过 ssh 连接到远程计算机时没有遇到问题,但无法使用 X 服务器打开 GUI。
Ubuntu 20.04.1 LTS
Windows 10.0.19041 不适用 内部版本 19041
问题:每当我尝试打开 X 服务器 GUI 时,经过一分钟的暂停后,就会出现此信息: 无法打开显示错误
我正在运行 VcXsrv xLaunch,使用的设置是我在其他指南中找到的。
我确保export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0
在进行任何尝试之前运行,但我还将它添加到了 ~/.bashrc 中,所以这并不重要。
我已经修改了 ssh_config 和 sshd_config 文件以取消注释 X11 转发。
为了以防万一,我一直在使用 xeyes 或 xclock 来测试。
我一直为此感到很为难,因此我非常感激任何能帮助我朝着正确方向前进的东西。如果能帮助解决这个问题,我很乐意提供任何额外的信息。
谢谢大家!!
快速编辑:我意识到我没有 .Xauthority 文件,而且无法生成该文件(xauth: (argv):1: unable to open display ":0".
尝试时出现错误)。我不确定这是否是问题的一部分。
编辑:根据@harrymc 的建议,我使用以下标志创建了一个新的 vcxsrv 配置文件:"C:\Program Files\VcXsrv\vcxsrv.exe" :0 -ac -terminate -lesspointer -multiwindow -clipboard -wgl -dpi auto
我运行netstat -abno|findstr 6000
了一个管理员 Powershell,得到了这个结果,但我不确定如何解释它。
接下来,我安装了 Terminator 来测试我的更改,但没有打开 GUI 窗口,我的终端给了我这些信息,[1] 47 和第二条消息之间有几分钟的延迟。
编辑:将 ~/.bashrc 更改为export DISPLAY=localhost:0.0
。错误基本保持不变Error: Can't open display: localhost:0.0
。我现在正在尝试调试 DISPLAY 命令。
答案1
我之所以能够解决这个问题,是因为我在 Github 上发过一篇类似的帖子。感谢莫洛内德寻求帮助。
我按照你的建议将显示内容更改为如下形式:
export DISPLAY="grep nameserver /etc/resolv.conf | sed 's/nameserver //':0"
这并没有解决这个问题……但是在你发布的链接中,我查看了人们提供的一些解决方案。我决定检查 VcXsrv 的防火墙权限,发现当我安装它时,它甚至从未为自己创建过配置文件。
我转到控制面板 > 系统和安全 > Windows Defender 防火墙 > > 高级设置 > 入站规则 > 新规则... > 程序 > %ProgramFiles%\VcXsrv\vcxsrv.exe > 允许连接 > 检查 > 域/私人/公共 > 命名和确认规则。
而且它成功了!!!我已经研究了三天了,我不知道为什么花了这么长时间才找到解决方案,但我非常感谢你的帮助@moloned!
答案2
几年后,我又遇到了类似的问题。正如其他人提到的,不再DISPLAY
需要设置任何变量。对我来说,启动 X 应用程序有一天突然停止工作,而 Wayland 应用程序仍然可以工作。
有一份文件使用 WSLg 诊断“无法打开显示”类型的问题提供一些可能的解决方案。
WSL2 中的 GUI 应用程序支持由以下机构提供韋斯特。运作方式是它启动一个单独的系统容器,该容器具有只读根文件系统,但显然共享相同的网络接口并挂载了容器文件系统。在系统容器中,它启动 Weston 作为 Wayland 服务器,启动 Xwayland 作为 X 服务器。您可以通过运行 在系统容器中打开 shell wsl --system
,但除了验证正在运行之外,您无法在那里做很多事情Xwayland
。
系统容器的某些部分已安装到您的 Linux 容器中/mnt/wslg
。您可以在那里检查一些日志文件。
对我来说,问题在于/tmp/.X11-unix
。它需要是 的符号链接/mnt/wslg/.X11-unix
,但对我来说它是一个空目录。我暂时修复了这个问题,如下所示:
rmdir /tmp/.X11-unix && ln -s /mnt/wslg/.X11-unix /tmp/.X11-unix
但是,每次启动 WSL 时,符号链接都会再次被删除。这似乎是由我的tmp.mount
或systemd-tmpfiles-setup.service
systemd 导致的,它会清除/tmp
目录。我通过在以下位置创建此文件解决了此问题/etc/systemd/system/wslg.service
:
[Unit]
Description=symlink /tmp/.X11-unix
After=systemd-tmpfiles-setup.service
[Service]
Type=oneshot
ExecStart=rmdir /tmp/.X11-unix
ExecStart=ln -s /mnt/wslg/.X11-unix /tmp/
[Install]
WantedBy=sysinit.target
然后使用 启用它systemctl enable wslg
。
答案3
针对 2022 年底或之后发现此问题的用户的更新。
移除所有导出显示启动文件中的设置!
不再需要了。使用最新的 WSL,系统会处理这个问题。您也不需要第三方 X 服务器软件,因为 WSLg 现在可在 Windows 10 Build 19044+ 上使用。
我重复。
您不再需要导出 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
@NoSubstitute 的回答是正确的,我忽略的是我必须更新我的 WSL。
我使用的是 WSL 2,但显然 WSLg(使 WSL 与 Wayland/X 服务器兼容的部分)已捆绑在较新版本中。
我已完成以下步骤进行更新:
wsl --update
wsl --shutdown
(将重新启动 wsl)
然后您可以运行env | grep DISPLAY
并查看所需的变量是否已设置。