我搜索了一下,目前有两种建议的方法:安装 Windows Subsystem for Linux 的增强功能并安装 XServer。
我想知道哪种方法最省事(易于安装和使用),哪种方法占用的内存最少。
我只想要 Synaptic 和 CMake。为什么这不能成为内置功能?
答案1
虚拟主机
我选择在 WSL(适用于 Linux 的 Windows 10 子系统)中使用VcXsrv
。我建议每个人都在xming
(可接受的答案)和虚拟主机在 Windows 10 Ubuntu 16.04 中为图形用户界面(GUI)支持选择其中一个之前。
安装
安装非常简单。自 2019 年 3 月 17 日起,您只需接受默认设置即可。如果您想gedit
从 Bash Shell/终端内调用,则需要编辑~/.bashrc
并插入此行:
export DISPLAY=localhost:0.0
VcXsrv安装后可以做什么?
我可以运行:
sudo apt install ubuntu-desktop
sudo apt install yad
sudo apt install gedit
... 安装 GUI 桌面软件。这样我就可以运行gedit
和了nautilus
。此外,我还能够使用apt
或apt-get
命令通过 CLI(命令行界面)安装特定的 GUI 应用程序。
当我想在 WSL 中尝试许多 Ubuntu bash 脚本时虚拟主机必须安装,zenity
这样yad
x-windows 对话框才会显示以供用户输入。
正如其他人所指出的,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 双启动中使用的脚本的地方。大多数用户不会在他们的机器上包含这个。
答案2
简短的回答是你不能,因为 WSL 尚不支持此功能。WSL 不是带有 Linux 内核的完整 Linux 安装,它允许你在 Windows(Microsoft)内核上运行一些本机 Linux 命令/二进制文件,并且有限制。
看https://github.com/Microsoft/WSL/issues/2356
但是,您可以将第三方 X 服务器(例如 xming 和 ssh)安装到 WSL 中。
我没有将该教程复制到这里,因为它相当普遍(X over ssh)并且我预计即使使用这种技术某些应用程序也无法运行。
答案3
我在 Windows 上的 Ubuntu 上的 Win 10 Bash 上使用 VcXsrv 的体验非常好(Ubuntu 16.04 Xenial x86_64 Linux 4.4.0-17074-Microsoft)。我没有专注于运行 Unity 桌面,因为它没用而且很耗资源。我只是使用 XServer 从 Windows10 桌面以 GUI 模式从 bash 运行应用程序。
从以下位置安装 VcXsrv在 Sourceforge 上
直接运行 VcXsrv 应用程序,不要启动 XLaunch。
localhost:0.0 - 0 clients
将鼠标悬停在 Win10 任务栏上的图标上时,您应该会看到打开 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 Package Manager”和“Nautilus”文件资源管理器用于 unity-desktop
cd /usr/share/dbus-1 && sudo vi session.conf
(session.conf
在 vi 编辑器中打开时)
按下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
- 您已完成!现在只需从 Bash 运行 synaptic、nautilus 或 firefox,它们应该会在 Win10 桌面上加载。像这样的 GUI 选项有缺陷但可以运行。您可以安装、、
ubuntu-desktop
并尝试运行unity
ccsm
compiz
适用于 Ubuntu 的 Unity 桌面。我没有尝试设置“Steam”,因为我仍然在努力运行“Unreal”,祝你好运:)
如果有人知道如何gnome-terminal
在 XServer 而不是 XTerm 上运行,请分享...
附言:
你可以添加 VcXsrv 作为 Win10 可启动项
为了按照原始帖子中所述使用“Steam”最大化您的资源,请稍微调整您的 Windows 以进行网络包管理(以降低延迟)和 CPU/GPU 优先级以制作 Win10XBox……:)
尽管你将在“Unix”下运行“Steam”,但shell 仍然是“Windows”,这允许你在“Unix”上启动“Steam”……
Tcp准备:;
在注册表中:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters\Interfaces
在这里,您需要浏览子键列表以找到用于连接到 Internet 的网络适配器条目。如果您使用的是 DHCP,则需要查找DhcpIPAdddress
条目(系统数据值不是:0.0.0.0
)以找到正确的适配器。
找到正确的键后,右键单击它并选择新建 > Dword(32 位)值。
命名Tcp频率并点击ok。
然后双击该值并将其十进制值设置为 1。(要恢复默认设置,请将值更改为 2 或删除该键)现在导航到以下键:HKEY_LOCAL_MACHINE\Software\Microsoft\MSMQ
再次右键单击该键并选择新建 > Dword(32 位)值。
命名新参数Tcp延迟
然后双击它并将其十进制值更改为 1。(要在以后恢复该项,请将其更改为 0 或删除该项)
Nagle 算法
Nagle 算法将多个小数据包合并为一个更大的数据包,以实现更高效的传输。这旨在提高数据传输的吞吐效率。禁用“nagling”可以帮助减少某些游戏中的延迟/ping。Nagle 算法在 Windows 中默认启用。要实现此调整,请修改以下注册表项。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces\{NIC-id}
对于{NIC-id}
,查找列出您的 IP 地址的那个;在此{NIC-id}
键下创建以下 DWORD 值:
- TcpFrequency 并将其设置为 1,以禁用游戏的“唠叨”。
- TCPDelay 并将其也设置为 1,以禁用“nagling”
- TcpTicks 并将其设置为 0
笔记:
一些报告称,这些调整确实降低了玩 Dota 2 和英雄联盟时的延迟,但对某些人来说却不起作用。我试过了,玩 Dota 2 时延迟从 110 毫秒改善到了 90 毫秒(SEA 服务器)。
网络节流指数
Windows 实现了网络限制机制,这种限制背后的理念是处理网络数据包可能是一项资源密集型任务。关闭这种限制有利于实现最大吞吐量。
要实现此调整,请运行 regedit 并修改注册表
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile.
在下面系统配置文件,创建一个 DWORD 值并将其命名为网络节流指数然后将其十六进制值设置为 ffffffff 用于游戏和最大吞吐量:ffffffff 完全禁用节流。
系统游戏响应能力(这个不太确定:)
多媒体流和一些使用“多媒体类调度程序”服务 (MMCSS) 的游戏最多只能使用 80% 的 CPU。“多媒体类调度程序”服务 (MMCSS) 可确保优先访问 CPU 资源,而不会拒绝将 CPU 资源提供给优先级较低的后台应用程序。
要实现此调整,请运行 regedit 并修改注册表项
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile.
从那里创建一个新的 DWORD 并将其命名为系统响应性对于纯游戏/流媒体,将其十进制值设置为 00000000。
在与上述调整相同的注册表配置单元中,您还可以更改游戏的优先级。要实施此调整,请转到
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Multimedia\SystemProfile\Tasks\Games
并更改以下注册表值:
- 将“GPU 优先级”的值更改为 8 以用于游戏。
- 将游戏的“优先级”设置为 1。
向这个 Windows=Xbox 调整的“未知”作者(请原谅我复制了您的指示已经有一段时间了)致敬……
PPS:如果 XServer 未能按您想要的方式运行,请尝试使用 Docker 寻找解决方法。
- [WSL_Apache_Roolez][1]
- [节流阀:0][2]
- [您有新邮件!!!][3]
微软宣布为 WSL 2 GUI 开绿灯: https://devblogs.microsoft.com/commandline/the-windows-subsystem-for-linux-build-2020-summary/#wsl-gui
答案4
总结
WSLg 现已在 Windows 10 和 Windows 11 上可用,使其成为大多数用户的首选机制。请参阅下文了解更新的安装/更新说明。
(更多)细节:
因此,问题要求对在 WSL 中运行 Linux GUI 应用程序的技术提出三个“评分”标准:
- 易于安装
- 使用方便
- 内存消耗
我要补充一点:
- 灵活性
- 表现
在某种程度上,“最简单”是一个见仁见智的问题,但我很乐意提供我的看法。总的来说,我认为更重要的是了解所有可用的选项,并决定哪一个能满足你的需求。
目前,在 WSL 下运行 Linux GUI 应用程序的技术至少有三种:
- 世卫组织
- 在 Windows 中安装第三方 X 服务器
- 在 Ubuntu/WSL 中安装
xrdp
桌面管理器并通过 Windows 远程桌面连接进行连接
下面我将逐一介绍。
世卫组织
虽然在最初提出这个问题时这并不是一个选项,但现在使用 WSLg 在 WSL2 上开箱即用地支持 Linux GUI 应用程序。
当我最初写下我的答案时,WSLg 只是 Windows 11 上的一个选项,这使得大量因各种原因无法升级的 Windows 10 用户无法使用它。现在,随着 WSL 的发布,这种情况已经发生了变化申请材料,使大多数用户的安装变得更加容易。
Windows 10 用户目前需要KB5020030或更高版本,这意味着您的 Windows 内部版本号将以.2311
或更高版本结尾。
Windows 11 和 Windows 10xxxxx.2311
用户应该能够使用以下命令进行安装或更新:
wsl --install
# or, if already installed
wsl --update
# to confirm:
wsl --version
使用更新的驱动程序,WSLg 还支持 GPU 加速。Pulse Audio 也是预先配置的。
WSLg 架构采用基于以下的只读“系统分布”CBL-水手发行版,微软也将其用于 Azure 云服务。此发行版已预先配置为运行 Wayland/XWayland,套接字通过内部 WSL 网络共享,并符号链接到/tmp/.X11-unix
您安装的每个 WSL2 发行版(例如 Ubuntu)的相应文件(例如)。
DISPLAY
和变量WAYLAND_DISPLAY
由 WSL /init
(PID 1)进程在初始启动时预先配置。
请注意,WSLg 仅适用于 WSL2,不适用于 WSL1 实例。
WSLg 总结与评分:
易于安装:现在 Windows 10 用户也可以安装,对于大多数用例来说,这几乎肯定是三种技术中最简单的一种。
易用性:优秀
灵活性:在某些方面非常灵活 - 运行 Wayland/Weston/Xwayland。如果需要,可以运行 Weston-on-Weston 实现来运行全屏桌面。
内存消耗:简短回答——运行大约需要 213MB
xterm
。我们可以假设其中大部分来自 WSLg 基础设施。无论如何,我还用测试了下面的另外两种场景xterm
,因此它的内存使用量在这些测量中大致是常数。有关 WSLg 内存使用情况的更多信息,请参阅本文末尾的脚注。请注意,这包括具有此内存占用的 Wayland、Xwayland 和 Pulse Audio 支持。下面列出的其他两个选项不包括 Wayland 或 Pulse Audio。
性能:加载后最高 - GPU 加速。我的系统 (nVidia 2070 Super) 上的 glmark2 为 666,听起来很低,但请记住,这是合成到 Windows 桌面上的。它几乎是 VcXsrv 的两倍,是 xrdp 的四倍左右。
然而,请注意是首次在 WSL2 会话中启动任何 GUI 应用程序时,系统分发版会被复制并启动,此时会出现初始延迟。在我的中高端性能系统上,此延迟约为 5 秒。此后,其他 GUI 应用程序的启动时间不到一秒。
偏磷酸钠
对于无法升级到 Windows 11 或仍需要 WSL1 支持的用户,仍然有两个不错的选择。第一种方法也是我首选的方法,是xrdp
在 Ubuntu 中运行,只需使用 Microsoft 的远程桌面连接和 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 的内置本地主机转发,localhost
当 Windows 中该端口上没有监听套接字时,它会将流量路由到 WSL。
我个人觉得这比这里关于第三方 X 服务器的其他答案要简单得多。但是,它可能不是最节省内存的,因为它需要运行桌面环境。
xrdp 总结和评分:
安装简便:只要桌面管理器不需要 Systemd(例如 Gnome),安装就非常容易。让 Systemd 在 WSL 中运行目前是一项重大挑战。可以使用第三方帮助程序,但在 Systemd 下,WSL 的系统和使用方式会发生巨大变化。
易用性:相当不错 - 不会自动配置为在需要时启动,因此不如 WSLg 那么无缝。有些人报告说它的性能不如 VcXsrv,但我也体验到了出色的性能。
灵活性:窗口选项灵活性最低。您必须至少运行一个窗口管理器,并将其配置为 xrdp。它无法在 Windows 桌面上运行单个应用程序。WSLg 和第三方 X 服务器都可以全屏或窗口运行。
此方法确实可以在 Windows 10 下运行,也应该可以在 WSL1 下运行,尽管我不记得是否真的用 WSL1 测试过 xrdp。
内存消耗:正如我所料,这项技术的内存消耗是最高的。在 xrdp 下启动 Xfce4 桌面在 Vmmem 下又消耗了 687MB。
性能:我个人对 xrdp 的使用仅限于简单的 UI 应用程序,性能相当灵敏。然而,更深入的检查表明,这肯定是最差性能选项。使用 VLC 播放 H.264 视频时卡顿严重,glmark2 得分为 167,约为 VcXsrv 的一半。
Windows 中的第三方 X 服务器,例如 VcXsrv
最后,对于 Windows 10 和/或 WSL1,推荐的“正常”方法(如此处的其他答案中主要提到的)是在 Windows 中安装第三方 X 服务器,并在 WSL(版本 1 或 2)中配置 Ubuntu 以使用它。
我要补充一点,设置 WSl2 变量的旧方法DISPLAY
可能有点过时了。我建议使用:
export DISPLAY="$(hostname).local:0"
.local
这利用了Windows 10 和 WSL 中已有数年的mDNS(域名)。由于hostname
WSL 中的 Ubuntu 与 Windows 的“计算机名称”相同,因此会自动连接到 Windows 主机的正确 IP 地址。
对于 WSL2,需要为此选项设置防火墙规则,因为您正在“跨网络”连接(尽管是虚拟网络)。根据我的经验,Windows 将检测到第一次连接的尝试并请求用户操作以自动创建防火墙规则。但是,如果错过或忽略此消息,则必须手动配置规则。
对于 WSL1,不需要防火墙规则,并且“正常”DISPLAY=:0
应该可以工作,因为它与 Windows(X 服务器正在运行)共享相同的网络接口。
设置第三方 X 服务器当然不是“最容易的”,所以如果您在使用该技术时遇到麻烦,我建议您阅读这里(和其他地方)的其他答案。
关于防火墙规则还有一点需要注意——Windows 下的 WSL2 网络被归类为“公共”网络接口,在最近的 Windows 版本中似乎没有简单的方法来更改这一点。以前是可以的,但现在该接口被隐藏了,无法更改。这意味着您必须设置防火墙规则以允许 VcXsrv(或任何第三方 X 服务器)在公共网络上使用。如果您连接到其他不受信任的公共网络,这可能会成为一个问题。
请记住:
- 连接到不受信任的网络时关闭 VcXsrv
- 和/或在 X 服务器中强制访问控制。
第三方 X 服务器 - 总结和评分:
安装简便性:在我看来,这是三种选项中最容易出现问题的。您的结果可能会有所不同,但从答案数量(以及 Stack 网站上发布的问题)可以看出,人们在使用此技术时确实会遇到各种问题。跨网络通信(从 Windows 主机到 WSL2 虚拟网络)使问题变得复杂。
易用性:安装并正确配置后,中等至简单。虽然 WSLg 会在 WSL 中执行第一个 GUI 应用程序时“按需”启动,但您需要在需要时自行启动第三方 X 服务器。或者您可以让它始终处于运行状态,但这将意味着更长时间的内存使用。
灵活性:高 - 可以窗口化或全屏化运行。目前没有 Wayland 选项。
在 Windows 10/11 和 WSL1/WSL2 上运行。
内存消耗:这三个选项中最好的情况。总共只消耗了 48MB——Vmmem 增加了 10MB,VcXsrv 本身又增加了 38.6MB。
性能:虽然我倾向于使用 xrdp,但今天的基准测试让我将来更仔细地研究 VcXsrv(也许还有其他 X 服务器,例如 MobaXterm)。VcXsrv 显然具有一些 OpenGL 加速功能,其 glmark2 得分为 322,几乎是 xrdp 的两倍。VLC 播放 H.264 非常流畅,即使在 3440x1440 分辨率下也是如此(抱歉,没有 4k 可供测试)。
脚注:测量记忆
为了确定每种技术的大致内存使用情况,我查看了 Windows 中的 Vmmem 进程内存消耗。这是处理 WSL2 的虚拟机进程。我在大多数测试之间也重新启动了 Windows,但在wsl --shutdown
同一技术的测试之间进行了一次重新启动。
请注意,可以使用每个选项启用 PulseAudio,但只有 WSLg 包含开箱即用的预配置。我没有在 xrdp 或 VcXsrv 选项上启用 PulseAudio 支持,因此那里需要的任何内存(如果您需要音频支持)都不会被考虑在内。
脚注:WSLg 内存消耗
WSLg 的内存消耗显然出现了两次“高峰”。第一次发生在启动 WSL2 时,WSLg 只是“启用”(默认)。我一开始没有注意到这种增加,因为我从来没有已禁用WSLg。完全可以通过编辑文件来完全关闭该功能.wslconfig
(请参阅本文档guiApplications=false
) 并在部分中设置[wsl2]
。
禁用该功能并重新启动我的 Ubuntu WSL2 实例后,我的基本内存使用量下降了 108MB。重新打开并重新启动后,WSL2 内存消耗“稳定状态”有所增加。因此,启用此功能会造成一点损失每时每刻。
然后,当启动初始 x 客户端(xterm
在本例中)时,Vmmem 中又会出现 105MB 的增加。
脚注:优化
总的来说,我使用开箱即用的默认配置运行了这些方法。我确实在 VcXsrv 中启用了 OpenGL 加速,并且我的 Windows nVidia 驱动程序是最新的,并确认可用于 Ubuntu 中的 OpenGL Mesa。
每种技术可能都有可能进行额外的优化来提高性能。