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 hostnamectl
und 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 lscpu
Ausgang.
quelle
Antworten:
Unter gegebenen Bedingungen:
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
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
quelle
cat /sys/class/dmi/id/product_name
, daher bin ich mir nicht sicher, wie nützlich das ist.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/…pr -t /sys/class/dmi/id/sys_vendor /sys/class/dmi/id/product_name
der Inhalt dieser beiden Dateien sollte Ihnen auch eine ziemlich genaue Vorstellung davon geben, ob das System physisch oder virtuell ist.Dies erfordert auch systemd (was heutzutage sowieso ziemlich allgegenwärtig ist),
systemd-detect-virt
ist 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
lscpu
Ausgabe 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.quelle