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构建Hopfield网络的教程
Apr 14 Python
使用rpclib进行Python网络编程时的注释问题
May 06 Python
Python实现批量修改文件名实例
Jul 08 Python
django限制匿名用户访问及重定向的方法实例
Feb 07 Python
Tensorflow卷积神经网络实例
May 24 Python
Python 使用Numpy对矩阵进行转置的方法
Jan 28 Python
深入理解Python异常处理的哲学
Feb 01 Python
wxPython实现文本框基础组件
Nov 18 Python
python 变量初始化空列表的例子
Nov 28 Python
python将dict中的unicode打印成中文实例
May 11 Python
python--shutil移动文件到另一个路径的操作
Jul 13 Python
一文解决django 2.2与mysql兼容性问题
Jul 15 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通过正则表达式下载图片到本地的实现代码
2011/09/19 PHP
Smarty模板引擎缓存机制详解
2016/05/23 PHP
thinkPHP5.0框架简单配置作用域的方法
2017/03/17 PHP
关于PHP转换超过2038年日期出错的问题解决
2017/06/28 PHP
Thinkphp开发--集成极光推送
2017/09/15 PHP
推荐40个非常优秀的jQuery插件和教程【系列三】
2011/11/09 Javascript
基于jQuery.Validate验证库知识点的详解
2013/04/26 Javascript
node.js中的fs.chown方法使用说明
2014/12/16 Javascript
简介JavaScript中的setDate()方法的使用
2015/06/11 Javascript
jQuery多个版本和其他js库冲突的解决方法
2016/08/11 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
基于JS实现9种不同的面包屑和分布式多步骤导航效果
2017/02/21 Javascript
JavaScript选择排序算法原理与实现方法示例
2018/08/06 Javascript
JS简单表单验证功能完整示例
2020/01/26 Javascript
vue flex 布局实现div均分自动换行的示例代码
2020/08/05 Javascript
vue表单验证之禁止input输入框输入空格
2020/12/03 Vue.js
[01:48]2018DOTA2亚洲邀请赛主赛事第二日五佳镜头 VG完美团战逆转TNC
2018/04/05 DOTA
Django应用程序中如何发送电子邮件详解
2017/02/04 Python
django如何自己创建一个中间件
2019/07/24 Python
CSS3中新增的对文本和字体的设置
2020/02/03 HTML / CSS
Russell Stover巧克力官方网站:美国领先的精美巧克力制造商
2016/11/27 全球购物
草莓网英国官网:Strawberrynet UK
2017/02/12 全球购物
俄罗斯最大的消费电子连锁零售商:Mvideo
2017/06/25 全球购物
PAUL HEWITT手表美国站:德国北部时尚生活配饰品牌,船锚元素
2017/11/18 全球购物
六十大寿答谢词
2014/01/12 职场文书
岳父生日宴会答谢词
2014/01/13 职场文书
年度考核自我评价
2014/01/25 职场文书
外联部演讲稿
2014/05/24 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
2014年幼儿园教研工作总结
2014/12/04 职场文书
2014年科室工作总结范文
2014/12/19 职场文书
教师年度考核个人总结
2015/02/12 职场文书
2015年保安个人工作总结
2015/04/02 职场文书
机关单位2016年创先争优活动总结
2016/04/05 职场文书
企业管理不到位检讨书
2019/06/27 职场文书
python开发的自动化运维工具ansible详解
2021/08/07 Python