适用于 Linux 的 Windows 子系统 (WSL):我不能使用适用于 Microsoft Windows 的 Ubuntu 应用程序做什么?

Leo*_*313 31 windows-subsystem-for-linux

大多数人都知道,在 Microsoft Store 中,有Ubuntu 的三个版本。这意味着在 Windows 上我可以模拟 Ubuntu 并直接在 Windows 上使用 Ubuntu 命令行。

问题很简单:我不能从 Windows 中模拟的 Ubuntu 命令行执行哪些操作,而我可以在基于 Linux 的 Ubuntu 上执行此操作?下载这个 Ubuntu 应用程序、安装它并使用它而不是真正的操作系统有用吗?是否可以安装所有开发库?我可以编写(或不编写)设备驱动程序吗?换句话说:限制是什么?

Ubuntu-on-Windows 缺少哪些基于 Ubuntu Linux 的功能?

欢迎提供新的答案:我知道每个软件都在通过改进特性和功能而不断变化!

小智 21

在适用于 Linux 的 Windows 10 子系统下运行的 Ubuntu 不是完整的发行版。事实上,它根本不是 Linux——它没有 Linux 内核。所以你不能测试或尝试内核扩展,包括驱动程序,因为你没有运行 Linux

如果你想做这样的事情,要么在虚拟机中安装 Ubuntu——Win10 包括 Hyper-V,但就我个人而言,我更喜欢 VirtualBox,它是免费的——或者双启动你的机器,在裸机上运行 Ubuntu。你几乎肯定会发现后者比运行 Windows 更快——我在我所有的机器上都这样做。部分原因是您在运行 Windows 时需要防病毒保护,这会降低性能,尤其是磁盘性能。因为你需要它,Win10 包括内置的防病毒软件。

使用 Linux,您不需要任何,因此对性能的影响较小。

  • 为什么你认为 Linux 上不需要杀毒软件? (21认同)
  • @SeligkeitIstInGott 这不是模拟器。它是一个兼容层,就像 Linux 上的 Wine 一样。 (7认同)
  • “使用 Linux,您不需要任何 [防病毒],因此对性能的影响较小。” -- Linux [不能免疫](https://en.wikipedia.org/wiki/Linux_malware) 对病毒/恶意软件/等。防病毒软件在 Linux 中非常有用,既可以保护您自己,也可以防止不良内容传播到其他环境(例如 Windows)。我知道它通常不使用,但这并不意味着威胁不存在。 (6认同)
  • @Hack-R 没有欺骗。他们从一开始就 [很清楚](https://blogs.msdn.microsoft.com/wsl/2016/04/22/windows-subsystem-for-linux-overview/) 这不是真正的 Linux 内核. 它从“运行 Linux 工具,尤其是 Bash”到“运行 Linux 环境/发行版/应用程序”开始。如果其中任何一项具有欺骗性,那么 WINE 也是如此。 (6认同)
  • 我有这个问题。1. 运行 Windows 并不“需要”杀毒软件。Windows 操作系统将在没有防病毒软件的情况下运行。它还带有防病毒软件,这导致了第 2 点:选择随机软件指向“降低操作系统速度”似乎是随意的 - 如果我认为 ubuntu 速度较慢,因为我需要一堆额外的软件才能使应用程序运行只能在 Windows 下工作?(就像一个虚拟机,所以我可以玩 AAA 游戏?)。3. 您没有提供任何证据来支持这一主张。 (5认同)

Leo*_*313 13

上述每个答案都有许多有用的信息。我在这里总结了他们每个人的主要概念。

2020 年 4 月更新此处解释了使用 WSL 的利弊。很明显为什么拥有真正的 Linux 内核是一个优势!!此外,这里有将 WSL 2 安装到 Windows 10 的指南。如果您已经安装了 WSL 1 并且想要传递到 WSL 2,您可以在此处找到执行此操作的说明。

2019 年 8 月更新:发布了新的WSL 2(阅读此处了解更多信息)。似乎您可以使用真正的 Linux 内核和 Linux 文件系统。老实说,到目前为止我还没有尝试过新版本(它在我的 TODO 列表中)。

2019 年 5 月更新:正如最近的一个答案中所指出的,WSL 正在通过使用真正的 Linux 内核并提供更多选项来发展。我已经阅读了这份文件,如果得到证实,这将是向前迈出的一大步。在这里您可以找到一篇关于“W10 上的真实 Linux 内核”主题的好文章

回答 2018 年 7 月 总结: “Windows 上的 Ubuntu 是 Linux 兼容模式下 Windows 内核之上的完整 Ubuntu 用户空间”,正如其中一条评论所指出的那样。

我不能做什么:

  • 到目前为止,官方不支持图形接口。这也意味着无法执行图形应用程序。此外,当然,出于这个原因,不支持基于经典 Ubuntu Linux 的标准 GUI。
  • 由 Linus 开发的 Linux 内核不是 Windows Subsystem for Linux (WSL) 的一部分。这意味着您无法开发驱动程序并直接尝试。
  • 并非每个命令行都有效。

我可以做什么:

  • 使用命令行和基本的 Bash shell。可以编写和执行脚本。
  • 开发应用程序(编译或交叉编译并执行它们),但目前还没有图形。
  • 使用“apt-get”安装/删除新/旧数据包。

附加信息:

  • 官方支持其他发行版(例如 Debian 和 Kali)
  • 这些应用程序是免费的,可从 Windows 应用商店下载,您可以在此处找到安装和使用说明。

  • 博客的另一个问题中,有关如何为 WSL 使用 GUI(非官方的第三方)的一些建议


小智 7

在适用于 Linux 的 Windows 子系统 (WSL) 下,您无法轻松完成的一件事是运行 Linux GUI 应用程序。

为此,您必须安装不受支持的 X11 服务器,例如 VcXsrv 或 Xming。

启用 WSL 相对简单。作为 Linux 命令行用户空间,它似乎相当不错。


Not*_*1ds 3

第一次写这个问题时,WSL2 和 WSLg 都还没有发布,所以今天的答案肯定与几年前不同。其中一些信息已在此处的答案中更新,但我觉得此处的其他答案中围绕实际的“限制”缺少很多内容。

我是 WSL 的忠实粉丝,但我首先承认 WSL 存在相当多的限制。幸运的是,其中大多数都有解决方法,但它们确实让大多数新用户措手不及。

首先,让我列出 WSL 上的 Ubuntu 与虚拟机或物理机上的传统 Ubuntu 安装之间的一些“差异”。我将在下面的“限制”部分中引用其中的一些内容:

  1. WSL1 作为“系统调用转换层”运行,尝试将 Linux 内核 API 转换为 Windows 内核 API。

  2. 在 WSL2 中运行的 Ubuntu 更像是一个容器。它在托管虚拟机(您无法访问)中的真实 Linux 内核下运行。Ubuntu 正在该虚拟机的命名空间内运行。它本身并不直接在虚拟机中运行。

  3. WSL 有自己的初始化系统。它的主要工作(除了一些“正常的”Linux init 任务之外)是建立 Linux 和 Windows 之间的互操作性。例如,它:

    • 使 Windows 网络可供 Ubuntu 使用
    • 将 Windows 路径添加到环境中
    • 将 Windows 驱动器安装到 Ubuntu 中
  4. 该 init 在 Ubuntu WSL 实例/命名空间/容器内以 PID 1 的身份运行,除非您启用 Systemd 支持,在这种情况下 Systemd 将变为 PID 1。

  5. 启动 WSL 与启动虚拟机或物理机不同。Ubuntu 在启动过程中通常(通常通过 Systemd)执行的许多任务要么是 WSL 不需要的,要么实际上对其正常操作有害。

  6. 启动 WSL 时没有“登录”的概念。WSL 检测默认用户并自动启动在/etc/passwd. 不需要或不需要密码。

WSL 的局限性

考虑到这一点,我可以想到以下一些限制:

  • 初始化/系统:

    开箱即用时,WSL 仍然没有启用 Systemd,但它是可用的,并且现在可以在 Windows 10 和 Windows 11 上运行。您在执行各种任务(例如安装 Docker)时遇到的许多文档、博客文章等将假设 Systemd 已启用,因此您需要确保它已启用,或者学习如何在没有它的情况下进行调整

    本节中还有很多其他与 Systemd 相关的限制,但根据最近的 WSL 改进,它们已被删除。

  • 访问物理硬件:在 WSL 上,您对硬件的访问权限有限:

    • 串行端口: WSL1 可以在某种程度上访问串行端口,但仅限于系统调用实现。也就是说,可以在 WSL1 上运行一些使用 WSL2 上无法运行的串行端口的软件。

    • 物理驱动器: 旧版本的 WSL 缺乏访问物理驱动器的功能,但最近的 WSL 版本现在确实包含安装物理驱动器的功能,只要 Windows 未使用它们即可。

    但是,除非使用特殊内核,否则不直接支持 USB 大容量存储设备。

    • 图形:这曾经是一个更大的限制,但 WSL 1.0.0 添加了对带有 WSLg 的 GUI 应用程序的支持(适用于 Windows 10 和 11)。此支持是通过运行 RDP 后端的 Wayland/XWayland/Weston 实现的。当然,仍然没有从 X 到物理硬件的任何直接访问,因此有些东西不能像“纯”Ubuntu 等价物一样工作。

    最常见的情况之一是在运行桌面环境中。您可以在 Ask Ubuntu 中找到围绕此主题的几个问题和答案。

    • GPU: 在最新的 Windows 10 版本中,可以使用直通库和Windows GPU 驱动程序来执行某些GPU 计算任务。

      在 Windows 11 下,添加了一些额外的 GPU 计算任务。

    • USB:无法直接访问 USB 设备。但是,在 WSL2 下(在 Windows 10 和 11 中),可以使用 USB/IP从 Windows 共享它们,然后在 Ubuntu 中附加它们。

      但请注意,库存 WSL2 内核不包含大多数 USB 设备的设备驱动程序。例如,甚至不包括基本的媒体捕获(即相机)驱动程序。但是,您可以为 WSL2 构建自己的内核并包含必要的驱动程序。但请注意,目前,我(和其他人)尚未成功在 WSL 中从 USB 摄像头捕获视频。请参阅Stack Overflow 上的此问题了解最新进展。

  • Ubuntu 引导设备: WSL 中 Ubuntu 的主引导虚拟磁盘/分区必须格式化为 ext4。尽管 WSL2 内核支持其他文件系统(例如 btrfs),但它们只能用于辅助分区。

  • 依赖身份验证/登录的任务:由于上述 (6),某些依赖身份验证的任务在 WSL 上的行为会有所不同。例如,通常您会进行编辑/etc/security/limits.conf以提高用户的限制(例如打开文件的数量、优先级/nice 等)。然而,这是一个在用户登录期间由 PAM(“可插入身份验证模块”)处理的文件。如果没有经过身份验证的登录,则永远不会处理此文件。如果您遇到此问题,请参阅此答案中的解决方法。

  • 网络:虽然这可能属于“硬件”部分,但它可能值得在这里单独标注。WSL2 的网络当前在 Hyper-V 内的虚拟交换机下运行,并且该交换机与网络的其余部分进行 NAT。这意味着您无法在不付出额外努力的情况下从本地网络上的其他设备(计算机、电话等)轻松访问 WSL2 中的网络服务。

    最简单的解决方法是尽可能使用 WSL1。还有多种其他解决方法

  • VPN:同样,当连接到某些禁用本地流量的 VPN 时,WSL2 将丢失网络,因为它是“本地”(但不是本地主机)网络流量。

  • 笔测试: 某些渗透测试任务根本无法在 WSL1(因为系统调用转换有限)或 WSL2(因为硬件已虚拟化)下工作。这里有两个突出的领域:

    • 无法直接访问wifi接口(仅是虚拟以太网设备),因此WLAN密码破解技术将不起作用。作为解决方法,应该可以安装辅助 USB WiFi 加密狗,通过 USB/IP 传递它(如上所述),并在 WSL2 中使用它。请注意,您需要使用适合网络适配器的驱动程序构建自己的内核。

    • 由于 WSL2 位于与 Windows 主机(以及网络的其余部分)不同的第 2 层网络上,因此无法进行任何第 2 层扫描。上述 USB/IP 解决方法也适用于此。

  • 性能:总体来说,WSL2 下的性能还是不错的。但是,有一些注意事项:

    • WSL1: WSL1 在其“pseudo-ext4/overlay”文件系统上的性能略有下降。然而,WSL2 在 ext4 文件系统上实现了接近本机的性能。

    • WSL2:访问 Windows 驱动器上的文件(尤其是多个小文件)时,WSL2 的性能会受到巨大影响。在 NTFS 驱动器上检查 WSL2 内核需要 10 多分钟(否则大约需要 30 秒)。强烈建议您将项目文件保留在 ext4 文件系统上或在访问 Windows 驱动器时使用 WSL1。

    我保留 WSL1 实例主要是为了在需要时使用 Windows 驱动器。

我确信我会记得更多(或者也许有人会在评论中指出它们),如果需要的话我会添加它们。

同样,根据提到的解决方法,对于大多数 WSL 用户来说,其中大多数都不是严重的障碍。然而,它们是我在 Stack Exchange 站点上回答的许多问题的根源。


归档时间:

查看次数:

23852 次

最近记录:

5 年,6 月 前