我无法找到任何文档说明是否存在可用于自动化qemu guest虚拟机内部内容的API。
例如,我想从主机启动客户机内部的进程。 Libvirt似乎不包含此类功能。
答案 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)
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。