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 相关文章推荐
Python3 处理JSON的实例详解
Oct 29 Python
python入门教程 python入门神图一张
Mar 05 Python
python使用筛选法计算小于给定数字的所有素数
Mar 19 Python
Python numpy 提取矩阵的某一行或某一列的实例
Apr 03 Python
Python 正则表达式匹配字符串中的http链接方法
Dec 25 Python
详解python3 + Scrapy爬虫学习之创建项目
Apr 12 Python
python3.8下载及安装步骤详解
Jan 15 Python
Django自定义全局403、404、500错误页面的示例代码
Mar 08 Python
Python 实现将大图切片成小图,将小图组合成大图的例子
Mar 14 Python
将python字符串转化成长表达式的函数eval实例
May 11 Python
3分钟看懂Python后端必须知道的Django的信号机制
Jul 26 Python
python实现图片转字符画
Feb 19 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
双料怀旧--SHARP GF515的维护、修理和简单调试
2021/03/02 无线电
phpmail类发送邮件函数代码
2012/02/20 PHP
PHP Global变量定义当前页面的全局变量实现探讨
2013/06/05 PHP
PHP连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
php实现微信模板消息推送
2018/03/30 PHP
PHP使用pdo连接access数据库并循环显示数据操作示例
2018/06/05 PHP
js和html5实现手机端刮刮卡抽奖效果完美兼容android/IOS
2013/11/18 Javascript
js获得网页背景色和字体色的方法
2014/03/21 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
javascript实现仿IE顶部的可关闭警告条
2015/05/05 Javascript
Jquery promise实现一张一张加载图片
2015/11/13 Javascript
JS实时弹出新消息提示框并有提示音响起的实现代码
2016/04/20 Javascript
JavaScript实现三级联动效果
2017/07/15 Javascript
基于JavaScript实现前端数据多条件筛选功能
2020/08/19 Javascript
jquery写出PC端轮播图实例
2018/01/26 jQuery
在vue里面设置全局变量或数据的方法
2018/03/09 Javascript
VSCode中如何利用d.ts文件进行js智能提示
2018/04/13 Javascript
js中数组常用方法总结(推荐)
2019/04/09 Javascript
vue实现记事本功能
2019/06/26 Javascript
Python3写入文件常用方法实例分析
2015/05/22 Python
python3 反射的四种基本方法解析
2019/08/26 Python
python tqdm 实现滚动条不上下滚动代码(保持一行内滚动)
2020/02/19 Python
Jupyter notebook无法导入第三方模块的解决方式
2020/04/15 Python
keras中的卷积层&池化层的用法
2020/05/22 Python
英国赛车、汽车改装和摩托车零件购物网站:Demon Tweeks
2018/10/29 全球购物
生产车间实习自我鉴定
2013/09/23 职场文书
旷课检讨书大全
2014/01/21 职场文书
计算机通信专业推荐信
2014/02/22 职场文书
《我不是最弱小的》教学反思
2014/02/23 职场文书
班级文化建设标语
2014/06/23 职场文书
创先争优活动心得体会
2014/09/04 职场文书
市场总监岗位职责
2015/02/11 职场文书
教师求职自荐信范文
2015/03/04 职场文书
紧急迫降观后感
2015/06/15 职场文书
小学校本教研总结
2015/08/13 职场文书
Go gorilla/sessions库安装使用
2022/08/14 Golang