我正在寻找一个终端命令,它不需要执行用户在 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
,特别是因为它比它更通用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
。
在给定条件下:
对于未经修改的虚拟机来说,最简单的方法是,所有者故意没有试图隐藏操作系统是虚拟机的事实,是
更多可能性:
除了 OP 作者给出的条件之外,还有更复杂的方法,例如:我在哪里?无需系统调用的操作系统和虚拟化识别
这也需要 systemd (无论如何,这在当今非常普遍),但
systemd-detect-virt
它是一个更好的工具来判断它是在物理硬件上还是在虚拟硬件上运行。你可以看看使用的逻辑
systemd-detect-virt
,你会注意到它实际上查看了很多地方来检测几种不同的虚拟化技术......我认为某些天真的事情,例如查看
lscpu
输出,在某些情况下可能会起作用,但我认为它几乎不会一直起作用。另请注意,许多技术使 VM 有可能(甚至可能)每个内核拥有多个线程,因此我什至认为该特定功能不足以在这里进行任何可靠的检测。