hehezi 发表于 2022-5-11 20:01:18

Linux下如何判断服务器是虚拟机还是物理机?

https://img-blog.csdnimg.cn/20200814095544358.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzM5MTI4MjU0,size_16,color_FFFFFF,t_70#pic_center有时候我们拿到一台设备,因为不是自己的,不清楚是虚拟机还是物理机,那想判断是虚拟机还是物理机怎么办呢?在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/bashfunction IsVirtualMachine()
{
dmidecode -s system-product-name | grep -i “virtual”
if [ $? -eq 0 ]; then
return 1
fi
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/**********************************
功能描述:检查当前设备是实体机还是虚拟机环境
返回值: 0虚拟机环境,1实体机环境
***********************************/int check_env_type(void){FILE *fp = NULL;char buff = {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))        输出结果在这里插入图片描述上面测试的是在物理机上进行测试的,直接输出厂商信息。总结如上总结了几种判断Linux服务器是虚拟机还是物理机的方法,不一定准确,仅供参考,当然也可能还有其他更好的方法。欢迎补充! www.jyingyun。comq 300881195八

本文地址:http://www.wangzhan.org.cn/thread-4440-1-1.html
页: [1]
查看完整版本: Linux下如何判断服务器是虚拟机还是物理机?