Codebase list virt-what / upstream/1.8 virt-what.in
upstream/1.8

Tree @upstream/1.8 (Download .tar.gz)

virt-what.in @upstream/1.8raw · history · blame

#!/bin/bash -
# @configure_input@
# Copyright (C) 2008-2011 Red Hat Inc.
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.

# 'virt-what' tries 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.
#
# Please see also the manual page virt-what(1).
# This script should be run as root.
#
# The following resources were useful in writing this script:
# . http://www.dmo.ca/blog/20080530151107

VERSION="@VERSION@"

function fail {
    echo "virt-what: $1"
    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=@prefix@
exec_prefix=@exec_prefix@
PATH=$root@libexecdir@:$root/sbin:$root/usr/sbin:$PATH

# Check we're running as root.

uid=`id -u`
if [ "$uid" != 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.

dmi=`LANG=C dmidecode 2>&1`

# 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 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.*HVM 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
fi

# Check for Xen.

if [ "$cpuid" = "XenVMMXenVMM" ]; then
    echo xen; echo xen-hvm
    is_xen=1
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
    is_xen=1
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
fi

# Check for QEMU/KVM.

if [ ! "$is_xen" ]; then
    # Disable this test if we know this is Xen already, because Xen
    # uses QEMU for its device model.

    if grep -q 'QEMU' $root/proc/cpuinfo; then
	if [ "$cpuid" = "KVMKVMKVM" ]; then
	    echo kvm
	else
	    echo qemu
	fi
    fi
fi