在VM中,OS提供的实时调度往往不可靠。对于我的应用程序,我希望能够检测我是否在VM上运行(仅限Linux)。
所以我正在寻找一种很好的方法来检测(在C中)我是否处于虚拟化环境中。根据所使用的VM,似乎使用了各种DMI和CPUID字符串。我主要对通用方法感兴趣。
有人有任何想法吗?
答案 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.aspx,http://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)。如果您事先知道使用了什么虚拟化平台,那就有帮助。