终端命令以查找服务器是虚拟服务器还是物理服务器


13

我正在寻找一个终端命令,该命令不要求执行用户位于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

在“图标名称和机箱”下,我可以看到它是VM还是物理机。但是我想知道是否可以使用lscpu,尤其是因为它是比通用的方法,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个线程,此外,我还可以考虑是否存在lscpu输出中的最小和最大CPU频率。


4
“所有现代CPU的每个内核都应有2个线程” -您从何处得到这个想法?英特尔今年发布了20种 不具备此功能的处理器。那只是英特尔。
marcelm

@marcelm,我不知道。
乔治·斯托雅诺夫'18

2
在某些情况下,为了获得最佳性能,需要在BIOS中关闭超线程。
doneal24 '18

Answers:


17

在给定条件下:

terminal命令,它不需要执行用户位于sudoers组中,并且不需要通用,也不需要安装其他软件包。

对于未修改的VM来说,最明显的最简单方法是所有者故意没有隐藏操作系统是VM的事实。

cat /sys/class/dmi/id/product_name

更多可能性:

在OP作者提供的条件之外,还有其他更复杂的方法,例如:我在哪里?无需系统调用的操作系统和虚拟化标识


1
@GeorgеStoyanov不客气!
鲍勃

如果没有其他配置,则libvirt-kvm-VM在运行时显示为“ Standard PC(i440FX + PIIX,1996)” cat /sys/class/dmi/id/product_name,因此我不确定它的用处。
乔纳斯·谢弗

2
@JonasWielicki这是一个定义良好的系统描述,默认情况下用于任何基于QEMU的VM,并且在常规硬件上从未见过。
奥斯汀·海默加恩

1
@JonasWielicki Standard PC (i440FX + PIIX, 1996)是QEMU / KVM虚拟机的知名指纹。顺便说一句,这个指纹可以很容易地被覆盖:askubuntu.com/questions/564643/…–
Bob

2
@JonasWielicki,pr -t /sys/class/dmi/id/sys_vendor /sys/class/dmi/id/product_name这两个文件的内容还应该使您非常准确地了解系统是物理的还是虚拟的。
乔治·斯托雅诺夫'18

12

这也需要systemd(无论如何,这在当今已经很普遍了),但是它systemd-detect-virt是一个更好的工具,可以告诉它是在物理还是虚拟硬件上运行。

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

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


我认为如果lscpu中缺少最小和最大频率,那么这也可能表明该机器确实是VM。但是您的方法似乎更可靠。
乔治·斯托雅诺夫'18

1
@GeorgеStoyanov这也可能意味着频率缩放由于其他一些原因而被完全禁用,因此它并不可靠。
奥斯汀·海默加恩
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.