确定虚拟化技术的简便方法


115

我可以通过命令行访问Linux计算机,该计算机可能已虚拟化,也可能未虚拟化。我想确定它运行在哪种虚拟化技术上(如果有的话)(VMWare,VirtualBox,KVM,OpenVZ,Xen等)。这不是一个敌对的环境:我不是在试图伪装自己的VM上工作,我正在诊断一个鲜为人知的不稳定服务器。

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

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


Answers:


128

dmidecode -s system-product-name

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

虚拟化技术

  • VMware工作站

    root@router:~# dmidecode -s system-product-name
    VMware Virtual Platform
    
  • 虚拟盒子

    root@router:~# dmidecode -s system-product-name
    VirtualBox
    
  • Qemu与KVM

    root@router:~# dmidecode -s system-product-name
    KVM
    
  • Qemu(模拟)

    root@router:~# dmidecode -s system-product-name
    Bochs
    
  • Microsoft虚拟PC

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

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

    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

参考文献


5
Hyper-V的返回几乎一文不值Virtual Machinedmidecode -s system-product-name。在/ dev / disk / by-id下也没有明显的内容。事实似乎是通过查看lspci输出来检测到hyperv。
Zoredache

1
打开VZ检查 /proc/user_beancounters
收益最高,2013年

/proc/user_beancounters例如,在便宜的VPS上,超过OpenVZ的+1 。
erm3nda 2015年

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

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

38

如果容器正在运行systemd

$ systemd-detect-virt
lxc

例如,在KVM上,它返回:

kvm

在非虚拟主机上:

none

也可以看看:


这也适用于openvz。
lepe

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

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

28

理想的方法

sh

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

$ sudo lshw -class system

输出量

  • 虚拟机

    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
    
  • 虚拟机

    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意味着它是虚拟机,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告诉你,你是在一个虚拟机,而你是最有可能的KVM。

dmesg

grep通过dmesg日志使用以下命令。

$ sudo dmesg | grep -i virtual
  • 虚拟机

    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
    

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

    [    0.000000] Booting paravirtualized kernel on KVM
    

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

  • Microsoft虚拟PC

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

    $ sudo dmesg | grep -i xen
    Xen virtual console successfully installed as tty1
    
  • 维尔图佐

    # 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年

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

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

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

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

16

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

喜欢从作者免责声明:

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

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

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


链接?它可以识别哪些系统?
吉尔斯2014年

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

现在包括LXC。
ewwhite

截至2016年1月,Docker失败。参见unix.stackexchange.com/a/257207/106572
Martin Bramwell,

13
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; }

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


9

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

facter virtual

无需root访问权限。

Debian主机上的Debian Guest:

[user@guest]$ facter virtual
virtualbox

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


8

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

en

$ 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

虚拟机

$ 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,Virtualization: oracle无论我没有安装任何半虚拟化,hostnamectl都可以显示。Virtualbox来宾添加
Ivanzinho

7

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

dmesg | grep "Hypervisor detected"

例如:

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

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


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

3

对于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等等。)。


3

有时很棘手:)

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

2

系统检测病毒

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

systemd-detect-virt

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

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

退出码

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



1

显然,虚拟化分为几个部分-在我的例子中是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只是返回physicalls -1 /dev/disk/by-id/返回ata-QEMU_DVD-ROM_QM00003,这表明QEMU​​参与其中,但无论如何我都无法访问仿真DVD-ROM。


1

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.