2

在 VM 中,操作系统提供的实时调度往往不可靠。对于我的应用程序,我希望能够检测我是否在 VM 上运行(仅限 Linux)。

所以我正在寻找一种很好的方法来检测(在 C 中)我是否处于虚拟化环境中。根据所使用的 VM,似乎使用了各种 DMI 和 CPUID 字符串。不过,我主要对通用方式感兴趣。

有人有什么想法吗?

4

8 回答 8

3

facter 和 imvirt 都会检测到一些虚拟化

于 2009-11-04T21:49:20.557 回答
2

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?

于 2009-11-05T00:37:10.897 回答
1

我认为您将不得不启发式地执行此操作。虚拟化产品的部分目标是让 vm 实例相信它在真实硬件上运行。每个虚拟化产品都将模拟特定的硬件,所以我的解决方案是创建一个库,您可以询问“我在 vm 上吗”,并在后台维护一些寻找 vm 存在的证据。这样,您仍然相对独立于检测 vm 的细节。

于 2009-11-04T21:49:34.163 回答
1

您还可以在 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
于 2012-05-30T12:03:59.310 回答
0

查找仅在您位于 VM 中时显示的特定设备。例如,标有“Parallels”或“VMWare”的显示设备可能很好地表明您在虚拟机中。

当然,这只适用于您知道的虚拟机,因此不是很通用。

于 2009-11-04T21:47:23.987 回答
0

虽然不是确定的,但您也可以检查您的接口名称... ifconfig 会吐出“venet0”而不是“eth0”

此外,'df' 会泄露一些信息:vmware - /dev/vzfs citrix/xen - /dev/xvda1

于 2011-05-11T18:47:44.973 回答
0

这是一个代码示例: http: //www.codeproject.com/KB/system/VmDetect.aspx,http : //mark.michaelis.net/Blog/HowToDetectVirtualMachineExecution.aspx(但这是从 2005 年开始的)

在一些杂志中,我读到可以使用硬件集检测到虚拟机,因为 VM 使用有限的模拟硬件集。

于 2009-11-20T08:56:02.190 回答
0

ifconfig 获取 MAC 地址,然后查找供应商代码(google:mac 地址查找)。如果您提前知道使用的是什么虚拟化平台,这会有所帮助。

于 2013-11-11T14:53:19.107 回答