我就是认真:一文教你探测虚拟环境是物理机、虚拟机还是容器?

2023-10-18 1495阅读

目前裸机(物理机)、虚拟机、容器是云计算提供计算服务的三种主流方式。那么怎样判定一个虚拟shell环境到底是物理机、虚拟机还是容器呢?更进一步,如果是物理机,这个物理机厂商是哪个,虚拟机到底是 KVM 还是 XEN,容器是 Docker 还是 rkt、lxc 等?更进一步,如果是虚拟机,是否可以判定这个虚拟机是运行在 AWS 还是阿里以及 OpenStack,是否还能获取虚拟机的 UUID、instance-type、vpc-id、安全组等信息?01 判断容器目前还没有什么方式才能100%准确辨别虚拟环境能否是容器,至少我没有找到相关文献。

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

我就是认真:一文教你探测虚拟环境是物理机、虚拟机还是容器?
(图片来源网络,侵删)

更进一步,如果是物理机,这个物理机厂商是哪个,虚拟机到底是 KVM 还是 XEN,容器是 Docker 还是 rkt、lxc 等?

更进一步,如果是虚拟机,是否可以判定这个虚拟机是运行在 AWS 还是阿里以及 OpenStack,是否还能获取虚拟机的 UUID、instance-type、vpc-id、安全组等信息?这有点像我们在开发中常常使用的反射(reflection)机制,通过反射可以了解一个类实例(instance)的类(class)是哪个,更进一步可以了解这个类的父类是哪个、实现了什么方式、包含那些属性等。以下是我用到的一些方式,仅供参考。01 判断容器目前还没有什么方式才能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 的运行环境,估计也有一种容器。

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

另外,需要非常注意的是,容器需要最先判断,因为容器原本并没有任何的硬件虚拟化,容器发现的软件特征信息和宿主机发现的完全一样,因此以下介绍的借助lscpu以及DMI信息判断是否是虚拟机或者物理机,对容器并不适用。换句话说,不能因为lscpu的Hypervisor vendor值为KVM就表明一定是KVM虚拟机,因为它还有或许是容器。下文均假定将要排除为容器的状况。02 判断物理机

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

如果输出为 none,则表明是物理机。当然也能按照 lscpu 命令输出,看是否有 Hypervisor vendor 属性,如果没有该属性,则通常为物理机,如果存在该属性则一定是虚拟机:

本文从“云米网络(ymisp)”转载,原作者保留一切权利,若侵权请联系删除。

《我就是认真:一文教你探测虚拟环境是物理机、虚拟机还是容器?》来自互联网同行内容,若有侵权,请联系我们删除!

VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]