如何以编程方式知道我是否在虚拟机中?

我希望能够从Windows和Linux都能这样做。 我知道通过获取sysinfo和使用与硬件标识符相关的缩略图规则是有办法的。

我想知道是否有一个更基本的方法,如查看内存地址/发出中断等

顺便说一句我正在试图在英特尔硬件上做到这一点,我使用的虚拟化软件是Vmware Workstation和Windows HyperV。

Solutions Collecting From Web of "如何以编程方式知道我是否在虚拟机中?"

这是一个更有用的命令:

 $ lscpu | grep -E 'Hypervisor vendor|Virtualization type' Hypervisor vendor: KVM Virtualization type: full 

其他命令的输出示例如下:

 $ sudo virt-what kvm $ dmesg | grep -i virtual [ 0.000000] Booting paravirtualized kernel on KVM [ 0.029160] CPU0: Intel QEMU Virtual CPU version 1.0 stepping 03 $ sudo dmidecode | egrep -i 'manufacturer|product|vendor|domU' Vendor: Bochs Manufacturer: Bochs Product Name: Bochs Manufacturer: Bochs Manufacturer: Bochs Manufacturer: Bochs Manufacturer: Bochs Manufacturer: Bochs Manufacturer: Bochs Manufacturer: Bochs Manufacturer: Bochs Manufacturer: Bochs 

其中至少有一个应该可以检测你是否在Linux下运行(或者其他一些常见的虚拟环境):

检查系统引导时由内核检测到的虚拟设备。

dmesg | grep -i virtual

另一种检测虚拟化硬件设备的方法,如果dmesg没有说任何有用的东西。

dmidecode | egrep -i 'manufacturer|product|vendor|domU'

您还可以检查虚拟磁盘:

cat /proc/ide/hd*/model

通常可以通过查找/proc/vz/dev/vzfs来检测Virtuozzo。

大多数软件检查管理程序CPUID叶 – 叶0x40000000,管理程序CPUID信息

EAX:管理程序CPUID信息(0x40000010)的最大输入值。

EBX,ECX,EDX:虚拟机管理程序供应商ID签名。 例如“KVMKVMKVM”

叶子0x40000010,定时信息。

EAX:以kHz为单位的(虚拟)TSC频率。

EBX:(虚拟)总线(本地apic定时器)频率(kHz)。

ECX,EDX:保留

当然,你仍然依靠管理程序来给你这个信息。 它可能决定不报告0x40000000,反过来引导客人相信它实际上是在真正的硬件上运行