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 上进行了测试。其他人也添加了他们熟悉的其他平台。
VMware工作站
root@router:~# dmidecode -s system-product-name
VMware Virtual Platform
Run Code Online (Sandbox Code Playgroud)虚拟盒子
root@router:~# dmidecode -s system-product-name
VirtualBox
Run Code Online (Sandbox Code Playgroud)带 KVM 的 Qemu
root@router:~# dmidecode -s system-product-name
KVM
Run Code Online (Sandbox Code Playgroud)Qemu(模拟)
root@router:~# dmidecode -s system-product-name
Bochs
Run Code Online (Sandbox Code Playgroud)微软虚拟PC
root@router:~# dmidecode | egrep -i 'manufacturer|product'
Manufacturer: Microsoft Corporation
Product Name: Virtual Machine
Run Code Online (Sandbox Code Playgroud)维图佐
root@router:~# dmidecode
/dev/mem: Permission denied
Run Code Online (Sandbox Code Playgroud)森
root@router:~# dmidecode | grep -i domU
Product Name: HVM domU
Run Code Online (Sandbox Code Playgroud)在裸机上,这将返回计算机或主板型号的标识。
/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)
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/scsi和ethtool选项显示如下:
$ 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)
虚拟机
VMware vmxnet virtual NIC driver
Vendor: VMware Model: Virtual disk Rev: 1.0
hda: VMware Virtual IDE CDROM Drive, ATAPI CD/DVD-ROM drive
Run Code Online (Sandbox Code Playgroud)QEmu 或 KVM
如果"-cpu host"未使用该选项,QEmu 和 KVM 会将自己标识为:
CPU: AMD QEMU Virtual CPU version 0.9.1 stepping 03
Run Code Online (Sandbox Code Playgroud)
否则,主机的 CPU 信息将在dmesg或 中使用/proc/cpuinfo。但是,您应该会看到如下内容:
[ 0.000000] Booting paravirtualized kernel on KVM
Run Code Online (Sandbox Code Playgroud)
在了解它们在半虚拟化下运行的较新内核中。
微软虚拟PC
hda: Virtual HD, ATA DISK drive
hdc: Virtual CD, ATAPI CD/DVD-ROM drive
Run Code Online (Sandbox Code Playgroud)森
$ sudo dmesg | grep -i xen
Xen virtual console successfully installed as tty1
Run Code Online (Sandbox Code Playgroud)维图佐
# 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
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)
如果你让你帮助安装的人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 的配合效果如何......
在“最近”的 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 日。请参阅此处。
这将检测所使用的虚拟化技术的类型,并将其输出。
systemd-detect-virt
Run Code Online (Sandbox Code Playgroud)
使用--container和--vm选项来限制检测到的虚拟化类型。
如果您只想知道是否检测到虚拟化,而不了解具体信息,那么检查退出代码会更容易。如果检测到虚拟化,它将返回退出代码 0,否则返回非零。