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聊天程序实例代码分享
Nov 18 Python
python使用xlrd模块读写Excel文件的方法
May 06 Python
浅析Python中的多条件排序实现
Jun 07 Python
Python 3实战爬虫之爬取京东图书的图片详解
Oct 09 Python
Python中pip更新和三方插件安装说明
Jul 08 Python
python语音识别实践之百度语音API
Aug 30 Python
使用Python处理BAM的方法
Sep 28 Python
Django CSRF跨站请求伪造防护过程解析
Jul 31 Python
python 实现二维列表转置
Dec 02 Python
将python字符串转化成长表达式的函数eval实例
May 11 Python
keras Lambda自定义层实现数据的切片方式,Lambda传参数
Jun 11 Python
Python内置数据结构列表与元组示例详解
Aug 04 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 一个比较完善的简单文件上传
2010/03/25 PHP
PHP中开发XML应用程序之基础篇 添加节点 删除节点 查询节点 查询节
2010/07/09 PHP
PHP获取当前url的具体方法全面解析
2013/11/26 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
PHP守护进程化在C和PHP环境下的实现
2017/11/21 PHP
PHP压缩图片功能的介绍
2019/03/21 PHP
javascript new fun的执行过程
2010/08/05 Javascript
IE6/7/8/9不支持exec的简写方式
2011/05/25 Javascript
jquery实现二级导航下拉菜单效果
2015/12/18 Javascript
浏览器检测JS代码(兼容目前各大主流浏览器)
2016/02/21 Javascript
jQuery移动端图片上传组件
2016/06/12 Javascript
浅谈angular2的http请求返回结果的subcribe注意事项
2017/03/01 Javascript
EasyUI Datebox 日期验证之开始日期小于结束时间
2017/05/19 Javascript
给vue项目添加ESLint的详细步骤
2017/09/29 Javascript
jQuery插件实现非常实用的tab栏切换功能【案例】
2019/02/18 jQuery
浅谈对于“不用setInterval,用setTimeout”的理解
2019/08/28 Javascript
ElementUI之Message功能拓展详解
2019/10/18 Javascript
Vue通过getAction的finally来最大程度避免影响主数据呈现问题
2020/04/24 Javascript
js利用拖放实现添加删除
2020/08/27 Javascript
echarts浮动显示单位的实现方法示例
2020/12/04 Javascript
详解Python装饰器由浅入深
2016/12/09 Python
Python机器学习logistic回归代码解析
2018/01/17 Python
使用python爬虫获取黄金价格的核心代码
2018/06/13 Python
pytorch 实现L2和L1正则化regularization的操作
2021/03/03 Python
浏览器实现移动端高性能css3动画(开启gpu加速)
2013/12/23 HTML / CSS
详解CSS3的图层阴影和文字阴影效果使用
2016/06/09 HTML / CSS
露营世界:Camping World
2017/02/02 全球购物
美国马匹用品和骑马配件购物网站:Horse.com
2018/01/08 全球购物
小橄榄树:Le Petit Olivier
2018/04/23 全球购物
六道php面试题附答案
2014/06/05 面试题
酒店应聘自荐信
2013/11/09 职场文书
学习十八届三中全会精神实施方案
2014/02/17 职场文书
客户经理竞聘演讲稿
2014/05/15 职场文书
领导走群众路线整改措施思想汇报
2014/10/12 职场文书
CSS3 实现的图片悬停的切换按钮
2021/04/13 HTML / CSS
如何解决flex文本溢出问题小结
2022/07/15 HTML / CSS