如何使用pythonlibvirt启动具有空磁盘的虚拟机?

2024-04-27 02:30:00 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图写一个脚本,从头开始创建一个虚拟机。我使用python3和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,我可以看到带有安装选项的初始菜单弹出,但是一旦我选择了一个,就会导致内核死机。你知道吗


Tags: 工具namedevtest脚本sourcedomaintype
2条回答

使用/dev/zero创建一个“原始”磁盘映像应该是可行的,但是对于这些类型的东西,通常最好使用“qemu-img”。不管是哪种方式,仅仅创建这样一个磁盘映像,然后尝试从中引导都是行不通的,因为里面没有可供引导的操作系统。你知道吗

虚拟机真的是从ubuntu的CDROM介质启动的吗?即使test2.img完全为空,我也希望它能工作,然后您可以使用ubuntu安装程序来填充test2.img。你知道吗

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

我没有给虚拟机足够的内存。你知道吗

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

内存的默认单位是KibiBytes,即1024字节。这意味着我的配置给了虚拟机214兆字节(2^20字节)多一点的工作空间。结果发现,除了抱怨,你什么都做不了。你知道吗

相关问题 更多 >