深度探索Linux系统虚拟化:原理与实现
上QQ阅读APP看书,第一时间看更新

前言

为何写作本书

大约在2014年底,我参与了一个项目,使用Android模拟器在x86架构的机器上运行各种Android游戏。当时项目遇到的核心问题是游戏运行卡顿严重,印象中普通的小游戏每秒大约只能渲染十几帧,大型游戏则完全无法成功加载。运行模拟器的机器都有顶配的显卡,因此硬件性能并不存在问题。那么问题就出在软件架构上了。当时采用的软件架构是:使用虚拟机运行Android程序,Android中有一个模块会将数据通过网络传送给另外一个本地应用进行渲染。对于游戏这种数据量很大的应用,采用网络包传输显然不是一个最优的方案。除了网络包在协议栈中的各种复杂处理外,大量的网络包传输会导致虚拟机和主机之间的频繁切换,这将耗费大量的计算资源。基于此,我们设计的新方案是在VMM层实现一个虚拟设备,在Guest内部通过这个虚拟设备向渲染程序发送数据。虚拟设备通过IPC方式与负责渲染的程序进行通信。方案实现后,原来无法加载的大型游戏每秒都可以达到Android的渲染上限60帧。

2015年我参与了另外一个项目,将虚拟机的块设备数据存储到块存储集群。原有的方案是在宿主机上采用SCSI创建一个块设备,然后将这个块设备传给Qemu,SCSI设备再通过iSCSI协议将块数据传递给远端块存储集群。这个方案有很多弊端,块数据经历了两次I/O栈,一次是Guest内核中的,另外一次是Host内核中的,因此效率很低。另外,这个方案还有个致命的问题:那时偶尔会遇到内核中iSCSI协议的Bug,此时除了重启宿主机外别无他法,而且那时热迁移还不是很成熟,可以想象一下重启宿主机的后果。为了解决这些问题,我们设计了另外一种方案,在Qemu中实现一个虚拟块设备,绕过内核的I/O栈,在该虚拟块设备中直接将块数据通过TCP/IP发给块存储集群,从而不再依赖iSCSI协议。方案实现后,IOPS获得了极大的提升,系统的稳定性也增强了。

经历了很多类似上述的情况,因此我打算写一本Linux系统虚拟化方面的书,希望能让读者更深刻地认识和理解系统虚拟化,于是我和本书的第二作者谢广军博士相约,一起撰写本书。从2015年开始,历时近6年,中间历经多次易稿,从最开始过多地聚焦于烦琐的技术细节,到尝试从系统结构、操作系统和硬件等多角度去解释原委。书中全部采用可以说明问题的早期代码版本,而不是采用因各种特性迭代而变得纷繁复杂的最新代码。

在这5年多的时间里,每每不想坚持时,就会想起自己年轻气盛时经常质疑前辈们为我们留下了什么,而如今我扪心自问,从事了这么多年计算机工作,我又为这个行业做了什么?最后,希望本书能让大家有所收获。

读者对象

虚拟化是云计算的基础,此书写给云计算相关从业人员,也写给希望学习云计算相关技术的院校学生,以及Linux系统虚拟化的爱好者。

如何阅读本书

本书探讨了软件如何虚拟计算机系统,包括CPU、内存、中断和外设等。此外,在云计算中,网络虚拟化也至关重要,因此,本书最后一章探讨了网络虚拟化。

第1章讨论CPU虚拟化。这一章介绍了x86架构下的VMX扩展,讨论了在VMX下虚拟CPU的完整生命周期。以Guest通过内存映射(MMIO)方式访问外设为例,展示了KVM如何完整地模拟一个CPU指令。然后,我们探讨了KVM是如何模拟多处理器系统的。最后,通过一个具体的KVM用户空间部分的实例,带领读者直观地体会CPU虚拟化的概念。

第2章讨论内存虚拟化。这一章首先简略地介绍了内存寻址的基本原理,然后分别探讨了实模式Guest以及保护模式Guest的内存寻址,包括大家比较熟悉的影子页表等。最后,我们讨论了在硬件虚拟化支持下,即EPT模式下从Guest的虚拟地址到Host的物理地址的翻译过程。

第3章讨论中断虚拟化。这一章我们从最初IBM PC为单核系统设计的PIC(8259A)开始,讨论到为多核系统设计的APIC,再到绕开I/O APIC、从设备直接向LAPIC发送基于消息的MSI。最后,我们讨论了Intel为了提高效率是如何从硬件层面对虚拟化中断进行支持的,以及KVM是如何使用它们的。

第4章和第5章讨论外设虚拟化。我们从完全虚拟化开始,讨论到半虚拟化,最后讨论到Intel的VT-d支持下的硬件辅助虚拟化。其间,我们通过实现一个模拟串口,带领读者直观地体会设备虚拟化的基本原理,然后带领读者深入了解Virito标准。最后,我们还探讨了支持SR-IOV的DMA重映射和中断重映射。

第6章以一个典型的Overlay网络为例,从虚拟机访问外部主机、外部主机访问虚拟机两个方面,分别探讨了计算节点、网络节点上的网络虚拟化技术。

勘误和支持

由于作者水平和编写时间有限,书中难免出现一些错误或者不准确的地方,恳请读者批评指正。来信请发送至邮箱baisheng_wang@163.com或yfc@hzbook.com,我们会尽自己最大努力给予回复。

致谢

特别感谢机械工业出版社华章公司的杨福川编辑,在这5年多的时间里,他不断地鼓励我,耐心地支持我写作。在我每每要放弃时,都是他的鼓励让我坚持了下来。同他的一次对话令我印象深刻,我问他如何看待“偏底层的题材比较小众”这一问题,他坚毅地回答:只要是有价值的知识,总得有人来做,这是他的使命。

同时也要感谢机械工业出版社华章公司的栾传龙编辑,他为本书花费了大量的个人时间,并在本书编辑阶段提出了宝贵的修改意见,感谢他专业且细致的工作。

最后,感谢我的妻子,她担起全部家务琐事和教育孩子的重任,让我把全部精力都放在追求理想上。

王柏生

2020年8月