理论篇
在当今数字化时代,开发者们常常需要在不同的操作系统环境中切换工作。Windows 凭借其广泛的应用和便捷的用户界面,深受大众喜爱;而 Linux 则以其强大的命令行工具、开源特性以及高度的定制性,在开发领域占据重要地位。为了让用户在 Windows 系统中也能便捷地使用 Linux 环境,微软推出了 Windows 子系统 for Linux(WSL)。今天,我们就来深入了解一下这个神奇的工具。
一、WSL 是什么?
WSL,即 Windows Subsystem for Linux 的简称,是一个在 Windows 10 和 Windows 11 上能够运行原生 Linux 二进制可执行文件(ELF 格式)的兼容层。它由微软与 Canonical 公司合作开发,旨在让开发人员能够在 Windows 计算机上同时访问 Windows 和 Linux 的强大功能。通过 WSL,开发人员可以安装各种 Linux 发行版,如 Ubuntu、OpenSUSE、Kali、Debian、Arch Linux 等,并直接在 Windows 上使用 Linux 应用程序、实用程序和 Bash 命令行工具,无需进行任何修改,也不必承担传统虚拟机或双启动设置的成本与复杂性。
二、WSL 的发展历程
WSL 的发展可以追溯到微软的一些早期尝试。其起源与命运多舛的 Astoria 项目有关,Astoria 项目旨在允许 Android 应用在 Windows 10 Mobile 上运行。而 WSL 从 Windows 10 Insider Preview build 14316 开始可用。
2016 年,微软推出了最初版本的 WSL,也就是我们现在所说的 WSL1。WSL1 基于一个转换层运行,它在 Windows 内核上使用一个 Linux 内核接口,将 Linux 系统调用翻译为 Windows 系统调用,以此来模拟 Linux 环境,使得 Linux 应用程序能够在 Windows 系统上运行,但它并没有使用完整的 Linux 内核。
随着技术的不断发展和用户需求的增长,2019 年 5 月,微软发布了 WSL2。WSL2 引入了重大架构更改,它使用了真正的 Linux 内核,并且借助微软开发的轻量化虚拟化技术 Hyper - V,为用户提供了更高的性能和更完整的系统调用支持。如今,WSL2 已成为在 Windows 上安装 Linux 分发版时的默认体系结构。
三、WSL 的工作原理
WSL 是一组组件的集合,允许原生的 Linux ELF64 二进制文件在 Windows 上运行,它包含用户态和内核态组件。
(一)用户态组件
会话管理服务:负责处理 Linux 实例的生命周期,包括启动、停止等操作。
Pico 进程:用于管理原生的用户态 Linux,例如运行 /bin/bash 等程序。当我们在 WSL 中启动一个 Linux 应用程序时,该程序就运行在 Pico 进程中。
(二)内核态组件
Pico 驱动(lxss.sys 和 lxcore.sys):这两个驱动的主要作用是 “翻译” 系统调用,以模拟 Linux 内核。当 Linux 应用程序进行系统调用时,lxss.sys 和 lxcore.sys 驱动会将 Linux 系统调用转换为 NT APIs,从而在 Windows NT 内核上实现类似 Linux 内核的功能。
例如,Linux 中的 fork () 系统调用在 Windows NT 内核中并没有直接对应的版本。当 WSL 中的程序执行 fork 系统调用时,lxcore.sys 需要进行一系列准备工作,如复制进程的相关数据,然后调用 Windows NT 内核的 APIs 来创建一个新进程,以正确实现 fork 操作。
四、WSL 的文件系统
WSL 支持的文件系统需要满足两个重要目标:一是提供一个完全支持 Linux 文件系统的环境;二是能够与 Windows 上的设备和文件互通。为了实现这两个目标,WSL 提供了两种文件系统:VolFs 和 DriveFs。
(一)VolFs
VolFs 提供了完整的 Linux 文件系统特性支持,包括:
Linux 权限管理:用户可以通过 chmod 和 chroot 等命令改变文件和目录的访问权限。
文件的符号链接:这是 Linux 文件系统的一个重要特性,方便用户创建快捷方式。
支持特殊文件名:文件名可以包含一些在 Windows 上不合法的符号。
大小写敏感:这符合 Linux 文件系统的特性。包含 Linux 系统的目录,如 /etc、/bin、/usr 等,以及用户的 Linux 家目录都使用 VolFs。但 VolFs 不支持与 Windows 应用和文件的互用。
(二)DriveFs
DriveFs 是为了实现与 Windows 互用而设计的文件系统。它要求所有文件名必须是合法的 Windows 文件名,并且使用 Windows 安全策略。DriveFs 并不完整支持所有 Linux 文件系统特性,不过文件名是大小写敏感的,用户不允许创建仅仅大小写不同的两个文件。所有 Windows 磁盘通过 DriveFs 挂载到 /mnt/ 目录下,例如 /mnt/d 等。通过这个挂载点,用户可以在 WSL 中访问所有 Windows 下的文件,这使得用户可以在使用 Windows 编辑器(如 Visual Studio Code)编辑文件的同时,利用 Bash 中的开源工具对文件进行修改。
五、WSL 的优势
原生运行 Linux 二进制文件:WSL 能够让 Windows 系统原生运行 Linux ELF 格式的二进制可执行文件,无需额外的转换或模拟层,大大提高了运行效率。
文件系统集成:用户可以直接访问 Windows 和 Linux 的文件系统,实现跨系统文件操作,例如在 Linux 环境中使用 Windows 上的文件,或者在 Windows 中访问 Linux 系统中的文件,提供了便捷的文件共享和管理方式。
开发支持:对于开发人员来说,WSL 是一个强大的工具。它允许在 Windows 上使用 Linux 环境进行开发,运行各种 Linux 开发工具、编译程序等,非常适合跨平台开发场景。比如,开发一个同时支持 Windows 和 Linux 的应用程序,开发人员可以在 WSL 中使用 Linux 的开发环境进行开发和测试,同时又能方便地在 Windows 系统中进行其他操作。
轻量级与高效:相比传统的虚拟机,WSL 占用更少的系统资源,启动速度更快。虚拟机需要模拟完整的硬件环境,而 WSL 则是基于 Windows 内核构建的子系统,因此在资源占用和启动速度上具有明显优势,为用户提供了更为灵活和高效的工作环境。
六、WSL 的局限性
图形用户界面支持有限:WSL 不能直接运行所有的 Linux 软件,尤其是那些依赖图形用户界面(GUI)的软件。虽然可以通过在外部 X 服务器上运行图形 X Window 系统来缓解这一问题,但配置过程相对复杂,且在使用体验上可能不如原生的 Linux 环境。
部分 Linux 内核服务未实现:对于一些需要特定未实现的 Linux 内核服务的软件,WSL 也无法运行。这是因为 WSL 虽然模拟了 Linux 内核接口,但并非所有的 Linux 内核功能都能完美模拟。
七、总结
WSL 的出现,为 Windows 用户提供了一种便捷、高效的方式来体验和使用 Linux 环境。它打破了操作系统之间的壁垒,让开发人员和技术爱好者能够在 Windows 系统中充分利用 Linux 的强大功能。无论是进行开发工作、学习 Linux 知识,还是尝试使用各种开源工具,WSL 都能为我们提供一个理想的平台。尽管它存在一些局限性,但随着微软不断地更新和优化,WSL 的功能会越来越强大,使用体验也会越来越好。如果你还没有尝试过 WSL,不妨现在就动手安装一个 Linux 发行版,开启你的 Windows 与 Linux 融合之旅。