Horo
Horo

目前是 LikeCoin Chain 验证人 Yoitsu 背后的家伙,以及 CDC/CFC 划水组成员(笑)。偶尔会变身成狐狸。( @foobarz )

虚拟机 ABC - 基础概念(?)、实用场景和软件推荐

这个其实是咱的一个关于虚拟机的小企划的开始的一部分啦,剩下的内容可以到咱的 GitHub 上查看,有问题和建议的话也可以在那里反馈。

所以虚拟化是个啥玩意?

在计算机技术中,虚拟化(技术)或虚拟技术(英语:Virtualization)是一种资源管理技术,是将计算机的各种实体资源(CPU、内存、磁盘空间、网络适配器等),予以抽象、转换后呈现出来并可供分区、组合为一个或多个电脑配置环境。由此,打破实体结构间的不可切割的障碍,使用户可以比原本的配置更好的方式来应用这些电脑硬件资源。这些资源的新虚拟部分是不受现有资源的架设方式,地域或物理配置所限制。一般所指的虚拟化资源包括计算能力和数据存储。
--- https://zh.wikipedia.org/wiki/虚拟化

简单说的话,虚拟化就是在现有硬件上虚拟出一个和现有硬件类似(或者有差别)的硬件让某个应用或操作系统运行。不过应用或系统会把虚拟出来的硬件当作完整的硬件配置,看不到外面的真实配置。一个现实环境的几个虚拟环境之间也能做到相互隔离。

那虚拟机又是啥?

简单地说,虚拟机本身还是一种软件。它用来生成一个虚拟的环境,然后在生成的虚拟的环境里执行一些操作。

  • 有一些编程语言会利用虚拟机来执行代码,例如 Java 中的 JVM、 Python 中的 PVM 等等。这种虚拟机被称作“软件虚拟机”或者“进程虚拟机”
  • 当然大家听到虚拟机的时候,更多的时候指的是用来虚拟一整台电脑的那种“操作系统虚拟机”啦,这篇教程(?)主要介绍的也是这种。
  • 特别地,有些用来虚拟某些特定平台(例如虚拟古老硬件)的虚拟机软件偶尔也会被称作“模拟器”。(虽然有些模拟器的原理并不是完全的虚拟一个环境出来……)

目前的习惯是把虚拟机软件(Hypervisor)分成两类:

  • Type 1(有时也叫做 Bare Metal),这种虚拟机直接运行在硬件上,通常会和运行软件的操作系统一起安装在主机上。
  • Type 2 (有时也叫做 Hosted),这种虚拟机通常是一个独立的软件,安装在一个已有的操作系统上(经常被称作 Host OS)。

直接来看的话, Type 1 类型的虚拟机少了一层操作系统,性能会比 Type 2 类型的稍微好一些,算是对安装和配置比 Type 2 类型的更繁琐复杂的回报吧……

所以怎么区分主机和虚拟机里的系统?

通常咱们都用 Host / Guest 来区分主机或虚拟机里的系统。

  • Host OS(宿主/真实系统)
  • 虚拟机也是一种软件啦,当然它需要安装在一个操作系统上,安装虚拟机软件的操作系统就被称作“Host OS”。对于 Type 1 类型的虚拟机而言,安装虚拟机软件通常就和安装 Host OS 一起进行了。
  • Guest OS(访客/来宾/虚拟系统)

运行在虚拟机软件内部的操作系统,就称为“Guest OS”啦。

这里有一张虚拟化软件的典型结构的示意图,从上到下分别是虚拟机软件、Host OS 和主机硬件。

全虚拟化和硬件协助虚拟化又是啥咧?

这大概要从波佩克与戈德堡虚拟化需求开始说起:

  • 等价性:一个运行于VMM下的程序,其行为应与直接运行于等价物理机上的同程序的行为完全一致。
  • 资源控制:VMM对虚拟资源进行完全控制。
  • 效率性:机器指令中经常使用的那一部分应在没有VMM干预下执行。

最早的虚拟化都是由软件全权负责的,于是软件模拟的效率就成了说多了都是泪的典型……

后来随着虚拟化技术需求的增加,Intel 和 AMD 都在自家的 CPU 中加入了和虚拟化相关的指令集(Intel 称为 VT-x ,AMD 称作 AMD-V),流行的虚拟机软件也加入了对这两种指令集的支持。

有了硬件协助之后,就可以在一定程度上提高虚拟机的运行效率(Guest OS 请求执行的某些 CPU 特权指令可以直接交给硬件来运行,比软件模拟的效率高多了)。

不过介于硬件协助和架构密切相关,现在某些跨架构的虚拟(例如在 x86 上模拟早期苹果电脑 PowerPC 架构的虚拟机软件 PearPC)还是要靠全软件虚拟来完成。

再后来,人们又发现让虚拟机访问物理机的设备好麻烦(如果直接用直接内存访问(DMA)的方式访问硬件的话,硬件不知道给定虚拟机客户机物理地址与主机物理地址之间的映射关系,有可能搞坏内存里的数据。而由管理程序或主机操作系统介入I/O操作的话,虽然比较安全,但是延迟就增加了咧……)。

于是 Intel 和 AMD 又整出了个 “输入输出内存管理单元” (常用的缩写 IOMMU)的家伙,它通过将虚拟机的物理地址映射到物理机物理地址的相同或兼容转换表重映射硬件访问地址来解决延迟问题,一定程度上也能提供保护。甚至还能搞出一些神奇的操作(例如通过直通的方式让虚拟机直接使用物理机的硬件等等)。


所以一个成熟的虚拟机软件应该有什么功能?

同时运行多个操作系统

这当然是虚拟机软件的基本功啦,只要汝的硬件能撑得住,就能运行足够多的虚拟系统。

快照功能

大多数虚拟机软件都有这个功能,有些人可能觉得这个上虚拟机软件必备的功能:‌

  • 为某个虚拟系统创建快照的时候,虚拟机软件会把这个虚拟系统的所有信息(例如配置,内存和硬盘的状态等等)都保存在汝物理机的硬盘上。
  • 当需要的时候,可以再切换到这个快照(一般称作“恢复”或“还原”)。一旦切换到某个快照,虚拟系统(Guest OS)就回到当初创建快照的那个状态。
  • 有些虚拟机软件支持在虚拟机关机或重新启动时自动还原至某个指定的快照,是不是像极了某些公共场所里的电脑的样子?
  • 大多数虚拟机软件都支持树状结构的快照,也就是说,汝可以在某个快照之上再创建快照。也可以切换回之前的快照,再在之前的快照的基础上再创建快照。

某个虚拟机软件的快照列表的例子(就是 VMware Workstation 啦):

虚拟同种或不同种 CPU

这个就很好理解啦,大多数虚拟机软件都只能虚拟和物理机相同(型号或架构)的 CPU。但有些可以虚拟不同种类型的 CPU (例如大多数模拟器)。

虚拟内存和硬盘

这个也很好理解啦,汝可以在虚拟机软件中为虚拟机设置内存和硬盘大小,虚拟机只会用到虚拟机软件分给它的那一部分(剩下的它也不知道有)。

虚拟网络

为了能让虚拟机能够访问网络,虚拟网卡出来当然是必不可少的啦,为了应对各种复杂的情况,大多数的虚拟机软件也都支持不同的虚拟网卡模式。例如 VirtualBox 就支持:

  • NAT 模式,这种模式最简单,通过网络地址转换(Network Address Translation,NAT 就是这么来的)来共享主机的网络连接。如果只是简单的想让虚拟机访问网络的话,用这个模式就没错。
  • 桥接网卡(有时也称作 Bridge 模式),就是相当于汝虚拟机的虚拟网卡直接连到汝物理机连接的网络上去。如果汝想让汝物理网络上的设备也能访问到虚拟机的话,这个模式最简单。
  • 仅主机(Host-Only 网络),望名生义啦,这个网络模式下只有主机和虚拟机之间能互相看到,适合干一些 OOXX 的事情(啥?)
  • 内部网络(有时也称作 Internal),这个模式比仅主机网络再进一步,连主机上的进程也看不到虚拟网络,适合干一些更 OOXX 的事情(啥??)

虚拟外设

最常见的就是光驱和 USB 啦……

  • 虚拟光驱的话,除了把物理机上的光驱拿出来用以外(只要有的话),也可以把光盘映像文件给虚拟机塞过去……
  • USB 的话,就像真的插在别的电脑上一样,会从汝的物理机上消失,然后出现在虚拟机里……

共享和迁移

大多数的虚拟机软件都支持把虚拟机文件导出成符合开放虚拟化格式的 OVF 或者 OVA 文件,汝可以把导出的文件分享给其他人来安装。

除了把虚拟机文件复制到其它电脑上这种常见的迁移操作以外,某些虚拟机软件还支持所谓的“热迁移”,就是在虚拟机运行时把它搬到另一台主机上啦。在汝需要维护主机(例如升级主机的软硬件或者排除故障)的时候可能会是有用的功能。

还有么?

其实还可以举的例子有很多啦,例如:‌

  • 让虚拟机的软件直接显示在主机的桌面上(而不是虚拟显示器上)的“无缝模式”。
  • 通过某些远程连接协议(例如 VNC 或者 RDP 等等)直接连接到虚拟机进行操作。
  • 把物理机转换成虚拟机映像。
  • 等等……

所以虚拟机软件哪里可以用?

简单来说的话,咱能想到的有这些场景:‌

  • 体验和学习新环境,不用担心没有合适的硬件或者搞坏物理系统

例如汝想怀旧的时候,手边没有合适的硬件的话,可以通过运行某些模拟器来尝试。

或者汝有兴趣学习一个新的环境的时候(例如开始学习 GNU/Linux 使用的 Windows 用户),可以先考虑把新环境装在虚拟机中。然后就开始随便折腾吧,哪怕里面腥风血雨,汝的物理环境还是一切如常。

  • 运行其它系统中的软件

这个就简单了吧,例如在 macOS 上运行只有 Windows 上能用的某些软件。如果只用多重引导的话,一次只能运行一个系统中的软件,而用上虚拟机以后就可以一起开啦…

  • 简化系统的迁移和维护

因为虚拟机在物理机上就相当于几个文件,于是主机更换或升级的时候只要把虚拟机文件带到新的主机上再启动基本上就 OK 啦,备份也是相同的原理。

而主机如果出现意外(例如系统或硬件需要更换的时候),只要从备份把虚拟机文件拿回来,再在主机上更新或者重新安装虚拟机软件以后,一切就又回归平静啦(大概吧……)

所以啥时候虚拟机的图形性能可以带动大型 3D 游戏咧?这样几乎所有的操作就能在虚拟机里完成了耶……(汝是不是想和咱说那啥显卡直通?)
  • (一定程度上)保护隐私和安全

例如汝要尝试一些来历不明或者危险的软件的时候(例如年代久远来源不可考、没签名、病毒样本或者某国特色等等)。

或者汝开始做一些不想被亲近的人知道的事情的时候,可以把和那件事相关的账户和文件啥的都装在一台虚拟机里(当然仅仅用上虚拟机在某些时候是不够的,汝有可能需要某些其它技巧)。

  • 搭建开发和测试环境

例如汝因为生计所迫在汝不常用的平台上开发软件 or 服务(例如要在 GNU/Linux 上架设网站的 Windows 用户,反之亦然?),汝可以把汝开发需要的系统、软件和工具等等装进虚拟机里。开发的时候用,平常还是继续原来的生活(?)。

如果汝要针对不同的目标环境进行测试,不巧这些环境还相互冲突的时候(例如不同版本的浏览器、操作系统内核等等)。汝可以安装好几个有不同版本的虚拟机来一起测试。

好几个人一起开发软件的时候,大家的电脑上的配置可能会千差万别。为了避免因为这些差别导致的测试结果差异进而开始扯皮,可以给大家装上同样的虚拟机作为测试环境。如果有必要的话,还可以在某个初始状态设置一个快照,确保每次的测试环境都相同。

那么多虚拟机软件我该选哪一个?

随着虚拟化技术的发展,虚拟机软件也像雨后春笋一样冒出了一大把,那到底哪个适合自己呢?

常见的虚拟机软件

  • Xen 通过一种叫做半虚拟化的技术获得高效能的表现,甚至在某些与传统虚拟技术不友好的架构上(如x86),Xen也有极佳的表现。但是这要求虚拟机使用经过修改的客户端操作系统。
  • 基于内核的虚拟机(英语:Kernel-based Virtual Machine,缩写为 KVM)是一种用于Linux 内核中的虚拟化基础设施,可将Linux内核转化为一个虚拟机监视器。
  • QEMU 通过动态的二进制转换模拟 CPU,并且提供一组设备模型,使它能够运行多种未修改的客户机 OS,可以通过与 KVM 一起使用进而接近本地速度运行虚拟机(接近真实电脑的速度)。
  • VMware 虚拟机软件是由 VMware 公司开发的一系列虚拟机软件,既有面向桌面,属于 Type 2 类型的 VMware Workstation / VMware Fusion,也有属于 Type 1 类型的 VMware ESXi 等等。
  • Windows 上还有微软半路收购来的 Microsoft Virtual PC (Windows XP - Vista),主要用来模拟 Windows XP 的 Windows Virtual PC(Windows 7),和船全新的 Hyper-V (Windows Server 2008 和 Windows 8 开始)
  • macOS 上的话,最出名的应该是 Parallels Desktop,主打 macOS 和 Windows 虚拟机之间的无缝衔接。
  • 而从 Innotek 卖到 Orcale 的 Orcale VirtualBox 大概是为数不多的跨 Host OS 众多(也没有多到哪里去啦, Windows / macOS / GNU/Linux 和 Orcale 自家的 Solaris)而且还部份开源的虚拟机软件了……

考点之不同的 Host OS 的支持程度

对于 Type 1 类型的虚拟机软件而言,因为基本上都是跟着一个操作系统一起安装的,多半不用考虑这个问题…… (例如 Xen)‌

这个当然要看汝现在在用的 Host OS 啦,例如:‌

  • KVM 既然叫做基于内核的虚拟机嘛,那就肯定只支持 GNU/Linux 做 Host OS 啦,可能还需要定制的内核。
  • Parallels 其实之前做过面向 Windows 的 Parallels Workstation,奈何打不过对手凉了…… 于是就剩专精 macOS 的 Parallels Desktop 啦。
  • Windows Virtual PC 和 Hyper-V 既然是微软自己家的,自然只支持 Windows 做 Host OS。(以及作为 Type 1 类型的虚拟机, Hyper-V 神奇的会使其它 Type 2 类型的虚拟机软件停止工作,例如 VMware

考点之不同的 Guest OS 的支持程度

这个当然要看汝想装的 Guest OS 是什么啦,流行的几个虚拟机软件基本上都支持常见的三大系统做 Guest OS,虽然可能性能和稳定性等等略有差异……

考点之功能差异

除了之前提到的功能以外,这个就比较见仁见智啦。可能有些倾向系统间的协作(例如文件交换),有些又倾向安全性(例如隔离和加密),还有些比较注重某一方面的性能(例如图形性能),或者注意支持的虚拟硬盘/光盘格式(方便更换软件)等等……

无责任之完全主观总结

当并不能把表格的源代码直接贴上来而又不愿意花时间改成列表的时候……


(后面的内容和前面没有关系)

以及:

  • 当汝在 Matters 的编辑器旁边添加标签的时候,刚添加完的一瞬后光标的焦点不在编辑标签那个框里。
  • 这时如果汝想删除标签却又习惯性的按下 Backspace/Delete 的时候,浏览器后退啦……
  • 汝慌张的想按前进的时候,发现草稿只剩了个标题……
  • 咱是 macOS 上的 Firefox 72.0a1,不知道其他的地方能不能重现……
  • 以及和这个比起来提前加的空格没了这种都只能算是小问题啦……(macOS 上的 Squirrel 用户如是说)
CC BY-NC-ND 2.0 版权声明

喜欢我的文章吗?
别忘了给点支持与赞赏,让我知道创作的路上有你陪伴。

加载中…

发布评论