作为Linux运维工程师,肯定会遇到过这种场景:接手一台服务器,却分不清是物理机还是虚拟机?去问交接的人?一来那显得不够专业啊,二来说不定交给你的人也是不清楚的。所以关键时刻还是得靠自己!其实区分物理机还是虚拟机的核心逻辑很简单:读取硬件标识、核查虚拟化内核模块。下面整理了5个方法,覆盖KVM、VMware、Xen等主流虚拟化平台,兼顾原理和实操,秒级判断出来!方法一、查看CPU标识(最通用,零依赖),物理机和虚拟机的CPU标识有明显差异:虚拟机的CPU会携带「hypervisor」特征标志,物理机则无。grep -E 'vmx|svm|hypervisor' /proc/cpuinfo
物理机:仅显示vmx(Intel虚拟化技术)或svm(AMD虚拟化技术),无hypervisor字段;若CPU不支持虚拟化,则两者均无,如下图是我们生产环境的1台物理机器,它是台工业电脑,安装的是Debian11:虚拟机:必出现hypervisor标志(所有虚拟化平台都会添加),如下面是我们生产环境的1台云主机:方法二、DMI(桌面管理接口)存储服务器硬件配置,虚拟机的DMI信息会带有虚拟化平台特征,物理机则显示真实厂商信息。# 查看系统制造商dmidecode -s system-manufacturer# 查看产品名称dmidecode -s system-product-name
如上面那台云主机是下面这样的,可以看到它是基于OpenStack技术的1台虚拟机:而另外那台物理机是可以看到厂商信息的,此处打码因为厂家也没给我广告费呀:方法三、通过检查内核模块区分,虚拟机内核会加载专属虚拟化驱动模块,物理机仅在启用虚拟化功能时加载宿主机模块,无客户机驱动。# 查看已加载的虚拟化模块lsmod | grep -E 'kvm|vmware|xen|vboxguest'
lsmod | grep -E 'xen_|virtio_|uvp_'
方法四、使用virt-what,它是Linux专用虚拟化检测工具,输出直接明了,嘎嘎香。apt update && apt install virt-whatvirt-what
- docker # Docker 容器(部分环境识别为lxc)
方法五、查看/proc/cmdline启动参数,虚拟机内核启动参数会包含虚拟化相关标识,物理机则无,适合辅助验证,这个方法我无法复现出来,我手上有的云主机和物理机都是没输出的,不知道啥情况,有懂的大佬指导一下啥情况:cat /proc/cmdline | grep -E 'xen|kvm|vmware'
以上5种方法(我其实就复现了4种,又标题党了!),下次遇到遇到判断服务器环境直接就自己搞定了。欢迎大佬再说下别的更好的方法!