我在网上读到 Ubuntu 和 Bash 即将进入 Windows 10。我还读到它不是在 Windows 之上运行的模拟器或虚拟机,而是其他东西。那么这一切究竟是如何结合在一起的呢?它真的会像 Ubuntu 中的 Bash 一样稳定和用户友好吗?
我在网上读到 Ubuntu 和 Bash 即将进入 Windows 10。我还读到它不是在 Windows 之上运行的模拟器或虚拟机,而是其他东西。那么这一切究竟是如何结合在一起的呢?它真的会像 Ubuntu 中的 Bash 一样稳定和用户友好吗?
它不是模拟器,就像 WINE 不是模拟器一样。也就是说,他们在 Windows 内核中添加了 Linux 内核接口。当应用程序尝试使用 Linux 内核时,它会被转换为 Windows 本机系统调用,并且来自内核的任何响应都会被转换为本机 Linux 响应。所以应用程序认为它在 Linux 内核上运行,因此不需要修改。
但是,这纯粹是一种 Windows 技术,因此如果您需要更多详细信息,您应该从 Windows 支持小组或其他机构获得它们。Windows 仍然是一个专有操作系统,所以我希望细节有限。
从 Ubuntu 的角度来看,我们只是在原始 Linux 内核上运行,相当于在原始 X 服务器上运行现代桌面。如果您只使用假内核支持的功能,那么它将是稳定且用户友好的。如果您使用不受支持的功能,它将不稳定。
它不会很快接近完整的 Ubuntu 体验。
对于那些对 Linux 的 Windows 子系统 (WSL) 如何工作以及它如何运行本机 Linux ELF-64 二进制文件感到好奇的人,我们发布了一系列博客文章和随附的视频,解释 WSL 架构、进程、系统调用和文件系统支持.
Scott Hanselman 还做了一个很棒的演练视频,介绍了安装过程以及如何在 Windows 上的 Ubuntu 上配置 Bash:
高温高压
我今天遇到了一个很老的问题,当时有人问这里某处是否存在一般的“什么是 WSL”问题。这可能是这里最接近(也是第一个)这种性质的。
但我确实相信它需要在 2021 年在这里得到更新的答案才能相关。
所以一些历史让我们了解最新情况:
当这个问题被问到时,并且该功能最初宣布时,它被称为“ Windows 上的 Ubuntu 上的 Bash和 Linux 的底层 Windows 子系统”。Canonical 和 Microsoft 密切合作开发该功能。
@Jo-ErlendSchinstad 上面的出色回答说明了原始 WSL(现在称为“WSL1”)通过将 Linux 内核/API 调用“转换”为(紧密)相应的 Windows API/内核调用来工作。
WSL 团队的@RichTurner(我对他和他们的工作深表感谢)当时提供了一些包含更多信息的链接。恕我直言,他真正感兴趣的是 WSL 允许直接在 Linux shell 中执行Windows二进制文件(通常是或 等)中的任何命令,将其通过管道传输到 Linux (或等),并显示结果。不幸的是,我在这里提出了可怕的过度简化的例子,这些例子并没有表现出这个特性真正的用处。
.exe
ipconfig.exe
powershell.exe
grep
awk
您甚至可以从 WSL/Linux shell启动Windows图形应用程序。最近,Microsoft 已使用此功能从 WSL 中提供集成的 Visual Studio Code 启动。您可以
code .
在 (Windows) VSCode 中打开当前 (Linux) 目录。或者code ~/.bashrc
编辑您的启动配置。还有更多。默认情况下,WSL 会自动挂载任何 Windows 驱动器
/mnt/c
/mnt/d
,等等。因此您可以使用 Linux 中的“Windows”文件。(但不是,直到后来,反过来。)当时,它是启动 WSL 和进入 Bash shell 的主要方式
bash.exe
。ubuntu.exe
在这一点上(好吧,在过去的几年里),那些已经降级为“历史”命令(根据微软文档),推荐的方法是更灵活的wsl.exe
命令。历史课的另一个注意事项 - 一个混淆点(尤其是在 Stack 网站上发布的问题中)是 Canonical 将此功能称为“Ubuntu 终端”(即使在今天仍然可用的文档中),并且......嗯......当人们将“Ubuntu”称为“终端”时,这里的一些人会非常沮丧。只是不要责怪您看到使用此术语的用户。这是,恕我直言,Canonical 的错误选择是错误的。
也许“终端”绰号是为了通知用户 WSL 是“仅限命令行”。没有内置的 X 服务器,因此无法在 WSL 中开箱即用地运行图形 Linux 应用程序。也就是说,可以在 Windows 中安装第三方 X 服务器。
一个相关的“术语争议”是,如今,Ubuntu 作为“应用程序”从 Microsoft Store 安装。因此,如果您看到有人称它为“Ubuntu 应用程序”,请不要感到惊讶,即使您和我都知道它是“操作系统/OS”。;-)
随着时间的推移,在最初的发布之后,除了 Ubuntu 之外,更多的发行版开始可用。而且,当然,人们意识到您不仅限于 Bash(我当时是 Zsh 用户,现在是 Fish 用户)。因此,这个问题最初询问的功能本身现在真正被称为“Linux 的 Windows 子系统”(WSL),其中安装了“Ubuntu”发行版。
所以现在谈论 Windows 上的 Ubuntu Bash 有点用词不当,但你仍然看到它被使用,因为它是原始名称。即使是最流行的 WSL subreddit 仍然是历史上命名的r/bashonubuntuonwindows,尽管它通常涵盖了所有 WSL(任何发行版,任何 shell)。
一般来说,WSL 的另一个进步是 WSL 文件系统在伪网络共享中的暴露。因此,例如,“Ubuntu”发行版的文件可以在 Windows 中通过
\\wsl$\Ubuntu
. 这很好,但它有时会混淆新用户,他们可能会~/.bashrc
在 Windows 中使用记事本进行编辑(也称为“损坏”),这会创建Windows行尾 (CRLF) 而不是 Unix/Linux 标准的 LF-only。我敢肯定,在此期间,我正在掩饰其中的一些发展,但 WSL 的下一个重要里程碑发生在团队准备并(在 2020 年)发布“WSL2”时。 这是一个很好的差异比较。
最大的区别在于,与最初的 WSL(现在的 WSL1)不同,WSL2确实使用真正的 Linux 内核虚拟化运行(可在此处获得源代码)。这开启了许多附加功能,但最大的功能之一是直接在 WSL2 中运行容器(例如 Docker)的能力。
虽然内核是真实的,但大多数硬件(例如网络接口)是虚拟化的。因此,虽然您可以执行创建 TAP/TUN 网络设备之类的操作,但您需要将这些设备连接到虚拟 NIC。例如,您将无法在 WSL2 中使用
brctl
.WSL2 的速度提升也相当可观,尽管我个人从未在与“WSL2”相同的硬件上对“真正的 Ubuntu”进行任何直接比较。因为 WSL2 在虚拟 HDD (
ext4.vhdx
) 上的 ext4 文件系统上运行,所以在该文件系统上的文件操作特别高效。也就是说,
/mnt/c
在 WSL2 下使用挂载类型(使用 9P 协议)比 WSL1慢得多。因此,建议将您要在WSL2 中编辑的所有文件保留。要么,要么保留 WSL1 安装的副本(这很容易)来完成 Windows 文件系统工作。目前,Windows 11 中计划的“下一件大事”是WSLg,它允许执行 Linux 图形应用程序。
Windows 11 的 WSL 目前也计划有:
wsl --install
)那之后呢?我自己也不知道,但我个人希望得到某种程度的 Systemd 支持。WSL 目前使用它自己的
/init
来设置 Windows 和 Linux 之间的互操作,例如我之前提到的那些网络接口和挂载。不幸的是,相当多的 Linux 应用程序(尤其是文档)假定 Systemd 支持。也就是说,如果您了解自己要做什么,则完全有可能解决缺少 Systemd 的问题。但它确实让很多新的 WSL 用户陷入了困境。bash 部分在 WSL 中运行良好。
内核部分不存在。例如,
/sys/class/backlight/intel_backlight/brightness
您无法访问设置屏幕亮度。如果您不介意 COBOL 样式的非常长的字段名称,则可以轻松调用 Powershell 命令来执行此操作。可以从 bash 中直接调用 MS Powershell。因此,您可以说强大的 Windows 功能现在已内置到 bash 中。同样,我相信 MS Powershell 可以调用 bash。因此,如果真正的 Powershell 可以访问诸如grep
、awk
、head
、tail
等函数。gedit
Ubuntu 桌面 ( ,nautilus
等)的 GUI仅在安装VcXsrv
或类似的东西后才能工作。在 Linux 和 Windows WSL 之间共享文件设置起来很复杂。在共享 WSL+Linux NTFS 文件夹之间移动文件时,由于我的无知或软件缺陷,我有一些文件权限“奇怪”。
WSL 的速度比 Ubuntu 慢很多。运行时,您实际上可以逐个字符地看到屏幕绘制
cal
或toilet
:windows bash 和 cygwin 之间有什么区别?我认为 WSL 是一个很好的产品,我喜欢在双引导进入 Windows-World 时对其进行修改。由于 MS 缺乏资金,它永远不会成为一个伟大的产品,而且他们真的不想拥有一个伟大的 Linux Free-Ware Distro。如果你有足够的内存,你可能会更喜欢虚拟机。直到 2019 年年中左右,我自己只有 8 GB 和 RAM 价格上涨,我很乐意坚持使用 WSL 并暂时放弃 32 GB RAM 升级。
我访问了一些 MS 论坛,我必须说 Rich Turner 和他的 WSL 团队成员是我见过的最好的专业人士。