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方案,其存储方案还需要更深入的研究。