我正在寻找一个终端命令,它不需要执行用户位于 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
输出,可能在某些情况下有时会起作用,但我认为它很难一直起作用。另请注意,许多技术使虚拟机的每个核心有可能(甚至可能)拥有多个线程,因此我什至认为该特定功能不足以在此进行任何类型的可靠检测。