How to determine Linux guest VM virtualization technology

I

have a cloud-based virtual machine running Ubuntu and CentOS Linux server. It may or may not be virtualized. How do I determine what kind of virtualization technology (VMWARE/ KVM/ XEN/ VirtualBox/ Container/ lxc/Hyper-V etc.) a Linux guest system running on? How do I find out the virtualization type of a CentOS 7 Linux VPS?

 

You need to use the virt-what program (shell script) to detect the type of virtualization being used (or none at all if we’re running on bare-metal). It prints out one of more lines each being a ‘fact’ about the virtualization.

Install virt-what on Debian or Ubuntu Linux VM

$ sudo apt-get install virt-what

 

OR

$ sudo apt install virt-what

 

Fig.01: Debian/Ubuntu Linux install virt-what command

Install virt-what on RHEL/CentOS/Scientific Linux VM

$ sudo yum install virt-what

 

Fig.02: Fedora/RHEL/CentOS Linux install virt-what command

Install virt-what on Fedora Linux VM

$ sudo dnf install virt-what

Check if your remote server runs in virtual environment

Simply type the following command:

$ sudo virt-what

xen

xen-domU

 

Another output:

$ sudo virt-what

kvm

 

Another output:

$ sudo virt-what

lxc

Other possible values

hyperv : This is Microsoft Hyper-V hypervisor.

parallels : The guest is running inside Parallels Virtual Platform (Parallels Desktop, Parallels Server).

powervm_lx86 : The guest is running inside IBM PowerVM Lx86 Linux/x86 emulator.

qemu : This is QEMU hypervisor using software emulation.

virtualpc : The guest appears to be running on Microsoft VirtualPC.

xen-hvm : This is a Xen guest fully virtualized (HVM).

uml : This is a User-Mode Linux (UML) guest.

openvz : The guest appears to be running inside an OpenVZ or Virtuozzo container.

linux_vserver : This process is running in a Linux VServer container.

ibm_systemz : This is an IBM SystemZ (or other S/390) hardware partitioning system.

If nothing is printed, then it can mean *either* that the program is running on bare-metal *or* the program is running inside a type of virtual machine which we don’t know about or cannot detect. For more info see virt-what – detect if we are running in a virtual machine and here is the source code of the script:

#!/bin/bash –

# virt-what.  Generated from virt-what.in by configure.

# Copyright (C) 2008-2011 Red Hat Inc.

# Do not allow unset variables, and set defaults.

set -u

root=

skip_qemu_kvm=false

 

VERSION= 1.13

 

function fail {

echo  virt-what: $1  >&2

exit 1

}

 

function usage {

echo  virt-what [options]

echo  Options:

echo    –help          Display this help

echo    –version       Display version and exit

exit 0

}

 

# Handle the command line arguments, if any.

 

TEMP=$(getopt -o v –long help –long version –long test-root: -n  virt-what  —  $@ )

if [ $? != 0 ]; then exit 1; fi

eval set —  $TEMP

 

while true; do

case  $1  in

–help) usage ;;

–test-root)

# Deliberately undocumented: used for  make check .

root= $2

shift 2

;;

-v|–version) echo  $VERSION ; exit 0 ;;

–) shift; break ;;

*) fail  internal error ($1)  ;;

esac

done

 

# Add /sbin and /usr/sbin to the path so we can find system

# binaries like dmicode.

# Add /usr/libexec to the path so we can find the helper binary.

prefix=/usr

exec_prefix=${prefix}

PATH= ${root}${prefix}/lib/virt-what:${root}/sbin:${root}/usr/sbin:${PATH}

 

# Check we re running as root.

 

if [  x$root  =  x  ] && [  $EUID  -ne 0 ]; then

fail  this script must be run as root

fi

 

# Many fullvirt hypervisors give an indication through CPUID.  Use the

# helper program to get this information.

 

cpuid=$(virt-what-cpuid-helper)

 

# Check for various products in the BIOS information.

# Note that dmidecode doesn t exist on non-PC architectures.  On these,

# this will return an error which is ignored (error message redirected

# into $dmi variable).

 

dmi=$(LANG=C dmidecode 2>&1)

 

# Architecture.

# Note for the purpose of testing, we only call uname with -p option.

 

arch=$(uname -p)

 

# Check for VMware.

# cpuid check added by Chetan Loke.

 

if [  $cpuid  =  VMwareVMware  ]; then

echo vmware

elif echo  $dmi  | grep -q  Manufacturer: VMware ; then

echo vmware

fi

 

# Check for Hyper-V.

# http://blogs.msdn.com/b/sqlosteam/archive/2010/10/30/is-this-real-the-metaphysics-of-hardware-virtualization.aspx

if [  $cpuid  =  Microsoft Hv  ]; then

echo hyperv

fi

 

# Check for VirtualPC.

# The negative check for cpuid is to distinguish this from Hyper-V

# which also has the same manufacturer string in the SM-BIOS data.

if [  $cpuid  !=  Microsoft Hv  ] &&

echo  $dmi  | grep -q  Manufacturer: Microsoft Corporation ; then

echo virtualpc

fi

 

# Check for VirtualBox.

# Added by Laurent Léonard.

if echo  $dmi  | grep -q  Manufacturer: innotek GmbH ; then

echo virtualbox

fi

 

# Check for OpenVZ / Virtuozzo.

# Added by Evgeniy Sokolov.

# /proc/vz – always exists if OpenVZ kernel is running (inside and outside

# container)

# /proc/bc – exists on node, but not inside container.

 

if [ -d  ${root}/proc/vz  -a ! -d  ${root}/proc/bc  ]; then

echo openvz

fi

 

# Check for LXC containers

# http://www.freedesktop.org/wiki/Software/systemd/ContainerInterface

# Added by Marc Fournier

 

if [ -e  ${root}/proc/1/environ  ] &&

cat  ${root}/proc/1/environ  | tr  \000   \n  | grep -Eiq  ^container= ; then

echo lxc

fi

 

# Check for Linux-VServer

if cat  ${root}/proc/self/status  | grep -q  VxID: [0-9]* ; then

echo linux_vserver

fi

 

# Check for UML.

# Added by Laurent Léonard.

if grep -q  UML   ${root}/proc/cpuinfo ; then

echo uml

fi

 

# Check for IBM PowerVM Lx86 Linux/x86 emulator.

if grep -q  ^vendor_id.*PowerVM Lx86   ${root}/proc/cpuinfo ; then

echo powervm_lx86

fi

 

# Check for Hitachi Virtualization Manager (HVM) Virtage logical partitioning.

if echo  $dmi  | grep -q  Manufacturer.*HITACHI  &&

echo  $dmi  | grep -q  Product.* LPAR ; then

echo virtage

fi

 

# Check for IBM SystemZ.

if grep -q  ^vendor_id.*IBM/S390   ${root}/proc/cpuinfo ; then

echo ibm_systemz

if [ -f  ${root}/proc/sysinfo  ]; then

if grep -q  VM.*Control Program.*z/VM   ${root}/proc/sysinfo ; then

echo ibm_systemz-zvm

elif grep -q  ^LPAR   ${root}/proc/sysinfo ; then

echo ibm_systemz-lpar

else

# This is unlikely to be correct.

echo ibm_systemz-direct

fi

fi

fi

 

# Check for Parallels.

if echo  $dmi  | grep -q  Vendor: Parallels ; then

echo parallels

skip_qemu_kvm=true

fi

 

# Check for Xen.

 

if [  $cpuid  =  XenVMMXenVMM  ]; then

echo xen; echo xen-hvm

skip_qemu_kvm=true

elif [ -f  ${root}/proc/xen/capabilities  ]; then

echo xen

if grep -q  control_d   ${root}/proc/xen/capabilities ; then

echo xen-dom0

else

echo xen-domU

fi

skip_qemu_kvm=true

elif [ -f  ${root}/sys/hypervisor/type  ] &&

grep -q  xen   ${root}/sys/hypervisor/type ; then

# Ordinary kernel with pv_ops.  There does not seem to be

# enough information at present to tell whether this is dom0

# or domU.  XXX

echo xen

elif [  $arch  =  ia64  ]; then

if [ -d  ${root}/sys/bus/xen  -a ! -d  ${root}/sys/bus/xen-backend  ]; then

# PV-on-HVM drivers installed in a Xen guest.

echo xen

echo xen-hvm

else

# There is no virt leaf on IA64 HVM.  This is a last-ditch

# attempt to detect something is virtualized by using a

# timing attack.

virt-what-ia64-xen-rdtsc-test > /dev/null 2>&1

case  $?  in

0) ;; # not virtual

1) # Could be some sort of virt, or could just be a bit slow.

echo virt

esac

fi

fi

 

# Check for QEMU/KVM.

#

# Parallels exports KVMKVMKVM leaf, so skip this test if we ve already

# seen that it s Parallels.  Xen uses QEMU as the device model, so

# skip this test if we know it is Xen.

 

if !  $skip_qemu_kvm ; then

if [  $cpuid  =  KVMKVMKVM  ]; then

echo kvm

else

# XXX This is known to fail for qemu with the explicit -cpu

# option, since /proc/cpuinfo will not contain the QEMU

# string.  The long term fix for this would be to export

# another CPUID leaf for non-accelerated qemu.

if grep -q  QEMU   ${root}/proc/cpuinfo ; then

echo qemu

fi

fi

fi

 

 

Leave a Reply

Your email address will not be published. Required fields are marked *