在 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.