如何判斷 Linux 是否運行在虛擬機器上

來源:互聯網
上載者:User

在 WebHostingTalk 論壇上有些國外奸商會把虛擬機器當作獨立伺服器賣,去年7月份的時候就有一位中國同胞上當受騙, 並在 WHT 上發帖聲討,證據確鑿,甚至連服務商自己也承認,回帖達355篇。這家獨立伺服器/VPS 供應商 HostATree.com 居然大膽的把 OpenVZ VPS 這種一看就知道是虛擬機器的虛擬機器當作獨立伺服器賣,暈,至少也要弄個 VMWare/KVM/Xen HVM 吧(更難發現是虛擬機器),用 OpenVZ 這種容器也太欺負人了:)昨天恰好收到網友一封郵件問到了如何判斷自己買的是獨立伺服器還是虛擬機器的問題。這裡 VPSee 簡單介紹一下市面上常用虛擬技術(包括容器技術)的判別小技巧。

判斷 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)# written by http://www.vpsee.comimport sys, osdef 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,這段代碼提供了一個很好的例子,VPSee 重寫了代碼,用宏替代了函數,增加了對 VMware 和 KVM 的識別,用 gcc 編譯後就可以運行:

/* * check if a linux system running on a virtual machine (vmware/xen hvm/kvm) * written by http://www.vpsee.com */#include stdio.h#include string.h#define HYPERVISOR_INFO 0x40000000#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;}
判斷 VirtualBox/Virtual PC

什嗎?這種家用案頭虛擬機器自己裝的還會不知道?!如果不知道的話也有辦法,在 Linux 下運行 dmidecode 工具然後尋找 Manufacturer: innotek GmbH, Manufacturer: Microsoft Corporation 關鍵字就能對應上 VirtualBox 和 Virtual PC.

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.