如何在Windows子系统上运行GUI应用程序的最简单方法是什么?

我搜索了一下,目前有两种方法被建议:安装Windows子系统的增强功能和安装XServer。
我想知道哪种方法最方便(安装和使用都容易),以及哪种方法占用的内存较少。
我只想要Synaptic和CMake。为什么它们不能作为内置功能呢?

重要的是你使用的是Windows 10还是11版本。Windows 11附带了WSLg,下面的答案中有解释。在Windows 10上,我个人认为最简单的方法是安装GWSL,它是一个XServer,可以让你轻松在Windows 10上运行图形化的Linux应用程序...而且它还可以让你在Windows 10上运行远程Linux机器上的图形化应用程序...并且它还可以以图形方式管理这些应用程序,为它们创建Windows快捷方式,自定义这些快捷方式,甚至管理/配置WSL发行版。 - pa4080
对于Windows 11,WSL2用户来说,GUI应用现在可以正常运行了:https://learn.microsoft.com/en-us/windows/wsl/tutorials/gui-apps - David Gilbertson
WSLg现在也适用于Windows 10用户了。我感到非常惊喜和意外。 - NotTheDr01ds
10个回答

VcXsrv

我选择在WSL(Windows 10子系统Linux)中使用VcXsrv。我建议每个人在选择Windows 10 Ubuntu 16.04中的图形用户界面(GUI)支持之前,应该在xming(被接受的答案)和VcXsrv之间进行研究。

安装

安装很简单。截至2019年3月17日,您可以简单地接受默认设置。如果您想从Bash Shell /终端内调用gedit,则需要编辑~/.bashrc并插入此行:

export DISPLAY=localhost:0.0

安装完VcXsrv之后,你可以做什么呢?
我能够运行的有:
sudo apt install ubuntu-desktop
sudo apt install yad
sudo apt install gedit

...安装GUI桌面软件。这样我就可以运行geditnautilus。此外,我还可以通过CLI(命令行界面)使用aptapt-get命令安装特定的GUI应用程序。

当我想在WSL中尝试我的许多Ubuntu bash脚本时,必须安装VcXsrv,以便显示zenityyad的X窗口对话框供用户输入。

正如其他人所指出的,WSL中的GUI并不完美,您可能需要花时间解决一些问题。而且,有些GUI软件在WSL中根本无法工作。

设置说明

我修改了/etc/environment以调整GUI下拉菜单:

PATH="/mnt/e/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games"
export LIBGL_ALWAYS_INDIRECT=Yes
export DISPLAY=localhost:0.0
  • /mnt/e/bin 是一个不寻常的路径,因为我在这里存储了在 Windows 10 双启动 WSL 和 Ubuntu 16.04 双启动中使用的脚本。大多数用户不会在他们的计算机上包含它。

请问,你能告诉我在WSL中运行DE的优势吗? - George Hovhannisian
1@GeorgeHovhannisian 对我来说的优势是我可以使用我在Ubuntu桌面体验中熟悉的gedit。此外,我的许多bash脚本使用zenityyad来创建X窗口对话框。除非安装了VcXsrv,否则这些bash脚本将无法运行。 - WinEunuuchs2Unix
10这一切都很简单:在Windows上,我通过提供的链接下载了VcXsrv。安装并启动它。然后我打开了Ubuntu shell,并输入了 export DISPLAY=:0。现在我可以在Ubuntu中运行 xhostxeyesgnuplot(前提是这些程序已经在Ubuntu WSL中安装好了)。 - Daniel K.
VcXsrv 绝对是个好选择。但是对于多显示器设置,我一直在挣扎。根据我在 Stack Exchange 和 Reddit 上看到的,似乎大部分人也有同样的问题。 - bjd2385
3@dessert +1 对你的评论。考虑到我的用户名意味着“受限于Windows用户转向Unix”,这真是双倍有趣。多亏了WSL,我现在偶尔使用Windows 10,因为我可以在其中运行Ubuntu。叫我WinEunuuchs2Unix2WinSub4Linux?:p - WinEunuuchs2Unix
我从sourceforge安装了VcXsrv,并启动了XLaunch。但是有很多选项 - 我应该选择哪些选项? - Erel Segal-Halevi
2@ErelSegal-Halevi 请查看https://github.com/QMonkey/wsl-tutorial获取完整的指导说明。 - WinEunuuchs2Unix
4还有 export LIBGL_ALWAYS_INDIRECT=1,这样你可以在使用VcXsrv的X环境中获得一些OpenGL应用程序的硬件加速。 - Jippers
@Jippers 抱歉回复慢了。我已经更新了答案。谢谢提醒。 - WinEunuuchs2Unix
我认为在/etc/environment中,“export”语句没有意义,因为它不是一个脚本文件。我认为正确的格式应该是DISPLAY="localhost:0.0" - Maxim Imakaev
我正在为Windows(和WSL)开发一个不需要X的zenity克隆版本,详情请见: https://github.com/ncruces/zenity - Nuno Cruces
2我不得不使用WSL网络接口IP。在.bashrc文件中,我添加了以下内容:\n export DISPLAY_NUMBER="0.0" 和另一行:export DISPLAY=$(grep -m 1 nameserver /etc/resolv.conf | awk '{print $2}'):$DISPLAY_NUMBER - Manuel Alves

简短的回答是你无法做到,因为WSL目前不支持这个功能。WSL并不是一个完整的Linux安装,它只允许你在Windows(Microsoft)内核上运行一些本地的Linux命令/二进制文件,并且有一些限制。
参见https://github.com/Microsoft/WSL/issues/2356 但是,你可以安装第三方的X服务器,比如xming,并通过SSH连接到你的WSL。

https://virtualizationreview.com/articles/2017/02/08/graphical-programs-on-windows-subsystem-on-linux.aspx

我没有在这里复制那个教程,因为它非常普遍(通过 ssh 连接到 X),而且我希望一些应用即使使用这种技术也无法正常工作。


1那么,没有无忧无虑的选择吗?也许将来会有人让Windows上的Synaptic与WSL兼容.... - George Hovhannisian
2WSL 上的图形程序并不意味着您可以在 WSL 上使用 Steam。您需要 Valve 为 WSL 创建支持。 - Rinzwind
@GeorgeHovhannisian 我猜这取决于你对"无麻烦"的理解,我的观点是WSL并不是一个完整的Linux安装,许多功能,包括对图形应用程序的本地支持,目前还不可用。你可以通过ssh -X来运行一些应用程序。 - Panther
12记住,你根本不需要使用SSH。只需设置DISPLAY,然后就可以开始了(至少对于xming和VcXsrv来说是这样)。 - dma1324
一篇更新的文章: https://virtualizationreview.com/articles/2018/01/30/hands-on-with-wsl-graphical-apps.aspx - Farid Cheraghi
6我会对这个回答点踩,因为:首先,它并不完全准确;其次,它也没有符合问题的本意。是的,你可以在WSL中运行图形界面应用程序,并不需要SSH。只需安装一个X服务器(如vcxserve或类似软件),设置DISPLAY后,使用sudo apt-get install synaptic即可。但OP并没有询问支持的应用程序。 - decuser
4@decuser 支持更好的答案:如果没有合适的答案,就自己写一个。 - Thorbjørn Ravn Andersen
随着微软宣布WSL2将完全支持Linux内核(4.19),这个答案在不久的将来会改变吗? - ptr
1@ptr Ubuntu并没有宣布要为WSL2发布GUI桌面,据我所知,它将继续使用现有的命令行界面(CLI)。话虽如此,Panther的回答在最初发布时有点误导性,因为当时已经有VcXsrv可用于GUI桌面。 - WinEunuuchs2Unix
WSL2现在已经发布了,并且拥有一个Linux内核! - Mehrdad Mirreza
只要这个回答被接受,它就应该会收到负评。如果按照投票结果排序,它就不会成为最佳答案,也没有人会在意它是否过时、无用或者有些错误。 - Nobody
@Nobody 那个事实也可以编辑到答案文本的顶部。 - Thorbjørn Ravn Andersen
@ThorbjørnRavnAndersen 我不会建议在编辑中加入“这是一个糟糕的答案,请看其他答案。”这正是踩的作用。 - Nobody
嗯,如果那个被接受的勾选标记具有误导性(因为这是那些匆匆答案寻求者所关注的),那么应该予以说明。微妙的暗示需要更多时间。 - Thorbjørn Ravn Andersen

我在Windows 10上的Ubuntu子系统中使用VcXsrv有着非常积极的体验(Ubuntu 16.04 Xenial x86_64 Linux 4.4.0-17074-Microsoft)。我并没有专注于运行Unity桌面,因为它是无用且占用资源的。我只是简单地通过XServer从Windows 10桌面在GUI模式下运行bash中的应用程序。
  1. 这里的Sourceforge安装VcXsrv

  2. 直接运行VcXsrv应用程序,不要启动XLaunch。当你将鼠标悬停在Win10任务栏上的图标上时,你应该看到localhost:0.0 - 0 clients

  3. 打开Ubuntu Bash:

     cd /mnt

(在 localhost@localhost:/mnt$ 中的结果)

    cd .. 

(localhost@localhost:/$ 意味着这个命令将带你到硬盘的开头,就 WSL 能看到的范围而言...)
    sudo apt-get install dbus synaptic nautilus --install-suggests --show-progress

(这将安装“dbus”以创建GUI的虚拟连接器,“Synaptic软件包管理器”和“Nautilus”文件浏览器用于Unity桌面)
    cd /usr/share/dbus-1 && sudo vi session.conf

(当在vi编辑器中打开session.conf文件时)
按下 i 键进入插入模式并添加
    <!-- <listen>unix:tmpdir=/tmp</listen> || Original Command --> to preserve original rules

比添加:
    <listen>tcp:host=localhost,bind=0.0.0.0,port=0</listen>
    <auth>EXTERNAL</auth>
    <auth>DBUS_COOKIE_SHA1</auth>
    <auth>allow_anonymous</auth> 

按下 ESC 键完成文件编辑,然后输入 :wq 保存文件。
运行这些命令并检查它们的输出:
    $ export DISPLAY=localhost:0
    $ sudo service dbus start
    * Starting system message bus dbus                 [OK]
    $ echo $DISPLAY
    localhost:0
  1. 你完成了!现在只需从Bash运行synaptic、nautilus或firefox,它们应该加载到Win10桌面上。像这样的图形界面选项有些错误,但是可以操作。你可以安装ubuntu-desktopunityccsmcompiz并尝试运行Ubuntu的Unity桌面。我没有尝试设置"Steam",因为我还在努力运行"Unreal",祝好运:)

如果有人知道如何在XServer而不是XTerm上运行gnome-terminal,请分享...

P.S
您可以将VcXsrv添加为可引导的Win10

为了最大限度地使用"Steam"作为原帖中指定的资源,请对Windows进行一些调整以进行网络数据包管理(以降低延迟)和CPU/GPU优先级设置,使其成为Win10XBox... :)

虽然你将在"Unix"下运行"Steam",但shell仍然是"Windows",这使你可以在"Unix"上启动"Steam"...

Tcp Prep:;

在注册表编辑器中:

 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces

在这里,您需要浏览子键列表,以找到用于连接到互联网的网络适配器条目。如果您正在使用DHCP,请查找DhcpIPAdddress条目(具有系统数据值而非:0.0.0.0),以找到正确的适配器。
一旦找到正确的键,请右键单击它,然后选择“新建 > Dword (32位) 值”。
将其命名为TcpFrequency,然后点击ok。
然后双击该值,并将其十进制值设置为1。(要恢复默认设置,请将值更改为2或删除该键) 现在导航到以下键:HKEY_LOCAL_MACHINE\Software\Microsoft\MSMQ
再次右键单击该键,然后选择“新建 > Dword (32位) 值”。
将新参数命名为TcpDelay
然后双击它,并将其十进制值更改为1。(要在以后的某个时间点恢复该键,请将其更改为0或删除该键)
Nagle算法
Nagle算法将几个小数据包合并成一个更大的数据包,以实现更高效的传输。这旨在提高数据传输的吞吐效率。在某些游戏中,禁用"Nagling"可以帮助减少延迟/延时。Windows默认启用了Nagle算法。 要实施此调整,请修改以下注册表键。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{NIC-id}

对于{NIC-id},找到其中列出了您的IP地址的那个;在这个{NIC-id}键下创建以下DWORD值:
  • TcpFrequency并将其设置为1以禁用游戏中的“nagling”。
  • TCPDelay并将其也设置为1以禁用“nagling”。
  • TcpTicks并将其设置为0。
注意:
一些报告称,这些调整确实降低了玩Dota 2和英雄联盟时的延迟,但对某些人无效。我尝试过,当我玩Dota 2时,我的延迟从110ms降低到90ms(SEA服务器)。
网络限制指数
Windows实现了一种网络限制机制,其背后的思想是处理网络数据包可能是一项资源密集型任务。关闭此类限制有助于实现最大吞吐量。
要实施此调整,请运行regedit并修改注册表。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile. 

SystemProfile下创建一个DWORD值,并将其命名为NetworkThrottlingIndex,然后将其十六进制值设置为ffffffff以实现游戏和最大吞吐量:ffffffff完全禁用限速。

系统游戏响应性(对此不太确定:)

多媒体流媒体和使用“多媒体类调度程序”服务(MMCSS)的某些游戏只能利用CPU的80%。 “多媒体类调度程序”服务(MMCSS)确保对CPU资源的优先访问,而不会剥夺较低优先级的后台应用程序的CPU资源。

要实现此调整,请运行 regedit 并修改注册表键。

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile. 

从那里,创建一个新的DWORD并将其命名为SystemResponsiveness,将其十进制值设置为00000000以获得纯游戏/流媒体体验。
在与上述调整相同的注册表中,您还可以更改游戏的优先级。要实施此调整,请转到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile\Tasks\Games

并更改以下注册表值:
  • “GPU 优先级”将其值更改为 8,以供游戏使用。
  • “优先级”设置为 1,以供游戏使用。

为这个 Windows=Xbox 调整(抱歉,是很久之前我复制了你的指引)的作者致以热烈的欢呼...

附言:如果 XServer 对你想做的事情失败,请尝试使用 Docker 找到解决办法。

  • [WSL_Apache_Roolez][1]
  • [Throttling_a_'mm'_:0][2]
  • [You've Got Mail!!!][3]

微软宣布支持 WSL 2 GUI: https://devblogs.microsoft.com/commandline/the-windows-subsystem-for-linux-build-2020-summary/#wsl-gui


6-5-7; :5-6-7... - tenedas
非常感谢您提供如此详细的答案。另外,还要感谢建议编辑的人,我简直不敢相信,居然有人会为运行Steam提出解决方案。另一方面,人们仍然继续建议使用桌面环境,对于这一点我仍然不明白有何用处,我个人甚至不需要文件管理器,更别提一个完整的灵活桌面了。 - George Hovhannisian
我在Windows上安装了Xming,然后按照上面的第3节中的所有步骤进行操作 - 安装dbus(实际上不需要synaptic或nautilus,但nautilus是一个很好的检查),进行session.conf编辑,并启动dbus服务。然后Nautilus成功启动,但会出现一些错误信息。 - MikeW
2你是什么意思说“直接运行VcXsrv应用程序” - 具体要怎么做? - Erel Segal-Halevi
<auth>allow_anonymous</auth>更改为<auth>ANONYMOUS</auth>,然后执行service dbus restart,接着gnome-terminal应该可以正常工作。 - ZAB
我不得不使用WSL网络接口IP。在.bashrc文件中,我添加了以下内容:\n export DISPLAY_NUMBER="0.0" 和另一行:export DISPLAY=$(grep -m 1 nameserver /etc/resolv.conf | awk '{print $2}'):$DISPLAY_NUMBER - Manuel Alves

尽管微软并没有‘官方’支持完整的图形用户界面桌面环境,但它是可以工作的。

打开或关闭Windows功能
启用适用于Linux的Windows子系统
重新启动计算机
打开Microsoft Store
搜索Ubuntu
在应用程序下选择Ubuntu 18.04
点击获取
打开Ubuntu并等待安装
设置用户名和密码

运行以下命令:

sudo apt-get update -y
sudo apt-get install ubuntu-desktop -y
sudo apt-get install xfce4 xorg xrdp -y
sudo sed -i 's/port=3389/port=3390/g' /etc/xrdp/xrdp.ini

创建和修改.xsession
cd /home/user/
sudo vim .xsession

添加文本:

gnome-session --session=ubuntu-2d

保存并退出vi
sudo chmod 755 .xsession
sudo systemctl enable xrdp

你需要在Ubuntu上创建第二个账户。
sudo adduser remote
sudo usermod -aG sudo remote

修改startwm.sh
cd /etc/xrdp
sudo chmod 777 startwm.sh
vim startwm.sh

注释掉底部的两行代码
#test -x /etc/X11/Xsession && exec /etc/X11/Xsession
#exec /bin/sh /etc/X11/Xsession

添加文本:

startxfce4

保存并退出vi
exit

在Windows中,重新启动Ubuntu并运行:
sudo /etc/init.d/xrdp start

在Windows中运行mstsc.exe
计算机:127.0.0.1:3390
用户名留空
连接
会话:Xorg
用户名:remote
密码:password
享受xfce!
完成后,关闭远程桌面连接
返回Ubuntu命令行
sudo /etc/init.d/xrdp stop
exit

1这个正在工作。我使用的是Ubuntu 16。我没有Ubuntu原生的图形用户界面外观。Xorg在xrdp列表中不可用。 - TRiNE
我一直收到以下错误信息 - "登录显示0失败"。有什么想法?为什么xrdp不允许我登录? - J-Dizzle

WSLg现在可在Windows 10和Windows 11上使用,成为大多数用户首选的机制。请参阅下方的更新安装/更新说明。
更详细的内容:
所以问题要求列出在WSL中运行Linux GUI应用程序的三个“评分”标准:
- 安装的简易程度 - 使用的简易程度 - 内存消耗
我还要补充以下两点:
- 灵活性 - 性能
“最简单”的问题在一定程度上是主观的,但我很乐意提供我的意见。总的来说,我认为更重要的是了解所有可用的选项,并决定哪个选项适合您的需求。
目前,在WSL下有至少三种技术可以运行Linux GUI应用程序:
- WSLg - 在Windows中安装第三方X服务器 - 在Ubuntu/WSL中安装xrdp和桌面管理器,并通过Windows远程桌面连接进行连接
我将在下面介绍每种方法。
WSLg

虽然在最初提出这个问题时并不是一个选择,但现在可以使用WSLg在WSL2上直接支持Linux图形界面应用程序。

当我最初撰写答案时,WSLg只能在Windows 11上使用,这使得无法升级的大量Windows 10用户无法使用。但随着WSL应用程序包的发布,情况已经发生了变化,安装对于大多数用户来说更加容易。

目前,Windows 10用户需要安装KB5020030或更高版本,这意味着您的Windows版本号将以.2311或更高结尾。

然后,Windows 11和Windows 10 xxxxx.2311用户应该能够使用以下命令进行安装或更新:

wsl --install
# or, if already installed
wsl --update
# to confirm:
wsl --version

WSLg 支持使用更新的驱动程序进行 GPU 加速。Pulse Audio 也预先配置好。

WSLg 架构采用基于 CBL-Mariner 发行版的只读 "系统发行版",微软还将其用于 Azure 云服务。该发行版已预先配置为运行 Wayland/XWayland,并通过内部 WSL 网络共享套接字,并为每个安装的 WSL2 发行版(如 Ubuntu)创建符号链接到相应的文件(例如 /tmp/.X11-unix)。

WSL 的 /init(PID 1)进程在初始启动时预先配置了 DISPLAYWAYLAND_DISPLAY 变量。

请注意,WSLg 仅适用于 WSL2,不适用于 WSL1 实例。

WSLg 概述和评分:

安装简便:现在Windows 10用户也可以安装,对于大多数使用情况来说,这几种技术中几乎肯定是最简单的。
使用简便:非常好。
灵活性:在某些方面最灵活--运行Wayland/Weston/Xwayland。如果需要,可以运行Weston-on-Weston实现以运行全屏桌面。
内存消耗:简短回答--运行xterm大约需要213MB。我们可以假设其中大部分来自WSLg基础设施。无论如何,我还测试了下面两种情况下的xterm,所以它的内存使用在这些测量中是一个粗略的常数。
有关WSLg的内存使用情况的更多信息,请参见本帖子末尾的脚注。请注意,这包括Wayland、Xwayland和Pulse Audio支持的内存占用。下面列出的另外两个选项不包括Wayland或Pulse Audio。
性能:一旦加载,性能最高- GPU加速。我的系统(nVidia 2070 Super)上的glmark2为666,听起来很低,但请记住,这是合成到Windows桌面上的。它几乎是VcXsrv的两倍,大约是xrdp的4倍。
然而,请注意,在第一次启动WSL2会话中启动任何GUI应用程序时,会有一个初始延迟,因为系统分发被复制并启动。在我的高中档性能系统上,这个延迟大约是5秒。之后的其他GUI应用程序启动时间都在一秒以下。
对于那些无法升级到Windows 11的人,或者那些仍然需要WSL1支持的人来说,仍然有两个不错的选择。第一个,也是我首选的方法,是在Ubuntu中运行xrdp,并简单地使用微软的远程桌面连接,配合轻量级的Xfce4桌面环境。
sudo apt install xrdp xfce4
sudo cp /etc/xrdp/xrdp.ini /etc/xrdp/xrdp.ini.bak
sudo sed -i 's/3389/3390/g' /etc/xrdp/xrdp.ini 
# So it doesn't interfere with Windows RDP on 3389

在/etc/xrdp/startwm.sh中,注释掉最后两行(提到Xsession的那两行),并添加:
#test -x /etc/X11/Xsession && exec /etc/X11/Xsession
#exec /bin/sh /etc/X11/Xsession
exec startxfce4

使用以下命令启动xrdp:
sudo service xrdp start

这就是全部了--你应该能够使用内置的远程桌面连接应用程序连接到你的WSL桌面。要连接的计算机将是localhost:3390。确保选择Xorg作为会话类型。
使用这种方法(与WSLg一样),无需配置任何防火墙规则,因为实际上您正在使用WSL的内置本地主机转发功能,当Windows上没有在该端口上侦听套接字时,它会将localhost流量路由到WSL。
个人而言,我发现这比其他关于第三方X服务器的答案要简单得多。然而,它可能不是最节省内存的方法,因为它需要运行一个桌面环境。
  • 安装方便:只要桌面管理器不需要Systemd(例如Gnome),就非常好。在WSL中运行Systemd目前是一个很大的挑战。虽然有第三方辅助工具可用,但在Systemd下,WSL的系统和使用方式发生了巨大变化。

  • 使用便捷:相当不错-它没有自动配置为在需要时启动,所以不像WSLg那样无缝。有些人报告说它的性能不如VcXsrv,但我也体验到了出色的性能。

  • 灵活性:窗口选项最不灵活。你必须运行一个窗口管理器,并为xrdp进行配置。它不能在Windows桌面上运行单个应用程序。WSLg和第三方X服务器都可以全屏或窗口化运行。

    这种方法可以在Windows 10下运行,并且应该也可以在WSL1下运行,尽管我不记得我是否真的测试过xrdp与WSL1一起使用。

  • 内存消耗:正如我预期的那样,这种技术的内存消耗远高于其他方法。在Vmmem下启动xrdp下的Xfce4桌面额外消耗了687MB的内存。

  • 性能:我个人使用xrdp的范围有限,主要是简单的UI应用程序,性能相当响应。然而,更深入的检查显示,这绝对是性能最差的选择。使用VLC播放H.264视频会出现严重的卡顿,而glmark2得分为167,约为VcXsrv的一半。


在Windows中使用第三方X服务器,如VcXsrv

最后,对于Windows 10和/或WSL1,"正常"的推荐方法(大多数在其他答案中提到)是在Windows上安装第三方X服务器,并配置WSL(版本1或2)以使用它。

我要补充的是,设置WSL2的DISPLAY变量的旧方法可能有点过时了。我建议使用:

export DISPLAY="$(hostname).local:0"

这个使用了mDNS(.local域),在Windows 10和WSL中已经有几年的时间了。由于在WSL Ubuntu中,您的hostname与Windows的"计算机名称"相同,因此它会自动连接到Windows主机的正确IP地址。
对于WSL2,需要设置防火墙规则,因为您是在"跨网络"连接(虚拟网络)。根据我的经验,Windows会在第一次尝试连接时检测到并要求用户采取行动以自动创建防火墙规则。但是,如果错过或忽略了此消息,则必须手动配置规则。
对于WSL1,不需要防火墙规则,并且"正常的"DISPLAY=:0应该可以工作,因为它与Windows共享相同的网络接口(X服务器正在运行的地方)。
设置第三方X服务器肯定不是"最简单"的方法,所以如果您在使用该技术时遇到问题,我建议阅读这里(和其他地方)的其他答案。
关于防火墙规则的一个额外说明——在Windows下,WSL2网络被归类为“公共”网络接口,并且在最近的Windows版本中似乎没有简单的方法来更改这一点。以前是可以的,但现在该接口已隐藏且无法更改。这意味着您必须设置防火墙规则以允许VcXsrv(或任何第三方X服务器)在公共网络上运行。如果您连接到其他不受信任的公共网络,这可能会成为一个问题。
请记住要么:
- 在连接到不受信任的网络时关闭VcXsrv - 和/或在X服务器中强制访问控制。
第三方X服务器 - 概述和评分:
  • 安装方便:在我看来,这是三个选项中最容易出问题的一个。你的结果可能会有所不同,但从Stack网站上发布的答案和问题数量可以看出,人们确实会遇到各种问题。从Windows主机到WSL2虚拟网络的跨网络通信使事情变得复杂。

  • 使用便利:一旦正确安装和配置,中等到容易使用。虽然当在WSL中执行第一个图形界面应用程序时,WSLg会“按需”启动,但在需要时您确实需要手动启动第三方X服务器。或者您可以一直保持运行状态,但这将意味着长期占用内存。

  • 灵活性:非常灵活 - 可以以窗口化或全屏模式运行。目前没有Wayland选项。

    适用于Windows 10/11和WSL1/WSL2。

  • 内存消耗:这三个选项中最好的情况。总共只消耗了48MB - Vmmem增加了10MB,VcXsrv本身增加了另外38.6MB。

  • 性能:虽然我倾向于喜欢xrdp,但我今天的基准测试将让我更仔细地研究VcXsrv(以及其他X服务器,如MobaXterm)。VcXsrv显然进行了一些OpenGL加速,其glmark2分数为322,几乎是xrdp的两倍。即使在3440x1440的分辨率下,H.264的VLC播放也非常流畅(很抱歉,没有4K用于测试)。


注释:测量内存
为了确定每种技术的大致内存使用情况,我查看了Windows中Vmmem进程的内存消耗。这是处理WSL2的虚拟机进程。我在大多数测试之间重新启动了Windows,但在同一技术的测试之间执行了“wsl --shutdown”。
请注意,可以在这些选项中的每个选项中启用PulseAudio,但只有WSLg在开箱即用时包含它的预配置。我没有在xrdp或VcXsrv选项上启用PulseAudio支持,因此不考虑那里所需的任何内存(如果需要音频支持)。
注释:WSLg内存消耗
似乎在使用WSLg时,内存消耗会出现两个"峰值"。第一个是当你启动带有WSLg的WSL2时,这是默认配置。起初我没有注意到这个增加,因为我从未禁用过WSLg。你可以通过编辑.wslconfig文件(参见this doc)并在[wsl2]部分设置guiApplications=false来完全关闭此功能。
在禁用该功能并重新启动我的Ubuntu WSL2实例后,基本内存使用量减少了108MB。当重新开启并重新启动后,WSL2的稳定状态内存消耗增加了。所以,一直启用这个功能也会有一些小的性能损失。
然后,在启动初始的X客户端(例如这里的xterm)时,Vmmem还会再增加105MB。
注:优化措施
通常情况下,我使用默认配置运行了这些方法中的每一个。我在VcXsrv中启用了OpenGL加速,并且我的Windows nVidia驱动程序是最新的,已确认在Ubuntu中用于OpenGL Mesa。
每种技术可能还有其他可优化的方式,可以提高性能。

WSLg现在(2023年)比其他所有的都要好。 - Dee
很好的比较,我一直在想应该采取哪种方法,或许像X410这样的第三方解决方案在性能和图像质量方面更好,但看起来WSLg胜出。 - ruslaniv

根据官方文档的说明:
现在你可以在Windows上预览Windows子系统(WSL)支持运行Linux图形用户界面应用程序(X11和Wayland),并享受完全集成的桌面体验。
WSL 2使Linux图形用户界面应用程序在Windows上感觉原生且流畅易用。
以下是一些功能: - 从Windows开始菜单启动Linux应用程序 - 将Linux应用程序固定到Windows任务栏 - 使用alt + tab在Linux和Windows应用程序之间切换 - 在Windows和Linux应用程序之间进行剪切和粘贴
现在,你可以将Windows和Linux应用程序无缝集成到你的工作流程中,获得无缝的桌面体验。

前提条件

在WSL上安装GUI应用程序。

假设您已满足所有先决条件并已安装了WSL,现在您需要更新WSL。

  1. 打开 PowerShell 窗口,方法是点击 开始 → 输入 "Power Shell" → 右键单击 Windows PowerShell → 以管理员身份运行。

  2. 更新 WSL:

    wsl --update
    
  3. 您需要重新启动 WSL 才能使更新生效:

    wsl --shutdown
    

你现在可以开始在WSL上使用GUI应用程序了。

注意: WSL上的GUI应用程序支持并不提供完整的桌面体验。它依赖于Windows桌面,因此安装面向桌面的工具或应用程序可能不受支持。

安装任何GUI应用程序,例如,要安装gedit,请运行:

sudo apt update
sudo apt install gedit

要启动gedit,请运行以下命令:
gedit /path/to/any/file/you/want/to/edit

GUI apps in WSL

参考资料:官方文档

我需要在Windows或Ubuntu中安装一些特殊的WSLg版本的NVidia驱动程序吗?还是只需安装常规的Windows NVidia驱动程序就足以提供硬件加速? - ruslaniv

根据我的研究,wsl最初并不是为GUI用户设计的。然而,我们可以从第三方安装一个X服务器来显示GUI界面。我已经测试过,通过一些适当的设置,可以使用VcXsrv来显示Debian Linux桌面。
我认为我的方法可以顺利地在Windows子系统Linux Debian上显示mate桌面(GUI)。我制作了一个视频,介绍如何从零开始安装和显示wsl Debian上的mate桌面(GUI)。链接:https://youtu.be/QjogEWudpaM 在Ubuntu上安装mate桌面的步骤略有不同。
第一步:安装wsl
- 以管理员身份打开PowerShell,并输入以下命令:Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux - 从Microsoft商店安装"Debian"或"Ubuntu"
第二步:安装图形用户界面,例如mate桌面。
对于Debian用户:
  • 在Windows 10中打开Linux控制台,并输入以下命令安装mate-desktop:sudo apt-get update,然后按回车键。
  • 更新完成后,输入sudo apt install task-mate-desktop,然后按回车键。

或者对于Ubuntu用户:

  • 从Windows 10打开Ubuntu控制台。
  • 输入sudo apt install tasksel,然后按回车键。
  • 输入sudo apt update,然后按回车键。
  • 输入sudo tasksel install ubuntu-mate-desktop,然后按回车键。

第三步:在Windows 10中安装X服务器。 我使用了一个名为VcXsrv的开源服务器。可以从https://sourceforge.net/projects/vcxsrv/下载。
安装完成后:

  • 在Windows 10中打开XLaunch

  • 执行以下设置:

    • 选择:"一个大窗口"
    • 选择显示编号:0
    • 点击下一步
    • 选择启动无客户端
    • 点击下一步
    • 点击完成

第4步:在Linux控制台进行设置:

  • 输入export DISPLAY=:0

  • 输入export LIBGL_ALWAYS_INDIRECT=1(可能不需要此命令)

第5步:显示mate-desktop图形界面:

  • 对于Debian用户,输入mate-session

  • 对于Ubuntu用户,输入mate-sessionlightdm-session

如果你对我的描述感到困惑,你可以查看我的YouTube视频在Microsoft Windows子系统Linux上安装GUI(mate桌面)

这些步骤看起来很有希望,但我卡在最后一步:mate-session导致无法初始化服务器:无法连接:连接被拒绝 **(mate-session:4087):警告**:10:11:55.427:无法打开显示器: - phi
2这个网站给了我缺失的信息:https://github.com/microsoft/WSL/issues/4106 对于WSL2,你必须找到实际的IP地址,因为它是一个单独的虚拟机: export DISPLAY=$(cat /etc/resolv.conf | grep nameserver | awk '{print $2}'):0.0 此外,我的Windows防火墙(私有/公共)阻止了VcXsrv。 - phi

如果你想要一个无需努力的即用解决方案,请使用MobaXTerm。它是一个很棒的多标签终端仿真器,直接支持WSL,并且内置了优化的X服务器。我经常在Moba上使用synaptic,甚至是RStudio。


由于您想要简单易行...在Microsoft Store中有一个名为x410的应用程序。它基本上是一个没有使用Cygwin本身的Cygwin X11服务器。安装后 - 即零配置 - 您可以运行WSL X11应用程序!(甚至整个桌面)。您可能希望将以下行插入到您的.bashrc文件中(从您的WSL用户帐户),以便您可以从bash终端运行应用程序。
### Setup a D-Bus instance that will be shared by all X-Window apps
pidof dbus-launch 1> /dev/null || dbus-launch --exit-with-x11 1> /dev/null 2> 
/dev/null

## Export
export DISPLAY=127.0.0.1:0.0

我在特卖时以大约5欧元的价格购买了X410。所以如果觉得太贵的话,或许可以等待下一次特卖!

我选择了Panther的答案,不仅因为它是唯一的答案,而且还因为它是正确的答案;没有一种无麻烦(直接)的方法来运行GUI应用程序。

另外,我使用了this的教程,并进行了一些修改:

  1. 我没有安装xfce,因为我不知道为什么需要一个桌面。
  2. XLaunch中选择了Multiple Windows(没有桌面环境,因此不需要一个巨大的窗口)。
  3. 不需要mkdir修复,也不需要单独的终端。

我安装了哪些GUI应用程序?只有Synaptic和CMake,因为我真的想不出在WSL上还需要什么其他的。

我不使用虚拟机/双启动,原因正如Panther指出的那样;我需要一个方便(对我来说)的开发环境,而不是一个完全灵活的操作系统。


https://www.vagrantup.com/docs/other/wsl.html - vagrant是一个非常好的工具,可以快速搭建开发环境。看起来它支持wsl。虽然我还没有尝试过。 - TamusJRoyce
谢谢你提供教程的链接。那帮助我解决了我的问题:)。 - Shmuel Kamensky