Ubuntu 的所有功能(包括对 GUI 应用程序的支持)是否在 Ubuntu 的 Windows Subsystem for Linux 安装的最新版本中可用,或者在 Windows 10 上的 Windows Subsystem for Linux 中使用 Ubuntu 是否有任何限制?
答案1
Windows 10 上的 Windows Subsystem for Linux 中 Ubuntu 的限制随着时间的推移越来越少,并且从由于 WSL 中缺少功能而导致的限制转变为由于 Ubuntu 的学习曲线而导致的限制。
Windows Subsystem for Linux (WSL) 允许您在 Windows 10/11 PC 上运行 Linux 软件。启用 WSL 后,Windows 可以同时运行 Linux 发行版。Microsoft 允许您在所有主要版本的 Windows 11 上启用 WSL,这意味着您无需从 Windows 11 Home 升级到 Pro 即可使用它。Windows 11 使用 WSL 2.0,这是 WSL 的升级版本,旨在在 Hyper-V 环境中运行完整的 Linux 内核。来源
Windows 和 Linux 之间的集成
Windows 的 Linux 子系统 (WSL) 正在不断改进 Windows 与 Linux 之间的集成。你可以:
- 从 Linux 命令行(即 Ubuntu)运行 Windows 工具(即 notepad.exe)。
- 从 Windows 命令行(即 PowerShell)运行 Linux 工具(即 grep)。
- 在 Linux 和 Windows 之间共享环境变量。(内部版本 17063+)
wsl <command>
使用(或> )从 Windows 命令提示符 (CMD) 或 PowerShell 运行 Linux 二进制文件wsl.exe <command
。 以这种方式调用的二进制文件:
- 使用与当前 CMD 或 PowerShell 提示符相同的工作目录。
- 以 WSL 默认用户身份运行。
- 具有与调用进程和终端相同的 Windows 管理权限。
wsl(或 wsl.exe)后面的 Linux 命令的处理方式与在 WSL 中运行的任何命令一样。sudo、管道和文件重定向等操作均可正常工作。来源
挂载 ext4 文件系统
从 Windows Insiders 预览版本 20211 开始,WSL 2 将提供一项新功能:wsl --mount
。此新参数允许在 WSL 2 内部连接和安装物理磁盘,这使你可以从 Windows 文件管理器和 PowerShell 访问 Windows 本身不支持的文件系统(例如 ext4)。
GPU 计算、WSL 安装和 WSL 更新已在 WSL 2 的最新 Insider 版本中发布
在微软重组的测试结构下,Windows 10 build 20150 的 Dev Channel 预览版中推出了对 WSL 的 GPU 支持,这使得它能够测试与特定未来功能版本无关的 Windows 10 版本。几周前,微软在 Build 2020 上宣布即将为 WSL 提供 GPU 支持,同时支持运行 Linux GUI 应用程序。WSL 的 GPU 访问举措旨在使在 WSL2 中运行的应用程序的性能与在 Windows 上运行的应用程序的性能相媲美。微软表示,GPU 计算支持是 WSL 用户最需要的功能。20150 更新包括对 Nvidia 的 CUDA 并行计算平台和 GPU 的支持,以及对 AMD 和英特尔的 GPU 的支持。它还支持 DirectML(直接机器学习),这是微软用于硬件加速机器学习的 Windows 10 API。斜线点
WSL 即将推出什么
使用单个命令安装 WSL
关于 WSL 的一个常见抱怨是它不容易找到和启用。微软正在对 wsl.exe 命令行工具进行一些改进,以帮助您安装 WSL。很快您将能够通过wsl.exe --install
在命令行中输入:简单地安装 WSL。
此命令将添加到每台 Windows 计算机,因此您需要做的就是打开具有管理员权限的终端窗口并运行wsl.exe --install
。从那里将启用 WSL 可选组件,并在重新启动时自动下载并安装您指定的发行版。
您可以期待在未来几个月内在 Windows Insiders Fast Ring 中看到此功能的初始版本。
首次安装时,WSL 2 将成为新的默认设置
我们还引入了一项更改,使 WSL 2 成为首次安装 WSL 时的新默认分发类型。WSL 2 带来了重大改进,我们发现 Insider 分支上的大多数用户都在使用 WSL 2 发行版。在开发时,将wsl.exe --install
其默认为人们正在使用的版本是有意义的:WSL 2,并且在启用“适用于 Linux 的 Windows 子系统”可选组件时,我们也将其包含在任何新安装的 WSL 中。您将在接下来的几个月内看到 Insiders Fast 环中的这些变化以及改进wsl.exe --install
。
WSL 将支持 GPU 计算工作流程
添加通用计算架构和/或GPU 计算支持自首次发布以来,WSL 一直是我们最需要的功能!在过去 3 年多的时间里,WSL、虚拟化、DirectX、Windows 驱动程序团队和我们的硅片合作伙伴一直在努力完成一项复杂的工程壮举,以实现这一功能。
这就是为什么我们很高兴地宣布,我们将在未来几个月内开始在 Windows 10 Insider 版本中预览对 WSL 的 GPU 计算支持。
初期,GPU计算能力将支持两种场景:
- NVIDIA CUDA
- 支持专业人员使用的现有 Linux 工具和工作流程
- 直接机器学习
- 最初针对初学者和学生,利用来自多家供应商的支持 DirectX 12 的 GPU
- 该团队将发布带有 DirectML 后端的 TensorFlow 预览包,从而实现在整个 Windows 硬件上对 AI 和 ML 工作负载进行与硬件无关的加速 - DirectML 也将支持原生 Windows,包括 Windows 上的 TensorFlow。
此预览版发布后,您只需确保安装了最新的 Windows Insider Fast 版本 WSL 2,从硬件供应商处安装正确的 GPU 驱动程序,然后就可以开始在 WSL 内部开发、训练和测试您的机器学习和 AI 模型。
此更改将在未来几个月内发布到 Windows Insiders Fast 通道。有关此更改的含义及其实现方式的所有详细信息,请阅读DirectX 开发人员博客文章。
我们的规划是向 WSL 添加 Linux GUI 应用程序支持
微软正在向客户提供对 Windows 10 上 Linux 图形用户界面 (GUI) 应用程序的承诺支持从下一个 Windows 10 版本开始”官员在 5 月 25 日表示。
我们收到的最多的请求之一是不仅支持命令行应用,还支持 Linux GUI 应用。例如,有些用户希望在 Linux 环境中运行他们喜欢的 Linux GUI 文本编辑器或 IDE,并处理存储在发行版文件系统中的本地代码,或者只是在 Windows 计算机上开发 Linux GUI 应用。
我们的目标是让您能够在桌面上无缝运行 Linux GUI 应用和 Windows 应用。这样您就可以使用 Linux 应用编辑、构建和运行代码,以 Python 可视化数据图,甚至可以使用针对 Linux 环境优化的应用。
在 BUILD 上,我们演示了这项工作的早期版本,直接从 WSL 运行了一些 GUI 示例应用程序,例如Eye of Gnome
和gedit
媒体mpv
播放器。这些应用程序连接到在 WSL 内部运行的 Wayland 服务器,该服务器与 Windows 主机上的 RDP 客户端进行通信。您可以在下面看到此操作的屏幕截图,其中我们在 WSL 和 Outlook 中并排运行 GNOME 文件管理器。
这些变化都在 WSL 的团队路线图中,您可以期待在 2020 年底听到有关这项工作的更多信息,届时此答案将更新。
答案2
注意:我注意到这个问题实际上是更早(和活跃)的我不能用适用于 Microsoft Windows 的 Ubuntu 应用程序做什么?。虽然我将保留此答案的当前形式,但请参阅我对另一个问题的回答获取任何更新。
我是 WSL 的忠实粉丝,但我首先要承认 WSL 存在相当多的限制。幸运的是,大多数限制都有解决方法,但它们确实让大多数新用户措手不及。
首先,让我先列出 WSL 上的 Ubuntu 与 VM 或物理机上的传统 Ubuntu 安装之间的一些“差异”。我将在下面的“限制”部分中引用其中的一些:
WSL1 作为“系统调用转换层”运行,尝试将 Linux 内核 API 转换为 Windows 内核的 API。
在 WSL2 中运行的 Ubuntu 更像是一个容器。它在虚拟机(您无法访问)中的真实 Linux 内核下运行。Ubuntu 在该 VM 中的命名空间内运行。它本身并不直接在 VM 中运行。
WSL 有自己的 init 系统。它的主要工作(除了一些“正常”的 Linux init 任务)是设置 Linux 和 Windows 之间的互操作性。例如,它:
- 使 Windows 网络可供 Ubuntu 使用
- 将 Windows 路径添加到环境中
- 将 Windows 驱动器安装到 Ubuntu
该 init 在 Ubuntu WSL 实例/命名空间/容器内作为 PID1 运行。
启动 WSL 并不像启动虚拟机或物理机。Ubuntu 在启动过程中通常会执行的许多任务(通常通过 Systemd)对于 WSL 来说要么是不必要的,要么实际上会损害其正常运行。
启动 WSL 时没有“登录”的概念。WSL 会检测默认用户并自动启动 中为该用户定义的 shell
/etc/passwd
。无需输入密码。
WSL 的局限性
考虑到这一点,以下是我能想到的一些限制:
初始化/Systemd: 在 WSL 中运行的 Ubuntu 不使用 Systemd。Systemd 要求它作为 PID1 运行,但 WSL 的 init 作为 PID1 运行。您在各种任务(例如安装 Docker)中遇到的许多文档、博客文章等都假设 Systemd 可用。我在这个答案。
此外,与计算机紧密相关的软件包依靠除非您求助于该答案中提到的命名空间 hack,否则 Systemd 上的 .NET Framework 将无法运行。Gnome 是最常见的示例之一。
另一个个人的例子是,几天前我试图在非 Systemd 发行版中运行
cockpit
(用于 Web 界面),但我就是找不到任何方法来解决它对 Systemd 的依赖。libvirtd
对于新用户来说,这无疑是在 WSL 上使用 Ubuntu 最容易感到困惑的地方之一。
在 WSL2 上运行 Systemd:与前面的内容相关,如果您尝试使用 Systemd,Ubuntu(以及几乎所有发行版)上的默认 Systemd 启动过程会做出一些在 WSL 上无效的假设。例如:
Systemd 将删除中的文件
/tmp
,但在启动时,WSL 已经在那里为 Windows 11 下众所周知的 X11 套接字创建了一个符号链接。Systemd 将设置一些
binfmt_misc
处理程序,覆盖 WSL 处理程序,允许您在 WSL 下运行 Windows 二进制文件。Systemd 将重新定义用户环境,覆盖附加到它的 Windows 路径。
如果您打算运行 Systemd(即使使用“辅助”脚本),我强烈建议您记住它可能会干扰 WSL 下的其他 Ubuntu 操作,并计划在发生这种情况时进行故障排除。
访问物理硬件:在 WSL 上,你对硬件的访问将受到限制:
串口:WSL1 在某种程度上可以访问串行端口,但仅限于系统调用实现。也就是说,可以在 WSL1 上运行一些利用串行端口的软件,而这在 WSL2 上是不可能的。
物理驱动器:在 Windows 10 下,您只能通过网络协议或连接到 Windows 并格式化为 NTFS 的物理驱动器安装驱动器。无法安装原始驱动器和使用其他文件系统的驱动器。
Windows 11 下的 WSL2做能够安装其他驱动器类型。
图形:在 Windows 10 下,无法从 Ubuntu on WSL 直接访问任何图形应用程序或界面。如果你想在 Ubuntu on WSL 中运行图形 Linux 应用程序,你必须在视窗并使用适当的
DISPLAY
设置在 WSL 中运行 X 客户端/应用程序。请参阅这个答案和这个答案更多细节。同样,在 Windows 11 下,WSL2 现在可以开箱即用地运行图形应用程序。
图形处理器:同样,在 Windows 10 下,无法访问物理 GPU,因此无法执行 GPU 计算任务。
Windows 11 也对此进行了改进,提供了许多可以使用 Windows 驱动程序传递到物理 GPU 的 GPU 计算任务。
USB:USB 设备无法直接访问。不过,在 WSL2(Windows 10 和 Windows 11 中均如此)下,可以从 Windows 共享它们使用 USB/IP然后附加到 Ubuntu。
请注意,原版 WSL2 内核不包含大多数 USB 设备的设备驱动程序。例如,甚至连基本的媒体捕获(即摄像头)驱动程序也不包含在内。但是,您可以为 WSL2 构建自己的内核并包含必要的驱动程序。但是,请注意,目前,我(和其他人)尚未成功从 WSL 中的 USB 摄像头捕获视频。请参阅这个问题在 Stack Overflow 上了解最新进展。
Ubuntu 启动设备:WSL 中 Ubuntu 的主启动虚拟磁盘/分区必须格式化为 ext4。尽管 WSL2 内核支持 btrfs 等附加文件系统,但它们只能用于辅助分区。
依赖于身份验证/登录的任务:由于上述 (6),某些依赖于身份验证的任务在 WSL 上的行为会有所不同。例如,通常您会编辑
/etc/security/limits.conf
以提高用户的限制(例如打开文件的数量、优先级/nice 等)。但是,这是一个由 PAM(“可插入身份验证模块”)在用户登录。如果没有经过身份验证的登录,则永远不会处理此文件。请参阅这个答案如果你遇到这种情况。启动服务:
Windows 10:如果没有 Systemd(或其他 init)作为依赖,就没有简单的方法来定义 WSL 实例中应该默认运行哪些服务。例如,
cron
守护进程将不会运行(这个问题)。解决方法是检查 shell 启动(例如~/.bashrc
)中是否有服务正在运行,如果没有,则启动它。请参阅这个答案更多细节。Windows 11:现在至少包括在启动时运行任务的能力。另请参阅同样的答案了解详细信息。但是,我可能会建议您使用此方法启动进程管理器作为主要任务,然后使用进程管理器启动和管理其他所需任务。我在这个 Stack Overflow 上的答案使用
supervisord
,但任何进程管理器(当然不要求它是 PID1)都可以工作。
联网:虽然这可能属于“硬件”部分,但它可能值得在这里单独提及。WSL2 的网络目前在 Hyper-V 内的虚拟交换机下运行,并且该交换机与网络的其余部分进行 NAT。这意味着您无法轻松地从本地网络上的其他设备(计算机、电话等)访问 WSL2 中的网络服务,而无需付出额外努力。
最简单的解决方法是尽可能使用 WSL1。其他多种解决方法也一样。
VPN:同样,当连接到禁用本地流量的某些 VPN 时,WSL2 将失去网络,因为它是“本地”(而不是本地主机)网络流量。
表现:总体而言,WSL2 下的性能相当不错。不过,有几点需要注意:
WSL1:WSL1 在其“伪 ext4/overlay”文件系统上的性能略有下降。不过,WSL2 在 ext4 文件系统上实现了接近原生的性能。
WSL2:WSL2 采用了巨大的访问 Windows 驱动器上的文件(尤其是多个小文件)时性能会受到影响。在 NTFS 驱动器上检出 WSL2 内核需要 10 多分钟(否则大约需要 30 秒)。强烈建议您将项目文件保存在 ext4 文件系统上或在访问 Windows 驱动器时使用 WSL1。
我保留一个 WSL1 实例主要是为了在需要时使用 Windows 驱动器。
我确信我会记得更多(或者也许有人会在评论中指出它们),如果需要的话我会将它们添加进去。
再次强调,对于大多数 WSL 用户来说,上述大多数解决方法都不是严重的阻碍。然而,它们是我在 Stack Exchange 网站上回答的许多问题的根源。