当前位置: 首页 > 编程笔记 >

Python脚本判断 Linux 是否运行在虚拟机上

宋博易
2023-03-14
本文向大家介绍Python脚本判断 Linux 是否运行在虚拟机上,包括了Python脚本判断 Linux 是否运行在虚拟机上的使用技巧和注意事项,需要的朋友参考一下

在 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.

 类似资料:
  • 据我所知,Linux容器不同于虚拟机。它是轻量级的虚拟化技术。所以我想知道它是否可以在虚拟机上运行,该虚拟机由管理程序提供,如xen、kvm或vmware? 我试图在基于zex的虚拟机上设置一个Linux容器(docker LXC用户空间工具)。它失败了。 如果尝试运行容器: 其实,我跟着一个博客做,作者做的,而我拧它。 有人能解释吗?或者干脆告诉我它不能在虚拟机上运行。非常感谢。

  • 本文向大家介绍Shell脚本判断Apache进程是否存在,包括了Shell脚本判断Apache进程是否存在的使用技巧和注意事项,需要的朋友参考一下 写一个脚本检查Apache进程是否存在,若不存在则显示不存在,若存在则显示进程个数,当不等于10个时用红色字体通知管理员,并询问管理员是否启动Apache服务。

  • 自己用django搭了一个网站,用subprocess调用了相同目录下的一个python文件, 调用的是一个GAN模型,views.py规定如下 服务器正常启动。 django编写的整个服务器调用的是pycharm创建的虚拟环境,但是调用单个脚本时调用默认运行环境,求教如何解决 试过向views.py和settings.py添加代码,并且已经注释掉了

  • cmf_is_mobile() 功能 判断是否为手机访问 参数 无 返回 boolean

  • 我正在尝试在我的虚拟机上安装kibana。当我启动kibana时,错误如下: vagrant@vagrant-ubuntu-trusty-64:~/elasticsearch-2.1.1/plugins/kibana-4.1.1-linux-x64$./bin/kibana{"name":"Kibana","host name":"流浪者-ubuntu-Trust y-64","pid": 136

  • cmf_is_mobile() 功能 判断是否为手机访问 参数 无 返回 boolean