更准确地说,我在帮助某人诊断问题,我没有掌舵。因此,我必须传达“复制粘贴此命令”之类的指令,而不是“在某个地方戳
/proc
”。理想情况下,它将类似于lshw
:易于安装(如果未预先安装)的命令,该命令会四处查找并打印出相关信息。确定此系统可能采用的虚拟化技术的最简单方法是什么成为客人吗?如果提案提到可以最终检测出哪些技术(包括裸机)并且可以最终消除哪些技术,我将不胜感激。我对Linux最感兴趣,但是如果它也可以用于其他unices,那就很好了。
#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/scsi
和ethtool
选项显示如下: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 HARDDISK
,QEMU 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 vendor
和Virtualization type
。
评论
相关:superuser.com/questions/425878/…| serverfault.com/questions/179105/…