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

有时候我们拿到一台设备,因为不是自己的,不清楚是虚拟机还是物理机,那想判断是虚拟机还是物理机怎么办呢?在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
        fi
        return 0
}

IsVirtualMachine

编译输出:

在这里插入图片描述

在qemu kvm, VBOX虚拟机也可以这样判断。最后,还可以使用dmesg |grep -i virtual命令查找,这里就不多说了。

检查当前设备是物理机还是虚拟机环境

下面写个程序,检查是物理机还是虚拟机环境,当前已知的虚拟环境类型基本都列举出来了,主要有:

qemuQEMU 软件虚拟机
kvmLinux 内核虚拟机
zvms390 z/VM
vmwareVMware 虚拟机
microsoftHyper-V 虚拟机
oracleOracle VirtualBox 虚拟机
xenXen 虚拟机(仅 domU, 非 dom0)
bochsBochs 模拟器
umlUser-mode Linux
parallelsParallels 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[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),回复:领取学习资料。或者回复:进入技术交流群。网盘资料有如下:

在这里插入图片描述

### 回答1: Linux宿主可以通过以下几种方式访问虚拟机: 1. 通过 SSH 连接到虚拟机,可以在虚拟机中运行命令和管理文件 2. 通过网络共享文件夹,在宿主虚拟机之间共享文件 3. 通过 VNC 或 RDP 远程桌面访问虚拟机的图形界面 请确保在虚拟机中安装了正确的网络驱动,并正确配置网络连接。 ### 回答2: Linux宿主可以通过以下几种方式访问虚拟机: 1. 使用虚拟机管理软件的图形界面:常见的虚拟机管理软件包括VirtualBox、VMware等,这些软件都提供了图形界面,通过它们可以轻松访问和管理虚拟机。用户只需在宿主上打开相应的虚拟机管理软件,选择要访问的虚拟机,并在其中操作。 2. 使用SSH(Secure Shell)连接:SSH是一种网络协议,可通过网络安全地远程登录到一台计算,并在其上执行命令。用户可以在虚拟机中安装和启动一个SSH服务器,然后在宿主的终端中运行SSH命令,连接到虚拟机,并在其中执行各种操作。 3. 使用虚拟网络连接:虚拟机通常会创建一个虚拟的网络适配器,可以通过宿主物理网络适配器与其他设备通信。用户可以在虚拟机中设置网络共享或桥接功能,使得虚拟机可以直接通过宿主的网络连接进行访问。 4. 在宿主上设置端口转发:用户可以在宿主上设置端口转发规则,将宿主的特定端口映射到虚拟机中的对应端口。这样,用户可以在宿主的浏览器或其他应用程序中直接访问虚拟机上的服务。 总之,要实现Linux宿主虚拟机的访问,可以通过虚拟机管理软件的图形界面、SSH远程连接、虚拟网络连接或宿主上的端口转发等方式来实现。用户可以根据具体需求和场景选择合适的访问方式。 ### 回答3: Linux宿主可以通过多种方式访问虚拟机。 1. 桥接网络模式:在虚拟机的网络设置中选择桥接模式,将虚拟网卡与宿主物理网卡连接在一起,让虚拟机获得宿主所在局域网中的IP地址。这样宿主虚拟机就处于同一网络,可以通过IP地址相互访问。 2. NAT网络模式:在虚拟机的网络设置中选择NAT模式,虚拟机会获得宿主虚拟网卡分配的IP地址。宿主可以通过宿主的IP地址加上虚拟机的端口号来访问虚拟机,例如:192.168.0.1:8080。 3. 主模式:在虚拟机的网络设置中选择主模式,虚拟机会获得宿主一个虚拟网卡的IP地址。在主模式下,宿主可以使用该IP地址与虚拟机进行通信。 4. 仅主模式:在虚拟机的网络设置中选择仅主模式,虚拟机不会与外部网络相连。在这种模式下,宿主可以通过虚拟机软件提供的管理工具或命令行工具来访问虚拟机。 此外,还可以通过第三方工具,如SSH(Secure Shell)来远程访问虚拟机。宿主上可以通过SSH客户端连接虚拟机的SSH服务器,进行远程管理。 总之,Linux宿主可以通过网络模式设置、特定软件或工具等方式访问虚拟机,以便进行管理、操作和共享资源。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值