Python腳本判斷 Linux 是否運(yùn)行在虛擬機(jī)上
在 WebHostingTalk 論壇上有些國(guó)外奸商會(huì)把虛擬機(jī)當(dāng)作獨(dú)立服務(wù)器賣,去年7月份的時(shí)候就有一位中國(guó)同胞上當(dāng)受騙,并在 WHT 上發(fā)帖聲討,證據(jù)確鑿,甚至連服務(wù)商自己也承認(rèn),回帖達(dá)355篇。這家獨(dú)立服務(wù)器/VPS 提供商 HostATree.com 居然大膽的把 OpenVZ VPS 這種一看就知道是虛擬機(jī)的虛擬機(jī)當(dāng)作獨(dú)立服務(wù)器賣,暈,至少也要弄個(gè) VMWare/KVM/Xen HVM 吧(更難發(fā)現(xiàn)是虛擬機(jī)),用 OpenVZ 這種容器也太欺負(fù)人了:)昨天恰好收到網(wǎng)友一封郵件問(wèn)到了如何判斷自己買的是獨(dú)立服務(wù)器還是虛擬機(jī)的問(wèn)題。這里 VPSee 簡(jiǎn)單介紹一下市面上常用虛擬技術(shù)(包括容器技術(shù))的判別小技巧。
判斷 OpenVZ/Xen PV/UML
判斷 OpenVZ/Xen PV/UML 是最容易的,直接檢查 /proc 下的相關(guān)目錄和文件就可以知道,比如 OpenVZ VPS 上會(huì)有 /proc/vz 這個(gè)文件;Xen PV 虛擬機(jī)上會(huì)有 /proc/xen/ 這個(gè)目錄,并且目錄下有一些東西;UML 上打印 /proc/cpuinfo 會(huì)找到 UML 標(biāo)志。寫了一個(gè)簡(jiǎn)單的 Python 腳本來(lái)檢測(cè):
#!/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 這樣的全虛擬就更難判斷一些,最準(zhǔn)確的辦法是讀取 CPUID 來(lái)判斷,Xen 源代碼下面有一段檢測(cè)是否是 Xen 的 C 語(yǔ)言代碼 tools/misc/xen-detect.c,這段代碼提供了一個(gè)很好的例子,VPSee 重寫了代碼,用宏替代了函數(shù),增加了對(duì) VMware 和 KVM 的識(shí)別,用 gcc 編譯后就可以運(yùn)行:
/*
* check if a linux system running on a virtual machine (vmware/xen hvm/kvm)
*/
#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
什么?這種家用桌面虛擬機(jī)自己裝的還會(huì)不知道?!如果不知道的話也有辦法,在 Linux 下運(yùn)行 dmidecode 工具然后查找 Manufacturer: innotek GmbH, Manufacturer: Microsoft Corporation 關(guān)鍵字就能對(duì)應(yīng)上 VirtualBox 和 Virtual PC.
- Windows下Pycharm遠(yuǎn)程連接虛擬機(jī)中Centos下的Python環(huán)境(圖文教程詳解)
- Python使用oslo.vmware管理ESXI虛擬機(jī)的示例參考
- python虛擬機(jī)解釋器及運(yùn)行過(guò)程
- Python動(dòng)態(tài)規(guī)劃實(shí)現(xiàn)虛擬機(jī)部署的算法思想
- Python實(shí)現(xiàn)遺傳算法(虛擬機(jī)中運(yùn)行)
- 虛擬機(jī)下載python是否需要聯(lián)網(wǎng)
- 深入理解Python虛擬機(jī)中元組(tuple)的實(shí)現(xiàn)原理及源碼
- Python虛擬機(jī)棧幀對(duì)象及獲取源碼學(xué)習(xí)
- 深入理解?python?虛擬機(jī)
相關(guān)文章
python根據(jù)時(shí)間生成mongodb的ObjectId的方法
這篇文章主要介紹了python根據(jù)時(shí)間生成mongodb的ObjectId的方法,涉及Python操作mongodb數(shù)據(jù)庫(kù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03
詳解Python如何精確控制asyncio并發(fā)運(yùn)行多個(gè)任務(wù)
這篇文章主要為大家詳細(xì)介紹了Python如何精確控制asyncio并發(fā)運(yùn)行多個(gè)任務(wù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2023-10-10
python奇偶行分開(kāi)存儲(chǔ)實(shí)現(xiàn)代碼
這篇文章主要介紹了python讀取文件,偶數(shù)行輸出一個(gè)文件,奇數(shù)行輸出一個(gè)文件,需要的朋友可以參考下2018-03-03
教你用Type Hint提高Python程序開(kāi)發(fā)效率
本文通過(guò)介紹和實(shí)例教大家如何利用Type Hint來(lái)提升Python程序開(kāi)發(fā)效率,對(duì)大家使用python開(kāi)發(fā)很有幫助,有需要的參考學(xué)習(xí)。2016-08-08
Python對(duì)象類型及其運(yùn)算方法(詳解)
下面小編就為大家?guī)?lái)一篇Python對(duì)象類型及其運(yùn)算方法(詳解)。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-07-07
python如何獲取Prometheus監(jiān)控?cái)?shù)據(jù)
這篇文章主要介紹了python如何獲取Prometheus監(jiān)控?cái)?shù)據(jù),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-05-05
Python try-except-else-finally的具體使用
本文主要介紹了Python try-except-else-finally的具體使用,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
PyQt5內(nèi)嵌瀏覽器注入JavaScript腳本實(shí)現(xiàn)自動(dòng)化操作的代碼實(shí)例
今天小編就為大家分享一篇關(guān)于PyQt5內(nèi)嵌瀏覽器注入JavaScript腳本實(shí)現(xiàn)自動(dòng)化操作的代碼實(shí)例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2019-02-02

