Unikernel 和 Library OS

Unikernel,中文一般翻译为单一内核。是专门为了运行在虚拟机上而打造的系统。维基百科上的解释是:

A unikernel is a specialised, single address space machine image constructed by using library operating systems. A developer selects, from a modular stack, the minimal set of libraries which correspond to the OS constructs required for the application to run. These libraries are then compiled with the application and configuration code to build sealed, fixed-purpose images (unikernels) which run directly on a hypervisor or hardware without an intervening OS such as Linux or Windows.

在解释什么是 Unikernel 前,先来了解一下虚拟机运行通用操作系统有哪些痛点。

以 Windows 操作系统为例

以 Windows 操作系统为例

首先,通用操作系统的应用程序的代码运行在用户模式下,操作系统内核运行在内核模式下。用户模式下需要通过 syscall 切换到内核模式来调用内核代码。这种模式切换也是相当耗费系统资源的。而且,用户模式和内核模式无法相互访问对方的内存空间的,如果需要交换数据的话,还必须把数据复制到对方的内存空间中。

其次,通用操作系统需要运行在不同的硬件平台,所以一般会实现硬件抽象层(HAL)来兼容不同的硬件。

最后,通用操作系统为了满足不同的需求,内置了很多服务和组件。而在虚拟机中的应用往往只是为了执行单一任务,只需要使用到操作系统的部分功能。即便如此,也要引入完整的操作系统功能,有点空耗资源。

Unikernel 是运行在虚拟机中的单一地址空间的系统映像,不需要 CPU 在用户模式和内核模式之间切换,也没有进程的内存隔离,不需要上下文切换。因此, Unikernel 能节省很多系统开销。此外,虚拟机中的虚拟设备都是统一规格,相当于由 Host OS 实现了 HAL。Unikernel 不需要兼容不同硬件的复杂架构,内核代码会轻量很多。

Library OS,中文一般翻译为库操作系统,是专门负责打包 Unikernel 映像的操作系统。LibOS 可以检测到应用代码使用了哪些内核功能,在打包映像时对内核进行剪裁,只保留应用程序使用的内核代码。

由于 Unikernel 映像是单一地址空间,所以无法像通用操作系统一样,通过进程来实现资源隔离。不过解决方案也很简单,如果应用有资源隔离的需求,就打包成不同的映像运行在不同的虚拟机中便可。