用于查明服务器是虚拟服务器还是物理服务器的终端命令

用于查明服务器是虚拟服务器还是物理服务器的终端命令

我正在寻找一个终端命令,它不需要执行用户位于 sudoers 组中,并且是通用的,不需要安装额外的软件包。到目前为止我发现如果系统安装了systemd那么我可以使用:

$ hostnamectl status
   Static hostname: mint
         Icon name: computer-laptop
           Chassis: laptop
        Machine ID: bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb
           Boot ID: aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
  Operating System: Linux Mint LMDE
            Kernel: Linux 3.16.0-6-amd64

在图标名称和机箱下,我可以看到它是虚拟机还是物理机。但我想知道我是否可以使用lscpu,特别是因为它是比 systemd 更通用的方法,hostnamectl并且不需要 systemd。我的理论是,如果 CPU 每个核心只有一个线程,并且也没有列出最小和最大 CPU 频率,这应该表明服务器确实是虚拟化的。

$ lscpu
Architecture:          x86_64
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                8
On-line CPU(s) list:   0-7
Thread(s) per core:    2
Core(s) per socket:    4
Socket(s):             1
NUMA node(s):          1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Model name:            Intel(R) Core(TM) i7-4710HQ CPU @ 2.50GHz
Stepping:              3
CPU MHz:               2500.488
CPU max MHz:           3500.0000
CPU min MHz:           800.0000
BogoMIPS:              4988.18
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              6144K
NUMA node0 CPU(s):     0-7

我知道如果一个CPU每个核心只有一个线程并不一定意味着它肯定是VM,但是所有现代CPU应该每个核心有2个线程,此外我还可以考虑缺少/存在输出中的最小和最大 CPU 频率lscpu

答案1

在给定条件下:

终端命令,不需要执行用户位于 sudoers 组中,并且是通用的,不需要安装额外的软件包。

对于未修改的虚拟机,所有者故意没有试图隐藏操作系统是虚拟机的事实,最简单的方法是

cat /sys/class/dmi/id/product_name

更多可能性:

除了 OP 作者给出的条件之外,还有更复杂的方法,如下所示:我在哪里?无需系统调用即可识别操作系统和虚拟化

答案2

这也需要 systemd(无论如何,现在它已经相当普遍了),但是systemd-detect-virt是一个更好的工具来判断它是在物理硬件还是虚拟硬件上运行。

你可以看看逻辑使用时systemd-detect-virt,您会注意到它实际上会查看许多地方来检测几种不同的虚拟化技术...

我认为一些天真的东西,比如查看lscpu输出,可能在某些情况下有时会起作用,但我认为它很难一直起作用。另请注意,许多技术使虚拟机的每个核心有可能(甚至可能)拥有多个线程,因此我什至认为该特定功能不足以在此进行任何类型的可靠检测。

相关内容