在阅读不同主题的不同材料时,我时不时会回到这个问题:虚拟化到底有多虚拟?我所说的“虚拟化”是指 Virtual PC 和 VMWare 之类的东西,它们允许您运行客户操作系统。特别是,我不明白的是:
- 虚拟机是否提供与物理机基本无异的环境?当然,会存在一些实际差异(如虚拟机管理程序调用逃生舱、虚拟硬件组件名称等),允许检测虚拟机,但是否存在不兼容性?
- 如果环境与物理机完全兼容,那么嵌套虚拟机是否可以?
- 如果不是,是否意味着客户操作系统必须经过专门调整才能在虚拟机内运行?如果是这样,是否意味着当今大多数操作系统已经针对大多数 VM 供应商进行了调整?
- 基于软件的虚拟化和基于硬件的虚拟化有何不同?
- 基于软件的虚拟化和基于硬件的虚拟化到底有什么区别?
答案1
据我所知:
- 有研究表明“无法检测的 rootkit”,其中恶意的虚拟机管理程序位于您的计算机和硬件之间安全公司(和 CPU 供应商)对有人发明了这样的东西并声称没有人能够检测到它感到愤怒,所以他们实际上想出了一种使用计时函数并将结果与外部源进行比较的方法。因此虚拟化是几乎无法察觉,但如果你非常关注小细节,并且有外部参考,是找出您正在进行虚拟化的方法。不过,这不会造成任何不兼容。
- 不是。虚拟 CPU 不具备物理 CPU 所具有的功能。例如,英特尔虚拟化指令仅适用于主机操作系统。但这并不意味着您不能在虚拟机内拥有虚拟机:它只是意味着它会非常慢。
- 操作系统不必为虚拟机而调整。相反,情况恰恰相反。
- 是的,在某种程度上确实如此。软件虚拟化始终有效。硬件虚拟化通常不是可传递的(客户操作系统不能使用硬件虚拟化来托管更多客户操作系统)。
- 肯定还有更多的事情,但我认为这是一个好的开始。
答案2
让我逐一回答一下:
1 虚拟机是否提供与物理机基本无区别的环境?当然,会存在一些实际差异(如虚拟机管理程序调用逃生舱、虚拟硬件组件名称等),允许检测虚拟机,但是否存在不兼容性?
如果忽略“虚拟机管理程序调用逃生舱、虚拟硬件组件名称”,所有其他不同之处都被视为错误。......除此之外,请参见下文。
2 如果环境与物理机完全兼容,那么嵌套虚拟机是否可以?
这取决于具体情况。如果你使用硬件虚拟化,你就不能在虚拟机管理程序下运行虚拟机管理程序。(理论上,你也可以模拟它,但没人愿意做这些麻烦的工作)
3 如果不是,是否意味着客户操作系统必须经过专门调整才能在虚拟机内运行?如果是这样,那么是否意味着当今大多数操作系统已经针对大多数 VM 供应商进行了调整?
你搞反了。我们在虚拟机之前就有了操作系统。虚拟机适应操作系统,而不是相反。 (也有一些例外,例如旧版本的Xen。但这是例外)
4 基于软件的虚拟化和基于硬件的虚拟化有何不同?
见2。
5 基于软件的虚拟化和基于硬件的虚拟化到底有什么区别?
见4。
答案3
虚拟机试图提供足够好的环境来运行客户操作系统和应用程序。提供与物理环境无法区分的环境几乎是不可能的,因为存在很难隐藏的时序效应(至少在高效运行的虚拟机中)
嵌套虚拟机可以通过纯粹模拟的虚拟机(例如 Bochs)来实现,但是 Virtual PC 和 VMware 使用了一些并非为嵌套而设计的硬件支持。
基于软件的虚拟化模拟每个 CPU 指令(有时基于软件的解决方案使用 Ring-1 来本地运行 Ring-0 代码作为优化,并且此技巧不能嵌套)。
基于硬件的虚拟化在处理器中使用一种特殊模式,旨在将控制权传递给虚拟机管理程序并设置额外级别的页表。
答案4
据我所知,虚拟化软件无缝模拟了 HAL(硬件抽象层),因此客户操作系统不知道其中的差别。即:使用普通操作系统。