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 解读 的相关文章

  • fork之后子进程到底复制了父进程什么

    fork之后子进程到底复制了父进程什么 发表于2015 4 3 9 54 08 2161人阅读 分类 操作系统 include
  • 线程和进程的区别(面试必备)

    参考文章 https www jianshu com p 2dc01727be45 线程与进程的区别通俗的解释 https www jianshu com p 8ad441510860 附加可参考文章 https baijiahao bai
  • 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 创建逻辑
  • 设备管理过程

    复杂度2 5 机密度2 5 最后更新2021 04 19 AIX中对设备会有如下五个操作 define aix下能看到设备的定义 但驱动程序并没有加载或初始化 该设备不可用 lsdev看到设备时defined 很多逻辑设备 vg lv等 只
  • 虚拟机管理程序、虚拟化和云: 深入剖析 PowerVM 虚拟机管理程序

    预备知识 Power 是没有限制的虚拟化 一些企业打算依靠 PowerVM 虚拟化将多个工作负载整合到较少系统上 从而提高服务器利用率 降低成本 Power VM 为基于 Power Systems 平台的高级 RAS 功能和领先性能为 A
  • win10 Enable developer Mode

    经过漫长的安装过程 win10终于装上了vs2015 rc 写个小程序试试 结果提示 根据提示打开 设置 更新 for developer 据说应该有这么个界面 但是这个界面根本出不来 直接闪退的说 翻 MSDN 终于翻出了解决方法 htt
  • Linux,Network manager 导致节点异常重启

    推断是Network manager 导致的 原因待查今天在VmWare的虚拟机上装了个测试RAC 又遇到了一个摸不到头绪的问题CRS装好后 一旦登陆图形界面 节点就重启 事情就有这么巧不登陆图形界面 观察了1个小时没问题 一旦登陆后 立刻
  • 程序员的自我修养——链接、装载与库

    1 温故而知新 操作系统概念 北桥 连接高速芯片 系统调用接口 以软件中断的方式提供 如Linux使用0x80号中断作为系统调用接口 多任务系统 进程隔离 设备驱动 直接使用物理内存的弊端 地址空间不隔离 内存使用效率低 程序运行的地址不确
  • Linux系统如何看目录属于哪个磁盘分区

    Linux是先有目录 再有磁盘分区 df h 目录 例如 没有挂载磁盘的目录 显示在系统盘 root iZ2ze57v3n0zma46zqiq8nZ sh 1 5 5 df h alidata Filesystem Size Used Av
  • Elasticsearch 日志

    下载并安装 Filebeat 首次使用 Filebeat 请参阅入门指南 复制代码片段 curl L O https artifacts elastic co downloads beats filebeat filebeat 7 2 0
  • [架构之路-185]-《软考-系统分析师》-3-操作系统基本原理 - 文件索引表

    目录 一 文件的索引块 二 索引分配表 三 索引表的链接方案 四 多层索引 五 混合索引分配 一 文件的索引块 存放在目录中的文件 并非是文件的真实内容 目录中记录了文件的索引块是几号磁盘块 文件对应的索引表是存放在指定的磁盘块中的 二 索
  • Ubuntu9.04太多乱码(中文不能正常显示)

    最近在使用Ubuntu9 04的过程中 发现有好多地方都出现乱码 其实是中文不能正常显示 现在把我所遇到的所有乱码问题集中一下 方便以后查阅参考 一 Flash乱码 在终端输入 sudo gedit etc fonts conf d 49
  • 内存管理——分页分段

    一 分页存储管理 1 页面与页框 1 页面 将一个进程的逻辑地址空间分成若干个大小相等的片 称为页面或页 并为各页加以编号 2 页框 相应于页面 把内存空间分成和页面相同大小的若干个存储块 称为 物理 块或页框 frame 3 页内碎片 在
  • 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
  • java IO、NIO、AIO详解

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 一 IO流 同步 阻塞 二 NIO 同步 非阻塞 三 NIO2 异步 非阻塞 正文 回到顶部 概述 在我们学习Java的IO流之前 我们都要了解几个关键词 同步与异步 sy
  • C#实现FTP文件夹下载功能【转载】

    网上有很多FTP单个文件下载的方法 前段时间需要用到一个FTP文件夹下载的功能 于是找了下网上的相关资料结合MSDN实现了一段FTP文件夹下载的代码 实现的思路主要是通过遍历获得文件夹下的所有文件 当然 文件夹下可能仍然存在文件夹 这样就需
  • 使用ShellJS提升你的开发效率(一)

    Shelljs Unix shell commands for Node js Shelljs是Node js下的脚本语言解析器 具有丰富且强大的底层操作 Windows Linux OS X 权限 Shelljs本质就是基于node的一层
  • 《OSPF和IS-IS详解》一1.7 独立且平等

    本节书摘来自异步社区 OSPF和IS IS详解 一书中的第1章 第1 7节 作者 美 Jeff Doyle 更多章节内容可以访问云栖社区 异步社区 公众号查看 1 7 独立且平等 OSPF和IS IS详解与TCP IP相比 OSI协议对各国
  • I/O设备模型

    I O设备模型 绝大部分的嵌入式系统都包括一些I O Input Outut 输入 输出 设备 例如仪器上的数据显示屏 工业设备上的串口通信 数据采集设备上用于保存数据的Flash或SD卡 以及网络设备的以太网接口等 I O设备模型框架 R

随机推荐

  • 深入研究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的一本动物书