我的编程空间,编程开发者的网络收藏夹
学习永远不晚

如何判断虚拟环境是物理机、虚拟机还是容器

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

如何判断虚拟环境是物理机、虚拟机还是容器

这篇文章主要讲解了“如何判断虚拟环境是物理机、虚拟机还是容器”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何判断虚拟环境是物理机、虚拟机还是容器”吧!

1、判断容器

目前还没有什么方法能够100%准确判断虚拟环境是否是容器,至少我没有找到相关文献。

如果环境有systemd-detect-virt命令,则可以直接通过systemd-detect-virt -c命令判断,如果输出为none则不是容器,否则会输出容器类型,比如lxc。目前很少容器里面放systemd的,我见过的就只有 LXD 的ubuntu镜像,因此这种方法适用性不广。

除此之外,可通过其他tricks判断,最简便的方法判断PID为1的进程,如果该进程就是应用进程则判断是容器,而如果是init进程或者systemd进程,则不一定是容器,当然不能排除是容器的情况,比如LXD/lXC实例的进程就为/sbin/init。

容器和虚拟机不一样的是,容器和宿主机是共享内核的,因此理论上容器内部是没有内核文件的,除非挂载了宿主机的/boot目录:

如何判断虚拟环境是物理机、虚拟机还是容器

另外,我们知道容器是通过cgroup实现资源限制,每个容器都会放到一个cgroup组中,如果是Docker,则cgroup的名称为docker-xxxx,其中xxxx为Docker容器的UUID。

而控制容器的资源,本质就是控制运行在容器内部的进程资源,因此我们可以通过查看容器内部进程为1的cgroup名称获取线索。

如下是我通过 Docker 跑 busybox 的 cgroup 信息:

如何判断虚拟环境是物理机、虚拟机还是容器

我们不仅可以知道这是 Docker 容器,还获取了 Docker 容器的 UUID 为 9ba…11。

根据如上的结论,判断一个虚拟环境是否 Docker 的脚本为:

如何判断虚拟环境是物理机、虚拟机还是容器

当然如果仅仅判断是否 Docker 容器,还能通过判断是否存在 .dockerenv 文件区分是否Docker 容器:

如何判断虚拟环境是物理机、虚拟机还是容器

rkt 容器类似,输出结果如下:

如何判断虚拟环境是物理机、虚拟机还是容器

如上的 \x2d 为-号:

如何判断虚拟环境是物理机、虚拟机还是容器

因此判断一个虚拟环境是否 rkt 的脚本为:

如何判断虚拟环境是物理机、虚拟机还是容器

好奇 AWS lambda 的运行环境是什么,于是写了个函数输出 /proc/1/cgroup,结果为:

如何判断虚拟环境是物理机、虚拟机还是容器

猜测是一种叫 sandbox 的运行环境,估计也是一种容器。

判断虚拟环境是否为容器环境相对比较复杂,目前没有完美的方案,总结过程如下:

  • 判断是否可运行 systemd-detect-virt -c 命令,如果输出为 none 则不是容器,否则可确定容器类型。

  • 判断 PID 1 如果为应用本身,则该虚拟环境是容器,否则不能确定是否是容器。

  • 判断是否存在加载的内核文件,如果不存在,则可判断为容器,否则不能确定是否为容器。

  • 判断是否存在 /.dockerenv 文件,如果存在则为 Docker 容器,否则不能确定是否为容器。读取 /proc/1/cgroup 文件,判断是否包含 docker、rkt 等关键字,如果包含,则说明为容器,否则不能确定是否为容器。

另外,需要特别注意的是,容器必须最先判断,因为容器本身并没有任何的硬件虚拟化,容器看到的硬件特性信息和宿主机看到的完全一样,因此下面介绍的通过lscpu以及DMI信息判断是否是虚拟机或者物理机,对容器并不适用。换句话说,不能因为lscpu的Hypervisor vendor值为KVM就说明一定是KVM虚拟机,因为它也有可能是容器。下文均假设已经排除为容器的情况。

2、判断物理机

如果使用了 systemd,则可以直接通过 systemd-detect-virt 命令判断是否物理机:

如何判断虚拟环境是物理机、虚拟机还是容器

如果输出为 none,则说明是物理机。

当然也可根据 lscpu 命令输出,看是否有 Hypervisor vendor 属性,如果没有该属性,则一般为物理机,如果存在该属性则一定是虚拟机:

如何判断虚拟环境是物理机、虚拟机还是容器

获取物理机的信息最直接的方式是查看 DMI 信息 /sys/firmware/dmi/tables/DMI,使用 dmidecode 命令解码:

如何判断虚拟环境是物理机、虚拟机还是容器

如上可以看出这是台物理机,厂商为 HP,型号为 ProLiant DL380 Gen9,序列号为6CU6468KKD。

通过 ipmitool 命令可以查看物理服务器的带外 IP:

如何判断虚拟环境是物理机、虚拟机还是容器

当然如果是虚拟机,如上命令会执行失败。另外也可以通过其他命令查看物理信息,如lshw 命令。

3、判断虚拟机

其实前面已经提到了,如果使用了systemd,则可以直接通过 systemd-detect-virt 命令判断是否虚拟机:

如果是虚拟机,则会输出虚拟机类型,如 kvm、oracle(virtualbox)、xen 等。

当然也可根据 lscpu 命令输出,查看 Hypervisor vendor 属性值:

如何判断虚拟环境是物理机、虚拟机还是容器

通过如上命令,我的一台 AWS 虚拟机输出为 Xen,阿里云虚拟机为 KVM,VirtualBox虚拟机也输出为 KVM,这是因为我使用了 KVM 硬件加速虚拟化。

我的搬瓦工虚拟机输出也为 KVM,可见搬瓦工主机也是 KVM 虚拟机。

通过如上方法可以获取虚拟机的虚拟化类型,能否获取更多信息呢?参考物理机的获取方式,我们可以通过 dmidecode 命令获取更多的虚拟机信息。比如我在一台 OpenStack 虚拟机运行如下命令:

如何判断虚拟环境是物理机、虚拟机还是容器

如上 Manufacturer 为 OpenStack Foundation,说明运行在 OpenStack 平台,Version为 Nova 版本,根据 OpenStack 的 releases 可知 15.0.1 对应为 OpenStack Ocata 版本,而 UUID 即虚拟机的 UUID。

AWS 上的一台虚拟机输出为:

如何判断虚拟环境是物理机、虚拟机还是容器

在 Version 中标明了 amazon 字样。

阿里云虚拟机如下(感谢L神提供的输出):

如何判断虚拟环境是物理机、虚拟机还是容器

可见虽然可以从 system 信息中获取云厂商的线索,但其实虚拟机的 system 信息并没有统一的标准,有的在 version 中体现,有的在 Product Name 中表现,完全取决于云厂商自己的配置。

如上整合如下脚本初略判断:

如何判断虚拟环境是物理机、虚拟机还是容器

如上也可以判断公有云是否基于 OpenStack 实现,比如华为虚拟机输出为 OpenStack,可大致猜测华为的公有云是基于 OpenStack 实现的。

AWS 以及 OpenStack 系的虚拟机还可以通过 metadata 或者 ConfigDrive 获取更多信息,以 metadata 为例:

获取虚拟机的 ID:

如何判断虚拟环境是物理机、虚拟机还是容器

获取 instance type (规格):

如何判断虚拟环境是物理机、虚拟机还是容器

获取虚拟机的公有IP(弹性IP),这个挺有用的,因为在虚拟机没法通过ifconfig查看弹性IP,经常登录虚拟机后,忘记自己的公有IP:

如何判断虚拟环境是物理机、虚拟机还是容器

其他的比如 vpc-id、ami id(镜像id)、安全组、公钥名等都可以通过该方式获取。

如果是 OpenStack,还可以使用 OpenStack 的 metadata 获取更多信息:

如何判断虚拟环境是物理机、虚拟机还是容器

如上可获取虚拟机的租户 ID、volume type 等信息。当然邪恶点可以通过查看 userdata获取虚拟机初始化 root 密码。AWS 甚至可以查看 AccessKeyId 以及SecretAccessKey。

4、总结

如上总结了几种判断虚拟化环境类型的方法,不一定准确,仅供参考,当然也可能还有其他更好的方法。

如下是根据前面的结论写的一个探测虚拟化类型的脚本,不一定健壮完备,仅供参考:

如何判断虚拟环境是物理机、虚拟机还是容器

如何判断虚拟环境是物理机、虚拟机还是容器

感谢各位的阅读,以上就是“如何判断虚拟环境是物理机、虚拟机还是容器”的内容了,经过本文的学习后,相信大家对如何判断虚拟环境是物理机、虚拟机还是容器这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

如何判断虚拟环境是物理机、虚拟机还是容器

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

一文教你探测虚拟环境是物理机、虚拟机还是容器?

目前裸机(物理机)、虚拟机、容器是云计算提供计算服务的三种主流形式。那么如何判断一个虚拟shell环境到底是物理机、虚拟机还是容器呢?

linux如何判断是否是虚拟机

本篇内容主要讲解“linux如何判断是否是虚拟机”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“linux如何判断是否是虚拟机”吧!方法:1、利用dmidecode命令判断,该命令可获取有关硬件方
2023-06-22

2023,容器还是虚拟机?

无论你的组织有什么要求,也不管你为应用程序选择容器还是虚拟机,在企业软件世界中始终有一条基本规则在发挥作用:变革是困难的。

阿里云ECS是物理机还是虚拟机?

简介阿里云ECS(ElasticComputeService)是一种弹性计算服务,它提供了可扩展的计算能力,帮助用户快速构建和部署应用程序。在阿里云ECS中,用户可以选择使用物理机或虚拟机来运行他们的应用程序。那么,阿里云ECS是物理机还是虚拟机呢?本文将为您解答这个问题。物理机和虚拟机的区别首先,让我们了解一下物理机
阿里云ECS是物理机还是虚拟机?
2024-01-31

阿里云服务器物理机还是虚拟机?

随着云计算的兴起,越来越多的企业和个人开始使用阿里云服务器。然而,对于那些对云计算还不太了解的人来说,可能会疑惑:阿里云服务器是物理机还是虚拟机?本文将详细解答这个问题。阿里云服务器是由阿里云公司提供的云计算服务,它在物理机的基础上,通过虚拟化技术将多台物理服务器整合成一台虚拟服务器。换句话说,阿里云服务器既不是
阿里云服务器物理机还是虚拟机?
2023-10-29

云服务器是实物吗还是虚拟机

云服务器是一种虚拟服务器,通常用于在云端托管应用程序和数据。与传统的本地实体服务器不同,云服务器是虚拟的,它存储和处理用户提供的服务,而不需要在本地物理服务器上存储数据。在云服务器上,用户可以选择使用任何类型的服务器来托管应用程序和数据,包括本地或云端。云服务器的优点包括:更高的灵活性和可扩展性:云服务器可以根据需求扩展,可以在本地或云端添加更多的服务器。这意味着你可以在需要时将应用程序和
2023-10-26

怎么查看使用的Linux是虚拟机还是物理机

平时工作中使用Linux大部分是通过ssh远程连接到服务器上,那么,对于没有进过机房的人,如何知道自己使用的Linux服务器是虚拟机还是物理机呢?
Linux虚拟机2024-11-30

如何检查 Linux 系统是运行在虚拟机上还是物理机上?

除了本机开发以外,我们平时使用 Linux 大部分是通过 ssh 连接到远程服务器上的,比如系统部署、运维等工作。

边缘计算工作负载:虚拟机,容器还是裸机?

我们生活在一个连接和智能设备的时代。随着智能设备数量的增长,数据的增长迅速达到了新的高度。这些数据从终端用户到达云或数据中心后再进行处理、存储和其他分析操作,因此,当访问时必定会带来延迟和带宽问题。正如Nati Shalom在他的博客文章中
2023-06-03

如何理解Python虚拟机中的Python运行环境

今天就跟大家聊聊有关如何理解Python虚拟机中的Python运行环境,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。其实Python运行环境是一个全局性的概念,而执行环境实际就是一个
2023-06-17

便宜云虚拟主机如何判断是否中了木马病毒

判断便宜云虚拟主机是否中了木马病毒的方法:1、使用Netstat命令查看是否存在一些恶意的IP连接,如开放了一些不常见的端口;2、看文件名是否变为.exe结尾,文件夹或.txt、Word等其他文件是否都变成了.exe 格式;3、看CPU负载
2023-02-08

云服务器也是物理机虚拟出来的嘛

云服务器是一种虚拟化的服务,它将计算资源分配给虚拟的服务器,使它们可以像物理计算机一样运行和管理。云服务器通常采用软件即服务(SaaS)的方式来提供,客户可以通过互联网访问和使用各种云服务,例如亚马逊、微软、Google等等。虚拟服务器是云服务器上的一种资源,它可以通过互联网连接到远程服务器进行运行,并可以根据用户的需求动态地扩展或缩减资源。因此,云服务器可以让用户像使用本地计算机一样方便地使
2023-10-26

如何理解Java虚拟机及JVM体系结构是什么

今天就跟大家聊聊有关如何理解Java虚拟机及JVM体系结构是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。JVM(Java 虚拟机)Java虚拟机,java源文件(.java)通
2023-06-17

C++ 虚拟函数的编译原理:代码是如何转换成机器指令的

编译过程:预处理:去除注释、宏定义等。词法分析:分解代码为基本单元(标识符、关键字)。语法分析:构建语法树。语义分析:检查语义正确性。中间代码生成:生成平台无关的中间代码。代码生成:生成目标平台的汇编语言或机器代码。虚拟函数编译:虚函数表生
C++ 虚拟函数的编译原理:代码是如何转换成机器指令的
2024-04-28

Java中的JVM是如何实现内存管理的?(请解释Java虚拟机(JVM)如何进行内存分配与回收?)

Java虚拟机(JVM)通过自动内存管理机制,在Java程序运行时管理内存分配和回收。新创建的对象分配到堆内存的年轻代,称为伊甸园,存活时间增长后晋升到幸存者区域,再晋升到年老代。JVM使用不同的垃圾回收器,如标记-清除、复制和标记-整理,清除垃圾对象。此外,JVM还提供其他内存管理机制,如本地内存、栈内存和方法区,确保程序稳定运行。
Java中的JVM是如何实现内存管理的?(请解释Java虚拟机(JVM)如何进行内存分配与回收?)
2024-04-02

如何在IDE部署springboot项目(有swagger和无swagger都是一样的)到服务器或者虚拟机上的docker

这篇文章主要介绍了如何在IDE部署springboot项目(有swagger和无swagger都是一样的)到服务器或者虚拟机上的docker,本文给大家分享我的安装历程,需要的朋友可以参考下
2023-01-09

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录