9

我找不到任何说明存在可用于在 qemu 来宾内部实现自动化的 API 的文档。

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

4

8 回答 8

16

[注:自动化不使用任何虚拟化 API。来自我的博文。]

步骤1:

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

来自 qemu 文档:

-nographic 通常,QEMU 使用 SDL 来显示 VGA 输出。使用此选项,您可以完全禁用图形输出,使 QEMU 成为一个简单的命令行应用程序。模拟的串行端口在控制台上重定向。因此,您仍然可以使用 QEMU 通过串行控制台调试 Linux 内核。

因此,您所要做的就是使用 -nographic 调用 qemu。

qemu -nographic -hda guest.disk

第2步:

现在您可以通过命令行与您的来宾(或 qemu 进程)交互,您必须自动执行此交互。在 python 中执行此操作的明显方法是使用 subprocess模块启动 qemu 进程(使用 -nographic) ,然后与该进程通信。但令我惊讶的是,这对我来说并不奏效。所以,我寻找了其他方法。

后来,我发现这种工作最棒的工具是Expect。它是用 tcl 编写的交互式应用程序的自动化工具。

本指南应该可以帮助您开始使用 Expect。这是使用 Expect 使用 qemu 运行来宾的脚本。

#!/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”
于 2011-10-18T16:29:10.577 回答
5

QEMU Monitor可以使用它自己的控制台在有限的范围内与来宾系统交互。这包括读取寄存器、控制鼠标/键盘和获取屏幕转储。有一个QEMU 监视器协议 (QMP),可让您将 JSON 命令传递到客户机系统并从客户机系统读取值。

于 2013-01-26T19:09:31.903 回答
3

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

于 2010-06-30T02:24:25.870 回答
3

我使用 python 和 pexpect 来使用它们的串行控制台与生成的虚拟机进行交互。我通常以这种方式自动化具有多达 128 个虚拟机的场景,它相当迅速。我一般使用virt-install来实例化guest,并使用“virsh控制台(域名)”使用pexpect来获取每个控制台的“句柄”,这样我就可以发送命令来配置网络,启动工具/实用程序/脚本,监控操作,等等。在简单性方面相当不错,而且由于脚本只是发出 shell 命令,因此您不会接触到随版本变化的 API,例如串行控制台将始终存在。有时我直接使用 qemu,(最近我正在使用 libvirt 不支持的 QEMU,因为它太新了),在这种情况下,我会让来宾控制台使用 telnet 端口,这样我就可以“

于 2016-02-25T20:04:04.337 回答
2

PyQemu 理论上可以做到这一点。我过去使用过它,尽管它现在看起来像是一个陈旧的项目。它提供了一个 python 代理(相当于 VMWare 来宾工具)在来宾上运行,通过串行端口与主机通信。您可以获得在 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 磁盘映像。

于 2017-01-11T16:50:29.477 回答
1

您可以创建从访客到主机的反向 ssh 隧道,它将每个请求重定向到特定端口上的主机到访客。这种方式将帮助您从主机控制客人。

于 2012-06-10T18:25:04.343 回答
0

如果您在客户机中运行 Linux,您不能只使用 ssh/screen 在客户机上启动远程进程吗?

或者,我看到人们编写 python 包装器popen()来获取标准输入/标准输出并使用它们来自动化一些命令(即,当您看到登录提示时,将登录名发送到 QEMU 的标准输入。

于 2010-11-30T02:26:44.267 回答
0

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

后者更简单。它允许您将访客 tcp/udp 端口​​导出到主机。您可以将访客 tcp 端口 22 映射到主机和管理访客,就像管理真正的远程机器一样。请参阅此博客在后台运行 qemu

于 2013-04-20T09:05:56.520 回答