确定Linux机器虚拟化技术的简单方法?

Gil*_*il' 124 linux command-line virtual-machine

我可以通过命令行访问 Linux 机器,该机器可能已虚拟化,也可能未虚拟化。我想确定它运行在哪种虚拟化技术上,如果有的话(VMWare、VirtualBox、KVM、OpenVZ、Xen 等)。这不是一个充满敌意的环境:我不是试图与试图伪装自己的 VM 对抗,我正在诊断一个我知之甚少的脆弱服务器。

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

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

Rah*_*til 135

dmidecode -s system-product-name

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

虚拟化技术

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

/dev/disk/by-id

如果您没有运行权限,dmidecode则可以使用:

虚拟化技术:QEMU

ls -1 /dev/disk/by-id/
Run Code Online (Sandbox Code Playgroud)

输出

[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
Run Code Online (Sandbox Code Playgroud)

参考

  • Hyper-V 为“dmidecode -s system-product-name”返回一个几乎毫无价值的“Virtual Machine”。/dev/disk/by-id 下也没有任何明显的东西。factor 似乎通过查看 lspci 输出来检测 hyperv。 (5认同)
  • 使用 qemu 2.5.0(至少),`dmidecode -s system-product-name` 返回通用硬件描述,而不是上面显示的“KVM”或“Bochs”。对我来说,这个字符串是“Standard PC (i440FX + PIIX, 1996)”。`dmidecode -s system-manufacturer` 返回远不那么通用的字符串 `QEMU`。由于 qemu 允许提供 DMI 数据,我怀疑 dmidecode 相对容易被愚弄 - 无论读取的字段如何。 (4认同)

sta*_*fry 49

如果容器正在运行systemd

$ systemd-detect-virt
lxc
Run Code Online (Sandbox Code Playgroud)

例如在 KVM 上,它返回:

kvm
Run Code Online (Sandbox Code Playgroud)

在非虚拟化主机上:

none
Run Code Online (Sandbox Code Playgroud)

也可以看看:


slm*_*slm 29

理想的方法

小白

此命令在各种 VM 技术来宾上生成以下输出。

$ sudo lshw -class system
Run Code Online (Sandbox Code Playgroud)

输出

  • KVM

    mungr                     
        description: Computer
        product: KVM
        vendor: Red Hat
        width: 64 bits
        capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32
    
    Run Code Online (Sandbox Code Playgroud)
  • 虚拟盒子

    fedora17                  
        description: Computer
        product: VirtualBox ()
        vendor: innotek GmbH
        version: 1.2
        serial: 0
        width: 64 bits
        capabilities: smbios-2.5 dmi-2.5 vsyscall32
    
    Run Code Online (Sandbox Code Playgroud)
  • 虚拟机

    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
    
    Run Code Online (Sandbox Code Playgroud)

脚本编写

如果您使用的是 Ubuntu/Debian,open-vm-tools则可以安装该软件包。它提供vmware-checkvm. 它只返回一个数字。A0表示它是一个虚拟机,a1表示它是一个物理系统。

不太理想的方法

如果是 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
Run Code Online (Sandbox Code Playgroud)

工具

$ 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
Run Code Online (Sandbox Code Playgroud)

virtio_net 是 KVM 的一部分。该/proc/scsi/scsi告诉你,你是在一个虚拟机,而你是最有可能的KVM。

消息

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

$ sudo dmesg | grep -i virtual
Run Code Online (Sandbox Code Playgroud)

参考


eww*_*ite 16

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

喜欢从作者免责声明:

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

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

脚本检测到的事实在此处列出,但可以轻松扩展到边缘情况。


Joh*_*man 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; }
Run Code Online (Sandbox Code Playgroud)

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


小智 13

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
Run Code Online (Sandbox Code Playgroud)

$ 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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)


Jos*_* R. 9

如果你让你帮助安装的人facter,你可以做

facter virtual
Run Code Online (Sandbox Code Playgroud)

不需要root访问权限。

Debian 主机上的 Debian 来宾:

[user@guest]$ facter virtual
virtualbox
Run Code Online (Sandbox Code Playgroud)

我不能保证它与 Xen/KVM/Qemu 的配合效果如何......


Rus*_*uss 7

在“最近”的 linux 内核中,内核会为您检测管理程序并打印一条消息,该消息可通过dmesg. 这将简单地告诉您:

dmesg | grep "Hypervisor detected"
Run Code Online (Sandbox Code Playgroud)

例如:

$ dmesg | grep "Hypervisor detected"
Hypervisor detected: VMware
Run Code Online (Sandbox Code Playgroud)

至于“最近”是什么意思,我不清楚它是在哪个内核版本中正式发布的,但在代码库中引入此功能的提交是在 2010 年 5 月 7 日。请参阅此处


Owe*_*ing 6

systemd-检测-virt

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

systemd-detect-virt
Run Code Online (Sandbox Code Playgroud)

机器虚拟化和容器虚拟化的区别

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

退出代码

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