自从以Unix为基础的操作系统被发明以来,尝试在Windows环境中模仿Unix操作的工具就一直存在。这种需求源于许多原因,包括Unix对脚本和命令行工具的强大支持,以及Unix和Linux系统在科学、工程和其他技术领域的广泛使用。下面就让我们一起探讨下在Windows上模仿Unix环境的演进史。
标题模拟Unix环境
最初,对于在Windows上运行Unix程序的需求,主要通过一些简单的实用程序和工具来满足,比如Cygwin。Cygwin是一款提供了大量GNU和开源工具的软件集合,它可以在Windows上创建一个类Unix环境,让开发者可以在这个环境中使用类似于Linux的命令行接口。在Cygwin中,我们甚至可以使用类似在Linux上的包管理工具apt。Cygwin不但支持许多Linux的命令行工具,如bash、ls、grep等,通过使用Cygwin/X,甚至图形应用也可以移植到Windows环境中。目前Windows上的X Server如Xming等就是基于Cygwin/X开发的。
Cygwin通过在运行时动态转换POSIX系统调用来实现这个目标,它提供了一个Cygwin.dll文件,这个文件对POSIX系统调用进行了实现。基于Cygwin的GNU编译环境提供了对POSIX系统非常好的兼容性。但由于有了这个POSIX系统调用的转换层,编译出来的代码效率上有一定的损失。为了弥补这个问题,开源社区又推出了一个简化版的GNU编译环境MinGW。MinGW,全称为Minimalist GNU for Windows。MinGW的目标不是提供一个完整的类Unix环境,而是直接在Windows环境下使用GCC编译器。因此,MinGW编译出来的结果是原生的Windows应用程序,它们直接使用Win32 API,不需要任何的运行时库。
由于MinGW只是一个GNU编译环境,作为补充在其基础上又开发了一个Unix风格的小型shell环境MSYS(Minimal SYStem)。MSYS的目标是提供一个足够的环境,使得用户可以在Windows平台上运行configure脚本和生成Makefile,从而可以使用GNU工具链进行软件的编译和安装。MSYS并不包含所有的Unix工具和库,它的目标并不是提供一个完整的Unix环境。MinGW和MSYS是在32位处理器下开发的。随着处理器从32位过度到64位,两个新的开源项目Mingw-w64和MSYS2提供了64位的GNU开发环境。
与Cygwin和MinGW发布的同一时期,微软也推出了类似的商业软件包Windows Services for Unix (SFU) 1.0。SFU使用的是与Cygwin类似的商用产品MKS Toolkit。这是微软为Windows NT系列操作系统开发的一个软件包,它提供了一个环境,使得在Windows平台上运行编译为UNIX系统(如Solaris、HP-UX、AIX)的应用程序成为可能。
真正的Unix环境
尽管Cygwin等工具在Windows环境中提供了使用开源工具的可能性,但并不能提供完全的Unix体验。
在1999年,Softway Systems开发了一个叫Interix的Windows子系统。它可以说是一个真正的Unix环境。Interix为POSIX应用程序提供了一个在Windows NT上运行的环境,包括了对原生Unix系统调用的支持。微软在1999年收购了Softway Systems,并将Interix作为Windows Services for UNIX(SFU)3. 0的一部分发布。SFU3.0提供了一套完整的Unix环境,包括KornShell、C Shell、Perl、Vi、EMACS、awk、sed以及各种Unix命令行工具。
在Windows Vista发布时,SFU被重命名为Subsystem for UNIX-based Applications(SUA),并作为Windows的一部分发布。SUA提供了一个更为轻量级的解决方案,它只包括了一个POSIX兼容的环境和C运行时库,而Unix工具和shell则需要另外安装。
然而,尽管SFU3.5和SUA包含了大量的功能并提供了一个真正的Unix环境,但由于其性能和兼容性问题,并未能在用户中取得广泛的成功。
与Linux共存时代的到来
总结了SFU/SUA的开发经验,微软发现应用程序的兼容性是POSIX子系统能否成功的关键因素。
为了解决应用兼容性问题,微软推出了在架构上与SFU/SUA非常类似的Windows Subsystem for Linux(WSL)。
WSL是一种在Windows 10和Windows Server 2019上运行Linux二进制可执行文件(ELF格式)的兼容层。它不需要重启就可以在Windows上运行Linux,并且能够在Windows和Linux之间进行无缝的文件共享。WSL的推出为在Windows上运行Linux应用程序提供了一个更高效和方便的解决方案。
由于WSL1还是对系统调用的转换,所以还是有一些兼容性问题。比如无法在WSL1中使用FUSE等。到了WSL 2,通过使用轻量级的虚拟机技术,微软进一步提高了兼容性和性能,并引入了完整的Linux内核,使得与真实Linux环境的兼容性大大提高。这使得开发者可以在Windows机器上使用完全一样的工作流程和工具来进行Linux开发。
从Windows中类Unix环境的演进过程中,可以看到微软与Linux从对立走向合作的过程。Microsoft逐步将Windows打造成了一个对开发者友好且功能丰富的平台,它不仅支持传统的Windows应用程序,还能够无缝地运行和集成类Unix环境和工具。这种演变反映了Microsoft对开放源代码和跨平台开发趋势的响应,以及对满足现代开发者需求的承诺。