(250106)
参考资料
KVM 虚拟化技术 | cnblogs | 惨绿少年@clsn.io
虚拟化介绍 | cnblogs | 休耕
云计算与虚拟化技术发展编年史 | cnblogs | 云物互联
nova系列二:kvm介绍 | cnblogs | linhaifeng
虚拟化与容器 | cnblogs | marility
《LPIC-3-Virtualization-and-Containerization-Study-Guide-Certification-Companion-for-the-LPIC-3-305-Exam-(Certification-Study...-(Antonio-Vazquez)》(只翻译理论内容,实操部分因于各种问题无法复刻。)
虚拟化概念
- 虚拟化的术语
- 虚拟化的优缺点
- 各种虚拟机监控程序(hypervisor)和虚拟机监视器的变体
- 物理机到虚拟机的迁移
- 虚拟机在主机系统间的迁移 还会介绍这些术语和工具:hypervisor、硬件虚拟机(HVM)、半虚拟化(PV)、模拟与仿真、CPU标志、/proc/cpuinfo、以及迁移。
引言
说到虚拟化,大家通常想到的是运行一个虚拟的(而非实际的)机器。但虚拟化这个概念,不仅适用于机器,还能用在存储设备、网络等等上。用“虚拟化”这个广义的术语,我们可以通过软件模拟、硬件虚拟化、容器等多种方式来实现“虚拟化”。在书里,我们会学习主要概念,并通过实例来加深理解。
仿真化(emulation)
图1-1. DOSBox
我们可以用软件来模拟另一个系统,从而创建一个“虚拟”机器。比如,用来模拟基于Z80的经典个人电脑,像Spectrum、Amstrad、Commodore等。MAME(多街机模拟器)是个著名的例子,用来模拟经典街机。DOSBox(图1-1)是另一个模拟器例子,常用于玩老式的DOS游戏和其他程序。最后,我们还会提到QEMU(快速模拟器),这将在第2章详细讨论。
所有这些程序都使用软件来模拟原始机器中每个硬件组件的行为。让我们更详细地看看什么是模拟。
我们可以将模拟器定义为一种硬件或软件,它使一个计算机系统表现得像另一个系统。很多时候,模拟器只是模拟硬件架构;如果需要特定的固件或操作系统,也需要提供或模拟。你可能熟悉一些需要用户提供ROM文件才能工作的计算机模拟器。根据用途不同,有几种类型的模拟器。我们将列举其中一些。
游戏机模拟器
这是我们之前提到的第一种模拟器。针对不同平台有许多模拟器,例如Fuse用于Spectrum,Caprice用于Amstrad,Retro Virtual Machine用于Spectrum和Amstrad(图1-2),PPSSPP用于PlayStation Portable,PCSXR用于PlayStation 1等等。
图1-2. Retro Virtual Machine
终端模拟器
在过去,通常有一台大型主机和几个“哑”终端。这些终端只有键盘和显示器,连接到主机,主机负责执行实际的计算。如今,现代计算机使用终端模拟器远程连接到其他系统。你可能熟悉像PuTTY(图1-3)这样的程序,它是一个多平台终端模拟器。
图1-3. PuTTY
打印机模拟器
当应用程序想要打印文档时,应用程序需要使用页面描述语言(PDL)将适当的信息发送到打印机。两种最常用的PDL是Postscript和PCL。打印机命令语言(PCL)由惠普开发。许多不同制造商的打印机使用模拟来支持PCL语言。
网络模拟器
网络模拟器旨在测试应用程序在真实网络中的性能。它们允许测试路由器和交换机的配置。一些最著名的是GNS3(图1-4)和Cisco Packet Tracer。
图1-4. GNS3
系统模拟器
还有一些程序模拟完整系统,如QEMU,我们将在下一章详细讨论,以及PearPC。PearPC在x86主机上模拟PowerPC系统。
模拟化(simulation)
与模拟非常相似的概念是仿真;尽管在某些情况下这两个术语可以互换使用,但它们之间还是有一些区别。在仿真器中,主要目标是使仿真器的行为尽可能接近原始系统。
例如,模拟器可以模仿另一个系统的工作方式,但在较高层次上,不会深入到低层次的细节。另一方面,仿真器应尝试在所有层次上模仿原始系统的工作方式。
还有另一个区别,模拟器的主要目标是提供与原始系统相同的功能,但不一定以与原始系统相同的方式工作。也就是说,模拟器通常可以执行为原始系统设计的任何程序。然而,正如我们之前提到的,仿真器更感兴趣的是模仿原始系统的工作方式,而不是提供功能。因此,为原始系统设计的程序在仿真器中通常表现较差,甚至根本无法工作。
虚拟化(Virtualization)
正如我们之前所说,最初“虚拟”机器仅通过软件实现,但很快英特尔和AMD分别在他们的处理器中加入了称为Intel VT-x和AMD-V的新扩展。这种硬件辅助虚拟化提供了比纯软件解决方案更好的性能。在Linux系统中,我们可以检查/proc/cpuinfo文件以查看处理器的特性:速度、型号、CPU标志等。如果处理器支持硬件辅助虚拟化,相应的标志将会出现。
如果我们有一个英特尔CPU,我们会寻找vmx标志。
grep vmx /proc/cpuinfo
flags : ... vmx ...
如果我们有一个AMD CPU,我们应该寻找svm标志。
grep svm /proc/cpuinfo
flags : ... svm ...
我们可以使用lscpu命令获得大致相同的信息。
lscpu
当一个系统的CPU启用了这些标志时,它可以轻松地执行虚拟机。托管虚拟机的软件称为hypervisor(“超级监督者”)。有时,使用术语“虚拟机监视器”而不是hypervisor。在这种情况下,我们可以恰当地谈论“虚拟化”。
hypervisor管理虚拟机,分配它们正常运行所需的资源。有两种不同类型的hypervisor:
- 类型I hypervisor,也称为“裸机”hypervisor:在这种情况下,hypervisor直接运行在系统硬件上。这种类型的hypervisor的例子有VMware ESXi、Microsoft Hyper-V或Xen。
- 类型II hypervisor:这些hypervisor作为操作系统上的应用程序运行。一些例子包括VMware Workstation、Oracle VirtualBox(图1-5)或Microsoft Virtual PC。
图1-5. Oracle VirtualBox
虚拟化类型
我们之前已经看到,我们可以广义地谈论“虚拟化”,这包括软件模拟和仿真。但只有当存在硬件虚拟化时,我们才能恰当地谈论“虚拟化”。
从这个起点出发,我们可以根据使用的标准区分许多类型的虚拟化。最初我们可以列举这两种虚拟化类型:
- 完全虚拟化:hypervisor几乎重新创建了原始系统的每个组件,使得客户操作系统无需修改即可运行。
- 半虚拟化:通过特殊接口提供对硬件资源的访问。这更高效,因为hypervisor不需要执行完全虚拟化中所需的许多高成本操作。然而,客户操作系统需要修改,以便它可以在半虚拟化环境中执行。
还有其他结合了完全虚拟化和半虚拟化特性的解决方案,如PVHVM或PVH。由于这是入门内容,我们不会深入细节,但我们将在第3章中看到这些其他虚拟化类型。
当使用半虚拟化时,我们将谈论半虚拟化虚拟机。当使用完全虚拟化时,我们将谈论硬件虚拟机,或HVM。
我们还应该在这里提到另一个概念,操作系统级虚拟化。在这种情况下,内核允许多个用户空间实例完全隔离地存在。这些实例在Linux环境中通常称为容器,尽管在其他操作系统中使用不同的术语来表示相同的概念,如FreeBSD中的jails或Solaris中的zones。
虚拟化的优缺点
使用虚拟化有许多优点。我们可以列举以下内容:
- 成本效益:硬件使用效率更高;我们不再需要为每个逻辑服务器配备专用的物理服务器。
- 管理更简单:通过使用虚拟化,我们可以使用快照在需要时回滚更改;我们还可以通过使用编排自动化许多任务。
- 能源使用效率高:通过使用更少的硬件,需要更少的能源,从而降低成本。
不幸的是,在考虑虚拟化时,我们还需要了解一些缺点:
- 并非所有软件和/或硬件都可以轻松虚拟化。
- 硬件访问是间接的,因此效率较低。
物理机到虚拟机的迁移
通过虚拟化现有的物理机,我们可以从虚拟化的优势中受益。简化备份和恢复操作。这个过程通常被称为物理到虚拟迁移,简称P2V。我们可以使用不同的工具进行P2V。我们将列举其中一些。
VMware Converter
目前用于执行P2V迁移的最常用工具之一是VMware独立转换器。这是一个非常易于使用的商业工具。
virt-p2v
virt-p2v将物理机转换为由KVM管理的虚拟机。在本书的后面,我们将更详细地研究KVM和这个工具,并看到一个例子。
openQRM
openQRM是一个用于异构数据中心基础设施的管理平台,具有许多有趣的功能,其中包括P2V和V2V转换。
Clonezilla
另一种可能性,虽然不像我们之前看到的那么容易,是克隆我们计划虚拟化的服务器的磁盘。我们可以使用的一个非常好的工具是Clonezilla(图1-6)。之后,我们应该将磁盘映像文件转换为我们的hypervisor识别的格式。我们可以在他们的官方网站上看到一个完整的例子。
图1-6. 启动Clonezilla Live
在系统之间迁移虚拟机
除了将物理机转换为虚拟机外,有时我们可能需要将虚拟机从某个hypervisor迁移到另一个;这简称为V2V。我们将在接下来的章节中看到几个实际例子。
容器虚拟化概念
在本章中,我们将涵盖以下概念:
- 理解系统和应用程序容器的概念
- 理解并分析内核命名空间(kernel namespaces)
- 理解并分析控制组(control groups,cgroups)
- 理解并分析能力(capabilities)
- 理解seccomp、SELinux和AppArmor在容器虚拟化中的作用
我们还将介绍以下术语和工具:nsenter、unshare、ip、capsh、/sys/fs/cgroups、/proc/[0-9]+/ns和/proc/[0-9]+/status。
系统容器与应用程序容器
容器本质上是一系列被隔离的系统进程。它依赖于主机操作系统的一系列特性来提供这种隔离,主要是命名空间(namespaces)和控制组(cgroups)。在某些文档中,容器化也被称为操作系统级虚拟化。
- 系统容器:运行完整操作系统的容器。
- 应用程序容器:一个最小化的独立包,包含运行特定应用程序所需的一切,仅此而已。
内核命名空间(Kernel Namespaces)
Linux命名空间是Linux内核的一项功能,用于分区内核资源。通过命名空间,一个进程或一组进程只能看到特定的资源,而另一个进程或组进程看到的是不同的资源。根据隔离的资源类型,命名空间有多种类型,并且随着内核的发展,可能会添加更多类型。常见的命名空间包括:
- 挂载命名空间(Mount)
- 进程ID命名空间(Process ID,pid)
- 网络命名空间(Network,net)
- 进程间通信命名空间(Inter-process communication,ipc)
- UTS命名空间(Unix time sharing)
- 用户ID命名空间(User ID,user)
- cgroup命名空间(cgroup namespace)
- 时间命名空间(Time namespace)
查看系统中的命名空间
要列出当前系统中正在使用的命名空间,可以使用lsns
命令。
虚拟化与容器详细内容
KVM 虚拟化技术 | cnblogs | 惨绿少年@clsn.io
nova系列二:kvm介绍 | cnblogs | linhaifeng
虚拟化与容器 | cnblogs | marility