我正在使用 qemu 部署虚拟机。安装的操作系统是 Debian,Linux 内核为 debian 6.8.11-amd64。我部署虚拟机的方式是直接使用 qemu-system 命令(即没有虚拟机管理器)。
以命令方式,我希望 - 从主机 - 到:
- 启动虚拟机
- 在来宾中执行一系列命令(git克隆某些内容,配置某些内容,制作某些内容,执行某些内容,返回成功!)
- 关闭虚拟机
我发现可以使用特定命令通过 QMP 与虚拟机进行交换
(https://qemu-project.gitlab.io/qemu/interop/qemu-qmp-ref.html#id2)
但我找不到如何执行步骤 2。看起来只有一组特定的命令被 QMP 授权。
提前致谢,
皮埃尔
您将需要构建一个自定义文件系统映像,其中包括脚本和/或一些其他工具来运行您的命令并关闭虚拟机。有很多方法可以解决这个问题。这是一种可能的解决方案:
从操作系统映像开始。对于本示例,我使用debian 12 云映像。
我们将创建图像的写时复制克隆来保存我们的更改。这使得重新开始变得容易。这里我们创建一个 5 GB 的镜像;您可以根据工作负载的需要调整图像大小:
现在我们需要在图像中嵌入一些附加信息。对于此示例,我们需要一个 netplan 文件来启用 DHCP,以及一个
rc.local
用于执行克隆/构建/安装/等操作的脚本。我有一个名为的 netplan 文件
network.yaml
,如下所示:和一个
rc.local
看起来像这样的文件:我们可以使用
virt-customize
命令将它们嵌入到图像中:现在我们可以使用
qemu-system-x86_64
命令来启动我们的映像:这将运行我们文件中的命令
rc.local
并在完成后关闭虚拟机。如果您需要明确地将结果报告给主机,您同样有很多选择。您可以向虚拟机添加第二个串行端口 (
-serial file:status.txt
) 并在那里写入状态数据 (echo OK > /dev/ttyS1
),或者您可以将控制台输出捕获到文件中(替换-serial mon:stdio
为-serial file:console.txt
),然后grep
在虚拟机完成时捕获输出,等等。如果您担心脚本由于错误而无法完成,您可以
qemu-system-x86_64
使用该timeout
命令包装您的命令。例如,要确保 qemu 虚拟机在 2 分钟内退出: