AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1051525
Accepted
Leos313
Leos313
Asked: 2018-07-03 06:42:49 +0800 CST2018-07-03 06:42:49 +0800 CST 2018-07-03 06:42:49 +0800 CST

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

  • 772

众所周知,在 Microsoft Store 中,有Ubuntu 的三个版本。这意味着在 Windows 上我可以模拟 Ubuntu 并直接在 Windows 上使用 Ubuntu 命令行。

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

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

欢迎新的答案:我知道每个软件总是通过改进特性和功能而改变!

windows-subsystem-for-linux
  • 6 6 个回答
  • 25956 Views

6 个回答

  • Voted
  1. Liam Proven
    2018-07-03T07:11:07+08:002018-07-03T07:11:07+08:00

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

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

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

    • 21
  2. Leos313
    2018-07-04T00:03:53+08:002018-07-04T00:03:53+08:00

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

    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 的 Linux 子系统 (WSL) 的一部分。这意味着您无法开发驱动程序并直接尝试。
    • 并非每个命令行都有效。

    我可以做什么:

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

    附加信息:

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

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

    • 14
  3. RedGrittyBrick
    2018-07-03T08:00:04+08:002018-07-03T08:00:04+08:00

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

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

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

    • 7
  4. wjandrea
    2018-07-03T11:01:16+08:002018-07-03T11:01:16+08:00

    来自如何极客:

    [它] 还不支持后台服务器软件,并且它不会正式与图形 Linux 桌面应用程序一起使用。也不是每个命令行应用程序都有效,因为该功能并不完美。

    从allquixotic 的评论更新:

    从 Windows 10 v1803 开始​​,支持后台任务。

    • 4
  5. B.D.
    2019-05-08T01:20:21+08:002019-05-08T01:20:21+08:00

    截至 2019 年 5 月,WSL 2 正在开发中。

    文件系统性能显着提高,系统调用完全兼容,这意味着您可以在 WSL 2 中运行更多 Linux 应用程序,例如 Docker。

    ...

    WSL 2 使用全新的架构,该架构使用真正的 Linux 内核。

    ...

    WSL 2 的初始版本将于 2019 年 6 月通过 Windows 内部程序提供。

    (强调我的)

    • 4
  6. Best Answer
    NotTheDr01ds
    2022-09-05T13:57:45+08:002022-09-05T13:57:45+08:00

    最初写这个问题时,WSL2 和 WSLg 都没有发布,所以今天的答案肯定与几年前不同。其中一些信息已在此处的答案中进行了更新,但我觉得这里的其他答案中缺少很多关于实际“限制”的信息。

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

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

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

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

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

      • 使 Windows 网络对 Ubuntu 可用
      • 将 Windows 路径添加到环境
      • 将 Windows 驱动器装入 Ubuntu
    4. 该初始化在 Ubuntu WSL 实例/命名空间/容器中作为 PID1 运行。

    5. 启动 WSL 与启动虚拟机或物理机不同。Ubuntu 通常(通常通过 Systemd)在引导期间执行的许多任务不是 WSL 所需要的,或者实际上对其正常运行有害。

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

    WSL 的限制

    考虑到这一点,以下是我能想到的一些限制:

    • init/Systemd: 在 WSL 中运行的 Ubuntu 不使用 Systemd。Systemd 要求它以 PID1 运行,但 WSL 的 init 以 PID1 运行。您在执行各种任务(例如安装 Docker)时遇到的许多文档、博客文章等都假定 Systemd 可用。我在这个答案中提到了几种解决方法。

      此外,除非您求助于该答案中提到的命名空间黑客,否则与 Systemd 根深蒂固并依赖于 Systemd的软件包将无法运行。Gnome 是比较常见的例子之一。

      作为另一个个人示例,几天前我试图在非 Systemd 发行版中运行cockpit(用于 Web 界面),但我找不到任何方法来解决它对 Systemd 的依赖。libvirtd

      对于在 WSL 上使用 Ubuntu 的新用户来说,这无疑是最容易混淆的领域之一。

    • 在 WSL2 上运行 Systemd:与前面的项目相关,如果您确实尝试使用 Systemd,Ubuntu(以及几乎所有发行版)上的默认 Systemd 引导过程会做出一些在 WSL 上无效的假设。例如:

      • Systemd 将擦除/tmp.而不是符号链接。绑定挂载可以只读方式重新挂载,以防止篡改它(在 Arch Systemd 指南中找到)。systemd-tmpfiles

      • Systemd 将设置一些binfmt_misc处理程序,覆盖允许您在 WSL 下运行 Windows 二进制文件的 WSL 处理程序。

      • Systemd 将重新定义用户环境,覆盖附加到它的 Windows 路径。

      如果您计划运行 Systemd(即使使用“帮助”脚本),我强烈建议您记住它可能会干扰 WSL 下的其他 Ubuntu 操作,并计划在它发生时进行故障排除。

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

      • 串行端口: WSL1 可以在一定程度上访问串行端口,但仅限于系统调用实现。也就是说,可以在 WSL1 上运行一些利用串行端口的软件,而这在 WSL2 上是不可能的。

      • 物理驱动器:在 Windows 10 下,您只能通过网络协议挂载驱动器或连接到 Windows 并格式化为 NTFS 的物理驱动器。无法安装原始驱动器和使用其他文件系统的驱动器。

        Windows 11 下的 WSL2确实具有挂载其他驱动器类型的能力。

      • 图形:在 Windows 10 下,WSl 上的 Ubuntu 无法直接访问任何图形应用程序或界面。如果要在 WSL 上的 Ubuntu 中运行图形 Linux 应用程序,则必须在Windows中安装第三方 X 服务器并使用适当的DISPLAY设置在 WSL 中运行 X 客户端/应用程序。有关更多详细信息,请参阅此答案和此答案。

        同样,在 Windows 11 下,WSL2 现在能够开箱即用地运行图形应用程序。

      • GPU: 在最近的 Windows 10 版本中,一些GPU 计算任务可以使用直通库和Windows 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以提高用户的限制(例如打开文件的数量、优先级/优先级等)。但是,这是一个在用户登录期间由 PAM(“可插入身份验证模块”)处理的文件。如果没有经过身份验证的登录,则永远不会处理此文件。如果遇到此问题,请参阅此答案中的解决方法。

    • 启动服务:

      • Windows 10:没有 Systemd(或其他 init)可依赖,没有简单的方法来定义默认情况下应该在 WSL 实例中运行哪些服务。例如,cron守护程序将不会运行(此问题的来源)。解决方法是检查服务是否在您的 shell 启动(例如~/.bashrc)中运行,如果没有则启动它。有关更多详细信息,请参阅此答案。

      • Windows 11:现在至少包括在启动时运行任务的能力。有关详细信息,另请参阅相同的答案。但是,我可能会建议您使用此方法启动流程主管作为您的主要任务,然后使用流程主管来启动和管理其他需要的任务。我在这个 Stack Overflow 答案中提到了如何使用 来执行此操作supervisord,但是任何进程主管(当然,它不需要它是 PID1)都可以工作。

    • 网络:虽然这可能属于“硬件”部分,但它可能值得在这里单独标注。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 网站上回答的许多问题的来源。

    • 1

相关问题

  • 如何在 Windows 上重置我的 Ubuntu 安装?

  • Linux 的 Windows 子系统中的 Ubuntu 文件系统根目录在哪里,反之亦然?

  • 新的“Windows 10 上的 Bash”如何真正发挥作用?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve