Erkennen Sie, ob in VM ausgeführt wird und hängen Sie abhängig davon davon ab

321
David Heyman

Kontext: Ich bin eine zweite Person, die dieses Problem hatte - ein Dual-Boot-System mit einer gemeinsam genutzten Datenpartition. Außerdem möchten Sie eines der Betriebssysteme in einer VM auf der anderen ausführen. Als ich darüber nachdachte, wurde mir klar, dass das Problem möglicherweise dadurch gelöst werden könnte, dass der Datenträger aus /etc/fstabeinem separaten Startskript verschoben wird, in dem die Datenpartition entweder direkt vom Laufwerk oder aus einem von der VM-Software freigegebenen Ordner angehängt wird System läuft in einer VM oder nicht. So oder so zur selben Stelle im Dateisystem.

Ich würde eine Methode vorziehen, die drei Zustände haben kann: "In VM ausführen", "Außerhalb von VM ausführen" und "Kann nicht sagen". Wenn er auf der VM ausgeführt wurde, die VM-Software jedoch falsch konfiguriert wurde, sodass der freigegebene Ordner nicht für das virtualisierte Betriebssystem angezeigt wird (was mir zuvor schon passiert ist), versucht er nicht, das tatsächliche Laufwerk bereitzustellen und alles zu unterbrechen . Leider zählt das die einzige Idee, die ich hatte, nämlich "nach dem freigegebenen Ordner suchen, und wenn es nicht da ist, nehmen Sie keine VM an."

Wie kann das gemacht werden? Vorzugsweise, ohne dass ich es jedes Mal beim Booten manuell installieren muss.

Falls relevant, ist ein Betriebssystem Windows 10 und das andere ist Linux Mint, und Mint ist das Betriebssystem, das (manchmal) in einer VM ist.

0
Wie sieht es aus, wenn Ihr Skript die MAC-Adresse der aktuell aktivierten NIC überprüft? Hardware-MAC = außerhalb von VM ausgeführt, viraler MAC = innerhalb von VM und anderer MAC = unbekannt. Wenn Sie nicht über eine nicht triviale NIC verfügen, sollte dies nicht allzu schwer zu implementieren sein. Jens Ehrich vor 7 Jahren 0

1 Antwort auf die Frage

1
MariusMatutiae

In Linux, jeder Linux in einer VM - Umgebung ausgeführt wird durch das Vorhandensein eines signalisierten Hypervisor - Flag in / proc / cpuinfo . Wenn Sie also einen Arch Linux-Gast in einem Debian-Host ausführen, bekomme ich (als Sudo !):

# cat / proc / cpuinfo Prozessor: 0 vendor_id: GenuineIntel CPU-Familie: 6 Modell: 61 Modellname: Intel (R) Core (TM) i7-5500U-CPU bei 2.40 GHz Treten: 4 CPU-MHz: 2394.460 Cache-Größe: 4096 KB physikalische id: 0 Geschwister: 1 Kern-ID: 0 CPU-Kerne: 1 apicid: 0 Anfangsapicid: 0 fdiv_bug: nein f00f_bug: nein coma_bug: nein fpu: ja fpu_exception: ja cpuid level: 20 wp: ja Fahnen: FPU vme de pse tsc msr PAE mce CX8 APIC sep mtrr PGE mca cmov pat PSE36 CLFLUSH MMX fxsr sse sse2 syscall nx rdtscp lm CONSTANT_TSC xtopology NONSTOP_TSC eagerfpu pni pclmulqdq überwachen SSSE3 CX16 sse4_1 sse4_2 movbe popcnt aes XSAVE AVX rdrand Hypervisor lahf_lm abm 3DNowPrefetch rdseed Bugs: Bogomips: 4790.45 Clflush Größe: 64 cache_alignment: 64 Adressgrößen: 39 Bit physisch, 48 Bit virtuell Energieverwaltung: 

Manchmal verwenden die Leute dazu ein Skript namens virt-what (in den meisten Repos verfügbar), dies ist jedoch umständlicher, als es in Ihrem Fall wert ist. Außerdem ist die Installation zusätzlicher Software erforderlich ( virt-what und dmidecode, falls dies nicht standardmäßig in Ihrer Distribution enthalten ist, wie dies beispielsweise bei Arch Linux der Fall ist).

Gibt es plausible Situationen, in denen diese Flagge nicht erscheint, vorausgesetzt, es wird kein intensiver Versuch unternommen, die VM als Hardware zu tarnen? David Heyman vor 7 Jahren 0
@DavidHeyman Keiner, es sei denn, Sie denken an Linux-Container, bei denen es sich nicht wirklich um VMs handelt, daher kein * Hypervisor-Flag. MariusMatutiae vor 7 Jahren 0
Nein, ich habe nur an eine falsche Konfiguration gedacht. David Heyman vor 7 Jahren 0