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.
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.
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.
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
There is a handy app that might help called virt-what. I haven't used it with VMWare, but it did work nicely with Qemu.
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 :)
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
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 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 .
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