有时候我们拿到一台设备,因为不是自己的,不清楚是虚拟机还是物理机,那想判断是虚拟机还是物理机怎么办呢?在linux下提供一些命令可查看是物理机还是虚拟机,例如:lscpu、systemd-detect-virt、dmidecode命令等方式。
可以这么想,如果是物理机,这个物理机厂商是什么,如果是虚拟机,这是虚拟化环境到底是 VMware 还是 KVM呢等等信息。
下面我们通过几个命令来介绍如果判断是否是物理机还是虚拟机:
lscpu命令
我们先看man lscpu:
lscpu - display information about the CPU architecture
翻译就是显示有关CPU架构的信息。具体的描述如下:
翻译一下:
lscpu
命令从sysfs、/proc/cpuinfo、或者某些适用于特定架构的库中收集数据。命令的输出会以人类易读的方式展示如下信息:cpu、线程、核心、插槽和Non-Uniform MemoryAccess (NUMA)节点的数量,也有cpu共享缓存,cpu的族号,运行模式,处理指令的速度,大小端,步进等信息
在虚拟环境下,系统架构信息展示映射着客户操作系统的设置,这和物理主机是有明显差异的。在架构上支持检索物理拓扑信息,
lscpu
命令也显示主机系统中的物理插槽数量,芯片,内核数。
我们再来看一下命令执行结果:
可以看出厂商是VMware,表示这是一个虚拟机。我们再来看一下命令执行结果:
上面的信息,虚拟化类型是VT -x。
systemd-detect-virt命令
我们先看man systemd-detect-virt:
检测虚拟环境中的执行情况
具体的描述如下:
翻译如下:
systemd-detect-virt
在虚拟环境中检测执行。 它可以识别虚拟化技术,并且可以
将完整的VM虚拟化与容器虚拟化区分开来。
systemd-detect-virt
退出,返回值为0(成功)是否检测到虚拟化技术,否则为非零(错误)。 默认情况下,任何类型的检测到虚拟化,并且选–container和–vm可用于限制虚拟化的类型 检测到。
下面我们可以直接通过
systemd-detect-virt
命令判断是否物理机:
如果输出为none,则说明是物理机。如果输出下面的信息如:
表示这是一台虚拟机。
dmidecode命令
dmidecode
命令可以让你在Linux系统下获取有关硬件方面的信息。
dmidecode
的作用是将DMI数据库中的信息解码,以可读的文本方式显示。由于DMI信息可以人为修改,因此里面的信息不一定是系统准确的信息。dmidecode遵循SMBIOS/DMI标准,其输出的信息包括BIOS、系统、主板、处理器、内存、缓存等等。
我们再来看一下命令执行结果:
如上可以看出这台是物理机,厂商为MICRO-STAR…,型号为MS-S0391等信息。当然如果是虚拟机,如执行命令。
看出这台是虚拟机,还有厂商信息VMware等等。输入
dmidecode -s system-product-name
直接输出厂商信息。
虚拟机:
这个时候我们可以写个脚本:
#!/bin/bash
function IsVirtualMachine()
dmidecode -s system-product-name | grep -i "virtual"
if [ $? -eq 0 ]; then
return 1
return 0
IsVirtualMachine
编译输出:
在qemu kvm, VBOX虚拟机也可以这样判断。最后,还可以使用dmesg |grep -i virtual
命令查找,这里就不多说了。
检查当前设备是物理机还是虚拟机环境
下面写个程序,检查是物理机还是虚拟机环境,当前已知的虚拟环境类型基本都列举出来了,主要有:
qemu | QEMU 软件虚拟机 |
---|
kvm | Linux 内核虚拟机 |
zvm | s390 z/VM |
vmware | VMware 虚拟机 |
microsoft | Hyper-V 虚拟机 |
oracle | Oracle VirtualBox 虚拟机 |
xen | Xen 虚拟机(仅 domU, 非 dom0) |
bochs | Bochs 模拟器 |
uml | User-mode Linux |
parallels | Parallels Desktop, Parallels Server |
如上整合如下代码初略判断:
#include <stdio.h>
#include <string.h>
#define VIRTUAL_TYPE 13
int check_env_type(void){
FILE *fp = NULL;
char buff[256] = {0};
char *virtual[] = {"VMWARE","VIRTUAL","VIRUALBOX","VBOX","QEMU","KVM","ZVM","ORACLE","MICROSOFT","XEN","BOCHS","UML","PARALLELS"};
int i = 0;
if (NULL == (fp = popen("dmidecode -s system-product-name","r")))
printf("popen error\n");
return 1;
if (NULL != fgets(buff,sizeof(buff),fp))
printf("system name = %s\n",buff);
for (i = 0; i < VIRTUAL_TYPE; i++)
if (0 == strcasecmp(buff,virtual[i]))
printf("mach virtual system = %s\n",buff);
pclose(fp);
return 0;
printf("not match virtual system = %s \n",buff);
pclose(fp);
return 1;
int main(int argc, char *argv[]){
printf("Check whether it is a virtual machine or a physical machine\n");
printf("env type %d\n",check_env_type());
return 0;
输出结果:
上面测试的是在物理机上进行测试的,直接输出厂商信息。
如上总结了几种判断Linux服务器是虚拟机还是物理机的方法,不一定准确,仅供参考,当然也可能还有其他更好的方法。欢迎补充!
欢迎关注微信公众号【程序猿编码】,添加本人微信号(17865354792),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下:
或者dmesg | grep -i virtual
如果结果返回包含virtual,则是虚拟机:
[root@centos7xj ~]#dmesg |grep -i virtual
[ ...
很多情况下, 我们不清楚当前的Linux系统到底是物理机还是虚拟机. 这两种不同的机器性能上还是差别很大的.虽然现在流行云服务器的时代了, 不过还是物理机要好用很多. 资源能完全利用起来, 云机器就是扩容很方便容易. 根据需求付费扩容即可.
下面来介绍一下如何判定是什么类型的机器.
dmidecode -s system-product-name
也有的系统不支持这个命令, 还可以使用其他的命令也可以看出是什么平台类型
lshw -class syst...
Windows:在CMD里输入:Systeminfo | findstr /i "System Model"如果System Model:后面含有Virutal就是虚拟机,其他都是物理机或者用powershell命令:get-wmiobject win32_computersystem | fl model
Linux:
在bash里输入:dmidecode -s system-produ...
要检查服务器是物理服务器还是虚拟服务器,最简单的检查方法是使用dmidecode命令。
sudo dmidecode -s system-manufacturer
如果是物理系统,则应该看到制造商的名称,例如Dell,Lenovo等。
如果是虚拟系统,则应该看到类似QEMU的输出,即innotek Gmbh(用于VirtualBox)。
dmidecode命令用于以人类可读的格式解码计算机的DMI信息。
DMI(桌面管理界面的缩写)是几乎所有系统制造商都遵守的标准。DMI框架用于管理和跟踪台式机,便携式计算
1.使用dmidecode命令查看(root权限)
DMI (Desktop Management Interface, DMI)的主要组成部分是Management InformationFormat (MIF)数据库。这个数据库包括了所有有关电脑系统和配件的信息。通过DMI,用户可以获取序列号、电脑厂商、串口信息以及其它系统配件信息。
dmidecode -s system-produ...
术语(自行google,baidu)
DMI (Desktop Management Interface, DMI)的主要组成部分是Management InformationFormat (MIF)数据库。这个数据库包括了所有有关电脑系统和配件的信息。通过DMI,用户可以获取序列号、电脑厂商、串口信息以及其它系统配件信息。
SMBIOS
System Management BIOS,S
1、cmd使用命令:systeminfo | findstr /i "System Model"
如果System Model返回信息内:后面含有Virutal就是虚拟机,其他都是物理机
物理机输出:
C:\Users\Administrator>systeminfo |findstr /i "System Module"
System Boot ...
在CMD里输入:Systeminfo | findstr /i "System Model"
如果System Model:后面含有Virutal就是虚拟机,其他都是物理机
用powershell命令:get-wmiobject win32_computersystem | fl model
Linux:
在bash里输入:dmidecode -s system-product-name
dmesg | grep -i virtual
cat /proc/scsi/s