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 hostnamectl
y 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 lscpu
salida.
fuente
Respuestas:
En condiciones dadas:
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
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
fuente
cat /sys/class/dmi/id/product_name
, por lo que no estoy seguro de lo útil que es.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/…pr -t /sys/class/dmi/id/sys_vendor /sys/class/dmi/id/product_name
el contenido de estos dos archivos también debería darle una idea bastante precisa de si el sistema es físico o virtual.Esto también requiere systemd (que de todos modos es bastante omnipresente en estos días), pero
systemd-detect-virt
es 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
lscpu
salida, 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í.fuente