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中mechanize库的简单使用示例
Jan 10 Python
详细介绍Python中的偏函数
Apr 27 Python
python通过邮件服务器端口发送邮件的方法
Apr 30 Python
举例讲解Python中metaclass元类的创建与使用
Jun 30 Python
python win32 简单操作方法
May 25 Python
Python WXPY实现微信监控报警功能的代码
Oct 20 Python
python 使用装饰器并记录log的示例代码
Jul 12 Python
Python 硬币兑换问题
Jul 29 Python
python 利用turtle库绘制笑脸和哭脸的例子
Nov 23 Python
django序列化serializers过程解析
Dec 14 Python
在django中实现choices字段获取对应字段值
Jul 12 Python
Visual Studio code 配置Python开发环境
Sep 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使用curl检测网页是否被百度收录的示例分享
2014/01/31 PHP
thinkphp实现发送邮件密码找回功能实例
2014/12/01 PHP
php $_SESSION会员登录实例分享
2021/01/19 PHP
PHP请求Socket接口测试实例
2016/08/12 PHP
JQuery textlimit 显示用户输入的字符数 限制用户输入的字符数
2009/05/14 Javascript
AJAX 网页保留浏览器前进后退等功能
2011/02/12 Javascript
js 火狐下取本地路径实现思路
2013/04/02 Javascript
jquery中event对象属性与方法小结
2013/12/18 Javascript
使用js画图之正弦曲线
2015/01/12 Javascript
浅谈JavaScript中Date(日期对象),Math对象
2015/02/05 Javascript
jQuery+slidereveal实现的面板滑动侧边展出效果
2015/03/14 Javascript
在Node.js应用中读写Redis数据库的简单方法
2015/06/30 Javascript
jQuery抛物线运动实现方法(附完整demo源码下载)
2016/01/08 Javascript
AngularJs篇:使用AngularJs打造一个简易权限系统的实现代码
2016/12/26 Javascript
webpack教程之webpack.config.js配置文件
2017/07/05 Javascript
详解VueJS 数据驱动和依赖追踪分析
2017/07/26 Javascript
Nodejs+express+ejs简单使用实例代码
2017/09/18 NodeJs
vue的for循环使用方法
2019/02/12 Javascript
使用JS来动态操作css的几种方法
2019/12/18 Javascript
微信小程序订阅消息(java后端实现)开发
2020/06/01 Javascript
python使用threading获取线程函数返回值的实现方法
2017/11/15 Python
对Python正则匹配IP、Url、Mail的方法详解
2018/12/25 Python
Python While循环语句实例演示及原理解析
2020/01/03 Python
python 一维二维插值实例
2020/04/22 Python
使用pth文件添加Python环境变量方式
2020/05/26 Python
澳大利亚百货公司:David Jones
2018/02/08 全球购物
瑞士男士时尚网上商店:Babista
2020/05/14 全球购物
编写strcpy函数
2014/06/24 面试题
鲜果饮品店创业计划书
2014/01/21 职场文书
安全标准化汇报材料
2014/02/03 职场文书
数控专业自荐书范文
2014/03/16 职场文书
《青蛙看海》教学反思
2014/04/23 职场文书
孝敬父母的演讲稿
2014/05/14 职场文书
中华魂放飞梦想演讲稿
2014/08/26 职场文书
3招让你摆脱即兴讲话冷场尴尬
2019/08/08 职场文书
golang中的空slice案例
2021/04/27 Golang