如何使用 python-libvirt 以空磁盘启动虚拟机?

How to start a virtual machine with an empty disk using python-libvirt?

我正在尝试编写一个从头开始创建虚拟机的脚本。我正在使用 python 3 和 libvirt 来实现这一点。我知道有使用命令行工具的简单方法,但对于我的特定应用程序,我不能使用它们。

我的虚拟机是这样定义的:

<domain type='qemu'>
  <name>QEMU_test</name>
  <memory>219200</memory>
  <currentMemory>219200</currentMemory>
  <vcpu>2</vcpu>
  <os>
    <type arch='x86_64' machine='pc'>hvm</type>
    <boot dev='cdrom'/>
    <boot dev='hd'/>
  </os>
  <devices>
    <emulator>/usr/bin/qemu-system-x86_64</emulator>
    <disk type='file' device='cdrom'>
      <driver name='qemu' type='raw' />
      <source file='/vm/ubuntu-18.04.2-desktop-amd64.iso'/>
      <target dev='hdc'/>
      <readonly/>
    </disk>
    <disk type='file' device='disk'>
      <driver name='qemu' type='raw' />
      <source file='/vm/test/test2.img'/>
      <target dev='hda'/>
    </disk>
    <graphics type='vnc' port='-1'/>
    <interface type='network'>
      <source network='default'/>
      <model type='virtio' />
      <address type='pci' domain='0x0000' bus='0x00' slot='0x03' function='0x0'/>
      <mac address="00:11:22:33:44:55"/>

    </interface>
  </devices>
</domain>

我所做的只是创建到 'qemu:///system' 的连接,将 XML 配置文件读入变量并执行 'createXML' 以创建临时来宾域。

我遇到的问题可能部分是由于我不了解操作系统的启动方式。 文件 'test2.img' 是使用“/dev/zero”生成的文件。它是按照此处描述的过程创建的: Python libvirt API - create a Virtual Machine

尝试启动这台机器导致内核崩溃:

Kernel Panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

我猜这是因为 XML 中的 'initramfs' 参数需要为空磁盘指定,否则需要有一种方法来对磁盘进行分区,以便预期的根分区存在。

那么我的问题是:是否有一种可移植的方法可以使用 Python 来完成这些操作?

我不想明确指定任何路径,因为我希望此脚本尽可能具有可移植性(除非有一个标准我可以用于我缺少的所有操作系统)。如果可能的话,我也希望除了脚本之外不需要分发任何东西来让它工作。

编辑以澄清行为:如果我使用 Debian CD,我可以看到带有安装选项的初始菜单弹出,但是一旦我 select 一个,就会导致内核崩溃。

使用 /dev/zero 创建 'raw' 磁盘映像应该可以,但通常最好使用 'qemu-img' 来处理这些类型的事情。无论哪种方式,仅仅创建一个这样的磁盘映像然后尝试从它启动是行不通的,因为它里面没有操作系统可以启动。

VM 是否真的从 ubuntu CDROM 介质启动?我希望即使 test2.img 完全为空也能正常工作,然后您可以使用 ubuntu 安装程序来填充 test2.img.

好吧,该死。在弄乱 --debug 开关并最小化 virt-* 工具默认创建的配置之后,我终于找到了它不起作用的原因:

我没有给虚拟机足够的内存。

这会导致不同操作系统出现不同的内核恐慌。例如,Ubuntu 抱怨找不到 rootfs。 Debian 抱怨它未能杀死 init。

内存的默认单位是KibiBytes,即1024字节。这意味着我的配置为 VM 提供了略高于 214 兆字节(2^20 字节)的空间。事实证明,除了抱怨,你无能为力。