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中将单词首字母大写的capitalize()方法
May 18 Python
PYTHON压平嵌套列表的简单实现
Jun 08 Python
Python编程中装饰器的使用示例解析
Jun 20 Python
Python实现在线音乐播放器
Mar 03 Python
Python Requests模拟登录实现图书馆座位自动预约
Apr 27 Python
python实现桌面托盘气泡提示
Jul 29 Python
详解django实现自定义manage命令的扩展
Aug 13 Python
对Pytorch中Tensor的各种池化操作解析
Jan 03 Python
Python实现投影法分割图像示例(一)
Jan 17 Python
如何在 Django 模板中输出 "{{"
Jan 24 Python
jupyter lab的目录调整及设置默认浏览器为chrome的方法
Apr 10 Python
Django数据库迁移常见使用方法
Nov 12 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中开启gzip压缩的2种方法
2015/01/31 PHP
ThinkPHP提示错误Fatal error: Allowed memory size的解决方法
2015/02/12 PHP
PHP安装BCMath扩展的方法
2019/02/13 PHP
laravel-admin select框默认选中的方法
2019/10/03 PHP
cookie丢失问题(认证失效) Authentication (用户验证信息)也会丢失
2009/06/04 Javascript
关于javascript中的parseInt使用技巧
2009/09/03 Javascript
asp.net下利用js实现返回上一页的实现方法小集
2009/11/24 Javascript
IE6 弹出Iframe层中的文本框“经常”无法获得输入焦点
2009/12/27 Javascript
Javascript 实现TreeView CheckBox全选效果
2010/01/11 Javascript
JavaScript.The.Good.Parts阅读笔记(二)作用域&闭包&减缓全局空间污染
2010/11/16 Javascript
javascript间隔定时器(延时定时器)学习 间隔调用和延时调用
2014/01/13 Javascript
javascript实现可拖动变色并关闭层窗口实例
2015/05/15 Javascript
js获取一组日期中最近连续的天数
2017/05/25 Javascript
jQuery实现返回顶部按钮和scroll滚动功能[带动画效果]
2017/07/05 jQuery
Vue单页及多页应用全局配置404页面实践记录
2018/05/22 Javascript
vue实现简单的星级评分组件源码
2018/11/16 Javascript
js中script的上下放置区别,Dom的增删改创建操作实例分析
2019/12/16 Javascript
[02:43]2014DOTA2国际邀请赛 官方Alliance战队纪录片
2014/07/14 DOTA
pycharm 使用心得(九)解决No Python interpreter selected的问题
2014/06/06 Python
在Python中操作时间之strptime()方法的使用
2020/12/30 Python
python连接mysql实例分享
2016/10/09 Python
python判断一个对象是否可迭代的例子
2019/07/22 Python
用Python调用win命令行提高工作效率的实例
2019/08/14 Python
Python 中的pygame安装与配置教程详解
2020/02/10 Python
python读取多层嵌套文件夹中的文件实例
2020/02/27 Python
简单介绍一下pyinstaller打包以及安全性的实现
2020/06/02 Python
基于Python 的语音重采样函数解析
2020/07/06 Python
美国时尚孕妇装品牌:A Pea in the Pod
2017/07/16 全球购物
Vans奥地利官方网站:美国原创极限运动潮牌
2018/09/30 全球购物
幼儿教育感言
2014/02/05 职场文书
计划生育证明格式及范本
2014/10/09 职场文书
工程服务质量承诺书
2015/04/29 职场文书
人工作失职检讨书
2015/05/05 职场文书
离婚被告答辩状
2015/05/22 职场文书
开网店计划分析
2019/07/30 职场文书
GTX1660显卡搭配显示器推荐
2022/04/19 数码科技