判断物理机 虚拟机 容器

简介

使用ssh连接到服务器后,可以通过如下几种方式来判断连接到的服务器是物理主机、虚拟机、还是云主机,还是docker环境???
容器和虚拟机的区别:容器共享内核,虚拟机独享内核
虚拟机和物理机的区别:虚拟机是软件模拟的完整硬件系统功能的、完全隔离环境的计算机系统。只要模拟的全面,是没有太大差别的。除了性能差异,毕竟软件做了硬件的事。
目前我们经常见到的VPS虚拟化技术有KVM、OpenVZ、XEN、Hyper-V、VMware等。
当拿到shell权限,看到数字和字母随机生成的主机名大概率猜到在容器里了,查看进程,进程数很少,PID为1的进程为业务进程,这也是容器环境的典型特征。当然,以上这两种都是比较主观的判断。

方法1:使用 virt-what

区分虚拟机和物理机的一个方法是使用 virt-what。virt-what 实际上是一个 Shell 脚本。它通过各种启发式方法来识别虚拟化环境类型,可以检测出 QEMU/KVM、VMware、Hyper-V、VirtualBox、OpenVZ/Virtuozzo、Xen、LXC、IBM PowerVM 以及 Parallels 等平台类型。
基本上,可以将其理解为是一个 shell 脚本,可以作为命令安装在大多数 Linux 发行版中。安装命令如下:
如果系统运行在一个物理机上,virt-what 命令将不会返回任何结果;相反,如果是运行在虚拟机上,将会输出虚拟机的一些信息,例如kvm、xen等,如下所示:
如果出现没有结果的情况,大概率是物理机,小概率是不能识别的虚拟化技术。

方法2:dmidecode命令查看

DMI 是桌面管理界面(Desktop Management Interface)的缩写,是几乎所有系统制造商都遵守的标准。DMI 框架用于管理和跟踪桌面、笔记本电脑或服务器计算机中的组件。
由于有了 DMI,我们可以获得有关系统硬件、系统制造商和设备序列号的信息,而使用 dmidecode(DMI Decode)命令,可以获取这些信息。另外,使用 -s system-manufacturer 也可获取制造商的详细信息。
如果是物理机,你会看到机器制造商的名称,比如 Dell,Lenovo,Huawei 等;
如果是虚拟机,你会看到一些类似于 QEMU , innotek Gmbh(for VirtualBox),Bochs,VMware Virtual Platform 等的输出信息。
华为云ECS云主机:
阿里云ECS云主机:
WSL2:
Bochs虚拟技术:
华为的物理机:

方法3:查看根分区的磁盘类型

一般物理机的根分区为/dev/sda2,而云主机的根分区为/dev/vda1,如下:
注意:也有部分云主机的根目录使用的是共享盘,那么磁盘类型也是/dev/sda1,如下:

方法4:查看欢迎语

各个厂商的云主机都配置了欢迎语,即文件/etc/motd,如下:

方法5:判断是否docker环境

cat /proc/1/cgroup

最简单精准的方式就是查询系统进程的cgroup信息,通过响应的内容可以识别当前进程所处的运行环境,就可以知道是在虚拟机、docker还是kubepods里。
使用命令查看cgroup:
原理:容器是通过 cgroup 实现资源限制,判断容器是否在一个 cgroup 组中
如果是docker,显示:
如果是K8S环境下:
notion image
如果是虚拟机或者物理机器,显示:

检查/.dockerenv文件

通过判断根目录下的 .dockerenv文件是否存在,可以简单的识别docker环境。
K8s&docker环境下:ls -alh /.dockerenv 可以找到该文件,内容为空。虚拟机环境下:是没有这个.dockerenv文件的。

检查mount信息

利用mount查看挂载磁盘是否存在docker相关信息。

方法6:使用hostnamectl

可以直接判断是否是docker环境。

方法7:查看/sys/class/dmi/id/product_name文件

方法8:lshw命令

lshw命令收集关于主机的硬件(比如处理器、磁盘、内存和USB控制器等)和配置大量信息。使用以下命令:

方法9:systemd-detect-virt命令

systemd-detect-virt 用于检测系统的运行环境是否为虚拟化环境,以及更进一步检测是哪种虚拟化环境,比如是哪种虚拟机或哪种容器。使用以下命令:

方法10:dmesg命令

dmesg命令显示linux内核的环形缓冲区信息,我们可以从中获得诸如系统架构、cpu、挂载的硬件,RAM等多个运行级别的大量的系统信息。使用以下命令:

方法11:lscpu

lscpu命令在Linux下输出与系统CPU相关的信息。此命令从 /proc/cpuinfo 和 sysfs文件中检索CPU的体系结构(线程、CPU高速缓存、CPU 系列型号、内核、CPU数量等)信息,并将其显示在终端中。使用以下命令:

方法12:lscpi命令

lspci命令是用于列出所有PCI总线上的设备信息,输出结果包括:设备的类别、型号、厂商、状态、IRQ等信息。输出结果的每一行对应一个设备,通常默认按照总线、设备号、功能号的顺序排列。使用以下命令:

总结

这几种办法可以综合来判断。

参考

其它方法请参考:
Loading...
文章列表
王小扬博客
云原生
Git
Elasticsearch
Apollo
产品
Think
生活技巧
软件开发
计算机网络
CI
DB
设计
缓存
Docker
Node
操作系统
Java
大前端
Nestjs
其他
PHP
AI