对 “Ubuntu on Windows” 的一种解读

2016-04-01 08:53


平时不太关注微软的技术,不过这次微软 build 2016有个新闻倒是值得关心一下。

对这条新闻,每个人看到的角度略有不同(可以参见知乎上的讨论),Shell 爱好者期待可以在 Windows 下用强大的 Linux Shell ,Ruby 程序员也希望可以在教新人时不必强迫别人换操作系统。

不过我觉得最大的一个影响应该是关于 Docker 的,微软这个技术的推出将有助于为 Docker 进入 Windows 铺路,甚至我猜想这可能就是微软搞这一套技术的直接目的。

我们来看一下具体的技术,这个东西表面上看就像个模拟器,类似 cygwin,也可能有人会想到虚拟机,但是它实际上要更直接,它是在用 Windows 内核实现了对 Linux 系统调用的兼容支持,由于不需要高成本的模拟,它的性能是相当可观的(甚至有不少人认为,如果是用 IOCP 来实现 epoll,那么它的性能有可能比 Linux 原生的 epoll 还要好)。

参考wikipedia上的这个图,看看体系架构:

Windows 2000 architecture

我们知道,WinNT 系的内核本身其实是很牛的,它的 API 是有一个抽象层作为隔离的,而 Win32 API 可以看做这个抽象层的一个实现,理论上并没有什么特殊地位,这样就可以象支持原生 windows 程序一样支持 linux 程序了,那么我们之前为什么一直没看到 Linux on Windows 呢?

因为技术牛不意味着市场会接受,这个设计曾经被认为有过度设计的嫌疑,据说微软做了这个设计以后也没看到有啥大的价值,因此并没有在这个抽象层上做出一个与 Linux API 兼容的实现。

这一切在 Docker 出现以后就变化了。近两年,Docker 技术发展十分迅猛,由于它本质上是对 Linux 的再发明,因此本来和微软没什么关系。但是,Docker 一方面占据了“云计算”这个领域的重要位置,另一方面又对服务器软件研发有很重要的推动作用(devops 运动),这些都是微软很看重的地方,所以它很早就在谋划拥抱 Docker 和容器技术。

用 “微软+Docker” 作为关键字 Google 能找到几条新闻,放在一起看很有意思:

注意看看那几条新闻的时间,说实话,我当时看到最早的那条新闻时还没法想象微软会做出这么大的努力,但它的节奏十分清晰,先是做一个简单到只有 http 封装的 Docker CLI 作为试水(也可能是为了卡位吧),然后再将 Windows 软件本身的工作方式和容器化趋势结合起来。截止到最近,微软的方法思路和 Docker 是一样的,理论上它的 Windows 也可以跑容器,这样,微软在服务器市场也可以分得一杯羹。

然而还有一个困难——“内核”,我们知道,Docker镜像可以跨越各种 Linux Distribution,然而必须受限于宿主机的内核版本,这是它为了超越虚拟机的性能而不得不损失的独立性,Windows Server 即使能象“容器宿主机”一样工作,也会由于不能支持众多 Docker 镜像(都是基于 Linux 的)所需要的 API 而干瞪眼。

现在微软补上了这个短板。

根据目前看到的说法,Windows Server 将可以提供 Linux 兼容的 API ,因此理论上可以很好的支持现有的所有 Docker 镜像,这对于云计算环境是非常有帮助的。又因为这种支持并不是“模拟式”的,因此并没有损失 Docker 的一个重要优势——性能。

从这个角度看,这个号称“Win10与Ubuntu合体”的技术,并不是象它的标题一样仅仅是好玩,而是在微软的战略路线中应该有一个很重要的位置。有很多朋友说这是微软挖的一个坑,言下之意是说微软自己可能“管挖不管埋”,但如果微软自己不作死,它应该会重视和完善这个技术的。