x11 - 运行 Linux GUI 应用程序 vis WSL2
问题描述
我已经参考了有关此问题的各种其他建议来源,包括此处的其他问题,但这些建议都没有解决我的问题。以下是我到目前为止所做的事情:
启用必要的虚拟化后,我安装了 VcXsrv 并启动了一个实例。我以管理员身份打开 PowerShell 会话并运行wsl --install -d Ubuntu
. 这个安装顺利进行,我设置了我的用户名和密码。我跑了sudo apt-get update
,然后sudo apt-get install emacs
。尝试运行emacs
默认为终端版本。我运行sudo apt-get install x11-apps
了一些简单的实用程序,我可以尝试运行它来查看 GUI 是否可以开箱即用。跑步xcalc
给了我错误Error: Can't open display:
根据此处和此处的建议,我将以下内容添加到~/.bashrc
:
export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=1
我重新启动会话并运行 printenv 以验证更改是否生效。运行 xcalc 然后导致以下错误:
Authorization required, but no authorization protocol specified.
Error: Can't open display: XXX.XX.XX.X:0
其中X
s 仅出于隐私目的。然后我转向这里的建议,上面写着“转到Windows防火墙->允许应用程序通过防火墙->单击更改设置->选择“VcXsrv Windows服务器”的两个条目->确定”。我遵循了这一步,但即使重新启动了 VcXsrv 和我的 WSL2 终端,它也没有任何影响。
我在一些地方看到另一条建议通过 XLaunch 关闭访问控制。在重新启动 VcXsrv 和我的 WSL2 终端后,这也没有做任何事情。
然后我转向这里的建议,该建议描述了使用 route.exe 来查找适当的 IP 地址。我重新启动终端并验证 DISPLAY 变量已更改;确实有。尝试运行 XCalc 最终不再抛出授权错误,而是继续抛出Can't open display
错误,只是使用新的 IP 地址。
我还尝试了这里的建议,它建议创建一个打开 TCP 端口 6000 的规则。这也没有做任何事情。
我在这个问题上看到的其他帖子往往涵盖了我在这里再次描述的相同领域。任何额外的指导都会有所帮助,因为没有任何效果。
解决方案
您收到授权错误:
Authorization required, but no authorization protocol specified.
Error: Can't open display: XXX.XX.XX.X:0
请注意,在 X 终端世界中,有两个元素:在您的 windows 中运行的 VcXsrv 服务器和在 linux 中运行的 X 应用程序。我认为你得到的错误是因为 VcXsrv 服务器不接受来自 X 应用程序的连接。
要允许来自 X 应用程序的连接,您可以
- 完全禁用 VcXsrv 访问控制,以允许来自所有应用程序的连接
- 使用 X 终端控制选项来允许来自特定计算机的连接
在 XLaunch 的 VcXsrv 中禁用访问控制
在 Windows 中,您正在运行 VcXsrv 服务器。通常,您使用该程序运行应用XLaunch
程序。有一个选项可以禁用访问控制并允许来自网络中所有计算机和应用程序的连接。为此,您必须检查额外设置窗口中的相应选项。
在 VcXsrv 中禁用访问控制的其他选项
使用静默模式:通常人们会创建一个配置文件config.xlaunch
并在 Windows 启动时运行 VcXsrv。您可以使用该XLaunch
程序保存可用于启动该程序的配置文件。例如,如果将配置保存到config.xlaunch
文件中,则可以使用"C:\the\path\to\VcXsrv\vcxsrv.exe" -run config.xlaunch
.
Microsoft 网站上有一些在 Windows 10 启动时运行程序的说明。
使用命令行选项:如果您使用命令行选项运行 VcXsrv 服务器,您可以使用该-ac
选项禁用访问控制。您可以在 VcXsrv wiki 中找到有关其他命令行选项的信息。
vcxsrv.exe -ac
为 VcXsrv 配置授权
您可以配置 VcXsrv 服务器将使用的授权协议,并明确允许哪些计算机可以在您的计算机中显示 X 应用程序,而不是禁用访问控制。请注意,要使用授权机制,您必须在上述设置中启用访问控制选项。
使用xhost
命令:
有一个xhost
命令可以帮助您控制哪些计算机可以在您的 VcXsrv 服务器中显示应用程序。您可能会xhost
在安装服务器的同一文件夹中找到此命令,即在类似C:\Program Files\VcXsrv
.
使用基于主机的访问,要启用来自特定主机的连接,您可以运行类似xhost +inet:<ip-address>
. 以下是一些示例:
xhost +inet:localhost
xhost +inet6:localhost
xhost +inet:linux1
xhost +inet6:linux1
xhost +inet:192.168.1.191
如果您想允许来自任何主机的连接,您可以使用xhost +
.
xhost +
如果您发出xhost -
命令,则仅将访问权限授予您明确授予权限的 IP 地址。您可以在linux 手册中xhost
找到更多信息。
使用xauth
选项
无需手动添加主机,您可以定义一个包含主机信息的文件,该文件可以在您的计算机中显示程序。通常,您在 Unix/Linux 机器上创建该文件并将该文件复制到您的 Windows 计算机。然后,在您使用的命令行中启动 VcXsrv 服务器,您必须指定该文件。
您可能会在 VcXsrv 和 WSL 中找到一些配置 XAuth 的说明。
推荐阅读
- sql - 需要在下面的sql查询中返回空字符串行而不是空行
- node.js - 节点 js ejs 会话未正确关闭/打开
- c# - 在控制器中获取请求的 WebApi 版本
- flutter - Flutter AspNet Core SocketException (SocketException: OS Error: Connection timed out, errno = 110, address = 192.168.1.87, port = 46186)
- flutter - 颤动中多个屏幕的一张背景图片
- sql-server - 将存储过程插入到具有外键的多个表中
- java - JACKSON:如何在使用 Jackson 将 POJO 转换为 JSON 时忽略 POJO 名称?
- agora.io - 老师的客户端在 Android 上使用 Agora.io
- h.264 - h264 流复用:结果文件的持续时间短于录制时间
- reactjs - TypeError:navigation.getParam 不是函数