本人目前就职于烽火集成,从事云计算产品架构设计相关工作,长期专注于内核、虚拟化、分布式、云计算等方向。
技术交流请联系:xiaoding@fiberhome.com
前言
Docker 在DockerCon 2017大会上发布了一个自己的操作系统,宣称LinuxKit,安全,精简,强移植性。经过研究后发现LinuxKit就是kernel+busybox实现的一个微缩linux系统,其中直接安装了containerd和runc服务。其他服务全部都使用容器启动。一句话概括,LinuxKit就是希望在操作系统层面除了containerd之外其他服务都跑在容器中,这是一个几乎全部服务都在容器中的操作系统。
LinuxKit的使用
先介绍下LinuxKit是如何使用的。
项目地址:https://github.com/linuxkit/linuxkit
LinuxKit工程提供了工具来构建我们自己的操作系统。
- moby 通过yml文件的描述,构建自定义的操作系统。
- linuxkit 用来帮忙在不同平台启动镜像的工具。
首先安装moby和linuxkit工具和下载linuxkit代码
然后开始编译定制化的linux操作系统,我们使用LinuxKit提供的linuxkit.yml来进行编译
编译完成后,我们可以看到新出现的文件,这就是通过linuxkit.yml编译出来的内核和ramdisk
接下来可以通过linuxkit工具来启动这个系统。
linuxkit 会根据系统自动选择合适的hypervisor来启动镜像。
由于我在linux上,所以启动的时候使用了kvm来启动虚拟机。
启动时候可以看到我们可爱的小鲸鱼。这时候我们订制的专门跑容器的系统就完成了。
这里看一下系统启动了那些程序
使用默认的linuxkit.yml 其实就是启动了一个nginx服务。而且这个系统中的init程序直接启动了containerd。以后所有的服务都是通过容器启动的。
linuxkit分析
通过刚才的使用介绍可以看到,其实lilnuxkit是给用户提供了一种通过yml来订制自己的微缩操作系统的方式。那么我们还是先从这个linuxkit.yml文件来看。
文件比较简单,通过阅读文件可以看到,通过指定不同的容器镜像,最终可以帮助我们生成想要的
镜像。
生成了镜像,我们自然要研究一下这个linuxkit操作系统和现在发行版linux有哪些区别。
在使用linuxkit启动时,可以看到qemu相关的参数。
观察后可以发现,在启动虚拟机时候,并没有挂载硬盘,而是使用了指定kernel和ramdisk的方式来进行的。
这样看来linuxkit其实就是一个使用kernel和ramdisk直接启动的操作系统。 而ramdisk就包含了服务的容器镜像,在init程序启动之后,就通过containerd来拉起服务。linuxkit的init程序是用shell编写,因此我们这里也打开来看看。
文件内容依然简单可以看到,init程序给/mnt挂载了tmpfs系统,这是一个内存文件系统。然后将ramdisk中的所有内容都copy到了/mnt下,然后切换根目录到 /mnt。然后交给busybox继续启动。
busybox接着就开始启动containerd,并通过runc启动系统应用容器等。
linuxkit使用场景
从官方的描述来看,Linuxkit为每种容器提供了一个基于容器的方法,生成轻量级Linux子系统。当为特定硬件或者拥有特定功能定制系统时非常有用。每个LinuxKit子系统都有其自己的Linux核心,而每个系统守护进程或者系统服务都是一个容器。这些Linux子系统一旦被打包成ISO镜像,就可以用来启动物理机或者虚拟环境。Docker以提供的服务方式维护这些子系统。
这里其实可以看到Linuxkit解决了docker一直以来的问题容器和host共享内核,以至于有些应用不能够很好的在docker上使用的问题。
linuxkit具有的特点:
- Linuxkit作为一个操作系统,本身可以在物理机或者虚拟机上启动。
- linuxkit是只读文件系统,并且相当轻量级只有60M左右,可以被应用在无盘启动系统中。
- linuxkit的理念同docker理念一脉相承。不同的镜像对应不同的应用,灵活,轻量,无状态。
可以预见到,可以直接在裸机上通过pxe来启动对应的linuxkit镜像,或者使用虚拟机快速启动linuxkit镜像,用户已经无需再预先搭建docker平台来启动容器。可以说linuxkit给容器化带来了更广阔的前景。