An interesting question. I have logged into a Linux (most likely SuSE) host. Is there some way that I can tell programmatically that I am a VM host or not?
Also assume that the vmtools are not installed.
Server Fault is a question and answer site for system and network administrators. It only takes a minute to sign up.
Sign up to join this communityAn interesting question. I have logged into a Linux (most likely SuSE) host. Is there some way that I can tell programmatically that I am a VM host or not?
Also assume that the vmtools are not installed.
Use standard Linux tools to inspect the hardware on the system.
cat /proc/scsi/scsi
or
ethtool -i eth0
or
dmidecode | grep -i vmware
If the output of these commands shows hardware with a manufacturer name of "VMWare", you're on a VMWare VM. Multiple commands are provided here because system configurations and tools differ.
cat /proc/scsi/scsi
is nice because it seems to be available everywhere and doesn't require to install new software or run with privileged rights.
man virt-what
for the heuristic script built for this detection purpose (for RedHat/Fedora systems) and for the caveats involved.
facter virtual
xenu
indicates that it’s a VM. If it returned “physical” then the opposite is true (not a VM), eg:
facter virtual
Physical
You might be able to get and idea by looking around under /sys
. For example /sys/class/dmi/id/sys_vendor
has a value of VMware, Inc.
.
If it is installed you can use lshw. The command lshw -class system
returns this on my system:
server1
description: Computer
product: VMware Virtual Platform
vendor: VMware, Inc.
version: None
serial: VMware-...
width: 64 bits
capabilities: smbios-2.4 dmi-2.4 vsyscall64 vsyscall32
Some virtual environments name some of their virtual devices with names that are a bit tell-tale, for example, VirtualBox presenting a graphics card that calls itself "VirtualBox Display Adapter". But looking for those ties you to a particular VM and possibly a narrow range of versions.
It might be possible for your code to see what sort of virtualisation it could set up. If that fails entirely, you might be in a VM. But you just as might easily be on a box that doesn't have any VM capable hardware.
For Linux you type dmesg |grep DMI
:
[root@myhost ~]# dmesg |grep DMI DMI 2.3 present. DMI: Microsoft Corporation Virtual Machine/Virtual Machine, BIOS 090006 05/23/2012 [root@myhost ~]# dmesg |grep -i virtual DMI: Microsoft Corporation Virtual Machine/Virtual Machine, BIOS 090006 05/23/2012 Booting paravirtualized kernel on bare hardware input: Macintosh mouse button emulation as /devices/virtual/input/input1 scsi 0:0:0:0: Direct-Access Msft Virtual Disk 1.0 PQ: 0 ANSI: 4 input: Microsoft Vmbus HID-compliant Mouse as /devices/virtual/input/input4
[root@backdev1 ~]# dmesg |grep DMI DMI 2.5 present. DMI: IBM System x3650 M3 -[7945AC1]-/90Y4784, BIOS -[D6E153AUS-1.12]- 06/30/2011
There's lots of code out there to detect if you're in a VM or not. Start with red pill and search from there. This paper at Offensive Computing is also a good read.
That's if none of those easy ones above work :)
You could also search the first part of your mac address here and see if it's listed as assigned to any of the virtualization companies.
Virtual devices will also be revealed by lspci and/or disk device info in /proc:
lspci | grep -i vmware
grep -i vmware /proc/scsi/scsi /proc/ide/*/model
In Linux, system information is revealed in /sys/devices/virtual/dmi/id/ . See my answer here for a handy script to show you all the information available.
root not required.
I didn't like any of these solutions, as there's usually a VMware CDROM driver or memory driver installed so dmesg confirms or denies it for me quickly.
[server@user ~]$ dmesg |grep VMware hda: VMware Virtual IDE CDROM Drive, ATAPI CD/DVD-ROM drive Vendor: VMware Model: Virtual disk Rev: 1.0 Vendor: VMware Model: Virtual disk Rev: 1.0 Vendor: VMware Model: Virtual disk Rev: 1.0 Vendor: VMware Model: Virtual disk Rev: 1.0 Vendor: VMware Model: Virtual disk Rev: 1.0 Vendor: VMware Model: Virtual disk Rev: 1.0 Vendor: VMware Model: Virtual disk Rev: 1.0 VMware memory control driver initialized
This worked better for me as it gives me specific information about the manufacturer and the product name.
dmidecode -t system|grep 'Manufacturer\|Product'
Output on Dell server:
Manufacturer: Dell Inc.
Product Name: PowerEdge C5220
Output on Virtualbox VM:
Manufacturer: innotek GmbH
Product Name: VirtualBox
Output on KVM/QEMU:
Manufacturer: QEMU
Product Name: Standard PC (i440FX + PIIX, 1996)
This is great for scripts that can parse these out for better identification of servers... but if you use Chef in your infrastructure, you can check the node attribute Virtualization -> system
in the chef server .
Things have changed somewhat in the nearly 11 years since this was asked.
If you are using a distro with systemd installed (wrt OPs original question, SLES has used systemd since v12), systemd-detect-virt will probably work, does not need root, and produces the most script-friendly output with no further massaging required:
$ systemd-detect-virt
vmware
I like very much:
hostnamectl status
or concrete:
hostnamectl status | grep "Chassis:"
How To Check If A Linux System Is Physical Or Virtual Machine
16 Methods To Check If A Linux System Is Physical or Virtual Machine