0

我希望能够在 Windows 和 Linux 上这样做。我知道有一些方法可以通过获取 sysinfo 并使用与硬件标识符相关的拇指规则。

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

顺便说一句,我正在尝试在 Intel 硬件上执行此操作,而我使用的虚拟化软件是 Vmware Workstation 和 Windows HyperV。

4

3 回答 3

1

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

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

dmesg | grep -i virtual

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

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

您还可以检查虚拟磁盘:

cat /proc/ide/hd*/model

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

于 2013-03-12T23:29:17.890 回答
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
于 2015-02-25T19:28:31.717 回答
1

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

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

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

叶 0x40000010,时序信息。

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

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

ECX、EDX:保留

当然,您仍然依赖虚拟机管理程序向您提供这些信息。它很可能决定根本不报告 0x40000000,从而导致客人相信它实际上是在真实硬件上运行

于 2015-02-27T00:58:57.970 回答