Терминальная команда, чтобы узнать, является ли сервер виртуальным или физическим

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. Моя теория состоит в том, что если у ЦП есть только один поток на ядро, а также не указаны минимальная и максимальная частота ЦП, это должно указывать на то, что сервер действительно виртуализирован.

$ 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

Я знаю, что если ЦП имеет только один поток на ядро, это не обязательно означает, что это виртуальная машина, но тогда все современные ЦП должны иметь 2 потока на ядро, и кроме того, я также могу принять во внимание отсутствие / наличие минимальная и максимальная частота процессора на lscpuвыходе.

Георгий Стоянов
источник
4
«Все современные процессоры должны иметь 2 потока на ядро». Откуда вы взяли эту идею? Intel выпустила 20 процессоров в этом году , которые не имеют этого. И это только Intel.
Марсель
@ marcelm, я этого не знал.
Георгий Стоянов
2
Существуют также случаи использования, когда для лучшей производительности требуется отключение гиперпоточности в BIOS.
doneal24

Ответы:

17

При данных условиях:

команда терминала, которая не требует, чтобы исполняющий пользователь находился в группе sudoers, а также был универсальным и не требовал установки дополнительных пакетов.

очевидный простейший метод для неизмененных виртуальных машин, владельцы которого намеренно не пытались скрыть тот факт, что ОС является виртуальной машиной,

cat /sys/class/dmi/id/product_name

Больше возможностей:

Помимо приведенных автором ОП условий, существуют более сложные подходы, подобные этому: где я? Идентификация операционной системы и виртуализации без системных вызовов

боб
источник
1
@ GeorgеStoyanov Всегда пожалуйста!
Боб
Без дополнительной настройки libvirt-kvm-VM отображается как «Стандартный ПК (i440FX + PIIX, 1996)» при запуске cat /sys/class/dmi/id/product_name, поэтому я не уверен, насколько это полезно.
Йонас Шефер
2
@JonasWielicki Это хорошо определенное описание системы, которое используется по умолчанию для любой виртуальной машины на основе QEMU, и никогда не встречается на обычном оборудовании.
Остин Хеммелгарн
1
@JonasWielicki Standard PC (i440FX + PIIX, 1996)- это хорошо известный отпечаток виртуальных машин QEMU / KVM. Кстати, этот отпечаток можно легко переопределить: askubuntu.com/questions/564643/…
Боб,
2
@JonasWielicki, pr -t /sys/class/dmi/id/sys_vendor /sys/class/dmi/id/product_nameсодержимое этих двух файлов также должно дать вам довольно точное представление о том, является ли система физической или виртуальной.
Георгий Стоянов
12

Это также требует systemd (который в наши дни довольно распространен), но systemd-detect-virtэто лучший инструмент, чтобы определить, работает ли он на физическом или виртуальном оборудовании.

Вы можете посмотреть на можно логике , используемой systemd-detect-virt, вы заметите , что она на самом деле выглядит во многих местах , чтобы обнаружить несколько различных технологий виртуализации ...

Я думаю, что что-то наивное, такое как просмотр lscpuрезультатов, может иногда работать, но я думаю, что это вряд ли будет работать постоянно. Также обратите внимание, что многие технологии позволяют (и даже вероятно) виртуальным машинам иметь более одного потока на ядро, поэтому я даже не думаю, что конкретной функции достаточно для любого надежного обнаружения.

filbranden
источник
Я думаю, что если в lscpu отсутствуют минимальная и максимальная частота, это также может указывать на то, что машина действительно является виртуальной машиной. Но ваш метод кажется более надежным.
Георгий Стоянов
1
@ GeorgеStoyanov Это также может означать, что масштабирование частоты полностью отключено по какой-то другой причине, поэтому оно ненадежно.
Остин Хеммельгарн