2009-11-04 2 views
2

Dans les machines virtuelles La planification en temps réel fournie par le système d'exploitation a tendance à ne pas être fiable. Pour mon application, j'aimerais pouvoir détecter si je cours sur une VM ou non (Linux uniquement). Donc je cherche un moyen agréable de détecter (en C) si je suis dans un environnement virtualisé. Selon la machine virtuelle utilisée, il semble que plusieurs chaînes DMI et CPUID soient utilisées. Je suis surtout intéressé par un moyen générique.Recherche d'un bon moyen de détecter si je cours dans une machine virtuelle (Linux)

Vous avez des idées?

+1

Seules les heuristiques existent. Accepte-le et va de l'avant. – ephemient

+0

Voici également un paquet pour Ubuntu que j'ai découvert aujourd'hui.Cela s'appelle imvirt. Jetez un oeil à http://micky.ibh.net/~liske/imvirt.html. Pensez que cela pourrait être utile, même si c'est en PERL. –

Répondre

0

Recherchez des périphériques spécifiques qui n'apparaissent que lorsque vous êtes dans une machine virtuelle. Par exemple, un périphérique d'affichage marqué "Parallels" ou "VMWare" peut être une bonne indication que vous êtes dans une machine virtuelle.

Bien sûr, cela ne fonctionne que pour les machines virtuelles que vous connaissez et donc n'est pas très générique.

+0

DMI et CPUID sont plus utiles pour ce genre de choses. Mais ces commandes sont déjà nulles parce qu'elles sont heuristiques. – user175104

3

facter et imvirt seront à la fois détecter certains virtualizations

+0

et il semble y avoir au moins un troisième outil pour cela: virt-quoi jetez un oeil à la façon dont les projets le font – ptman

+0

Et aucun de ceux qui sont vraiment agréable à utiliser de C – user175104

+0

Vrai, c'est pourquoi j'ai ajouté "prendre un regarde comment ces projets le font " – ptman

1

Je pense que vous allez devoir faire heuristically. Une partie de l'objectif des produits de virtualisation est de faire croire à l'instance vm qu'elle fonctionne sur du matériel réel. Chaque produit de virtualisation va simuler un matériel spécifique, alors ma solution serait de créer une bibliothèque que vous pouvez demander "suis-je sur un VM" et de maintenir sous le capot une recherche de preuves de présence de VM. De cette façon, vous restez encore relativement isolé de la nitty gritty de détecter le VM.

2

Il semble que la vraie question à laquelle vous voulez répondre soit: "La planification en temps réel fonctionne-t-elle de manière non fiable?". Alors pourquoi ne pas écrire un test qui vérifie que?

0

mais pas définitif, vous pouvez également vérifier vos noms d'interface ... ifconfig crachait "venet0" plutôt que "eth0"

aussi, 'df' va donner quelques-uns dit: vmware -/dev/vzfs citrix/Xen -/dev/xvda1

1

Vous pouvez également rechercher VMware dans les dispositifs scsi:

cat /proc/scsi/scsi | grep VMware 

réussira probablement sur les machines virtuelles


exemple de sortie sur VM:

# cat /proc/scsi/scsi 
Attached devices: 
Host: scsi0 Channel: 00 Id: 00 Lun: 00 
    Vendor: VMware Model: Virtual disk  Rev: 1.0 
    Type: Direct-Access     ANSI SCSI revision: 02 
Host: scsi0 Channel: 00 Id: 01 Lun: 00 
    Vendor: VMware Model: Virtual disk  Rev: 1.0 
    Type: Direct-Access     ANSI SCSI revision: 02 

exemple sortie sur la machine réelle:

# cat /proc/scsi/scsi 
Attached devices: 
Host: scsi0 Channel: 00 Id: 00 Lun: 00 
    Vendor: TSSTcorp Model: CDRW/DVD TSL462D Rev: DE01 
    Type: CD-ROM       ANSI SCSI revision: 05 
Host: scsi6 Channel: 00 Id: 08 Lun: 00 
    Vendor: DP  Model: BACKPLANE  Rev: 1.05 
    Type: Enclosure      ANSI SCSI revision: 05 
Host: scsi6 Channel: 02 Id: 00 Lun: 00 
    Vendor: DELL  Model: PERC 5/i   Rev: 1.03 
    Type: Direct-Access     ANSI SCSI revision: 05 
0

ifconfig pour obtenir l'adresse MAC, puis rechercher le code fournisseur (google: mac recherche d'adresse). Aide si vous savez à l'avance quelle plate-forme de virtualisation est utilisée.

Questions connexes