1.2.2 虚拟化与虚拟机
虚拟化是一种简化管理和优化资源的解决方案,可以在虚拟环境中实现真实环境中的全部或部分功能。虚拟化是指软件在虚拟的而不是真实的平台上运行,用“虚”的软件来替代或模拟“实”的服务器、CPU、网络设备等硬件产品。虚拟化将物理资源转变为可管理的逻辑资源,以消除物理结构之间的隔阂,将物理资源融为一个整体。虚拟化的所有资源都透明地运行在各种各样的物理平台上,操作系统、应用程序和网络中的其他计算机无法分辨虚拟机与物理计算机。
虚拟化使用软件来模拟硬件并创建虚拟计算机系统。虚拟计算机系统被称为虚拟机(Virtual Machine,VM),它是一种严密隔离的软件容器,内含操作系统和应用。每个功能完备的虚拟机都是完全独立的,通过将多台虚拟机放置在一台计算机上,可在一台物理服务器或主机上运行多个操作系统和应用,从而扩大规模并提高效益。虚拟机是指通过软件模拟的具有完整硬件系统的计算机,从理论上讲完全等同于实体的物理计算机。服务器的虚拟化是指将服务器物理资源抽象成逻辑资源,使一台服务器变成若干台相互隔离的虚拟服务器。
1. 虚拟化体系结构
虚拟化主要通过软件实现,常见的虚拟化体系结构如图1.3所示,这表示一个直接在物理机上运行虚拟机管理程序的虚拟化系统。在x86平台虚拟化技术中,虚拟机管理程序通常被称为虚拟机监控器(Virtual Machine Monitor,VMM),又称为Hypervisor。它运行在物理机和虚拟机之间的软件层上,物理机被称为主机,虚拟机被称为客户机。
图1.3 常见的虚拟化体系结构
(1)主机
主机一般指实际存在的计算机(即物理机),又称为宿主机。但当虚拟机嵌套时,运行虚拟机的虚拟机也是宿主机,但却不是物理机。主机操作系统是指宿主机的操作系统,在主机操作系统上安装的虚拟机软件可以在计算机中模拟出一个或多个虚拟机。
(2)虚拟机
虚拟机指在物理机上运行的操作系统中模拟出来的计算机,又称为客户机,理论上完全等同于实体的物理机。每个虚拟机都可以安装自己的操作系统或应用程序,并连接网络。运行在虚拟机上的操作系统称为客户机操作系统。
2. Hypervisor的分类
Hypervisor基于主机的硬件资源为虚拟机提供了一个虚拟的操作平台并管理每个虚拟机的运行,所有虚拟机独立运行并共享主机的所有硬件资源。Hypervisor是提供虚拟机硬件模拟的专门软件,可分为原生型和宿主型两类。
(1)原生(Native)型
原生型又称为裸机(Bare-metal)型。Hypervisor作为一个精简的操作系统(操作系统也是软件,只不过是比较特殊的软件)直接运行在硬件之上以控制硬件资源并管理虚拟机,比较常见的有VMware公司的ESXi、微软公司的Hyper-V等。
(2)宿主(Hosted)型
宿主型又称为托管型。Hypervisor运行在传统的操作系统之上,同样可以模拟出一整套虚拟硬件平台,比较常见的有VMware Workstation、Oracle VM VirtualBox等。
从性能角度来看,无论是原生型Hypervisor还是宿主型Hypervisor,都会有性能损耗,但宿主型Hypervisor比原生型Hypervisor的损耗更大,所以企业生产环境中使用的基本是原生型Hypervisor,宿主型Hypervisor一般用于实验或测试环境中。
3. 虚拟机文件
与物理机一样,虚拟机是运行操作系统和应用程序的软件计算机。虚拟机包含一组规范和配置文件,这些文件存储在物理机可访问的存储设备上,所以复制和重复使用虚拟机就变得很容易。虚拟机的文件管理由VMware Workstation来执行,这些文件一般在由VMware Workstation为虚拟机创建的那个目录中,如图1.4所示。
图1.4 虚拟机文件管理目录
(1)虚拟机配置文件
虚拟机配置文件包含虚拟机配置信息,如CPU、内存、网卡以及虚拟磁盘的配置信息。创建虚拟机的同时会创建相应的配置文件。更改虚拟机配置后,该文件也会相应地变更。虚拟化软件根据该文件提供的配置信息从物理机上为该虚拟机分配物理资源,通常使用文本、XML、CFG或VMX格式等,文件体积很小。
<VMname>.vmx文件:表示虚拟机配置文件,使用虚拟机程序打开这个文件以启动虚拟系统。该文件为虚拟机配置文件,存储着根据虚拟机向导或虚拟机编辑器对虚拟机进行的所有配置。有时需要手动更改配置文件以达到对虚拟机硬件方面的更改,该文件可使用文本编辑器进行编辑。如果宿主机使用Linux,则使用虚拟机时,这个配置文件的扩展名将是.cfg。
(2)虚拟机内存文件
虚拟机内存文件默认存在于系统盘的根目录下,系统盘的空间越大,系统就越能腾出更多的空间给虚拟内存,系统也就越稳定。当虚拟机关闭时,该文件的内容可以提交到虚拟磁盘文件中。
<VMname>.vmem文件:表示虚拟机内存文件,与pagefile.sys(也称为分页文件)的作用相同。当虚拟系统执行关机操作后,该文件消失,但挂起时,该文件不消失。
虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的、可用的内存(一个连续完整的地址空间),而实际上,它通常被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,需要时再进行数据交换。
pagefile.sys为分页文件,即虚拟内存文件,它默认存在于系统盘的根目录下。系统盘的空间越大,用户的系统就越能腾出更多的空间给虚拟内存,用户的系统也就越稳定,所以建议尽量不要把软件程序装在系统盘中。
主机中所运行的程序均需经由内存执行,若执行的程序很大或很多,则会导致内存消耗殆尽,而内存不足常导致卡机、系统不稳定等情况发生。为解决该问题,Windows中运用了虚拟内存技术,即匀出一部分硬盘空间来充当内存。虽然虚拟内存技术在一定程度上能够缓解物理内存的紧张状况,但是因为计算机从随机存取存储器(Random Access Memory,RAM)读取数据的速率要比从硬盘读取数据的速率快,所以若想提高性能,扩增RAM容量(可加内存条)是极佳的选择。若运行程序或操作缺乏所需的RAM,则Windows会用虚拟机内存文件进行补偿。虚拟机内存文件将计算机的RAM和硬盘上的临时空间(虚拟内存)进行组合。当RAM运行速率缓慢时,虚拟机内存文件便将数据从RAM移动到“分页文件”的空间中。
(3)虚拟磁盘文件
虚拟机所使用的虚拟磁盘,实际上是物理磁盘上一种特殊格式的文件,它模拟了一个典型的基于扇区的磁盘,虚拟磁盘为虚拟机提供存储空间。在虚拟机中,虚拟磁盘被虚拟机当作物理磁盘使用,功能相当于物理机的物理磁盘,虚拟机的操作系统安装在一个虚拟磁盘(文件)中。
虚拟磁盘文件用于捕获驻留在主机内存的虚拟机的完整信息,并将信息以一种明确的磁盘文件格式显示出来。每个虚拟机都从其相应的虚拟磁盘文件启动,并加载到物理机内存中。随着虚拟机的运行,虚拟磁盘文件可通过更新来反映数据或状态的改变。虚拟磁盘文件可以复制到远程存储中,提供虚拟机的备份和灾难恢复副本;也可以迁移或复制到其他服务器中。虚拟磁盘文件适合集中式存储,而不是存于每台本地服务器上。模拟磁盘中的虚拟磁盘文件往往较大,因此除了可以选择固定大小的磁盘类型外,还可以按需动态分配物理存储空间,更好地利用物理存储空间。
<VMname>.vmdk文件:表示虚拟机的一个虚拟磁盘。这是虚拟机的磁盘文件,存储了虚拟机硬盘驱动器里的信息。一个虚拟机可以由一个或多个虚拟磁盘文件组成。如果在新建虚拟机时指定虚拟磁盘文件为一个单独文件,则系统将只创建一个<VMname>.vmdk文件。该文件包括了虚拟机磁盘分区信息,以及虚拟机磁盘的所有数据。随着数据写入虚拟磁盘,虚拟磁盘文件将变大,但始终只有这一个磁盘文件。
如果在新建虚拟机时指定为每2GB容量单独创建一个磁盘文件,虚拟磁盘的总大小就决定了虚拟磁盘文件的数量。系统将创建一个<VMname>.vmdk文件和多个<VMname>-<s###>.vmdk文件(注:<s###>为磁盘文件编号),其中<VMname>.vmdk文件只包括磁盘分区信息,多个<VMname>-<s###>.vmdk文件用于存储磁盘数据信息。随着数据写入某个虚拟磁盘文件,该虚拟磁盘文件将变大,直到文件大小为2GB,然后新的数据将写入其他<s###>编号的磁盘文件中。
如果在创建虚拟磁盘时已经分配了所有的空间,那么这些文件将在初始时就具有最大大小并且不再变大了。如果虚拟机是直接使用物理硬盘而不是虚拟磁盘,则虚拟磁盘文件保存着虚拟机能够访问的分区信息。
早期版本的VMware产品用.dsk扩展名来表示虚拟磁盘文件。
<VMname>-<###>.vmdk:当虚拟机有一个或多个快照时,就会自动创建该文件。该文件记录了创建某个快照时,虚拟机所有的磁盘数据内容。<###>为数字编号,根据快照数量自动增加。
(4)虚拟机状态文件
与物理机一样,虚拟机也支持待机、休眠等状态,这就需要相应的文件来保存计算机的状态。暂停虚拟机后,会将其挂起状态保存到状态文件中,由于仅包含状态信息,文件体积通常不大。
<VMname>.vmss文件:用来存储虚拟机在挂起状态时的信息。一些早期版本的虚拟化软件用.std扩展名来表示这个文件。
(5)日志文件
虚拟化软件通常使用日志文件记录虚拟机调试、运行的情况,这些记录对故障诊断非常有用。
<VMname>.log文件:记录了VMware Workstation对虚拟机调试、运行的情况。当遇到问题时,这些文件对用户做出故障诊断非常有用。
(6)快照文件
对虚拟机执行某些任务时,会创建其他文件。例如,创建虚拟机快照时,可以捕获虚拟机设置和虚拟磁盘的状况,创建内存快照时还可以捕获虚拟机的内存状况,这些信息将随虚拟机配置文件一起存储在快照文件中。
当虚拟机建立快照时,就会自动创建快照文件。有几个快照就会有几个此类文件。这是虚拟机快照的状态信息文件,它记录了在建立快照时虚拟机的状态信息。<###>为数字编号,根据快照数量自动增加,如<VMname>-Snapshot<###>.vmsn。
当运行一个“虚拟系统”时,为防止该系统被另外一个VMware程序打开,导致数据被修改或损坏,VMware会自动在该“虚拟系统”所在的文件夹下生成3个锁定文件(虚拟系统锁定文件、虚拟磁盘锁定文件、虚拟内存锁定文件),分别为systemType.vmx.lck、systemType.vmdk.lck、systemTyep.vmem.lck。虽然VMware这种锁定机制能够很好地防止同一个虚拟系统文件被多个VMware程序运行,避免数据被破坏,但它也带来了一些问题,如当出现断电或其他意外情况时,可能导致某个虚拟系统文件无法正常打开,其原因往往是该虚拟系统文件没有解锁,解决办法是将这3个.lck文件删除。
4. 虚拟机的主要特点
虚拟机可以通过软件模拟创建具有完整硬件系统功能的、运行在一个完全隔离环境中的完整计算机系统。在物理计算机中能够完成的工作在虚拟机中都能够实现。在物理计算机中创建虚拟机时,需要将物理计算机的部分硬盘和内存容量作为虚拟机的硬盘和内存容量。每个虚拟机都有独立的互补金属氧化物半导体(Complementary Metal-Oxide-Semiconductor,CMOS)、硬盘和操作系统,可以像使用物理机一样对虚拟机进行操作。
通过虚拟机软件,可以在一台物理机上模拟出两台或多台虚拟的计算机,这些虚拟机就像真正的计算机那样工作,可以安装操作系统、安装应用程序、访问网络资源等。对用户而言,虚拟机只是运行在用户物理机上的一个应用程序;但是对在虚拟机中运行的应用程序而言,它就是一台真正的计算机。因此,当用户在虚拟机中进行软件测试时,系统同样有可能会崩溃;但是,崩溃的只是虚拟机上的操作系统,而不是物理机上的操作系统,使用虚拟机的“Undo”(恢复)功能,用户可以将虚拟机恢复到安装软件之前的状态。
虚拟机实现了应用程序与操作系统和硬件的分离,从而实现了应用程序与平台的无关性,具有以下特点。
(1)可同时在同一个主机上运行多个操作系统,每个操作系统都有自己独立的一个虚拟机,就如同网络上一个独立的主机;可在虚拟机之间分配系统资源。
(2)在虚拟机上安装同一种操作系统的另一发行版,不需要重新对硬盘进行分区。在硬件层面进行故障和安全隔离,利用高级资源控制功能保持性能。
(3)虚拟机之间共享文件、应用、网络资源等。虚拟机的完整状态保存在文件中,移动和复制虚拟机就像移动和复制文件一样便捷。
(4)可以运行采用客户机/服务器方式的应用,也可以在同一台计算机上使用另一个虚拟机的所有资源。其独立于硬件,可以将任意虚拟机调配或迁移到任意物理服务器上。
5. 虚拟机的应用
虚拟机现在已广泛应用于IT的各行各业,下面列举几个主要的应用。
(1)虚拟服务器
虚拟服务器非常适合为中小企业创建网站,可节省资金和资源。
(2)电子商务平台
虚拟服务器的运行与独立服务器的运行完全相同,中小型服务商可以以较低成本,通过虚拟机空间建立自己的电子商务平台、在线交易平台。
(3)ASP应用平台
虚拟服务器特有的应用程序模板,可以快速地进行应用程序的批量部署,再加上独立服务器的品质和极低的成本,是中小型企业搭建活动服务器页面(Active Server Pages,ASP)应用的首选平台。
(4)数据共享平台
完全的隔离、无与伦比的安全,使得中小企业、专业门户网站可以使用虚拟服务器提供数据共享、数据下载服务。对大型企业来说,虚拟机可以作为部门级应用平台。
(5)数据库存储平台
虚拟机可以为中小企业提供数据存储功能。由于其成本比独立服务器低,安全性高,可作为小型数据库的首选。
(6)服务器整合
通过虚拟化软件,可在物理服务器上运行多个虚拟机,令每个虚拟机代替一个传统的服务器,虚拟服务器共享物理服务器的硬件资源,由虚拟管理程序负责这些资源的调配。一些老旧系统和软件需要特定的运行环境,新的计算机硬件环境无法支持,可以考虑使用兼容早期硬件的虚拟机,通过安装早期版本的操作系统和运行环境来解决这个问题。
(7)IT基础设施管理
在物理平台上部署虚拟机,使物理资源逻辑化,便于实现资源管理和分配的自动化。虚拟机与物理硬件隔离,虚拟机之间相互独立,使得虚拟机运行更安全。自动化的虚拟机管理工具可以降低IT维护难度和成本。
(8)系统快速恢复
虚拟机可以实现系统快照、备份和迁移功能,便于及时恢复系统。
(9)IT人员测试和实验
使用虚拟机可以模拟真实的操作系统,做各种操作系统实验和测试;还可以基于多种操作系统、多种软件运行环境、多种网络环境做IT实验。一些应用系统可以先在虚拟机上部署和测试,成功之后再正式部署到生产环境中。
(10)软件开发与调试
软件开发人员可以利用虚拟机实现跨平台的不同操作系统下的应用程序开发,完成整个开发阶段的试运行和调试工作。