我是unikernel的新手,以下链接对我理解它们没有多大帮助:
- https://searchitoperations.techtarget.com/definition/unikernel
- https://en.wikipedia.org/wiki/Unikernel
- 什么时候使用unikernel更好
- 就代码大小而言,单内核如何比微内核小
术语"unikernel"one_answers"microkernel"是指不同的东西,并不是两个真正对立的东西,也不是你需要从中选择的两个选项:
"微内核"是一个较老的术语,是一种内核设计,与单片内核形成对比。在单片内核中,正如它的名字所说,整个内核是一个单一的程序,它实现了用户应用程序所需的内核API(例如,Unix系统调用、线程、进程、文件系统等)。与此相反,在微内核设计中,我们有一个"微内核",一个非常小的内核,它实现了一个小的API(例如,执行线程、权限和消息传递的一个非常基本的概念),并且在它上面有一个更大的内核部分,它实现应用程序所需的完整API-实际的文件系统、行为类似Unix进程的进程、系统调用等等。在20世纪90年代初,学术界认为编写单片内核变得过于困难和容易出错,微内核是未来的发展方向,但后来出现了Linux(这是一个单片内核),并将这一结论变成了一个笑话。今天,您不应该根据使用微内核还是单片内核来选择内核。这是一个用户很少关心的实现细节。
"unikernel"是一个较新的概念。传统内核以能够在同一台物理机器上多路复用许多不同的用户和应用程序而自豪。1974年关于Unix的著名论文被称为"Unix分时系统",因为分时(即多路复用多个用户和应用程序)是操作系统最重要的目标之一。但如今,随着对虚拟机而非物理机的关注,有一种不同的方式(即管理程序)可以将物理机拆分为不同的虚拟机。因此,通常情况下,每个虚拟机只运行属于单个所有者的单个应用程序。这提供了一个运行精简内核的机会,该内核不需要支持传统内核所支持的许多东西:不需要支持不同用户之间的隔离;不需要支持数千个驱动程序(所有已知的管理程序都需要一个小的驱动程序集);无需支持不同流程之间的隔离。
修剪所有不必要的东西会使内核更小,这对快速部署新的虚拟机有很大好处,降低了内存使用,还可以提高性能。例如,您可能听说过,最近对Linux内核进行了修补,以修复当代CPU中的"Meltdown"漏洞。该修复程序减缓了Linux上的系统调用和上下文切换,这是必要的,因为没有它,一个进程可以读取其他进程的内存。但是,如果我们知道没有其他进程——只有一个应用程序在VM上运行——我们就不在乎了。因此,unikernel不需要通过崩溃解决方案来降低速度。系统调用可以像函数调用一样快,上下文切换要快得多,等等。
例如,像OSv这样的一些unikernel实现了上述功能,并提供了一个内核,该内核向应用程序模拟传统内核(即Linux),但没有不受支持的功能,如多个用户或多个隔离进程(尽管支持非隔离线程)。其他unikernel更进一步,要求精简内核,并为每个应用程序提供不同的内核构建,其中包括该特定应用程序所需的特定功能。例如,要运行TCP应用程序,可以使用只支持TCP协议而不支持UDP的内核。您可以将其视为内核和应用程序链接在一起,形成一个统一的内核应用程序,该应用程序直接在系统管理程序上运行。
何时以及为什么使用(上述任何变体的)unikernel是一个悬而未决的问题。当然,如果需要使用少量的磁盘或内存,那么使用unikernel是一个不错的选择。如果您担心安全性并计划审计代码,那么unikernel要审计的代码要少得多。在需要快速启动的应用程序中(例如,实现"功能即服务"),unikernel允许非常快速的启动,大大少于1秒,因为启动所做的"通用"工作要少得多,并且专注于应用程序真正需要的东西。这些例子还可以告诉你什么时候不应该考虑unikernel:如果你的应用程序无论如何都使用大量的磁盘和内存(例如,数据库应用程序),那么从内核的大小上减少一点帮助不大。如果您的应用程序运行数小时,那么快速启动并不重要。如果您的应用程序使用了许多操作系统功能,那么我上面描述的许多更专业的unikernel可能无法提供应用程序所需的所有功能。
在一行中,(application+unikernel)称为在hypervisor(云)上运行的工作负载,相当于嵌入式世界中在裸机上运行的独立应用程序。
当应用程序(工作负载)不使用大部分操作系统时,云中的Unikernel会更好;设备驱动程序服务。
Unikernel只使用内核中使用的功能进行编译,而不是像microkernel中那样使用必要的功能,因此大小很小。
Unikernel是简单的单应用程序操作系统。与其将我们的软件部署在linux之上,不如从我们的应用程序中创建一个操作系统,只运行该应用程序,而不运行其他应用程序。
应用程序中没有用户名/密码或密码的概念,因为它只运行一个应用程序。传统上,unikernel很难使用,因为它们过去需要专家级的系统知识。
更多信息:https://bootsity.com/php/running-php-unikernels-on-google-cloud
事实上(如前所述),它是作为单个映像构建的应用程序和unikernel。它们使用单个地址空间(在单片内核上,通常分为用户空间和内核空间)
优点:
- 更好的安全性
- 小图像大小
- 与主机的隔离度更高
- 更高的执行速度和/或启动时间(不确定,仍有待讨论)
缺点:
- 可能是调试和部署方面的问题
- 可能是支持多个进程和/或线程的问题
- 通常它们只支持单个用户
如果你想深入了解更多细节,我想分享一些链接:
- 我喜欢这本书Unikerns作者:Russell Pavlicek
- 你也可以浏览这篇文章:Unikernel