Python脚本判断 Linux 是否运行在虚拟机上


Posted in Python onApril 25, 2015

在 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)
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,这段代码提供了一个很好的例子,VPSee 重写了代码,用宏替代了函数,增加了对 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 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.

Python 相关文章推荐
Pyramid Mako模板引入helper对象的步骤方法
Nov 27 Python
go和python调用其它程序并得到程序输出
Feb 10 Python
Python中用于转换字母为小写的lower()方法使用简介
May 19 Python
Python 爬虫模拟登陆知乎
Sep 23 Python
关于Python中空格字符串处理的技巧总结
Aug 10 Python
Python使用matplotlib绘制正弦和余弦曲线的方法示例
Jan 06 Python
Python脚本完成post接口测试的实例
Dec 17 Python
Python2与Python3的区别实例总结
Apr 17 Python
python3.7 sys模块的具体使用
Jul 22 Python
在django-xadmin中APScheduler的启动初始化实例
Nov 15 Python
使用opencv将视频帧转成图片输出
Dec 10 Python
Scrapy框架实现的登录网站操作示例
Feb 06 Python
在Python中使用cookielib和urllib2配合PyQuery抓取网页信息
Apr 25 #Python
使用Python的Tornado框架实现一个一对一聊天的程序
Apr 25 #Python
使用Python发送邮件附件以定时备份MySQL的教程
Apr 25 #Python
安装Python的web.py框架并从hello world开始编程
Apr 25 #Python
用Python编写一个基于终端的实现翻译的脚本
Apr 24 #Python
Python的Bottle框架中获取制定cookie的教程
Apr 24 #Python
利用Python的装饰器解决Bottle框架中用户验证问题
Apr 24 #Python
You might like
PHP 字符串分割和比较
2009/10/06 PHP
php读取txt文件组成SQL并插入数据库的代码(原创自Zjmainstay)
2012/07/31 PHP
PHP中time(),date(),mktime()区别介绍
2013/09/28 PHP
php利用smtp类实现电子邮件发送
2015/10/30 PHP
项目中应用Redis+Php的场景
2016/05/22 PHP
Yii框架防止sql注入,xss攻击与csrf攻击的方法
2016/10/18 PHP
Yii框架日志记录Logging操作示例
2018/07/12 PHP
PHP数组实际占用内存大小原理解析
2020/12/11 PHP
JavaScript的MVVM库Vue.js入门学习笔记
2016/05/03 Javascript
AngularJS过滤器详解及示例代码
2016/08/16 Javascript
AngularJS入门示例之Hello World详解
2017/01/04 Javascript
JS实现针对给定时间的倒计时功能示例
2017/04/11 Javascript
js实现股票实时刷新数据案例
2017/05/14 Javascript
JS实现无缝循环marquee滚动效果
2017/05/22 Javascript
jQuery上传插件webupload使用方法
2017/08/01 jQuery
Element-UI 使用el-row 分栏布局的教程
2020/10/26 Javascript
React Ant Design树形表格的复杂增删改操作
2020/11/02 Javascript
[01:03:31]DOTA2上海特级锦标赛B组资格赛#1 Alliance VS Fnatic第二局
2016/02/26 DOTA
[00:05]ChinaJoy现场 DOTA2玩家高呼“CN DOTA BEST DOTA”
2019/08/04 DOTA
浅析Python编写函数装饰器
2016/03/18 Python
让Python更加充分的使用Sqlite3
2017/12/11 Python
Django 内置权限扩展案例详解
2019/03/04 Python
深入浅析python 协程与go协程的区别
2019/05/09 Python
手把手教你pycharm专业版安装破解教程(linux版)
2019/09/26 Python
对python中各个response的使用说明
2020/03/28 Python
Python排序函数的使用方法详解
2020/12/11 Python
Johnson Fitness澳大利亚:高级健身器材
2021/03/16 全球购物
出纳工作岗位责任制
2014/02/02 职场文书
实习报告评语
2014/04/26 职场文书
环境监测与治理技术专业求职信
2014/07/06 职场文书
《一面五星红旗》教学反思
2016/02/23 职场文书
某学校的2019年度工作报告范本
2019/10/11 职场文书
Python Numpy之linspace用法说明
2021/04/17 Python
JS的深浅复制详细
2021/10/16 Javascript
Python中的嵌套循环详情
2022/03/23 Python
Android实现图片九宫格
2022/06/28 Java/Android