【问题标题】:Looking for a nice way to detect if I am running in a Virtual Machine (Linux)寻找一种检测我是否在虚拟机 (Linux) 中运行的好方法
【发布时间】:2009-11-04 21:45:34
【问题描述】:

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

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

有人有什么想法吗?

【问题讨论】:

  • 只有启发式存在。接受它并继续前进。
  • 这里也是我今天发现的一个 Ubuntu 包。它被称为 imvirt。在micky.ibh.net/~liske/imvirt.html 看看它。认为它可能会有所帮助,尽管它在 PERL 中。

标签: c linux virtual-machine vmware kvm


【解决方案1】:

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

【讨论】:

  • 而且似乎至少有第三种工具可以做到这一点:virt-what 看看这些项目是如何做到的
  • 在 C 语言中使用这些都不是很好
  • 没错,这就是为什么我添加了“看看那些项目是如何做到的”
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      您也可以在 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
      

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • DMI 和 CPUID 对这类东西更有用。但是这些命令已经很糟糕了,因为它们是启发式的。
        【解决方案6】:

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

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

        【讨论】:

          【解决方案7】:

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

          另外,'df' 会给出一些提示: vmware - /dev/vzfs 思杰/xen - /dev/xvda1

          【讨论】:

            【解决方案8】:

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

            【讨论】:

              猜你喜欢
              • 2015-03-11
              • 1970-01-01
              • 2010-10-04
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2014-05-19
              • 1970-01-01
              相关资源
              最近更新 更多