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学习之CentOS(一)----在VMware虚拟机中安装CentOS 7(图文教程)
- 虚拟机linux端mysql数据库无法远程访问的解决办法
- Virtualbox主机和虚拟机之间文件夹共享及双向拷贝(Windows<->Windows, Windows<->Linux)
- linux下配置和安装KVM虚拟机的步骤
- 手把手教你配置一台Linux虚拟机
- Linux虚拟机中node.js之开发环境搭建
- 详解在Linux虚拟机下配置tomcat
- linux mint 18虚拟机下设置1080P分辨率的方法
- 虚拟机中使用linux系启用文件共享之后的文件存在的位置方法
- Linux学习第一篇 虚拟机和镜像文件安装配置
- 如何判断 Linux 是否运行在虚拟机上
- python脚本检测linux进程是否运行
- linux下python脚本判断目录和文件是否存在
- 如何判断 Linux 是否运行在虚拟机上
- 如何判断 Linux 是否运行在虚拟机上
- [转]如何判断 Linux 是否运行在虚拟机上
- python 脚本在linux环境下运行
- Linux下判断程序是否高级权限运行
- 判断程序是否在虚拟机vmware内运行
- Linux系统shell脚本判断变量文件目录:权限、是否存在、空值、相等
- 解决Linux下运行Python脚本显示“: 没有那个文件或目录”的问题
- 判断程序是否运行在虚拟机中的代码
- linux的shell脚本下判断一个变量值或字符串是否为整数
- 如何在Windows环境下运行从linux 移植的Python脚本
- Inno Setup安装、卸载时判断是否程序正在运行,安装完成时自动打开网页的脚本
- 用脚本判断用户传参的参数是否有对应的进程在运行并把结果显示给用户
- Linux系统shell脚本判断变量文件目录:权限、是否存在、空值、相等
- 一个简单的判断远端服务器端口是否通的Python脚本
- 修改hosts文件(判断是否为管理员/以管理员权限运行脚本)
- linux脚本-判断进程是否存在,从而可以做预警处理..