博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何判断 Linux 是否运行在虚拟机上
阅读量:7017 次
发布时间:2019-06-28

本文共 4359 字,大约阅读时间需要 14 分钟。

hot3.png

[root@creditor-puhui tt]#  cat /proc/scsi/scsi Attached devices:Host: scsi1 Channel: 00 Id: 00 Lun: 00  Vendor: QEMU     Model: QEMU DVD-ROM     Rev: 0.12  Type:   CD-ROM                           ANSI  SCSI revision: 05[root@creditor-puhui tt]# ifconfigeth0      Link encap:Ethernet  HWaddr 52:54:00:6F:BB:D1            inet addr:192.168.0.79  Bcast:192.168.0.255  Mask:255.255.255.0          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1          RX packets:32826253 errors:0 dropped:0 overruns:0 frame:0          TX packets:21365790 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:1000           RX bytes:13837478435 (12.8 GiB)  TX bytes:13315359414 (12.4 GiB)lo        Link encap:Local Loopback            inet addr:127.0.0.1  Mask:255.0.0.0          UP LOOPBACK RUNNING  MTU:16436  Metric:1          RX packets:11649 errors:0 dropped:0 overruns:0 frame:0          TX packets:11649 errors:0 dropped:0 overruns:0 carrier:0          collisions:0 txqueuelen:0           RX bytes:640026 (625.0 KiB)  TX bytes:640026 (625.0 KiB)                    # cat /proc/scsi/scsi (如果是虚拟机,就是下面的结果,你看都是VMware)Attached devices:Host: scsi1 Channel: 00 Id: 00 Lun: 00  Vendor: NECVMWar Model: VMware IDE CDR10 Rev: 1.00  Type:   CD-ROM                           ANSI  SCSI revision: 05Host: scsi2 Channel: 00 Id: 00 Lun: 00  Vendor: VMware,  Model: VMware Virtual S Rev: 1.0  Type:   Direct-Access                    ANSI  SCSI revision: 02Host: scsi2 Channel: 00 Id: 01 Lun: 00  Vendor: VMware,  Model: VMware Virtual S Rev: 1.0  Type:   Direct-Access                    ANSI  SCSI revision: 02

在 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)# written by http://www.vpsee.comimport sys, osdef 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) * written by http://www.vpsee.com */#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.

转载于:https://my.oschina.net/u/2357525/blog/412203

你可能感兴趣的文章
mysql高可用方案之主主架构(master-master)
查看>>
限制用户多点并发登录之二——“脚本”
查看>>
Mysqldump5.6的新特性
查看>>
OC学习笔记[注意事项]
查看>>
使用Spinner和setDropDownViewResource
查看>>
机房日常技术总结——Linux篇
查看>>
如何从计算机中删除 Exchange Server 2003
查看>>
邮件服务器的基础知识概述
查看>>
C# 视频监控系列(1):准备
查看>>
Lync2013 升级错误总结7 Lync2013 外部共享PPT提示:网络连接已丢失或服务器正忙,...
查看>>
对于ibatis架构的认识
查看>>
linux下find,xargs命令详解和实例
查看>>
应用程序的日志通过rsyslog推送到syslog服务器
查看>>
Pandas groupby apply agg 区别 运行自定义函数
查看>>
AD灾难恢复各种情况
查看>>
JSSE编程基本代码
查看>>
webcdn故障处理一例
查看>>
FPGA是嵌入式系统设计的理想选择
查看>>
终端tty、虚拟控制台、FrameBuffer的切换过程
查看>>
组合模式(Composite)解析例子
查看>>