Unikernel初体验
引言:
2016年1月21日,应用容器引擎 Docker 宣布收购了英国的 unikernel 实现初创企业 Unikernel System,但具体交易金额并未透露。那么unikernel到底是一种什么样的技术呢?它会对现有技术产生怎样的影响呢?
Unikernel是什么:
Unikernels are specialised, single address space machine images 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 their 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[1].
上面的文字来自wikipedia,相信大家也能有个基本的认识。下面,我们将会把unikernel和操作系统,传统虚拟化(kvm)以及docker做个对比。
Unikernel与操作系统:
✔ Unikernel和操作系统都可以运行于“Bare Metal” Architecture
✔ Unikernel代码量和复杂度小于操作系统
✔ Unikernel可以便捷的锁核,特定cpu服务于特定应用,减少线程切换开销
✔ Unikernel可自定义模块,选择性抛弃应用不需要的内核模块,例如软驱,usb驱动等
✔ Unikernel一旦打包完成,内核模块的独立升级比较困难
无论是RedHat,SUSE还是ubuntu亦或是windows,他们的思路都是将操作系统做大做全,在启动时,就加载了尽可能全的库,然而在某些场景下可能根本不需要,比如:你需要搭建一个基于ext4文件系统和ipv4协议的Tomcat运行java web,那么操作系统的ipv6协议,xfs文件系统对该应用可能并没有意义,但是他们确占据了操作系统的内核。Unikernel就像一组积木,程序可以根据自己的需求来搭建自己的操作系统而无需选择所有组件。相信很多程序员都有整理依赖关系的经历,不管是系统之间的相互依赖,lib包的上下依赖等,但从应用出发,将应用系统以下,硬件以上的依赖整理清晰明了本身就是一项困难的工作。
Unikernel与kvm:
kvm是在原有硬件和操作系统的基础上虚拟出来完整的操作系统(包含Kernel,TCP/IP协议栈,文件系统等)。
✔ Unikernel可以运行于hypervisor或是“Bare Metal” Architecture,kvm 运行于Hosted Architecture
✔ Unikernel可以选择性的打包内核模块,kvm虚拟出完整的操作系统
✔ Unikernel可以在一台宿主机上运行上千个应用,而这是虚拟机所无法办到的
✔ Unikernel与kvm具有类似级别的计算隔离性
如果将Unikernel运行在hypervisor上,其相比于虚拟机具有更快的启动时间,更加轻量级的内核,更少的系统冗余,以及更高的系统利用率。
Unikernel和kvm 对比图
Unikernel与docker:
✔ 运行于Hosted Architecture,Unikernel相比于docker具有更好的隔离性,安全性
✔ 运行于“Bare Metal” Architecture,Unikernel相比于docker具有更快的启动时间,但目前缺少编排管理系统的支持
✔ Unikernel可满足定制化内核的需求
Unikernel包含了ClickOS,Clive,Drawbridge,HaLVM,IncludeOS,LING,MirageOS, Rumprun和runtime.js等Project。RumpKernels提供了免费、可重复使用、组件化、内核质量的驱动程序,比如文件系统、 POSIX系统调用、PCI设备驱动程序以及 TCP/IP和SCSI协议堆栈。Rumprun Unikernel只有几千行代码,外加Rump Kernel组件,支持POSIX化的软件直接在原始硬件和云虚拟机管理程序(比如KVM和Xen)上运行。
Rumprun demo[3]:
接下来我们通过一个简单的例子来感受下unikernel的nginx服务。
操作系统: Ubuntu-14.04.1 Linux version 3.16.0-30
1.下载编译Rumprun
从github上将rumpkernel的源码下载编译,并把路径加入到用户路径中
git clone
cd rumprun
git submodule update –init
./build-rr.sh hw
export PATH=${PATH}:$(pwd)/rumprun/bin
编译需要几分钟时间,编译编译完成后:
2.下载rumprun-packages,其中包含了haproxy,mysql,nginx和memcached等多个项目
git clone https://github.com/rumpkernel/rumprun-packages.git
修改config.mk 配置文件
cp config.mk.dist config.mk
vim config.mk
将 RUMPRUN_TOOLCHAIN_TUPLE= 修改为 RUMPRUN_TOOL
CHAIN_TUPLE=x86_64-rumprun-netbsd
cd nginx
进入nginx目录开始编译代码,编译过程一般都不是一帆风顺的,少什么包就装什么包,编译完成后,在images目录会生成data.iso。
我们编译好了unikernel,想要通过网络访问unikernel中的服务,需要打通unikernel和宿主机之间的网络。
ip tuntap add tap0 mode tap
ip addr add 10.0.120.100/24 dev tap0
ip link set dev tap0 up
最后在10.0.120.0这个网段内启动nginx服务,就可以享受到运行在unikernel中的nginx了。
rumprun qemu -i -M 128
-I if,vioif,'-net tap,script=no,ifname=tap0'
-W if,inet,static,10.0.120.101/24
-b images/data.iso,/data
-- bin/nginx -c /data/conf/nginx.conf
金融行业对于Unikernel的态度:
随着技术的发展以及国家自主可控的政策,金融行业对于技术本身的关注度也越来越高,从oracle到mysql,从小型机到x86服务器,从vmware到openstack,这些技术路线都意味着金融行业的IT技术能力的强化和完善,掌握开源技术,自定义软件也成为了金融IT界的常态。根据GitStats的统计,在linux kernel 4.1版本发布[2]时,linux项目目前已经有了19509218行代码,这样的代码量和操作系统本身的难度对于金融IT提出了挑战。Unikernel技术对于内核的精简以及模块的提取为金融IT创造了良好的摆脱操作系统厂商绑定,完成技术转型,实现操作系统级别优化和深入的机会,我们对其保持持续关注和继续跟进研究状态。
Unikernel 相比于虚拟机有着更小的启动内核,更快的启动速度,相比于Docker,有着更好的隔离性,更小的内核态库。其网络通过tap设备连接到宿主机,可以对接现在各种SDN方案,其存储方案还需要更深入的研究。
后续将继续分享深入的内容,敬请期待!
[1]Wikipedia unikernel: https://en.wikipedia.org/wiki/Unikernel
[2]GitStats linux: http://www.phoronix.com/misc/linuxstat-june-2015/
[3]Unikernel Github: https://github.com/rumpkernel
- [数据清洗]-Pandas 清洗“脏”数据(一)
- [数据清洗]-混乱的邮编数据
- 10行代码,Python实现爬取淘宝/天猫评论
- 4.请求安全-- 结合使用的安全优势总结
- TensorFlow强化学习入门(4)——深度Q网络(DQN)及其扩展
- 3.请求安全-- 如何验证请求的唯一性
- 2.请求安全-- MD5的必要性以及实际应用场景
- 1.请求安全-- 一个简单的 单设备登录 单点登录
- phalapi-进阶篇3(自动加载和拦截器)
- phalapi-进阶篇2(DI依赖注入和单例模式)
- 基于PhalApi的DB集群拓展 V0.1bate
- phalapi-进阶篇1(Api,Domain,和Model)
- 你不知道的Javascript:有趣的setTimeout
- phalapi-入门篇5(数据库操作和Model层)
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Centos7服务器下启动jar包项目的最佳方法
- JavaScript易错点(长期更新)
- Centos7.5配置java环境安装tomcat的讲解
- CSS3卡片光照效果
- Linux文本查找命令find的用法详解
- Canvas系列(2):曲线图形
- Shell中去除字符串里的空格或指定字符的方法
- 使用‘fsck’修复Linux中文件系统错误的方法
- linux/OSX中“DD”命令制作ISO镜像操作系统安装U盘的方法
- 《高效能程序员的修炼》读书笔记
- linux之centos7防火墙基本使用详解
- Ubuntu安装scrcpy完成手机投屏和控制(Ubuntu用QQ微信的另一种方法)
- CentOS7 systemd添加自定义系统服务的方法
- Linux中sudo、su和su -命令的区别小结
- 非零环绕规则