systemd-detect-virt 是最轻量可靠的首选方法:返回 kvm、vmware、hyperv 等即为对应虚拟机,返回 none 即为物理机;其底层调用内核与 udev 标准接口,不依赖硬件指纹,且默认输出已足够区分主流平台。

systemd-detect-virt 直接返回平台类型
这是最轻量、最可靠的首选方法,只要系统用 systemd(绝大多数现代发行版都满足):systemd-detect-virt 会直接输出虚拟化平台名称,比如 kvm 或 vmware。它不依赖硬件指纹或日志解析,底层调用的是内核和 udev 提供的标准化接口。
常见输出含义:
-
kvm:通常指 QEMU/KVM(含阿里云、腾讯云、华为云等主流公有云底层) -
vmware:VMware Workstation、ESXi、Fusion 等 VMware 全系产品 -
hyperv:Microsoft Hyper-V -
none:物理机(不是虚拟机)
注意:systemd-detect-virt --vm 可强制只检测虚拟机(跳过容器),适合脚本中做布尔判断;但默认不加参数已足够区分 KVM 和 VMware。
lscpu 查看 Hypervisor vendor 字段
lscpu 的输出里如果有 Hypervisor vendor 行,基本可一锤定音:
- 出现
Hypervisor vendor: KVM→ KVM 虚拟机 - 出现
Hypervisor vendor: VMware, Inc.→ VMware 虚拟机 - 该字段为空或完全没这行 → 很可能不是虚拟机(或极少数被深度隐藏的环境)
这个字段来自内核在启动时识别到的 hypervisor 接口,比 BIOS 字符串更难伪造,且无需 root 权限就能读取。但某些旧内核(如 3.10 之前)或精简镜像可能不暴露该字段。
dmidecode 检查 manufacturer 和 product-name
当 systemd-detect-virt 或 lscpu 不可用(比如无 systemd 的嵌入式系统),dmidecode 是最常备的后备方案:
-
sudo dmidecode -s system-manufacturer:
→ 输出QEMU或Red Hat→ KVM
→ 输出VMware, Inc.→ VMware -
sudo dmidecode -s system-product-name:
→ 输出Standard PC (Q35 + ICH9, 2009)或RHEL Virtio SCSI→ KVM
→ 输出VMware Virtual Platform→ VMware
风险点:部分云厂商(如 AWS EC2)会把 system-manufacturer 设为 Amazon EC2,此时 systemd-detect-virt 返回 xen(历史兼容)或 kvm(新实例),而 dmidecode 显示的却是 Amazon 自定义字符串——这时必须以 systemd-detect-virt 为准,它做了平台适配层。
为什么不用 dmesg 或 /proc/cpuinfo 做主判断
dmesg | grep -i hypervisor 和 grep -i hypervisor /proc/cpuinfo 确实能返回线索,但它们不稳定:
-
dmesg输出依赖内核启动日志缓冲区是否被刷掉,长时间运行的系统可能已滚动丢失 -
/proc/cpuinfo中的flags字段只显示hypervisor标志位(表示“上面有 hypervisor”,不说明是哪家),无法区分 KVM 还是 VMware - 某些 KVM 配置(如启用
host-passthroughCPU 模式)会让/proc/cpuinfo完全模仿宿主机,连hypervisor标志都可能被隐藏
所以这两个命令适合交叉验证,不适合单独作为判断依据。
真正容易被忽略的是:KVM 和 VMware 在不同云环境下的“马甲”——比如阿里云返回 kvm,但底层是自研虚拟化增强版;VMware Fusion 在 macOS 上跑 Linux 虚拟机,systemd-detect-virt 仍返回 vmware。别迷信厂商名,认准命令输出本身。


















