一个有趣的问题。 我已经login到一个Linux(最有可能的SuSE)主机。 有什么方法可以通过编程方式告诉我是否是VM主机?
另外假定vmtools没有安装。
使用标准的Linux工具来检查系统上的硬件。
cat /proc/scsi/scsi
要么
ethtool -i eth0
要么
dmidecode | grep -i vmware
如果这些命令的输出显示的是制造商名称为“VMWare”的硬件,则表示您在VMWare VM上。 这里提供了多个命令,因为系统configuration和工具有所不同。
facter virtual xenu
表示这是一个虚拟机。 如果它返回“物理”,则情况正好相反(不是虚拟机),例如:
facter virtual Physical
有一个方便的应用程序,可能有助于称为德什么 。 我没有使用它与VMWare,但它确实与Qemu很好地工作。
您可以通过在/sys
下查看来获得和想法。 例如, /sys/class/dmi/id/sys_vendor
具有VMware, Inc.
.的值。
如果安装了,你可以使用lshw 。 命令lshw -class system
在我的系统上返回这个:
server1 description: Computer product: VMware Virtual Platform vendor: VMware, Inc. version: None serial: VMware-... width: 64 bits capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32
一些虚拟环境命名了一些虚拟设备,名称有些简单,例如,VirtualBox提供一个自称为“VirtualBox显示适配器”的graphics卡。 但是寻找那些与特定的虚拟机有关系,可能还有一个很窄的版本。
您的代码可能会看到可以设置的虚拟化types。 如果完全失败,你可能会在虚拟机中。 但是,你可能很容易就在没有任何虚拟机硬件的盒子上。
对于Linux,inputdmesg |grep DMI
:
[root @ myhost〜]#dmesg | grep DMI DMI 2.3存在。 DMI:Microsoft Corporation虚拟机/虚拟机,BIOS 090006 05/23/2012 [root @ myhost〜]#dmesg | grep -i virtual DMI:Microsoft Corporation虚拟机/虚拟机,BIOS 090006 05/23/2012 在裸机上启动半虚拟化内核 input:Macintosh鼠标button仿真为/ devices / virtual / input / input1 scsi 0:0:0:0:直接访问Msft虚拟磁盘1.0 PQ:0 ANSI:4 input:Microsoft Vmbus HID兼容鼠标作为/ devices / virtual / input / input4
[root @ backdev1〜]#dmesg | grep DMI DMI 2.5存在。 DMI:IBM System x3650 M3 - [7945AC1] - / 90Y4784,BIOS - [D6E153AUS-1.12] - 06/30/2011
有很多代码可以检测你是否在虚拟机中。 从红丸开始,从那里search。 这篇论文在Offensive Computing上也是一个很好的阅读。
那就是如果没有那些简单的工作:)
您也可以在这里search您的mac地址的第一部分,看看它是否被列为分配给任何虚拟化公司。
虚拟设备也将通过/ proc中的lspci和/或磁盘设备信息显示:
lspci | grep -i vmware grep -i vmware /proc/scsi/scsi /proc/ide/*/model
我不喜欢这些解决scheme,因为通常会安装VMware CDROM驱动程序或内存驱动程序,以便dmesg能够快速确认或拒绝它。
[server @ user〜] $ dmesg | grep VMware hda:VMware虚拟IDE CDROM驱动器,ATAPI CD / DVD-ROM驱动器 供应商:VMware型号:虚拟磁盘修订版:1.0 供应商:VMware型号:虚拟磁盘修订版:1.0 供应商:VMware型号:虚拟磁盘修订版:1.0 供应商:VMware型号:虚拟磁盘修订版:1.0 供应商:VMware型号:虚拟磁盘修订版:1.0 供应商:VMware型号:虚拟磁盘修订版:1.0 供应商:VMware型号:虚拟磁盘修订版:1.0 VMware内存控制驱动程序初始化
在Linux中,系统信息显示在/ sys / devices / virtual / dmi / id /中。 在这里看到我的答案是一个方便的脚本来显示所有可用的信息。
根不是必需的。
这对我来说更好,因为它给了我关于制造商和产品名称的具体信息。
dmidecode -t system|grep 'Manufacturer\|Product'
戴尔服务器上的输出:
Manufacturer: Dell Inc. Product Name: PowerEdge C5220
在Virtualbox VM上输出:
Manufacturer: innotek GmbH Product Name: VirtualBox
KVM / QEMU输出:
Manufacturer: QEMU Product Name: Standard PC (i440FX + PIIX, 1996)
这对于可以parsing这些以更好地识别服务器的脚本来说非常好,但是如果您在基础架构中使用Chef,则可以检查厨师服务器中的节点属性Virtualization -> system
。