it-swarm.com.de

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

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 VM oder physische Maschine) handelt. Aber ich habe mich gefragt, ob ich lscpu verwenden kann, zumal es eine universellere Methode ist als hostnamectl und es erfordert kein systemd. 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 wenn eine CPU nur einen Thread pro Kern hat, dies nicht unbedingt bedeutet, dass es VM sicher ist, aber dann sollten alle modernen CPUs 2 Threads pro Kern haben und zusätzlich kann ich Berücksichtigen Sie auch das Fehlen/Vorhandensein einer minimalen und maximalen CPU-Frequenz in der Ausgabe von lscpu.

13

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 angegebenen Bedingungen gibt es kompliziertere Ansätze wie diesen: Wo bin ich? Betriebssystem- und Virtualisierungsidentifikation ohne Systemaufrufe

17
Bob

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

Sie können sich die Logik ansehen, die von systemd-detect-virt Verwendet wird. Sie werden feststellen, dass sie tatsächlich an vielen Stellen nach verschiedenen Virtualisierungstechnologien sucht ...

Ich denke, etwas Naives wie das Betrachten der Ausgabe von lscpu könnte in einigen Fällen manchmal funktionieren, aber ich denke, es würde kaum die ganze Zeit funktionieren. 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.

12
filbranden