简介
WSL,是Windows Subsystem for Linux的缩写,字面意义上理解就是WIndows下的Linux子系统。WSL 由Microsoft Windows内核团队创建,目前如果最为学习Linux使用的化已经支持的相当好了。WSL现已被集成到WIndows 10中,如果想要使用该功能需要单独打开并重启。
WSL使用了一个subsystem的概念,传统上我们认为Linux程序无法在Windows上运行,因为两者可执行文件标准是不同的(ELF和Win32)。但事实上这是个误区,WIndows NT设计之初就支持多种subsystem,那是NT内核实际上提供了Linux程序需要的接口,只是针对Win32程序时屏蔽了这些接口。至于为啥没流行起来,我猜测可能是性能问题。
传统上大多数人学习Linux都是在物理机上安装WMware Workstation,然后再Host上安装Linux虚拟机。又或者在物理机上安装双系统,无论哪一种方式都非常麻烦。以WMware Workstation为例,WSL的出现估计会对其在桌面市场的份额造成不小影响。WMware Workstation其实现原理是作为WIndows的应用层,WSL的支持是在NT内核中单独有个driver来处理Linux的系统调用,相比较WMware Workstation的做法无论在资源占用上,还是与系统契合度上,WSL都要更好一些。
但是WMware Workstation也不是就没用了,他除了虚拟Linux还可以虚拟Windows,在一个物理机上装2个甚至多个Windows,目前来看你还只能使用WMware Workstation。注意:我这里涉及到的场景大多数人学习时使用的场景,向云计算或者虚拟化场景中这些都不是问题。
WSL最开始的名字是Bash on [Ubuntu on] Windows,字面意义上理解就是在WIndows下可以使用bash。起这个名字MS也是希望用户尽快理解并适应这么个新生事物(其实也不算,NT原本就支持)。随着更多的功能、特性被加进来,Bash on [Ubuntu on] Windows更名为WSL,更多的意义是向用户传达MS这一侧使用何种技术来实现Linux原生程序运行在Windows下。
你可能会有疑问,WSL是发行版吗?WSL是VM吗?
答案都是否定的。上面那幅图你开启支持WSL后,WSL会伴随Windows 10一直运行而运行,WSL本质是上是系统层面对Linux内核进行支持,NT内核中为了实现对Linux的支持,也没有放入一个完整的Linux内核,而是LXCore、LXSS充当driver。
WSL引入Windows时间并不长,但是发展速度很快,越来越多的特性也得到了支持。想到这总让我有种似曾相识的感觉,当年GNU在Unix上开发了各种实用软件,可惜一直没有自己的内核,直到Linux出现了。经过多年发展,Linux平台上有了更多更好的工具,很多甚至是Linux独占。WSL的做法很想当年Linux内核接过GNU为Unix开发的实用工具自己发展壮大一样,未来谁知道呢,不过这一次,MS干得漂亮!
History of Windows Subsystems
Windows NT自成立以来,便支持多environment subsystems(eg. POSIX, OS/2 and Win32 subsystems)。以Win32 subsystems为例,Win32 subsystems向应用程序提供编程接口(programmatic interface),使上层应用不必依赖于内核实现细节。
早期的subsystems是以用户模式实现的,在上层应用与Windows NT内核之间“拉皮条”。将上层应用的API请求转换成对内核的系统调用。所有的应用程序都是PE/COFF可执行文件,或者作为库、服务。他们实现了subsystems像外“暴漏”API。当用户空间可执行文件启动时,loader会根据其header信息调用正确的subsystems来满足该可执行程序的环境、依赖等资源。后来POSIX这个subsystems被SUA(Subsystem for Unix-based Applications)替换,SUA由若干用户模式组件(user mode components)构成,包括:
- Process and signal management
- Terminal management
- System service requests and inter process communication
SUA的组要作用是鼓励应用程序在没有重大重写的情况下移植到Windows。其实现原理是:使用NT构造实现POSIX用户模式API。但是这有个弊端,由于这些组件(components)运行在用户模式下,原本针对Linux开发的应用程序,NT下很难为应用程序中那些系统调用实现优化或者加速,比如fork()。
随着时间的推移,最初的subsystems逐渐退役,但是Windows NT架构允许新的subsystems,因此可以在这个领域扩展或增强subsystems来满足需要,WSL就是这么诞生的。
Windows Subsystem for Linux
WSL是一堆组件的集合,他们协同工作,最终让你在Windows上运行原生Linux ELF64 二进制文件。WSL包括用户模式组件、内核模式组件,其职责:
- User mode session manager service that handles the Linux instance life cycle
- Pico provider drivers (lxss.sys, lxcore.sys) that emulate a Linux kernel by translating Linux syscalls
- Pico processes that host the unmodified user mode Linux (e.g. /bin/bash)
It is the space between the user mode Linux binaries and the Windows kernel components where the magic happens. By placing unmodified Linux binaries in Pico processes we enable Linux system calls to be directed into the Windows kernel. The lxss.sys and lxcore.sys drivers translate the Linux system calls into NT APIs and emulate the Linux kernel.