whm*_*hme 124 x11 x11-forwarding windows-10 windows-subsystem-for-linux wsl-2
当从 WSL1 迁移到 WSL2 时,很多事情都会发生变化;显然这也适用于 X11 转发。
为了在 Windows 10 上使用 WSL2 的 X11 转发,我需要采取哪些步骤,就像我在 WSL1 上所做的那样?
whm*_*hme 145
将以下内容添加到您的~/.bashrc
:
export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=1
Run Code Online (Sandbox Code Playgroud)
在 Windows 的 X11 服务器上启用公共访问。*
添加一个单独的入站规则为TCP端口6000到Windows防火墙以允许X服务器WSL访问,所描述的WSL -窗口-工具栏-发射器的人。
正如WSL_subreddit_mod 在 reddit 上所指出的,正如您在微软关于 WSL2 的文档中所读到的那样,WSL2 架构使用虚拟化网络组件。这意味着 WSL2 具有与主机不同的 IP 地址。这就解释了为什么 WSL1 的 X11 转发设置不能简单地转移到 WSL2。
在有关 WSL 的 Ubuntu Wiki 页面上,您已经可以在Running Graphical Applications下找到适用于 WSL2 的配置。上面提到的 Reddit 用户也提出了类似的配置,他还贡献了解决方案的另一部分:在 Windows 下的 X11 服务器上启用公共访问。
这意味着将以下内容添加到您的~/.bashrc
:
export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=1
Run Code Online (Sandbox Code Playgroud)
并在适用于 Windows 的 X11 服务器上启用公共访问。*
在 Windows 10 上为 WSL2 启用 X11 转发的最重要部分仍然缺失:Windows 防火墙通过默认为 WSL 配置的网络接口阻止连接。
需要一个单独的TCP 端口 6000入站规则来允许 WSL 访问 X 服务器。创建规则后,如wsl-windows-toolbar-launcher人员所述,可以在新创建规则的设置中将 IP 地址范围限制为 WSL 子网,在Scope下:172.16.0.0/12。
*:如果您使用VcXSrv,您可以通过在额外设置中禁用访问控制来为您的 X 服务器启用公共访问:
或者vcxsrv.exe
直接使用ac
标志调用:vcxsrv.exe -ac
正如ameeno在github问题上所指出的那样。
Ken*_*yun 42
对于像我这样只允许使用私有网络的人来说,
虽然他们应该都打勾
它应该在 Windows Defender 防火墙上有停止标志
双击它并允许私人和公共连接,
所以所有 4 个项目都应该被勾选为绿色。
然后@NicolasBrauer的上述答案对我有用。
就像在 XLaunch 和
export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=1
Run Code Online (Sandbox Code Playgroud)
小智 20
使用/etc/resolv.conf
名称服务器对我不起作用,因为我禁用了resolv.conf
生成/etc/wsl.conf
(我有一个自定义resolv.conf
)。
最终您需要 WSL2 主机 IP 地址,它也应该是您的默认路由。这是我的~/.bashrc
Debian WSL2 发行版条目:
export DISPLAY=$(ip route | awk '/^default/{print $3; exit}'):0
Run Code Online (Sandbox Code Playgroud)
从这个 github 问题复制了我的答案。
这个想法是使用通过 stdio 进行通信的能力。
ubuntu
是安装了 socat 的 WSL1 发行版的名称):mkdir -p /tmp/.X11-unix/
socat UNIX-LISTEN:/tmp/.X11-unix/X0,fork EXEC:"/mnt/c/Windows/System32/wsl.exe -d Ubuntu socat - TCP\:localhost\:6000"
Run Code Online (Sandbox Code Playgroud)
基本上,这会建立一条从普通 X unix 域套接字到主机端口 6000 的隧道。
假设有一个 tcp 服务在 Windows 的 5555 端口上运行。在 WSL2 发行版中,在后台运行以下命令(ubuntu
是安装了 socat 的 WSL1 发行版的名称):
socat TCP-LISTEN:5555,fork EXEC:"/mnt/c/Windows/System32/wsl.exe -d ubuntu socat - TCP\:localhost\:5555"
Run Code Online (Sandbox Code Playgroud)
这只是做同样的事情,但方向相反。您可以在 WSL1 发行版中运行以下内容:
socat TCP-LISTEN:5555,fork EXEC:"/mnt/c/Windows/System32/wsl.exe -d ubuntuwsl2 socat - TCP\:localhost\:5555"
Run Code Online (Sandbox Code Playgroud)
在我的 PC 上,它可以处理高达 150MB/s 的数据,因此它不是最快的,但对于大多数应用程序来说已经足够快了。
此答案假定您已经在 Windows 主机上运行了有效的 XServer 和 PulseAudio 配置,因为您已经在使用 WSL1。(您可能还必须将 -ac 参数添加到命令行,以使您选择的 XServer 与 WSL2 一起使用。)
我这样做的方式,并确保我得到 X11 转发,无论我是在 Windows 主机上使用静态 IP 地址还是 DHCP,甚至我的主机名或网络位置是否更改,我都将以下内容添加到我的 ~/ .bashrc 文件:
# Get the IP Address of the Windows 10 Host and use it in Environment.
HOST_IP=$(host `hostname` | grep -oP '(\s)\d+(\.\d+){3}' | tail -1 | awk '{ print $NF }' | tr -d '\r')
export LIBGL_ALWAYS_INDIRECT=1
export DISPLAY=$HOST_IP:0.0
export NO_AT_BRIDGE=1
export PULSE_SERVER=tcp:$HOST_IP
Run Code Online (Sandbox Code Playgroud)
做完上面的事情后,不管我的Hostname或者Host的IP地址是什么,每次在WSL2中启动一个BASH会话都会放到环境中。通过从命令行运行 firefox 并观看 YouTube 视频来测试它。您应该能够听到声音并看到应用程序本身来观看视频。此外,通过从命令行启动其他 GUI 应用程序进行测试。
它的作用:它使用 host 命令从输出中提取与主机名关联的 IPv4 地址,搜索与包含 Windows 主机 IPv4 地址的行匹配的地址,去除除 IP 地址之外的其余信息,以及然后 awk 并将其打印到变量中,并修剪输出。然后,这用于提供必要的 IP 地址作为字符串,以便在允许转发 X11 和声音输出的环境变量中使用。
如果其他方法对您不起作用(因为它们对我不起作用),希望它对您有用。
大多数 CLI 应用程序可以从 BASH 提示符或 Windows 终端运行。如果要创建快捷方式,大多数 CLI 应用程序都可以像以下示例中的任何一个进行设置(这种情况下不需要 X11 转发,除了像 Links2 这样的应用程序):
C:\Windows\System32\wsl.exe -e htop
C:\Windows\System32\wsl.exe lynx
Run Code Online (Sandbox Code Playgroud)
如果你想为 Linux GUI 应用程序创建桌面快捷方式,除非你可以在启动程序之前从 ~/.bashrc 文件中获取环境变量,否则你必须使用以下模板创建快捷方式,并输入程序名称代替{您的程序}:
C:\Windows\System32\wsl.exe LIBGL_ALWAYS_INDIRECT=Yes IP=$(host `hostname` | grep -oP '(\s)\d+(\.\d+){3}' | tail -1 | awk '{ print $NF }' | tr -d '\r') DISPLAY=$IP:0.0 PULSE_SERVER=tcp:$IP {yourprogram}
Run Code Online (Sandbox Code Playgroud)
您不必为许多程序放置完整的命令行。对于基于 PERL 的程序或基于 Python 的程序,有时必须添加 PERL 和 PYTHON 的路径以及程序的完整路径,才能使用 WSL2 在 Linux 中运行此类 GUI 程序。对于我的一个 perl 程序,我必须这样做:
C:\Windows\System32\wsl.exe IP=$(host `hostname` | grep -oP '(\s)\d+(\.\d+){3}' | tail -1 | awk '{ print $NF }' | tr -d '\r') ; export LIBGL_ALWAYS_INDIRECT=Yes export DISPLAY=$IP:0.0 ; cd /mnt/c/Users/{yourusername}/Desktop ; /usr/bin/perl ~/wget-gui.pl
Run Code Online (Sandbox Code Playgroud)
您可能需要进行一些试验才能使某些应用程序正常运行。例如,您可能需要 dbus-launch 一个应用程序,并且需要将该命令添加到程序名称之前的快捷方式中。
C:\Windows\System32\wsl.exe LIBGL_ALWAYS_INDIRECT=Yes IP=$(host `hostname` | grep -oP '(\s)\d+(\.\d+){3}' | tail -1 | awk '{ print $NF }' | tr -d '\r') DISPLAY=$IP:0.0 PULSE_SERVER=tcp:$IP dbus-launch --exit-with-session gedit
Run Code Online (Sandbox Code Playgroud)
在某些情况下,您可能必须使用较短的变量名称。有些应用程序根本无法正常运行,但这种情况会随着时间的推移而改善。此外,不要尝试从 Windows 命令提示符或 PowerShell 运行上述内容。它将抛出有关“grep”未被识别为内部或外部命令等的错误。
以下是在我的 Windows 10 系统上运行的几个 Linux GUI 应用程序的屏幕截图,在 WSL2 上使用 X11 转发。
正如其他人指出的那样,我想出了一个在 Windows 10 上使用 vxcsrv 的解决方案。
https://sourceforge.net/projects/vcxsrv/
export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=1
sudo apt update
sudo apt install x11-apps
Run Code Online (Sandbox Code Playgroud)
在 wsl 中:输入 xcalc - 计算器应该在 Windows10 中打开
现在 XServer 将在 windows 启动时启动。
我将它用于 ROS。为我工作。
我的 XServer 无法通过 Internet 访问,因此可以禁用访问控制。
对于可能使用ROS/Gazebo、Unity等仿真引擎的人,则需要另一种配置。
将这些添加到~/.bashrc
:
export DISPLAY=$(awk '/nameserver / {print $2; exit}' /etc/resolv.conf 2>/dev/null):0
export LIBGL_ALWAYS_INDIRECT=0
Run Code Online (Sandbox Code Playgroud)
务必使这两个 公共接入和私有访问的Windows中的X11服务器。同时禁用您的 X11 服务器支持的任何访问控制。
如果您使用VcXSrv取消选中Native opengl。VcXSrv 的最终配置如下:
难度较小的替代 X11 服务器是X410和MobaXterm。有关此配置的一些详细信息,请参阅此处和此处。
Windows 11和Windows 10 22H2 (内部版本 2311)及更高版本包含WSLg。它只是有效\xe2\x84\xa2
\n建议使用vGPU ( Intel AMD Nvidia )驱动程序驱动程序。
\n“系统信息”应用程序将告诉您当前的版本号。
\n注意:WSL1 与 WSLg 不兼容。新的 WSL2 实例即可正常工作\xe2\x84\xa2。
\n现有的 WSL2 系统需要“更新”:
\n\n\n\n
\n- 在管理 PowerShell 中:
\nwsl --update
- \n
wsl --shutdown
强制重新启动 WSL
不要忘记删除任何其他修改DISPLAY
您可能所做的任何其他修改。
归档时间: |
|
查看次数: |
124019 次 |
最近记录: |