由上而下的描述。
- libvirt
最顶层是管理虚拟机的入口,linux开源套件 libvirt(官网:www.libvirt.org):
Introduction
The libvirt project:
- is a toolkit to manage virtualization platforms
- is accessible from C, Python, Perl, Java and more
- is licensed under open source licenses
- supports KVM, QEMU, Xen, Virtuozzo, VMWare ESX, LXC, BHyve and more
- targets Linux, FreeBSD, Windows and OS-X
- is used by many applications
Recent / forthcoming release changes
事实上我刚开始接触的时候只知道virsh用来管理虚拟机,感觉十分奇怪,而virsh其实就是virtual shell,CLI常用的有:list,dumpxml,edit,start,shutdown等,该套件还有一套GUI接口,virt-manager,到了图形界面就相当方便了,跟vmware差不多用法。坦白讲已经这个GUI早已大行其道的时代,我非常热衷于图形界面,因为我属于联想型,发散思维,懒得死记硬背,最好看到图形就知道怎么用,连手册都不用看,马云说“需要看长长说明书的产品就丢掉”,能用超级自动化工具,绝不手工作业,毕竟程序员就是用来发明超级自动化工具的,够懒,才能发明出更好的超级自动化工具。
还要补充一点,虚拟机配置通过xml管理,使用dumpxml命令查看,这个配置文件包含了虚拟机模拟器的路径,你可以在这里将其指向不同的虚拟机,比如x86,arm,mips,powerpc等等。这一点对于以后的安卓沙箱会用帮助。
- qemu
这一层就到了虚拟机层了,开源项目,但是可以模拟多种cpu,模拟外设,目前我主要修改和编译其中的部分代码来对抗反虚拟机病毒,细节不必透露,以后还会做一些类似ring -1的事情,以后做到了再写一篇更深入的文章。网上有大量资料,目前不多介绍了。centos6,对应的虚拟机版本为2.5,最新版本会有很多新库的依赖,比如libc,有很多坑要填,因此使用老旧的2.5,centos7之后,我们将采用最新版2.12的qemu。这一层所做的事其实和java vm以及.net vm有些类似,还有WebAssemblly。
还有一点,采用增量镜像的好处,第一层为操作系统层,第二层为应用软件层(安装office,wps等样本运行环境),第三层为空(目的是便于镜像还原,由于是空层使得这一层文件非常小,当样本运行过后,用这个很小的空层文件覆盖样本运行后的那个增量,即可将沙箱还原为运行样本之前的面貌)。
- kvm
hypervisor层,使用了x86 cpu的VT技术,硬件级虚拟化技术,需要开启cpu vt,安装后会在设备目录有一个/dev/kvm设备,运行在内核当中,与之对应的有windows下的hyper-V,还有苹果的什么我忘记了,不重要。这一层可以跟上一层集成在一起,也就是说cpu可以由这一层提供,而外设则由上一层提供。
越往底层写的越少,因为有些不必写,更底层的还没深入研究,我是由qemu切入,然后上下延申,下一篇是驱动篇,由驱动程序入手,窥探操作系统的设计。