In modern times the IT employee system administrator / system engineer / security engineer or a developer who has to develop and test code remotely on UNIX hosts, we have to login to multiple of different servers located in separate data centers around the world situated in Hybrid Operating system environments running multitude of different Linux OSes. Often especially for us sysadmins it is important to know whether the remote machine we have SSHed to is physical server (Bare Metal) or a virtual machines running on top of different kind of Hypervisor node OpenXen / Virtualbox / Virtuosso / VMWare etc.
Then the question comes how to determine whether A remote Installed Linux is Physical or Virtual ?
1. Using the dmesg kernel log utility
The good old dmesg that is used to examine and control the kernel ring buffer detects plenty of useful information which gives you the info whether a server is Virtual or Bare Metal. It is present and accessible on every Linux server out there, thus using it is the best and simplest way to determine the OS system node type.
To grep whether a machine is Virtual and the Hypervisor type use:
nginx:~# dmesg | grep "Hypervisor detected"
[0.000000] Hypervisor detected: KVM
As you see above OS installed is using the KVM Virtualization technology.
An empty output of this command means the Remote OS is installed on a physical computer.
2. Detecting the OS platform the systemd way
Systemd along with the multiple over-complication of things that nearly all sysadmins (including me hate) so much introduced something useful in the fact of hostnamectl command
that could give you the info about the OS chassis platform.
root@pcfreak:~# hostnamectl status
Static hostname: pcfreak
Icon name: computer-desktop
Chassis: desktop
Machine ID: 02425d67037b8e67cd98bd2800002671
Boot ID: 34a83b9a79c346168082f7605c2f557c
Operating System: Debian GNU/Linux 10 (buster)
Kernel: Linux 4.19.0-5-amd64
Architecture: x86-64
Below is output of a VM running on a Oracle Virtualbox HV.
linux:~# hostnamectl status
Static hostname: ubuntuserver
Icon name: computer-vm
Chassis: vm
Machine ID: 2befe86cf8887ca098f509e457554beb
Boot ID: 8021c02d65dc46b1885afb25fddcf18c
Virtualization: oracle
Operating System: Ubuntu 16.04.1 LTS
Kernel: Linux 4.4.0-78-generic
Architecture: x86-64
3. Detect concrete container virtualization with systemd-detect-virt
Another Bare Metal or VM identify tool that was introducted some time ago by freedesktop project is systemd-detect-virt (usually command is part of systemd package).
It is useful to detect the exact virtualization on a systemd running OS systemd-detect-virt is capable to detect many type of Virtualization type that are rare like: IBM zvm S390 Z/VM, bochs, bhyve (a FreeBSD hypervisor), Mac OS's parallels, lxc (linux containers), docker containers, podman etc.
The output from the command is either none (if no virtualization is present or the VM Hypervisor Host type):
server:~# systemd-detect-virt
none
quake:~# systemd-detect-virt
oracle
4. Install and use facter to report per node facts
debian:~# apt-cache show facter|grep -i desc -A2
Description-en: collect and display facts about the system
Facter is Puppet’s cross-platform system profiling library. It discovers and
reports per-node facts, which are collected by the Puppet agent and are made
—
Description-md5: 88cdf9a1db3df211de4539a0570abd0a
Homepage: https://github.com/puppetlabs/facter
Tag: devel::lang:ruby, devel::library, implemented-in::ruby,
root@jeremiah:/home/hipo# apt-cache show facter|grep -i desc -A1
Description-en: collect and display facts about the system
Facter is Puppet’s cross-platform system profiling library. It discovers and
—
Description-md5: 88cdf9a1db3df211de4539a0570abd0a
Homepage: https://github.com/puppetlabs/facter
– Install facter on Debian / Ubuntu / deb based Linux
# apt install facter –yes
– Install facter on RedHat / CentOS RPM based distros
# yum install epel-release
…
# yum install facter
…
– Install facter on OpenSuSE / SLES
# zypper install facter
…
Once installed on the system to find out whether the remote Operating System is Virtual:
# facter 2> /dev/null | grep virtual
is_virtual => false
virtual => physical
If the machine is a virtual machine you will get some different output like:
# facter 2> /dev/null | grep virtual
is_virtual => true
virtual => kvm
If you're lazy to grep you can use it with argument.
# facter virtual
physical
6. Use lshw and dmidecode (list hardware configuration tool)
If you don't have the permissions to install facter on the system and you can see whether lshw (list hardware command) is not already present on remote host.
# lshw -class system
storage-host
description: Computer
width: 64 bits
capabilities: smbios-2.7 vsyscall32If the system is virtual you'll get an output similar to:
# lshw -class system
debianserver
description: Computer
product: VirtualBox
vendor: innotek GmbH
version: 1.2
serial: 0
width: 64 bits
capabilities: smbios-2.5 dmi-2.5 vsyscall32
configuration: family=Virtual Machine uuid=78B58916-4074-42E2-860F-7CAF39F5E6F5
Of course as it provides a verbosity of info on Memory / CPU type / Caches / Cores / Motherboard etc. virtualization used or not can be determined also with dmidecode / hwinfo and other tools that detect the system hardware this is described thoroughfully in my previous article Get hardware system info on Linux.
7. Detect virtualziation using virt-what or imvirt scripts
imvirt is a little script to determine several virtualization it is pretty similar to virt-what the RedHat own script for platform identification. Even though virt-what is developed for RHEL it is available on other distros, Fedoda, Debian, Ubuntu, Arch Linux (AUR) just like is imvirt.
installing both of them is with the usual apt-get / yum or on Arch Linux with yay package manager (yay -S virt-what) …
Once run the output it produces for physical Dell / HPE / Fujitsu-Siemens Bare Metal servers would be just empty string.
# virt-what
#
Or if the system is Virtual Machine, you'll get the type, for example KVM (Kernel-based Virtual Machine) / virtualbox / qemu etc.
#imvirt
Physical
Conclusion
It was explained how to do a simple check whether the server works on a physical hardware or on a virtual Host hypervisor. The most basic and classic way is with dmesg. If no access to dmesg is due to restrictions you can try the other methods for systemd enabled OSes with hostnamectl / systemd-detect-virt. Other means if the tools are installed or you have the permissions to install them is with facter / lshw or with virt-what / imvirt scripts.
There definitely perhaps much more other useful tools to grasp hardware and virtualization information but this basics could be useful enough for shell scripting purposes.
If you know other tools, please share.
More helpful Articles
Tags: Below, installed, kvm, Linux Check, oracle, servers, system administrator, system hardware, utility, virtual machines, virtualization