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 相关文章推荐
Python程序中使用SQLAlchemy时出现乱码的解决方案
Apr 24 Python
Python实现的RSS阅读器实例
Jul 25 Python
详解Python3中yield生成器的用法
Aug 20 Python
浅析Python中的多条件排序实现
Jun 07 Python
如何将python中的List转化成dictionary
Aug 15 Python
Python中生成Epoch的方法
Apr 26 Python
基于python实现聊天室程序
Jul 27 Python
浅谈python的深浅拷贝以及fromkeys的用法
Mar 08 Python
Python 实现微信防撤回功能
Apr 29 Python
选择Python写网络爬虫的优势和理由
Jul 07 Python
python实现对图片进行旋转,放缩,裁剪的功能
Aug 07 Python
python实现计算器简易版
Dec 17 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
神族 Protoss 剧情介绍
2020/03/14 星际争霸
关于session在PHP5的配置文件中的详细设置参数说明
2011/04/20 PHP
PHP中list()函数用法实例简析
2016/01/08 PHP
Yii2 GridView实现列表页直接修改数据的方法
2016/05/16 PHP
JS图片浏览组件PhotoLook的公开属性方法介绍和进阶实例代码
2010/11/09 Javascript
给jQuery方法添加回调函数一款插件的应用
2013/01/21 Javascript
js 自定义个性下拉选择框示例
2013/08/20 Javascript
JS+CSS实现模仿浏览器网页字符查找功能的方法
2015/02/26 Javascript
解决JS请求服务器gbk文件乱码的问题
2015/10/16 Javascript
基于javascript html5实现多文件上传
2016/03/03 Javascript
javascript css红色经典选项卡效果实现代码
2016/05/17 Javascript
JavaScript 节流函数 Throttle 详解
2016/07/04 Javascript
javascript 删除数组元素和清空数组的简单方法
2017/02/24 Javascript
javascript数组拍平方法总结
2018/01/20 Javascript
JS脚本加载后执行相应回调函数的操作方法
2018/02/28 Javascript
jQuery实现图片简单轮播功能示例
2018/08/13 jQuery
node将geojson转shp返回给前端的实现方法
2019/05/29 Javascript
python3 判断列表是一个空列表的方法
2018/05/04 Python
Python之批量创建文件的实例讲解
2018/05/10 Python
详解Python文件修改的两种方式
2019/08/22 Python
基于python3抓取pinpoint应用信息入库
2020/01/08 Python
python pandas移动窗口函数rolling的用法
2020/02/29 Python
python语言是免费还是收费的?
2020/06/15 Python
python os.listdir()乱码解决方案
2021/01/31 Python
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
房地产管理毕业生自荐信
2013/11/04 职场文书
中医临床专业自我鉴定范文
2014/01/15 职场文书
学生喝酒检讨书
2014/02/06 职场文书
护士岗位求职应聘自荐书范文
2014/02/12 职场文书
学习十八届三中全会精神实施方案
2014/02/17 职场文书
物联网工程专业推荐信
2014/09/08 职场文书
2014个人四风对照检查材料思想汇报
2014/09/18 职场文书
2014年“向国旗敬礼”网上签名寄语活动方案
2014/09/27 职场文书
同学会邀请函模板
2015/01/30 职场文书
详解PHP Swoole与TCP三次握手
2021/05/27 PHP
Win10/Win11 任务栏替换成经典样式
2022/04/19 数码科技