Comando de terminal para averiguar si un servidor es virtual o físico

13

Estoy buscando un comando de terminal que no requiera que el usuario ejecutor esté en el grupo de sudoers y que también sea universal y no requiera instalar paquetes adicionales. Hasta ahora he descubierto que si el sistema tiene instalado systemd, entonces puedo usar:

$ 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

y bajo el nombre del icono y el chasis puedo ver si es VM o máquina física. Pero me preguntaba si puedo usarlo lscpu, especialmente porque es un método más universal que hostnamectly no requiere systemd. Mi teoría es que si la CPU tiene solo un hilo por núcleo y tampoco figura en la frecuencia mínima y máxima de la CPU, esto debería ser una indicación de que el servidor está realmente virtualizado.

$ 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

Sé que si una CPU tiene solo un subproceso por núcleo no significa necesariamente que sea VM, pero todas las CPU modernas deberían tener 2 subprocesos por núcleo y, además, también puedo tener en cuenta la falta / presencia de frecuencia de CPU mínima y máxima en la lscpusalida.

Georgе Stoyanov
fuente
44
"todas las CPU modernas deberían tener 2 hilos por núcleo" - ¿De dónde sacas esa idea? Intel ha lanzado 20 procesadores este año que no tienen eso. Y eso es solo Intel.
marcelm
@marcelm, no lo sabía.
Georgе Stoyanov
2
También hay casos de uso en los que el mejor rendimiento requiere que se desactive el hyperthreading en el BIOS.
doneal24

Respuestas:

17

En condiciones dadas:

comando de terminal que no requiere que el usuario ejecutor esté en el grupo sudoers y que también sea universal y no requiera instalar paquetes adicionales.

el método más simple y obvio para máquinas virtuales no modificadas, que los propietarios no han intentado ocultar intencionalmente que el sistema operativo es VM, es

cat /sys/class/dmi/id/product_name

Más posibilidades:

Fuera de las condiciones dadas por el autor de OP, hay enfoques más complicados como este: ¿Dónde estoy? Sistema operativo e identificación de virtualización sin llamadas al sistema

Beto
fuente
1
@ GeorgеStoyanov De nada!
Bob
Sin configuración adicional, un libvirt-kvm-VM se muestra como "PC estándar (i440FX + PIIX, 1996)" cuando se ejecuta cat /sys/class/dmi/id/product_name, por lo que no estoy seguro de lo útil que es.
Jonas Schäfer
2
@JonasWielicki Sin embargo, esa es una descripción bien definida del sistema que se usa por defecto para cualquier VM basada en QEMU, y nunca se ve en el hardware normal.
Austin Hemmelgarn
1
@JonasWielicki Standard PC (i440FX + PIIX, 1996)es una huella digital bien conocida de las máquinas virtuales QEMU / KVM. Por cierto, esta huella digital se puede anular fácilmente: askubuntu.com/questions/564643/…
Bob
2
@JonasWielicki, pr -t /sys/class/dmi/id/sys_vendor /sys/class/dmi/id/product_nameel contenido de estos dos archivos también debería darle una idea bastante precisa de si el sistema es físico o virtual.
Georgе Stoyanov
12

Esto también requiere systemd (que de todos modos es bastante omnipresente en estos días), pero systemd-detect-virtes una mejor herramienta para saber si esto se ejecuta en hardware físico o virtual.

Puede echar un vistazo a la lógica utilizada por systemd-detect-virt, notará que en realidad se ve en muchos lugares para detectar varias tecnologías de virtualización distintas ...

Creo que algo ingenuo, como mirar la lscpusalida, podría funcionar en algunos casos algunas veces, pero creo que difícilmente funcionaría todo el tiempo. También tenga en cuenta que muchas tecnologías hacen posible (e incluso probable) que las máquinas virtuales tengan más de un hilo por núcleo, por lo que ni siquiera creo que esa característica en particular sea suficiente para hacer ningún tipo de detección confiable aquí.

filbranden
fuente
Estoy pensando que si la frecuencia mínima y máxima faltan en la lscpu, esto también podría ser una indicación de que la máquina es realmente VM. Pero su método parece ser más confiable.
Georgе Stoyanov
1
@ GeorgеStoyanov Eso también podría significar que el escalado de frecuencia está completamente deshabilitado por alguna otra razón, por lo que no es confiable.
Austin Hemmelgarn