qemu客户自动化

时间:2010-06-30 02:01:21

标签: qemu

我无法找到任何文档说明是否存在可用于自动化qemu guest虚拟机内部内容的API。

例如,我想从主机启动客户机内部的进程。 Libvirt似乎不包含此类功能。

8 个答案:

答案 0 :(得分:11)

[注意:自动化不使用任何虚拟化API。来自我的blog post。]

第1步:

默认情况下,qemu使用SDL显示VGA输出。所以,第一步是通过stdio与qemu进行这种交互。 Qemu提供了一个选项。

来自qemu docs:

  

-nographic 通常,QEMU使用SDL显示VGA输出。使用此选项,您可以完全禁用图形输出,以便QEMU   一个简单的命令行应用程序仿真串口是   在控制台上重定向。因此,您仍然可以使用QEMU进行调试   带有串行控制台的Linux内核。

所以,你所要做的就是用-nographic调用qemu。

  

qemu -nographic -hda guest.disk

第2步:

现在您可以通过命令行与guest虚拟机(或qemu进程)进行交互,您必须自动执行此交互。在python中执行此操作的显而易见的方法是使用subprocess module启动qemu进程(使用-nographic),然后与该进程进行通信。但令我惊讶的是,这对我来说并不合适。所以,我寻找其他方式。

后来,我发现这类工作最棒的工具是Expect。它是用tcl。

编写的交互式应用程序的自动化工具

This guide应该可以帮助您开始使用Expect。以下是使用Expect使用qemu运行guest虚拟机的脚本。

#!/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”

答案 1 :(得分:4)

QEMU Monitor可以使用自己的控制台在有限的范围内与来宾系统进行交互。这包括读取寄存器,控制鼠标/键盘以及获取屏幕转储。 有一个QEMU Monitor Protocol (QMP)允许您将JSON命令传递给来宾系统并从中读取值。

答案 2 :(得分:3)

据我所知,与访客通信的唯一方法是通过网桥。

答案 3 :(得分:2)

我使用python与pexpect使用它们的串行控制台与生成的虚拟机进行交互。我通常以这种方式自动化具有高达128VM的场景,其合理的迅速。我通常使用virt-install来实例化来宾,并使用" virsh console(domainname)"使用pexpect获得"句柄"到每个控制台,所以我可以发送命令来配置网络,启动工具/实用程序/脚本,监视器操作等。在简单性方面非常好,并且因为脚本只是发出shell命令,所以你不会暴露给从版本变为版本的API,例如串行控制台将永远在那里。有时候我会直接使用qemu,(最近我正在使用一个免费的libvirt支持的QEMU),在这种情况下我会让访客控制台使用一个telnet端口,所以我可以" telnet localhost端口号"建立控制台连接,而不是" virsh console(domainname)"。无论哪种方式,带有pexpect模块的python脚本都可以与VM进行交互。

答案 4 :(得分:1)

您可以在guest虚拟机之间创建一个反向ssh隧道,它将每个请求重定向到特定端口上的主机到guest虚拟机。这种方式可以帮助您从主机控制来宾。

答案 5 :(得分:1)

理论上,PyQemu可以做到这一点。我过去曾经使用它,虽然它现在看起来像一个陈旧的项目。它提供了一个在guest虚拟机上运行的python代理(相当于VMWare guest虚拟机工具),通过串口与主机通信。您可以获取在VM上下文中运行的python模块的代理,并且与它们的任何通信都通过串行端口进行封送。在以下示例中,AutoIt用于自动记事本:

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 -")

警告:由于使用串口,​​它远非快速(无论串行速度设置如何),因此最好通过其他方式传输任何批量数据,例如虚拟FAT磁盘映像。

答案 6 :(得分:0)

如果您在guest虚拟机中运行Linux,是否只能使用ssh / screen在guest虚拟机上启动远程进程?

或者,我看过人们编写python包装器,使用popen()来获取stdin / stdout并使用它们自动执行某些命令(即当你看到登录提示时,将登录名发送给QEMU的stdin。 / p>

答案 7 :(得分:0)

您可以通过设置网桥或使用-hostfwd选项来访问网络。

后者更简单。它允许您将guest tcp / udp端口导出到主机。您可以将guest tcp端口22映射到主机并管理guest虚拟机,就像管理真正的远程计算机一样。请参阅此博客Running qemu at background