Virtual or physical?

Charly's Column – VM Detection

Article from Issue 253/2021

To write low-level scripts, as an admin, you need to know whether you are currently on a physical or a virtual machine. Charly finds out with a couple of clever hacks.

Of the systems I work on, about 90 percent are virtualized and 10 percent are legacy hardware servers. For many jobs, this makes no difference, but when I write scripts that call or change hardware-related functions, I need this information.

If I have root privileges on the system and am also allowed to retroactively install software, the problem can be solved very quickly. I install either Facter [1] or virt-what [2]. Facter provides extensive information about the system's hardware, much like lshw, and is actually overkill for answering the "virtual or not" question. Calling facter virtual returns the virtualization platform as the answer, such as vmware or kvm. The same result is returned by a call to virt-what. If I don't need the power of Facter elsewhere, I prefer the leaner virt-what.

If I have root privileges but am not allowed to install software (for example, because of restricted repositories), there is another possibility. The command

dmidecode -t system

gives me the desired information (Figure 1).

Figure 1: Dmidecode lets me quickly discover whether I'm working on a virtual machine.

But what if I don't have root privileges on the system? There are solutions for this, too, even several of them. The first is the command:

dmesg | grep DMI

On a VMware guest, the output looks like the second line of Listing 1. If I run the same command on a physical server, I usually see some information about the server model at this point (line 4).

Listing 1

Virtual or Physical?

01 $ dmesg | grep DMI
02 [    0.000000] DMI: VMware, Inc. VMware Virtual Platform/440BX Desktop Reference Platform, BIOS 6.00 05/28/2020
03 [...]
04 [    0.000000] DMI: HP ProLiant DL320e Gen8, BIOS J05 12/10/2012
06 $ cat /proc/scsi/scsi
07 Attached devices:
08 Host: scsi2 Channel: 00 Id: 00 Lun: 00
09   Vendor: QEMU  Model: QEMU HARDDISK  Rev: 2.5+
10   Type:   Direct-Access               ANSI  SCSI revision: 05
11 [...]
12 Attached devices:
13 Host: scsi2 Channel: 00 Id: 00 Lun: 00
14   Vendor: ATA  Model: SanDisk SSD PLUS  Rev: 00RL
15   Type:   Direct-Access                 ANSI  SCSI revision: 05

Another possibility is the command:

cat /proc/scsi/scsi

On a virtualized system, I would see output like that shown in lines 7 to 10 of Listing 1. The physical system, on the other hand, again responds with information about the hardware (starting in line 12).

There are quite a few other possibilities, but whenever it is technically possible, I use virt-what. It doesn't get any faster or easier than that.

The Author

Charly Kühnast manages Unix systems in a data center in the Lower Rhine region of Germany. His responsibilities include ensuring the security and availability of firewalls and the DMZ.

Buy this article as PDF

Express-Checkout as PDF
Price $2.95
(incl. VAT)

Buy Linux Magazine

Get it on Google Play

US / Canada

Get it on Google Play

UK / Australia

Related content

  • VM Admin Helpers: virt-dmesg and virt-uname

    Libguestfs developer Richard WM Jones announces new tools for virtual machine admins.

  • Virtual Performance

    Virtual performance tuning is a lot like ordinary performance tuning – but not exactly.

  • Virtualization Intro

    Good tools are half the battle – even if you are just managing virtual machines. This month we take a practical look at virtualization, and we show you a new threat to watch for in the virtual future.

  • KVM Storage

    KVM has many ways to map virtual disks on the host system. The appropriate choice of disk format has an effect not only on the speed of I/O operations but also on snapshots and backups.

  • oVirt

    The days when administrators were forced to manage virtual machines at the console are gone. Competitors of VMware and Citrix now offer equally sophisticated GUIs. One promising alternative is Red Hat’s oVirt – a free Java interface for Libvirt.

comments powered by Disqus
Subscribe to our Linux Newsletters
Find Linux and Open Source Jobs
Subscribe to our ADMIN Newsletters

Support Our Work

Linux Magazine content is made possible with support from readers like you. Please consider contributing when you’ve found an article to be beneficial.

Learn More