如果你持续关注DevOps周刊,DevOps主题的会议或是对技术真正感兴趣,你也许已经听说Unikernel很多次了。在过去的几个月,它似乎越来越受关注。

然而,究竟什么是Unikernel? 它是我想要的东西吗?

我纠结这个问题许久。不知如何定义Unikernel以及它存在的意义?

什么是Unikernel?

真相的来源仅仅是Wikipedia上的一段晦涩的解释,我们先看看:

Unikernel是通过使用专门的库操作系统来构建的单地址空间机器镜像。开发者通过选择栈模块和一系列最小依赖库来运行应用,而这些栈和库对应于操作系统中运行应用所必需的依赖。

这些库负责应用和配置代码编译,构建成封闭的、固定用途的镜像(即Unikernel),可以直接在虚拟机管理程序hypervisor或硬件上运行,不需要类似Linux或Windows的操作系统介于其中。

---- 维基百科:Unikernel

都清楚了,对吗?

好吧!如果是我,或许以上并没有说太多。接下来是我对Unikernel的解释。

首先,让我们跟着这里的例子回顾一下。假设你是一个开发者在写PHP应用。当你运行你的PHP(其他Ruby、Node、Perl均类似)应用,你本质上是在运行:

◆语言解释器:PHP、Perl、Ruby、...

◆调用操作系统中系统级别的API。

◆其中的一些API调用需要不同级别的权限,强制切换应用程序的上下文...(用户空间 vs. 内核空间)。

◆所有运行在操作系统上,例如CentOS、Debian、Ubuntu、...

◆或许是运行在VM上,例如VMware、Xen、KVM、...

◆或许是运行在自己的虚拟化管理系统上,例如ESXi、Xen Hypervisor...

◆依次运行在硬件上

◆通过BIOS或UEFI来引导

说老实话,如果你在抽象一个应用程序构建所需的所有层次,这会是一个奇迹般的工作。

但是他们做到了。并且做得非常好,有较好的性能。但是你必须认识到,在提供应用运行环境的硬件到应用程序本身存在许多层。

那就是Unikernel试图解决的:删除应用与硬件中间臃肿的部分。让最“精简”的操作系统运行你的代码。

这里有一篇论文总结得非常好:

Unikernel的愿景:当你看到云客户端时就像看到单应用硬件一样。

- The Rise and Fall of the Operating System

Unikernel试图抹去现代操作系统带来的一些复杂性。因为“通用”的操作系统(就像任何Linux和Windows的发行版),通常会伴随着带来一些对你的应用来说并不需要的驱动、依赖包、服务、等等,但这些对每一个操作系统来说某种程度上又是必需的。

甚至是在Linux内核的核心模块都并不是需要每一次都完全加载。像USB驱动这类东西在虚拟化的“云”环境被认为是无用的,但仍然会被包含在内核中。

相比容器和虚拟化,Unikernel所呈现的演进如下图:

unikernels

Unikernel对比通用的操作系统,例如Linux有许多优势:

◆安全性的提升:只运行操作系统的核心,废弃掉那些可能是干扰源的视频和USB驱动。

◆占用很小空间:想象一下能够抹去95%内核的大小,因为你的应用不需要那些。

◆定制的实现:深谙应用并且把内核精简调整到你想要的部分。

◆ 快速精准的运行Unikernel实例(就像运行一个Docker实例一样),启动时间少于1s。

这样,我们非常自然的把Unikernel当作是微服务的备选方案。

用Unikernel抹去复杂的中间层

如果你运行应用之后想要它的开销是最小的,那你就可能要考虑制作一个Unikernel。

为此,要使用库操作系统LibOS。一个库操作系统会给你提供构建自己的Unikernel的方式。最值得关注的是MirageOS(术语“unikernel”的创造者)和Rump Kernels。两者本质上都是一系列标准化的驱动和库,这样你就不需要重复发明像TCP栈、持久存储层等这类东西。

Unikernel是用高级语言定制的操作系统内核,并且作为独立的软件构件。完整的应用(或应用系统)作为一个分布式系统运行在一套unikernels上。

MirageOS基于OCaml语言并且让unikernels运行在Xen hypervisor上。

-- queue.acm.org: Unikernels: Rise of the Virtual Library Operating System

目前最流行的用来写unikernel的语言是:

◆Rust

◆Go (or 'golang')

◆OCaml

◆Haskell

这些并不都是新的编程语言。除了Go和Rust,其他均有超过15年的历史。

为了使操作系统和应用运行得更加流畅,这些unikernel库需要使用内核部分尽可能小。

现在,由于虚拟化技术,像Xen或VMware这类虚机管理系统(注*:原Operating System)把异构的硬件设备抽象成一堆标准的虚拟化设备,unikernel也能为定制的虚拟设备而优化。

Unikernel利用虚拟化的优势创造出一种专属的经过优化的操作系统。

想要编译应用程序的“unikernel”,需要依赖MirageOS的库和OCaml语言,结果像这样:

编译器输出一个完全独立的内核取代Unix可执行文件。这些unikernels是只为满足特定的应用程序和配置文件而实现的库操作系统VM,并且会依赖hypervisor提供的资源复用和隔离。

--- queue.acm.org: Unikernels: Rise of the Virtual Library Operating System

最终你通过运行一个Unikernel,精简专属的操作系统,来运行你应用程序的一部分。如果你的应用和配置需要更新,你需要重新编译你的源码来生成新的Unikernel并部署新版本。如果是新的安全升级?也同样需要重新编译和部署。

这将使部署的协调和编排更加困难,但好处是运行应用程序更加高效。

构建不可变的基础设施架构的关键在于:应用程序不再保存状态,并且能方便地丢弃和重新构建。

一方面,我们可以让Unikernel运行在Docker容器中,但是是否应该尽量避免增加其他复杂的中间层?另一方面,Docker在使用和部署上的优势确实可以弥补这点中间层的开销。

谁应该使用Unikernel?

实话实说,这个问题的答案对我来说还并不明确。我认为如果你现在是要在WordPress上部署web应用,使用Unikernel也许还有一定的鸿沟。

另一方面,Unikernel的好处是明显的,但需要一个完全不同的模式来管理你的基础设施,一组不同的技能来构建这类的应用和内核并且需要深谙目前对我们来说还完全陌生的一个概念:不可变的基础设施架构。

也许在今后的5至10年,我们会以新的规范一样来部署Unikernel。目前,我认为它针对一小部分想要相当专业和安全应用的用户。对于大多数普通用户,虚机(或是,如果你走在技术前沿一定会明白:Docker容器)或许才是你应该专注的。

作者:Mattias Geniar
来源:51CTO

你知道到底什么是Unikernel吗相关推荐

  1. [转载]Tensorflow 的reduce_sum()函数的axis,keep_dim这些参数到底是什么意思?

    转载链接:https://www.zhihu.com/question/51325408/answer/125426642 来源:知乎 这个问题无外乎有三个难点: 什么是sum 什么是reduce 什 ...

  2. 硬核科普:到底啥是云原生?

    本文主要根据课程 什么是云原生?_哔哩哔哩_bilibili 总结而来,其他参考文章如下: <云原生人才计划之Kubernetes 技术图谱>发布! - 知乎 (zhihu.com) ku ...

  3. 深度学习到底有哪些卷积?

    深度学习到底有哪些卷积? 深度学习中不同种类的卷积(比如 2D / 3D / 1x1 /转置/扩张(Atrous)/空间可分/深度可分/平展/分组/混洗分组卷积),能帮理解实际的工作方式. 总结深度学 ...

  4. 做技术到底可以做到哪种地步-技术为什么越走越窄 (转)

    尽管做技术已经有不少年头了,不管是犹犹豫豫还是坚定不移,我们走到了现在,依然走在技术这条路上. 不管我们处于何种职位,拿着哪种薪水,其实,我们会是不是的问问自己"做技术到底可以做到那种地步& ...

  5. Django-C002-深入模型,到底有多深

    此文章完成度[100%]留着以后忘记的回顾.多写多练多思考,我会努力写出有意思的demo,如果知识点有错误.误导,欢迎大家在评论处写下你的感想或者纠错. ORM介绍:对象关系映射(英语:(Object ...

  6. Web service到底是什么?

    Web service到底是什么:在什么情况下你应该使用Web service. 分布式应用程序和浏览器 研究一下当前的应用程序开发,你会发现一个绝对的倾向:人们开始偏爱基于浏览器的瘦客户应用程序.这 ...

  7. Android:JNI 与 NDK到底是什么

    前言 在Android开发中,使用 NDK开发的需求正逐渐增大 但很多人却搞不懂 JNI 与 NDK 到底是怎么回事 今天,我将先介绍JNI 与 NDK & 之间的区别,手把手进行 NDK的使 ...

  8. 到底什么是hash?它起什么作用?

    从emule诞生到现在也已经有了两年左右时间了,随着emule的普及,喜欢他的人也越来越多,但是由于emule对技术相应有一个门槛,不像bt那么容易上手,所以很多朋友很长时间以来一直都有这样或那样的疑 ...

  9. svd奇异值分解_SVD(奇异值分解)到底在干什么

    奇异值分解就是在低维空间中寻找最接近原矩阵 的低维矩阵 ,说白了就是数据降维. 奇异值分解是一种十分重要但又难以理解的矩阵处理技术,据人工智能的大牛吴恩达老师所说,在机器学习中是最重要的分解没有之一的 ...

最新文章

  1. 7 开机启动文件路径_为什么当我登录的时候,总有一些文件会被打开
  2. linux wget下载、断点续传
  3. JavaScript的预编译及执行顺序
  4. 在Eclipse RCP中使用Spring AOP/ProxyFactory的问题
  5. NS2:undefined reference to `xxx' collect2: error: ld returned 1 exit status
  6. 开源软件free download manager在windows defender中报毒
  7. mysql amoeba 链接111,mycat1.4 amoeba3.0.5 mysql直连对照_mysql
  8. 【C语言】数学也没辣么难嘛
  9. (十七)Java springcloud B2B2C o2o多用户商城 springcloud架构-消息驱动 Spring Cloud Stream...
  10. pytorch学习笔记(二十二):Pooling
  11. 实时视频流(url)——延时显示
  12. 【自动化__持续集成】___java___代码非空指针
  13. 2018.09.02 bzoj1025: [SCOI2009]游戏(计数dp+线筛预处理)
  14. mysql角色权限关系表查询_用户、角色和权限,多表查询
  15. 开尔文四线测试及惠斯通电桥资料收集
  16. 点云纹理映射 matlab,一种点云模型纹理映射方法与系统与流程
  17. 汉芯门主角制造另外一个汉芯?
  18. 电脑打印准考证图片显示不出来
  19. MCU内部参考电压几种妙用你都知道嘛
  20. Java 多线程面试题及回答

热门文章

  1. JAVA调用HTTP接口
  2. 安卓JNI使用C++类
  3. OpenCV:实现灰度直方图和单通道直方图拉伸
  4. 几个方便编程的C++特性
  5. Android -- Webview自适应屏幕
  6. vundle按照YouComplete
  7. 【Mac】『终端』显示、隐藏所有文件
  8. Rake::TestTask 介绍
  9. 让KVM虚拟机支持console功能
  10. isc-dhcp监听网口的实现步骤