如何以编程方式知道我是否在VM中?

时间:2013-03-12 23:18:52

标签: linux windows kernel virtualization

我希望能够从Windows和Linux中执行此操作。我知道有一些方法可以获取sysinfo并使用与硬件标识符相关的拇指规则。

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

BTW我试图在英特尔硬件上执行此操作,我使用的虚拟化软件是Vmware Workstation和Windows HyperV。

3 个答案:

答案 0 :(得分:1)

这是一个更有用的命令:

$ 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

答案 1 :(得分:0)

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

检查系统启动时内核检测到的虚拟设备。

dmesg | grep -i virtual

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

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

您还可以检查虚拟磁盘:

cat /proc/ide/hd*/model

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

答案 2 :(得分:0)

大多数软件检查管理程序CPUID叶子 - Leaf 0x40000000,Hypervisor CPUID信息

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

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

Leaf 0x40000010,时间信息。

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

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

ECX,EDX:已保留

当然,您仍然依靠虚拟机管理程序为您提供此信息。它可能决定不报告0x40000000,反过来导致客户认为它实际上是在真实硬件上运行