前言
虚拟化是云计算的重要技术之一,虚拟化技术能够将一台服务器或者普通PC虚拟出多个虚拟机,每个虚拟机都可以以计算资源的形式出售给租户,既实现了资源的高效利用,也提供了计算、存储、网络等资源按需分配的功能。随着云计算技术不断取得进展,虚拟化技术也在最近十多年得到了飞速的发展。
QEMU和KVM作为虚拟化技术的典型代表,被广泛地应用在各家厂商的云计算系统中。学习和了解QEMU与KVM能够帮助读者更好地理解云计算,做到知其然也知其所以然。
从微观层面来讲,虚拟化技术能够实现整台计算机的模拟,所以虚拟化技术包含了计算机体系结构的方方面面。虚拟化技术的实现涉及CPU的运行机制、操作系统启动过程与固件的交互、各类硬件设备的接口、操作系统中的设备驱动与设备之间的通信等。学习虚拟化能够加深读者对整个计算机体系结构和操作系统的理解,增强“内功”。
QEMU和KVM作为开源的虚拟化技术,给我们提供了绝佳的了解和学习虚拟化的机会。笔者在2013年左右接触到虚拟化技术,随即被QEMU和KVM吸引,并且持续地学习其背后的设计思想与源码实现。在此之前,笔者所从事的行业为软件安全,虽然对软件的运行机制有比较透彻的理解,但是对于系统加电到程序运行中间的过程认知还仅限于书本。在充分学习了虚拟化技术之后,笔者总算能够站在一个比较高的角度来审视计算机系统并对种种假设进行验证。虚拟机作为物理机的映射,很大程度上还原了物理计算机系统中那些难为人知的奥秘。技术的发展日新月异,对于事物本质的理解会让我们更加自信。
本书以QEMU和KVM为主角对虚拟化技术涉及的相关源码进行了详细分析。第1章对QEMU和KVM的基本情况进行了介绍,第2章对QEMU的基本组件进行了分析,随后的几章对计算机系统各个组件的模拟进行了分析,比如固件、CPU、内存以及外设等,这些内容都是组成虚拟化的基本要素。“纸上得来终觉浅,绝知此事要躬行”,本书只是提供了QEMU和KVM基本原理的分析,读者还需要自己深入了解源码并多动手分析调试才能加深理解。更进一步,读者可以通过QEMU和KVM的邮件列表以及各类技术会议参与虚拟化社区的讨论学习。
笔者在本书中使用了大量的图片来帮助读者理解QEMU和KVM中各种纷繁复杂的流程与数据结构关系。对于Linux和计算系统中的部分通用术语,笔者认为使用英文比中文更好,因此没有翻译。
本书最早的写作始于2018年8月份左右,在此之前,笔者出于知识积累的需要已经写了一部分QEMU和KVM相关源码分析的文章。联想到自己初入虚拟化领域的茫然,笔者认为写一本QEMU和KVM源码分析的书不仅能够帮助刚进入这个行业的读者,也是对自己多年学习过程的积淀与总结。
本书使用的源码为QEMU-2.8.1、Linux kernel-4.4.161,SeaBIOS的版本更新非常缓慢,笔者用了一个当时还在开发中的版本,读者可以使用rel-1.11.2以及之后的版本。
本书能够顺利完成,离不开很多人的支持与帮助。首先要感谢我的妻子,写书的过程漫长而辛苦,感谢她给我莫大的鼓励以及对家庭的付出,让我能够坚持完成本书的编写。其次感谢各位朋友对我的帮助,感谢前公司给我提供的虚拟化安全研究工作,让我能够有机会全身心地潜入到QEMU和KVM相关的学习研究中,感谢现公司的领导对我写书的各种支持。感谢机械工业出版的车忱编辑在选题论证以及文字编辑方面的诸多辛苦付出。