论文部分内容阅读
随着IT架构不断被部署到关系国计民生的支撑行业中,提供24×7的高可用性变得越发重要,对于运行着关键服务的系统任何形式的打断都将造成巨大损失。操作系统作为整个软件体系架构中的基础层与关键层,其可用性将直接影响到上层所有软件的可用性,因而如何提高操作系统的可用性成为提高软件可用性的关键问题之一。另一方面由于操作系统本身的庞大和复杂,现有的实现远远不够完善。为了修复安全隐患、纠正系统错误、提高软件性能和增加新的功能,操作系统在其生命周期中需要不断的被更新和维护。但现有基于“更新一重启”的静态更新方法需要重启操作系统,导致整个可用性的丧失。HP实验室在2001年的研究报告中同样指出人为的系统维护是造成系统停机的最大原因。因此有效地降低系统维护引起的可用性丧失是提高操作系统可用性最直接有效的方法。
动态更新技术(Dynamic update,or Live update)能够在保持系统持续正常运行的情况下完成更新维护操作,是解决上述问题的最佳方法。但是在操作系统上实现动态更新技术面临多方面的困难。本文的主要工作是总结和分析了这些困难,并提出了一种利用系统虚拟化技术在当前通用操作系统上实现动态更新功能的有效方法。
由于当前通用操作系统在设计上并没有考虑到对动态更新的支持,以及本身极高的复杂性,导致实现动念更新功能存在诸多困难。首先,当前通用操作系统几乎都是使用面向过程语言开发的,很难找到合适的粒度来进行动念更新,同时也不存在一种简单直接的方法能将对旧版本数据和函数的访问重定向到新版本数据和函数上。
其次,当前通用操作系统采用多线程并发执行,随意的更新可能导致系统中同时出现使用不同版本数据和函数的线程,造成系统状态不一致。而现有基于安全点(Safe Point)的解决方案又不适合像操作系统这样复杂的大型软件。
最后,直接运行在物理硬件上的操作系统位于整个软件架构的底层,只能由自己来完成对自身的动态更新。这种既是更新对象又是更新主体的情况很可能导致更新操作无法完成,甚至造成系统死锁或者崩溃。为了克服这些困难,我们提出了一种利用系统虚拟化技术在现有通用操作系统上实现动态更新功能的方法。该方法依靠位于操作系统和物理硬件之问,完全控制着整个系统的虚拟机监控器实现动态更新操作。首先在函数粒度上由虚拟机监控器通过二进制代码重写(binary rewriting)实现访问重定向,其次彻底摒弃对安全点的依赖,支持在任意时刻对操作系统进行动态更新,使用虚拟机监控器保持多线程问不同版本数据的同步,维持系统状态的一致性。最后使用位于更底层的虚拟机监控器来完成对操作系统的动态更新,避免可能的死锁和系统崩溃。为了进一步完善动态更新系统,实现对虚拟机监控器的动态更新,我们在Lucos系统的基础上引入白虚拟化技术。自虚拟化技术实现了对虚拟机监控器的按需动态插入和移除,使得操作系统能够在物理硬件和虚拟机监控器两种执行环境间自由切换执行。直接运行在物理硬件上的操作系统能够完成对此时处于不工作状态下的虚拟机监控器的动态更新,而处于工作状态下的虚拟机监控器能够实现对上层操作系统的动态更新。
为了验证上述方案的可行性,我们以开源虚拟机监控器Xen以及Linux操作系统为基础实现了名为Lucos(Live Update of Contemporary Operating System)的动态更新系统,和名为Mercury的自虚拟化系统。实验结果表明,Lucos动态更新系统能够正确迅速的使用来自官方发布的补丁文件实现对Linux操作系统的动态更新,并且在性能方面,相对于运行在Xen上的Linux操作系统仅仅存在不到1%的性能损失。而Mercury系统成功的实现了Linux操作系统在两种执行环境上自由切换,并且运行在物理硬件上的Linux操作系统能够实现对虚拟机监控器Xen的动态更新。在性能方面两种执行环境下的Mercury系统相对于各自环境中的普通Linux操作系统存在的性能差距都不到2%。