我可以通过命令行访问可以虚拟化或可以不虚拟化的Linux机器。我想确定它运行在哪种虚拟化技术上(如果有的话)(VMWare,VirtualBox,KVM,OpenVZ,Xen等)。这不是一个恶劣的环境:我不是要与试图伪装自己的VM对抗,而是要诊断一个我鲜为人知的不稳定服务器。

更准确地说,我在帮助某人诊断问题,我没有掌舵。因此,我必须传达“复制粘贴此命令”之类的指令,而不是“在某个地方戳/proc”。理想情况下,它将类似于lshw:易于安装(如果未预先安装)的命令,该命令会四处查找并打印出相关信息。

确定此系统可能采用的虚拟化技术的最简单方法是什么成为客人吗?如果提案提到可以最终检测出哪些技术(包括裸机)并且可以最终消除哪些技术,我将不胜感激。我对Linux最感兴趣,但是如果它也可以用于其他unices,那就很好了。

评论

相关:superuser.com/questions/425878/…| serverfault.com/questions/179105/…

#1 楼

dmidecode -s system-product-name

我已经在Vmware工作站,VirtualBox,带有KVM的QEMU,带有Ubuntu作为来宾OS的独立QEMU上进行了测试。其他人也添加了他们熟悉的其他平台。

虚拟化技术



VMware Workstation

root@router:~# dmidecode -s system-product-name
VMware Virtual Platform



VirtualBox

root@router:~# dmidecode -s system-product-name
VirtualBox



带KVM的Qemu

root@router:~# dmidecode -s system-product-name
KVM



Qemu(模拟)

root@router:~# dmidecode -s system-product-name
Bochs



Microsoft VirtualPC

root@router:~# dmidecode | egrep -i 'manufacturer|product'
Manufacturer: Microsoft Corporation
Product Name: Virtual Machine



Virtuozzo

root@router:~# dmidecode
/dev/mem: Permission denied



Xen

root@router:~# dmidecode | grep -i domU
Product Name: HVM domU




在裸机上,这将返回计算机或主板型号的标识。

/dev/disk/by-id

如果您无权运行dmidecode,则可以使用:

虚拟化技术:QEMU

ls -1 /dev/disk/by-id/


输出

[root@host-7-129 ~]# ls -1 /dev/disk/by-id/
ata-QEMU_DVD-ROM_QM00003
ata-QEMU_HARDDISK_QM00001
ata-QEMU_HARDDISK_QM00001-part1
ata-QEMU_HARDDISK_QM00002
ata-QEMU_HARDDISK_QM00002-part1
scsi-SATA_QEMU_HARDDISK_QM00001
scsi-SATA_QEMU_HARDDISK_QM00001-part1
scsi-SATA_QEMU_HARDDISK_QM00002
scsi-SATA_QEMU_HARDDISK_QM00002-part1


参考文献


如何在dmo.ca中检测虚拟化


评论


Hyper-V为dmidecode -s系统产品名称返回了几乎一文不值的虚拟机。在/ dev / disk / by-id下也没有明显的内容。事实似乎是通过查看lspci输出来检测到hyperv。

– Zoredache
2013年9月6日23:39

打开VZ检查/ proc / user_beancounters

– exussum
2013年9月7日12:45



例如,在便宜的VPS上,通过OpenVZ可以为/ proc / user_beancounters +1。

– m3nda
2015年1月21日,下午2:37

dmidecode和/ dev / disk / by-id解决方案都在Docker容器中失败。参见unix.stackexchange.com/a/257207/106572

–马丁·布拉姆威尔
16年1月23日在17:35

对于qemu 2.5.0(至少),dmidecode -s系统产品名称返回通用硬件描述,而不是上面显示的“ KVM”或“ Bochs”。对我来说,这个字符串是Standard PC(i440FX + PIIX,1996)。 dmidecode -s system-manufacturer返回的通用字符串QEMU少得多。由于qemu允许提供DMI数据,因此我怀疑dmidecode相对容易弄傻-不管正在读取的字段如何。

–马克
16-2-26在22:46

#2 楼

如果容器正在运行systemd:例如,在KVM上,它返回:

$ systemd-detect-virt
lxc


,然后在非虚拟主机:

kvm


另请参见:


systemd-detect-virt(1)
检测虚拟化


评论


这也适用于openvz。

–lepe
16年6月8日在3:23

它为Google Compute Engine输出kvm,这就是我试图找出的结果。谢谢!

–snetch
16-10-19在20:00

简单的命令在Ubuntu 18.04上像超级按钮一样工作!非常感谢 :)

–develCuy
18/12/3在3:49



如果您只想知道您是在虚拟机上还是不在使用systemd-detect-virt,则可以使用退出代码。 VM代表0,“裸机”代表1

– thejinx0r
20-10-1在22:14

#3 楼

理想的方法

lshw

此命令在各种VM技术客户机上产生以下输出。

$ sudo lshw -class system


输出



KVM

mungr                     
    description: Computer
    product: KVM
    vendor: Red Hat
    width: 64 bits
    capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32



虚拟盒

fedora17                  
    description: Computer
    product: VirtualBox ()
    vendor: innotek GmbH
    version: 1.2
    serial: 0
    width: 64 bits
    capabilities: smbios-2.5 dmi-2.5 vsyscall32



VMWare

partedmagic
    description: Computer
    product: VMware Virtual Platform ()
    vendor: VMware, Inc.
    version: None
    serial: VMware-56 4d 94 a0 53 e3 f3 c6-f9 a6 eb 1a 89 70 04 57
    width: 32 bits
    capabilities: smbios-2.4 dmi-2.4 smp-1.4 smp



脚本编写

如果您使用的是Ubuntu / Debian,可以安装软件包open-vm-tools。它提供vmware-checkvm。它仅返回一个数字。 0表示它是VM,1表示它是物理系统。

缺少理想的方法

如果是KVM,则/proc/scsi/scsiethtool选项显示如下:

SCSI

$ cat /proc/scsi/scsi 
Attached devices:
Host: scsi1 Channel: 00 Id: 00 Lun: 00
  Vendor: QEMU     Model: QEMU DVD-ROM     Rev: 0.9.
  Type:   CD-ROM                           ANSI  SCSI revision: 05


ethtool

$ ethtool -i eth0
driver: virtio_net
version: 
firmware-version: 
bus-info: virtio0
supports-statistics: no
supports-test: no
supports-eeprom-access: no
supports-register-dump: no
supports-priv-flags: no


virtio_net是KVM的一部分。 /proc/scsi/scsi告诉您您正在使用VM,并且很可能是KVM。

dmesg

使用以下命令grep遍历dmesg日志。 br />
$ sudo dmesg | grep -i virtual




VMWare

VMware vmxnet virtual NIC driver
 Vendor: VMware    Model: Virtual disk      Rev: 1.0 
hda: VMware Virtual IDE CDROM Drive, ATAPI CD/DVD-ROM drive



QEmu或KVM

如果未使用"-cpu host"选项,则QEmu和KVM会将自己标识为:

CPU: AMD QEMU Virtual CPU version 0.9.1 stepping 03


否则,将使用主机的CPU信息既可以在dmesg中,也可以在/proc/cpuinfo中。但是,您应该看到类似以下内容的东西:

[    0.000000] Booting paravirtualized kernel on KVM


在较新的内核中,它们了解它们在半虚拟化下运行。



Microsoft VirtualPC

hda: Virtual HD, ATA DISK drive
hdc: Virtual CD, ATAPI CD/DVD-ROM drive



Xen

$ sudo dmesg | grep -i xen
Xen virtual console successfully installed as tty1



Virtuozzo

# method #1
$ sudo dmesg
(returns no output)

# method #2
$ sudo cat /var/log/dmesg
(returns no output)

# method #3
$ sudo ls -al /proc/vz
veinfo  veinfo_redir  veredir  vestat  vzaquota  vzdata



参考文献



评论


我希望避免这种对驱动程序的嘲笑:每种VM技术都会有所不同,具体取决于设置。 lshw -class system和dmidecode报告的产品名称正是我希望找到的名称。

–吉尔斯'所以-不再是邪恶的'
2013年9月6日22:58在

@Gilles-是的,我并不是说要您实际使用它们,只是要捕获方法。我现在提出一个Virtual Box和VMWare实例,以确认这些平台的lshw输出。给我几分钟,我将更新A。

–slm♦
2013年9月6日23:08



@Gilles-看起来lshw可以完成所有技术的工作。我已将答案移到了答案的底部,这不是您要查找的内容,这样其他人就不必跳过它们。

–slm♦
2013年9月7日在1:22



dmesg用各种东西填充固定大小的环形缓冲区。这完全不适合此任务。参见unix.stackexchange.com/a/257207/106572

–马丁·布拉姆威尔
16年1月23日在17:43

@Martin-这就是为什么它在我的答案中不那么理想的部分。我通常会编写包含所有内容的答案,并显示各种方法。

–slm♦
16年1月23日在17:55



#4 楼

virt-what脚本似乎可以很好地覆盖大多数情况...

我确实喜欢作者的免责声明:

大多数时候,使用此程序是错误的事情做。相反,您应该检测实际要使用的特定功能。

作为默认安装的一部分,它在过去几年出现在我的EL5和EL6系统上。 Ubuntu拥有它,并且源也可用。

此处列出了脚本检测到的事实,但可以很容易地扩展以适用于极端情况。

评论


链接?它可以识别哪些系统?

–吉尔斯'所以-不再是邪恶的'
2014年3月23日13:50

@Gilles编辑:但是该脚本通常可以检测KVM,Xen,QEMU,VirtualBox,Parallels,OpenVZ,IBM System Z,LPAR,z / VM,Hitachi Virtage,VMWare,Microsoft Hyper-V。嗯...应该包括LXC吗?

–ewwhite
2014年3月23日14:34

现在包括LXC。

–ewwhite
2015年5月4日13:24

截至2016年1月,它在Docker上失败了。参见unix.stackexchange.com/a/257207/106572

–马丁·布拉姆威尔
16年1月23日在17:26

#5 楼

isVMware() { [[ $(dmidecode -s system-manufacturer) = 'VMware, Inc.' ]]; }
isXen   () { [[ $(dmidecode -s system-manufacturer) = 'Xen'          ]]; }
isKVM   () { [[ $(dmidecode -s system-product-name) = 'KVM'          ]]; }
isVBox  () { [[ $(dmidecode -s system-product-name) = 'VirtualBox'   ]]; }
isVM    () { isVMware || isXen || isKVM || isVBox; }


这些是我们公司使用的测试。

#6 楼

如果找到帮助的人安装facter,则可以执行

facter virtual


不需要root访问权限。

Debian上的Debian Guest主持人:

[user@guest]$ facter virtual
virtualbox


我不能保证Xen / KVM / Qemu可以很好地工作...

#7 楼

hostnamectl是您的朋友(需要systemd)。

几个示例:

没有任何虚拟化功能的笔记本电脑

$ hostnamectl status
   Static hostname: earth.gangs.net
         Icon name: computer-laptop
           Chassis: laptop
        Machine ID: 18a0752e1ccbeef09da51ad17fab1f1b
           Boot ID: beefdc99969e4a4a8525ff842b383c62
  Operating System: Ubuntu 16.04.2 LTS
            Kernel: Linux 4.4.0-66-generic
      Architecture: x86-64


Xen

$ hostnamectl status
   Static hostname: pluto.gangs.net
         Icon name: computer-vm
           Chassis: vm
        Machine ID: beef39aebbf8ba220ed0438b54497609
           Boot ID: beefc71e97ed48dbb436a470fe1920e1
    Virtualization: xen
  Operating System: Ubuntu 16.04.2 LTS
            Kernel: Linux 3.13.0-37-generic
      Architecture: x86-64


OpenVZ

$ hostnamectl status
   Static hostname: mars.gangs.net
         Icon name: computer-container
           Chassis: container
        Machine ID: 55296cb0566a4aaca10b8e3a4b28beef
           Boot ID: 1bb259b0eb064d9eb8a22d112211beef
    Virtualization: openvz
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 2.6.32-042stab120.16
      Architecture: x86-64


KVM

$ hostnamectl status
   Static hostname: mercury.gangs.net
         Icon name: computer-vm
           Chassis: vm
        Machine ID: beeffefc50ae499881b024c25895ec86
           Boot ID: beef9c7662a240b3b3b04cef3d1518f0
    Virtualization: kvm
  Operating System: CentOS Linux 7 (Core)
       CPE OS Name: cpe:/o:centos:centos:7
            Kernel: Linux 3.10.0-514.10.2.el7.x86_64
      Architecture: x86-64


评论


操作系统如何确定它是否在虚拟机中运行?它不应该,我已经从命令行安装了一个非常基本的debian,并且hostnamectl显示了Virtualization:oracle,无论我是否未安装任何准虚拟化。 Virtualbox来宾添加

–伊万津尼奥
18-10-23在3:51

#8 楼

在“最近”的Linux内核中,内核会为您检测到虚拟机管理程序并打印一条消息,该消息可通过dmesg轻松获得。这将简单地告诉您:

dmesg | grep "Hypervisor detected"


例如:

$ dmesg | grep "Hypervisor detected"
Hypervisor detected: VMware


关于“最近”的含义,目前尚不清楚它正式发布在哪个内核版本中,但是在代码库中引入此功能的提交是在2010年5月7日。请参见此处。

评论


dmesg用各种东西填充固定大小的环形缓冲区。这完全不适合此任务。参见unix.stackexchange.com/a/257207/106572

–马丁·布拉姆威尔
16年1月23日在17:44

#9 楼

对于VirtualBox,您可以lspci | grep -i virtualbox,它给出:

$ lspci | grep -i virtualbox
00:02.0 VGA compatible controller: InnoTek Systemberatung GmbH VirtualBox Graphics Adapter
00:04.0 System peripheral: InnoTek Systemberatung GmbH VirtualBox Guest Service


或者,dmidecode -s system-product-name(如@Rahul Patil所建议的)甚至更直接(但需要root):

$ sudo dmidecode -s system-product-name
VirtualBox


对于非KVM QEMU,dmidecode -s system-product-name令人困惑地返回Bochs,但是dmesg | grep -i qemu可以正常工作(QEMU模拟的存储设备通常具有QEMU HARDDISKQEMU DVD-ROM等名称)。 。

#10 楼

有时很棘手:)

root@server:~# dmidecode -s system-product-name
Bochs

root@server:~# dmidecode | egrep -i 'manufacturer|product|vendor'
        Vendor: Bochs
        Manufacturer: Bochs
        Product Name: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs
        Manufacturer: Bochs

root@server:~# virt-what
root@server:~# dpkg -l |grep virt-what
ii  virt-what                           1.2-1                        detect if we are running in a virtual machine

root@server:~# egrep -i 'virtual|vbox' /var/log/dmesg
[    0.000000] Booting paravirtualized kernel on KVM
[    0.385701] input: Macintosh mouse button emulation as /devices/virtual/input/input0


#11 楼

systemd-detect-virt

这将检测所使用的虚拟化技术的类型并输出。

systemd-detect-virt


区分机器虚拟化和容器虚拟化

使用--container--vm选项限制检测到的虚拟化类型。

退出代码

如果您只想知道是否是否检测到虚拟化(没有具体说明),则更容易检查退出代码。如果检测到虚拟化,它将返回退出代码0,否则将返回非零。



#12 楼

显然,虚拟化分为几个部分-在我的例子中是QEMU,Bochs和KVM(然后是Ubuntu 14.04)。我发现发现正在使用的管理程序的最简单方法是:

sudo apt-get install virt-what
sudo virt-what


以我为例返回的只是kvm,这是我正在寻找的基本信息(也是OP我认为),因为它告诉我可以做什么(例如,运行ipset阻止DDoS攻击)以及如何在VM之间共享资源。

另外,我尝试了

sudo dmidecode -s system-product-name




sudo lshw -class system


都没有提到KVM,但是它们都告诉我我的硬件仿真是由Bochs提供的,我坦白地说,我什至没有听说过,但是快速搜索发现了有趣的信息(http://en.wikipedia.org/wiki/Bochs)。 lshw命令比dmidecode更具信息性(例如,告诉我它是64位的)。

其他答案并没有真正告诉我任何有用的信息-facter virtual刚刚返回physical,而ls -1 /dev/disk/by-id/返回了ata-QEMU_DVD-ROM_QM00003,这表明QEMU​​参与其中,但我仍然无法访问仿真DVD-ROM。 />

#13 楼

Debian附带了一个用于检测虚拟化类型的小型软件包:

$ sudo apt-get install virt-what
$ virt-what


,由于与Perl的依赖关系,它略大一些:

$ sudo apt-get install imvirt
$ imvirt


按常规运行:

free
cat /proc/meminfo
cat /proc/cpuinfo
dmesg
htop
lshw
dmidecode
lsmod
hwinfo


评论


你殴打我使我无能为力,而我却不知道什么是美德。您能否将两者的输出都作为以前的答案进行详细说明以改善您的帖子?

– Rui F Ribeiro
17年3月15日在7:04

#14 楼

例如,如何在linux-test-project中解决此问题。
对于那些需要C代码的人来说可能很有用,理想情况下无需太多依赖。


首先它尝试外部依赖性systemd-detect-virt

,然后通过/proc/xen/sys/hypervisor/type检测到XEN,对于KVM,它会检查"QEMU Virtual CPU"中的/proc/cpuinfo并注意,它不适用于自定义-cpu值,因为存在没有简单,合理或可靠的方法来解决这些问题。

=>大多数工作都是通过systemd-detect-virt完成的。 src / detect-virt / detect-virt.c显示了如何检测其他虚拟化技术。

#15 楼

我通常使用util-linux软件包中的lscpu。它报告Hypervisor vendorVirtualization type