寻找一种很好的方法来检测我是否在虚拟机中运行(Linux)

时间:2009-11-04 21:45:34

标签: c linux virtual-machine vmware kvm

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

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

有人有任何想法吗?

8 个答案:

答案 0 :(得分:3)

facter和imvirt都将检测一些虚拟化

答案 1 :(得分:2)

您想要回答的真正问题似乎是“实时调度工作是否不可靠?”。那么为什么不写一个检查那个的测试?

答案 2 :(得分:1)

我认为你将不得不以启发的方式做到这一点。虚拟化产品的部分目标是让vm实例相信它在真实硬件上运行。每个虚拟化产品都将模拟特定的硬件,所以我的解决方案是建立一个你可以问“我是否在虚拟机上”的库,并且只需要查看vm存在的证据。通过这种方式,您仍然可以保持相对独立于检测vm的细节。

答案 3 :(得分:1)

您还可以在scsi设备中查找VMware:

cat /proc/scsi/scsi | grep VMware

可能仅在VM上成功


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

答案 4 :(得分:0)

查找仅在您处于VM中时显示的特定设备。例如,标记为“Parallels”或“VMWare”的显示设备可能是您在VM中的良好指示。

当然,这仅适用于您了解的虚拟机,因此不是非常通用。

答案 5 :(得分:0)

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

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

答案 6 :(得分:0)

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

另外,'df'会给出一些说法: vmware - / dev / vzfs citrix / xen - / dev / xvda1

答案 7 :(得分:0)

ifconfig获取MAC地址,然后查找供应商代码(google:mac address lookup)。如果您事先知道使用了什么虚拟化平台,那就有帮助。

相关问题