李毅伦 宋 虹 王大成 王建新
(中南大学信息科学与工程学院 湖南 长沙 410083)
桌面虚拟化技术蓬勃发展,正在被越来越多的企业和个人用户部署。桌面虚拟化技术降低了对客户端硬件配置的要求,也降低了用户的使用难度和门槛。管理员能根据不同类型用户的要求,统一快速地配置大量桌面和应用程序。同时大大减少了企业的维护成本。然而随着桌面虚拟化的普及,一些问题也显现出来。用户希望在他的多个设备(PC设备、移动设备)间建立起统一、专属的个人环境视图。这个环境包括常用应用软件、用户个人数据、系统个性化配置等。但是随着软件的日益丰富和版本的层出不穷,不同用户群组之间的需求差别很大。另一方面,为了存储这些用户的差异性信息,镜像所占用的磁盘空间也越来越大,这也降低了IT人员更新和管理维护镜像的效率。如何在保证用户个人配置的前提下,减少存储空间并高效率地管理维护镜像,成为亟待解决的问题。
在虚拟机镜像存储模式中,假设为每个用户分配100 GB的存储空间,那么1 000个用户就需要100 TB的企业级存储。目前企业级的桌面虚拟化都采用SAN[1]和NAS[2]存储方式,而中小规模的企业主要采用后者。NAS模式是在虚拟域0(domain 0)[3]上挂载镜像,根据差分磁盘[4]的原理,对根镜像(Golden image)做两级以上的快照。Vmware公司开发的Linked clone[5]和Citrix的MCS[6]镜像存储方式本质上也都是基于差分存储的原理[7],从几个少数的根镜像中派生子镜像,每个子镜像只存储与母版镜像的差异部分。这种存储方式大大减少了存储成本,而逐渐成为业界的主流。但这种方式也给软件的更新带来了不便,要想统一地安装或者更新某个软件,就得对已经布置好的Golden image作出修改,而根据差分磁盘的存储结构和原理,修改会导致其派生出的子镜像无法使用[8]。在这种情况下,对每个用户的子镜像单独进行更新维护将会产生大量的开销。
应用软件的更新和用户的桌面环境往往是整体的,耦合性极高的,操作系统、系统软件、用户自己安装的软件、用户个人数据以及插件等难以彻底分离,很难保证在互不影响的前提下进行数据的修改。如何有效地平衡镜像存储、镜像维护更新和保留用户个性化配置这三个方面,是一个难题。应用程序虚拟化[9]将所有应用程序运行所需的文件和环境封装在一起形成一个单独的可执行文件,实现了与操作系统的隔离,但这样会导致进程间通信受到限制,程序运行会不稳定。镜像遮掩技术[10]是一种将所有可能被用到的软件安装在Golden image上,然后使用遮掩技术屏蔽应用软件的技术,只有被授权的用户才能看到相应软件。该技术中任何对软件的修改都要打开并改动这个庞大的Golden image。许多公司因为它庞大的镜像规模而驳回了这种方案。
本文提出一种基于应用程序分层的镜像管理机制并实现了镜像管理系统IMsystem(Image Management System)。应用程序分层技术能将应用软件与操作系统在存储上进行分离,这些应用软件变成抽象的应用软件层,按照一定的顺序叠加在基本镜像(Golden image)之上。这个基本镜像往往是大部分用户公用的、基本的操作系统镜像。而用户需要的各种软件和他们的个性化设置将于操作系统分离出来保存在应用软件层中。
从用户的视角来看,当他们使用应用程序和配置自己的工作环境时,所有软件就像被安装在了本地一样,感受不到软件与操作系统的隔阂。同时这也极大地方便了IT管理员,他们能够根据用户需求制作应用软件层给用户使用,在不影响父镜像—子镜像结构的情况下,实现高效率的更新与维护。
为了实现本文的研究目标,即能在桌面虚拟化环境下,有效地平衡镜像的存储、维护更新和保留用户个性化三个方面的关系,提高镜像的管理效率,有以下几个问题需要被解决:
(1) 将应用程序与操作系统分离后,软件就能以模块化的形式加载,被用户使用,该模块应该包括哪些应用程序信息。
(2) 应用程序模块应当以怎样的方式存储,用哪些数据结构来描述这些组件,模块应该如何加载。
(3) 分离后的应用进程如何与操作系统通信,数据的访问流程是怎样的,如何达到和平时桌面环境下安装的软件一样的使用效果。
Windows环境下大部分应用程序都需要被安装才能使用,通常应用将个人设置写入注册表或者某个系统目录的配置文件中。这些应用由两个部分组成:第一部分是该应用进程安装时创建的所有文件、文件夹和注册表文件。第二部分是该程序运行时产生的个性化配置信息。假如能将这两个部分的信息单独储存在一个沙箱中,与操作系统隔离但同时能够满足程序进程运行时的交互请求,这些软件就成为了单独的模块。
应用程序分层本质是将应用软件与内核和操作系统分离,一个应用软件抽象为一个软件层。一个软件层是应用软件文件和注册表信息的集合。这些文件和注册表信息在正常的安装过程中被捕获下来,保存在虚拟磁盘,如VMDK[11]或者VHD[12]等格式的磁盘中。如图1所示。
图1 应用程序分层模型
当一个软件层被分发到虚拟机上时,虚拟磁盘将会被操作系统挂载,修改后的文件系统和驱动程序共同作用,应用程序就像被安装在本地一样能够正常使用。所有对应用的读写请求都会被截获然后被重定向至虚拟磁盘上。多个应用软件层通过文件系统驱动与注册表虚拟化技术叠加在一起,其中每个层有自己的优先级和共享机制。
大部分软件需要经过安装的过程才能使用,安装的过程通常对操作系统有两部分改动:文件、文件夹和注册表。即使一个软件不需要安装,在它的运行过程中也会需要将用户设置保存在Windows注册表项或者一些特定的系统文件夹位置中。在应用程序分层模型中,这些都被存放在对应软件层所属的虚拟磁盘上,当用户点击软件的可执行文件时,文件和注册表读写请求将会被发送至操作系统内核,被修改过的文件过滤系统截获这些请求并将它们重定向到新的位置上。
图2描述了两类应用程序运行的流程。一个应用程序需要访问某个文件,这个请求会首先到达文件过滤驱动层。在驱动中已经对原本的读写文件API进行了修改,假如该文件是需要被重定向的,则会优先将该请求转发到相应软件层中。不需要应用程序层数据的应用如图2中步骤(1)所示,需要应用程序层数据的应用访问流程如步骤(2)到步骤(8)所示。
图2 访问数据流程
步骤(1)中该文件不需要被重定向,请求将会被正常下发,通过操作系统的文件系统驱动层,访问保存在本地存储或者网络存储上的文件。
步骤(2)中,用户执行一个.exe文件产生了请求,该可执行文件位于软件层1中,数据被载入到内存中,产生了一个新的应用软件进程步骤(3)。该进程运行需要所对应的库文件支持,根据之前已经建立好的映射关系,判断该.dll文件位于软件层1中,于是读写库文件的请求被重定向到软件层1步骤(4)。进程继续执行,需要另外一个步骤(5)中的数据文件和步骤(7)中的某个注册表项信息,这两个文件都位于软层1中,重定向过程和步骤(4)相同。步骤(8)中,进程要访问的该文件不存在于软件层1,根据映射关系查找到软件层2,文件过滤驱动将读写请求重定向到软件层2中。
基于应用程序分层模型的思想,镜像管理系统IMsystem被设计出来。图3展示了IMsystem系统的功能模块设计图。
图3 系统功能模块
IMsystem镜像管理系统的功能具体体现在五个部分。其中每个模块的功能为:(1) 复合文件系统:提供应用程序访问文件的途径,过滤并分类文件读写请求以及文件重定向功能。(2) 复合注册表系统:提供应用程序访问注册表的途径,管理虚拟化注册表,过滤并分类注册表读写请求以及注册表重定向功能。(3) 应用程序资源捕捉模块:捕捉应用软件安装的过程,确定应用程序的初始条件,将所有应用的资源统一归并到一个集合当中。(4) 平台管理机制:包含不同层的优先级分配机制、文件删除标记(Token)机制以及数据写时复制机制。(5) 更新与分发模块:负责用户镜像的更新,和分发应用程序到操作系统让用户使用。本节着重介绍应用程序资源捕捉模块和平台管理机制,复合文件系统与复合注册表系统的关键技术将在下一节介绍。
为了实现应用软件和操作系统的分离,需要知道在安装过程中,应用软件对操作系统的修改,这些文件和注册表的信息的集合可以记为S。设未装软件A的系统为Pre,装了软件A后的系统为After。那么可以认为:
After=Pre+S
将集合After减去集合Pre即可得到集合S。利用一些工具软件如Total Uninstall[13]、installwatch[14]能得到集合S。这些软件的原理是在安装软件前和安装后分别对操作系统进行快照并保存,比对两次快照,计算出修改过的部分,并将所有改动过的项保存下来。
S中的文件和注册表信息可以分为三类:增加的、删除的、修改的,它们会被打上相应的增加(added)、修改(modifeid)、删除(deleted)标记,导出后的虚拟注册表信息以.reg类型保存。而文件信息以原本的组织结构方式存储在虚拟磁盘设备下的userApp name的子目录下。
同时这些信息将以(文件名--源文件路径--重定向路径--所属应用程序层--所属集合--程序层优先级)索引形式保存在内部的哈希表结构中。方便后面的文件重定向及注册表虚拟化操作。安装应用和跟踪安装过程的操作应在干净的裸系统下进行,防止过多干扰产生。
2.2.1优先级机制
当多个软件层同时使用时,会产生文件和注册表项的冲突,IMsystem采用优先级的方式,属于高优先级层的数据覆盖低优先级的。
如图4所示,Windows OS层、App1层和App2层的优先级依次增高,File4文件同时存在于Spp1和App2的软件层中,于是在App2层中的File4版本会被操作系统和用户看到。
图4 优先级和覆盖机制
2.2.2删除标记
如果一个软件层被管理员设置为只读的,那么用户在删除某个软件层中的数据时,并不会真正删除这个文件,而是在该文件上标记一个Token,Token信息储存在哈希表中。当文件驱动截获到访问带有Token的文件的行为时,直接在驱动相应的分发函数中进行对应的处理。这将会在下一节中说明。最终的结果是,应用程序层中的“删除”实际效果和在“普通”桌面环境桌中所期望的删除操作一样。
2.2.3写时复制
一般情况下,一个应用程序层会被多个用户共享。当多个用户操作同一个应用程序层时,为了防止该层的数据被修改,数据会被设置成只读的。为了保存用户的个性化修改,采用写时复制[15]机制将写入数据写到个人数据层中。如果用户对文件是删除操作,则采用上文叙述的删除机制,以标记Token的形式实现文件的“删除”。如果用户对文件是增加、修改操作,则将被修改的文件以副本形式存储到用户个人数据层,并将原文件映射到该副本文件上。这样用户以后将直接读写该副本文件。
3.1.1过滤设备的绑定
Windows系统中对文件的各种操作,如创建、打开、读/写、目录的打开、创建、删除等,所有这些I/O请求都是以IRP[16]形式发出的,驱动根据接收到的IRP请求类型,由不同的分发函数来处理。Windows中存在各种各样的设备对象,每个设备对象分别接受请求,并完成实际硬件功能。一个物理设备的驱动通常有几个驱动程序以分层的形式共同完成,每层一个设备对象,它们联系在一起组成一个设备栈[17]。而IRP下发是从上而下的,创建一个IRP时,会同时创建一个和他关联的IO_STACK_LOCATION数组,该数组以栈的形式存放在IRP栈中。IRP通过联合IO_STACK_LOCATION来找到接下来需要发送到的设备对象的地址,进而触发这个设备对象驱动的分发函数。如图5所示,IRP以这样的形式完成层层下发。
图5 过滤设备与IRP栈、设备栈关系
过滤是在不改变上层与下层间的接口的情况下,在Windows内核中加入新的层,从而加入新的功能。过滤的本质就是对一个设备对象实现绑定,从而预先接收到发往给该设备对象的请求。文件系统过滤,则是绑定文件设备对象,该设备对象位于磁盘卷设备上层,主要目标是截获所有的文件操作。在IMsystem中,实现过滤驱动的步骤如下:
(1) 文件过滤驱动程序绑定附着在文件卷设备上,在文件卷设备上层拦截发往该设备的请求。
(2) 拦截到请求后,根据功能逻辑,创建新的IRP消息与附着在下层的文件卷设备上的驱动程序通信。
(3) 创建完成例程,填写处理不同类型的IRP的分发函数,实现重定向等功能的逻辑。
(4) 创建删除例程,填写与文件设备解绑定时的逻辑,供适当适合卸载过滤驱动。
设备在绑定后,与IRP栈和设备栈的关系如图5所示。
3.1.2IRP的处理
文件重定向是在文件过滤的基础上,将对文件A的操作转移到文件B上。在IMsystem中,对用户而言,不同软件层上的软件都会被安装在C:Program Files文件夹中,而实际上所有的文件保存在各自应用程序层所属虚拟磁盘下的userApp name子目录下。当用户点击软件图标时,文件过滤系统将截获软件发出的IRP(I/O REQUEST PACKAGE),包括文件/目录打开请求(主功能码为IRP_MJ_CREATE)、文件/目录信息查询请求(主功能码为IRP_QUERY_INFORMATION)、文件/目录读取请求(主功能码为IRP_MJ_READ和IRP_MJ_WRITE)、以及负责结束文件操作的请求(主功能码为IRP_MJ_CLEANUP和IRP_MJ_CLOSE)。在IMsystem中,绑定好过滤设备后,文件过滤驱动截获应用向内核发送的每种IRP处理如下:
(1) 当收到IRP_MJ_CREATE请求时,代表一个新的文件或者文件夹被创建,或者一个存在的文件或者目录被打开。而且这个请求总是会被设备第一个被收到。为了实现重定向功能,首先要获得被访问文件对象的信息,包括对象的命名、路径、访问权限等。图3中,每个IRP都有与之关联的栈空间IRP stack location,栈空间里面有文件对象的指针(File Object)。通过该指针获得所需信息。文件的设备、盘符等信息在File Object->RealeatedObject中,而文件的相对路径储存在File Object->FileName中。合并它们得到文件的绝对路径,这个全名包括卷设备对象的名字(例如,DeviceHarddiskvolume0Program Files 1.exe)。通过和之前存储在哈希表中的路径比对,如果不同则忽略该请求,直接将请求下发到操作系统默认的文件系统驱动程序。如果相同则代表该文件需要被重定向,此时将File Object->FileName的内存释放掉,用重定向后的文件的完整路径替换掉原来的路径,填写到File Object->FileName中。接着调用IoCompleteRequest()结束IRP并返回Status_Reparse。最后将该请求传递到下层的磁盘卷设备中。
(2) 当收到IRP_MJ_SET_INFORMATION请求时,意味着文件/文件夹的信息被查询,如查询文件/目录的访问权限、路径。当查询路径信息时,如果该文件是被重定向过的,返回重定向后的虚拟路径并不符合我们的要求。此时则根据哈希表中信息,返回原路径。如果是没被重定向过的文件对象,则调用默认处理函数。
(3) 当收到IRP_MJ_READ和IRP_MJ_WRITE的请求时,因为无论是应用层还是内核层的读写文件请求,都会产生该IRP,所以根据该IRP类型能截获所有的读写请求。IMsystem中,通过从该IRP堆栈中取得文件对象,从文件对象中获得读写文件的偏移地址和内容。因为之前打开/创建文件时已经将文件对象的路径进行了修改,此时如果无其他要求可以直接调用默认的处理函数读取和写数据。
当文件驱动截获到访问带有删除令牌(Token)的文件的行为时,将分发函数里Irp->Iostatus.information中填充FILE_DOES_NOT_EXIST并返回status即可。
3.2.1注册表虚拟化流程
IMsystem加载位于应用程序层中的注册表文件时,会在客户端操作系统注册表的HKEY_USRSREDIKEYUSR目录下创建对应的虚拟注册表。比如应用进程要访问HKEY_LOCAL_MACHINESOFTWAREAPP1Version值时,会将所有的请求的路径参数重定向到HKEY_USRSREDIKEYUSRHKEY_LOCAL_MACHINESOFTWAREAPP1Version下,再执行相应操作。对于属于增加和修改过的集合的数据,将会在这个重定向目录下创建,且优先覆盖原注册表项。对于属于删除过的集合的注册表项则被打上标记,请求操作返回不存在。如图6所示,当一个注册表操作请求被IMsystem的过滤驱动捕获时,过滤系统查找索引,根据之前记录的映射规则,决定要不要进行重定向操作。如果不用,则调用系统默认的注册表API并等待下一个操作否则就注册表操作重定向到相应的虚拟注册表目录。根据注册表操作的类型,分别进行创建、删除、和修改操作。
图6 注册表虚拟化流程图
3.2.2注册表虚拟化实现
要想实现注册表的虚拟化,同样也需要对注册表进行监控和过滤。IMsystem使用Cmregsitercallback()这个注册表管理函数,进行注册表的监控管理,达到阻止或者修改一个注册表操作的目的。CMregistercallback()提供了一个函数指针,通过这个函数指针注册回调函数,在这个回调函数里面来实现代码,当相应的注册表事件被激活时,运行回调函数里面的逻辑。该函数的原型如下:
NTSTATUS CmRegisterCallback(
_In_ PEX_CALLBACK_FUNCTION Function,
_In_opt_ PVOID Context,
_Out_ PLARGE_INTEGERCookie
);
该函数三个参数分别为:回调函数的地址,为回调函数传入的消息(在我们的程序中设为NULL),以及回调的句柄。对应的回调函数的原型如下:
NTSTATUS RegisterCallback(
_In_ PVOID CallbackContext
_In_opt_ PVOID Argument1
//操作类型
_In_opt_ PVOID Argument2
//保存操作详细信息的结构体
);
该函数三个参数分别为:CMregistercallback()传入的消息,操作类型对应的功能码,和记录有关操作信息的结构体指针。
IMsystem中,监控一个注册表打开操作的步骤如下:
(1) 使用Cmregistercallback()注册好一个监控回调函数。
(2) 当有打开注册表项的操作发生时,回调函数被调用,此时Argument1的信息是RegNtPreOpenkey,即指打开操作前。Argument2是一个指向REG_OPEN_KEY_INFORMATION结构体的指针。
(3) 运行打开操作的重定向逻辑,详细操作在后面叙述。
(4) 当操作完成后,回调函数又会被调用一次,此时Argument1的信息是RegNtPostOpenKey,Argument2是个指向REG_POST_OPERATION_INFORMATION结构体的指针。释放对象句柄并结束打开操作。
以打开注册表为例说明重定向逻辑的实现。无论是用户模式使用regOpenkey函数,还是内核模式下使用ZWopenkey函数,都会触发监控的回调。REG_OPEN_KEY_INFORMATION结构体里面含有被操作注册表项的对象指针Object,用QueryNameString()等函数获得该注册表项的路径。将此路径修改为需要重定向后的路径,然接着将这修改后的对象OBJECT以参数形式,传入内核模式的ZWopenkey函数来打开注册表,并将修改后的信息重新填充到reg_pre_open_key_information结构体里,包括GrantedAccess和ResultObject等结构体成员。
对于重定向虚拟化注册表,最重要的就是对打开创建函数的重定向,其他注册表操作调用过程原理相同。
IMsystem运行的架构环境如图7所示。
图7 IMsystem环境架构图
整个系统由桌面分发系统、Hypervisor以及终端服务器组成。桌面分发系统将更新策略通过虚拟机管理器Hypervisor,发送到终端的服务器中。Hypervisor中设有安装软件的参照机器,而操作系统、应用程序层以及用户个性化层存储在终端服务器中,当需要更新时,应用程序层和用户个性化层由终端服务器分发,并由客户端机器挂载。
以安装WinRAR软件的过程为例。Winrar使用所需要的注册表文件以.reg文件形式存放在虚拟磁盘中,加载应用程序层后挂载在私有注册表HKEY_USRS用户名下,程序使用时产生的修改都会被重定向到该目录。测试结果如表1所示。
表1 注册表虚拟化测试结果
续表1
应用程序层被挂载后,以分区E的形式出现在文件系统中。当操作系统接受到用户对属于Winrar应用的文件执行的各种文件请求时,如打开、修改和删除C:WinRAR eadme.txt,这些操作所指定的文件将重定向到终端服务器的E分区下的cWinrar eadme.txt文件,并对该文件执行了相应操作。测试结果如表2所示。
表2 文件重定向功能测试结果
结合表1和表2可以说明,将WinRAR软件从操作系统中分离出来,形成新的抽象层,能有效地执行和更新。
以制作和更新Winrar软件的应用程序层为例。参照机器的操作系统为Win7 64位。管理员在参照机器上,安装好Winrar软件并记录安装过程,制作成应用程序层,记为Layer1。通过设置更新策略,将Layer1统一分发给用户。在本次使用中,所有用户共用同一个母镜像,其操作系统也为Win7 64位。挂载Layer1后,所有桌面虚拟化用户都能使用该软件。
管理员将更新好的最新版本Winrar,重新制作成应用程序层Layer2并分发给用户。用户在加载Layer2层以后,能够使用最新版本的Winrar,达到了用户子镜像统一更新的功能。
复合文件系统和复合注册表系统的引入,改变了操作系统的处理流程,加入了新的功能和逻辑,这会给操作系统带来一些影响。为了执行我们添加的代码,操作系统将会花费一些资源开销,主要体现在以下两个方面:
(1) 文件系统过滤驱动处理IRP请求的开销,复合文件系统需要截获所有I/O请求并进行判断,其中包括查找索引结构来获取信息,根据这些信息和I/O请求的种类进行重定向。这一定程度上减缓了操作系统处理请求的速度。
(2) 写时复制机制引起的资源消耗,用户第一次修改应用程序层文件时,会有自动产生副本文件并进行映射的过程。
通过比较正常系统和部署了IMsystem的操作系统两者,运行常用操作例程所消耗的时钟周期,来评估IMsystem对系统资源的开销。在每个重定向函数的入口处和出口处调用rtdsc指令能够获得CPU的时间戳,出口处的时间减去入口处的时间即为该函数例程处理请求消耗的时钟周期。
考虑到需要评价多个类型的系统调用,包括文件打开、文件创建、文件目录查询、文件信息查询等,单一的测试脚本无法满足要求。所以模拟真实情况,用爬虫工具随机访问网络资源,来随机地产生系统调用。首先在正常Win7 64位操作系统下运行爬虫工具,运行一段时间后记录每个系统例程Pi被调用的次数Si和它们的时间周期Ti。接着在部署了IMsystem平台的Win7 64位系统上运行爬虫工具,让每个调用Pi运行和Si相同的次数,记录它们的时间周期Ti。
表3列出了文件系统常用的系统调用例程,和它们在两种情境下的时钟周期,并计算出引入复合文件系统后的资源负载。在所有的操作请求中文件请求最频繁,所有用文件调用例程来作为评估的对象。从表中可知,部署IMsystem平台后系统调用资源开销普遍增高。增加最高的57%的系统调用是NtQueryAttributeFile,该例程用于获得文件属性信息。该项较高是因为Windows系统中文件的相互关联性的原因。尽管如此,这些资源负载率都在可接受的范围内。
本文设计并实现了基于应用程序分层模型的镜像管理机制,将应用程序和用户数据与操作系统分离。用户在使用过程中动态加载应用程序层,通过文件系统驱动和注册表虚拟化技术实现请求与数据的重定向访问和程序的执行。设计并实现了优先级机制解决了层与层之间的冲突问题。实验表明,管理员能通过IMSYSTEM平台,快速高效地将软件更新分发给特定群组的用户。
下一步的工作计划是研究应用程序分层模型对应用进程间的通信的影响,与安装在本地的应用软件对比测试,以及和软件虚拟化技术等进行对比测试。
[1] 张建中,陈松乔,方正,等.一种基于SAN架构的存储网络系统的设计与实现[J].中南大学学报(自然科学版),2008(2):350-355.
[2] 阳小珊,邱全伟,郑良,等.NAS存储系统性能测评方法研究[J].计算机研究与发展,2012,49(s1):346-351.
[3] 陈建.基于Xen的domain0内核的研究[D].浙江大学,2008.
[4] Pasupathy S,Prabhakaran V,Goodson G R,et al.System and method for quickly determining changed metadata using persistent consistency point image differencing: U.S.Patent 7,693,864[P].2010-4-6.
[5] Ben-Shaul I Z,Zamir T,Vasetsky L,et al.Fast provisioning of a centralized virtual desktop using linked clones with overlaid centralized virtual desktop layers:U.S.Patent 9,417,889[P].2016-8-16.
[6] MegaRAID L S I N.Deploy 200 Citrix XenDesktop 7.1 Hosted Virtual Desktops on Cisco UCS C240 M3 Rack Server with LSI Nytro MegaRAID and SAS Drives[Z].2014.
[7] Pasupathy S,Prabhakaran V,Goodson G R,et al.System and method for quickly determining changed metadata using persistent consistency point image differencing:U.S.Patent 7,693,864[P].2010-4-6.
[8] Fries R,Sanghvi A.Virtual machine image composition and signing:U.S.Patent Application 13/163,612[P].2012-12-20.
[9] Powers J,Joyce R A.Lightweight application virtualization architecture:U.S.Patent 9,501,304[P].2016-11-22.
[10] Rafael Weingartner,Garbriel Beims Brascher,Carlos Becker Westphall.Cloud resource management:A survey on forecasting and profiling models[J].Journal of Network and Computer Applications,2015,47(2):99-106.
[11] Meyer D T,Aggarwal G,Cully B,et al.Parallax:virtual disks for virtual machines[J].Acm Sigops Operating Systems Review,2008,42(4):41-54.
[12] 姜跃.面向桌面虚拟化的分布式镜像存储研究[D].华中科技大学,2012.
[13] 徐继伟,张文博,魏峻,等.一种基于聚类分组的虚拟机镜像去冗余方法[J].软件学报,2016,27(2):466-480.
[14] Xun Zhao,Yang Zhang,Yongwei Wu.Liquid:A Scalable Deduplication File System for Virtual Machine Images[J].IEEE Transactions on Parallel and Distributed Systems,2014,25(5):1257-1266.
[15] Baimetov I,Dobrovolskiy N N,Tormasov A G,et al.Method to share identical files in a common area for virtual machines having the same operating system version and using a copy on write to place a copy of the shared identical file in a private area of the corresponding virtual machine when a virtual machine attempts to modify the shared identical file:U.S.Patent 8,656,386[P].2014-2-18.
[16] Zhang W,Tang H,Jiang H,et al.Multi-level Selective Deduplication for VM Snapshots in Cloud Storage[C]//IEEE Fifth International Conference on Cloud Computing.IEEE Computer Society,2012:550-557.
[17] 顾欣.文件透明加密保护系统的设计与实现[D].西安电子科技大学,2012.