Commande de terminal pour savoir si un serveur est virtuel ou physique

13

Je recherche une commande de terminal qui ne nécessite pas que l'utilisateur exécutant soit dans le groupe sudoers et soit universel et ne nécessite pas d'installer de packages supplémentaires. Jusqu'à présent, j'ai trouvé que si le système a installé systemd, je peux utiliser:

$ 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

et sous le nom de l'icône et le châssis, je peux voir s'il s'agit d'une machine virtuelle ou physique. Mais je me demandais si je pouvais l'utiliser lscpu, d'autant plus que c'est une méthode plus universelle que hostnamectlet qu'elle ne nécessite pas systemd. Ma théorie est que si le processeur n'a qu'un seul thread par cœur et qu'il n'est pas non plus répertorié la fréquence minimale et maximale du processeur, cela devrait être une indication que le serveur est effectivement virtualisé.

$ 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

Je sais que si un processeur n'a qu'un seul thread par cœur ne signifie pas nécessairement qu'il s'agit de VM à coup sûr, mais tous les processeurs modernes devraient avoir 2 threads par cœur et en plus, je peux également prendre en compte le manque / la présence de fréquence CPU minimale et maximale dans la lscpusortie.

Georgе Stoyanov
la source
4
"tous les processeurs modernes devraient avoir 2 threads par cœur" - D'où vous vient cette idée? Intel a sorti 20 processeurs cette année qui n'en ont pas. Et c'est juste Intel.
marcelm
@marcelm, je ne le savais pas.
Georgе Stoyanov
2
Il existe également des cas d'utilisation où les meilleures performances nécessitent que l'hyperthreading soit désactivé dans le BIOS.
doneal24

Réponses:

17

Sous certaines conditions:

commande de terminal qui ne nécessite pas que l'utilisateur exécutant soit dans le groupe sudoers et soit également universel et ne nécessitant pas d'installer de packages supplémentaires.

la méthode la plus simple évidente pour les machines virtuelles non modifiées, que les propriétaires n'ont pas intentionnellement tenté de cacher que le système d'exploitation est une machine virtuelle, est

cat /sys/class/dmi/id/product_name

Plus de possibilités:

En dehors des conditions données par l'auteur du PO, il existe des approches plus compliquées comme celle-ci: où suis-je? Identification du système d'exploitation et de la virtualisation sans appels système

Bob
la source
1
@ GeorgеStoyanov Vous êtes les bienvenus!
Bob
Sans configuration supplémentaire, une libvirt-kvm-VM s'affiche en tant que «PC standard (i440FX + PIIX, 1996)» lors de son exécution cat /sys/class/dmi/id/product_name, donc je ne sais pas à quel point cela est utile.
Jonas Schäfer
2
@JonasWielicki C'est une description de système bien définie utilisée par défaut pour toute machine virtuelle basée sur QEMU, et elle n'est jamais vue sur du matériel normal.
Austin Hemmelgarn
1
@JonasWielicki Standard PC (i440FX + PIIX, 1996)est une empreinte digitale bien connue des machines virtuelles QEMU / KVM. Au fait, cette empreinte digitale peut être facilement remplacée
Bob
2
@JonasWielicki, pr -t /sys/class/dmi/id/sys_vendor /sys/class/dmi/id/product_namele contenu de ces deux fichiers devrait également vous donner une idée assez précise si le système est physique ou virtuel.
Georgе Stoyanov
12

Cela nécessite également systemd (qui est de toute façon assez omniprésent de nos jours), mais systemd-detect-virtc'est un meilleur outil pour savoir si cela fonctionne sur du matériel physique ou virtuel.

Vous pouvez jeter un œil à la logique utilisée par systemd-detect-virt, vous remarquerez qu'il examine en fait de nombreux endroits pour détecter plusieurs technologies de virtualisation distinctes ...

Je pense que quelque chose de naïf tel que regarder la lscpusortie pourrait fonctionner dans certains cas, mais je pense que cela ne fonctionnerait presque pas tout le temps. Veuillez également noter que de nombreuses technologies permettent (et même vraisemblablement) aux machines virtuelles d'avoir plus d'un thread par cœur, donc je ne pense même pas que cette fonctionnalité particulière soit suffisante pour effectuer tout type de détection fiable ici.

filbranden
la source
Je pense que si les fréquences minimale et maximale sont absentes du lscpu, cela pourrait également être une indication que la machine est bien une VM. Mais votre méthode semble être plus fiable.
Georgе Stoyanov
1
@ GeorgеStoyanov Cela pourrait également signifier que la mise à l'échelle des fréquences est complètement désactivée pour une autre raison, donc ce n'est pas fiable.
Austin Hemmelgarn