Microsoft 最近宣布了将Linux Bash 与Windows 10 进行集成的意图,通过这种集成,Windows 10 用户将能在操作系统中原生运行Linux ELF64 二进制程序。为避免对该技术的实现方法产生错误的猜测,Windows Subsystem for Linux 团队主管Deepu Thomas 详细介绍了在Windows 上运行Linux 的技术细节。
为了解释在Windows 上运行Linux 的方法,首先需要介绍一些相关技术和功能:
Windows 用户模式。是 CPU 的一种运行模式,可对普通应用程序进行隔离和保护。每个以这种模式启动的应用程序都有自己专用、无法被其他应用程序修改的虚拟地址空间。此外如果一个应用程序崩溃,其他应用程序不会受到波及。
Windows 内核模式。主要由(内核模式的)驱动程序之类的操作系统核心组件使用的一种 CPU 运行模式。与计算机硬件进行的所有交互都是在这种模式下处理的。为尽可能避免崩溃,Windows 内建并以该模式运行的组件需要进行全面的测试,因为这种层面的崩溃会危及整个操作系统。这篇MSDN 文章详细介绍了这两种Windows 模式之间的差异。
Windows NT 子系统。Windows NT 问世之初就在应用程序所能调用的 API 和内核层之间进行了隔离。这样 Windows NT 便可支持多种子系统,例如 POSIX、OS/2 以及 Win32。这些子系统最初的用途是简化 UNIX 和 OS/2 应用程序向 Windows 移植的工作。虽然 POSIX 和 OS/2 子系统已被取消,但它们的架构依然保留了下来。
Pico 进程和驱动。 DrawBridge 项目引入的 Pico 进程和相应的驱动提供了一种基于过程的容器。这是一种不包含操作系统服务的轻量级解决方案,系统调用是由一对 Pico 驱动处理的。
用户模式 Linux。通过这种方式可将 Linux 作为应用程序在其他 Linux 宿主机基础之上运行。此时来宾 Linux 内核无需直接访问硬件,而是将系统调用转发至宿主机 Linux,由其代为访问。
为了运行 Linux,Microsoft 创建了Windows Subsystem for Linux (WSL),这个子系统的整体架构如下图所示:
当用户以用户模式启动 bash.exe 时,会同时启动相关服务以及 LX 会话管理器。这个服务在用户通过命令提示符输入的 bash 命令和待执行的相关原生 ELF64 二进制程序之间承担了中介的角色。这里的 Linux 二进制程序是 Canonical 提供的用户模式 Ubuntu 14.04 系统的组成部分,以 Pico 进程的形式启动并在用户模式下运行。此时由 lxss.sys 和 lxcore.sys 这两个驱动负责模拟 Linux 内核并拦截系统调用。大部分情况下,相应的驱动会将 Linux 内核调用映射为对应的 Windows 内核调用,但也有些情况可能缺乏对应的 Windows 内核调用。例如 fork(),Thomas 解释了其中的原理:
根据记录,Linux fork() syscall 没有直接对等的 Windows 调用。当针对 Windows Subsystem for Linux 进行 fork 系统调用时,lxcore.sys 会执行一些前期工作为进程的复制做准备。随后它会调用内部的 Windows NT 内核 API 以使用相应语意创建进程,并为新建的进程完成额外数据的复制。
WSL 提供了两种可被 Linux 访问的文件系统:VolFs 和 DriveFs。前者在各方面都非常类似于常规的 Linux 文件系统,包括权限支持、symbolic 链接、大小写敏感,以及 Windows 文件系统中不允许使用的字符。后者提供了与 Windows 互操作的能力,使得用户能够在 Linux 中看到所有 Windows 卷。
这个功能与虚拟化无关,Linux 二进制程序也没有为了在 WSL 中运行而移植或重编译。这种方式运行的 Linux 命令可以像 Windows 应用程序一样访问本地主机,无需使用虚拟化的网络。
根据 Thomas 的介绍,针对 WSL 进行性能评测后发现,性能表现非常接近用相同硬件直接运行 Linux 的性能,这证明 WSL 在性能方面的表现很出色。
Microsoft 团队曾在 WSL 上运行过 Python 和 Ruby,并像其他 Linux 用户那样使用 gcc 编译过程序,大部分情况下都可以正常工作,但也有一些小问题:sudo 无法完全正常使用,文件系统需要进行一定的调整,运行 MySQL 会遇到一些小问题等。有些用户提到无法运行 Java、Semaphores 或共享内存。目前 UserVoice WSL 频道中最需要的三个特性分别是:在两个环境中使用 slash,通过 Bash 启动 Windows 进程,以及将 WSL 开源。
Microsoft 提供的在 Windows 上运行 Linux 的能力可以帮助运维团队,尤其是负责运维云实例的团队无需更换计算机或使用虚拟化解决方案,便可直接从一台 Windows/Linux 计算机管理自己的所有系统。云中运行的很多计算机都运行了 Linux,这个功能可以让运维人员的工作变得轻松一些。
更多详情推荐阅读 MSDN WSL 概述以及 Channel 9 视频: WSL:架构概述。
查看英文原文: Details on How Linux Runs Natively on Windows
感谢夏雪对本文的审校。
给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ , @丁晓昀),微信(微信号: InfoQChina )关注我们。
评论