众所周知,在 Microsoft Store 中,有Ubuntu 的三个版本。这意味着在 Windows 上我可以模拟 Ubuntu 并直接在 Windows 上使用 Ubuntu 命令行。
问题很简单:我不能从 Windows 中模拟的 Ubuntu 命令行执行哪些我可以在基于 Linux 的适当 Ubuntu 上执行的操作?下载这个 Ubuntu 应用程序、安装它并使用它而不是真正的操作系统是否有用?是否可以安装所有开发库?我可以编写(或不编写)设备驱动程序吗?换句话说:限制是什么?
Ubuntu-on-Windows 缺少基于 Ubuntu Linux 的哪些功能?
欢迎新的答案:我知道每个软件总是通过改进特性和功能而改变!
在适用于 Linux 的 Windows 10 子系统下运行的 Ubuntu 不是完整的发行版。事实上,它根本不是 Linux——它没有 Linux 内核。所以你不能测试或尝试内核扩展,包括驱动程序,因为你没有运行 Linux。
如果你想做这样的事情,要么在虚拟机中安装 Ubuntu——Win10 包含 Hyper-V,但就我个人而言,我更喜欢免费的 VirtualBox——或者在裸机上运行 Ubuntu 来双启动你的机器。您几乎肯定会发现后者比运行 Windows 更快——我在所有机器上都这样做。部分原因是您在运行 Windows 时需要防病毒保护,这会降低性能,尤其是磁盘性能。因为你需要它,Win10 包含内置的杀毒软件。
使用 Linux,您不需要任何东西,因此对性能的影响较小。
以上每个答案都有许多有用的信息。我在这里总结了他们每个人的主要概念。
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 用户空间”,正如其中一条评论所指出的那样。
我不能做的:
我可以做什么:
附加信息:
这些应用程序是免费的,可从 Windows 应用商店下载,您可以在此处找到安装和使用说明。
在博客的另一个问题中,一些关于如何为 WSL 使用 GUI 的建议(非官方,第三方)
在适用于 Linux 的 Windows 子系统 (WSL) 下无法轻松完成的一件事是运行 Linux GUI 应用程序。
为此,您必须安装不受支持的 X11 服务器,例如 VcXsrv 或 Xming。
启用 WSL 相对简单。作为 Linux 命令行用户空间,它似乎相当不错。
来自如何极客:
从allquixotic 的评论更新:
截至 2019 年 5 月,WSL 2 正在开发中。
(强调我的)
最初写这个问题时,WSL2 和 WSLg 都没有发布,所以今天的答案肯定与几年前不同。其中一些信息已在此处的答案中进行了更新,但我觉得这里的其他答案中缺少很多关于实际“限制”的信息。
我是一个相当大的 WSL 粉丝,但我将是第一个承认 WSL 存在很多限制的人。幸运的是,其中大多数都有解决方法,但它们确实让大多数新用户措手不及。
首先,让我列出 WSL 上的 Ubuntu 与虚拟机或物理机上的传统 Ubuntu 安装之间的一些“差异”。我将在下面的“限制”部分中引用其中的一些:
WSL1 作为“系统调用转换层”运行,试图将 Linux 内核 API 转换为 Windows 内核的 API。
在 WSL2 中运行的 Ubuntu 更像是一个容器。它在托管虚拟机(您无法访问)中的真实 Linux 内核下运行。Ubuntu 在该 VM 的命名空间内运行。它本身并不直接在 VM 中运行。
WSL 有自己的初始化系统。它的主要工作(除了一些“正常”的 Linux 初始化任务)是建立 Linux 和 Windows 之间的互操作性。例如,它:
该初始化在 Ubuntu WSL 实例/命名空间/容器中作为 PID1 运行。
启动 WSL 与启动虚拟机或物理机不同。Ubuntu 通常(通常通过 Systemd)在引导期间执行的许多任务不是 WSL 所需要的,或者实际上对其正常运行有害。
启动 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 网站上回答的许多问题的来源。