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目录操作之python遍历文件夹后将结果存储为xml
Jan 27 Python
Python中的测试模块unittest和doctest的使用教程
Apr 14 Python
Python计算三角函数之asin()方法的使用
May 15 Python
python中子类调用父类函数的方法示例
Aug 18 Python
Python cookbook(数据结构与算法)找到最大或最小的N个元素实现方法示例
Feb 13 Python
pandas object格式转float64格式的方法
Apr 10 Python
Python使用requests提交HTTP表单的方法
Dec 26 Python
Python将string转换到float的实例方法
Jul 29 Python
Python适配器模式代码实现解析
Aug 02 Python
python使用pip安装模块出现ReadTimeoutError: HTTPSConnectionPool的解决方法
Oct 04 Python
Django实现后台上传并显示图片功能
May 29 Python
Python matplotlib多个子图绘制整合
Apr 13 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开发大型项目的一点经验
2006/10/09 PHP
轻松修复Discuz!数据库
2008/05/03 PHP
php curl的深入解析
2013/06/02 PHP
php上传图片生成缩略图(GD库)
2016/01/06 PHP
Symfony2函数用法实例分析
2016/03/18 PHP
[原创]PHP获取数组表示的路径方法分析【数组转字符串】
2017/09/01 PHP
Lumen timezone 时区设置方法(慢了8个小时)
2018/01/20 PHP
php删除一个路径下的所有文件夹和文件的方法
2018/02/07 PHP
通过Mootools 1.2来操纵HTML DOM元素
2009/09/15 Javascript
JavaScript单元测试ABC
2012/04/12 Javascript
JavaScript中的typeof操作符用法实例
2014/04/05 Javascript
AngularJs directive详解及示例代码
2016/09/01 Javascript
原生js获取浏览器窗口及元素宽高常用方法集合
2017/01/18 Javascript
vue2.0实现导航菜单切换效果
2017/05/08 Javascript
实现两个文本框同时输入的实例
2017/09/25 Javascript
javascript基于定时器实现进度条功能实例
2017/10/13 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(上)
2018/04/18 Javascript
vue.js的vue-cli脚手架中使用百度地图API的实例
2019/01/21 Javascript
JS表单验证插件之数据与逻辑分离操作实例分析【策略模式】
2020/05/01 Javascript
Python实现扫描指定目录下的子目录及文件的方法
2014/07/16 Python
Python中zip()函数用法实例教程
2014/07/31 Python
python中的hashlib和base64加密模块使用实例
2014/09/02 Python
Python设计足球联赛赛程表程序的思路与简单实现示例
2016/06/28 Python
Python3.5以上版本lxml导入etree报错的解决方案
2019/06/26 Python
pandas 层次化索引的实现方法
2019/07/06 Python
python中for in的用法详解
2020/04/17 Python
德国专业木制品经销商:Holz-Direkt24
2019/12/26 全球购物
高校生生产实习自我鉴定
2013/09/21 职场文书
人力资源经理自我评价
2014/01/04 职场文书
2014年高三毕业生自我评价
2014/01/11 职场文书
小学庆六一活动方案
2014/02/28 职场文书
安全技术说明书
2014/05/09 职场文书
小组口号大全
2014/06/09 职场文书
民主评议党员个人自我评价
2015/03/03 职场文书
合作与交流自我评价
2015/03/09 职场文书
素质拓展训练感想
2015/08/07 职场文书