Terminalbefehl, um herauszufinden, ob ein Server virtuell oder physisch ist

13

Ich suche nach einem Terminalbefehl, bei dem der ausführende Benutzer nicht zur sudoers-Gruppe gehören und universell sein muss und keine zusätzlichen Pakete installieren muss. Bisher habe ich festgestellt, dass ich Folgendes verwenden kann, wenn auf dem System systemd installiert ist:

$ 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

und unter Symbolname und Gehäuse kann ich sehen, ob es sich um eine VM oder eine physische Maschine handelt. Aber ich habe mich gefragt, ob ich es verwenden kann lscpu, zumal es eine universellere Methode ist als hostnamectlund es kein systemd erfordert. Meine Theorie ist, dass wenn die CPU nur einen Thread pro Kern hat und auch nicht die minimale und maximale CPU-Frequenz aufgeführt ist, dies ein Hinweis darauf sein sollte, dass der Server tatsächlich virtualisiert ist.

$ 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

Ich weiß, dass das, wenn eine CPU nur einen Thread pro Kern hat, nicht unbedingt bedeutet, dass es sich um eine VM handelt, aber dann sollten alle modernen CPUs 2 Threads pro Kern haben, und zusätzlich kann ich auch das Fehlen / Vorhandensein von berücksichtigen minimale und maximale CPU-Frequenz im lscpuAusgang.

Georgé Stoyanov
quelle
4
"Alle modernen CPUs sollten 2 Threads pro Kern haben" - Woher kommt diese Idee? Intel hat dieses Jahr 20 Prozessoren herausgebracht , die das nicht haben. Und das ist nur Intel.
Marcelm
@ Marcelm, das wusste ich nicht.
Georgé Stoyanov
2
Es gibt auch Anwendungsfälle, in denen für eine optimale Leistung das Deaktivieren von Hyperthreading im BIOS erforderlich ist.
Doneal24

Antworten:

17

Unter gegebenen Bedingungen:

Terminalbefehl, bei dem der ausführende Benutzer nicht zur sudoers-Gruppe gehören und universell sein muss und keine zusätzlichen Pakete installieren muss.

Die offensichtlich einfachste Methode für unveränderte VMs, bei der die Eigentümer absichtlich nicht versucht haben, die Tatsache zu verbergen, dass es sich bei dem Betriebssystem um eine VM handelt, ist

cat /sys/class/dmi/id/product_name

Weitere Möglichkeiten:

Außerhalb der vom OP-Autor gegebenen Bedingungen gibt es kompliziertere Ansätze wie diesen: Wo bin ich? Betriebssystem- und Virtualisierungsidentifikation ohne Systemaufrufe

Bob
quelle
1
@ GeorgеStoyanov Gern geschehen!
Bob
Ohne zusätzliche Konfiguration wird eine libvirt-kvm-VM beim Ausführen als "Standard-PC (i440FX + PIIX, 1996)" angezeigt cat /sys/class/dmi/id/product_name, daher bin ich mir nicht sicher, wie nützlich das ist.
Jonas Schäfer
2
@ JonasWielicki Dies ist eine genau definierte Systembeschreibung, die standardmäßig für jede QEMU-basierte VM verwendet wird und auf normaler Hardware nie angezeigt wird.
Austin Hemmelgarn
1
@ JonasWielicki Standard PC (i440FX + PIIX, 1996)ist ein bekannter Fingerabdruck von virtuellen QEMU / KVM-Maschinen. Übrigens kann dieser Fingerabdruck leicht überschrieben werden: askubuntu.com/questions/564643/…
Bob
2
@ JonasWielicki, pr -t /sys/class/dmi/id/sys_vendor /sys/class/dmi/id/product_nameder Inhalt dieser beiden Dateien sollte Ihnen auch eine ziemlich genaue Vorstellung davon geben, ob das System physisch oder virtuell ist.
Georgé Stoyanov
12

Dies erfordert auch systemd (was heutzutage sowieso ziemlich allgegenwärtig ist), systemd-detect-virtist jedoch ein besseres Tool, um festzustellen, ob dies auf physischer oder virtueller Hardware ausgeführt wird.

Wenn Sie sich die von verwendete Logik ansehen systemd-detect-virt, werden Sie feststellen, dass sie tatsächlich an vielen Stellen nach verschiedenen Virtualisierungstechnologien sucht ...

Ich denke, dass etwas Naives wie das Betrachten der lscpuAusgabe in einigen Fällen manchmal funktionieren könnte, aber ich denke, dass es kaum die ganze Zeit funktionieren würde. Beachten Sie auch, dass viele Technologien es VMs ermöglichen (und sogar wahrscheinlich machen), mehr als einen Thread pro Kern zu haben. Daher denke ich nicht, dass eine bestimmte Funktion ausreicht, um hier eine zuverlässige Erkennung durchzuführen.

filbranden
quelle
Ich denke, wenn die minimale und maximale Frequenz in der lscpu fehlen, könnte dies auch ein Hinweis darauf sein, dass es sich bei der Maschine tatsächlich um eine VM handelt. Ihre Methode scheint jedoch zuverlässiger zu sein.
Georgé Stoyanov
1
@ GeorgеStoyanov Das könnte auch bedeuten, dass die Frequenzskalierung aus einem anderen Grund vollständig deaktiviert ist und daher nicht zuverlässig ist.
Austin Hemmelgarn