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操作Mysql实例代码教程在线版(查询手册)
Feb 18 Python
Python 读写文件和file对象的方法(推荐)
Sep 12 Python
Python简单的制作图片验证码实例
May 31 Python
分享给Python新手们的几道简单练习题
Sep 21 Python
numpy中loadtxt 的用法详解
Aug 03 Python
python 异或加密字符串的实例
Oct 14 Python
Python实现爬取亚马逊数据并打印出Excel文件操作示例
May 16 Python
python读取ini配置文件过程示范
Dec 23 Python
python下载卫星云图合成gif的方法示例
Feb 18 Python
Python如何通过百度翻译API实现翻译功能
Apr 02 Python
详解Python 函数参数的拆解
Sep 02 Python
什么是Python装饰器?如何定义和使用?
Apr 11 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/12/21 PHP
php class中self,parent,this的区别以及实例介绍
2013/04/24 PHP
php二维数组排序与默认自然排序的方法介绍
2013/04/27 PHP
PHP中使用xmlreader读取xml数据示例
2014/12/29 PHP
浅析PHP中call user func()函数及如何使用call user func调用自定义函数
2015/11/05 PHP
php 自定义函数实现将数据 以excel 表格形式导出示例
2019/11/13 PHP
Javascript & DHTML 实例编程(教程)基础知识
2007/06/02 Javascript
Jquery在IE7下无法使用 $.ajax解决方法
2009/11/11 Javascript
JavaScript中的集合及效率
2010/01/08 Javascript
javascript学习笔记(六) Date 日期类型
2012/06/19 Javascript
将form表单中的元素转换成对象的方法适用表单提交
2014/05/02 Javascript
基于 Docker 开发 NodeJS 应用
2014/07/30 NodeJs
JavaScript调用客户端Java程序的方法
2015/07/27 Javascript
Ajax清除浏览器js、css、图片缓存的方法
2015/08/06 Javascript
jquery实现定时自动轮播特效
2015/12/10 Javascript
NodeJS实现阿里大鱼短信通知发送
2016/01/17 NodeJs
JS Select下拉框(支持输入模糊查询)
2017/02/04 Javascript
一次微信小程序内地图的使用实战记录
2019/09/09 Javascript
WEB前端性能优化的7大手段详解
2020/02/04 Javascript
vue实现图片懒加载的方法分析
2020/02/05 Javascript
微信小程序手动添加收货地址省市区联动
2020/05/18 Javascript
Tensorflow 查看变量的值方法
2018/06/14 Python
Python实现元素等待代码实例
2019/11/11 Python
Python原始套接字编程实例解析
2020/01/29 Python
python实现串口通信的示例代码
2020/02/10 Python
python Matplotlib基础--如何添加文本和标注
2021/01/26 Python
24个canvas基础知识小结
2014/12/17 HTML / CSS
大学生工作推荐信范文
2013/12/02 职场文书
会计学个人自荐信模板
2013/12/13 职场文书
养殖行业的创业计划书
2014/01/05 职场文书
文明市民先进事迹
2014/05/15 职场文书
庆六一活动总结
2014/08/29 职场文书
思想作风建设心得体会
2014/10/22 职场文书
2014年妇幼卫生工作总结
2014/12/09 职场文书
2015年收银工作总结范文
2015/04/01 职场文书
七年级英语教学反思
2016/02/15 职场文书