如何判断Linux是否运行在虚拟机上

作者:hack1990 时间:12-01-02 阅读数:573人阅读

在有些奸商会把虚拟机当作独立服务器卖,这里简单介绍一下市面上常用虚拟技术(包括容器技术)的判别小技巧。
 
判断 OpenVZ/Xen PV/UML
 
判断 OpenVZ/Xen PV/UML 是最容易的,直接检查 /proc 下的相关目录和文件就可以知道,比如 OpenVZ VPS 上会有 /proc/vz 这个文件;Xen PV 虚拟机上会有 /proc/xen/ 这个目录,并且目录下有一些东西;UML 上打印 /proc/cpuinfo 会找到 UML 标志。写了一个简单的 Python 脚本来检测:
 
#!/usr/bin/python
# check if a linux system running on a virtual machine (openvz/xen pv/uml)
import sys, os
 
def main():
    if os.getuid() != 0:
        print “must be run as root”
        sys.exit(0)
 
    # check OpenVZ/Virtuozzo
    if os.path.exists(“/proc/vz”):
        if not os.path.exists(“/proc/bc”):
            print “openvz container”
        else:
            print “openvz node”
 
    # check Xen
    if os.path.exists(“/proc/xen/capabilities”):
        if (os.path.getsize(“/proc/xen/capabilities”) > 0):
            print “xen dom0″
        else:
            print “xen domU”
 
    # check User Mode Linux (UML)
    f = open(“/proc/cpuinfo”, “r”); t = f.read(); f.close()
    if (t.find(“UML”) > 0):
        print “uml”
 
if __name__==”__main__”:
    main()
 
判断 VMware/Xen HVM/KVM
 
如果使用的是 VMware/Xen HVM/KVM 这样的全虚拟就更难判断一些,最准确的办法是读取 CPUID 来判断,Xen 源代码下面有一段检测是否是 Xen 的 C 语言代码 tools/misc/xen-detect.c,这段代码提供了一个很好的例子,重写了代码,用宏替代了函数,增加了对 VMware 和 KVM 的识别,用 gcc 编译后就可以运行:
 
/*
 * check if a linux system running on a virtual machine (vmware/xen hvm/kvm)
 */
#include stdio.h
#include string.h
 
#define HYPERVISOR_INFO 0×40000000
 
#define CPUID(idx, eax, ebx, ecx, edx) \
    asm volatile ( \
        “test %1,%1 ; jz 1f ; ud2a ; .ascii \”xen\” ; 1: cpuid” \
        : “=b” (*ebx), “=a” (*eax), “=c” (*ecx), “=d” (*edx) \
        : “0″ (idx) );
 
int main(void)
{
        unsigned int eax, ebx, ecx, edx;
        char string[13];
 
        CPUID(HYPERVISOR_INFO, &eax, &ebx, &ecx, &edx);
        *(unsigned int *)(string+0) = ebx;
        *(unsigned int *)(string+4) = ecx;
        *(unsigned int *)(string+8) = edx;
 
        string[12] = 0;
        if (strncmp(string, “XenVMMXenVMM”, 12) == 0) {
                printf(“xen hvm\n”);
        } else if (strncmp(string, “VMwareVMware”, 12) == 0) {
                printf(“vmware\n”);
        } else if (strncmp(string, “KVMKVMKVM”, 12) == 0) {
                printf(“kvm\n”);
        } else
                printf(“bare hardware\n”);
 
        return 0;

发表评论