我希望能够在 Windows 和 Linux 上这样做。我知道有一些方法可以通过获取 sysinfo 并使用与硬件标识符相关的拇指规则。
我想知道是否有更基本的方法,比如查看内存地址/发出中断等。
顺便说一句,我正在尝试在 Intel 硬件上执行此操作,而我使用的虚拟化软件是 Vmware Workstation 和 Windows HyperV。
我希望能够在 Windows 和 Linux 上这样做。我知道有一些方法可以通过获取 sysinfo 并使用与硬件标识符相关的拇指规则。
我想知道是否有更基本的方法,比如查看内存地址/发出中断等。
顺便说一句,我正在尝试在 Intel 硬件上执行此操作,而我使用的虚拟化软件是 Vmware Workstation 和 Windows HyperV。
至少其中一个应该可以检测您是否在 Linux 上的 VMware(或其他一些常见的虚拟环境)下运行:
在系统启动时检查内核检测到的虚拟设备。
dmesg | grep -i virtual
另一种检测虚拟化硬件设备的方法,如果dmesg
没有说任何有用的话。
dmidecode | egrep -i 'manufacturer|product|vendor|domU'
您还可以检查虚拟磁盘:
cat /proc/ide/hd*/model
Virtuozzo 通常可以通过查找/proc/vz
或来检测/dev/vzfs
。
这是一个更有用的命令:
$ 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
大多数软件检查管理程序 CPUID 叶 - Leaf 0x40000000,管理程序 CPUID 信息
EAX:管理程序 CPUID 信息 (0x40000010) 的最大输入值。
EBX、ECX、EDX:管理程序供应商 ID 签名。例如“KVMKVMKVM”
叶 0x40000010,时序信息。
EAX:(虚拟)TSC 频率,以 kHz 为单位。
EBX:(虚拟)总线(本地 apic 定时器)频率,以 kHz 为单位。
ECX、EDX:保留
当然,您仍然依赖虚拟机管理程序向您提供这些信息。它很可能决定根本不报告 0x40000000,从而导致客人相信它实际上是在真实硬件上运行