Question

Je n'ai pas été en mesure de trouver une documentation indiquant l'existence d'une API qui peut être utilisé pour automatiser les choses à l'intérieur d'un invité qemu.

Par exemple, je voudrais lancer un processus à l'intérieur de la machine hôte de la machine hôte. Libvirt ne semble pas contenir une telle fonctionnalité.

Était-ce utile?

La solution

Pour autant que je sache, le seul moyen de communiquer à l'invité est par le pont réseau.

Autres conseils

[Note: Automatisation sans utiliser l'API de virtualisation. De mon blog .]

Etape 1:

Par défaut, qemu utilise SDL pour afficher la sortie VGA. Ainsi, la première étape est de faire cette interaction avec qemu par stdio. QEMU fournit une option pour cela.

De qemu docs:

  

-nographic Normalement, QEMU utilise SDL pour afficher la sortie VGA. Avec cette option, vous pouvez désactiver totalement la sortie graphique de sorte que QEMU est   une simple application de ligne de commande. Le port série est émulé   redirigé sur la console. Par conséquent, vous pouvez toujours utiliser QEMU pour déboguer   un noyau Linux avec une console série.

Alors, tout ce que vous avez à faire est Invoke qemu avec -nographic.

  

qemu -nographic -hda guest.disk

Étape 2:

Maintenant que vous pouvez interagir avec votre invité (ou qemu processus) par la ligne de commande, vous devez automatiser cette interaction. La façon évidente de le faire en python est démarrer le processus de qemu (avec -nographic) avec Attendez-vous. Il est un outil d'automatisation pour les applications interactives écrites en Tcl.

Ce guide devrait vous aider à démarrer avec Attendez-vous. Voici le script à exécuter un invité avec qemu en utilisant Expect.

#!/usr/bin/expect -f

#starts guest vm, run benchmarks, poweroff
set timeout -1

#Assign a variable to the log file
set log     [lindex $argv 0]

#Start the guest VM
spawn qemu -nographic -hda guest.disk

#Login process
expect “login: “
#Enter username
send “user\r”

#Enter Password
expect “Password: “
send “user\r”

#Do whatever you want to do with in the guest VM. ( Run a process and write result to log )

#poweroff the Guest VM
expect “# “
send “shutdown -h now\r”

Le QEMU Moniteur peut interagir avec les systèmes invités dans une mesure limitée en utilisant sa propre console . Ceci inclut la lecture des registres, contrôle de la souris / clavier, et d'obtenir des photos d'écran. Il y a un QEMU Protocole Monitor (QMP) qui vous permettent de passer des commandes est JSON et à lire les valeurs du système invité .

J'utilise python avec pexpect pour interagir avec les machines virtuelles à l'aide de leurs consoles donné naissance série. Je généralement des scénarios qui automatise ont jusqu'à 128VMs cette façon, son assez rapide. J'utilise généralement virt-install pour les clients instancier et utiliser « console virsh (nomdomaine) » à l'aide pexpect pour obtenir une « poignée » à chaque console, donc je peux envoyer des commandes à configurer le réseau, des outils de démarrage / utilitaires / scripts, le fonctionnement du moniteur, etc. assez doux en termes de simplicité, et que les scripts ne sont que des commandes shell délivraient, vous n'êtes pas exposé aux API que le changement de version à l'autre, par exemple la console série sera toujours là. Parfois, j'utilise qemu directement, (ces derniers temps, je travaille avec un QEMU que libvirt ne supporte pas depuis son trop nouveau), dans ce cas, je vais avoir l'utilisation de la console invité un port telnet pour que je puisse « telnet localhost portnumber » pour faire un connexion console au lieu de "console virsh (nomdomaine)". De toute façon, les scripts python avec le module pexpect pour interagir avec les machines virtuelles est grande.

Vous pouvez créer un tunnel ssh inverse de invité à l'hôte, qui redirigera chaque demande à l'hôte sur le port spécifique à l'invité. De cette façon, vous aider à contrôler invité de l'hôte.

PyQemu peut théoriquement faire. Je l'ai utilisé dans le passé, bien qu'il ressemble à un projet rassis maintenant. Il fournit un agent de python (l'équivalent d'outils d'hôtes VMWare) à exécuter sur le client, qui communique avec l'hôte via le port série. Vous pouvez obtenir des procurations pour les modules Python en cours d'exécution dans le contexte de la machine virtuelle, et toute communication avec eux est marshalé sur le port série. Dans l'exemple suivant, AutoIt est utilisé pour automatiser le Bloc-notes:

machine = PyQemu.GetProxy("win2k")

# Wrap the machine object in another proxy representing the 'os'
# module running inside the VM.
os = PyQemu.vm.Module(machine,"os")

# NOTE: This is running on the VM!
os.system("notepad")

# Get an IDispatch object representing the autoit ActiveX control
autoit = PyQemu.vm.Dispatch(machine,"AutoItX3.Control")

# See if a window is active on the VM
state = autoit.WinActive("Untitled -")

Caveat: En raison de l'utilisation du port série, il est loin d'être rapide (indépendamment des paramètres de vitesse de série), donc peut-être préférable de transférer des données en vrac par d'autres moyens, par exemple Virtual image disque FAT.

Si vous utilisez Linux dans l'invité, ne pourriez-vous utiliser simplement ssh / écran pour lancer des processus distants sur l'invité?

Sinon, j'ai vu des gens écrivent wrappers python que l'utilisation popen() pour saisir stdin / stdout et les utiliser pour automatiser certaines commandes (à savoir quand vous voyez l'invite de connexion, envoyez le nom de connexion à stdin de QEMU.

Vous pouvez accéder à des clients à travers le filet en mettant le pont net ou en utilisant l'option -hostfwd.

Ce dernier est plus simple. Il vous permet d'exporter des clients tcp / udp à l'hôte. Vous pouvez mapper port tcp invité 22 pour héberger et gérer l'invité comme vous gérez de véritables machines à distance. Voir ce blog Courir à qemu fond.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top