Hypervisor 浅谈

作为一名IT从业者,相信你对于VirtualBox或者VMware Workstation都有所了解,它们是桌面操作系统中应用最为广泛的虚拟机软件。但是还有一些不为大众所熟知的虚拟机软件,例如Hyper-V、ESXi、Xen、KVM等。它们广泛应用在数据中心的服务器上,是云计算最重要的基石之一。最近入手了一台工控机,用于搭建家庭软路由,借此机会了解并熟悉了一些虚拟机软件。

Hypervisor

虚拟机软件的正式术语为HypervisorVirtual Machine Monitor(VMM)。单词Hypervisor是supervisor的一个变体,意思是supervisor的supervisor。上面提到的Hypervisor,根据它们运行的环境可以分为两大类:

  1. 类型 I (Type 1):原生的hypervisor
    这类虚拟机管理程序直接运行在宿主机的硬件上来控制硬件和管理虚拟的操作系统,例如VMware ESXi、Xen等。

  2. 类型 II (Type 2):托管的hypervisor
    这类虚拟机管理程序运行在传统的操作系统上,就像其他计算机程序那样运行,例如VirtualBox、VMware Workstation等。

hypervisor types类型 I 和类型 II Hypervisor(图片来自维基百科)

在虚拟机软件这个领域,大家都想争夺这个“正统”的名字——Hypervisor。于是微软有了Hyper-V,而VMware则起名为VMvisor(ESXi的前身)。

下面介绍几个原生的hypervisor。

VMware ESXi

ESXi是VMware推出的一款运行在裸机上的基于Linux系统的虚拟机软件。ESXi是vSphere套件中的一个核心虚拟化组件,其它两个是vCenter Server与vSphere Client。它们都是用于管理虚拟机的客户端与工具。vSphere Client在版本6.5之后只保留了基于Web的管理客户端,如下图所示。

vmware-esxi-index-page.pngVMware ESXi 6.7管理界面截图

ESXi占用系统资源很小,用户界面友好,易于管理,主要面向中小型企业。软路由也经常使用ESXi作其虚拟化平台,运行OpenWrtROS爱快等路由器系统。

Proxmox VE

Proxmox VE(Proxmox Virtual Environment,简称为PVE),是一个开源的基于Debian的虚拟化平台。PVE支持两类虚拟化技术:

  1. 基于LXC的容器
  2. 基于KVM(Kernel-based Virtual Machine)的虚拟机

PVE也是提供基于Web的管理界面,用户界面友好,也常常作为软路由的虚拟化平台。

pve start pageProxmox VE 4.4管理界面截图(图片来自维基百科)

Hyper-V

如果大家经常使用Windows Server系统,那么对Hyper-V就不会陌生。Hyper-V主要有两种安装部署方式:

  1. 在Windows Server系统中作为一个Server Role来安装
    Hyper-V as a role on Windows Server

  2. 使用Hyper-V Server镜像文件独立安装部署
    Install Hyper-V Server 2019需要特别指出的是Hyper-V Server是免费的,最新的Hyper-V Server 2019可以在这里下载。

Hyper-V安装完成之后,可以通过Hyper-V管理器(Hyper-V Manager)或者PowerShell for Hyper-V来管理虚拟机。Hyper-V Server与Windows Server中启用的Hyper-V role都被视为原生的虚拟机软件,即Type 1 hypervisor。这是因为在启用了Hyper-V role的Windows Server系统中,Hyper-V是先于Windows Server启动的,此时的Windows Server变成了一个特殊的虚拟机。

在启用了Hyper-V role的Windows Server系统中,你会发现休眠功能是不可用的。解决这个问题的办法是禁止Hyper-V的启动或者彻底的卸载Hyper-V。可以通过如下命令禁止Hyper-V的启动:
bcdedit /set hypervisorlaunchtype off
我们也可以按需启动Hyper-V:
bcdedit /set hypervisorlaunchtype auto
以上操作重启生效。
这个办法也可以解决Hyper-V与VMware Workstation、VirtualBox等Type 2虚拟机软件的冲突。
Hyper-V conflict with VMware and VirtualBox

虚拟化平台检测

有时候我们通过SSH或者RDP远程连接到一台机器,有什么办法可以检测系统是运行在虚拟化平台中还是在物理机上吗?答案是肯定的。不同的虚拟化或容器技术会在其实例中引入不同的特征信息,如特殊的proc文件、处理器厂商、或虚拟网卡等硬件名称等。通用的检测方法是不存在的,需要结合多种办法,下面我们根据虚拟的操作系统类型来介绍。

虚拟化平台检测有什么用?写病毒的人知道病毒分析师在分析病毒的时候会使用虚拟机沙箱来对病毒进行分析,所以在病毒编写的时候会检测虚拟机,因为病毒一旦进了病毒分析师的虚拟机,攻击价值就没了,所以在病毒层面上,病毒编写者可以设计这么一个逻辑:检测到虚拟机之后,立刻停止所有的感染和发作行为,然后退出。

Linux

1. 通过lscpu命令

lscpu命令从sysfs和/proc/cpuinfo收集cpu体系结构信息,以可读的文本方式显示CPU的数量,线程 (thread),核心(core),插槽(Socket)等信息。

在不同的云平台虚拟机上运行命令lscpu | grep -i hypervisor的结果如下:

Microsoft Azure

1
Hypervisor vendor:     Microsoft

Alibaba Cloud

1
Hypervisor vendor:     KVM

2. 通过dmidecode命令

dmidecode命令可以获取有关硬件方面的信息。DMI(Desktop Management Interface,DMI)充当了管理工具和系统层之间的接口,DMI收集的信息遵循SMBIOS(System Management BIOS)规范。SMBIOS是系统制造商以标准格式显示产品管理信息所遵循的统一规范。SMBIOS和DMI是由行业指导机构Desktop Management Task Force (DMTF)起草的开放性的技术标准,其中DMI设计适用于任何的平台和操作系统。DMI的主要组成部分是Management Information Format(MIF)数据库,这个数据库包括了所有有关电脑系统和配件的信息。dmidecode的作用是将DMI数据库中的信息解码,以可读的文本方式显示,其输出的信息包括BIOS、系统、主板、处理器、内存、缓存等。由于DMI信息可以人为修改,因此其输出的信息不一定是准确的。dmidecode命令在主流的Linux发行版中都可以找到。

在不同的云平台虚拟机上运行命令dmidecode | egrep -i 'manufacturer|product|vendor'的结果如下:

Microsoft Azure

1
2
3
4
Vendor: American Megatrends Inc.
Product Name: Virtual Machine
Manufacturer: Microsoft Corporation
Manufacturer: Intel

Alibaba Cloud

1
2
3
Vendor: SeaBIOS
Manufacturer: Alibaba Cloud
Product Name: Alibaba Cloud ECS

可以看到,dmidecode命令虽然输出了很多有用的信息,但还不足以推断出当前虚拟机所使用的的虚拟化平台。因此它只能作为判断的一个参考信息。另外dmidecode命令不适用于基于容器的虚拟化技术。

3. 通过dmesg命令

dmesg命令用于显示Linux内核的环形缓冲区(ring buffer)信息。当计算机启动时,系统内核将会被加载到内存中。在加载的过程中会显示很多的信息,我们可以从中获得诸如系统架构、CPU、挂载的硬件,RAM等多个运行级别的大量的系统信息。

在不同的云平台虚拟机上运行命令dmesg | grep -i virtual的结果如下:

Microsoft Azure

1
2
3
4
5
6
[    0.000000] DMI: Microsoft Corporation Virtual Machine/Virtual Machine, BIOS 090007  06/02/2017
[ 0.000000] Booting paravirtualized kernel on bare hardware
[ 2.069238] ata_piix 0000:00:07.1: Hyper-V Virtual Machine detected, ATA device ignore set
[ 4.269495] scsi 2:0:0:0: Direct-Access Msft Virtual Disk 1.0 PQ: 0 ANSI: 5
[ 4.516403] scsi 3:0:1:0: Direct-Access Msft Virtual Disk 1.0 PQ: 0 ANSI: 5
[ 7.713671] systemd[1]: Detected virtualization microsoft.

Alibaba Cloud

1
2
3
4
5
6
[    0.000000] Booting paravirtualized kernel on KVM
[ 0.212528] KVM setup paravirtual spinlock
[ 0.737703] input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input2
[ 0.739010] input: VirtualPS/2 VMware VMMouse as /devices/platform/i8042/serio1/input/input3
[ 0.754798] systemd[1]: Detected virtualization kvm.
[ 0.785449] systemd[1]: Starting Setup Virtual Console...

4. 通过systemd-detect-virt命令

对于使用systemd的Linux系统,可以使用systemd-detect-virt命令来进行检测,该命令目前可以同时检测基于hypervisor的虚拟化技术(例如 KVM、QEMU、VMware、Xen、Oracle VM、VirtualBox、UML)和基于容器的虚拟化技术(例如 LXC、Docker、OpenVZ)。

在不同的云平台虚拟机上运行命令systemd-detect-virt的结果如下:

Microsoft Azure

1
microsoft

Alibaba Cloud

1
kvm

5. 通过virt-what命令

virt-what实际上是一个Shell脚本。它通过各种启发式方法来识别虚拟化环境类型,可以检测出 QEMU/KVM、VMware、Hyper-V、VirtualBox、OpenVZ、Xen、LXC等平台类型。

在不同的云平台虚拟机上运行命令virt-what的结果如下:

Microsoft Azure

1
hyperv

Alibaba Cloud

1
kvm

Windows

在Windows系统上检测虚拟化平台就没有那么多的办法了。主要是依据systeminfo这个命令或者对应的msinfo32 GUI工具来查看一些系统信息辅助我们判断。

在Alibaba Cloud中的一台Windows Server 2012上运行命令systeminfo | findstr /i model的结果如下:

1
System Model:              Alibaba Cloud ECS

msinfo32 GUI的截图如下:
system information

总结

本文先介绍了hypervisor的分类以及三个原生的hypervisor,然后探讨了如何检测系统是运行在虚拟化平台中还是在物理机上,希望对你有所启发。

相关链接