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发送邮件示例(支持中文邮件标题)
Feb 16 Python
Python实现自动添加脚本头信息的示例代码
Sep 02 Python
Python算法应用实战之队列详解
Feb 04 Python
Python 专题三 字符串的基础知识
Mar 19 Python
利用Python将时间或时间间隔转为ISO 8601格式方法示例
Sep 05 Python
Python定时任务sched模块用法示例
Jul 16 Python
pycharm 配置远程解释器的方法
Oct 28 Python
Opencv+Python 色彩通道拆分及合并的示例
Dec 08 Python
pytorch中获取模型input/output shape实例
Dec 30 Python
使用Tensorflow将自己的数据分割成batch训练实例
Jan 20 Python
Django操作session 的方法
Mar 09 Python
python按照list中字典的某key去重的示例代码
Oct 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
8个PHP数组面试题
2015/06/23 PHP
详解Yii实现分页的两种方法
2017/01/14 PHP
基于 Swoole 的微信扫码登录功能实现代码
2018/01/15 PHP
PHP5.6读写excel表格文件操作示例
2019/02/26 PHP
Yii 框架控制器创建使用及控制器响应操作示例
2019/10/14 PHP
JQuery里选择超链接的实现代码
2011/05/22 Javascript
Jquery工作常用实例 使用AJAX使网页进行异步更新
2011/07/26 Javascript
JavaScript 函数replace深入了解
2013/03/14 Javascript
基于jquery实现的可编辑下拉框实现代码
2014/08/02 Javascript
js propertychange和oninput事件
2014/09/28 Javascript
jQuery ajax serialize() 方法使用示例
2014/11/02 Javascript
node.js中的socket.io的广播消息
2014/12/15 Javascript
浅谈js中的闭包
2015/03/16 Javascript
浅谈jQuery animate easing的具体使用方法(推荐)
2016/06/17 Javascript
微信小程序 input输入框控件详解及实例(多种示例)
2016/12/14 Javascript
漂亮实用的页面loading(加载)封装代码
2017/02/03 Javascript
在React 组件中使用Echarts的示例代码
2017/11/08 Javascript
Vue.js+Layer表格数据绑定与实现更新的实例
2018/03/07 Javascript
动态内存分配导致影响Javascript性能的问题
2018/12/18 Javascript
vue-cli创建的项目中的gitHooks原理解析
2020/02/14 Javascript
Python对两个有序列表进行合并和排序的例子
2014/06/13 Python
Python中用于转换字母为小写的lower()方法使用简介
2015/05/19 Python
Python正确重载运算符的方法示例详解
2017/08/27 Python
Python中的defaultdict与__missing__()使用介绍
2018/02/03 Python
Python实现的HMacMD5加密算法示例
2018/04/03 Python
python中正则表达式 re.findall 用法
2018/10/23 Python
Django给admin添加Action的步骤详解
2019/05/01 Python
使用Python调取任意数字资产钱包余额功能
2019/08/15 Python
python数据预处理方式 :数据降维
2020/02/24 Python
Python线程threading模块用法详解
2020/02/26 Python
Pycharm自带Git实现版本管理的方法步骤
2020/09/18 Python
Java程序员常见面试题
2015/07/16 面试题
酒吧总经理岗位职责
2013/12/10 职场文书
计算机应用专业毕业生求职信
2014/06/03 职场文书
工程部主管岗位职责
2015/02/12 职场文书
人事部:年度述职报告范文
2019/07/12 职场文书