Unikernels 解读

2023-11-03

转载于https://zhuanlan.zhihu.com/p/29053035

 

Unikernels: Beyond Containers to the Next Generation of Cloud是 Russ Pavlicek的一本动物书(虽然是 O'Reilly 的,但是封面不是动物,是石榴),这本书对 Unikernel 有着比较全面的介绍,而且电子书是免费的,值得一读。

啥是 Unikernel?

从 2014 年以来,容器以一种不可逆转的态势席卷了全球,Unikernel 是很多人眼中的下一个容器。如果要了解什么是 Unikernel,首先需要了解什么是 kernel,kernel 是操作系统中的一个概念。应用要运行起来,是肯定要跟硬件打交道的,但是如果让应用都直接操作硬件,那一定是一场灾难。那内核就是在应用与硬件中间的一层抽象,内核提供了对底层硬件的抽象,比如把硬盘抽象成了文件,通过文件系统进行管理。传统的内核会将所有的硬件抽象都实现在其中,其中的代表就是 Linux,这样的内核被称为宏内核(Monolithic Kernel)。在宏内核中,所有的模块,诸如进程管理,内存管理,文件系统等等都是实现在内核中的。这样虽然不存在通信问题,但是任何一个模块的 bug 会使得整个内核崩溃。

于是学者们提出了微内核(Micro Kernel)的概念,在内核中只保留必要的模块,比如IPC,内存管理,CPU调度等等。而其他,诸如文件系统,网络IO等等,都放在用户态来实现。这样会使得内核不那么容易崩溃,而且内核需要的内存小了。但是由于模块间的通信需要以 IPC 的方式进行,因此有一定的 overhead,效率不如很莽的宏内核。

那后来又有了混合内核(Hybrid Kernel),把一部分不常使用的内核模块,或者是原本需要的时间就很长,因此 IPC 的 overhead 看起来就不是那么夸张的功能,移出内核,而其他的就会放在内核里。

再后来还有 Exokernel,但是太长了就不讲了,这部分内容在 CSP 课堂笔记之 Unikernel一文中有更详细的解释。

直接说 Unikernel,Unikernel 的官方解释

Unikernels are specialised, single-address-space machine images constructed by using library operating systems.

翻译一下就是

Unikernel 是专用的,单地址空间的,使用 library OS 构建出来的镜像

其最大的卖点就是在,没有用户空间与内核空间之分,只有一个连续的地址空间。这样使得 Unikernel 中只能运行一个应用,而且对于运行的应用而言,没有硬件抽象可言,所有的逻辑,包括应用逻辑和操作硬件的逻辑,都在一个地址空间中。

这样有啥好?

哦,原来 Unikernel 就是一个单一内存空间的内核镜像,其中只能有一个应用在运行,那这样有啥好呢,为啥值得我放弃 Linux 而用你这么一个看上去像是阉割版的内核呢?好处就在,小,快,安♂全 /w\

Unikernel 镜像都很小,由 MirageOS实现的一个 DNS server 才 184KB,实现的一个 web server 674 KB,小到恐怖的程度。

然后就是快,启动很快。因为镜像都很小,所以起停都在毫秒级别,比传统的 kernel 要快多了。

最后是安全,一般来讲,小的东西相对而言比较安全。Unikernel 中没有 Shell 可用,没有密码文件,没有多余的设备驱动,这使得 Unikernel 更加安全。

开发测试与传统有啥不同?

Unikernel 在真正实践中,如何开发与测试是一个值得关注的问题。在开发过程中,开发者可以假定自己在传统的操作系统上进行开发,而所有内核相关的功能,暂且由开发机的操作系统提供。

而在测试环境中,大部分 Unikernel 的实现会将应用代码与需要的内核模块构建成 Unikernel 后,再将其跑在一个传统的操作系统上,利用传统操作系统上的工具来测试 Unikernel。以 Rumprun为例,它可以通过 KVM/QEMU 来运行一个 Rumprun Unikernel VM,随后用 Host OS 上的 GDB 来对其进行调试,具体细节可见此处。关于调试就介绍到此,如果你想了解更多,Hacker News 上的这个 post可能会给你一些启发。

在发布阶段,这是 Unikernel 最简单的事情了。Unikernel 最后的产物就是一个 kernel image,可以在 Hypervisor,Bare Metal 等等各种环境上运行。

所以可以看到,其中 Unikernel 在软件过程中与传统方式最大的不同就在于调试与测试。而在发布的阶段,传统的方式可能发布的是一个应用,时髦一点那一个容器镜像,而 Unikernel 则是一个高度定制化的 kernel。

目前的 Unikernel 项目

介绍完 Unikernel,接下来将介绍下目前比较成气候的 Unikernel 项目,Unikernel 的实现大部分都是语言特定的。因为涉及到具体语言的运行时,所以很难有一个项目可以适配所有的技术栈。

MirageOS应该是名气最大的一个 Unikernel 项目,它是使用 OCaml 进行开发的,也是要求开发者懂 OCaml 才行。与其他 Unikernel 相比,它非常成熟,而且有一些论文,对钟爱论文的同学非常友好。

HaLVM也是一个比较早的 Unikernel 项目,它可以帮助 Haskell 程序员们把自己的 Haskell 程序构建成 Unikernel。如果你不会 Haskell,那就算了 =。=

ClickOS是一个比较独特的项目,他也非常古老了,但是原本 Click 并不是以 ClickOS 的形式出现的,原本它只是一个支持定制的 router,后来就变成了 ClickOS,一个基于 Unikernel 的 router。它也有很多论文,大部分都是关于 Click 本身,而不是 Unikernel 实现的。

Rumprun也是一个非常独特的项目,其利用了 Rump Kernel,理论上 POSIX 兼容的程序,都可以用 Rumprun 来构建成 Unikernel。

如果这些还不能满足你的好奇心,Open source work on unikernels上列出了众多的 Unikernel 项目,如有需要还请自行浏览。

Unikernel, Docker,Hyper 与 Linuxkit

对 Unikernel 的介绍就是这些了,最后再谈谈自己对目前很火的一些概念的看法,以及它们之间的联系。

Unikernel,在我看来,是另一种形式上的容器。在一个 Unikernel 中,只能运行一个应用,这与容器的哲学不谋而合。但现在容器最吸引人的特性并不是它的便捷,而是在它的分发。Docker 让我们看到了,原来应用的分发可以这么无痛。而 Unikernel 与容器相比,虽然可以做的更小更安全,而且也不需要有 Docker Daemon 这样的后台程序存在,甚至不需要 Host OS,或者 Hypervisor,但是它一是与传统的软件过程有较大的出入,二是在分发等等方面不能做到像容器那样方便。所以它目前肯定不会成为主流的应用分发方式,还需要进一步探索。

为了能够让 Unikernel 尽快进入生产环境,有一项工作很值得关注。

 

 

在 Unikernel 里运行一个 Docker Container,想法很美好,但是同样也有很多问题。这样其实并没有利用到容器便于分发的优势,也没有完全发挥 Unikernel 的优势,我觉得这不是未来。不过作为一种折中方案值得一看,可惜从 DockerCon 15 之后就没听见什么动静了。

Hyper Container 的技术特别独特,之前在 Docker 与 Hyper一文中介绍过,这里不再多说。他们的实现很完整,有对标 runc 的 runv,有扩展 Kubernetes 中 container runtime 的 frakti,虽然我没有尝试过,但是我觉得是比 Docker in Unikernel 更加可行的方案,讲道理很有前途。

Linuxkit 是 Docker 改名 Moby 后随之发布的一个项目。Linuxkit 严格来说是一个构建操作系统的工具集,可以用来构建 Unikernel,但是也可以用来构建最小化的 Linux Kernel,目前还不知道要往什么方向发展。

这些概念或多或少都有相互重叠的部分,也没有谁一定胜过谁的说法,但都有一个特点:有趣。它们都有自己不同的应用场景,本来嘛,Docker 也不是银弹。

PS:本文都是纸上谈兵,作者本人并无对 Unikernel 在生产环境中的使用经验(应该暂时也没有人有),大家看看就好,如有疏漏还请不吝指教:)

许可

作者高策,同步发表在个人博客东岳团队博客上,采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可,非商业性转载请注明出处(东岳博客),其他需求请与我们联系。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unikernels 解读 的相关文章

  • 终端连接控制(stty的编写)

    终端连接控制 stty的编写 一 背景 文件与目录在之前已经学习过了 文件中包含着数据 这些数据可以被读出 写入 也可以用以操作 但文件不仅仅是计算机唯一的数据来源 计算机的数据还可以来自于许多的外部设备 比如扫描仪 照相机 鼠标等输入设备
  • plsql更改用户登录密码

    ORACLE数据库系统是美国ORACLE公司 甲骨文 提供的以分布式数据库为核心的一组软件产品 是目前最流行的客户 服务器 CLIENT SERVER 或B S体系结构的数据库之一 比如SilverStream就是基于数据库的一种中间件 O
  • Tomcat7安装及配置教程

    Apache Tomcat7 0安装及配置教程 Apache Tomcat7 0官方网站链接 http tomcat apache org apache tomcat 7 0 73 windows x64 先解压下载的压缩包 然后在bin目
  • System.getProperty用法

    转自 http blog darkmi com 2011 03 16 1666 html System getProperty 用于获取当前的系统属性 比如java版本 操作系统名称 区域 用户名等 这些属性一般由jvm自动获取 不能手工设
  • Win11微软账号登录不上?Win11登录Microsoft账户出错的解决方法

    Win11微软账号登录不上 近期有部分Win11用户反映在登录微软账号会出现一直转圈 无法登录的情况 这样导致部分功能都不能正常使用了 为此十分令人头疼 那么对于这一情况 有没有什么方法可以有效的解决呢 下面小编教给大家操作方法 大家可以去
  • linux 如何创建卷组

    1 创建一个物理卷 Pvcreate dev sd1 dev sd2 dev sd3 dev sd4 2 用刚才创建的物理卷创建一个卷组 Vgcreate 卷组名 dev sd1 dev sd2 dev sd3 dev sd4 3 创建逻辑
  • gpuz怎么看显存颗粒

    gpuz可以帮助一些用户查看电脑的一切显卡参数 对于想要了解显卡的网友来说使用起来是非常方便的 不过有些网友是刚开始使用 还不知道gpuz怎么看显存颗粒 下面小编就教下大家gpuz查看显存颗粒的方法 首先 显存颗粒是显存的物理存储组成单元
  • 操作系统PV操作及读者写者问题

    操作系统PV操作及读者写者问题 目录 1 信号量 2 P V操作原语可描述为以下式子 3 解释 4 互斥模式原理 5 同步模式原理 6 读者写者问题 1 信号量 PV操作与信号量的处理有关 信号量是表示资源的实体 是一个与队列有关的整型变量
  • JSON.stringify()

    JSON stringify 将一个JavaScript值 对象或者数组 转换为一个 JSON字符串 如果指定了replacer是一个函数 则可以选择性的替换值 或者如果指定了replacer是一个数组 可选择性的仅包含数组指定的属性 语法
  • Java堆的自动垂直缩放

    多年以来 java一直是贪婪的应用程序的同义词 这种类型的应用程序在晚上打开冰箱并吞噬所有可用资源 直到崩溃 该行为的主要原因是缺乏一种有效的方式来将操作系统在Java堆中分配且不再使用的内存交还给操作系统 However with the
  • win10 Enable developer Mode

    经过漫长的安装过程 win10终于装上了vs2015 rc 写个小程序试试 结果提示 根据提示打开 设置 更新 for developer 据说应该有这么个界面 但是这个界面根本出不来 直接闪退的说 翻 MSDN 终于翻出了解决方法 htt
  • Linux系统编程:多线程交替打印ABC

    引言 分享关于线程的一道测试题 因为网上基本都是Java的解决方法 决定自己写一篇来记录一下线程的学习 问题描述 编写一个至少具有三个线程的程序 称之为线程 A B 和 C 其中线程 A 输出字符 A 线程 B 输出字符 B 线程 C 输出
  • Linux,Network manager 导致节点异常重启

    推断是Network manager 导致的 原因待查今天在VmWare的虚拟机上装了个测试RAC 又遇到了一个摸不到头绪的问题CRS装好后 一旦登陆图形界面 节点就重启 事情就有这么巧不登陆图形界面 观察了1个小时没问题 一旦登陆后 立刻
  • [架构之路-185]-《软考-系统分析师》-3-操作系统基本原理 - 文件索引表

    目录 一 文件的索引块 二 索引分配表 三 索引表的链接方案 四 多层索引 五 混合索引分配 一 文件的索引块 存放在目录中的文件 并非是文件的真实内容 目录中记录了文件的索引块是几号磁盘块 文件对应的索引表是存放在指定的磁盘块中的 二 索
  • OS——文件管理系统磁盘的结构之搞清盘面和柱面

    如上图 每个柱面有三个盘面 即就是3个磁道 柱面可以抽象的理解成是一个套一个的立体的同心圆柱体 例 2019年408真题 磁盘有300个柱面 每个柱面有10个磁道 每个磁道有200个扇区 扇区大小为512B 则磁盘容量 分析 每个柱面有10
  • linux 使用systemctl 启动服务报错: Error: No space left on device

    By default Linux only allocates 8192 watches for inotify which is ridiculously low And when it runs out the error is als
  • 操作系统常见面试题

    1 什么是进程 Process 和线程 Thread 有何区别 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动 进程是系统进行资源分配和调度的一个独立单位 线程是进程的一个实体 是CPU调度和分派的基本单位 它是比进程更小的能
  • gdb attach 进程调试

    gdb调试正在运行的进程 GDB可以对正在执行的程序进行调度 它允许开发人员中断程序 并查看其状态 之后还能让这个程序正常地继续执行 gdb attach xxxxx xxxxx为利用ps命令获得的子进程process
  • Linux(13):例行性工作排程

    例行性工程 听谓的排程是将工作安排执行的流程之意 Linux 排程就是透过 crontab 与 at 这两个东西 两种工作排程的方式 一种是例行性的 就是每隔一定的周期要来办的事项 一种是突发性的 就是这次做完以后就没有的那一种 at at
  • 【操作系统xv6】学习记录4-一级页表与二级页表

    占位

随机推荐

  • 深入研究java.lang.Runtime类

    转自 http lavasoft blog 51cto com 62575 15565 一 概述 Runtime类封装了运行时的环境 每个 Java 应用程序都有一个 Runtime 类实例 使应用程序能够与其运行的环境相连接 一般不能实例
  • Java学习笔记33——特殊操作流

    特殊操作流 特殊操作流 标准输入输出流 打印流 字节打印流 字符打印流 用字符打印流改进复制Java文件 对象序列化流 对象序列化流 对象反序列化流 对象序列化流的三个问题 Properties Properties作为Map集合的使用 P
  • 全连接神经网络、卷积神经网络

    全连接神经网络 卷积神经网络 前言 全连接神经网络 介绍 结构 损失函数 梯度下降 链式法则 反向传播 总结 卷积神经网络 背景 结构 卷积 Convolution 池化 Max Pooling 激活机制 Example 风格迁移 前言 刚
  • 【华为OD机试c++】We are a team(C++ Python Java)2023 B卷

    题目描述 总共有 n 个人在机房 每个人有一个标号 1 lt 标号 lt n 他们分成了多个团队 需要你根据收到的 m 条消息判定指定的两个人是否在一个团队中 具体的 消息构成为 a b c 整数 a b 分别代表两个人的标号 整数 c 代
  • java整合spark迁移hive数据到mongo

    1 SparkSession配置 SparkSession sparkSession SparkSession builder appName hive mongo master local enableHiveSupport config
  • IDEA创建SpringBoot项目并整合SSM+Redis

    1 创建SpringBoot项目 1 File gt New gt Project 选择Spring Initiatilizr 2 点击下一步 填入相应的GroupId 选择Java Version等 在选择下一步 3 选择包依赖 如果只是
  • 【Linux入门之密码登陆】centOS密码输入正确却登陆不上,原来是我误会了

    搜索Linux修改密码 出来的基本都是修改root用户的密码 而我的GUI界面一打开显示的用户列表里是普通用户 每次登陆我都使用我刚改好的root密码 自然密码错误 无法登陆 我还跑到百度搜 centOS密码输入正确却登陆不上 等等相似的描
  • springboot项目热部署

    快捷键Ctrl Alt Shift 选Registry 勾选下面这个 然后 apply一下 pom xml
  • sc不是内部命令也不是外部命令处理方法

    sc不是内部命令也不是外部命令 用户环境变量里path里加上 SystemRoot system32
  • 【小沐学写作】程序员必备技能:在线协作文档汇总

    文章目录 1 简介 2 微软Office在线文档 2 1 功能简介 2 2 使用费用 2 3 用户体验 3 石墨文档 3 1 功能简介 3 2 使用费用 4 腾讯文档 4 1 功能简介 4 2 使用费用 5 语雀 5 1 功能简介 5 2
  • SQL grouping sets 子句

    grouping sets子句允许你指定多个group by 选项 增强了group by 的功能 可以通过一条select 语句实现复杂繁琐的多条select 语句的查询 并且更加的 高效 解析存储一条SQL于语句 下面通过使用 grou
  • 图像分割高铁扣件

    图像分割 针对高铁扣件 在对图像的研究和应用中 人们往往仅对图像中的某些部分感兴趣 这些部分通常被称为前景或目标 其余部分则称为背景 目标一般对应于图像中特定的 具有独特性质的区域 独特性质可以是像素的灰度值 物体轮廓曲线 颜色和纹理等 为
  • GBDT(GBM)调参方法

    GBM参数 总的来说GBM的参数可以被归为三类 树参数 调节模型中每个决定树的性质 Boosting参数 调节模型中boosting的操作 其他模型参数 调节模型总体的各项运作 GBDT类库弱学习器参数 即定义一个决定树所需要的参数 由于G
  • 【源码分析】zeebe actor模型源码解读

    zeebe actor 模型 如果有阅读过zeebe 源码的朋友一定能够经常看到actor run 之类的语法 那么这篇文章就围绕actor run 方法 说说zeebe actor 的模型 环境 zeebe release 8 1 14
  • Java统一返回结果自动封装组件【Response-boxing】

    0 需求 统一封装返回结果 包括code message data数据 不用手动封装 通过自定义注解标记即实现封装 如果controller结果已经手动封装 则不重复封装 1 项目结构 2 创建自定义注解 import java lang
  • Paxos算法的java实现demo(只是为了简单的测试)

    Paxos 的概念我就不在这里啰嗦了 网上有很多优秀的博客 下面是我推荐的一个写的比较好的 https www cnblogs com linbingdong p 6253479 html 我们直接上代码吧 代码里面都有注释 先看一下项目结
  • 基于mulitisim14仿真的数字电子称

    参考了下面的文章做了一个数字电子称 https www renrendoc com paper 119413660 html 仿真如下 需要仿真文件的私聊
  • 中国工程院院士郑纬民:元宇宙是一个赋能实体经济的重要新赛道

    2022年3月31日 元宇宙产业委共同主席郑纬民院士在第三届元宇宙产业论坛发表了题为 元宇宙创新应用全面启航 算力是基础 的演讲 以下为郑纬民院士的演讲全文 今年全国两会中一些代表和委员提出了关于元宇宙的建议和提案 说明元宇宙已经得到了大家
  • 吉林大学超星MOOC学习通高级语言程序设计 C++ 实验04 数组及其在程序设计中的应用(2021级)(1)

    1 索引数组排序 题目编号 Exp04 Enhance04 GJBook3 06 21 题目名称 索引数组排序 题目描述 已知n n 100 个元素的整型数组 A 未排序 一个索引数组 B 保存 A 的下标 编写程序 在不改变数组A的情况下
  • Unikernels 解读

    转载于https zhuanlan zhihu com p 29053035 Unikernels Beyond Containers to the Next Generation of Cloud是 Russ Pavlicek的一本动物书