在 VM 中,操作系统提供的实时调度往往不可靠。对于我的应用程序,我希望能够检测我是否在 VM 上运行(仅限 Linux)。
所以我正在寻找一种很好的方法来检测(在 C 中)我是否处于虚拟化环境中。根据所使用的 VM,似乎使用了各种 DMI 和 CPUID 字符串。不过,我主要对通用方式感兴趣。
有人有什么想法吗?
在 VM 中,操作系统提供的实时调度往往不可靠。对于我的应用程序,我希望能够检测我是否在 VM 上运行(仅限 Linux)。
所以我正在寻找一种很好的方法来检测(在 C 中)我是否处于虚拟化环境中。根据所使用的 VM,似乎使用了各种 DMI 和 CPUID 字符串。不过,我主要对通用方式感兴趣。
有人有什么想法吗?
facter 和 imvirt 都会检测到一些虚拟化
It seems that the real question you want answered is "Is real-time scheduling working unreliably?". So why not write a test that checks for that?
我认为您将不得不启发式地执行此操作。虚拟化产品的部分目标是让 vm 实例相信它在真实硬件上运行。每个虚拟化产品都将模拟特定的硬件,所以我的解决方案是创建一个库,您可以询问“我在 vm 上吗”,并在后台维护一些寻找 vm 存在的证据。这样,您仍然相对独立于检测 vm 的细节。
您还可以在 scsi 设备中查找 VMware:
cat /proc/scsi/scsi | grep VMware
可能只会在虚拟机上成功
VM 上的示例输出:
# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: VMware Model: Virtual disk Rev: 1.0
Type: Direct-Access ANSI SCSI revision: 02
Host: scsi0 Channel: 00 Id: 01 Lun: 00
Vendor: VMware Model: Virtual disk Rev: 1.0
Type: Direct-Access ANSI SCSI revision: 02
真机上的示例输出:
# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
Vendor: TSSTcorp Model: CDRW/DVD TSL462D Rev: DE01
Type: CD-ROM ANSI SCSI revision: 05
Host: scsi6 Channel: 00 Id: 08 Lun: 00
Vendor: DP Model: BACKPLANE Rev: 1.05
Type: Enclosure ANSI SCSI revision: 05
Host: scsi6 Channel: 02 Id: 00 Lun: 00
Vendor: DELL Model: PERC 5/i Rev: 1.03
Type: Direct-Access ANSI SCSI revision: 05
查找仅在您位于 VM 中时显示的特定设备。例如,标有“Parallels”或“VMWare”的显示设备可能很好地表明您在虚拟机中。
当然,这只适用于您知道的虚拟机,因此不是很通用。
虽然不是确定的,但您也可以检查您的接口名称... ifconfig 会吐出“venet0”而不是“eth0”
此外,'df' 会泄露一些信息:vmware - /dev/vzfs citrix/xen - /dev/xvda1
这是一个代码示例: http: //www.codeproject.com/KB/system/VmDetect.aspx,http : //mark.michaelis.net/Blog/HowToDetectVirtualMachineExecution.aspx(但这是从 2005 年开始的)
在一些杂志中,我读到可以使用硬件集检测到虚拟机,因为 VM 使用有限的模拟硬件集。
ifconfig 获取 MAC 地址,然后查找供应商代码(google:mac 地址查找)。如果您提前知道使用的是什么虚拟化平台,这会有所帮助。