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创建只读属性对象的方法(ReadOnlyObject)
Feb 10 Python
python处理文本文件实现生成指定格式文件的方法
Jul 31 Python
Python中的闭包详细介绍和实例
Nov 21 Python
python编程实现归并排序
Apr 14 Python
Python使用xlwt模块操作Excel的方法详解
Mar 27 Python
深入浅析python3中的unicode和bytes问题
Jul 03 Python
python经典趣味24点游戏程序设计
Jul 26 Python
Python time库基本使用方法分析
Dec 13 Python
python 操作hive pyhs2方式
Dec 21 Python
python实现一个猜拳游戏
Apr 05 Python
python3 使用ssh隧道连接mysql的操作
Dec 05 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
php5新改动之短标记启用方法
2008/09/11 PHP
PHP调用微博接口实现微博登录的方法示例
2018/09/22 PHP
jquery乱码与contentType属性设置问题解决方案
2013/01/07 Javascript
jquery中$(#form :input)与$(#form input)的区别
2014/08/18 Javascript
JavaScript中constructor()方法的使用简介
2015/06/05 Javascript
jQuery仅用3行代码实现的显示与隐藏功能完整实例
2015/10/08 Javascript
JS+CSS实现仿雅虎另类滑动门切换效果
2015/10/13 Javascript
自己动手写的jquery分页控件(非常简单实用)
2015/10/28 Javascript
Jquery时间轴特效(三种不同类型)
2015/11/02 Javascript
jquery实现点击其他区域时隐藏下拉div和遮罩层的方法
2015/12/23 Javascript
Bootstrap+jfinal退出系统弹出确认框的实现方法
2016/05/30 Javascript
利用python分析access日志的方法
2016/10/26 Javascript
Nuxt页面级缓存的实现
2020/03/09 Javascript
Node.js API详解之 console模块用法详解
2020/05/12 Javascript
解决vue动态路由异步加载import组件,加载不到module的问题
2020/07/26 Javascript
JavaScript 监听组合按键思路及代码实现
2020/07/28 Javascript
node.js 如何监视文件变化
2020/09/01 Javascript
Python中还原JavaScript的escape函数编码后字符串的方法
2014/08/22 Python
Windows下的Python 3.6.1的下载与安装图文详解(适合32位和64位)
2018/02/21 Python
django表单实现下拉框的示例讲解
2018/05/29 Python
基于Python列表解析(列表推导式)
2018/06/23 Python
python3爬取数据至mysql的方法
2018/06/26 Python
用Python实现二叉树、二叉树非递归遍历及绘制的例子
2019/08/09 Python
Anaconda 查看、创建、管理和使用python环境的方法
2019/12/03 Python
python获取系统内存占用信息的实例方法
2020/07/17 Python
写自荐信的七个技巧
2013/10/15 职场文书
护士的自我鉴定
2014/02/07 职场文书
春季运动会广播稿大全
2014/02/19 职场文书
公司门卫岗位职责
2014/03/15 职场文书
药剂专业自荐书
2014/06/20 职场文书
毕业论文致谢格式模板
2015/05/14 职场文书
跑吧孩子观后感
2015/06/10 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
Nginx中break与last的区别详析
2021/03/31 Servers
Node与Python 双向通信的实现代码
2021/07/16 Javascript
阿里云 Windows server 2019 配置FTP
2022/04/28 Servers