前言
PREFACE
虚拟化技术是一门“古老”的新技术。早在1959年,牛津大学Christopher Strachey就提出了具有虚拟化概念的高效分时复用方案,意在解决当时大型机器使用效率低下的问题。到20世纪60至70年代,虚拟化研究进入了第一个高速发展时期,出现了以IBM CP-67/CMS为代表的大型机虚拟化技术,并提出了硬件架构可虚拟化的理论和准则(如敏感指令应属于特权指令)。但到了20世纪80年代,随着操作系统的成熟,资源管理不再以虚拟化为中心,MIPS和x86等CPU厂商出于成本和商业考虑,设计的硬件架构不再满足可虚拟化准则,形成了所谓的“虚拟化漏洞”(例如,x86有5类共17条敏感指令,但不属于特权指令)。随着个人计算机的普及,研究者提出了一系列弥补x86架构“虚拟化漏洞”的方法,代表性的技术有斯坦福大学Mendel Rosenblum等在SOSP 1997国际学术会议发表的DISCO系统,虚拟化技术重新兴起。随后,InteI和AMD等硬件厂商提出了硬件辅助虚拟化,使得x86硬件平台满足可虚拟化准则。从2006年亚马逊以虚拟机形式向企业提供IaaS(Infrastructure as a Service,基础设施即服务)平台开始,虚拟化技术成为当前支撑云计算、大数据、移动互联网和工业互联网等新型计算和应用模型的关键“根技术”。
回顾虚拟化的发展历史,可得出一些重要启示。一是基础研究对于计算机系统非常重要,不少关键技术的突破首先来自学术界和工业界的前沿研究;二是最新的技术未必用于产品,成本和市场也是重要考量(ARM和RISC-V初期也不是可虚拟化硬件架构,如ARMv6有4大类24条敏感非特权指令)。因此,深入理解虚拟化技术,把握其内在的发展规律,对于虚拟化的创新发展有重要作用。
系统虚拟化作为物理硬件层的虚拟化,在计算机硬件和操作系统之间引入一个系统软件抽象层,向下管理硬件资源,向上对操作系统提供虚拟机接口,其目标可概括为“功能不缺失、性能不损失”。因此,系统虚拟化涉及操作系统和硬件接口,技术体系比较复杂,对初学者来说是一个很大的挑战。读者如果不了解虚拟化技术的基本原理而去直接翻阅源代码,例如开源的QEMU/KVM,很容易抓不住主线,迷失在庞大的代码中(QEMU源代码已超过150万行)。然而要把源代码涉及的方方面面都讲清楚需要极大的篇幅。因此,本书借鉴学习操作系统(Linux内核源代码已超过2700万行)的方法,借助实验把重要概念涉及的主干技术路径叙述清楚,读者可以通过调试和打印直观理解虚拟化场景的“现场”,使静态的代码变得鲜活生动。其次,类似于代码量约1万行的Linux 0.11,“麻雀虽小、五脏俱全”,本书第6章从零开始构建一个用户态轻量级虚拟化平台,逐步展现虚拟机的构建过程,掌握系统虚拟化技术的关键“基因图谱”。
基于在虚拟化领域的长期研究和实践积累,以及和华为虚拟化团队在openEuler开源操作系统上的合作研究,本书试图从庞大的虚拟化技术中厘清关键路径,并配以相关实验,帮助读者了解系统虚拟化技术的来龙去脉,理解基本原理,掌握核心方法,为进一步的研究打下基础。
本书定位为计算机系统虚拟化领域的专业图书,面向工程科技类普通读者。读者除了需要具备基本的硬件体系结构和操作系统知识外,无须其他先修课程。此外,本书受众还包括有志于计算机系统软件领域深耕的研发人员以及对虚拟化感兴趣的技术爱好者。
全书分6章,内容涵盖系统虚拟化的基本概念和实现方法,将系统虚拟化技术分为目前主流的“一虚多”(把单物理机器抽象成若干虚拟机器)和新型的“多虚一”(把多物理机抽象成单一虚拟机)。对于传统“一虚多”技术,本书基于开源QEMU/KVM和x86平台深入介绍了CPU、内存和I/O虚拟化的基本原理,并配备了相关实验。针对新型“多虚一”技术,本书介绍了开源项目GiantVM的CPU、内存和I/O“多虚一”的基本实现方法。此外,针对ARM虚拟化,本书专门介绍基于ARMv8的鲲鹏虚拟化架构。最后,本书基于内存安全的Rust语言从零开始打造一个具备基本功能的轻量级虚拟化平台StratoVirt,逐步提供CPU、内存和I/O的虚拟化能力。从开始运行一段汇编代码到最终能够运行Linux客户机操作系统,读者可以完整经历虚拟化从设计到实现的全部流程。同时,读者可以参考华为产品级StratoVirt的源代码,领略基于Rust语言实现的前沿轻量级虚拟化技术。
感谢实验室同学和华为公司对本书撰写工作做出的重要贡献,其中第1章主要由戚正伟撰写,第2章主要由余博识撰写,第3章主要由贾兴国撰写,第4章主要由张正君撰写,第5章主要由余博识、贾兴国、张正君和杨铭合作撰写,第6章由徐飞、张亮、杨晓鹤、高炜、杨铭、吴斌、王志钢撰写,全书由戚正伟、管海兵修改和审阅。写作过程中参考了实验室GiantVM项目的代码和文档(主要来自陈育彬、丁卓成、张晋)。项羽心、张晋、邓天迈等同学仔细阅读了本书,并提供了宝贵的修改意见。特别感谢贾兴国等对本书插图的精心绘制,使得比较复杂的概念更为直观清晰。虚拟化团队技术专家胡欣蔚、范良、章晓峰、吴斌、王志钢在本书写作过程中提供了大量的资源和支持。本书最后一章的动手实践思路主要来自王志钢。感谢清华大学出版社盛东亮老师和钟志芳老师等的大力支持,经过多轮修改,使本书质量大为提高。
由于虚拟化技术发展很快,已经深入计算机系统的方方面面,加之作者水平有限,书中难免有疏漏和不足之处,恳请读者批评指正!
作 者
2021年5月